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

Commit 984136a

Browse files
author
Noah Lee
authored
Refactoring the users API (#356)
* Fix the naming * Split 'user.go' into files
1 parent adc523a commit 984136a

File tree

9 files changed

+244
-192
lines changed

9 files changed

+244
-192
lines changed
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package users
2+
3+
import (
4+
"net/http"
5+
"strconv"
6+
7+
"github.com/gin-gonic/gin"
8+
"go.uber.org/zap"
9+
10+
gb "github.com/gitploy-io/gitploy/internal/server/global"
11+
"github.com/gitploy-io/gitploy/pkg/e"
12+
)
13+
14+
func (u *UserAPI) Delete(c *gin.Context) {
15+
ctx := c.Request.Context()
16+
17+
var (
18+
id int64
19+
err error
20+
)
21+
22+
if id, err = strconv.ParseInt(c.Param("id"), 10, 64); err != nil {
23+
u.log.Warn("The id must be number.", zap.Error(err))
24+
gb.ResponseWithError(
25+
c,
26+
e.NewErrorWithMessage(e.ErrorCodeParameterInvalid, "The id must be number.", err),
27+
)
28+
return
29+
}
30+
31+
du, err := u.i.FindUserByID(ctx, id)
32+
if err != nil {
33+
u.log.Check(gb.GetZapLogLevel(err), "Failed to find the user.").Write(zap.Error(err))
34+
gb.ResponseWithError(c, err)
35+
return
36+
}
37+
38+
if err := u.i.DeleteUser(ctx, du); err != nil {
39+
u.log.Check(gb.GetZapLogLevel(err), "Failed to delete the user.").Write(zap.Error(err))
40+
gb.ResponseWithError(c, err)
41+
return
42+
}
43+
44+
c.Status(http.StatusOK)
45+
}

internal/server/api/v1/users/get.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package users
2+
3+
import (
4+
"net/http"
5+
6+
"github.com/gin-gonic/gin"
7+
"go.uber.org/zap"
8+
9+
gb "github.com/gitploy-io/gitploy/internal/server/global"
10+
"github.com/gitploy-io/gitploy/model/ent"
11+
)
12+
13+
func (u *UserAPI) GetMe(c *gin.Context) {
14+
ctx := c.Request.Context()
15+
16+
v, _ := c.Get(gb.KeyUser)
17+
uv, _ := v.(*ent.User)
18+
19+
uv, err := u.i.FindUserByID(ctx, uv.ID)
20+
if err != nil {
21+
u.log.Check(gb.GetZapLogLevel(err), "Failed to find the user.").Write(zap.Error(err))
22+
gb.ResponseWithError(c, err)
23+
return
24+
}
25+
26+
gb.Response(c, http.StatusOK, uv)
27+
}

internal/server/api/v1/users/list.go

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package users
2+
3+
import (
4+
"net/http"
5+
"strconv"
6+
7+
"github.com/gin-gonic/gin"
8+
"go.uber.org/zap"
9+
10+
i "github.com/gitploy-io/gitploy/internal/interactor"
11+
gb "github.com/gitploy-io/gitploy/internal/server/global"
12+
"github.com/gitploy-io/gitploy/pkg/e"
13+
)
14+
15+
func (u *UserAPI) List(c *gin.Context) {
16+
ctx := c.Request.Context()
17+
18+
var (
19+
q = c.DefaultQuery("q", "")
20+
p int
21+
pp int
22+
err error
23+
)
24+
25+
if p, err = strconv.Atoi(c.DefaultQuery("page", "1")); err != nil {
26+
gb.ResponseWithError(
27+
c,
28+
e.NewErrorWithMessage(e.ErrorCodeParameterInvalid, "The page must be number.", err),
29+
)
30+
}
31+
32+
if pp, err = strconv.Atoi(c.DefaultQuery("per_page", "30")); err != nil {
33+
gb.ResponseWithError(
34+
c,
35+
e.NewErrorWithMessage(e.ErrorCodeParameterInvalid, "The per_page must be number.", err),
36+
)
37+
}
38+
39+
us, err := u.i.SearchUsers(ctx, &i.SearchUsersOptions{
40+
Query: q,
41+
ListOptions: i.ListOptions{Page: p, PerPage: pp},
42+
})
43+
if err != nil {
44+
u.log.Check(gb.GetZapLogLevel(err), "Failed to list users.").Write(zap.Error(err))
45+
gb.ResponseWithError(c, err)
46+
return
47+
}
48+
49+
gb.Response(c, http.StatusOK, us)
50+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package users
2+
3+
import (
4+
"net/http"
5+
6+
"github.com/gin-gonic/gin"
7+
"go.uber.org/zap"
8+
9+
gb "github.com/gitploy-io/gitploy/internal/server/global"
10+
"github.com/gitploy-io/gitploy/model/ent"
11+
"github.com/gitploy-io/gitploy/model/extent"
12+
)
13+
14+
func (u *UserAPI) GetRateLimit(c *gin.Context) {
15+
ctx := c.Request.Context()
16+
17+
v, _ := c.Get(gb.KeyUser)
18+
uv, _ := v.(*ent.User)
19+
20+
var (
21+
rl *extent.RateLimit
22+
err error
23+
)
24+
25+
if rl, err = u.i.GetRateLimit(ctx, uv); err != nil {
26+
u.log.Check(gb.GetZapLogLevel(err), "Failed to get the rate-limit.").Write(zap.Error(err))
27+
gb.ResponseWithError(c, err)
28+
return
29+
}
30+
31+
gb.Response(c, http.StatusOK, rl)
32+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package users
2+
3+
import (
4+
"go.uber.org/zap"
5+
)
6+
7+
type (
8+
UserAPI struct {
9+
i Interactor
10+
log *zap.Logger
11+
}
12+
)
13+
14+
func NewUserAPI(i Interactor) *UserAPI {
15+
return &UserAPI{
16+
i: i,
17+
log: zap.L().Named("users"),
18+
}
19+
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package users
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/pkg/e"
13+
)
14+
15+
type (
16+
userPatchPayload struct {
17+
Admin *bool `json:"admin"`
18+
}
19+
)
20+
21+
func (u *UserAPI) Update(c *gin.Context) {
22+
ctx := c.Request.Context()
23+
24+
var (
25+
id int64
26+
err error
27+
)
28+
29+
if id, err = strconv.ParseInt(c.Param("id"), 10, 64); err != nil {
30+
u.log.Warn("The id must be number.", zap.Error(err))
31+
gb.ResponseWithError(
32+
c,
33+
e.NewErrorWithMessage(e.ErrorCodeParameterInvalid, "The id must be number.", err),
34+
)
35+
return
36+
}
37+
38+
p := &userPatchPayload{}
39+
if err := c.ShouldBindBodyWith(p, binding.JSON); err != nil {
40+
u.log.Warn("It has failed to binding the payload.", zap.Error(err))
41+
gb.ResponseWithError(
42+
c,
43+
e.NewErrorWithMessage(e.ErrorCodeParameterInvalid, "It has failed to binding the payload.", err),
44+
)
45+
return
46+
}
47+
48+
du, err := u.i.FindUserByID(ctx, id)
49+
if err != nil {
50+
u.log.Check(gb.GetZapLogLevel(err), "Failed to find the user.").Write(zap.Error(err))
51+
gb.ResponseWithError(c, err)
52+
return
53+
}
54+
55+
if p.Admin != nil {
56+
du.Admin = *p.Admin
57+
if du, err = u.i.UpdateUser(ctx, du); err != nil {
58+
u.log.Check(gb.GetZapLogLevel(err), "Failed to update the user.").Write(zap.Error(err))
59+
gb.ResponseWithError(c, err)
60+
return
61+
}
62+
}
63+
64+
gb.Response(c, http.StatusOK, du)
65+
}

internal/server/api/v1/users/user_test.go renamed to internal/server/api/v1/users/update_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ func TestUser_UpdateUser(t *testing.T) {
5454

5555
gin.SetMode(gin.ReleaseMode)
5656
r := gin.New()
57-
r.PATCH("/users/:id", NewUser(m).UpdateUser)
57+
r.PATCH("/users/:id", NewUserAPI(m).Update)
5858

5959
p, _ := json.Marshal(input.Payload)
6060
req, _ := http.NewRequest("PATCH", fmt.Sprintf("/users/%d", input.ID), bytes.NewBuffer(p))

0 commit comments

Comments
 (0)