Taobin-Recipe-Manager/server/routers/user.go
2024-06-19 13:56:56 +07:00

111 lines
3.2 KiB
Go

package routers
import (
"context"
"encoding/json"
"net/http"
"recipe-manager/contracts"
"recipe-manager/enums/permissions"
"recipe-manager/helpers"
"recipe-manager/middlewares"
"recipe-manager/services/logger"
"recipe-manager/services/user"
"time"
"github.com/go-chi/chi/v5"
"go.uber.org/zap"
)
type UserRouter struct {
taoLogger *logger.TaoLogger
userService user.UserService
}
func NewUserRouter(taoLogger *logger.TaoLogger, userService user.UserService) *UserRouter {
return &UserRouter{taoLogger, userService}
}
func (ur *UserRouter) Route(r chi.Router) {
// Generate SuperAdmin permissions for seed
perms := helpers.LoadCountrySettingsWithPermissions()
superPerm := perms[0].CountryPermission
for _, p := range perms {
superPerm = superPerm | p.CountryPermission
}
if superPerm < 3999 {
superPerm = superPerm | permissions.Editor | permissions.Viewer
}
// Users
r.Route("/users", func(r chi.Router) {
r.Get("/", middlewares.ValidatePermissions([]permissions.Permission{permissions.Permission(superPerm)}, ur.getUsers))
r.Post("/", middlewares.ValidatePermissions([]permissions.Permission{permissions.Permission(superPerm)}, ur.createUser))
})
// User
r.Route("/user", func(r chi.Router) {
r.Get("/{id}", middlewares.ValidateOwnerOrPermissions([]permissions.Permission{permissions.Permission(superPerm)}, ur.getUser))
})
}
// ================== Users Handler ================================
func (ur *UserRouter) getUsers(w http.ResponseWriter, r *http.Request) {
// TODO: get all User, This route only SuperAdmin permission can access
json.NewEncoder(w).Encode(map[string]interface{}{
"status": "OK",
})
}
func (ur *UserRouter) createUser(w http.ResponseWriter, r *http.Request) {
ctx, cancel := context.WithTimeout(r.Context(), time.Second*5)
defer cancel()
u := &contracts.CreateUserReq{}
if err := json.NewDecoder(r.Body).Decode(u); err != nil {
ur.taoLogger.Log.Error("UserRouter.CreateUser", zap.Error(err))
}
ur.taoLogger.Log.Info("UserRouter.CreateUser", zap.Reflect("user", u))
if err := ur.userService.CreateNewUser(ctx, u.Name, u.Email, u.Picture, u.Permissions); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
}
w.WriteHeader(http.StatusNoContent)
if err := json.NewEncoder(w).Encode(&contracts.ResponseDefault{
Status: http.StatusText(http.StatusNoContent),
Message: "Created",
}); err != nil {
ur.taoLogger.Log.Error("UserRouter.CreateUser", zap.Error(err))
http.Error(w, err.Error(), http.StatusInternalServerError)
}
}
// ==================== User Handler ===============================
func (ur *UserRouter) getUser(w http.ResponseWriter, r *http.Request) {
ctx, cancel := context.WithTimeout(r.Context(), time.Second*5)
defer cancel()
userID := chi.URLParam(r, "id")
getUser, err := ur.userService.GetUserByID(ctx, userID)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
}
if err := json.NewEncoder(w).Encode(&contracts.UserRes{
ID: getUser.ID,
Name: getUser.Name,
Email: getUser.Email,
Picture: getUser.Picture,
Permissions: getUser.Permissions,
}); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
}
}