Files
CRAPP/src/routes/api/public/promemoria-palloni.ts
T

63 lines
2.3 KiB
TypeScript
Raw Normal View History

2026-08-06 08:36:47 +02:00
import { createFileRoute } from "@tanstack/react-router";
import { richiediSegreto } from "@/lib/auth-route.server";
import { nomeCompleto } from "@/lib/giocatori-squadra";
import { leggiGiocatoriSquadra } from "@/lib/giocatori-squadra.server";
import { completaTurni, destinatariPromemoriaPalloni, oggiISO } from "@/lib/palloni-core";
2026-08-06 08:36:47 +02:00
import { inviaPush } from "@/lib/webpush.server";
import { leggiEventi } from "@/lib/eventi.server";
export const Route = createFileRoute("/api/public/promemoria-palloni")({
server: {
handlers: {
POST: async ({ request }) => {
// Chiamata da un cron, senza sessione: qui vale il segreto condiviso.
const negato = richiediSegreto(request);
if (negato) return negato;
2026-08-06 08:36:47 +02:00
const { supabaseAdmin } = await import("@/integrations/supabase/client.server");
const { data: righe } = await supabaseAdmin
.from("turni_palloni")
.select("evento_id, giocatore_id");
const salvati: Record<string, string> = {};
for (const riga of righe ?? []) salvati[riga.evento_id] = riga.giocatore_id;
const eventi = await leggiEventi();
const squadra = await leggiGiocatoriSquadra();
const rosa = squadra
.filter((g) => g.attivo)
.map((g) => ({ id: g.id, nome: nomeCompleto(g) }));
const turni = completaTurni(salvati, eventi, rosa);
2026-08-06 08:36:47 +02:00
const oggi = oggiISO();
const destinatari = destinatariPromemoriaPalloni(turni, eventi, oggi);
2026-08-06 08:36:47 +02:00
if (destinatari.length === 0) return Response.json({ inviate: 0 });
2026-08-06 08:36:47 +02:00
const { data: iscrizioni } = await supabaseAdmin
.from("push_subscriptions")
.select("endpoint, giocatore_id")
.in("giocatore_id", destinatari);
2026-08-06 08:36:47 +02:00
let inviate = 0;
for (const iscrizione of iscrizioni ?? []) {
try {
const stato = await inviaPush(iscrizione.endpoint);
if (stato === 404 || stato === 410) {
await supabaseAdmin
.from("push_subscriptions")
.delete()
.eq("endpoint", iscrizione.endpoint);
} else if (stato >= 200 && stato < 300) {
inviate += 1;
}
} catch (error) {
console.error("promemoria-palloni", error);
}
}
return Response.json({ inviate });
},
},
},
});