summaryrefslogtreecommitdiff
path: root/internal/store/availability.go
diff options
context:
space:
mode:
authorPeter Stone <thepeterstone@gmail.com>2026-07-16 06:24:06 +0000
committerPeter Stone <thepeterstone@gmail.com>2026-07-16 06:24:06 +0000
commitec45580c839cb94135c6c11c4aecaea255c8f2b7 (patch)
tree3d38b13aa82aab26482d4904b40c9c53990371d8 /internal/store/availability.go
parentc21f891954f98d6df3769d5063f9528240b5b20a (diff)
Add availability_blocks CRUD to the store layer
Diffstat (limited to 'internal/store/availability.go')
-rw-r--r--internal/store/availability.go49
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)
+}