Skip to content

Commit 47233a4

Browse files
feat: implement auth/me and userProfile Update API
1 parent 48abe19 commit 47233a4

File tree

5 files changed

+107
-1
lines changed

5 files changed

+107
-1
lines changed

backend/cms-sys/cmd/main.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ func main() {
6868
appLogger.WithError(err).Fatal("Failed to migrate database")
6969
return
7070
}
71+
7172
//if err := utils.InitJWTKeysFromVault(); err != nil {
7273
// log.Fatalf("Vault key init failed: %v", err)
7374
//}
@@ -82,7 +83,7 @@ func main() {
8283
healthChecker := utils.NewHealthChecker(dbConnection.DB, appLogger)
8384

8485
app := fiber.New(fiber.Config{
85-
AppName: "CMS Multi-Tenant System",
86+
AppName: "CMS Multi-Tenant System ",
8687
ErrorHandler: func(c *fiber.Ctx, err error) error {
8788
code := fiber.StatusInternalServerError
8889
var e *fiber.Error

backend/cms-sys/internal/handler/auth_handler.go

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package handler
33
import (
44
"github.com/go-playground/validator/v10"
55
"github.com/gofiber/fiber/v2"
6+
"github.com/google/uuid"
67

78
"github.com/multi-tenants-cms-golang/cms-sys/internal/service"
89
"github.com/multi-tenants-cms-golang/cms-sys/internal/types"
@@ -14,6 +15,8 @@ type AuthHandle interface {
1415
Register(c *fiber.Ctx) error
1516
Logout(c *fiber.Ctx) error
1617
Refresh(c *fiber.Ctx) error
18+
GetMe(c *fiber.Ctx) error
19+
UpdateUserProfile(c *fiber.Ctx) error
1720
}
1821

1922
type Handler struct {
@@ -90,3 +93,47 @@ func (h *Handler) Refresh(c *fiber.Ctx) error {
9093

9194
return utils.SuccessResponse(c, "Token refreshed successfully", tokenResponse)
9295
}
96+
97+
func (h *Handler) GetMe(c *fiber.Ctx) error {
98+
var req types.GetMeRequest
99+
if err := c.BodyParser(&req); err != nil {
100+
return utils.BadRequestResponse(c, "Invalid request body", err.Error())
101+
}
102+
103+
if err := h.validator.Struct(&req); err != nil {
104+
return utils.BadRequestResponse(c, "Validation failed", err.Error())
105+
}
106+
107+
profileResponse, err := h.service.GetMe(req)
108+
109+
if err != nil {
110+
return utils.UnauthorizedResponse(c, err.Error())
111+
}
112+
113+
return utils.SuccessResponse(c, "Get User Information successfully", profileResponse)
114+
}
115+
116+
func (h *Handler) UpdateUserProfile(c *fiber.Ctx) error {
117+
stringId := c.Params("id")
118+
119+
id, err := uuid.Parse(stringId)
120+
121+
if err != nil {
122+
return utils.BadRequestResponse(c, "The provided ID is not a valid UUID", err.Error())
123+
}
124+
var req types.UserUpdateRequest
125+
if err := c.BodyParser(&req); err != nil {
126+
return utils.BadRequestResponse(c, "Invalid request body", err.Error())
127+
}
128+
if err := h.validator.Struct(&req); err != nil {
129+
return utils.BadRequestResponse(c, "Validation failed!", err.Error())
130+
}
131+
132+
updatedProfileResponse, err := h.service.UpdateUserProfile(id, req)
133+
134+
if err != nil {
135+
return utils.InternalServerErrorResponse(c, "Failed to update user profile", err.Error())
136+
}
137+
return utils.SuccessResponse(c, "User profile updated", updatedProfileResponse)
138+
139+
}

backend/cms-sys/internal/routes/auth_route.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,6 @@ func SetupRoutes(app *fiber.App, handler handler.AuthHandle) {
1111
auth.Post("/register", handler.Register)
1212
auth.Post("/logout", handler.Logout)
1313
auth.Post("/refresh", handler.Refresh)
14+
auth.Post("/me", handler.GetMe)
15+
auth.Put("/profile/:id", handler.UpdateUserProfile)
1416
}

backend/cms-sys/internal/service/auth_service.go

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ type AuthService interface {
1515
Register(req *types.RegisterRequest) (*types.AuthResponse, error)
1616
RefreshToken(refreshToken string) (*types.TokenResponse, error)
1717
GetUserProfile(userID uuid.UUID) (*types.UserResponse, error)
18+
GetMe(req types.GetMeRequest) (*types.UserResponse, error)
19+
UpdateUserProfile(id uuid.UUID, req types.UserUpdateRequest) (*types.UserResponse, error)
1820
}
1921

2022
type Service struct {
@@ -194,3 +196,49 @@ func (s *Service) GetUserProfile(userID uuid.UUID) (*types.UserResponse, error)
194196
UpdatedAt: user.UpdatedAt,
195197
}, nil
196198
}
199+
200+
func (s *Service) GetMe(req types.GetMeRequest) (*types.UserResponse, error) {
201+
202+
user, err := s.repo.GetUserByEmail(req.Email)
203+
204+
if err != nil {
205+
s.log.WithError(err).Error("Failed to get user profile")
206+
return nil, errors.New("user not found")
207+
}
208+
209+
return &types.UserResponse{
210+
ID: user.CMSUserID,
211+
Name: user.CMSUserName,
212+
Email: user.CMSUserEmail,
213+
Role: user.CMSUserRole,
214+
Verified: user.Verified,
215+
CreatedAt: user.CreatedAt,
216+
UpdatedAt: user.UpdatedAt,
217+
}, nil
218+
}
219+
220+
func (s *Service) UpdateUserProfile(id uuid.UUID, req types.UserUpdateRequest) (*types.UserResponse, error) {
221+
222+
user, err := s.repo.GetUserByID(id)
223+
if err != nil {
224+
s.log.WithError(err).Error("Failed to get user profile with id ", id)
225+
return nil, errors.New("user not found")
226+
}
227+
228+
user.CMSUserName = req.Name
229+
if err := s.repo.UpdateUser(user); err != nil {
230+
s.log.WithError(err).Error("Failed to update user profile")
231+
return nil, errors.New("failed to update user profile")
232+
}
233+
234+
return &types.UserResponse{
235+
ID: user.CMSUserID,
236+
Name: user.CMSUserName,
237+
Email: user.CMSUserEmail,
238+
Role: user.CMSUserRole,
239+
Verified: user.Verified,
240+
CreatedAt: user.CreatedAt,
241+
UpdatedAt: user.UpdatedAt,
242+
}, nil
243+
244+
}

backend/cms-sys/internal/types/request.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,3 +26,11 @@ type OwnerUpdateRequest struct {
2626
Name string `json:"name" validate:"required,min=2"`
2727
NameSpace string `json:"namespace" validate:"required,min=3"` // TODO : Gotta remove namespace later
2828
}
29+
30+
type GetMeRequest struct {
31+
Email string `json:"email" validate:"required,email"`
32+
}
33+
34+
type UserUpdateRequest struct {
35+
Name string `json:"name" validate:"required,min=2"`
36+
}

0 commit comments

Comments
 (0)