-
Notifications
You must be signed in to change notification settings - Fork 7
/
interactor.go
98 lines (89 loc) · 3.07 KB
/
interactor.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
package main
import (
"strings"
"github.com/slack-go/slack"
)
// DeployUsecase, or alternatively, interactor as well call it in our cocdebase, is an interface that defines the usecases of deploy.
// It is used by slackbot to interact with users.
//
// We have several deploy usecases or interactor implementations, such as Lambda, Kustomize, Combine, and Job.
// See respective interactor_*.go files for more details.
//
// Note that this is different from DeployModel a.k.a model.
// Although both are responsible for managing deployments, DeployUsecase is generally more about how to manage deployment workflows
// including how to request and approve deployments, whereas DeployModel is more about how to actually deploy.
//
// Some DeployUsecase implementations, such as InteractorCombine, InteractorJob, and InteractorLambda,
// do actual deployments by calling DeployModel.
// However an implementation, such as InteractorKustomize, does prepare for deployments by calling DeployModel,
// but does not actually deploy.
type DeployUsecase interface {
Request(DeployProject, string, string, string, string) (blocks []slack.Block, err error)
BranchList(DeployProject, string) (blocks []slack.Block, err error)
BranchListFromRaw(string) (blocks []slack.Block, err error)
Approve(string, string, string) (blocks []slack.Block, err error)
Reject(string, string) (blocks []slack.Block, err error)
SelectBranch(string, string, string, string) (blocks []slack.Block, err error)
}
type InteractorFactory struct {
kanvas InteractorGitOps
kustomize InteractorGitOps
jenkins InteractorJenkins
job InteractorJob
lambda InteractorLambda
combine InteractorCombine
}
func NewInteractorFactory(c InteractorContext) InteractorFactory {
return InteractorFactory{
kanvas: NewInteractorKanavs(c),
kustomize: NewInteractorKustomize(c),
jenkins: NewInteractorJenkins(c),
job: NewInteractorJob(c),
lambda: NewInteractorLambda(c),
combine: NewInteractorCombine(c),
}
}
func (i InteractorFactory) Get(pj DeployProject, phase string) DeployUsecase {
if p := pj.FindPhase(phase); p.Kind != "" {
return i.get(p.Kind)
}
return i.get(pj.Kind)
}
func (i InteractorFactory) get(kind string) DeployUsecase {
switch kind {
case "kanvas":
return i.kanvas
case "kustomize":
return i.kustomize
case "job":
return i.job
case "lambda":
return i.lambda
case "combine":
return i.combine
default:
return i.jenkins
}
}
func (i InteractorFactory) GetByParams(params string) DeployUsecase {
switch {
case strings.Contains(params, "kanvas"):
return i.kanvas
case strings.Contains(params, "kustomize"):
return i.kustomize
case strings.Contains(params, "job"):
return i.job
case strings.Contains(params, "lambda"):
return i.lambda
case strings.Contains(params, "combine"):
return i.combine
default:
return i.jenkins
}
}
func CloseButton() *slack.ActionBlock {
closeBtnTxt := slack.NewTextBlockObject("plain_text", "Close", false, false)
closeBtn := slack.NewButtonBlockElement("", "close", closeBtnTxt)
section := slack.NewActionBlock("", closeBtn)
return section
}