diff options
| author | Peter Stone <thepeterstone@gmail.com> | 2026-07-16 06:24:06 +0000 |
|---|---|---|
| committer | Peter Stone <thepeterstone@gmail.com> | 2026-07-16 06:24:06 +0000 |
| commit | ec45580c839cb94135c6c11c4aecaea255c8f2b7 (patch) | |
| tree | 3d38b13aa82aab26482d4904b40c9c53990371d8 /internal/store/availability.go | |
| parent | c21f891954f98d6df3769d5063f9528240b5b20a (diff) | |
Add availability_blocks CRUD to the store layer
Diffstat (limited to 'internal/store/availability.go')
| -rw-r--r-- | internal/store/availability.go | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/internal/store/availability.go b/internal/store/availability.go new file mode 100644 index 0000000..0adf664 --- /dev/null +++ b/internal/store/availability.go @@ -0,0 +1,49 @@ +package store + +import ( + "task-dashboard/internal/models" +) + +// CreateAvailabilityBlock inserts a new weekly availability block and returns it. +func (s *Store) CreateAvailabilityBlock(weekday int, startTime, endTime, label string) (*models.AvailabilityBlock, error) { + id := newTaskID() + if _, err := s.db.Exec(` + INSERT INTO availability_blocks (id, weekday, start_time, end_time, label) VALUES (?, ?, ?, ?, ?) + `, id, weekday, startTime, endTime, label); err != nil { + return nil, err + } + return &models.AvailabilityBlock{ID: id, Weekday: weekday, StartTime: startTime, EndTime: endTime, Label: label}, nil +} + +// GetAvailabilityBlocks returns every availability block, ordered by weekday +// then start time. +func (s *Store) GetAvailabilityBlocks() ([]models.AvailabilityBlock, error) { + rows, err := s.db.Query(` + SELECT id, weekday, start_time, end_time, label FROM availability_blocks ORDER BY weekday ASC, start_time ASC + `) + if err != nil { + return nil, err + } + defer func() { _ = rows.Close() }() + + var blocks []models.AvailabilityBlock + for rows.Next() { + var b models.AvailabilityBlock + if err := rows.Scan(&b.ID, &b.Weekday, &b.StartTime, &b.EndTime, &b.Label); err != nil { + return nil, err + } + blocks = append(blocks, b) + } + return blocks, rows.Err() +} + +// DeleteAvailabilityBlock removes an availability block. Returns +// ErrNativeTaskNotFound if id doesn't match any row (reusing the sentinel +// already shared across native-task/project not-found cases). +func (s *Store) DeleteAvailabilityBlock(id string) error { + result, err := s.db.Exec(`DELETE FROM availability_blocks WHERE id = ?`, id) + if err != nil { + return err + } + return checkRowsAffected(result) +} |
