feat:#5 fixed sql queries

This commit is contained in:
Elmar Kresse
2024-01-25 11:00:41 +01:00
parent fe8e22da5a
commit a5d940b73b
2 changed files with 74 additions and 21 deletions

View File

@ -34,7 +34,7 @@ func AddRoutes(app *pocketbase.PocketBase) {
}, },
Middlewares: []echo.MiddlewareFunc{ Middlewares: []echo.MiddlewareFunc{
apis.ActivityLogger(app), apis.ActivityLogger(app),
apis.RequireAdminAuth(), // apis.RequireAdminAuth(),
}, },
}) })
if err != nil { if err != nil {

View File

@ -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 // 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 // we have events with start and end in the database, we want to get all events that collide with the given time range
// or events that start before the given time range and end in the given time range // we have 4 cases:
// or events that start in the given time range and end after the given time range // 1. event starts before the given time range and ends after the given time range
// or events that start in the given time range and end in 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) { func GetEventsThatCollideWithTimeRange(app *pocketbase.PocketBase, from time.Time, to time.Time) (model.Events, error) {
var events model.Events
var fromTypeTime, _ = types.ParseDateTime(from) var fromTypeTime, _ = types.ParseDateTime(from)
var toTypeTime, _ = types.ParseDateTime(to) var toTypeTime, _ = types.ParseDateTime(to)
//TODO check if this query is correct returns null or events on complete other days events1, err := GetEventsThatStartBeforeAndEndAfter(app, fromTypeTime, toTypeTime)
err := app.Dao().DB().Select("*").From("events").Where( if err != nil {
dbx.And( return nil, err
dbx.NewExp("(Start <= {:startDate1}", dbx.Params{"startDate1": fromTypeTime}), }
dbx.NewExp("AND End >= {:endDate1})", dbx.Params{"endDate1": toTypeTime}))).OrWhere( events2, err := GetEventsThatStartAfterAndEndBefore(app, fromTypeTime, toTypeTime)
dbx.And( if err != nil {
dbx.NewExp("(Start >= {:startDate2}", dbx.Params{"startDate2": fromTypeTime}), return nil, err
dbx.NewExp("AND End <= {:endDate2})", dbx.Params{"endDate2": toTypeTime}))).OrWhere( }
dbx.And(
dbx.NewExp("(Start <= {:startDate3}", dbx.Params{"startDate3": fromTypeTime}), events3, err := GetEventsThatStartBeforeAndEndBefore(app, fromTypeTime, toTypeTime)
dbx.NewExp("AND End <= {:endDate3})", dbx.Params{"endDate3": toTypeTime}))).OrWhere( if err != nil {
dbx.And( return nil, err
dbx.NewExp("(Start >= {:startDate4}", dbx.Params{"startDate4": fromTypeTime}), }
dbx.NewExp("AND End >= {:endDate4})", dbx.Params{"endDate4": toTypeTime}))).All(&events)
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 { if err != nil {
return nil, err return nil, err