From ee752494cda591e19faefafae49671deada20751 Mon Sep 17 00:00:00 2001 From: static Date: Sun, 29 Dec 2024 23:56:35 +0900 Subject: [PATCH] =?UTF-8?q?/api/client/status=20Endpoint=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/lib/server/db/client.ts | 11 ++++++++++- src/lib/server/services/client.ts | 18 ++++++++++++++++++ src/routes/api/client/status/+server.ts | 14 ++++++++++++++ 3 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 src/routes/api/client/status/+server.ts diff --git a/src/lib/server/db/client.ts b/src/lib/server/db/client.ts index 0554002..bb86671 100644 --- a/src/lib/server/db/client.ts +++ b/src/lib/server/db/client.ts @@ -1,4 +1,4 @@ -import { and, eq, gt, lte } from "drizzle-orm"; +import { and, eq, gt, lte, count } from "drizzle-orm"; import db from "./drizzle"; import { client, userClient, userClientChallenge } from "./schema"; @@ -25,6 +25,15 @@ export const getAllUserClients = async (userId: number) => { return await db.select().from(userClient).where(eq(userClient.userId, userId)).execute(); }; +export const countActiveUserClients = async (userId: number) => { + const userClients = await db + .select({ count: count() }) + .from(userClient) + .where(and(eq(userClient.userId, userId), eq(userClient.state, "active"))) + .execute(); + return userClients[0]?.count ?? null; +}; + export const getUserClient = async (userId: number, clientId: number) => { const userClients = await db .select() diff --git a/src/lib/server/services/client.ts b/src/lib/server/services/client.ts index b2848c6..8f59529 100644 --- a/src/lib/server/services/client.ts +++ b/src/lib/server/services/client.ts @@ -7,11 +7,13 @@ import { getClientByPubKey, createUserClient, getAllUserClients, + countActiveUserClients, getUserClient, createUserClientChallenge, getUserClientChallenge, setUserClientStateToPending, } from "$lib/server/db/client"; +import { getActiveMek } from "$lib/server/db/mek"; import env from "$lib/server/loadenv"; export const getUserClientList = async (userId: number) => { @@ -65,6 +67,22 @@ export const registerUserClient = async (userId: number, ip: string, pubKey: str return await generateChallenge(userId, ip, clientId, pubKey); }; +export const getUserClientStatus = async (userId: number, clientId: number) => { + const userClient = await getUserClient(userId, clientId); + if (!userClient) { + error(500, "Invalid access token"); + } + + const activeMek = await getActiveMek(userId); + const activeUserClientCount = await countActiveUserClients(userId); + const isInitialMekNeeded = !activeMek && activeUserClientCount === 0; + + return { + state: userClient.state, + isInitialMekNeeded, + }; +}; + export const verifyUserClient = async (userId: number, ip: string, answer: string) => { const challenge = await getUserClientChallenge(answer, ip); if (!challenge) { diff --git a/src/routes/api/client/status/+server.ts b/src/routes/api/client/status/+server.ts new file mode 100644 index 0000000..dcd12a6 --- /dev/null +++ b/src/routes/api/client/status/+server.ts @@ -0,0 +1,14 @@ +import { error, json } from "@sveltejs/kit"; +import { authenticate } from "$lib/server/modules/auth"; +import { getUserClientStatus } from "$lib/server/services/client"; +import type { RequestHandler } from "@sveltejs/kit"; + +export const GET: RequestHandler = async ({ cookies }) => { + const { userId, clientId } = authenticate(cookies); + if (!clientId) { + error(403, "Forbidden"); + } + + const { state, isInitialMekNeeded } = await getUserClientStatus(userId, clientId); + return json({ id: clientId, state, isInitialMekNeeded }); +};