Skip to content

Commit dd68696

Browse files
Feature/52 update initialisation to allow for dynamic loading (#53)
1 parent 51a9933 commit dd68696

File tree

12 files changed

+156
-61
lines changed

12 files changed

+156
-61
lines changed

internal/controller/controller.go

Lines changed: 59 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"reflect"
77

88
"soarca/internal/capability"
9+
"soarca/internal/capability/http"
910
"soarca/internal/capability/ssh"
1011
"soarca/internal/decomposer"
1112
"soarca/internal/executer"
@@ -16,7 +17,7 @@ import (
1617
"github.com/gin-gonic/gin"
1718

1819
mongo "soarca/database/mongodb"
19-
playbookRepo "soarca/database/playbook"
20+
playbookrepository "soarca/database/playbook"
2021
routes "soarca/routes"
2122
)
2223

@@ -28,34 +29,26 @@ func init() {
2829
log = logger.Logger(reflect.TypeOf(Empty{}).PkgPath(), logger.Info, "", logger.Json)
2930
}
3031

31-
func InitializeAppComponents() error {
32-
app := gin.New()
33-
log.Info("Testing if this works")
32+
type Controller struct {
33+
playbookRepo playbookrepository.IPlaybookRepository
34+
}
3435

35-
initDatabase := utils.GetEnv("DATABASE", "false")
36-
if initDatabase == "true" {
37-
errDatabase := InitializeDatabase(app)
38-
if errDatabase != nil {
39-
log.Error("Failed to init core")
40-
return errDatabase
41-
}
42-
}
43-
errCore := InitializeCore(app)
36+
var mainController = Controller{}
4437

45-
if errCore != nil {
46-
log.Error("Failed to init core")
47-
return errCore
48-
}
38+
func (controller *Controller) NewDecomposer() decomposer.IDecomposer {
39+
ssh := new(ssh.SshCapability)
40+
capabilities := map[string]capability.ICapability{ssh.GetType(): ssh}
4941

50-
port := utils.GetEnv("PORT", "8080")
51-
err := app.Run(":" + port)
52-
if err != nil {
53-
log.Error("failed to run gin")
54-
}
55-
return err
42+
http := new(http.HttpCapability)
43+
capabilities[http.GetType()] = http
44+
45+
executer := executer.New(capabilities)
46+
guid := new(guid.Guid)
47+
decompose := decomposer.New(executer, guid)
48+
return decompose
5649
}
5750

58-
func InitializeDatabase(app *gin.Engine) error {
51+
func (controller *Controller) setupDatabase() error {
5952
mongo.LoadComponent()
6053

6154
log.Info("SOARCA API Trying to start")
@@ -71,28 +64,59 @@ func InitializeDatabase(app *gin.Engine) error {
7164
if err != nil {
7265
return err
7366
}
74-
// defer database.GetMongoClient().CloseMongoDB()
67+
controller.playbookRepo = playbookrepository.SetupPlaybookRepository(mongo.GetCacaoRepo(), mongo.DefaultLimitOpts())
7568

76-
playbookRepo := playbookRepo.SetupPlaybookRepository(mongo.GetCacaoRepo(), mongo.DefaultLimitOpts())
69+
return nil
70+
}
7771

78-
// setup database routes
79-
err = routes.Database(app, playbookRepo)
72+
func (controller *Controller) GetDatabaseInstance() playbookrepository.IPlaybookRepository {
73+
return controller.playbookRepo
74+
}
75+
76+
func Initialize() error {
77+
app := gin.New()
78+
log.Info("Testing if info log works")
79+
log.Debug("Testing if debug log works")
80+
log.Trace("Testing if Trace log works")
81+
82+
errCore := initializeCore(app)
83+
84+
if errCore != nil {
85+
log.Error("Failed to init core")
86+
return errCore
87+
}
88+
89+
port := utils.GetEnv("PORT", "8080")
90+
err := app.Run(":" + port)
91+
if err != nil {
92+
log.Error("failed to run gin")
93+
}
94+
log.Info("exit")
8095

8196
return err
8297
}
8398

84-
func InitializeCore(app *gin.Engine) error {
85-
ssh := new(ssh.SshCapability)
86-
capabilities := map[string]capability.ICapability{ssh.GetType(): ssh}
87-
executer := executer.New(capabilities)
88-
guid := new(guid.Guid)
89-
decompose := decomposer.New(executer, guid)
99+
func initializeCore(app *gin.Engine) error {
90100

91-
err := routes.Api(app, decompose)
101+
err := routes.Api(app, &mainController)
92102
if err != nil {
93103
log.Error(err)
94104
return err
95105
}
106+
107+
initDatabase := utils.GetEnv("DATABASE", "false")
108+
if initDatabase == "true" {
109+
err = mainController.setupDatabase()
110+
if err != nil {
111+
log.Error(err)
112+
return err
113+
}
114+
err = routes.Database(app, &mainController)
115+
if err != nil {
116+
log.Error(err)
117+
return err
118+
}
119+
}
96120
routes.Logging(app)
97121
routes.Swagger(app)
98122
return err
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package database
2+
3+
import (
4+
playbookrepository "soarca/database/playbook"
5+
)
6+
7+
type IController interface {
8+
GetDatabaseInstance() playbookrepository.IPlaybookRepository
9+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package decomposer
2+
3+
import (
4+
"soarca/internal/decomposer"
5+
)
6+
7+
type IController interface {
8+
NewDecomposer() decomposer.IDecomposer
9+
}

main.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ func main() {
4242
log.Warning("Failed to read env variable, but will continue")
4343
}
4444

45-
errinit := controller.InitializeAppComponents()
45+
errinit := controller.Initialize()
4646
if errinit != nil {
4747
log.Fatal("Something Went wrong with setting-up the app, msg: ", errinit)
4848
panic(errinit)

routes/playbook/playbook_api.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,20 @@ import (
55
"net/http"
66
"strconv"
77

8-
playbookRepository "soarca/database/playbook"
8+
playbookrepository "soarca/database/playbook"
9+
"soarca/internal/controller/database"
910

1011
"github.com/gin-gonic/gin"
1112
)
1213

1314
// A PlaybookController implements the playbook API endpoints is dependent on a database.
1415
type playbookController struct {
15-
playbookRepo playbookRepository.IPlaybookRepository
16+
playbookRepo playbookrepository.IPlaybookRepository
1617
}
1718

1819
// NewPlaybookController makes a new instance of playbookControler
19-
func NewPlaybookController(playbookRepo playbookRepository.IPlaybookRepository) *playbookController {
20-
return &playbookController{playbookRepo: playbookRepo}
20+
func NewPlaybookController(controller database.IController) *playbookController {
21+
return &playbookController{playbookRepo: controller.GetDatabaseInstance()}
2122
}
2223

2324
// getAllPlaybooks GET handler for obtaining all the playbooks in the database and return this to the gin context in json format

routes/playbook/playbook_endpoints.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package playbook
22

33
import (
4-
playbookRepository "soarca/database/playbook"
4+
"soarca/internal/controller/database"
55

66
"github.com/gin-gonic/gin"
77
)
@@ -12,8 +12,8 @@ import (
1212
// GET /playbook/playbook-id
1313
// PUT /playbook/playbook-id
1414
// DELETE /playbook/playbook-id
15-
func Routes(route *gin.Engine, playbookRepo playbookRepository.IPlaybookRepository) {
16-
playbookController := NewPlaybookController(playbookRepo)
15+
func Routes(route *gin.Engine, controller database.IController) {
16+
playbookController := NewPlaybookController(controller)
1717
playbook := route.Group("/playbook")
1818
{
1919
playbook.GET("/", playbookController.getAllPlaybooks)

routes/router.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package routes
22

33
import (
4-
playbookRepository "soarca/database/playbook"
5-
"soarca/internal/decomposer"
4+
"soarca/internal/controller/database"
5+
"soarca/internal/controller/decomposer"
66
coa_routes "soarca/routes/coa"
77
operator "soarca/routes/operator"
88
playbook_routes "soarca/routes/playbook"
@@ -19,9 +19,9 @@ import (
1919
// Requires database dependency injection.
2020

2121
func Database(app *gin.Engine,
22-
playbookRepo playbookRepository.IPlaybookRepository,
22+
controller database.IController,
2323
) error {
24-
playbook_routes.Routes(app, playbookRepo)
24+
playbook_routes.Routes(app, controller)
2525
return nil
2626
}
2727

@@ -30,12 +30,12 @@ func Logging(app *gin.Engine) {
3030
}
3131

3232
func Api(app *gin.Engine,
33-
decomposer decomposer.IDecomposer,
33+
controller decomposer.IController,
3434
) error {
3535
log.Trace("Trying to setup all Routes")
3636
// gin.SetMode(gin.ReleaseMode)
3737

38-
trigger_api := trigger.New(decomposer)
38+
trigger_api := trigger.New(controller)
3939

4040
coa_routes.Routes(app)
4141

routes/trigger/trigger_api.go

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import (
55
"net/http"
66
"reflect"
77

8-
"soarca/internal/decomposer"
8+
"soarca/internal/controller/decomposer"
99
"soarca/logger"
1010
"soarca/models/decoder"
1111
"soarca/routes/error"
@@ -26,16 +26,18 @@ func init() {
2626
}
2727

2828
type TriggerApi struct {
29-
decomposer decomposer.IDecomposer
29+
controller decomposer.IController
3030
}
3131

32-
func New(decomposer decomposer.IDecomposer) *TriggerApi {
32+
func New(controller decomposer.IController) *TriggerApi {
3333
instance := TriggerApi{}
34-
instance.decomposer = decomposer
34+
instance.controller = controller
3535
return &instance
3636
}
3737

3838
func (trigger *TriggerApi) Execute(context *gin.Context) {
39+
// create new decomposer when execute is called
40+
decomposer := trigger.controller.NewDecomposer()
3941
jsonData, errIo := io.ReadAll(context.Request.Body)
4042
if errIo != nil {
4143
log.Error("failed")
@@ -52,7 +54,7 @@ func (trigger *TriggerApi) Execute(context *gin.Context) {
5254
"POST /trigger/playbook", "")
5355
return
5456
}
55-
executionDetail, errDecomposer := trigger.decomposer.Execute(*playbook)
57+
executionDetail, errDecomposer := decomposer.Execute(*playbook)
5658
if errDecomposer != nil {
5759
error.SendErrorResponse(context, http.StatusBadRequest,
5860
"Failed to decode playbook",
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package mock_database_controller
2+
3+
import (
4+
playbookrepository "soarca/database/playbook"
5+
6+
"github.com/stretchr/testify/mock"
7+
)
8+
9+
type Mock_Controller struct {
10+
mock.Mock
11+
}
12+
13+
func (mock *Mock_Controller) GetDatabaseInstance() playbookrepository.IPlaybookRepository {
14+
args := mock.Called()
15+
return args.Get(0).(playbookrepository.IPlaybookRepository)
16+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package mock_decomposer_controller
2+
3+
import (
4+
"soarca/internal/decomposer"
5+
6+
"github.com/stretchr/testify/mock"
7+
)
8+
9+
type Mock_Controller struct {
10+
mock.Mock
11+
}
12+
13+
func (mock *Mock_Controller) NewDecomposer() decomposer.IDecomposer {
14+
args := mock.Called()
15+
return args.Get(0).(decomposer.IDecomposer)
16+
}

0 commit comments

Comments
 (0)