Files
learn-file-storage-s3-golan…/internal/database/database.go
Daniel Hjartland 75be79c6cf initial commit
2025-01-02 16:32:57 +01:00

90 lines
1.9 KiB
Go

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
}