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 } // 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) } }