Skip to content
This repository was archived by the owner on May 30, 2024. It is now read-only.

Commit 43e816a

Browse files
author
Noah Lee
authored
Add new APIs to interact with deployment statuses (#330)
* Add new APIs to openapi * Add APIs to interact with deployment status
1 parent 2bbdcad commit 43e816a

File tree

11 files changed

+480
-0
lines changed

11 files changed

+480
-0
lines changed

internal/interactor/interface.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ type (
5656
CreateDeployment(ctx context.Context, d *ent.Deployment) (*ent.Deployment, error)
5757
UpdateDeployment(ctx context.Context, d *ent.Deployment) (*ent.Deployment, error)
5858

59+
ListDeploymentStatuses(ctx context.Context, d *ent.Deployment) ([]*ent.DeploymentStatus, error)
5960
CreateDeploymentStatus(ctx context.Context, s *ent.DeploymentStatus) (*ent.DeploymentStatus, error)
6061
SyncDeploymentStatus(ctx context.Context, ds *ent.DeploymentStatus) (*ent.DeploymentStatus, error)
6162

@@ -101,6 +102,8 @@ type (
101102
CancelDeployment(ctx context.Context, u *ent.User, r *ent.Repo, d *ent.Deployment, s *ent.DeploymentStatus) error
102103
GetConfig(ctx context.Context, u *ent.User, r *ent.Repo) (*extent.Config, error)
103104

105+
CreateRemoteDeploymentStatus(ctx context.Context, u *ent.User, r *ent.Repo, d *ent.Deployment, ds *extent.RemoteDeploymentStatus) (*extent.RemoteDeploymentStatus, error)
106+
104107
CreateWebhook(ctx context.Context, u *ent.User, r *ent.Repo, c *extent.WebhookConfig) (int64, error)
105108
DeleteWebhook(ctx context.Context, u *ent.User, r *ent.Repo, id int64) error
106109

internal/interactor/mock/pkg.go

Lines changed: 30 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package github
2+
3+
import (
4+
"context"
5+
6+
"github.com/gitploy-io/gitploy/model/ent"
7+
"github.com/gitploy-io/gitploy/model/extent"
8+
"github.com/gitploy-io/gitploy/pkg/e"
9+
"github.com/google/go-github/v32/github"
10+
)
11+
12+
func (g *Github) CreateRemoteDeploymentStatus(ctx context.Context, u *ent.User, r *ent.Repo, d *ent.Deployment, ds *extent.RemoteDeploymentStatus) (*extent.RemoteDeploymentStatus, error) {
13+
gds, _, err := g.Client(ctx, u.Token).
14+
Repositories.
15+
CreateDeploymentStatus(ctx, r.Namespace, r.Name, d.UID, &github.DeploymentStatusRequest{
16+
State: github.String(ds.Status),
17+
Description: github.String(ds.Description),
18+
LogURL: github.String(ds.LogURL),
19+
})
20+
if err != nil {
21+
return nil, e.NewError(e.ErrorCodeEntityUnprocessable, err)
22+
}
23+
24+
return mapGithubDeploymentStatusToRemoteDeploymentStatus(gds), nil
25+
}
26+
27+
func mapGithubDeploymentStatusToRemoteDeploymentStatus(gds *github.DeploymentStatus) *extent.RemoteDeploymentStatus {
28+
return &extent.RemoteDeploymentStatus{
29+
ID: *gds.ID,
30+
Status: *gds.State,
31+
Description: *gds.Description,
32+
LogURL: *gds.LogURL,
33+
}
34+
}

internal/pkg/store/deploymentstatus.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,22 @@ import (
55
"fmt"
66

77
"github.com/gitploy-io/gitploy/model/ent"
8+
"github.com/gitploy-io/gitploy/model/ent/deploymentstatus"
89
"github.com/gitploy-io/gitploy/pkg/e"
910
)
1011

12+
func (s *Store) ListDeploymentStatuses(ctx context.Context, d *ent.Deployment) ([]*ent.DeploymentStatus, error) {
13+
dss, err := s.c.DeploymentStatus.
14+
Query().
15+
Where(deploymentstatus.DeploymentIDEQ(d.ID)).
16+
All(ctx)
17+
if err != nil {
18+
return nil, e.NewErrorWithMessage(e.ErrorCodeInternalError, "Failed to list deployment statuses.", err)
19+
}
20+
21+
return dss, nil
22+
}
23+
1124
func (s *Store) CreateDeploymentStatus(ctx context.Context, ds *ent.DeploymentStatus) (*ent.DeploymentStatus, error) {
1225
ret, err := s.c.DeploymentStatus.
1326
Create().
Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
package repos
2+
3+
import (
4+
"net/http"
5+
"strconv"
6+
7+
"github.com/gin-gonic/gin"
8+
"github.com/gin-gonic/gin/binding"
9+
"go.uber.org/zap"
10+
11+
gb "github.com/gitploy-io/gitploy/internal/server/global"
12+
"github.com/gitploy-io/gitploy/model/ent"
13+
"github.com/gitploy-io/gitploy/model/extent"
14+
"github.com/gitploy-io/gitploy/pkg/e"
15+
)
16+
17+
type (
18+
DeploymentStatusPostPayload struct {
19+
Status string `json:"status"`
20+
Description string `json:"description"`
21+
LogURL string `json:"log_url"`
22+
}
23+
)
24+
25+
func (r *Repo) ListDeploymentStatuses(c *gin.Context) {
26+
ctx := c.Request.Context()
27+
28+
var (
29+
number int
30+
err error
31+
)
32+
33+
if number, err = strconv.Atoi(c.Param("number")); err != nil {
34+
r.log.Warn("Invalid parameter: number is not integer.", zap.String("number", c.Param("number")))
35+
gb.ResponseWithError(c, e.NewError(e.ErrorCodeParameterInvalid, err))
36+
return
37+
}
38+
39+
vr, _ := c.Get(KeyRepo)
40+
re := vr.(*ent.Repo)
41+
42+
d, err := r.i.FindDeploymentOfRepoByNumber(ctx, re, number)
43+
if err != nil {
44+
r.log.Check(gb.GetZapLogLevel(err), "Failed to get the deployments.").Write(zap.Error(err))
45+
gb.ResponseWithError(c, err)
46+
return
47+
}
48+
49+
dss, err := r.i.ListDeploymentStatuses(ctx, d)
50+
if err != nil {
51+
r.log.Check(gb.GetZapLogLevel(err), "Failed to list the deployment statuses.").Write(zap.Error(err))
52+
gb.ResponseWithError(c, err)
53+
return
54+
}
55+
56+
r.log.Debug("Success to list deployment statuses.")
57+
gb.Response(c, http.StatusOK, dss)
58+
}
59+
60+
func (r *Repo) CreateRemoteDeploymentStatus(c *gin.Context) {
61+
ctx := c.Request.Context()
62+
63+
var (
64+
number int
65+
err error
66+
)
67+
68+
if number, err = strconv.Atoi(c.Param("number")); err != nil {
69+
r.log.Warn("Invalid parameter: number is not integer.", zap.String("number", c.Param("number")))
70+
gb.ResponseWithError(c, e.NewError(e.ErrorCodeParameterInvalid, err))
71+
return
72+
}
73+
74+
// Bind the request body.
75+
p := &DeploymentStatusPostPayload{}
76+
if err := c.ShouldBindBodyWith(p, binding.JSON); err != nil {
77+
r.log.Error("Failed to bind the body.", zap.Error(err))
78+
gb.ResponseWithError(c, e.NewError(e.ErrorCodeParameterInvalid, err))
79+
return
80+
}
81+
82+
vu, _ := c.Get(gb.KeyUser)
83+
u := vu.(*ent.User)
84+
85+
vr, _ := c.Get(KeyRepo)
86+
re := vr.(*ent.Repo)
87+
88+
d, err := r.i.FindDeploymentOfRepoByNumber(ctx, re, number)
89+
if err != nil {
90+
r.log.Check(gb.GetZapLogLevel(err), "Failed to get the deployments.").Write(zap.Error(err))
91+
gb.ResponseWithError(c, err)
92+
return
93+
}
94+
rds := &extent.RemoteDeploymentStatus{
95+
Status: p.Status,
96+
Description: p.Description,
97+
LogURL: p.LogURL,
98+
}
99+
if rds, err = r.i.CreateRemoteDeploymentStatus(ctx, u, re, d, rds); err != nil {
100+
r.log.Check(gb.GetZapLogLevel(err), "Failed to create a new deployment status.").Write(zap.Error(err))
101+
gb.ResponseWithError(c, err)
102+
return
103+
}
104+
105+
r.log.Debug("Success to create a remote deployment status.")
106+
gb.Response(c, http.StatusCreated, rds)
107+
}

internal/server/api/v1/repos/interface.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ type (
3232
DeployToRemote(ctx context.Context, u *ent.User, r *ent.Repo, d *ent.Deployment, env *extent.Env) (*ent.Deployment, error)
3333
GetConfig(ctx context.Context, u *ent.User, r *ent.Repo) (*extent.Config, error)
3434

35+
ListDeploymentStatuses(ctx context.Context, d *ent.Deployment) ([]*ent.DeploymentStatus, error)
36+
CreateRemoteDeploymentStatus(ctx context.Context, u *ent.User, r *ent.Repo, d *ent.Deployment, ds *extent.RemoteDeploymentStatus) (*extent.RemoteDeploymentStatus, error)
37+
3538
ListReviews(ctx context.Context, d *ent.Deployment) ([]*ent.Review, error)
3639
FindReviewOfUser(ctx context.Context, u *ent.User, d *ent.Deployment) (*ent.Review, error)
3740
UpdateReview(ctx context.Context, rv *ent.Review) (*ent.Review, error)

internal/server/api/v1/repos/mock/interactor.go

Lines changed: 30 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/server/router.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,8 @@ func NewRouter(c *RouterConfig) *gin.Engine {
149149
repov1.GET("/:namespace/:name/deployments/:number/reviews", rm.RepoReadPerm(), r.ListReviews)
150150
repov1.GET("/:namespace/:name/deployments/:number/review", rm.RepoReadPerm(), r.GetUserReview)
151151
repov1.PATCH("/:namespace/:name/deployments/:number/review", rm.RepoReadPerm(), r.UpdateUserReview)
152+
repov1.GET("/:namespace/:name/deployments/:number/statuses", rm.RepoReadPerm(), r.ListDeploymentStatuses)
153+
repov1.POST("/:namespace/:name/deployments/:number/remote-statuses", rm.RepoReadPerm(), r.CreateRemoteDeploymentStatus)
152154
repov1.GET("/:namespace/:name/locks", rm.RepoReadPerm(), r.ListLocks)
153155
repov1.POST("/:namespace/:name/locks", rm.RepoWritePerm(), r.CreateLock)
154156
repov1.PATCH("/:namespace/:name/locks/:lockID", rm.RepoWritePerm(), r.UpdateLock)

0 commit comments

Comments
 (0)