
    j	                        S r SSKJr  SSKrSSKrSSKJr  \" \R                  R                  S5      =(       d    \" \	5      R                  S-  5      rSrS r\S	:X  a  \" 5         gg)
zERGON - Migration F13 (sprint 2): tablas auth.

Idempotente: CREATE TABLE IF NOT EXISTS. Safe de correr multiples veces.
Agrega 3 tablas: usuarios, usuarios_obras (m2m), sesiones.
    )annotationsN)PathDATABASE_PATHzergon.dba  
CREATE TABLE IF NOT EXISTS usuarios (
    id              INTEGER PRIMARY KEY AUTOINCREMENT,
    email           TEXT NOT NULL UNIQUE CHECK (email LIKE '%@%.%'),
    password_hash   TEXT NOT NULL,
    nombre          TEXT NOT NULL,
    rol             TEXT NOT NULL CHECK (rol IN ('admin','cliente')),
    activo          INTEGER NOT NULL DEFAULT 1 CHECK (activo IN (0,1)),
    created_at      TEXT NOT NULL DEFAULT (datetime('now')),
    last_login_at   TEXT
);

CREATE TABLE IF NOT EXISTS usuarios_obras (
    usuario_id      INTEGER NOT NULL REFERENCES usuarios(id) ON DELETE CASCADE,
    obra_id         INTEGER NOT NULL REFERENCES obras(id) ON DELETE CASCADE,
    created_at      TEXT NOT NULL DEFAULT (datetime('now')),
    PRIMARY KEY (usuario_id, obra_id)
);

CREATE TABLE IF NOT EXISTS sesiones (
    token           TEXT PRIMARY KEY,
    usuario_id      INTEGER NOT NULL REFERENCES usuarios(id) ON DELETE CASCADE,
    expira_at       TEXT NOT NULL,
    created_at      TEXT NOT NULL DEFAULT (datetime('now'))
);

CREATE INDEX IF NOT EXISTS idx_sesiones_usuario  ON sesiones (usuario_id);
CREATE INDEX IF NOT EXISTS idx_sesiones_expira   ON sesiones (expira_at);
CREATE INDEX IF NOT EXISTS idx_usuarios_obras_o  ON usuarios_obras (obra_id);
c                 @   [         R                  " [        [        5      5      n U R	                  S5        U R                  [        5        U R                  5         U R	                  S5      R                  5        Vs/ s H  oS   PM	     nn[        SU 35        [        U5      S:w  a  [        S5      eU R	                  S5      R                  5        Vs/ s H  oS   PM	     nn[        SU 35        [        S	[         S
35        U R                  5         g s  snf s  snf )NzPRAGMA foreign_keys = ONztSELECT name FROM sqlite_master WHERE type='table' AND name IN ('usuarios','usuarios_obras','sesiones') ORDER BY namer   z[F13] Tablas presentes:    z,ERROR: no se crearon las 3 tablas esperadas.zSELECT name FROM sqlite_master WHERE type='index' AND name LIKE 'idx_sesiones%' OR name LIKE 'idx_usuarios_obras%' ORDER BY namez[F13] Indices: z [F13] Migration aplicada contra z#. Sin cambios en tablas existentes.)sqlite3connectstrDB_PATHexecuteexecutescriptSCHEMAcommitfetchallprintlen
SystemExitclose)connrtablasindicess       /app/db/migrate_f13.pymainr   /   s   ??3w<(DLL+,vKKM LL	M hj  qd F  
$VH
-.
6{aGHH!\\	 hj	  t G 
 
OG9
%&	,WI5X
YZJJL!s   ;DD__main__)__doc__
__future__r   osr   pathlibr   environget__file__parentr   r   r   __name__     r   <module>r'      sd   
 # 	  
rzz~~o.V4>3H3H:3U
W
@2 zF r&   