/
DKoko
/
task-manager-light
Обзор
Документация
Войти
/
DKoko
/
task-manager-light
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/lib/db.ts
71 строка
2 KB
NMitin
feat(auth): вернуть парольную авторизацию вместо Passkey
3 часа назад
3 часа назад
b82fb7c
Код
Авторство
О чём код?
import Database from 'better-sqlite3' import { mkdirSync } from 'node:fs' import { join, resolve } from 'node:path' type DB = Database.Database const dataDir = resolve(process.env.DATA_DIR ?? './data') const dbPath = join(dataDir, 'app.sqlite') const SCHEMA_SQL = /* sql */ ` CREATE TABLE IF NOT EXISTS tasks ( id TEXT PRIMARY KEY, title TEXT NOT NULL, description TEXT NOT NULL DEFAULT '', status TEXT NOT NULL DEFAULT 'new', status_set_at INTEGER NOT NULL, due_date INTEGER, assignee TEXT NOT NULL DEFAULT 'Я', created_at INTEGER NOT NULL, updated_at INTEGER NOT NULL ); CREATE INDEX IF NOT EXISTS idx_tasks_status ON tasks(status); CREATE INDEX IF NOT EXISTS idx_tasks_due_date ON tasks(due_date); ` // Добавляет колонку, если таблица создана без неё (CREATE TABLE IF NOT EXISTS // не обновляет существующую таблицу). Idempotent — безопасен при повторах. const MIGRATE_ADD_ASSIGNEE_SQL = /* sql */ ` ALTER TABLE tasks ADD COLUMN assignee TEXT NOT NULL DEFAULT 'Я' ` // Миграция: убираем Passkey-авторизацию — таблицы больше не нужны. const DROP_WEBAUTHN_TABLES_SQL = /* sql */ ` DROP TABLE IF EXISTS credentials; DROP TABLE IF EXISTS users; ` // В dev Next пересоздаёт модули при HMR — держим одно соединение в globalThis. const globalForDb = globalThis as unknown as { __taskMgrDb?: DB } function migrateAddAssignee(db: DB): void { const cols = db.prepare('PRAGMA table_info(tasks)').all() as { name: string }[] if (cols.some((c) => c.name === 'assignee')) return db.exec(MIGRATE_ADD_ASSIGNEE_SQL) } function migrateDropWebauthnTables(db: DB): void { const table = db.prepare( "SELECT name FROM sqlite_master WHERE type='table' AND name='credentials'", ).get() as { name: string } | undefined if (!table) return db.exec(DROP_WEBAUTHN_TABLES_SQL) } export function getDb(): DB { if (globalForDb.__taskMgrDb) return globalForDb.__taskMgrDb mkdirSync(dataDir, { recursive: true }) const db = new Database(dbPath) db.pragma('journal_mode = WAL') db.pragma('foreign_keys = ON') db.exec(SCHEMA_SQL) migrateAddAssignee(db) migrateDropWebauthnTables(db) globalForDb.__taskMgrDb = db return db } // Папка данных (БД + загруженные изображения). export const DATA_DIR = dataDir