github.com/henvic/wedeploycli@v1.7.6-0.20200319005353-3630f582f284/activities/activities.go (about) 1 package activities 2 3 import ( 4 "context" 5 "fmt" 6 "net/url" 7 "os" 8 "sort" 9 10 "github.com/henvic/wedeploycli/apihelper" 11 "github.com/henvic/wedeploycli/config" 12 "github.com/henvic/wedeploycli/projects" 13 "github.com/henvic/wedeploycli/templates" 14 ) 15 16 // Client for the services 17 type Client struct { 18 *apihelper.Client 19 } 20 21 // New Client 22 func New(wectx config.Context) *Client { 23 return &Client{ 24 apihelper.New(wectx), 25 } 26 } 27 28 // Activity record 29 type Activity struct { 30 ID string `json:"id"` 31 CreatedAt int64 `json:"createdAt"` 32 Commit string `json:"commit"` 33 ProjectID string `json:"projectId"` 34 ProjectUID string `json:"projectUid"` 35 Type string `json:"type"` 36 Metadata map[string]interface{} `json:"metadata"` 37 } 38 39 // Filter for list 40 type Filter struct { 41 Commit string `json:"commit,omitempty"` 42 GroupUID string `json:"groupUid,omitempty"` 43 Limit int `json:"limit,omitempty"` 44 Type string `json:"type,omitempty"` 45 } 46 47 const ( 48 // BuildFailed state 49 BuildFailed = "BUILD_FAILED" 50 51 // BuildStarted state 52 BuildStarted = "BUILD_STARTED" 53 54 // BuildPushed state 55 BuildPushed = "BUILD_PUSHED" 56 57 // BuildSucceeded state 58 BuildSucceeded = "BUILD_SUCCEEDED" 59 60 // CollaboratorDeleted state 61 CollaboratorDeleted = "COLLABORATOR_DELETED" 62 63 // CollaboratorInvitationAccepted state 64 CollaboratorInvitationAccepted = "COLLABORATOR_INVITATION_ACCEPTED" 65 66 // CollaboratorInvitationDeleted state 67 CollaboratorInvitationDeleted = "COLLABORATOR_INVITATION_DELETED" 68 69 // CollaboratorInvitationSent state 70 CollaboratorInvitationSent = "COLLABORATOR_INVITATION_SENT" 71 72 // CollaboratorLeft state 73 CollaboratorLeft = "COLLABORATOR_LEFT" 74 75 // CustomDomainUpdated state 76 CustomDomainUpdated = "CUSTOM_DOMAIN_UPDATED" 77 78 // DeployFailed state 79 DeployFailed = "DEPLOY_FAILED" 80 81 // DeployCanceled state 82 DeployCanceled = "DEPLOY_CANCELED" 83 84 // DeployTimeout state 85 DeployTimeout = "DEPLOY_TIMEOUT" 86 87 // DeployRollback state 88 DeployRollback = "DEPLOY_ROLLBACK" 89 90 // DeployPending state 91 DeployPending = "DEPLOY_PENDING" 92 93 // DeployCreated state 94 DeployCreated = "DEPLOY_CREATED" 95 96 // DeployStarted state 97 DeployStarted = "DEPLOY_STARTED" 98 99 // DeploySucceeded state 100 DeploySucceeded = "DEPLOY_SUCCEEDED" 101 102 // GithubProviderConnected state 103 GithubProviderConnected = "GITHUB_PROVIDER_CONNECTED" 104 105 // GithubProviderDisconnected state 106 GithubProviderDisconnected = "GITHUB_PROVIDER_DISCONNECTED" 107 108 // GithubRepositoryConnected state 109 GithubRepositoryConnected = "GITHUB_REPOSITORY_CONNECTED" 110 111 // GithubRepositoryDisconnected state 112 GithubRepositoryDisconnected = "GITHUB_REPOSITORY_DISCONNECTED" 113 114 // HomeServiceUpdated state 115 HomeServiceUpdated = "HOME_SERVICE_UPDATED" 116 117 // ProjectCreated state 118 ProjectCreated = "PROJECT_CREATED" 119 120 // ProjectRestarted state 121 ProjectRestarted = "PROJECT_RESTARTED" 122 123 // ProjectTransferred state 124 ProjectTransferred = "PROJECT_TRANSFERRED" 125 126 // ServiceCreated state 127 ServiceCreated = "SERVICE_CREATED" 128 129 // ServiceDeleted state 130 ServiceDeleted = "SERVICE_DELETED" 131 132 // ServiceEnvironmentVariablesUpdated state 133 ServiceEnvironmentVariablesUpdated = "SERVICE_ENVIRONMENT_VARIABLES_UPDATED" 134 135 // ServiceRestarted state 136 ServiceRestarted = "SERVICE_RESTARTED" 137 ) 138 139 // Friendly activities names 140 var Friendly = map[string]string{ 141 BuildFailed: "Build failed", 142 BuildStarted: "Build started", 143 BuildPushed: "Build pushed", 144 BuildSucceeded: "Build succeeded", 145 DeployFailed: "Deployment failed", 146 DeployCanceled: "Deployment canceled", 147 DeployTimeout: "Deployment timed out", 148 DeployRollback: "Deployment rollback", 149 DeployCreated: "Deployment created", 150 DeployPending: "Deployment pending", 151 DeploySucceeded: "Deployment succeeded", 152 DeployStarted: "Deployment started", 153 } 154 155 var activityTemplates = map[string]string{ 156 BuildFailed: "{{.Metadata.serviceId}} build failed on project {{.ProjectID}}", 157 BuildStarted: "{{.Metadata.serviceId}} build started on project {{.ProjectID}}", 158 BuildPushed: "{{.Metadata.serviceId}} build pushed on project {{.ProjectID}}", 159 BuildSucceeded: "{{.Metadata.serviceId}} build succeeded on project {{.ProjectID}}", 160 CollaboratorDeleted: "{{.ProjectID}} project collaborator deleted", 161 CollaboratorInvitationAccepted: "{{.ProjectID}} project collaborator invitation accepted", 162 CollaboratorInvitationDeleted: "{{.ProjectID}} project collaborator invitation deleted", 163 CollaboratorInvitationSent: "{{.ProjectID}} project collaborator invitation sent", 164 CollaboratorLeft: "{{.ProjectID}} project collaborator left", 165 CustomDomainUpdated: "{{.Metadata.serviceId}} custom domain updated on project {{.ProjectID}}", 166 DeployFailed: "{{.Metadata.serviceId}} deployment failed on project {{.ProjectID}}", 167 DeployCanceled: "{{.Metadata.serviceId}} deployment canceled on project {{.ProjectID}}", 168 DeployTimeout: "{{.Metadata.serviceId}} deployment timed out on project {{.ProjectID}}", 169 DeployRollback: "{{.Metadata.serviceId}} deployment rollback on project {{.ProjectID}}", 170 DeployPending: "{{.Metadata.serviceId}} deployment pending on project {{.ProjectID}}", 171 DeployCreated: "{{.Metadata.serviceId}} deployment created on project {{.ProjectID}}", 172 DeployStarted: "{{.Metadata.serviceId}} deployment started on project {{.ProjectID}}", 173 DeploySucceeded: "{{.Metadata.serviceId}} deployment succeeded on project {{.ProjectID}}", 174 GithubProviderConnected: "GitHub provider connected", 175 GithubProviderDisconnected: "GitHub provider disconnected", 176 GithubRepositoryConnected: "GitHub repository connected", 177 GithubRepositoryDisconnected: "GitHub repository disconnected", 178 ProjectCreated: "{{.ProjectID}} project created", 179 ProjectRestarted: "{{.ProjectID}} project restarted", 180 ProjectTransferred: "{{.ProjectID}} project transferred", 181 ServiceCreated: "{{.Metadata.serviceId}} service created on project {{.ProjectID}}", 182 ServiceDeleted: "{{.Metadata.serviceId}} service deleted on project {{.ProjectID}}", 183 ServiceEnvironmentVariablesUpdated: "{{.Metadata.serviceId}} service environment variables updated on project {{.ProjectID}}", 184 ServiceRestarted: "{{.Metadata.serviceId}} service restarted on project {{.ProjectID}}", 185 } 186 187 // List activities of a given project, in order. 188 func (c *Client) List(ctx context.Context, projectID string, f Filter) (activities []Activity, err error) { 189 if projectID == "" { 190 return activities, projects.ErrEmptyProjectID 191 } 192 193 var request = c.Client.URL(ctx, "/projects/"+url.PathEscape(projectID)+"/activities") 194 apihelper.ParamsFromJSON(request, f) 195 196 c.Client.Auth(request) 197 198 if err = apihelper.Validate(request, request.Get()); err != nil { 199 return nil, err 200 } 201 202 err = apihelper.DecodeJSON(request, &activities) 203 204 sort.SliceStable(activities, func(i, j int) bool { 205 return activities[i].CreatedAt < activities[j].CreatedAt 206 }) 207 208 return activities, err 209 } 210 211 // PrettyPrintList prints the activities in a formatted way 212 func PrettyPrintList(activities []Activity) { 213 for _, a := range activities { 214 var msg, err = getActivityMessage(a, activityTemplates) 215 216 if err != nil { 217 _, _ = fmt.Fprintf(os.Stderr, "%+v\n", err) 218 continue 219 } 220 221 fmt.Printf("%v\n", msg) 222 } 223 } 224 225 func getActivityMessage(a Activity, template map[string]string) (string, error) { 226 at, ok := template[a.Type] 227 228 if !ok { 229 return a.Type, nil 230 } 231 232 return templates.Execute(at, a) 233 }