2025-02-17 10:18:50 +01:00
package controllers
import (
"encoding/json"
oclib "cloud.o-forge.io/core/oc-lib"
"cloud.o-forge.io/core/oc-lib/dbs"
"cloud.o-forge.io/core/oc-lib/models/workflow_execution"
"cloud.o-forge.io/core/oc-lib/tools"
beego "github.com/beego/beego/v2/server/web"
"github.com/google/uuid"
)
var orderCollection = oclib . LibDataEnum ( oclib . ORDER )
2025-04-30 17:55:46 +02:00
var logger = oclib . GetLogger ( )
2025-02-17 10:18:50 +01:00
// Operations about workflow
type WorkflowSchedulerController struct {
beego . Controller
}
// @Title Schedule
// @Description schedule workflow
// @Param id path string true "id execution"
// @Param body body models.compute true "The compute content"
// @Success 200 {workspace} models.workspace
// @router /:id [post]
func ( o * WorkflowSchedulerController ) Schedule ( ) {
code := 200
e := ""
user , peerID , groups := oclib . ExtractTokenInfo ( * o . Ctx . Request )
id := o . Ctx . Input . Param ( ":id" )
var resp * workflow_execution . WorkflowSchedule
json . Unmarshal ( o . Ctx . Input . CopyBody ( 100000 ) , & resp )
caller := tools . NewHTTPCaller ( map [ tools . DataType ] map [ tools . METHOD ] string { // paths to call other OC services
tools . PEER : {
tools . POST : "/status/" ,
} ,
tools . BOOKING : {
tools . GET : "/booking/check/:id/:start_date/:end_date" ,
tools . POST : "/booking/" ,
} ,
} )
req := oclib . NewRequest ( collection , user , peerID , groups , caller )
resp . UUID = uuid . New ( ) . String ( )
sch , err := req . Schedule ( id , resp )
if err != nil {
2025-02-18 15:01:10 +01:00
if sch != nil {
for _ , w := range sch . WorkflowExecution {
req . DeleteOne ( w . GetID ( ) )
}
2025-02-17 10:18:50 +01:00
}
o . Data [ "json" ] = map [ string ] interface { } {
"data" : nil ,
"code" : 409 ,
"error" : err . Error ( ) ,
}
o . ServeJSON ( )
return
}
2025-04-30 17:55:46 +02:00
2025-02-17 10:18:50 +01:00
o . Data [ "json" ] = map [ string ] interface { } {
2025-02-18 15:01:10 +01:00
"data" : sch . WorkflowExecution ,
2025-02-17 10:18:50 +01:00
"code" : code ,
"error" : e ,
}
2025-04-30 17:55:46 +02:00
logger . Info ( ) . Msg ( "Succesfully scheduled " + sch . WorkflowExecution [ 0 ] . WorkflowID + " at " + sch . WorkflowExecution [ 0 ] . ExecDate . GoString ( ) + " with ID : " + sch . WorkflowExecution [ 0 ] . UUID )
2025-02-17 10:18:50 +01:00
o . ServeJSON ( )
}
// @Title UnSchedule
// @Description schedule workflow
// @Param id path string true "id execution"
// @Param body body models.compute true "The compute content"
// @Success 200 {workspace} models.workspace
// @router /:id [delete]
func ( o * WorkflowSchedulerController ) UnSchedule ( ) {
user , peerID , groups := oclib . ExtractTokenInfo ( * o . Ctx . Request )
id := o . Ctx . Input . Param ( ":id" )
// TODO UNSCHEDULER
filter := & dbs . Filters {
And : map [ string ] [ ] dbs . Filter {
"workflow_id" : { { Operator : dbs . EQUAL . String ( ) , Value : id } } ,
} ,
}
o . Data [ "json" ] = oclib . NewRequest ( collection , user , peerID , groups , nil ) . Search ( filter , "" , true )
o . ServeJSON ( )
}
// @Title SearchScheduledDraftOrder
// @Description schedule workflow
// @Param id path string true "id execution"
// @Success 200 {workspace} models.workspace
// @router /:id/order [get]
func ( o * WorkflowSchedulerController ) SearchScheduledDraftOrder ( ) {
user , peerID , groups := oclib . ExtractTokenInfo ( * o . Ctx . Request )
id := o . Ctx . Input . Param ( ":id" )
filter := & dbs . Filters {
And : map [ string ] [ ] dbs . Filter {
"workflow_id" : { { Operator : dbs . EQUAL . String ( ) , Value : id } } ,
"order_by" : { { Operator : dbs . EQUAL . String ( ) , Value : peerID } } ,
} ,
}
o . Data [ "json" ] = oclib . NewRequest ( orderCollection , user , peerID , groups , nil ) . Search ( filter , "" , true )
o . ServeJSON ( )
}