package entries import ( "context" "database/sql" "errors" "fmt" "git.leonardobishop.net/stash/pkg/database/sqlc" ) type Service interface { CreateEntry(title, kind, url, description string) (*sqlc.Entry, error) UpdateEntryKind(id int64, kind string) (*sqlc.Entry, error) DeleteEntry(id int64) error GetEntries() ([]EntryRow, error) GetEntriesByKind(kind string) ([]EntryRow, error) GetEntryURLs() ([]string, error) GetEntryByUrl(url string) (*sqlc.GetEntryByUrlRow, error) } var ( ErrEntryNotFound = errors.New("entry not found") ) type service struct { db *sql.DB } func NewService(db *sql.DB) Service { return &service{ db: db, } } func (s *service) CreateEntry(title, kind, url, description string) (*sqlc.Entry, error) { queries := sqlc.New(s.db) entry, err := queries.CreateEntryWithKindName(context.Background(), sqlc.CreateEntryWithKindNameParams{ Title: title, Url: url, Description: description, Name: kind, }) if err != nil { return nil, fmt.Errorf("could not create entry: %w", err) } return &entry, nil } func (s *service) UpdateEntryKind(id int64, kind string) (*sqlc.Entry, error) { queries := sqlc.New(s.db) entry, err := queries.UpdateEntryKind(context.Background(), sqlc.UpdateEntryKindParams{ ID: id, Name: kind, }) if err != nil { if errors.Is(err, sql.ErrNoRows) { return nil, ErrEntryNotFound } return nil, fmt.Errorf("could not update entry: %w", err) } return &entry, nil } func (s *service) DeleteEntry(id int64) error { queries := sqlc.New(s.db) _, err := queries.DeleteEntry(context.Background(), id) return err } func (s *service) GetEntries() ([]EntryRow, error) { queries := sqlc.New(s.db) response, err := queries.GetEntries(context.Background()) entries := make([]EntryRow, len(response)) if err != nil { return entries, fmt.Errorf("could not get entries: %w", err) } for i := range response { entries[i].ScanGetEntriesRow(response[i]) } return entries, nil } func (s *service) GetEntriesByKind(kind string) ([]EntryRow, error) { queries := sqlc.New(s.db) response, err := queries.GetEntriesByKind(context.Background(), kind) entries := make([]EntryRow, len(response)) if err != nil { return entries, fmt.Errorf("could not get entries: %w", err) } for i := range response { entries[i].ScanGetEntriesByKindRow(response[i]) } return entries, nil } func (s *service) GetEntryURLs() ([]string, error) { queries := sqlc.New(s.db) entries, err := queries.GetEntryURLs(context.Background()) if err != nil { return make([]string, 0), fmt.Errorf("could not get entries: %w", err) } return entries, nil } func (s *service) GetEntryByUrl(url string) (*sqlc.GetEntryByUrlRow, error) { queries := sqlc.New(s.db) entry, err := queries.GetEntryByUrl(context.Background(), url) if err != nil { if errors.Is(err, sql.ErrNoRows) { return nil, ErrEntryNotFound } return nil, fmt.Errorf("could not get entry: %w", err) } return &entry, nil }