- Create about page with game modes, technologies, and paliers - Add stats API endpoint for global game counter - Update home screen with emoji-based tier system (🌱-🚀) - Rewrite BlitzScreen to match new puzzle-based win/lose phases - Add simple-icons package for tech stack icons - Update metadata with wikirush.xyz domain - Fix em dashes to hyphens throughout codebase - Update footer with privacy and about links
62 lines
2.2 KiB
TypeScript
62 lines
2.2 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 });
|
|
}
|