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 "errors"
6 "sort"
7)
8
9func (s *Store) feedEventRows(ctx context.Context, personID, calendarID, from, to int64) ([]EventView, error) {
10 if _, err := s.Calendar(ctx, personID, calendarID); err != nil {
11 return nil, err
12 }
13 rows, err := s.rangeRows(s.g.WithContext(ctx), personID, from, to)
14 if err != nil {
15 return nil, err
16 }
17 events := map[int64]EventView{}
18 masters := map[int64]bool{}
19 for _, r := range rows {
20 if r.CalendarID != calendarID {
21 continue
22 }
23 id := r.ID
24 if r.SeriesID != nil {
25 id = *r.SeriesID
26 }
27 if _, exists := events[id]; exists {
28 continue
29 }
30 v, err := s.Event(ctx, personID, id)
31 if errors.Is(err, ErrNotFound) {
32 continue
33 }
34 if err != nil {
35 return nil, err
36 }
37 if v.CalendarID != calendarID {
38 continue
39 }
40 events[id] = v
41 if v.RRule != "" {
42 masters[id] = true
43 }
44 }
45 ids := make([]int64, 0, len(masters))
46 for id := range masters {
47 ids = append(ids, id)
48 }
49 overrides, err := s.overridesFor(s.g.WithContext(ctx), personID, ids)
50 if err != nil {
51 return nil, err
52 }
53 for _, r := range overrides {
54 if r.CalendarID != calendarID {
55 continue
56 }
57 v, err := s.openEvent(r.Event, r.Role, r.CalendarName, r.CalendarHue)
58 if err != nil {
59 return nil, err
60 }
61 if r.DeletedAt != nil {
62 v.Status = StatusCancelled
63 }
64 events[v.ID] = v
65 }
66 out := make([]EventView, 0, len(events))
67 for _, v := range events {
68 out = append(out, v)
69 }
70 sort.Slice(out, func(i, j int) bool { return out[i].ID < out[j].ID })
71 return out, nil
72}
73