78 lines
2.1 KiB
Python
78 lines
2.1 KiB
Python
import sqlite3
|
|
from datetime import datetime, timezone
|
|
|
|
from src.auth.db import get_conn
|
|
|
|
SCHEMA = """
|
|
CREATE TABLE IF NOT EXISTS saved_views (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
user_id INTEGER NOT NULL,
|
|
table_name TEXT NOT NULL DEFAULT 'tableau',
|
|
name TEXT NOT NULL,
|
|
query TEXT NOT NULL,
|
|
created_at TEXT NOT NULL,
|
|
updated_at TEXT NOT NULL,
|
|
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
|
|
UNIQUE (user_id, table_name, name)
|
|
);
|
|
CREATE INDEX IF NOT EXISTS idx_saved_views_user
|
|
ON saved_views(user_id, table_name);
|
|
"""
|
|
|
|
|
|
def _now() -> str:
|
|
return datetime.now(timezone.utc).isoformat()
|
|
|
|
|
|
def init_schema() -> None:
|
|
get_conn().executescript(SCHEMA)
|
|
|
|
|
|
def list_views(user_id: int, table_name: str = "tableau") -> list[sqlite3.Row]:
|
|
return (
|
|
get_conn()
|
|
.execute(
|
|
"SELECT * FROM saved_views WHERE user_id = ? AND table_name = ? "
|
|
"ORDER BY name COLLATE NOCASE",
|
|
(user_id, table_name),
|
|
)
|
|
.fetchall()
|
|
)
|
|
|
|
|
|
def get(view_id: int, user_id: int) -> sqlite3.Row | None:
|
|
return (
|
|
get_conn()
|
|
.execute(
|
|
"SELECT * FROM saved_views WHERE id = ? AND user_id = ?",
|
|
(view_id, user_id),
|
|
)
|
|
.fetchone()
|
|
)
|
|
|
|
|
|
def upsert(user_id: int, table_name: str, name: str, query: str) -> None:
|
|
now = _now()
|
|
get_conn().execute(
|
|
"INSERT INTO saved_views "
|
|
"(user_id, table_name, name, query, created_at, updated_at) "
|
|
"VALUES (?, ?, ?, ?, ?, ?) "
|
|
"ON CONFLICT(user_id, table_name, name) DO UPDATE SET "
|
|
"query = excluded.query, updated_at = excluded.updated_at",
|
|
(user_id, table_name, name, query, now, now),
|
|
)
|
|
|
|
|
|
def rename(view_id: int, user_id: int, new_name: str) -> None:
|
|
get_conn().execute(
|
|
"UPDATE saved_views SET name = ?, updated_at = ? WHERE id = ? AND user_id = ?",
|
|
(new_name, _now(), view_id, user_id),
|
|
)
|
|
|
|
|
|
def delete(view_id: int, user_id: int) -> None:
|
|
get_conn().execute(
|
|
"DELETE FROM saved_views WHERE id = ? AND user_id = ?",
|
|
(view_id, user_id),
|
|
)
|