diff options
| author | Leonardo Bishop <me@leonardobishop.com> | 2025-01-20 02:56:25 +0000 |
|---|---|---|
| committer | Leonardo Bishop <me@leonardobishop.com> | 2025-01-20 02:56:25 +0000 |
| commit | dc55f9c0097e1c36b85d7666071b840b902920e9 (patch) | |
| tree | c8c8ae10a9e134810b3361aabc8a9d426d813808 /pkg/calendar/service.go | |
| parent | 5e7ce6cbae81a1b6e46fe6738dc10039a06bec95 (diff) | |
Add calendar support
Diffstat (limited to 'pkg/calendar/service.go')
| -rw-r--r-- | pkg/calendar/service.go | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/pkg/calendar/service.go b/pkg/calendar/service.go new file mode 100644 index 0000000..19b2d9d --- /dev/null +++ b/pkg/calendar/service.go @@ -0,0 +1,112 @@ +package calendar + +import ( + "context" + "crypto/rand" + "errors" + "fmt" + "math/big" + + "github.com/LMBishop/confplanner/pkg/database/sqlc" + "github.com/jackc/pgx/v5" + "github.com/jackc/pgx/v5/pgxpool" +) + +type Service interface { + GetCalendarForUser(id int32) (*sqlc.Calendar, error) + GetCalendarByName(name string) (*sqlc.Calendar, error) + CreateCalendarForUser(id int32) (*sqlc.Calendar, error) + DeleteCalendarForUser(id int32) error +} + +var ( + ErrCalendarNotFound = errors.New("calendar not found") +) + +type service struct { + pool *pgxpool.Pool +} + +func NewService(pool *pgxpool.Pool) Service { + return &service{ + pool: pool, + } +} + +func (s *service) GetCalendarForUser(id int32) (*sqlc.Calendar, error) { + queries := sqlc.New(s.pool) + + calendar, err := queries.GetCalendarForUser(context.Background(), id) + if err != nil { + if errors.Is(err, pgx.ErrNoRows) { + return nil, ErrCalendarNotFound + } + return nil, err + } + + return &calendar, nil +} + +func (s *service) GetCalendarByName(name string) (*sqlc.Calendar, error) { + queries := sqlc.New(s.pool) + + calendar, err := queries.GetCalendarByName(context.Background(), name) + if err != nil { + if errors.Is(err, pgx.ErrNoRows) { + return nil, ErrCalendarNotFound + } + return nil, err + } + + return &calendar, nil +} + +func (s *service) CreateCalendarForUser(id int32) (*sqlc.Calendar, error) { + queries := sqlc.New(s.pool) + + name, err := randomString(16) + if err != nil { + return nil, fmt.Errorf("could not generate random string: %w", err) + } + + key, err := randomString(32) + if err != nil { + return nil, fmt.Errorf("could not generate random string: %w", err) + } + + calendar, err := queries.CreateCalendar(context.Background(), sqlc.CreateCalendarParams{ + UserID: id, + Name: name, + Key: key, + }) + if err != nil { + return nil, fmt.Errorf("could not create calendar: %w", err) + } + + return &calendar, nil +} + +func (s *service) DeleteCalendarForUser(id int32) error { + queries := sqlc.New(s.pool) + + _, err := queries.DeleteCalendar(context.Background(), id) + if err != nil { + return fmt.Errorf("could not delete calendar: %w", err) + } + + return nil +} + +func randomString(n int) (string, error) { + const letters = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" + ret := make([]byte, n) + for i := 0; i < n; i++ { + num, err := rand.Int(rand.Reader, big.NewInt(int64(len(letters)))) + if err != nil { + return "", err + } + ret[i] = letters[num.Int64()] + } + + return string(ret), nil +} |
