66 "reflect"
77 "time"
88
9+ "soarca/internal/controller/database"
910 "soarca/internal/controller/decomposer_controller"
1011 "soarca/internal/decomposer"
1112 "soarca/logger"
@@ -29,19 +30,76 @@ func init() {
2930
3031type TriggerApi struct {
3132 controller decomposer_controller.IController
33+ database database.IController
3234 Executionsch chan decomposer.ExecutionDetails
3335}
3436
35- func New (controller decomposer_controller.IController ) * TriggerApi {
37+ func New (controller decomposer_controller.IController , database database. IController ) * TriggerApi {
3638 instance := TriggerApi {}
3739 instance .controller = controller
40+ instance .database = database
3841 // Channel to get back execution details
3942 instance .Executionsch = make (chan decomposer.ExecutionDetails )
4043 return & instance
4144}
4245
43- func (trigger * TriggerApi ) Execute (context * gin.Context ) {
46+ // trigger
47+ //
48+ // @Summary trigger a playbook by id that is stored in SOARCA
49+ // @Schemes
50+ // @Description trigger playbook by id
51+ // @Tags trigger
52+ // @Accept json
53+ // @Produce json
54+ // @Param id path string true "playbook ID"
55+ // @Success 200 {object} api.Execution
56+ // @failure 400 {object} api.Error
57+ // @Router /trigger/playbook/{id} [POST]
58+ func (trigger * TriggerApi ) ExecuteById (context * gin.Context ) {
59+
60+ id := context .Param ("id" )
61+
62+ db := trigger .database .GetDatabaseInstance ()
63+ playbook , err := db .Read (id )
64+ if err != nil {
65+ log .Error ("failed to load playbook" )
66+ error .SendErrorResponse (context , http .StatusBadRequest ,
67+ "Failed to load playbook" ,
68+ "POST /trigger/playbook/" + id , err .Error ())
69+ return
70+ }
71+
4472 // create new decomposer when execute is called
73+ decomposer := trigger .controller .NewDecomposer ()
74+ executionDetail , errDecomposer := decomposer .Execute (playbook )
75+ if errDecomposer != nil {
76+ error .SendErrorResponse (context , http .StatusBadRequest ,
77+ "Failed to decode playbook" ,
78+ "POST /trigger/playbook/" + id ,
79+ executionDetail .ExecutionId .String ())
80+ } else {
81+ msg := gin.H {
82+ "execution_id" : executionDetail .ExecutionId .String (),
83+ "payload" : executionDetail .PlaybookId ,
84+ }
85+ context .JSON (http .StatusOK , msg )
86+ }
87+
88+ }
89+
90+ // trigger
91+ //
92+ // @Summary trigger a playbook by supplying a cacao playbook payload
93+ // @Schemes
94+ // @Description trigger playbook
95+ // @Tags trigger
96+ // @Accept json
97+ // @Produce json
98+ // @Param playbook body cacao.Playbook true "execute playbook by payload"
99+ // @Success 200 {object} api.Execution
100+ // @failure 400 {object} api.Error
101+ // @Router /trigger/playbook [POST]
102+ func (trigger * TriggerApi ) Execute (context * gin.Context ) {
45103 decomposer := trigger .controller .NewDecomposer ()
46104 jsonData , errIo := io .ReadAll (context .Request .Body )
47105 if errIo != nil {
0 commit comments