oficina / calendar Public

Clone
git clone https://amadan.net/oficina/calendar

Plain git — no account needed to clone.

Download

Download this file

1package calendar
2
3import (
4 "context"
5 "fmt"
6
7 "amadan.net/oficina/calendar/internal/calendar/seal"
8)
9
10// The read side of an event: fetching one through a grant, and opening
11// its sealed columns. Split from store_event.go so neither passes the
12// 300-line cap.
13
14// Event reads one event, scoped through a grant on its calendar.
15func (s *Store) Event(ctx context.Context, personID, eventID int64) (EventView, error) {
16 type row struct {
17 Event
18 Role string
19 CalendarName []byte
20 CalendarHue int
21 }
22 var r row
23 err := s.g.WithContext(ctx).
24 Model(&Event{}).
25 Select("events.*, grants.role as role, calendars.name_sealed as calendar_name, calendars.hue as calendar_hue").
26 Joins("JOIN calendars ON calendars.id = events.calendar_id").
27 Joins("JOIN grants ON grants.calendar_id = events.calendar_id AND grants.person_id = ?", personID).
28 Where("events.id = ? AND events.deleted_at IS NULL", eventID).
29 Limit(1).
30 Scan(&r).Error
31 if err != nil {
32 return EventView{}, fmt.Errorf("calendar: read event: %w", err)
33 }
34 if r.Event.ID == 0 {
35 return EventView{}, ErrNotFound
36 }
37 return s.openEvent(r.Event, r.Role, r.CalendarName, r.CalendarHue)
38}
39
40func (s *Store) openEvent(e Event, role string, calName []byte, hue int) (EventView, error) {
41 title, err := s.seal.OpenString(seal.PurposeEventTitle, e.TitleSealed)
42 if err != nil {
43 return EventView{}, fmt.Errorf("calendar: open title (event %d): %w", e.ID, err)
44 }
45 loc, err := s.seal.OpenString(seal.PurposeEventLocation, e.LocationSealed)
46 if err != nil {
47 return EventView{}, fmt.Errorf("calendar: open location (event %d): %w", e.ID, err)
48 }
49 notes, err := s.seal.OpenString(seal.PurposeEventNotes, e.NotesSealed)
50 if err != nil {
51 return EventView{}, fmt.Errorf("calendar: open notes (event %d): %w", e.ID, err)
52 }
53 name, err := s.seal.OpenString(seal.PurposeCalendarName, calName)
54 if err != nil {
55 return EventView{}, fmt.Errorf("calendar: open calendar name (event %d): %w", e.ID, err)
56 }
57 return EventView{
58 Event: e,
59 Title: title,
60 Location: loc,
61 Notes: notes,
62 OccStartUTC: e.StartUTC,
63 OccEndUTC: e.EndUTC,
64 CalendarName: name,
65 CalendarHue: hue,
66 Role: role,
67 }, nil
68}
69