Add ICS calendars (global and organizations)
Some checks failed
Build and Push Docker Image / build_and_push (push) Failing after 1m24s
Some checks failed
Build and Push Docker Image / build_and_push (push) Failing after 1m24s
This commit is contained in:
121
handlers/api/calendars.go
Normal file
121
handlers/api/calendars.go
Normal file
@@ -0,0 +1,121 @@
|
||||
package api
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
"git.coopgo.io/coopgo-apps/parcoursmob/services"
|
||||
ics "github.com/arran4/golang-ical"
|
||||
"github.com/gorilla/mux"
|
||||
"github.com/rs/zerolog/log"
|
||||
)
|
||||
|
||||
func (h *APIHandler) icsCalendar(events []services.AgendaEvent) (*ics.Calendar, error) {
|
||||
calendar := ics.NewCalendarFor(h.config.GetString("service_name"))
|
||||
|
||||
for _, e := range events {
|
||||
vevent := ics.NewEvent(e.ID)
|
||||
vevent.SetSummary(e.Name)
|
||||
vevent.SetDescription(e.Description)
|
||||
if e.Allday {
|
||||
vevent.SetAllDayStartAt(e.Startdate)
|
||||
if e.Enddate.After(e.Startdate) {
|
||||
vevent.SetAllDayEndAt(e.Enddate.Add(24 * time.Hour))
|
||||
}
|
||||
} else {
|
||||
timeloc, err := time.LoadLocation("Europe/Paris")
|
||||
if err != nil {
|
||||
log.Error().Err(err).Msg("Tried to load timezone location Europe/Paris. Error. Missing zones in container ?")
|
||||
return nil, err
|
||||
}
|
||||
|
||||
starttime, err := time.ParseInLocation("15:04", e.Starttime, timeloc)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
startdatetime := time.Date(e.Startdate.Year(), e.Startdate.Month(), e.Startdate.Day(), starttime.Hour(), starttime.Minute(), 0, 0, timeloc)
|
||||
|
||||
endtime, err := time.Parse("15:04", e.Endtime)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
enddatetime := time.Date(e.Enddate.Year(), e.Enddate.Month(), e.Enddate.Day(), endtime.Hour(), endtime.Minute(), 0, 0, timeloc)
|
||||
|
||||
vevent.SetStartAt(startdatetime)
|
||||
vevent.SetEndAt(enddatetime)
|
||||
}
|
||||
calendar.AddVEvent(vevent)
|
||||
}
|
||||
return calendar, nil
|
||||
}
|
||||
|
||||
func (h *APIHandler) CalendarGlobal(w http.ResponseWriter, r *http.Request) {
|
||||
enabled := h.config.GetBool("modules.agenda.enabled") && h.config.GetBool("modules.agenda.calendars.global.enabled")
|
||||
if !enabled {
|
||||
log.Error().Msg("global calendar not activated in configuration")
|
||||
w.WriteHeader(http.StatusForbidden)
|
||||
return
|
||||
}
|
||||
|
||||
events, err := h.services.GetAgendaEvents()
|
||||
if err != nil {
|
||||
log.Error().Err(err).Msg("error retrieving agenda events")
|
||||
w.WriteHeader(http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
|
||||
calendar, err := h.icsCalendar(events)
|
||||
if err != nil {
|
||||
log.Error().Err(err).Msg("error while creating ics calendar")
|
||||
w.WriteHeader(http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
|
||||
w.WriteHeader(http.StatusOK)
|
||||
w.Header().Set("Content-Type", "text/calendar")
|
||||
w.Write([]byte(calendar.Serialize()))
|
||||
}
|
||||
|
||||
func (h *APIHandler) CalendarOrganizations(w http.ResponseWriter, r *http.Request) {
|
||||
enabled := h.config.GetBool("modules.agenda.enabled") && h.config.GetBool("modules.agenda.calendars.organizations.enabled")
|
||||
if !enabled {
|
||||
log.Error().Msg("organizations calendar not activated in configuration")
|
||||
w.WriteHeader(http.StatusForbidden)
|
||||
return
|
||||
}
|
||||
|
||||
// TODO set additional calendar rights in group configuration to prevent default behavior ?
|
||||
|
||||
vars := mux.Vars(r)
|
||||
groupid := vars["groupid"]
|
||||
|
||||
events, err := h.services.GetAgendaEvents()
|
||||
if err != nil {
|
||||
log.Error().Err(err).Msg("error retrieving agenda events")
|
||||
w.WriteHeader(http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
|
||||
filteredEvents := []services.AgendaEvent{}
|
||||
|
||||
for _, e := range events {
|
||||
for _, g := range e.Owners {
|
||||
log.Debug().Str("groupid", groupid).Str("g", g).Msg("check identical")
|
||||
if g == groupid {
|
||||
filteredEvents = append(filteredEvents, e)
|
||||
continue
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
calendar, err := h.icsCalendar(filteredEvents)
|
||||
if err != nil {
|
||||
log.Error().Err(err).Msg("error while creating ics calendar")
|
||||
w.WriteHeader(http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
|
||||
w.WriteHeader(http.StatusOK)
|
||||
w.Header().Set("Content-Type", "text/calendar")
|
||||
w.Write([]byte(calendar.Serialize()))
|
||||
}
|
||||
@@ -3,13 +3,12 @@ package api
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"io"
|
||||
"log"
|
||||
"net/http"
|
||||
)
|
||||
|
||||
func (h *APIHandler) GeoAutocomplete(w http.ResponseWriter, r *http.Request) {
|
||||
|
||||
pelias := h.config.GetString("geo.pelias.url")
|
||||
|
||||
t, ok := r.URL.Query()["text"]
|
||||
@@ -29,8 +28,7 @@ func (h *APIHandler) GeoAutocomplete(w http.ResponseWriter, r *http.Request) {
|
||||
|
||||
defer resp.Body.Close()
|
||||
|
||||
body, err := ioutil.ReadAll(resp.Body)
|
||||
|
||||
body, err := io.ReadAll(resp.Body)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user