revert: remove database abstraction
This commit is contained in:
15
cmd/cmd.go
15
cmd/cmd.go
@@ -68,13 +68,6 @@ func init() {
|
||||
func main() {
|
||||
ctx := context.Background()
|
||||
|
||||
assertions := tinyssert.NewDisabledAssertions()
|
||||
if *dev {
|
||||
assertions = tinyssert.NewAssertions(tinyssert.Opts{
|
||||
Panic: true,
|
||||
})
|
||||
}
|
||||
|
||||
level := slog.LevelError
|
||||
if *dev {
|
||||
level = slog.LevelDebug
|
||||
@@ -83,6 +76,14 @@ func main() {
|
||||
}
|
||||
log := slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{Level: level}))
|
||||
|
||||
assertions := tinyssert.NewDisabled()
|
||||
if *dev {
|
||||
assertions = tinyssert.New(
|
||||
tinyssert.WithPanic(),
|
||||
tinyssert.WithLogger(log),
|
||||
)
|
||||
}
|
||||
|
||||
db, err := sql.Open("libsql", databaseURL)
|
||||
if err != nil {
|
||||
log.Error("Failed open connection to database", slog.String("error", err.Error()))
|
||||
|
||||
@@ -1,98 +0,0 @@
|
||||
package database
|
||||
|
||||
import (
|
||||
"context"
|
||||
"database/sql"
|
||||
"errors"
|
||||
"log/slog"
|
||||
|
||||
"forge.capytal.company/loreddev/x/tinyssert"
|
||||
)
|
||||
|
||||
var ErrNoRows = sql.ErrNoRows
|
||||
|
||||
type Database struct {
|
||||
sql *sql.DB
|
||||
ctx context.Context
|
||||
|
||||
assert tinyssert.Assertions
|
||||
log *slog.Logger
|
||||
}
|
||||
|
||||
func New(cfg Config) (*Database, error) {
|
||||
if cfg.SQL == nil {
|
||||
return nil, errors.New("SQL database interface should not be nil")
|
||||
}
|
||||
if cfg.Context == nil {
|
||||
return nil, errors.New("context interface should not be nil")
|
||||
}
|
||||
if cfg.Assertions == nil {
|
||||
return nil, errors.New("assertions interface should not be nil")
|
||||
}
|
||||
if cfg.Logger == nil {
|
||||
return nil, errors.New("logger should not be a nil pointer")
|
||||
}
|
||||
|
||||
db := &Database{
|
||||
sql: cfg.SQL,
|
||||
ctx: cfg.Context,
|
||||
|
||||
assert: cfg.Assertions,
|
||||
log: cfg.Logger,
|
||||
}
|
||||
|
||||
if err := db.setup(); err != nil {
|
||||
return nil, errors.Join(errors.New("error while setting up Database struct"), err)
|
||||
}
|
||||
|
||||
return db, nil
|
||||
}
|
||||
|
||||
type Config struct {
|
||||
SQL *sql.DB
|
||||
Context context.Context
|
||||
|
||||
Assertions tinyssert.Assertions
|
||||
Logger *slog.Logger
|
||||
}
|
||||
|
||||
func (db *Database) setup() error {
|
||||
db.assert.NotNil(db.sql)
|
||||
db.assert.NotNil(db.ctx)
|
||||
db.assert.NotNil(db.log)
|
||||
|
||||
log := db.log
|
||||
log.Info("Setting up database")
|
||||
|
||||
log.Debug("Pinging database")
|
||||
|
||||
err := db.sql.PingContext(db.ctx)
|
||||
if err != nil {
|
||||
return errors.Join(errors.New("unable to ping database"), err)
|
||||
}
|
||||
|
||||
log.Debug("Creating tables")
|
||||
|
||||
tx, err := db.sql.BeginTx(db.ctx, nil)
|
||||
if err != nil {
|
||||
return errors.Join(errors.New("unable to start transaction to create tables"), err)
|
||||
}
|
||||
|
||||
setups := []func(*sql.Tx) error{
|
||||
db.setupProjects,
|
||||
}
|
||||
|
||||
for _, setup := range setups {
|
||||
err := setup(tx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
err = tx.Commit()
|
||||
if err != nil {
|
||||
return errors.Join(errors.New("unable to run transaction to create tables"), err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
@@ -1,156 +0,0 @@
|
||||
package database
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
"errors"
|
||||
"fmt"
|
||||
"log/slog"
|
||||
)
|
||||
|
||||
type Project struct {
|
||||
ID string
|
||||
Title string
|
||||
}
|
||||
|
||||
func (db *Database) setupProjects(tx *sql.Tx) error {
|
||||
db.assert.NotNil(tx)
|
||||
db.assert.NotNil(db.ctx)
|
||||
|
||||
q := `CREATE TABLE IF NOT EXISTS projects (
|
||||
id TEXT PRIMARY KEY NOT NULL,
|
||||
title TEXT NOT NULL
|
||||
) STRICT`
|
||||
_, err := tx.ExecContext(db.ctx, q)
|
||||
if err != nil {
|
||||
return errors.Join(errors.New(`unable to execute create query to table "projects"`), err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (db *Database) CreateProject(id string, title string) (Project, error) {
|
||||
db.assert.NotNil(db.sql)
|
||||
db.assert.NotNil(db.ctx)
|
||||
db.assert.NotNil(db.log)
|
||||
db.assert.NotZero(id)
|
||||
db.assert.NotZero(title)
|
||||
|
||||
q := fmt.Sprintf(`INSERT INTO projects (id, title) VALUES ('%s', '%s')`, id, title)
|
||||
|
||||
db.log.Debug("Inserting into Projects", slog.String("query", q))
|
||||
|
||||
tx, err := db.sql.BeginTx(db.ctx, nil)
|
||||
if err != nil {
|
||||
return Project{}, err
|
||||
}
|
||||
|
||||
_, err = tx.ExecContext(db.ctx, q)
|
||||
if err != nil {
|
||||
return Project{}, err
|
||||
}
|
||||
|
||||
err = tx.Commit()
|
||||
if err != nil {
|
||||
return Project{}, err
|
||||
}
|
||||
|
||||
return Project{ID: id, Title: title}, nil
|
||||
}
|
||||
|
||||
func (db *Database) GetProject(id string) (Project, error) {
|
||||
db.assert.NotNil(db.sql)
|
||||
db.assert.NotNil(db.ctx)
|
||||
db.assert.NotNil(db.log)
|
||||
|
||||
q := fmt.Sprintf(`SELECT id, title FROM projects WHERE id = '%s'`, id)
|
||||
|
||||
db.log.Debug("Getting Project", slog.String("query", q))
|
||||
|
||||
tx, err := db.sql.BeginTx(db.ctx, nil)
|
||||
if err != nil {
|
||||
return Project{}, err
|
||||
}
|
||||
|
||||
row := tx.QueryRowContext(db.ctx, q)
|
||||
|
||||
p := Project{}
|
||||
err = row.Scan(&p.ID, &p.Title)
|
||||
if err != nil {
|
||||
return p, err
|
||||
}
|
||||
|
||||
err = tx.Commit()
|
||||
if err != nil {
|
||||
return p, err
|
||||
}
|
||||
|
||||
return p, nil
|
||||
}
|
||||
|
||||
func (db *Database) ListProjects() ([]Project, error) {
|
||||
db.assert.NotNil(db.sql)
|
||||
db.assert.NotNil(db.ctx)
|
||||
db.assert.NotNil(db.log)
|
||||
|
||||
q := `SELECT id, title FROM projects`
|
||||
|
||||
db.log.Debug("Listing Projects", slog.String("query", q))
|
||||
|
||||
tx, err := db.sql.BeginTx(db.ctx, nil)
|
||||
if err != nil {
|
||||
return []Project{}, err
|
||||
}
|
||||
|
||||
rows, err := tx.QueryContext(db.ctx, q)
|
||||
if err != nil {
|
||||
db.assert.Nil(tx.Rollback())
|
||||
return []Project{}, err
|
||||
}
|
||||
|
||||
ps := []Project{}
|
||||
for rows.Next() {
|
||||
p := Project{}
|
||||
|
||||
err := rows.Scan(&p.ID, &p.Title)
|
||||
if err != nil {
|
||||
db.assert.Nil(tx.Rollback())
|
||||
return ps, err
|
||||
}
|
||||
|
||||
ps = append(ps, p)
|
||||
}
|
||||
|
||||
err = tx.Commit()
|
||||
if err != nil {
|
||||
return ps, err
|
||||
}
|
||||
|
||||
return ps, nil
|
||||
}
|
||||
|
||||
func (db *Database) DeleteProject(id string) error {
|
||||
db.assert.NotNil(db.sql)
|
||||
db.assert.NotNil(db.ctx)
|
||||
db.assert.NotNil(db.log)
|
||||
db.assert.NotZero(id)
|
||||
|
||||
q := fmt.Sprintf(`DELETE FROM projects WHERE id = '%s'`, id)
|
||||
|
||||
db.log.Debug("Deleting from Projects", slog.String("query", q))
|
||||
|
||||
tx, err := db.sql.BeginTx(db.ctx, nil)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
_, err = tx.ExecContext(db.ctx, q)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
err = tx.Commit()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
@@ -8,7 +8,6 @@ import (
|
||||
"io"
|
||||
"log/slog"
|
||||
|
||||
"forge.capytal.company/capytalcode/project-comicverse/database"
|
||||
"forge.capytal.company/capytalcode/project-comicverse/internals/randstr"
|
||||
"github.com/aws/aws-sdk-go-v2/service/s3"
|
||||
"github.com/aws/aws-sdk-go-v2/service/s3/types"
|
||||
@@ -76,9 +75,9 @@ func (s *Service) GetProject(id string) (Project, error) {
|
||||
s.assert.NotZero(id)
|
||||
|
||||
res, err := s.db.GetProject(id)
|
||||
if errors.Is(err, database.ErrNoRows) {
|
||||
return Project{}, errors.Join(ErrProjectNotExists, err)
|
||||
}
|
||||
// if errors.Is(err, database.ErrNoRows) {
|
||||
// return Project{}, errors.Join(ErrProjectNotExists, err)
|
||||
// }
|
||||
if err != nil {
|
||||
return Project{}, err
|
||||
}
|
||||
|
||||
@@ -5,7 +5,6 @@ import (
|
||||
"errors"
|
||||
"log/slog"
|
||||
|
||||
"forge.capytal.company/capytalcode/project-comicverse/database"
|
||||
"forge.capytal.company/loreddev/x/tinyssert"
|
||||
"github.com/aws/aws-sdk-go-v2/service/s3"
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user