92 lines
2.4 KiB
TypeScript
92 lines
2.4 KiB
TypeScript
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 });
|
|
}
|