feat: add feature get list role for admin user

This commit is contained in:
pahmiudahgede 2025-02-05 15:21:50 +07:00
parent c9525270a9
commit 35d51b99d0
6 changed files with 189 additions and 2 deletions

8
dto/role_dto.go Normal file
View File

@ -0,0 +1,8 @@
package dto
type RoleResponseDTO struct {
ID string `json:"role_id"`
RoleName string `json:"role_name"`
CreatedAt string `json:"createdAt"`
UpdatedAt string `json:"updatedAt"`
}

View File

@ -1 +1,46 @@
package handler
package handler
import (
"github.com/gofiber/fiber/v2"
"github.com/pahmiudahgede/senggoldong/internal/services"
"github.com/pahmiudahgede/senggoldong/utils"
)
type RoleHandler struct {
RoleService services.RoleService
}
func NewRoleHandler(roleService services.RoleService) *RoleHandler {
return &RoleHandler{RoleService: roleService}
}
func (h *RoleHandler) GetRoles(c *fiber.Ctx) error {
roleID, ok := c.Locals("roleID").(string)
if !ok || roleID != utils.RoleAdministrator {
return utils.GenericErrorResponse(c, fiber.StatusForbidden, "Forbidden: You don't have permission to access this resource")
}
roles, err := h.RoleService.GetRoles()
if err != nil {
return utils.GenericErrorResponse(c, fiber.StatusInternalServerError, err.Error())
}
return utils.LogResponse(c, roles, "Roles fetched successfully")
}
func (h *RoleHandler) GetRoleByID(c *fiber.Ctx) error {
roleID := c.Params("role_id")
roleIDFromSession, ok := c.Locals("roleID").(string)
if !ok || roleIDFromSession != utils.RoleAdministrator {
return utils.GenericErrorResponse(c, fiber.StatusForbidden, "Forbidden: You don't have permission to access this resource")
}
role, err := h.RoleService.GetRoleByID(roleID)
if err != nil {
return utils.GenericErrorResponse(c, fiber.StatusNotFound, "role id tidak ditemukan")
}
return utils.LogResponse(c, role, "Role fetched successfully")
}

View File

@ -7,6 +7,7 @@ import (
type RoleRepository interface {
FindByID(id string) (*model.Role, error)
FindAll() ([]model.Role, error)
}
type roleRepository struct {
@ -25,3 +26,12 @@ func (r *roleRepository) FindByID(id string) (*model.Role, error) {
}
return &role, nil
}
func (r *roleRepository) FindAll() ([]model.Role, error) {
var roles []model.Role
err := r.DB.Find(&roles).Error
if err != nil {
return nil, err
}
return roles, nil
}

View File

@ -1 +1,103 @@
package services
package services
import (
"fmt"
"time"
"github.com/pahmiudahgede/senggoldong/dto"
"github.com/pahmiudahgede/senggoldong/internal/repositories"
"github.com/pahmiudahgede/senggoldong/utils"
)
type RoleService interface {
GetRoles() ([]dto.RoleResponseDTO, error)
GetRoleByID(roleID string) (*dto.RoleResponseDTO, error)
}
type roleService struct {
RoleRepo repositories.RoleRepository
}
func NewRoleService(roleRepo repositories.RoleRepository) RoleService {
return &roleService{RoleRepo: roleRepo}
}
func (s *roleService) GetRoles() ([]dto.RoleResponseDTO, error) {
cacheKey := "roles_list"
cachedData, err := utils.GetJSONData(cacheKey)
if err == nil && cachedData != nil {
var roles []dto.RoleResponseDTO
if data, ok := cachedData["data"].([]interface{}); ok {
for _, item := range data {
role, ok := item.(map[string]interface{})
if ok {
roles = append(roles, dto.RoleResponseDTO{
ID: role["role_id"].(string),
RoleName: role["role_name"].(string),
CreatedAt: role["createdAt"].(string),
UpdatedAt: role["updatedAt"].(string),
})
}
}
return roles, nil
}
}
roles, err := s.RoleRepo.FindAll()
if err != nil {
return nil, fmt.Errorf("failed to fetch roles: %v", err)
}
var roleDTOs []dto.RoleResponseDTO
for _, role := range roles {
createdAt, _ := utils.FormatDateToIndonesianFormat(role.CreatedAt)
updatedAt, _ := utils.FormatDateToIndonesianFormat(role.UpdatedAt)
roleDTOs = append(roleDTOs, dto.RoleResponseDTO{
ID: role.ID,
RoleName: role.RoleName,
CreatedAt: createdAt,
UpdatedAt: updatedAt,
})
}
cacheData := map[string]interface{}{
"data": roleDTOs,
}
err = utils.SetJSONData(cacheKey, cacheData, time.Hour*24)
if err != nil {
fmt.Printf("Error caching roles data to Redis: %v\n", err)
}
return roleDTOs, nil
}
func (s *roleService) GetRoleByID(roleID string) (*dto.RoleResponseDTO, error) {
role, err := s.RoleRepo.FindByID(roleID)
if err != nil {
return nil, fmt.Errorf("role not found: %v", err)
}
createdAt, _ := utils.FormatDateToIndonesianFormat(role.CreatedAt)
updatedAt, _ := utils.FormatDateToIndonesianFormat(role.UpdatedAt)
roleDTO := &dto.RoleResponseDTO{
ID: role.ID,
RoleName: role.RoleName,
CreatedAt: createdAt,
UpdatedAt: updatedAt,
}
cacheKey := fmt.Sprintf("role:%s", roleID)
cacheData := map[string]interface{}{
"data": roleDTO,
}
err = utils.SetJSONData(cacheKey, cacheData, time.Hour*24)
if err != nil {
fmt.Printf("Error caching role data to Redis: %v\n", err)
}
return roleDTO, nil
}

View File

@ -0,0 +1,21 @@
// presentation/role_route.go
package presentation
import (
"github.com/gofiber/fiber/v2"
"github.com/pahmiudahgede/senggoldong/config"
"github.com/pahmiudahgede/senggoldong/internal/handler"
"github.com/pahmiudahgede/senggoldong/internal/repositories"
"github.com/pahmiudahgede/senggoldong/internal/services"
"github.com/pahmiudahgede/senggoldong/middleware"
"github.com/pahmiudahgede/senggoldong/utils"
)
func RoleRouter(api fiber.Router) {
roleRepo := repositories.NewRoleRepository(config.DB)
roleService := services.NewRoleService(roleRepo)
roleHandler := handler.NewRoleHandler(roleService)
api.Get("/roles", middleware.AuthMiddleware, middleware.RoleMiddleware(utils.RoleAdministrator), roleHandler.GetRoles)
api.Get("/role/:role_id", middleware.AuthMiddleware, middleware.RoleMiddleware(utils.RoleAdministrator), roleHandler.GetRoleByID)
}

View File

@ -12,4 +12,5 @@ func SetupRoutes(app *fiber.App) {
presentation.AuthRouter(api)
presentation.UserProfileRouter(api)
presentation.UserPinRouter(api)
presentation.RoleRouter(api)
}