-
Notifications
You must be signed in to change notification settings - Fork 0
/
user.go
84 lines (65 loc) · 1.93 KB
/
user.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
package v1
import (
"context"
"errors"
"fmt"
"net/http"
"strconv"
"github.com/gin-gonic/gin"
"github.com/yizeng/gab/gin/auth-jwt/internal/api/handler/v1/response"
"github.com/yizeng/gab/gin/auth-jwt/internal/domain"
"github.com/yizeng/gab/gin/auth-jwt/internal/pkg/jwthelper"
"github.com/yizeng/gab/gin/auth-jwt/internal/service"
)
type UserService interface {
GetUser(ctx context.Context, id uint) (domain.User, error)
}
type UserHandler struct {
svc UserService
}
func NewUserHandler(svc UserService) *UserHandler {
return &UserHandler{
svc: svc,
}
}
// HandleGetUser godoc
// @Summary Get a user
// @Tags users
// @Produce json
// @Param userID path int true "user ID"
// @Success 200 {object} domain.User
// @Failure 401 {object} response.Err
// @Failure 500 {object} response.Err
// @Router /users/{userID} [get]
func (h *UserHandler) HandleGetUser(ctx *gin.Context) {
rawUserID := ctx.Param("userID")
userID, err := strconv.Atoi(rawUserID)
if err != nil {
response.RenderErr(ctx, response.ErrInvalidInput("userID", rawUserID))
return
}
if userID <= 0 {
response.RenderErr(ctx, response.ErrNotFound("user", "ID", userID))
return
}
claims, err := jwthelper.RetrieveClaimsFromContext(ctx)
if err != nil {
response.RenderErr(ctx, response.ErrInternalServerError(err))
return
}
if uint(userID) != claims.UserID {
response.RenderErr(ctx, response.ErrPermissionDenied(fmt.Errorf("can't view user %v by user %v", userID, claims.UserID)))
return
}
user, err := h.svc.GetUser(ctx.Request.Context(), uint(userID))
if err != nil {
if errors.Is(err, service.ErrUserNotFound) {
response.RenderErr(ctx, response.ErrNotFound("user", "ID", userID))
return
}
err = fmt.Errorf("v1.HandleGetUser -> h.svc.GetUser -> %w", err)
response.RenderErr(ctx, response.ErrInternalServerError(err))
return
}
ctx.JSON(http.StatusOK, user)
}