From c00b690bd6f600554a1404e692bd9e4373325d27 Mon Sep 17 00:00:00 2001 From: Leonardo Bishop Date: Fri, 17 Jan 2025 13:21:24 +0000 Subject: Initial commit --- pkg/favourites/service.go | 96 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 pkg/favourites/service.go (limited to 'pkg/favourites/service.go') 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 +} -- cgit v1.2.3-70-g09d2