From d110a31c4f92b270f9cda3aadaeb8c69036f3d7c Mon Sep 17 00:00:00 2001 From: Habib Fatkhul Rohman Date: Mon, 3 Nov 2025 14:37:58 +0700 Subject: [PATCH] feat(maintenance_group): Enhance MaintenanceGroup structure and responses with ClientID and total role count --- .../maintenance_group_controller.go | 44 ++++++++++++++++--- .../dto/maintenance_group_dto.go | 13 +++--- .../query/maintenance_group_query.go | 35 ++++++++------- .../service/maintenance_group_service.go | 2 +- 4 files changed, 65 insertions(+), 29 deletions(-) diff --git a/modules/maintenance_group/controller/maintenance_group_controller.go b/modules/maintenance_group/controller/maintenance_group_controller.go index a6e6b06..f0eb9f3 100644 --- a/modules/maintenance_group/controller/maintenance_group_controller.go +++ b/modules/maintenance_group/controller/maintenance_group_controller.go @@ -7,6 +7,7 @@ import ( "github.com/Caknoooo/go-gin-clean-starter/modules/maintenance_group/query" "github.com/Caknoooo/go-gin-clean-starter/modules/maintenance_group/service" "github.com/Caknoooo/go-gin-clean-starter/pkg/constants" + pkgdto "github.com/Caknoooo/go-gin-clean-starter/pkg/dto" "github.com/Caknoooo/go-gin-clean-starter/pkg/utils" "github.com/Caknoooo/go-pagination" "github.com/gin-gonic/gin" @@ -152,17 +153,18 @@ func (c *maintenanceGroupController) GetById(ctx *gin.Context) { // @Failure 400 {object} map[string]interface{} // @Router /maintenance-groups [get] func (c *maintenanceGroupController) GetAll(ctx *gin.Context) { - clientId := ctx.MustGet("client_id").(string) + // clientId := ctx.MustGet("client_id").(string) var filter = &query.MaintenanceGroupFilter{ Name: ctx.Query("name"), Code: ctx.Query("code"), Description: ctx.Query("description"), - ClientID: clientId, + ClientID: ctx.Query("client_id"), Includes: ctx.QueryArray("includes"), } + logrus.Info(filter.ClientID) filter.BindPagination(ctx) - ctx.ShouldBindQuery(filter) - logrus.Infof("pagination: page=%d, page_size=%d", filter.Pagination.Page, filter.Pagination.PerPage) + ctx.ShouldBindQuery(&filter) + // logrus.Infof("pagination: page=%d, page_size=%d", filter.Pagination.Page, filter.Pagination.PerPage) logrus.Info("1") groups, total, err := pagination.PaginatedQueryWithIncludableAndOptions[query.M_MaintenanceGroup]( c.db, @@ -172,8 +174,7 @@ func (c *maintenanceGroupController) GetAll(ctx *gin.Context) { // Dialect: pagination.MySQL, // atau PostgreSQL jika perlu }, ) - logrus.Info("total:", total, " len groups:", len(groups)) - logrus.Info("2") + groupsResponse := ToMaintGroupSimpleResponses(groups) if err != nil { res := utils.BuildResponseFailed(dto.MESSAGE_FAILED_GET_LIST_MG, err.Error(), nil) ctx.JSON(http.StatusBadRequest, res) @@ -183,6 +184,35 @@ func (c *maintenanceGroupController) GetAll(ctx *gin.Context) { // groupResponses := dto.ToMaintGroupResponses(groups) paginationResponse := pagination.CalculatePagination(filter.Pagination, total) - response := pagination.NewPaginatedResponse(http.StatusOK, dto.MESSAGE_SUCCESS_GET_LIST_MG, groups, paginationResponse) + response := pagination.NewPaginatedResponse(http.StatusOK, dto.MESSAGE_SUCCESS_GET_LIST_MG, groupsResponse, paginationResponse) ctx.JSON(http.StatusOK, response) } + +func ToMaintGroupSimpleResponses(groups []query.M_MaintenanceGroup) []dto.MaintGroupResponse { + res := make([]dto.MaintGroupResponse, 0, len(groups)) + for _, g := range groups { + roles := make([]dto.MaintenanceGroupRoleResponse, 0, len(g.MaintenanceGroupRoles)) + for _, r := range g.MaintenanceGroupRoles { + roles = append(roles, dto.MaintenanceGroupRoleResponse{ + ID: r.ID.String(), + Level: r.Level, + Role: pkgdto.RoleResponse{ + ID: r.Role.ID.String(), + Name: r.Role.Name, + }}) + } + res = append(res, dto.MaintGroupResponse{ + ID: g.ID, + Name: g.Name, + Code: g.Code, + Description: g.Description, + TotalMaintenanceGroupRole: g.TotalMaintenanceGroupRole, + Client: pkgdto.IdNameResponse{ + ID: g.Client.ID.String(), + Name: g.Client.Name, + }, + MaintenanceGroupRoles: &roles, + }) + } + return res +} diff --git a/modules/maintenance_group/dto/maintenance_group_dto.go b/modules/maintenance_group/dto/maintenance_group_dto.go index 05ebb59..90782ba 100644 --- a/modules/maintenance_group/dto/maintenance_group_dto.go +++ b/modules/maintenance_group/dto/maintenance_group_dto.go @@ -71,12 +71,13 @@ type ( } MaintGroupResponse struct { - ID string `json:"id"` - Code string `json:"code"` - Name string `json:"name"` - Description string `json:"description"` - Client dto.ClientResponse `json:"client"` - MaintenanceGroupRoles *[]MaintenanceGroupRoleResponse `json:"maintenance_group_roles"` + ID string `json:"id"` + Code string `json:"code"` + Name string `json:"name"` + Description string `json:"description"` + TotalMaintenanceGroupRole int `json:"total_maintenance_group_role" binding:"omitempty"` + Client dto.IdNameResponse `json:"client"` + MaintenanceGroupRoles *[]MaintenanceGroupRoleResponse `json:"maintenance_group_roles"` } MaintenanceGroupRoleResponse struct { diff --git a/modules/maintenance_group/query/maintenance_group_query.go b/modules/maintenance_group/query/maintenance_group_query.go index bb0b67a..5cee2cf 100644 --- a/modules/maintenance_group/query/maintenance_group_query.go +++ b/modules/maintenance_group/query/maintenance_group_query.go @@ -1,16 +1,21 @@ package query import ( + "github.com/Caknoooo/go-gin-clean-starter/database/entities" "github.com/Caknoooo/go-pagination" + "github.com/sirupsen/logrus" "gorm.io/gorm" ) type M_MaintenanceGroup struct { - ID string `json:"id"` - Name string `json:"name"` - Code string `json:"code"` - Description string `json:"description"` - TotalMaintenanceGroupRole int `json:"total_maintenance_group_role"` + ID string `json:"id"` + Name string `json:"name"` + Code string `json:"code"` + Description string `json:"description"` + TotalMaintenanceGroupRole int `json:"total_maintenance_group_role"` + ClientID string `json:"client_id"` // <-- Add this line + Client entities.M_Client `gorm:"foreignKey:ClientID;references:ID" json:"client"` + MaintenanceGroupRoles []entities.M_MaintenanceGroupRole `gorm:"foreignKey:MaintenanceGroupID;references:ID" json:"maintenance_group_roles"` } type MaintenanceGroupFilter struct { @@ -23,23 +28,23 @@ type MaintenanceGroupFilter struct { } func (f *MaintenanceGroupFilter) ApplyFilters(query *gorm.DB) *gorm.DB { - // Apply your filters here + // ...existing code... if f.Name != "" { query = query.Where("name ILIKE ?", "%"+f.Name+"%") } if f.ClientID != "" { query = query.Where("client_id = ?", f.ClientID) + logrus.Infof("Filtering by ClientID: %s", f.ClientID) } - // Manual preload untuk roles dengan field terbatas - // for _, include := range f.Includes { - // if include == "Roles" { - // query = query.Preload("Roles", func(db *gorm.DB) *gorm.DB { - // return db.Select("id", "name") // Hanya ambil id dan name - // }) - // } - // } - // Hitung total maintenance group role per group + // Ganti ini: + // query = query.Model(entities.M_MaintenanceGroup{}).Preload("Client") + // Jadi: + query = query.Model(&M_MaintenanceGroup{}). + Preload("Client"). + Preload("MaintenanceGroupRoles"). + Preload("MaintenanceGroupRoles.Role") + query = query.Select("m_maintenance_groups.*, " + "(SELECT COUNT(*) FROM m_maintenance_group_roles mgr WHERE mgr.maintenance_group_id = m_maintenance_groups.id AND mgr.deleted_at IS NULL) as total_maintenance_group_role") diff --git a/modules/maintenance_group/service/maintenance_group_service.go b/modules/maintenance_group/service/maintenance_group_service.go index c5fe880..da32d56 100644 --- a/modules/maintenance_group/service/maintenance_group_service.go +++ b/modules/maintenance_group/service/maintenance_group_service.go @@ -183,7 +183,7 @@ func (m *maintenanceGroupService) GetById(ctx context.Context, maintGroupId stri } // Mapping client - client := staticDto.ClientResponse{ + client := staticDto.IdNameResponse{ ID: group.Client.ID.String(), Name: group.Client.Name, }