aboutsummaryrefslogtreecommitdiffstats
path: root/internal/store/store.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/store/store.go')
-rw-r--r--internal/store/store.go34
1 files changed, 34 insertions, 0 deletions
diff --git a/internal/store/store.go b/internal/store/store.go
new file mode 100644
index 0000000..472bb2a
--- /dev/null
+++ b/internal/store/store.go
@@ -0,0 +1,34 @@
+// Package store holds the data models and all SQL queries.
+package store
+
+import (
+ "errors"
+
+ "github.com/jackc/pgx/v5"
+ "github.com/jackc/pgx/v5/pgconn"
+ "github.com/jackc/pgx/v5/pgxpool"
+)
+
+var ErrNotFound = errors.New("not found")
+var ErrConflict = errors.New("already exists")
+
+type Store struct {
+ db *pgxpool.Pool
+}
+
+func New(db *pgxpool.Pool) *Store { return &Store{db: db} }
+
+// wrap maps driver errors onto the store's sentinel errors.
+func wrap(err error) error {
+ if err == nil {
+ return nil
+ }
+ if errors.Is(err, pgx.ErrNoRows) {
+ return ErrNotFound
+ }
+ var pgErr *pgconn.PgError
+ if errors.As(err, &pgErr) && pgErr.Code == "23505" { // unique_violation
+ return ErrConflict
+ }
+ return err
+}