Migración de esquema DB y soporte PWA:
- Mapeo campos en base de datos: ubicacion→provincia, telefono→subcategoria, email→direccion, web→enlaceGoogleMaps y añadido puntuacion. - Migración suave (ensureColumn) para añadir las nuevas columnas sin perder datos existentes si la DB ya existía con el esquema antiguo. - Actualización de rutas del servidor para guardar/leer los nuevos campos y convertir el NULL a valor nulo por defecto en puntuacion. - Soporte PWA: añadido meta tags (manifest, theme-color, apple-touch-icon) y registro de service worker para instalación del app y shell offline.
This commit is contained in:
+29
-8
@@ -11,10 +11,11 @@ db.exec(`
|
||||
id TEXT PRIMARY KEY,
|
||||
nombre TEXT NOT NULL,
|
||||
descripcion TEXT,
|
||||
ubicacion TEXT,
|
||||
telefono TEXT,
|
||||
email TEXT,
|
||||
web TEXT,
|
||||
provincia TEXT,
|
||||
subcategoria TEXT,
|
||||
direccion TEXT,
|
||||
enlaceGoogleMaps TEXT,
|
||||
puntuacion INTEGER DEFAULT 0,
|
||||
categoria TEXT,
|
||||
fecha TEXT DEFAULT CURRENT_TIMESTAMP,
|
||||
lat REAL,
|
||||
@@ -25,10 +26,11 @@ db.exec(`
|
||||
id TEXT PRIMARY KEY,
|
||||
nombre TEXT NOT NULL,
|
||||
descripcion TEXT,
|
||||
ubicacion TEXT,
|
||||
telefono TEXT,
|
||||
email TEXT,
|
||||
web TEXT,
|
||||
provincia TEXT,
|
||||
subcategoria TEXT,
|
||||
direccion TEXT,
|
||||
enlaceGoogleMaps TEXT,
|
||||
puntuacion INTEGER DEFAULT 0,
|
||||
categoria TEXT,
|
||||
estado TEXT DEFAULT 'pendiente',
|
||||
fechaPropuesta TEXT DEFAULT CURRENT_TIMESTAMP,
|
||||
@@ -49,4 +51,23 @@ db.exec(`
|
||||
);
|
||||
`);
|
||||
|
||||
// Migración suave: si la base de datos ya existía con el esquema antiguo
|
||||
// (sin provincia/subcategoria/direccion/enlaceGoogleMaps/puntuacion),
|
||||
// añadimos las columnas que falten sin borrar nada, porque
|
||||
// CREATE TABLE IF NOT EXISTS no modifica tablas ya creadas.
|
||||
function ensureColumn(table, column, definition) {
|
||||
const cols = db.prepare(`PRAGMA table_info(${table})`).all().map(c => c.name);
|
||||
if (!cols.includes(column)) {
|
||||
db.exec(`ALTER TABLE ${table} ADD COLUMN ${column} ${definition}`);
|
||||
}
|
||||
}
|
||||
|
||||
for (const table of ["locales", "pendientes"]) {
|
||||
ensureColumn(table, "provincia", "TEXT");
|
||||
ensureColumn(table, "subcategoria", "TEXT");
|
||||
ensureColumn(table, "direccion", "TEXT");
|
||||
ensureColumn(table, "enlaceGoogleMaps", "TEXT");
|
||||
ensureColumn(table, "puntuacion", "INTEGER DEFAULT 0");
|
||||
}
|
||||
|
||||
export default db;
|
||||
|
||||
+8
-8
@@ -24,16 +24,16 @@ app.get("/api/pendientes", (_req, res) => {
|
||||
|
||||
// Enviar propuesta
|
||||
app.post("/api/propuestas", (req, res) => {
|
||||
const { nombre, descripcion, ubicacion, telefono, email, web, categoria, lat, lng } = req.body;
|
||||
const { nombre, descripcion, provincia, subcategoria, direccion, enlaceGoogleMaps, puntuacion, categoria, lat, lng } = req.body;
|
||||
const id = randomUUID();
|
||||
const fechaPropuesta = new Date().toISOString();
|
||||
|
||||
db.prepare(`
|
||||
INSERT INTO pendientes (id, nombre, descripcion, ubicacion, telefono, email, web, categoria, estado, fechaPropuesta, lat, lng)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?, 'pendiente', ?, ?, ?)
|
||||
`).run(id, nombre, descripcion, ubicacion, telefono, email, web, categoria, fechaPropuesta, lat, lng);
|
||||
INSERT INTO pendientes (id, nombre, descripcion, provincia, subcategoria, direccion, enlaceGoogleMaps, puntuacion, categoria, estado, fechaPropuesta, lat, lng)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, 'pendiente', ?, ?, ?)
|
||||
`).run(id, nombre, descripcion, provincia, subcategoria, direccion, enlaceGoogleMaps, puntuacion ?? 0, categoria, fechaPropuesta, lat, lng);
|
||||
|
||||
res.status(201).json({ id, nombre, descripcion, ubicacion, telefono, email, web, categoria, estado: "pendiente", fechaPropuesta, lat, lng });
|
||||
res.status(201).json({ id, nombre, descripcion, provincia, subcategoria, direccion, enlaceGoogleMaps, puntuacion: puntuacion ?? 0, categoria, estado: "pendiente", fechaPropuesta, lat, lng });
|
||||
});
|
||||
|
||||
// Aprobar propuesta
|
||||
@@ -47,9 +47,9 @@ app.post("/api/aprobar/:id", (req, res) => {
|
||||
const fecha = new Date().toISOString();
|
||||
|
||||
db.prepare(`
|
||||
INSERT INTO locales (id, nombre, descripcion, ubicacion, telefono, email, web, categoria, fecha, lat, lng)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
||||
`).run(localeId, propuesta.nombre, propuesta.descripcion, propuesta.ubicacion, propuesta.telefono, propuesta.email, propuesta.web, propuesta.categoria, fecha, propuesta.lat, propuesta.lng);
|
||||
INSERT INTO locales (id, nombre, descripcion, provincia, subcategoria, direccion, enlaceGoogleMaps, puntuacion, categoria, fecha, lat, lng)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
||||
`).run(localeId, propuesta.nombre, propuesta.descripcion, propuesta.provincia, propuesta.subcategoria, propuesta.direccion, propuesta.enlaceGoogleMaps, propuesta.puntuacion ?? 0, propuesta.categoria, fecha, propuesta.lat, propuesta.lng);
|
||||
|
||||
db.prepare("DELETE FROM pendientes WHERE id = ?").run(id);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user