@@ -3,24 +3,30 @@ package usecase
33import (
44 "context"
55 "fmt"
6-
6+ "github.com/threatwinds/go-sdk/catcher"
77 "github.com/utmstack/utmstack/backend/modules/integrations/connectors"
88 "github.com/utmstack/utmstack/backend/modules/integrations/domain"
99 "github.com/utmstack/utmstack/backend/modules/integrations/dto"
10+
11+ os_connectors "github.com/utmstack/utmstack/backend/modules/opensearch/connectors"
12+ os_dto "github.com/utmstack/utmstack/backend/modules/opensearch/dto"
1013)
1114
1215type moduleUsecase struct {
1316 repo connectors.ModuleRepository
1417 tenantFileTog connectors.TenantFileToggler
18+ opensearch os_connectors.IndexPatternUsecase
1519}
1620
1721func NewModuleUsecase (
1822 repo connectors.ModuleRepository ,
1923 tenantFile connectors.TenantFileToggler ,
24+ opensearch os_connectors.IndexPatternUsecase ,
2025) connectors.ModuleUsecase {
2126 return & moduleUsecase {
2227 repo : repo ,
2328 tenantFileTog : tenantFile ,
29+ opensearch : opensearch ,
2430 }
2531}
2632
@@ -51,6 +57,32 @@ func (u *moduleUsecase) ActivateDeactivate(ctx context.Context, req dto.ModuleAc
5157 return nil , err
5258 }
5359
60+ results ,count ,err := u .opensearch .List (ctx ,os_dto.IndexPatternFilters {
61+ ModuleEquals : & module .ModuleName ,
62+ })
63+ if err != nil {
64+ return nil ,err
65+ }
66+ if count > 0 && len (results )> 0 {
67+ //if module has index patterns
68+ pattern := results [0 ]
69+
70+ if _ ,err := u .opensearch .Update (ctx ,os_dto.UpdateIndexPatternRequest {
71+ ID : pattern .ID ,
72+ Pattern : pattern .Pattern ,
73+ PatternModule : pattern .PatternModule ,
74+ IsActive : & fresh .ModuleActive ,
75+ PatternSystem :pattern .PatternSystem ,
76+ });err != nil {
77+ catcher .Error ("failed to toggle is active for module's index pattern, rolling back" , err , map [string ]any {"module" :module .ModuleName ,"pattern" :pattern } )
78+ module .ModuleActive = ! active
79+ if err_ := u .repo .Save (ctx , module ); err_ != nil {
80+ catcher .Error ("failed to change module status after index pattern activation toggle" , err , map [string ]any {"module" :module .ModuleName ,"pattern" :pattern } )
81+ return nil , err
82+ }
83+ return nil ,err
84+ }
85+ }
5486 resp := dto .FromModule (* fresh )
5587 return & resp , nil
5688}
@@ -128,9 +160,22 @@ func (u *moduleUsecase) Create(ctx context.Context, req dto.CreateModuleRequest)
128160 ModuleActive : false ,
129161 IsSystem : false ,
130162 }
163+
164+
131165 if err := u .repo .Save (ctx , m ); err != nil {
132166 return nil , err
133167 }
168+
169+ if _ ,err := u .opensearch .Create (ctx ,os_dto.CreateIndexPatternRequest {
170+ PatternModule : & req .ModuleName ,
171+ });err != nil {
172+ //opensearch insertion fails, rolling back database
173+ if err := u .repo .Delete (ctx ,m .ID );err != nil {
174+ catcher .Error ("failed to remove module after index pattern creation fail" , err , map [string ]any {"module" :m .ModuleName } )
175+ }
176+ return nil , err
177+ }
178+
134179 resp := dto .FromModule (* m )
135180 return & resp , nil
136181}
@@ -163,5 +208,30 @@ func (u *moduleUsecase) Delete(ctx context.Context, id int64) error {
163208 if m .IsSystem {
164209 return domain .ErrSystemModule
165210 }
166- return u .repo .Delete (ctx , id )
211+
212+ results ,count ,err := u .opensearch .List (ctx ,os_dto.IndexPatternFilters {
213+ ModuleEquals : & m .ModuleName ,
214+ })
215+ if err != nil {
216+ return err
217+ }
218+ if count == 0 || len (results )== 0 {
219+ return fmt .Errorf ("module %s index pattern not found." ,m .ModuleName )
220+ }
221+
222+ err = u .repo .Delete (ctx , id )
223+ if err != nil {
224+ return err
225+ }
226+
227+ pattern := results [0 ]
228+ if err := u .opensearch .Delete (ctx ,pattern .ID );err != nil {
229+ //if index patter deletion fails integration must be restored
230+ if err := u .repo .Save (ctx ,m );err != nil {
231+ catcher .Error ("failed to restore module after index pattern remove fail" , err , map [string ]any {"module" :m .ModuleName } )
232+ }
233+ return err
234+ }
235+
236+ return nil
167237}
0 commit comments