From e0a5af65a13e0dc7703474b63b8ab1824a145696 Mon Sep 17 00:00:00 2001 From: Habib Fatkhul Rohman Date: Wed, 5 Nov 2025 13:00:11 +0700 Subject: [PATCH] feat(menu): Implement GetAll functionality for menus in MenuService and MenuRepository --- modules/menu/controller/menu_controller.go | 16 ++++++++ modules/menu/repository/menu_repository.go | 21 +++++++++- modules/menu/service/menu_service.go | 45 ++++++++++++++++++++++ 3 files changed, 81 insertions(+), 1 deletion(-) diff --git a/modules/menu/controller/menu_controller.go b/modules/menu/controller/menu_controller.go index 924b519..3f8bcce 100644 --- a/modules/menu/controller/menu_controller.go +++ b/modules/menu/controller/menu_controller.go @@ -88,12 +88,28 @@ func (m *menuController) CreateMenu(ctx *gin.Context) { // @Failure 400 {object} utils.Response // @Router /menus [get] func (m *menuController) GetMenus(ctx *gin.Context) { + getAll := ctx.Query("get_all") var filter = &query.MenuFilter{ ClientID: ctx.Query("client_id"), Name: ctx.Query("name"), ParentID: ctx.Query("parent_id"), Includes: ctx.QueryArray("includes"), } + + if getAll == "true" { + // Ambil semua data tanpa paginasi + menus, err := m.menuService.GetAll(ctx.Request.Context()) + if err != nil { + res := utils.BuildResponseFailed(dto.MESSAGE_FAILED_GET_LIST_MENU, err.Error(), nil) + ctx.JSON(http.StatusBadRequest, res) + return + } + // Tidak perlu ToMenuResponses, karena sudah []dto.MenuResponse + res := utils.BuildResponseSuccess(dto.MESSAGE_SUCCESS_GET_LIST_MENU, menus) + ctx.JSON(http.StatusOK, res) + return + } + filter.BindPagination(ctx) ctx.ShouldBindQuery(filter) menus, total, err := pagination.PaginatedQueryWithIncludable[query.M_Menu](m.db, filter) diff --git a/modules/menu/repository/menu_repository.go b/modules/menu/repository/menu_repository.go index 1ed8ce6..b6b2bfc 100644 --- a/modules/menu/repository/menu_repository.go +++ b/modules/menu/repository/menu_repository.go @@ -14,6 +14,7 @@ type ( GetByName(ctx context.Context, tx *gorm.DB, name string) (entities.M_Menu, error) Update(ctx context.Context, tx *gorm.DB, menu entities.M_Menu) (entities.M_Menu, error) Delete(ctx context.Context, tx *gorm.DB, menuId string) error + GetAll(ctx context.Context, tx *gorm.DB) ([]entities.M_Menu, error) } menuRepository struct { @@ -21,6 +22,24 @@ type ( } ) +// GetAll implements MenuRepository. +func (m *menuRepository) GetAll(ctx context.Context, tx *gorm.DB) ([]entities.M_Menu, error) { + if tx == nil { + tx = m.db + } + + var menus []entities.M_Menu + err := tx.WithContext(ctx). + Preload("Parent"). + Preload("Permissions"). + Find(&menus).Error + if err != nil { + return nil, err + } + + return menus, nil +} + // Create implements MenuRepository. func (m *menuRepository) Create(ctx context.Context, tx *gorm.DB, menu entities.M_Menu) (entities.M_Menu, error) { if tx == nil { @@ -85,7 +104,7 @@ func (m *menuRepository) Update(ctx context.Context, tx *gorm.DB, menu entities. if tx == nil { tx = m.db } - + if err := tx.WithContext(ctx).Model(&entities.M_Menu{}). Where("id = ?", menu.ID). Select("*"). diff --git a/modules/menu/service/menu_service.go b/modules/menu/service/menu_service.go index ae9ee92..850b7bd 100644 --- a/modules/menu/service/menu_service.go +++ b/modules/menu/service/menu_service.go @@ -18,6 +18,7 @@ type MenuService interface { GetById(ctx context.Context, menuId string) (dto.MenuResponse, error) GetByName(ctx context.Context, name string) (dto.MenuResponse, error) Update(ctx context.Context, menuId string, menu dto.MenuUpdateRequest) (dto.MenuResponse, error) + GetAll(ctx context.Context) ([]dto.MenuResponse, error) Delete(ctx context.Context, menuId string) error } @@ -27,6 +28,50 @@ type menuService struct { db *gorm.DB } +// GetAll implements MenuService. +func (m *menuService) GetAll(ctx context.Context) ([]dto.MenuResponse, error) { + entities, err := m.menuRepository.GetAll(ctx, m.db) + if err != nil { + return nil, err + } + + responses := make([]dto.MenuResponse, 0, len(entities)) + for _, entity := range entities { + res := dto.MenuResponse{ + ID: entity.ID.String(), + Name: entity.Name, + IconUrl: entity.IconUrl, + Url: entity.Url, + Sequence: entity.Sequence, + Mode: entity.Mode, + Status: entity.Status, + } + + if entity.Parent != nil { + res.Parent = &dto.MenuParentResponse{ + ID: entity.Parent.ID.String(), + Name: entity.Parent.Name, + } + } else if entity.ParentID != nil { + res.Parent = &dto.MenuParentResponse{ID: entity.ParentID.String()} + } + + if len(entity.Permissions) > 0 { + res.Permissions = make([]staticDto.PermissionResponse, 0, len(entity.Permissions)) + for _, perm := range entity.Permissions { + res.Permissions = append(res.Permissions, staticDto.PermissionResponse{ + ID: perm.ID.String(), + Name: perm.Name, + }) + } + } + + responses = append(responses, res) + } + + return responses, nil +} + // Create implements MenuService. func (m *menuService) Create(ctx context.Context, menu dto.MenuResponse) (dto.MenuResponse, error) { var entity entities.M_Menu