111 lines
3.2 KiB
Go
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)
|
|
}
|
|
}
|