Files
apocapoc-api/internal/infrastructure/persistence/sqlite/database.go
T
david 0977d3a58b Implement SQLite persistence layer (TDD)
- Add SQLite and UUID dependencies (go-sqlite3, google/uuid)
- Create database connection with automatic migrations
- Implement UserRepository with full CRUD operations
- Implement HabitRepository with JSON serialization for arrays
- Implement HabitEntryRepository with date range queries
- Add comprehensive test coverage for all repositories
- Fix User entity to default timezone to UTC when empty
- All tests passing with TDD approach (Red-Green-Refactor)
2025-11-25 14:29:51 +01:00

49 lines
907 B
Go

package sqlite
import (
"database/sql"
"fmt"
"os"
"path/filepath"
_ "github.com/mattn/go-sqlite3"
)
type Database struct {
conn *sql.DB
}
func NewDatabase(dbPath string) (*Database, error) {
dir := filepath.Dir(dbPath)
if dir != "." && dir != ":" {
if err := os.MkdirAll(dir, 0755); err != nil {
return nil, fmt.Errorf("failed to create data directory: %w", err)
}
}
conn, err := sql.Open("sqlite3", dbPath)
if err != nil {
return nil, fmt.Errorf("failed to open database: %w", err)
}
conn.SetMaxOpenConns(1)
if err := conn.Ping(); err != nil {
return nil, fmt.Errorf("failed to ping database: %w", err)
}
if err := RunMigrations(conn); err != nil {
return nil, fmt.Errorf("failed to run migrations: %w", err)
}
return &Database{conn: conn}, nil
}
func (db *Database) Close() error {
return db.conn.Close()
}
func (db *Database) Conn() *sql.DB {
return db.conn
}