82 lines
3.0 KiB
TypeScript
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; |