From 3ff8a22325ec5794a12fbbe9437033285643ff26 Mon Sep 17 00:00:00 2001 From: pahmiudahgede Date: Tue, 14 Jan 2025 17:36:33 +0700 Subject: [PATCH] feat: add feature view all user registered(admin) and acces control --- internal/api/routes.go | 63 +++++++++++++++-------------- internal/controllers/user.go | 75 +++++++++++++++++++++++++++++++++++ internal/repositories/user.go | 33 +++++++++++++++ internal/services/user.go | 71 +++++++++++++++++++++++++++++++++ 4 files changed, 213 insertions(+), 29 deletions(-) create mode 100644 internal/controllers/user.go create mode 100644 internal/repositories/user.go create mode 100644 internal/services/user.go diff --git a/internal/api/routes.go b/internal/api/routes.go index c1a83e5..01e4a06 100644 --- a/internal/api/routes.go +++ b/internal/api/routes.go @@ -17,23 +17,23 @@ func AppRouter(app *fiber.App) { // # user initial coint # api.Get("/user/initial-coint", controllers.GetUserInitialCoint) api.Get("/user/initial-coint/:id", controllers.GetUserInitialCointById) - api.Post("/user/initial-coint", controllers.CreatePoint) - api.Put("/user/initial-coint/:id", controllers.UpdatePoint) - api.Delete("/user/initial-coint/:id", controllers.DeletePoint) + api.Post("/user/initial-coint", middleware.RoleRequired(utils.RoleAdministrator), controllers.CreatePoint) + api.Put("/user/initial-coint/:id", middleware.RoleRequired(utils.RoleAdministrator), controllers.UpdatePoint) + api.Delete("/user/initial-coint/:id", middleware.RoleRequired(utils.RoleAdministrator), controllers.DeletePoint) //# coverage area # api.Get("/coverage-areas", controllers.GetCoverageAreas) api.Get("/coverage-areas-district/:id", controllers.GetCoverageAreaByIDProvince) api.Get("/coverage-areas-subdistrict/:id", controllers.GetCoverageAreaByIDDistrict) - api.Post("/coverage-areas", controllers.CreateCoverageArea) - api.Post("/coverage-areas-district", controllers.CreateCoverageDistrict) - api.Post("/coverage-areas-subdistrict", controllers.CreateCoverageSubdistrict) - api.Put("/coverage-areas/:id", controllers.UpdateCoverageArea) - api.Put("/coverage-areas-district/:id", controllers.UpdateCoverageDistrict) - api.Put("/coverage-areas-subdistrict/:id", controllers.UpdateCoverageSubdistrict) - api.Delete("/coverage-areas/:id", controllers.DeleteCoverageArea) - api.Delete("/coverage-areas-district/:id", controllers.DeleteCoverageDistrict) - api.Delete("/coverage-areas-subdistrict/:id", controllers.DeleteCoverageSubdistrict) + api.Post("/coverage-areas", middleware.RoleRequired(utils.RoleAdministrator), controllers.CreateCoverageArea) + api.Post("/coverage-areas-district", middleware.RoleRequired(utils.RoleAdministrator), controllers.CreateCoverageDistrict) + api.Post("/coverage-areas-subdistrict", middleware.RoleRequired(utils.RoleAdministrator), controllers.CreateCoverageSubdistrict) + api.Put("/coverage-areas/:id", middleware.RoleRequired(utils.RoleAdministrator), controllers.UpdateCoverageArea) + api.Put("/coverage-areas-district/:id", middleware.RoleRequired(utils.RoleAdministrator), controllers.UpdateCoverageDistrict) + api.Put("/coverage-areas-subdistrict/:id", middleware.RoleRequired(utils.RoleAdministrator), controllers.UpdateCoverageSubdistrict) + api.Delete("/coverage-areas/:id", middleware.RoleRequired(utils.RoleAdministrator), controllers.DeleteCoverageArea) + api.Delete("/coverage-areas-district/:id", middleware.RoleRequired(utils.RoleAdministrator), controllers.DeleteCoverageDistrict) + api.Delete("/coverage-areas-subdistrict/:id", middleware.RoleRequired(utils.RoleAdministrator), controllers.DeleteCoverageSubdistrict) // # role # api.Get("/roles", middleware.RoleRequired(utils.RoleAdministrator), controllers.GetAllUserRoles) @@ -48,6 +48,11 @@ func AppRouter(app *fiber.App) { api.Post("/user/update-password", middleware.AuthMiddleware, controllers.UpdatePassword) api.Put("/user/update-user", middleware.AuthMiddleware, controllers.UpdateUser) + // # view all user (admin) + api.Get("/user/listallusers", middleware.RoleRequired(utils.RoleAdministrator), controllers.GetListUsers) + api.Get("/user/listalluser/:roleid", middleware.RoleRequired(utils.RoleAdministrator), controllers.GetUsersByRole) + api.Get("/user/listuser/:userid", middleware.RoleRequired(utils.RoleAdministrator), controllers.GetUserByUserID) + // # user set pin # api.Get("/user/verif-pin", middleware.AuthMiddleware, controllers.GetPin) api.Get("/user/cek-pin-status", middleware.AuthMiddleware, controllers.GetPinStatus) @@ -63,28 +68,28 @@ func AppRouter(app *fiber.App) { api.Delete("/address/delete-address/:id", middleware.AuthMiddleware, controllers.DeleteAddress) // # article # - api.Get("/articles", middleware.AuthMiddleware, controllers.GetArticles) - api.Get("/article/:id", middleware.AuthMiddleware, controllers.GetArticleByID) - api.Post("/article/create-article", middleware.AuthMiddleware, controllers.CreateArticle) - api.Put("/article/update-article/:id", middleware.AuthMiddleware, controllers.UpdateArticle) - api.Delete("/article/delete-article/:id", middleware.AuthMiddleware, controllers.DeleteArticle) + api.Get("/articles", controllers.GetArticles) + api.Get("/article/:id", controllers.GetArticleByID) + api.Post("/article/create-article", middleware.RoleRequired(utils.RoleAdministrator), controllers.CreateArticle) + api.Put("/article/update-article/:id", middleware.RoleRequired(utils.RoleAdministrator), controllers.UpdateArticle) + api.Delete("/article/delete-article/:id", middleware.RoleRequired(utils.RoleAdministrator), controllers.DeleteArticle) // # trash type # api.Get("/trash-categorys", controllers.GetTrashCategories) api.Get("/trash-category/:id", controllers.GetTrashCategoryDetail) - api.Post("/trash-category/create-trash-category", controllers.CreateTrashCategory) - api.Post("/trash-category/create-trash-categorydetail", controllers.CreateTrashDetail) - api.Put("/trash-category/update-trash-category/:id", controllers.UpdateTrashCategory) - api.Put("/trash-category/update-trash-detail/:id", controllers.UpdateTrashDetail) - api.Delete("/trash-category/delete-trash-category/:id", controllers.DeleteTrashCategory) - api.Delete("/trash-category/delete-trash-detail/:id", controllers.DeleteTrashDetail) + api.Post("/trash-category/create-trash-category", middleware.RoleRequired(utils.RoleAdministrator), controllers.CreateTrashCategory) + api.Post("/trash-category/create-trash-categorydetail", middleware.RoleRequired(utils.RoleAdministrator), controllers.CreateTrashDetail) + api.Put("/trash-category/update-trash-category/:id", middleware.RoleRequired(utils.RoleAdministrator), controllers.UpdateTrashCategory) + api.Put("/trash-category/update-trash-detail/:id", middleware.RoleRequired(utils.RoleAdministrator), controllers.UpdateTrashDetail) + api.Delete("/trash-category/delete-trash-category/:id", middleware.RoleRequired(utils.RoleAdministrator), controllers.DeleteTrashCategory) + api.Delete("/trash-category/delete-trash-detail/:id", middleware.RoleRequired(utils.RoleAdministrator), controllers.DeleteTrashDetail) // # banner # api.Get("/banners", controllers.GetBanners) api.Get("/banner/:id", controllers.GetBannerByID) - api.Post("/banner/create-banner", controllers.CreateBanner) - api.Put("/banner/update-banner/:id", controllers.UpdateBanner) - api.Delete("/banner/delete-banner/:id", controllers.DeleteBanner) + api.Post("/banner/create-banner", middleware.RoleRequired(utils.RoleAdministrator), controllers.CreateBanner) + api.Put("/banner/update-banner/:id", middleware.RoleRequired(utils.RoleAdministrator), controllers.UpdateBanner) + api.Delete("/banner/delete-banner/:id", middleware.RoleRequired(utils.RoleAdministrator), controllers.DeleteBanner) // # wilayah di indonesia # api.Get("/wilayah-indonesia/provinces", controllers.GetProvinces) @@ -97,7 +102,7 @@ func AppRouter(app *fiber.App) { api.Get("/wilayah-indonesia/villages/:id", controllers.GetVillageByID) // # request pickup by user (masyarakat) # - api.Get("/requestpickup", middleware.AuthMiddleware, controllers.GetRequestPickupsByUser) - api.Post("/addrequestpickup", middleware.AuthMiddleware, controllers.CreateRequestPickup) - api.Delete("/deleterequestpickup/:id", middleware.AuthMiddleware, controllers.DeleteRequestPickup) + api.Get("/requestpickup", middleware.RoleRequired(utils.RoleMasyarakat), controllers.GetRequestPickupsByUser) + api.Post("/addrequestpickup", middleware.RoleRequired(utils.RoleMasyarakat), controllers.CreateRequestPickup) + api.Delete("/deleterequestpickup/:id", middleware.RoleRequired(utils.RoleMasyarakat), controllers.DeleteRequestPickup) } diff --git a/internal/controllers/user.go b/internal/controllers/user.go new file mode 100644 index 0000000..cad2efc --- /dev/null +++ b/internal/controllers/user.go @@ -0,0 +1,75 @@ +package controllers + +import ( + "github.com/gofiber/fiber/v2" + "github.com/pahmiudahgede/senggoldong/dto" + "github.com/pahmiudahgede/senggoldong/internal/services" + "github.com/pahmiudahgede/senggoldong/utils" +) + +func GetListUsers(c *fiber.Ctx) error { + users, err := services.GetUsers() + if err != nil { + return c.Status(fiber.StatusInternalServerError).JSON(utils.FormatResponse( + fiber.StatusInternalServerError, + "Failed to fetch users", + nil, + )) + } + + return c.Status(fiber.StatusOK).JSON(utils.FormatResponse( + fiber.StatusOK, + "Users fetched successfully", + users, + )) +} + +func GetUsersByRole(c *fiber.Ctx) error { + roleID := c.Params("roleID") + + users, err := services.GetUsersByRole(roleID) + if err != nil { + return c.Status(fiber.StatusInternalServerError).JSON(utils.FormatResponse( + fiber.StatusInternalServerError, + "Failed to fetch users by role", + nil, + )) + } + + if len(users) == 0 { + return c.Status(fiber.StatusNotFound).JSON(utils.FormatResponse( + fiber.StatusNotFound, + "No users found for the specified role", + nil, + )) + } + + return c.Status(fiber.StatusOK).JSON(utils.FormatResponse( + fiber.StatusOK, + "Users fetched successfully", + users, + )) +} + +func GetUserByUserID(c *fiber.Ctx) error { + userID := c.Params("userID") + + user, err := services.GetUserByUserID(userID) + if err != nil { + return c.Status(fiber.StatusNotFound).JSON(utils.FormatResponse( + fiber.StatusNotFound, + "User not found", + nil, + )) + } + + return c.Status(fiber.StatusOK).JSON(utils.FormatResponse( + fiber.StatusOK, + "User fetched successfully", + struct { + User dto.UserResponseDTO `json:"user"` + }{ + User: user, + }, + )) +} diff --git a/internal/repositories/user.go b/internal/repositories/user.go new file mode 100644 index 0000000..1a4aa1a --- /dev/null +++ b/internal/repositories/user.go @@ -0,0 +1,33 @@ +package repositories + +import ( + "github.com/pahmiudahgede/senggoldong/domain" + "github.com/pahmiudahgede/senggoldong/config" +) + +func GetUsers() ([]domain.User, error) { + var users []domain.User + + if err := config.DB.Find(&users).Error; err != nil { + return nil, err + } + return users, nil +} + +func GetUsersByRole(roleID string) ([]domain.User, error) { + var users []domain.User + + if err := config.DB.Where("role_id = ?", roleID).Find(&users).Error; err != nil { + return nil, err + } + return users, nil +} + +func GetUserByUserrId(userID string) (domain.User, error) { + var user domain.User + + if err := config.DB.Where("id = ?", userID).First(&user).Error; err != nil { + return domain.User{}, err + } + return user, nil +} \ No newline at end of file diff --git a/internal/services/user.go b/internal/services/user.go new file mode 100644 index 0000000..ea50f73 --- /dev/null +++ b/internal/services/user.go @@ -0,0 +1,71 @@ +package services + +import ( + "github.com/pahmiudahgede/senggoldong/dto" + "github.com/pahmiudahgede/senggoldong/internal/repositories" + "github.com/pahmiudahgede/senggoldong/utils" +) + +func GetUsers() ([]dto.UserResponseDTO, error) { + users, err := repositories.GetUsers() + if err != nil { + return nil, err + } + + var userResponses []dto.UserResponseDTO + for _, user := range users { + userResponses = append(userResponses, dto.UserResponseDTO{ + ID: user.ID, + Username: user.Username, + Name: user.Name, + Email: user.Email, + Phone: user.Phone, + RoleId: user.RoleID, + CreatedAt: utils.FormatDateToIndonesianFormat(user.CreatedAt), + UpdatedAt: utils.FormatDateToIndonesianFormat(user.UpdatedAt), + }) + } + return userResponses, nil +} + +func GetUsersByRole(roleID string) ([]dto.UserResponseDTO, error) { + users, err := repositories.GetUsersByRole(roleID) + if err != nil { + return nil, err + } + + var userResponses []dto.UserResponseDTO + for _, user := range users { + userResponses = append(userResponses, dto.UserResponseDTO{ + ID: user.ID, + Username: user.Username, + Name: user.Name, + Email: user.Email, + Phone: user.Phone, + RoleId: user.RoleID, + CreatedAt: utils.FormatDateToIndonesianFormat(user.CreatedAt), + UpdatedAt: utils.FormatDateToIndonesianFormat(user.UpdatedAt), + }) + } + return userResponses, nil +} + +func GetUserByUserID(userID string) (dto.UserResponseDTO, error) { + user, err := repositories.GetUserByID(userID) + if err != nil { + return dto.UserResponseDTO{}, err + } + + userResponse := dto.UserResponseDTO{ + ID: user.ID, + Username: user.Username, + Name: user.Name, + Email: user.Email, + Phone: user.Phone, + RoleId: user.RoleID, + CreatedAt: utils.FormatDateToIndonesianFormat(user.CreatedAt), + UpdatedAt: utils.FormatDateToIndonesianFormat(user.UpdatedAt), + } + + return userResponse, nil +} \ No newline at end of file