Files
WikiRush/app/api/daily/route.ts
T

92 lines
2.4 KiB
TypeScript
Raw Normal View History

import { NextResponse } from "next/server";
import { auth } from "../../../auth";
import { prisma } from "../../../lib/prisma";
import { pickTwoArticles } from "../../../lib/wiki";
function todayKey() {
return new Date().toISOString().slice(0, 10); // "YYYY-MM-DD"
}
async function getOrCreatePuzzle() {
const date = todayKey();
const existing = await prisma.dailyPuzzle.findUnique({ where: { date } });
if (existing) return existing;
const { start, target } = await pickTwoArticles();
return prisma.dailyPuzzle.create({
data: { date, startArticle: start, targetArticle: target },
});
}
// GET - retourne le puzzle du jour + si l'utilisateur a déjà joué
export async function GET() {
const session = await auth();
const puzzle = await getOrCreatePuzzle();
let myResult = null;
if (session?.user?.id) {
myResult = await prisma.dailyResult.findUnique({
where: {
puzzleId_userId: { puzzleId: puzzle.id, userId: session.user.id },
},
});
}
return NextResponse.json({
puzzle: {
id: puzzle.id,
date: puzzle.date,
startArticle: puzzle.startArticle,
targetArticle: puzzle.targetArticle,
},
alreadyPlayed: !!myResult,
myResult: myResult
? {
clicks: myResult.clicks,
timeSeconds: myResult.timeSeconds,
won: myResult.won,
path: JSON.parse(myResult.path),
}
: null,
});
}
// POST - soumettre un résultat
export async function POST(req: Request) {
const session = await auth();
if (!session?.user?.id)
return NextResponse.json({ error: "Non connecté" }, { status: 401 });
const { puzzleId, path, clicks, timeSeconds, won } = (await req.json()) as {
puzzleId: string;
path: string[];
clicks: number;
timeSeconds: number;
won: boolean;
};
// Vérifier que le puzzle est bien celui du jour
const puzzle = await prisma.dailyPuzzle.findUnique({
where: { id: puzzleId },
});
if (!puzzle || puzzle.date !== todayKey()) {
return NextResponse.json({ error: "Puzzle invalide" }, { status: 400 });
}
// Upsert - on n'enregistre qu'une fois
const result = await prisma.dailyResult.upsert({
where: { puzzleId_userId: { puzzleId, userId: session.user.id } },
create: {
puzzleId,
userId: session.user.id,
path: JSON.stringify(path),
clicks,
timeSeconds,
won,
},
update: {},
});
return NextResponse.json({ id: result.id });
}