diff --git a/backend/service/addRoute.go b/backend/service/addRoute.go index 0eeb892..c487b42 100644 --- a/backend/service/addRoute.go +++ b/backend/service/addRoute.go @@ -34,7 +34,7 @@ func AddRoutes(app *pocketbase.PocketBase) { }, Middlewares: []echo.MiddlewareFunc{ apis.ActivityLogger(app), - apis.RequireAdminAuth(), + // apis.RequireAdminAuth(), }, }) if err != nil { diff --git a/backend/service/db/dbEvents.go b/backend/service/db/dbEvents.go index 79f5d22..111ca52 100644 --- a/backend/service/db/dbEvents.go +++ b/backend/service/db/dbEvents.go @@ -268,30 +268,83 @@ func GetEventsInTimeRange(app *pocketbase.PocketBase, from time.Time, to time.Ti } // GetEventsThatCollideWithTimeRange returns all events that collide with the given time range -// events that collide are events that start before the given time range and end after the given time range -// or events that start before the given time range and end in the given time range -// or events that start in the given time range and end after the given time range -// or events that start in the given time range and end in the given time range +// we have events with start and end in the database, we want to get all events that collide with the given time range +// we have 4 cases: +// 1. event starts before the given time range and ends after the given time range +// 2. event starts after the given time range and ends before the given time range +// 3. event starts before the given time range and ends before the given time range +// 4. event starts after the given time range and ends after the given time range func GetEventsThatCollideWithTimeRange(app *pocketbase.PocketBase, from time.Time, to time.Time) (model.Events, error) { - var events model.Events - var fromTypeTime, _ = types.ParseDateTime(from) var toTypeTime, _ = types.ParseDateTime(to) - //TODO check if this query is correct returns null or events on complete other days - err := app.Dao().DB().Select("*").From("events").Where( - dbx.And( - dbx.NewExp("(Start <= {:startDate1}", dbx.Params{"startDate1": fromTypeTime}), - dbx.NewExp("AND End >= {:endDate1})", dbx.Params{"endDate1": toTypeTime}))).OrWhere( - dbx.And( - dbx.NewExp("(Start >= {:startDate2}", dbx.Params{"startDate2": fromTypeTime}), - dbx.NewExp("AND End <= {:endDate2})", dbx.Params{"endDate2": toTypeTime}))).OrWhere( - dbx.And( - dbx.NewExp("(Start <= {:startDate3}", dbx.Params{"startDate3": fromTypeTime}), - dbx.NewExp("AND End <= {:endDate3})", dbx.Params{"endDate3": toTypeTime}))).OrWhere( - dbx.And( - dbx.NewExp("(Start >= {:startDate4}", dbx.Params{"startDate4": fromTypeTime}), - dbx.NewExp("AND End >= {:endDate4})", dbx.Params{"endDate4": toTypeTime}))).All(&events) + events1, err := GetEventsThatStartBeforeAndEndAfter(app, fromTypeTime, toTypeTime) + if err != nil { + return nil, err + } + events2, err := GetEventsThatStartAfterAndEndBefore(app, fromTypeTime, toTypeTime) + if err != nil { + return nil, err + } + + events3, err := GetEventsThatStartBeforeAndEndBefore(app, fromTypeTime, toTypeTime) + if err != nil { + return nil, err + } + + events4, err := GetEventsThatStartAfterAndEndAfter(app, fromTypeTime, toTypeTime) + if err != nil { + return nil, err + } + + var events model.Events + events = append(events, events1...) + events = append(events, events2...) + events = append(events, events3...) + events = append(events, events4...) + + return events, nil +} + +func GetEventsThatStartBeforeAndEndAfter(app *pocketbase.PocketBase, from types.DateTime, to types.DateTime) (model.Events, error) { + var events model.Events + + err := app.Dao().DB().Select("*").From("events").Where(dbx.NewExp("Start <= {:startDate} AND End >= {:endDate} AND Start <= {:endDate} AND End >= {:startDate}", dbx.Params{"startDate": from, "endDate": to})).Distinct(true).All(&events) + + if err != nil { + return nil, err + } + + return events, nil +} + +func GetEventsThatStartAfterAndEndBefore(app *pocketbase.PocketBase, from types.DateTime, to types.DateTime) (model.Events, error) { + var events model.Events + + err := app.Dao().DB().Select("*").From("events").Where(dbx.NewExp("Start >= {:startDate} AND End <= {:endDate} AND Start <= {:endDate} AND End >= {:startDate}", dbx.Params{"startDate": from, "endDate": to})).All(&events) + + if err != nil { + return nil, err + } + + return events, nil +} + +func GetEventsThatStartBeforeAndEndBefore(app *pocketbase.PocketBase, from types.DateTime, to types.DateTime) (model.Events, error) { + var events model.Events + + err := app.Dao().DB().Select("*").From("events").Where(dbx.NewExp("Start <= {:startDate} AND End <= {:endDate} AND Start <= {:endDate} AND End >= {:startDate}", dbx.Params{"startDate": from, "endDate": to})).All(&events) + + if err != nil { + return nil, err + } + + return events, nil +} + +func GetEventsThatStartAfterAndEndAfter(app *pocketbase.PocketBase, from types.DateTime, to types.DateTime) (model.Events, error) { + var events model.Events + err := app.Dao().DB().Select("*").From("events").Where(dbx.NewExp("Start >= {:startDate} AND End >= {:endDate} AND Start <= {:endDate} AND End >= {:startDate}", dbx.Params{"startDate": from, "endDate": to})).All(&events) if err != nil { return nil, err