from models import User from passlib.context import CryptContext import sqlite3 import jwt import datetime JWT_SECRET = "secret" connection = sqlite3.connect('database.db') connection.row_factory = sqlite3.Row cursor = connection.cursor() password_context = CryptContext(schemes=["sha256_crypt"], deprecated="auto") def init() -> None: # create users table cursor.execute(''' CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY, name TEXT NOT NULL UNIQUE, password TEXT NOT NULL ) ''') def close() -> None: connection.close() def register(user: User) -> None: password = password_context.hash(user.password) cursor.execute("INSERT INTO users (name, password) VALUES (?, ?)", (user.name, password)) connection.commit() def login(user: User) -> str: cursor.execute("SELECT id, name, password FROM users WHERE name = ?", (user.name,)) row = cursor.fetchone() if not row: raise Exception('User not found') if not password_context.verify(user.password, row["password"]): raise Exception('Invalid password') exp = datetime.datetime.now(datetime.timezone.utc) + datetime.timedelta(hours=1) payload = { "id": row["id"], "exp": exp } return jwt.encode(payload=payload, key=JWT_SECRET, algorithm="HS256")