presences/db.go

83 lines
1.6 KiB
Go

package main
import (
"context"
"fmt"
"git.agecem.com/bottin/presences/queries"
"github.com/jackc/pgx/v5/pgxpool"
)
type DBClient struct {
Pool *pgxpool.Pool
}
func nilDBErrorf(failedAction string) error {
return fmt.Errorf("db: cannot %s using nil connection pool", failedAction)
}
func (d DBClient) Init(ctx context.Context) error {
select {
case <-ctx.Done():
return ctx.Err()
default:
if d.Pool == nil {
return nilDBErrorf("init")
}
if _, err := d.Pool.Exec(ctx, queries.SQLSchema()); err != nil {
return err
}
return nil
}
}
func (d DBClient) CreatePresence(ctx context.Context, membreID string) error {
select {
case <-ctx.Done():
return ctx.Err()
default:
if d.Pool == nil {
return nilDBErrorf("check health")
}
// CreatePresence
commandTag, err := d.Pool.Exec(ctx, `
INSERT INTO "presences" (id)
VALUES ($1);
`, membreID)
if err != nil {
if err.Error() == `ERROR: duplicate key value violates unique constraint "presences_pkey" (SQLSTATE 23505)` {
return fmt.Errorf("Membre '%s' a déjà été enregistré·e", membreID)
}
return err
}
if commandTag.RowsAffected() == 0 {
return fmt.Errorf("No rows inserted")
}
return nil
}
}
func (d DBClient) CountPresences(ctx context.Context) (presencesAmount int, err error) {
select {
case <-ctx.Done():
err = ctx.Err()
return
default:
if d.Pool == nil {
return 0, nilDBErrorf("count presences")
}
if err := d.Pool.QueryRow(ctx, `
SELECT COUNT(presences.id) FROM presences;
`).Scan(&presencesAmount); err != nil {
return 0, err
}
return
}
}