feat: centralizar normalizeTime en core y exponerla en web para preferencias

Co-authored-by: aider (openrouter/openai/gpt-5) <aider@aider.chat>
main
brobert 1 month ago
parent e7bcdbf17e
commit db9baca508

@ -1,4 +1,4 @@
import { toIsoSqlUTC as coreToIsoSqlUTC } from '../../../../../src/utils/datetime'; import { toIsoSqlUTC as coreToIsoSqlUTC, normalizeTime as coreNormalizeTime } from '../../../../../src/utils/datetime';
/** /**
* Serializa una fecha en UTC al formato SQL ISO "YYYY-MM-DD HH:MM:SS[.SSS]". * Serializa una fecha en UTC al formato SQL ISO "YYYY-MM-DD HH:MM:SS[.SSS]".
@ -8,6 +8,13 @@ export function toIsoSqlUTC(d: Date = new Date()): string {
return coreToIsoSqlUTC(d); return coreToIsoSqlUTC(d);
} }
/**
* Normaliza una hora 'HH:mm'. Devuelve null si no es válida.
*/
export function normalizeTime(input: string | null | undefined): string | null {
return coreNormalizeTime(input);
}
/** /**
* Devuelve YYYY-MM-DD en UTC (útil para consultas por rango de fecha). * Devuelve YYYY-MM-DD en UTC (útil para consultas por rango de fecha).
*/ */

@ -1,5 +1,6 @@
import type { RequestHandler } from './$types'; import type { RequestHandler } from './$types';
import { getDb } from '$lib/server/db'; import { getDb } from '$lib/server/db';
import { normalizeTime } from '$lib/server/datetime';
export const GET: RequestHandler = async (event) => { export const GET: RequestHandler = async (event) => {
// Requiere sesión // Requiere sesión
@ -36,15 +37,16 @@ export const POST: RequestHandler = async (event) => {
return new Response('Unauthorized', { status: 401 }); return new Response('Unauthorized', { status: 401 });
} }
let payload: any = null; let payload: unknown = null;
try { try {
payload = await event.request.json(); payload = await event.request.json();
} catch { } catch {
return new Response('Bad Request', { status: 400 }); return new Response('Bad Request', { status: 400 });
} }
const body = payload && typeof payload === 'object' ? (payload as { freq?: unknown; time?: unknown }) : null;
const freqRaw = String(payload?.freq || '').trim().toLowerCase(); const freqRaw = String(body?.freq ?? '').trim().toLowerCase();
const timeRaw = payload?.time == null ? null : String(payload.time).trim(); const timeRaw = body?.time == null ? null : String(body.time).trim();
const allowed = new Set(['off', 'daily', 'weekly', 'weekdays']); const allowed = new Set(['off', 'daily', 'weekly', 'weekdays']);
if (!allowed.has(freqRaw)) { if (!allowed.has(freqRaw)) {
@ -54,17 +56,6 @@ export const POST: RequestHandler = async (event) => {
}); });
} }
function normalizeTime(input: string): string | null {
const m = /^\s*(\d{1,2}):(\d{1,2})\s*$/.exec(input || '');
if (!m) return null;
const h = Number(m[1]);
const min = Number(m[2]);
if (!Number.isFinite(h) || !Number.isFinite(min)) return null;
if (h < 0 || h > 23 || min < 0 || min > 59) return null;
const hh = String(h).padStart(2, '0');
const mm = String(min).padStart(2, '0');
return `${hh}:${mm}`;
}
const db = await getDb(); const db = await getDb();

@ -1,6 +1,7 @@
import type { PageServerLoad, Actions } from './$types'; import type { PageServerLoad, Actions } from './$types';
import { getDb } from '$lib/server/db'; import { getDb } from '$lib/server/db';
import { redirect, fail } from '@sveltejs/kit'; import { redirect, fail } from '@sveltejs/kit';
import { normalizeTime } from '$lib/server/datetime';
function ymdInTZ(d: Date, tz: string): string { function ymdInTZ(d: Date, tz: string): string {
const parts = new Intl.DateTimeFormat('en-GB', { const parts = new Intl.DateTimeFormat('en-GB', {
@ -28,17 +29,6 @@ function weekdayShortInTZ(d: Date, tz: string): string {
return new Intl.DateTimeFormat('en-GB', { timeZone: tz, weekday: 'short' }).format(d); return new Intl.DateTimeFormat('en-GB', { timeZone: tz, weekday: 'short' }).format(d);
} }
function normalizeTime(input: string): string | null {
const m = /^\s*(\d{1,2}):(\d{1,2})\s*$/.exec(input || '');
if (!m) return null;
const h = Number(m[1]);
const min = Number(m[2]);
if (!Number.isFinite(h) || !Number.isFinite(min)) return null;
if (h < 0 || h > 23 || min < 0 || min > 59) return null;
const hh = String(h).padStart(2, '0');
const mm = String(min).padStart(2, '0');
return `${hh}:${mm}`;
}
function computeNextReminder( function computeNextReminder(
freq: 'off' | 'daily' | 'weekly' | 'weekdays', freq: 'off' | 'daily' | 'weekly' | 'weekdays',
@ -123,17 +113,6 @@ export const actions: Actions = {
return fail(400, { error: 'freq inválida' }); return fail(400, { error: 'freq inválida' });
} }
function normalizeTime(input: string): string | null {
const m = /^\s*(\d{1,2}):(\d{1,2})\s*$/.exec(input || '');
if (!m) return null;
const h = Number(m[1]);
const min = Number(m[2]);
if (!Number.isFinite(h) || !Number.isFinite(min)) return null;
if (h < 0 || h > 23 || min < 0 || min > 59) return null;
const hh = String(h).padStart(2, '0');
const mm = String(min).padStart(2, '0');
return `${hh}:${mm}`;
}
const db = await getDb(); const db = await getDb();
let timeToSave: string | null = null; let timeToSave: string | null = null;

@ -1,3 +1,16 @@
export function toIsoSqlUTC(d: Date = new Date()): string { export function toIsoSqlUTC(d: Date = new Date()): string {
return d.toISOString().replace('T', ' ').replace('Z', ''); return d.toISOString().replace('T', ' ').replace('Z', '');
} }
export function normalizeTime(input: string | null | undefined): string | null {
const s = (input ?? '').trim();
const m = /^(\d{1,2}):(\d{1,2})$/.exec(s);
if (!m) return null;
const h = Number(m[1]);
const min = Number(m[2]);
if (!Number.isFinite(h) || !Number.isFinite(min)) return null;
if (h < 0 || h > 23 || min < 0 || min > 59) return null;
const hh = String(h).padStart(2, '0');
const mm = String(min).padStart(2, '0');
return `${hh}:${mm}`;
}

Loading…
Cancel
Save