El objetivo de estos cambios es, por un lado, mantener los datos
actualizados y, por otro, mejorar la experiencia para quienes lo usan:
- Fiabilidad: los locales se pueden confirmar ("Sigue aquí") y
reportar (cerrado, datos incorrectos...), y se avisa de duplicados
antes de publicar, para que el contenido no se quede obsoleto ni
repetido.
- Usabilidad: autocompletado al proponer, favoritos, "cerca de mí",
compartir fichas, enlaces a Waze y una política de privacidad
visible, para que sea más sencillo aportar y encontrar locales.
88 lines
2.6 KiB
JavaScript
88 lines
2.6 KiB
JavaScript
import Database from "better-sqlite3";
|
|
import { fileURLToPath } from "url";
|
|
import { dirname, join } from "path";
|
|
|
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
const dbPath = join(__dirname, "../localesp.db");
|
|
const db = new Database(dbPath);
|
|
|
|
db.exec(`
|
|
CREATE TABLE IF NOT EXISTS locales (
|
|
id TEXT PRIMARY KEY,
|
|
nombre TEXT NOT NULL,
|
|
descripcion TEXT,
|
|
provincia TEXT,
|
|
subcategoria TEXT,
|
|
direccion TEXT,
|
|
enlaceGoogleMaps TEXT,
|
|
puntuacion INTEGER DEFAULT 0,
|
|
categoria TEXT,
|
|
fecha TEXT DEFAULT CURRENT_TIMESTAMP,
|
|
lat REAL,
|
|
lng REAL
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS pendientes (
|
|
id TEXT PRIMARY KEY,
|
|
nombre TEXT NOT NULL,
|
|
descripcion TEXT,
|
|
provincia TEXT,
|
|
subcategoria TEXT,
|
|
direccion TEXT,
|
|
enlaceGoogleMaps TEXT,
|
|
puntuacion INTEGER DEFAULT 0,
|
|
categoria TEXT,
|
|
estado TEXT DEFAULT 'pendiente',
|
|
fechaPropuesta TEXT DEFAULT CURRENT_TIMESTAMP,
|
|
lat REAL,
|
|
lng REAL
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS config (
|
|
id TEXT PRIMARY KEY,
|
|
datos TEXT
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS reportes (
|
|
id TEXT PRIMARY KEY,
|
|
localId TEXT NOT NULL,
|
|
motivo TEXT,
|
|
comentario TEXT,
|
|
fecha TEXT DEFAULT CURRENT_TIMESTAMP,
|
|
estado TEXT DEFAULT 'pendiente'
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS users (
|
|
id TEXT PRIMARY KEY,
|
|
email TEXT UNIQUE NOT NULL,
|
|
password TEXT NOT NULL,
|
|
created TEXT DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
`);
|
|
|
|
// 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");
|
|
}
|
|
// fechaConfirmacion: última vez que alguien confirmó que el local sigue activo.
|
|
// Al aprobarse por primera vez se inicializa igual a "fecha"; luego se actualiza
|
|
// con /api/locales/:id/confirmar cada vez que un usuario pulsa "Sigue aquí".
|
|
ensureColumn("locales", "fechaConfirmacion", "TEXT");
|
|
db.prepare("UPDATE locales SET fechaConfirmacion = fecha WHERE fechaConfirmacion IS NULL").run();
|
|
|
|
export default db;
|