refactor: replace qstash with Google Cloud Tasks
This commit is contained in:
@@ -7,11 +7,7 @@ import { getTestDb } from "~/libs/test/getTestDb";
|
||||
import { getTestEnv } from "~/libs/test/getTestEnv";
|
||||
import { resetTestDb } from "~/libs/test/resetTestDb";
|
||||
import { server } from "~/mocks";
|
||||
import {
|
||||
deviceTokensTable,
|
||||
titleMessagesTable,
|
||||
watchStatusTable,
|
||||
} from "~/models/schema";
|
||||
import { deviceTokensTable, watchStatusTable } from "~/models/schema";
|
||||
|
||||
server.listen();
|
||||
|
||||
@@ -100,9 +96,6 @@ describe("requests the /watch-status route", () => {
|
||||
await db
|
||||
.insert(deviceTokensTable)
|
||||
.values({ deviceId: "123", token: "asd" });
|
||||
await db
|
||||
.insert(titleMessagesTable)
|
||||
.values({ titleId: 10, messageId: "123" });
|
||||
|
||||
const res = await app.request(
|
||||
"/watch-status",
|
||||
@@ -129,9 +122,6 @@ describe("requests the /watch-status route", () => {
|
||||
await db
|
||||
.insert(deviceTokensTable)
|
||||
.values({ deviceId: "123", token: "asd" });
|
||||
await db
|
||||
.insert(titleMessagesTable)
|
||||
.values({ titleId: -1, messageId: "123" });
|
||||
|
||||
const res = await app.request(
|
||||
"/watch-status",
|
||||
@@ -158,9 +148,6 @@ describe("requests the /watch-status route", () => {
|
||||
await db
|
||||
.insert(deviceTokensTable)
|
||||
.values({ deviceId: "123", token: "asd" });
|
||||
await db
|
||||
.insert(titleMessagesTable)
|
||||
.values({ titleId: 139518, messageId: "123" });
|
||||
|
||||
const res = await app.request("/watch-status", {
|
||||
method: "POST",
|
||||
|
||||
@@ -1,12 +1,10 @@
|
||||
import { OpenAPIHono, createRoute, z } from "@hono/zod-openapi";
|
||||
import { Client } from "@upstash/qstash";
|
||||
import { env } from "hono/adapter";
|
||||
|
||||
import { deleteMessageIdForTitle } from "~/libs/deleteMessageIdForTitle";
|
||||
import { maybeScheduleNextAiringEpisode } from "~/libs/maybeScheduleNextAiringEpisode";
|
||||
import { verifyQstashHeader } from "~/libs/qstash/verifyQstashHeader";
|
||||
import { readEnvVariable } from "~/libs/readEnvVariable";
|
||||
import { deleteTitleMessage, getTitleMessage } from "~/models/titleMessages";
|
||||
import { buildNewEpisodeTaskId } from "~/libs/tasks/id";
|
||||
import { queueTask } from "~/libs/tasks/queueTask";
|
||||
import { removeTask } from "~/libs/tasks/removeTask";
|
||||
import { setWatchStatus } from "~/models/watchStatus";
|
||||
import type { Env } from "~/types/env";
|
||||
import {
|
||||
@@ -75,13 +73,8 @@ app.openapi(route, async (c) => {
|
||||
isRetrying = false,
|
||||
} = await c.req.json<typeof UpdateWatchStatusRequest._type>();
|
||||
const aniListToken = c.req.header("X-AniList-Token");
|
||||
const client = new Client({ token: readEnvVariable(c.env, "QSTASH_TOKEN") });
|
||||
|
||||
if (isRetrying) {
|
||||
if (!(await verifyQstashHeader(env<Env, typeof c>(c, "workerd"), c.req))) {
|
||||
return c.json(ErrorResponse, { status: 401 });
|
||||
}
|
||||
} else {
|
||||
if (!isRetrying) {
|
||||
try {
|
||||
const { wasAdded, wasDeleted } = await setWatchStatus(
|
||||
env<Env, typeof c>(c, "workerd"),
|
||||
@@ -96,9 +89,10 @@ app.openapi(route, async (c) => {
|
||||
titleId,
|
||||
);
|
||||
} else if (wasDeleted) {
|
||||
await deleteMessageIdForTitle(
|
||||
await removeTask(
|
||||
env<Env, typeof c>(c, "workerd"),
|
||||
titleId,
|
||||
"new-episode",
|
||||
buildNewEpisodeTaskId(titleId),
|
||||
);
|
||||
}
|
||||
} catch (error) {
|
||||
@@ -118,12 +112,21 @@ app.openapi(route, async (c) => {
|
||||
console.error(
|
||||
new Error("Failed to update watch status on Anilist", { cause: error }),
|
||||
);
|
||||
client.publishJSON({
|
||||
url: c.req.url,
|
||||
body: { deviceId, watchStatus, titleId, isRetrying: true },
|
||||
retries: 3,
|
||||
delay: "1m",
|
||||
});
|
||||
if (isRetrying) {
|
||||
return c.json(ErrorResponse, { status: 500 });
|
||||
}
|
||||
|
||||
await queueTask(
|
||||
env(c, "workerd"),
|
||||
"anilist",
|
||||
{
|
||||
deviceId,
|
||||
watchStatus,
|
||||
titleId,
|
||||
isRetrying: true,
|
||||
},
|
||||
{ req: c.req, scheduleConfig: { delay: { minute: 1 } } },
|
||||
);
|
||||
}
|
||||
|
||||
return c.json(SuccessResponse, { status: 200 });
|
||||
|
||||
Reference in New Issue
Block a user