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  }