feat: schedule next airing episode
happens when new title is saved, or when new episode internal route is run successfully
This commit is contained in:
@@ -1,8 +1,11 @@
|
||||
import { OpenAPIHono, createRoute, z } from "@hono/zod-openapi";
|
||||
import { Client } from "@upstash/qstash";
|
||||
import { env } from "hono/adapter";
|
||||
|
||||
import { maybeScheduleNextAiringEpisode } from "~/libs/maybeScheduleNextAiringEpisode";
|
||||
import { verifyQstashHeader } from "~/libs/qstash/verifyQstashHeader";
|
||||
import { readEnvVariable } from "~/libs/readEnvVariable";
|
||||
import { deleteTitleMessage, getTitleMessage } from "~/models/titleMessages";
|
||||
import { setWatchStatus } from "~/models/watchStatus";
|
||||
import type { Env } from "~/types/env";
|
||||
import {
|
||||
@@ -71,6 +74,7 @@ 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))) {
|
||||
@@ -84,6 +88,20 @@ app.openapi(route, async (c) => {
|
||||
Number(titleId),
|
||||
watchStatus,
|
||||
);
|
||||
if (wasAdded) {
|
||||
await maybeScheduleNextAiringEpisode(
|
||||
env<Env, typeof c>(c, "workerd"),
|
||||
c.req,
|
||||
titleId,
|
||||
);
|
||||
} else if (wasDeleted) {
|
||||
const messageId = await getTitleMessage(
|
||||
env<Env, typeof c>(c, "workerd"),
|
||||
titleId,
|
||||
);
|
||||
await client.messages.delete(messageId);
|
||||
await deleteTitleMessage(env<Env, typeof c>(c, "workerd"), titleId);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(new Error("Error setting watch status", { cause: error }));
|
||||
console.error(error);
|
||||
@@ -101,19 +119,12 @@ app.openapi(route, async (c) => {
|
||||
console.error(
|
||||
new Error("Failed to update watch status on Anilist", { cause: error }),
|
||||
);
|
||||
await import("@upstash/qstash")
|
||||
.then(
|
||||
({ Client }) =>
|
||||
new Client({ token: readEnvVariable(c.env, "QSTASH_TOKEN") }),
|
||||
)
|
||||
.then((client) =>
|
||||
client.publishJSON({
|
||||
url: c.req.url,
|
||||
body: { deviceId, watchStatus, titleId, isRetrying: true },
|
||||
retries: 0,
|
||||
delay: 60,
|
||||
}),
|
||||
);
|
||||
client.publishJSON({
|
||||
url: c.req.url,
|
||||
body: { deviceId, watchStatus, titleId, isRetrying: true },
|
||||
retries: 0,
|
||||
delay: 60,
|
||||
});
|
||||
}
|
||||
|
||||
return c.json(SuccessResponse, { status: 200 });
|
||||
|
||||
Reference in New Issue
Block a user