From cd725c589b8497a33ca9e6cf2e3ed332cdee38d2 Mon Sep 17 00:00:00 2001 From: sorakor0830 Date: Sat, 20 May 2023 00:18:44 +0800 Subject: [PATCH 1/6] fix: malfunctioning of upvote feature --- islands/VoteButton.tsx | 2 +- routes/index.tsx | 10 +++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/islands/VoteButton.tsx b/islands/VoteButton.tsx index e406c9fe5..937b994e7 100644 --- a/islands/VoteButton.tsx +++ b/islands/VoteButton.tsx @@ -24,7 +24,7 @@ export default function VoteButton(props: VoteButtonProps) { } isVoted.value = !isVoted.value; method === "POST" ? score.value++ : score.value--; - if (score.value < props.item.score) score.value = props.item.score; + if (score.value < (props.item.score - 1 ) || 0) score.value = props.item.score; } } diff --git a/routes/index.tsx b/routes/index.tsx index 29e5f1235..78ad3445f 100644 --- a/routes/index.tsx +++ b/routes/index.tsx @@ -7,6 +7,7 @@ import type { State } from "./_middleware.ts"; import ItemSummary from "@/components/ItemSummary.tsx"; import { getAllItems, + getUserBySessionId, getUsersByIds, getVotedItemIdsByUser, type Item, @@ -36,9 +37,12 @@ export const handler: Handlers = { /** @todo Add pagination functionality */ const items = (await getAllItems({ limit: 10 })).sort(compareScore); const users = await getUsersByIds(items.map((item) => item.userId)); - const votedItemIds = ctx.state.sessionId - ? await getVotedItemIdsByUser(ctx.state.sessionId) - : []; + let votedItemIds: string[] = [] + if (ctx.state.sessionId) { + const sessionUser = await getUserBySessionId(ctx.state.sessionId!); + votedItemIds = await getVotedItemIdsByUser(sessionUser!.id); + } + /** @todo Optimise */ const areVoted = items.map((item) => votedItemIds.includes(item.id)); return ctx.render({ ...ctx.state, items, users, areVoted }); From 7e79ac340be4fb80ac85a030983111b9d06a8fbc Mon Sep 17 00:00:00 2001 From: sorakor0830 Date: Tue, 23 May 2023 23:27:08 +0800 Subject: [PATCH 2/6] feat: record visit per day --- routes/index.tsx | 3 ++- utils/db.ts | 14 ++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/routes/index.tsx b/routes/index.tsx index 9f133da58..4c0e281e5 100644 --- a/routes/index.tsx +++ b/routes/index.tsx @@ -10,6 +10,7 @@ import { getUserBySessionId, getUsersByIds, getVotedItemIdsByUser, + setVisitPerDay, type Item, type User, } from "@/utils/db.ts"; @@ -42,7 +43,7 @@ export const handler: Handlers = { const sessionUser = await getUserBySessionId(ctx.state.sessionId!); votedItemIds = await getVotedItemIdsByUser(sessionUser!.id); } - + await setVisitPerDay(); /** @todo Optimise */ const areVoted = items.map((item) => votedItemIds.includes(item.id)); return ctx.render({ ...ctx.state, items, users, areVoted }); diff --git a/utils/db.ts b/utils/db.ts index a90539ed0..682d04e62 100644 --- a/utils/db.ts +++ b/utils/db.ts @@ -412,3 +412,17 @@ export async function getUsersByIds(ids: string[]) { const res = await kv.getMany(keys); return res.map((entry) => entry.value!); } + +export async function setVisitPerDay(){ + const today = new Date(); + // convert to universal timezone (UTC) + const visitKey = ["visit", `${today.getUTCFullYear()}-${today.getUTCMonth()}-${today.getUTCDate()}`]; + await kv.atomic() + .mutate({ + key: visitKey, + value: new Deno.KvU64(1n), + type: "sum", + }) + .commit(); +} + From 57156c4655f5cfd53f3ea5bfd40e28e8bb92aae6 Mon Sep 17 00:00:00 2001 From: sorakor0830 Date: Tue, 23 May 2023 23:29:11 +0800 Subject: [PATCH 3/6] fmt --- routes/index.tsx | 2 +- utils/db.ts | 20 +++++++++++--------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/routes/index.tsx b/routes/index.tsx index 4c0e281e5..c9c27a878 100644 --- a/routes/index.tsx +++ b/routes/index.tsx @@ -10,8 +10,8 @@ import { getUserBySessionId, getUsersByIds, getVotedItemIdsByUser, - setVisitPerDay, type Item, + setVisitPerDay, type User, } from "@/utils/db.ts"; diff --git a/utils/db.ts b/utils/db.ts index 682d04e62..edf6641bf 100644 --- a/utils/db.ts +++ b/utils/db.ts @@ -413,16 +413,18 @@ export async function getUsersByIds(ids: string[]) { return res.map((entry) => entry.value!); } -export async function setVisitPerDay(){ +export async function setVisitPerDay() { const today = new Date(); // convert to universal timezone (UTC) - const visitKey = ["visit", `${today.getUTCFullYear()}-${today.getUTCMonth()}-${today.getUTCDate()}`]; + const visitKey = [ + "visit", + `${today.getUTCFullYear()}-${today.getUTCMonth()}-${today.getUTCDate()}`, + ]; await kv.atomic() - .mutate({ - key: visitKey, - value: new Deno.KvU64(1n), - type: "sum", - }) - .commit(); + .mutate({ + key: visitKey, + value: new Deno.KvU64(1n), + type: "sum", + }) + .commit(); } - From 5e02c48669312b47513549a8e91e870b4c932b76 Mon Sep 17 00:00:00 2001 From: sorakor0830 Date: Thu, 25 May 2023 01:30:48 +0800 Subject: [PATCH 4/6] refactor --- routes/index.tsx | 4 ++-- utils/db.ts | 33 +++++++++++++++++++++++---------- utils/db_test.ts | 9 +++++++++ 3 files changed, 34 insertions(+), 12 deletions(-) diff --git a/routes/index.tsx b/routes/index.tsx index c9c27a878..442a937b2 100644 --- a/routes/index.tsx +++ b/routes/index.tsx @@ -10,8 +10,8 @@ import { getUserBySessionId, getUsersByIds, getVotedItemIdsByUser, + incrementVisitsPerDay, type Item, - setVisitPerDay, type User, } from "@/utils/db.ts"; @@ -43,7 +43,7 @@ export const handler: Handlers = { const sessionUser = await getUserBySessionId(ctx.state.sessionId!); votedItemIds = await getVotedItemIdsByUser(sessionUser!.id); } - await setVisitPerDay(); + await incrementVisitsPerDay(new Date()); /** @todo Optimise */ const areVoted = items.map((item) => votedItemIds.includes(item.id)); return ctx.render({ ...ctx.state, items, users, areVoted }); diff --git a/utils/db.ts b/utils/db.ts index edf6641bf..796ebeb76 100644 --- a/utils/db.ts +++ b/utils/db.ts @@ -413,18 +413,31 @@ export async function getUsersByIds(ids: string[]) { return res.map((entry) => entry.value!); } -export async function setVisitPerDay() { - const today = new Date(); +export async function incrementVisitsPerDay(date: Date) { // convert to universal timezone (UTC) - const visitKey = [ - "visit", - `${today.getUTCFullYear()}-${today.getUTCMonth()}-${today.getUTCDate()}`, + const visitsKey = [ + "visits", + `${date.getUTCFullYear()}-${date.getUTCMonth()}-${date.getUTCDate()}`, ]; await kv.atomic() - .mutate({ - key: visitKey, - value: new Deno.KvU64(1n), - type: "sum", - }) + .sum(visitsKey, 1n) .commit(); } + +export async function getVisitsPerDay(date: Date): Promise { + const visitsKey = [ + "visits", + `${date.getUTCFullYear()}-${date.getUTCMonth()}-${date.getUTCDate()}`, + ]; + + return (await kv.get(visitsKey)).value as bigint; +} + +export async function deleteVisitsPerDay(date: Date) { + const visitsKey = [ + "visits", + `${date.getUTCFullYear()}-${date.getUTCMonth()}-${date.getUTCDate()}`, + ]; + + await kv.delete(visitsKey); +} diff --git a/utils/db_test.ts b/utils/db_test.ts index b9f8cb5f3..ba2ef753e 100644 --- a/utils/db_test.ts +++ b/utils/db_test.ts @@ -2,10 +2,13 @@ import { createUser, deleteUser, + deleteVisitsPerDay, getUserById, getUserByLogin, getUserBySessionId, getUserByStripeCustomerId, + getVisitsPerDay, + incrementVisitsPerDay, setUserSession, setUserSubscription, type User, @@ -48,4 +51,10 @@ Deno.test("[db] user", async () => { assertEquals(await getUserByLogin(user.login), null); assertEquals(await getUserBySessionId(user.sessionId), null); assertEquals(await getUserByStripeCustomerId(user.stripeCustomerId), null); + + const date = new Date("2023-01-01"); + await incrementVisitsPerDay(date); + assertEquals((await getVisitsPerDay(date)).valueOf(), 1n); + await deleteVisitsPerDay(date); + assertEquals(await getVisitsPerDay(date), null); }); From e1bfdcc5555f2e472bd6c3a29a070fce5be0d85e Mon Sep 17 00:00:00 2001 From: sorakor0830 Date: Fri, 26 May 2023 00:17:34 +0800 Subject: [PATCH 5/6] seperate db visit test --- utils/db.ts | 8 ++++---- utils/db_test.ts | 14 +------------- utils/db_visit_test.ts | 15 +++++++++++++++ 3 files changed, 20 insertions(+), 17 deletions(-) create mode 100644 utils/db_visit_test.ts diff --git a/utils/db.ts b/utils/db.ts index c447f66c2..9970661d4 100644 --- a/utils/db.ts +++ b/utils/db.ts @@ -390,11 +390,11 @@ export async function incrementVisitsPerDay(date: Date) { .commit(); } -export async function getVisitsPerDay(date: Date): Promise { - const visitsKey = [ +export async function getVisitsPerDay(date: Date) { + const res = await kv.get([ "visits", `${date.getUTCFullYear()}-${date.getUTCMonth()}-${date.getUTCDate()}`, - ]; + ]); - return (await kv.get(visitsKey)).value as bigint; + return res.value; } diff --git a/utils/db_test.ts b/utils/db_test.ts index c27a89791..6685d455e 100644 --- a/utils/db_test.ts +++ b/utils/db_test.ts @@ -5,8 +5,6 @@ import { getUserByLogin, getUserBySessionId, getUserByStripeCustomerId, - getVisitsPerDay, - incrementVisitsPerDay, kv, setUserSession, setUserSubscription, @@ -51,7 +49,7 @@ async function deleteUser(user: User) { } } -Deno.test("[db] user | visit", async () => { +Deno.test("[db] user", async () => { const initUser = { id: crypto.randomUUID(), login: crypto.randomUUID(), @@ -87,14 +85,4 @@ Deno.test("[db] user | visit", async () => { assertEquals(await getUserByLogin(user.login), null); assertEquals(await getUserBySessionId(user.sessionId), null); assertEquals(await getUserByStripeCustomerId(user.stripeCustomerId), null); - - const date = new Date("2023-01-01"); - const visitsKey = [ - "visits", - `${date.getUTCFullYear()}-${date.getUTCMonth()}-${date.getUTCDate()}`, - ]; - await incrementVisitsPerDay(date); - assertEquals((await getVisitsPerDay(date)).valueOf(), 1n); - await kv.delete(visitsKey); - assertEquals(await getVisitsPerDay(date), null); }); diff --git a/utils/db_visit_test.ts b/utils/db_visit_test.ts new file mode 100644 index 000000000..aa08dc442 --- /dev/null +++ b/utils/db_visit_test.ts @@ -0,0 +1,15 @@ +// Copyright 2023 the Deno authors. All rights reserved. MIT license. +import { getVisitsPerDay, incrementVisitsPerDay, kv } from "./db.ts"; +import { assertEquals } from "std/testing/asserts.ts"; + +Deno.test("[db] visit", async () => { + const date = new Date("2023-01-01"); + const visitsKey = [ + "visits", + `${date.getUTCFullYear()}-${date.getUTCMonth()}-${date.getUTCDate()}`, + ]; + await incrementVisitsPerDay(date); + assertEquals((await getVisitsPerDay(date))!.valueOf(), 1n); + await kv.delete(visitsKey); + assertEquals(await getVisitsPerDay(date), null); +}); From 5aa0a12499200ac0afbdb8e39ab5c3f45e84ff10 Mon Sep 17 00:00:00 2001 From: Asher Gomez Date: Fri, 26 May 2023 08:58:23 +1000 Subject: [PATCH 6/6] tweak --- utils/db_test.ts | 14 ++++++++++++++ utils/db_visit_test.ts | 15 --------------- 2 files changed, 14 insertions(+), 15 deletions(-) delete mode 100644 utils/db_visit_test.ts diff --git a/utils/db_test.ts b/utils/db_test.ts index 6685d455e..7220278a4 100644 --- a/utils/db_test.ts +++ b/utils/db_test.ts @@ -5,6 +5,8 @@ import { getUserByLogin, getUserBySessionId, getUserByStripeCustomerId, + getVisitsPerDay, + incrementVisitsPerDay, kv, setUserSession, setUserSubscription, @@ -86,3 +88,15 @@ Deno.test("[db] user", async () => { assertEquals(await getUserBySessionId(user.sessionId), null); assertEquals(await getUserByStripeCustomerId(user.stripeCustomerId), null); }); + +Deno.test("[db] visit", async () => { + const date = new Date("2023-01-01"); + const visitsKey = [ + "visits", + `${date.getUTCFullYear()}-${date.getUTCMonth()}-${date.getUTCDate()}`, + ]; + await incrementVisitsPerDay(date); + assertEquals((await getVisitsPerDay(date))!.valueOf(), 1n); + await kv.delete(visitsKey); + assertEquals(await getVisitsPerDay(date), null); +}); diff --git a/utils/db_visit_test.ts b/utils/db_visit_test.ts deleted file mode 100644 index aa08dc442..000000000 --- a/utils/db_visit_test.ts +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright 2023 the Deno authors. All rights reserved. MIT license. -import { getVisitsPerDay, incrementVisitsPerDay, kv } from "./db.ts"; -import { assertEquals } from "std/testing/asserts.ts"; - -Deno.test("[db] visit", async () => { - const date = new Date("2023-01-01"); - const visitsKey = [ - "visits", - `${date.getUTCFullYear()}-${date.getUTCMonth()}-${date.getUTCDate()}`, - ]; - await incrementVisitsPerDay(date); - assertEquals((await getVisitsPerDay(date))!.valueOf(), 1n); - await kv.delete(visitsKey); - assertEquals(await getVisitsPerDay(date), null); -});