package database import ( "database/sql" "fmt" _ "github.com/mattn/go-sqlite3" ) type Client struct { db *sql.DB } func NewClient(pathToDB string) (Client, error) { db, err := sql.Open("sqlite3", pathToDB) if err != nil { return Client{}, err } c := Client{db} err = c.autoMigrate() if err != nil { return Client{}, err } return c, nil } func (c *Client) autoMigrate() error { userTable := ` CREATE TABLE IF NOT EXISTS users ( id TEXT PRIMARY KEY, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, password TEXT NOT NULL, email TEXT UNIQUE NOT NULL ); ` _, err := c.db.Exec(userTable) if err != nil { return err } refreshTokenTable := ` CREATE TABLE IF NOT EXISTS refresh_tokens ( token TEXT PRIMARY KEY, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, revoked_at TIMESTAMP, user_id TEXT NOT NULL, expires_at TIMESTAMP NOT NULL, FOREIGN KEY(user_id) REFERENCES users(id) ); ` _, err = c.db.Exec(refreshTokenTable) if err != nil { return err } videoTable := ` CREATE TABLE IF NOT EXISTS videos ( id TEXT PRIMARY KEY, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, title TEXT NOT NULL, description TEXT, thumbnail_url TEXT, video_url TEXT TEXT, user_id INTEGER, FOREIGN KEY(user_id) REFERENCES users(id) ); ` _, err = c.db.Exec(videoTable) if err != nil { return err } return nil } func (c Client) Reset() error { if _, err := c.db.Exec("DELETE FROM refresh_tokens"); err != nil { return fmt.Errorf("failed to reset table refresh_tokens: %w", err) } if _, err := c.db.Exec("DELETE FROM users"); err != nil { return fmt.Errorf("failed to reset table users: %w", err) } if _, err := c.db.Exec("DELETE FROM videos"); err != nil { return fmt.Errorf("failed to reset table videos: %w", err) } return nil }