feat: habilita modo desarrollo con bypass de auth y seed de demo
Co-authored-by: aider (openrouter/openai/gpt-5) <aider@aider.chat>webui
parent
7e8b9c3d7a
commit
ca616a786a
@ -0,0 +1,109 @@
|
|||||||
|
/**
|
||||||
|
* Seed mínimo de datos de demo para desarrollo.
|
||||||
|
* Inserta usuarios, grupos permitidos, membresías, preferencias y tareas variadas.
|
||||||
|
*/
|
||||||
|
function toIsoYmd(d: Date): string {
|
||||||
|
const yyyy = d.getUTCFullYear();
|
||||||
|
const mm = String(d.getUTCMonth() + 1).padStart(2, '0');
|
||||||
|
const dd = String(d.getUTCDate()).padStart(2, '0');
|
||||||
|
return `${yyyy}-${mm}-${dd}`;
|
||||||
|
}
|
||||||
|
function addDays(base: Date, days: number): Date {
|
||||||
|
return new Date(base.getTime() + days * 24 * 3600 * 1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function seedDev(db: any, defaultUser: string): Promise<void> {
|
||||||
|
try { db.exec(`PRAGMA foreign_keys = ON;`); } catch {}
|
||||||
|
// Si ya hay tareas, asumimos BD poblada
|
||||||
|
try {
|
||||||
|
const row = db.query(`SELECT COUNT(*) AS c FROM tasks`).get() as any;
|
||||||
|
if (row && Number(row.c || 0) > 0) return;
|
||||||
|
} catch {}
|
||||||
|
|
||||||
|
const now = new Date();
|
||||||
|
const today = toIsoYmd(now);
|
||||||
|
const tomorrow = toIsoYmd(addDays(now, 1));
|
||||||
|
const nextWeek = toIsoYmd(addDays(now, 7));
|
||||||
|
const overdue = toIsoYmd(addDays(now, -1));
|
||||||
|
const inTwoDays = toIsoYmd(addDays(now, 2));
|
||||||
|
|
||||||
|
const otherUser = '5550001111';
|
||||||
|
// Usuarios
|
||||||
|
db.prepare(`
|
||||||
|
INSERT OR IGNORE INTO users (id, first_seen, last_seen)
|
||||||
|
VALUES (?, strftime('%Y-%m-%d %H:%M:%f','now'), strftime('%Y-%m-%d %H:%M:%f','now'))
|
||||||
|
`).run(defaultUser);
|
||||||
|
db.prepare(`
|
||||||
|
INSERT OR IGNORE INTO users (id, first_seen, last_seen)
|
||||||
|
VALUES (?, strftime('%Y-%m-%d %H:%M:%f','now'), strftime('%Y-%m-%d %H:%M:%f','now'))
|
||||||
|
`).run(otherUser);
|
||||||
|
|
||||||
|
// Grupos
|
||||||
|
db.prepare(`
|
||||||
|
INSERT OR IGNORE INTO groups (id, community_id, name, active, last_verified)
|
||||||
|
VALUES (?, 'comm-1', ?, 1, strftime('%Y-%m-%d %H:%M:%f','now'))
|
||||||
|
`).run('g-1@g.us', 'Grupo Alpha');
|
||||||
|
db.prepare(`
|
||||||
|
INSERT OR IGNORE INTO groups (id, community_id, name, active, last_verified)
|
||||||
|
VALUES (?, 'comm-1', ?, 1, strftime('%Y-%m-%d %H:%M:%f','now'))
|
||||||
|
`).run('g-2@g.us', 'Grupo Beta');
|
||||||
|
|
||||||
|
// Allowed groups
|
||||||
|
try {
|
||||||
|
db.prepare(`
|
||||||
|
INSERT OR IGNORE INTO allowed_groups (group_id, label, status, discovered_at, updated_at, discovered_by)
|
||||||
|
VALUES (?, 'Alpha', 'allowed', strftime('%Y-%m-%d %H:%M:%f','now'), strftime('%Y-%m-%d %H:%M:%f','now'), NULL)
|
||||||
|
`).run('g-1@g.us');
|
||||||
|
db.prepare(`
|
||||||
|
INSERT OR IGNORE INTO allowed_groups (group_id, label, status, discovered_at, updated_at, discovered_by)
|
||||||
|
VALUES (?, 'Beta', 'allowed', strftime('%Y-%m-%d %H:%M:%f','now'), strftime('%Y-%m-%d %H:%M:%f','now'), NULL)
|
||||||
|
`).run('g-2@g.us');
|
||||||
|
} catch {}
|
||||||
|
|
||||||
|
// Membresías (usuario por defecto activo en ambos grupos)
|
||||||
|
db.prepare(`
|
||||||
|
INSERT OR REPLACE INTO group_members (group_id, user_id, is_admin, is_active, first_seen_at, last_seen_at)
|
||||||
|
VALUES (?, ?, 0, 1, strftime('%Y-%m-%d %H:%M:%f','now'), strftime('%Y-%m-%d %H:%M:%f','now'))
|
||||||
|
`).run('g-1@g.us', defaultUser);
|
||||||
|
db.prepare(`
|
||||||
|
INSERT OR REPLACE INTO group_members (group_id, user_id, is_admin, is_active, first_seen_at, last_seen_at)
|
||||||
|
VALUES (?, ?, 0, 1, strftime('%Y-%m-%d %H:%M:%f','now'), strftime('%Y-%m-%d %H:%M:%f','now'))
|
||||||
|
`).run('g-2@g.us', defaultUser);
|
||||||
|
|
||||||
|
// Preferencias del usuario
|
||||||
|
try {
|
||||||
|
db.prepare(`
|
||||||
|
INSERT OR REPLACE INTO user_preferences (user_id, reminder_freq, reminder_time, last_reminded_on, updated_at)
|
||||||
|
VALUES (?, 'daily', '08:30', NULL, strftime('%Y-%m-%d %H:%M:%f','now'))
|
||||||
|
`).run(defaultUser);
|
||||||
|
} catch {}
|
||||||
|
|
||||||
|
// Crear tareas diversas
|
||||||
|
const insertTask = db.prepare(`
|
||||||
|
INSERT INTO tasks (description, due_date, group_id, created_by, completed, completed_at)
|
||||||
|
VALUES (?, ?, ?, ?, COALESCE(?, 0), ?)
|
||||||
|
`);
|
||||||
|
const assignStmt = db.prepare(`
|
||||||
|
INSERT OR IGNORE INTO task_assignments (task_id, user_id, assigned_by)
|
||||||
|
VALUES (?, ?, ?)
|
||||||
|
`);
|
||||||
|
|
||||||
|
const tasksToCreate = [
|
||||||
|
{ desc: 'Tarea sin responsable (hoy) - Grupo Alpha', due: today, group: 'g-1@g.us', assignTo: null, completed: 0, completedAt: null },
|
||||||
|
{ desc: 'Tarea sin responsable (mañana) - Grupo Alpha', due: tomorrow, group: 'g-1@g.us', assignTo: null, completed: 0, completedAt: null },
|
||||||
|
{ desc: 'Tarea sin responsable (próx. semana) - Grupo Beta', due: nextWeek, group: 'g-2@g.us', assignTo: null, completed: 0, completedAt: null },
|
||||||
|
{ desc: 'Mi tarea personal (en 2 días)', due: inTwoDays, group: null, assignTo: defaultUser, completed: 0, completedAt: null },
|
||||||
|
{ desc: 'Mi tarea (vencida ayer) - Grupo Alpha', due: overdue, group: 'g-1@g.us', assignTo: defaultUser, completed: 0, completedAt: null },
|
||||||
|
{ desc: 'Tarea completada reciente', due: today, group: null, assignTo: defaultUser, completed: 1, completedAt: new Date().toISOString().replace('T',' ').replace('Z','') }
|
||||||
|
];
|
||||||
|
|
||||||
|
db.transaction(() => {
|
||||||
|
for (const t of tasksToCreate) {
|
||||||
|
const res = insertTask.run(t.desc, t.due, t.group, defaultUser, t.completed, t.completedAt);
|
||||||
|
const id = Number((res as any)?.lastInsertRowid ?? 0);
|
||||||
|
if (t.assignTo && id > 0) {
|
||||||
|
assignStmt.run(id, t.assignTo, defaultUser);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue