diff --git a/.gitignore b/.gitignore index e2ff74a..c0bff53 100644 --- a/.gitignore +++ b/.gitignore @@ -39,4 +39,6 @@ redis/ dist/ build/ -docker-compose.yml \ No newline at end of file +docker-compose.yml + +ucaptcha-config.yaml \ No newline at end of file diff --git a/packages/backend/routes/captcha/[id]/result/GET.ts b/packages/backend/routes/captcha/[id]/result/GET.ts new file mode 100644 index 0000000..aa1a975 --- /dev/null +++ b/packages/backend/routes/captcha/[id]/result/GET.ts @@ -0,0 +1,37 @@ +import { Context } from "hono"; +import { Bindings, BlankEnv, BlankInput } from "hono/types"; +import { ErrorResponse } from "src/schema"; +import { createHandlers } from "src/utils.ts"; + +const getChallengeVerificationResult = async (id: string, ans: string) => { + const baseURL = process.env["UCAPTCHA_URL"]; + const url = new URL(baseURL); + url.pathname = `/challenge/${id}/validation`; + const res = await fetch(url.toString(), { + method: "POST", + headers: { + "Content-Type": "application/json" + }, + body: JSON.stringify({ + y: ans + }) + }); + return res; +}; + + +export const verifyChallengeHandler = createHandlers( + async (c: Context) => { + const id = c.req.param("id"); + const ans = c.req.query("ans"); + if (!ans) { + const response: ErrorResponse = { + message: "Missing required query parameter: ans", + code: "INVALID_QUERY_PARAMS" + }; + return c.json>(response, 400); + } + const res = await getChallengeVerificationResult(id, ans); + return res; + } +); diff --git a/packages/backend/routes/captcha/index.ts b/packages/backend/routes/captcha/index.ts new file mode 100644 index 0000000..fa6d476 --- /dev/null +++ b/packages/backend/routes/captcha/index.ts @@ -0,0 +1,2 @@ +export * from "./session/POST.ts"; +export * from "./[id]/result/GET.ts"; \ No newline at end of file diff --git a/packages/backend/routes/validation/session/POST.ts b/packages/backend/routes/captcha/session/POST.ts similarity index 69% rename from packages/backend/routes/validation/session/POST.ts rename to packages/backend/routes/captcha/session/POST.ts index ad392ed..63b9331 100644 --- a/packages/backend/routes/validation/session/POST.ts +++ b/packages/backend/routes/captcha/session/POST.ts @@ -15,11 +15,10 @@ const createNewChallenge = async (difficulty: number) => { difficulty: difficulty, }) }); - const data = await res.json(); - return data; + return res; } -export const createValidationSessionHandler = createHandlers(async (c) => { - const challenge = await createNewChallenge(DIFFICULTY); - return c.json(challenge); +export const createCaptchaSessionHandler = createHandlers(async (_c) => { + const res = await createNewChallenge(DIFFICULTY); + return res; }); diff --git a/packages/backend/routes/validation/session/index.ts b/packages/backend/routes/validation/session/index.ts deleted file mode 100644 index b0f97d2..0000000 --- a/packages/backend/routes/validation/session/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./POST.ts"; \ No newline at end of file diff --git a/packages/backend/src/routing.ts b/packages/backend/src/routing.ts index 9121cf6..a56ed73 100644 --- a/packages/backend/src/routing.ts +++ b/packages/backend/src/routing.ts @@ -4,7 +4,7 @@ import { registerHandler } from "routes/user"; import { videoInfoHandler, getSnapshotsHanlder } from "routes/video"; import { Hono } from "hono"; import { Variables } from "hono/types"; -import { createValidationSessionHandler } from "routes/validation/session"; +import { createCaptchaSessionHandler, verifyChallengeHandler } from "routes/captcha"; export function configureRoutes(app: Hono<{ Variables: Variables }>) { app.get("/", ...rootHandler); @@ -15,5 +15,6 @@ export function configureRoutes(app: Hono<{ Variables: Variables }>) { app.get("/video/:id/info", ...videoInfoHandler); - app.post("/validation/session", ...createValidationSessionHandler) + app.post("/captcha/session", ...createCaptchaSessionHandler); + app.get("/captcha/:id/result", ...verifyChallengeHandler); } diff --git a/packages/backend/src/schema.d.ts b/packages/backend/src/schema.d.ts index b80ea49..db279b7 100644 --- a/packages/backend/src/schema.d.ts +++ b/packages/backend/src/schema.d.ts @@ -3,7 +3,7 @@ type ErrorCode = "INVALID_QUERY_PARAMS" | "UNKNOWN_ERR" | "INVALID_PAYLOAD" | "I export interface ErrorResponse { code: ErrorCode; message: string; - errors: E[]; + errors?: E[]; } export interface StatusResponse {