diff options
| author | Leonardo Bishop <me@leonardobishop.com> | 2025-01-17 13:21:24 +0000 |
|---|---|---|
| committer | Leonardo Bishop <me@leonardobishop.com> | 2025-01-17 13:21:24 +0000 |
| commit | c00b690bd6f600554a1404e692bd9e4373325d27 (patch) | |
| tree | 4488b625e1c24af52fced6f60ac1b3ddff1383bc /pkg/favourites/service.go | |
Initial commit
Diffstat (limited to 'pkg/favourites/service.go')
| -rw-r--r-- | pkg/favourites/service.go | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/pkg/favourites/service.go b/pkg/favourites/service.go new file mode 100644 index 0000000..cba249e --- /dev/null +++ b/pkg/favourites/service.go @@ -0,0 +1,96 @@ +package favourites + +import ( + "context" + "errors" + "fmt" + + "github.com/LMBishop/confplanner/pkg/database/sqlc" + "github.com/jackc/pgx/v5" + "github.com/jackc/pgx/v5/pgtype" + "github.com/jackc/pgx/v5/pgxpool" +) + +type Service interface { + GetFavouritesForUser(id int32) (*[]sqlc.Favourite, error) + CreateFavouriteForUser(id int32, eventGuid pgtype.UUID, eventId *int32) (*sqlc.Favourite, error) + DeleteFavouriteForUserByEventDetails(id int32, eventGuid pgtype.UUID, eventId *int32) error +} + +var ( + ErrImproperType = errors.New("improper type") + ErrNotFound = errors.New("not found") +) + +type service struct { + pool *pgxpool.Pool +} + +func NewService(pool *pgxpool.Pool) Service { + return &service{ + pool: pool, + } +} + +func (s *service) CreateFavouriteForUser(id int32, eventGuid pgtype.UUID, eventId *int32) (*sqlc.Favourite, error) { + queries := sqlc.New(s.pool) + + var pgEventId pgtype.Int4 + if eventId != nil { + pgEventId = pgtype.Int4{ + Int32: *eventId, + Valid: true, + } + } + + favourite, err := queries.CreateFavourite(context.Background(), sqlc.CreateFavouriteParams{ + UserID: id, + EventGuid: eventGuid, + EventID: pgEventId, + }) + if err != nil { + return nil, fmt.Errorf("could not create favourite: %w", err) + } + + return &favourite, nil +} + +func (s *service) GetFavouritesForUser(id int32) (*[]sqlc.Favourite, error) { + queries := sqlc.New(s.pool) + + favourites, err := queries.GetFavouritesForUser(context.Background(), id) + if err != nil { + if errors.Is(err, pgx.ErrNoRows) { + empty := make([]sqlc.Favourite, 0) + return &empty, nil + } + return nil, fmt.Errorf("could not fetch user: %w", err) + } + + return &favourites, nil +} + +func (s *service) DeleteFavouriteForUserByEventDetails(id int32, eventGuid pgtype.UUID, eventId *int32) error { + queries := sqlc.New(s.pool) + + var pgEventId pgtype.Int4 + if eventId != nil { + pgEventId = pgtype.Int4{ + Int32: *eventId, + Valid: true, + } + } + rowsAffected, err := queries.DeleteFavouriteByEventDetails(context.Background(), sqlc.DeleteFavouriteByEventDetailsParams{ + EventGuid: eventGuid, + EventID: pgEventId, + UserID: id, + }) + if err != nil { + return fmt.Errorf("could not delete favourite: %w", err) + } + if rowsAffected == 0 { + return ErrNotFound + } + + return nil +} |
