diff --git a/models/workflow/workflow.go b/models/workflow/workflow.go index 1e0a86b..ecb6798 100644 --- a/models/workflow/workflow.go +++ b/models/workflow/workflow.go @@ -3,10 +3,13 @@ package oclib import ( "encoding/json" "slices" + "time" + "cloud.o-forge.io/core/oc-lib/dbs" "cloud.o-forge.io/core/oc-lib/models/resources" "cloud.o-forge.io/core/oc-lib/models/resources/workflow/graph" "cloud.o-forge.io/core/oc-lib/models/utils" + "go.mongodb.org/mongo-driver/bson/primitive" ) type AbstractWorkflow struct { @@ -31,6 +34,21 @@ func (d *Workflow) GetName() string { return d.Name } +func (d *Workflow) CheckBooking() bool { + if d.Schedule != nil && d.Schedule.Start != nil { + sd := primitive.NewDateTimeFromTime(d.Schedule.Start.Add(time.Second * -10)) + ed := primitive.NewDateTimeFromTime(d.Schedule.Start.Add(time.Second * 10)) + f := dbs.Filters{ + And: map[string][]dbs.Filter{ + "execution_date": {{Operator: "gte", Value: sd}, {Operator: "lte", Value: ed}}, + }, + } + res, _, _ := d.GetAccessor().Search(&f, "") + return len(res) == 0 + } + return true +} + func (d *Workflow) GetAccessor() utils.Accessor { data := New() data.SetLogger(utils.WORKFLOW) diff --git a/models/workflow/workflow_mongo_accessor.go b/models/workflow/workflow_mongo_accessor.go index 5d35d91..7bda6e0 100644 --- a/models/workflow/workflow_mongo_accessor.go +++ b/models/workflow/workflow_mongo_accessor.go @@ -87,7 +87,7 @@ func (wfa *workflowMongoAccessor) execution(id string, realData *Workflow, delet if r.Schedule.Start == realData.Schedule.Start && r.Schedule.End == realData.Schedule.End && r.Schedule.Cron == realData.Schedule.Cron { return 200, nil } - if !realData.CheckBooking(realData.Schedule.Start) { + if !realData.CheckBooking() { return 409, errors.New("the booking is already taken.") } if delete {