Files
WaifuBoard/desktop/src/api/anilist/anilist.ts
2026-01-06 20:12:08 +01:00

82 lines
3.0 KiB
TypeScript

import { FastifyInstance } from "fastify";
import { run } from "../../shared/database";
async function anilist(fastify: FastifyInstance) {
fastify.post("/anilist/store", async (request, reply) => {
try {
const {
userId,
accessToken,
tokenType = "Bearer",
expiresIn
} = request.body as {
userId: number;
accessToken: string;
tokenType?: string;
expiresIn?: number;
};
if (!userId || !accessToken) {
return reply.status(400).send({ error: "Faltan datos (User ID o Token)" });
}
// 1. Verificar que el token es válido consultando a AniList
const userRes = await fetch("https://graphql.anilist.co", {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `${tokenType} ${accessToken}`
},
body: JSON.stringify({
query: `query { Viewer { id } }`
})
});
if (!userRes.ok) {
return reply.status(401).send({ error: "Token de AniList inválido o expirado" });
}
const userData = await userRes.json();
const anilistUserId = userData?.data?.Viewer?.id;
if (!anilistUserId) {
return reply.status(500).send({ error: "No se pudo obtener el ID de usuario de AniList" });
}
const expiresAt = new Date(
Date.now() + 365 * 24 * 60 * 60 * 1000
).toISOString();
await run(
`
INSERT INTO UserIntegration
(user_id, platform, access_token, refresh_token, token_type, anilist_user_id, expires_at)
VALUES (?, ?, ?, ?, ?, ?, ?)
ON CONFLICT(user_id) DO UPDATE SET
access_token = excluded.access_token,
refresh_token = excluded.refresh_token,
token_type = excluded.token_type,
anilist_user_id = excluded.anilist_user_id,
expires_at = excluded.expires_at
`,
[
userId,
"AniList",
accessToken,
"", // <- aquí
tokenType,
anilistUserId,
expiresAt
],
"userdata"
);
return reply.send({ ok: true, anilistUserId });
} catch (e) {
console.error("AniList error:", e);
return reply.status(500).send({ error: "Error interno del servidor al guardar AniList" });
}
});
}
export default anilist;