From 4c3bb2134fa1fbd9198be85110030fd1e64ad3df Mon Sep 17 00:00:00 2001 From: Kalle <38327916+Sendouc@users.noreply.github.com> Date: Sat, 25 Jun 2022 00:36:41 +0300 Subject: [PATCH] Badges to user page from DB --- app/db/index.ts | 2 ++ app/db/models/badges.server.ts | 20 ++++++++++++++++++++ app/routes/u.$identifier.tsx | 7 ++++++- 3 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 app/db/models/badges.server.ts diff --git a/app/db/index.ts b/app/db/index.ts index f0ceb4bd3..551e703a9 100644 --- a/app/db/index.ts +++ b/app/db/index.ts @@ -1,9 +1,11 @@ import * as users from "./models/users.server"; import * as plusSuggestions from "./models/plusSuggestions.server"; import * as plusVotes from "./models/plusVotes.server"; +import * as badges from "./models/badges.server"; export const db = { users, plusSuggestions, plusVotes, + badges, }; diff --git a/app/db/models/badges.server.ts b/app/db/models/badges.server.ts new file mode 100644 index 000000000..f5c18e757 --- /dev/null +++ b/app/db/models/badges.server.ts @@ -0,0 +1,20 @@ +import { sql } from "../sql"; +import type { Badge, User } from "../types"; + +const countsByUserIdStm = sql.prepare(` + select "Badge"."code", "Badge"."displayName", count("BadgeOwner"."code") as count + from "BadgeOwner" + join "Badge" on "Badge"."code" = "BadgeOwner"."code" + where "BadgeOwner"."userId" = $userId + group by "BadgeOwner"."code", "BadgeOwner"."userId" + `); + +export type CountsByUserId = Array< + Pick & { + count: number; + } +>; + +export function countsByUserId(userId: User["id"]) { + return countsByUserIdStm.all({ userId }) as CountsByUserId; +} diff --git a/app/routes/u.$identifier.tsx b/app/routes/u.$identifier.tsx index 268a3a647..c425dabdc 100644 --- a/app/routes/u.$identifier.tsx +++ b/app/routes/u.$identifier.tsx @@ -6,6 +6,7 @@ import { z } from "zod"; import { Main } from "~/components/Main"; import { SubNav, SubNavLink } from "~/components/SubNav"; import { db } from "~/db"; +import type { CountsByUserId } from "~/db/models/badges.server"; import type { User } from "~/db/types"; import { useUser } from "~/modules/auth"; import { makeTitle, notFoundIfFalsy } from "~/utils/remix"; @@ -30,7 +31,10 @@ export type UserPageLoaderData = Pick< | "twitch" | "twitter" | "bio" -> & { country?: { name: string; emoji: string; code: string } }; +> & { + country?: { name: string; emoji: string; code: string }; + badges: CountsByUserId; +}; export const loader: LoaderFunction = ({ params }) => { const { identifier } = userParamsSchema.parse(params); @@ -58,6 +62,7 @@ export const loader: LoaderFunction = ({ params }) => { code: user.country, } : undefined, + badges: db.badges.countsByUserId(user.id), }); };