Files
Dash/apps/backend/internal/db/db.go
T
Tomas Dvorak b60821350a feat: phase 0 foundation — monorepo scaffold, backend, frontend, CI, docker
Establishes the skeleton every later phase builds on: Go+Gin API with
zap logging, /api/healthz, SQLite+goose runner; Vite+React18+TS strict+
Tailwind v4 frontend with bento-mono theme tokens; openapi.yaml driving
a generated TS client; oxlint with vendored anti-slop rules; GitHub CI;
multi-stage Dockerfile -> 33.6MB distroless image; docker compose up
serves the blank board.


Generated with [Devin](https://devin.ai)

Authored By: TDvorak <[email protected]>
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-17 20:29:21 +02:00

34 lines
911 B
Go

// Package db opens the SQLite database and applies goose migrations.
package db
import (
"database/sql"
"embed"
"fmt"
"github.com/pressly/goose/v3"
_ "modernc.org/sqlite"
)
//go:embed migrations/*.sql
var migrations embed.FS
// Open opens (creating if needed) the SQLite file at path and migrates it
// to the latest schema. WAL + busy_timeout keep reads snappy under writes.
func Open(path string) (*sql.DB, error) {
dsn := fmt.Sprintf("file:%s?_pragma=busy_timeout(5000)&_pragma=journal_mode(WAL)&_pragma=foreign_keys(1)", path)
sqlDB, err := sql.Open("sqlite", dsn)
if err != nil {
return nil, fmt.Errorf("open sqlite: %w", err)
}
goose.SetBaseFS(migrations)
if err := goose.SetDialect("sqlite3"); err != nil {
return nil, fmt.Errorf("goose dialect: %w", err)
}
if err := goose.Up(sqlDB, "migrations"); err != nil {
return nil, fmt.Errorf("migrate: %w", err)
}
return sqlDB, nil
}