package database import ( "database/sql" "fmt" "log" "git.vakhrushev.me/av/transcriber/models" "github.com/doug-martin/goqu/v9" _ "github.com/doug-martin/goqu/v9/dialect/sqlite3" _ "github.com/mattn/go-sqlite3" "github.com/pressly/goose/v3" ) type DB struct { conn *sql.DB gq *goqu.Database } func New(dbPath string) (*DB, error) { conn, err := sql.Open("sqlite3", dbPath) if err != nil { return nil, fmt.Errorf("failed to open database: %w", err) } if err := conn.Ping(); err != nil { return nil, fmt.Errorf("failed to ping database: %w", err) } gq := goqu.New("sqlite3", conn) db := &DB{ conn: conn, gq: gq, } return db, nil } func (db *DB) RunMigrations(migrationsDir string) error { if err := goose.SetDialect("sqlite3"); err != nil { return fmt.Errorf("failed to set goose dialect: %w", err) } if err := goose.Up(db.conn, migrationsDir); err != nil { return fmt.Errorf("failed to run migrations: %w", err) } log.Println("Migrations completed successfully") return nil } func (db *DB) Close() error { return db.conn.Close() } func (db *DB) CreateFile(file *models.File) error { query := db.gq.Insert("files").Rows(file) sql, args, err := query.ToSQL() if err != nil { return fmt.Errorf("failed to build query: %w", err) } _, err = db.conn.Exec(sql, args...) if err != nil { return fmt.Errorf("failed to insert file: %w", err) } return nil } func (db *DB) CreateTranscribeJob(job *models.TranscribeJob) error { query := db.gq.Insert("transcribe_jobs").Rows(job) sql, args, err := query.ToSQL() if err != nil { return fmt.Errorf("failed to build query: %w", err) } _, err = db.conn.Exec(sql, args...) if err != nil { return fmt.Errorf("failed to insert transcribe job: %w", err) } return nil } func (db *DB) GetFileByID(id string) (*models.File, error) { query := db.gq.From("files").Where(goqu.C("id").Eq(id)) sql, args, err := query.ToSQL() if err != nil { return nil, fmt.Errorf("failed to build query: %w", err) } var file models.File err = db.conn.QueryRow(sql, args...).Scan(&file.ID, &file.Type, &file.Size, &file.CreatedAt) if err != nil { return nil, fmt.Errorf("failed to get file: %w", err) } return &file, nil } func (db *DB) GetTranscribeJobByID(id string) (*models.TranscribeJob, error) { query := db.gq.From("transcribe_jobs").Where(goqu.C("id").Eq(id)) sql, args, err := query.ToSQL() if err != nil { return nil, fmt.Errorf("failed to build query: %w", err) } var job models.TranscribeJob err = db.conn.QueryRow(sql, args...).Scan(&job.ID, &job.Status, &job.FileID, &job.CreatedAt, &job.UpdatedAt) if err != nil { return nil, fmt.Errorf("failed to get transcribe job: %w", err) } return &job, nil }