- Remove localStorage for game states and statistics (backend only) - Add API route to suggest player ID based on recently updated states - Add async player ID lookup that finds existing IDs across domains - When visiting a new domain, automatically find and use existing player ID - Enables cross-domain synchronization between hoerdle.de and hördle.de
68 lines
1.9 KiB
TypeScript
68 lines
1.9 KiB
TypeScript
import { NextResponse } from 'next/server';
|
|
import { PrismaClient } from '@prisma/client';
|
|
|
|
const prisma = new PrismaClient();
|
|
|
|
/**
|
|
* POST /api/player-id/suggest
|
|
*
|
|
* Tries to find a player ID based on recently updated states for a genre.
|
|
* This helps synchronize player IDs across different domains (hoerdle.de and hördle.de).
|
|
*
|
|
* Request body:
|
|
* - genreKey: Genre key (e.g., "global", "Rock", "special:00725")
|
|
*
|
|
* Returns:
|
|
* - playerId: Suggested player ID (UUID) if found, null otherwise
|
|
*/
|
|
export async function POST(request: Request) {
|
|
try {
|
|
const body = await request.json();
|
|
const { genreKey } = body;
|
|
|
|
if (!genreKey || typeof genreKey !== 'string') {
|
|
return NextResponse.json(
|
|
{ error: 'Missing or invalid genreKey' },
|
|
{ status: 400 }
|
|
);
|
|
}
|
|
|
|
// Find the most recently updated player state for this genre
|
|
// Look for states updated in the last 48 hours
|
|
const cutoffDate = new Date();
|
|
cutoffDate.setHours(cutoffDate.getHours() - 48);
|
|
|
|
const recentState = await prisma.playerState.findFirst({
|
|
where: {
|
|
genreKey: genreKey,
|
|
lastPlayed: {
|
|
gte: cutoffDate,
|
|
},
|
|
},
|
|
orderBy: {
|
|
lastPlayed: 'desc',
|
|
},
|
|
});
|
|
|
|
if (recentState) {
|
|
// Return the player ID from the most recent state
|
|
return NextResponse.json({
|
|
playerId: recentState.identifier,
|
|
lastPlayed: recentState.lastPlayed,
|
|
});
|
|
}
|
|
|
|
// No recent state found
|
|
return NextResponse.json({
|
|
playerId: null,
|
|
});
|
|
} catch (error) {
|
|
console.error('[player-id/suggest] Error finding player ID:', error);
|
|
return NextResponse.json(
|
|
{ error: 'Internal Server Error' },
|
|
{ status: 500 }
|
|
);
|
|
}
|
|
}
|
|
|