feat: create route to store FCM token

This commit is contained in:
2024-06-14 18:14:10 -04:00
parent 4d3c34579d
commit 231ed4bde4
16 changed files with 650 additions and 14 deletions

View File

@@ -0,0 +1,70 @@
import { OpenAPIHono, createRoute, z } from "@hono/zod-openapi";
import { env } from "hono/adapter";
import { saveToken } from "~/models/token";
import type { Env } from "~/types/env";
import {
ErrorResponse,
SuccessResponse,
SuccessResponseSchema,
} from "~/types/schema";
const app = new OpenAPIHono<Env>();
const SaveTokenRequest = z.object({
token: z.string(),
deviceId: z.string(),
username: z.string().nullable(),
});
const SaveTokenResponse = SuccessResponseSchema();
const route = createRoute({
tags: ["aniplay", "notifications"],
operationId: "saveToken",
summary: "Saves FCM token",
method: "post",
path: "/",
request: {
body: {
content: {
"application/json": {
schema: SaveTokenRequest,
},
},
},
},
responses: {
200: {
content: {
"application/json": {
schema: SaveTokenResponse,
},
},
description: "Saved token successfully",
},
},
});
app.openapi(route, async (c) => {
const { token, deviceId, username } =
await c.req.json<typeof SaveTokenRequest._type>();
try {
await saveToken(env(c, "workerd"), deviceId, token, username);
} catch (error) {
if (
error.code === "SQLITE_CONSTRAINT" &&
error.message.includes("device_tokens.token")
) {
return c.json(ErrorResponse, 412);
}
console.error(new Error("Failed to save token", { cause: error }));
return c.json(ErrorResponse, 500);
}
return c.json(SuccessResponse);
});
export default app;