From a5d940b73b7e4a0a5cc4c19853bd95be52b6350e Mon Sep 17 00:00:00 2001 From: Elmar Kresse Date: Thu, 25 Jan 2024 11:00:41 +0100 Subject: [PATCH 1/2] feat:#5 fixed sql queries --- backend/service/addRoute.go | 2 +- backend/service/db/dbEvents.go | 93 ++++++++++++++++++++++++++-------- 2 files changed, 74 insertions(+), 21 deletions(-) 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 From 00b8acd58b12f8f26d2b5a640650a554e6678f82 Mon Sep 17 00:00:00 2001 From: Elmar Kresse Date: Thu, 25 Jan 2024 11:01:34 +0100 Subject: [PATCH 2/2] feat:#5 removed unused function --- backend/service/db/dbEvents.go | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/backend/service/db/dbEvents.go b/backend/service/db/dbEvents.go index 111ca52..2bdb2b7 100644 --- a/backend/service/db/dbEvents.go +++ b/backend/service/db/dbEvents.go @@ -256,17 +256,6 @@ func GetAllModulesByNameAndDateRange(app *pocketbase.PocketBase, name string, st return events, nil } -func GetEventsInTimeRange(app *pocketbase.PocketBase, from time.Time, to time.Time) (model.Events, error) { - var events model.Events - - err := app.Dao().DB().Select("*").From("events").Where(dbx.NewExp("Start >= {:startDate} AND End <= {:endDate}", dbx.Params{"startDate": from, "endDate": to})).All(&events) - if err != nil { - return nil, err - } - - return events, nil -} - // GetEventsThatCollideWithTimeRange returns all events that collide with 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: