From 63c95b581a5bf4d3eacc75d6fc8fb39e33de6129 Mon Sep 17 00:00:00 2001 From: "renaldi.brada1904" Date: Fri, 3 Jul 2026 13:48:33 +0700 Subject: [PATCH] add CRUD page menu --- internal/domain/access/model.go | 19 ++++++++++++------- internal/domain/access/repository.go | 12 ++++++++++++ internal/domain/access/response.go | 15 +++++++++++++++ 3 files changed, 39 insertions(+), 7 deletions(-) diff --git a/internal/domain/access/model.go b/internal/domain/access/model.go index a933f24..313e0bf 100644 --- a/internal/domain/access/model.go +++ b/internal/domain/access/model.go @@ -9,13 +9,14 @@ type RolePermissionModel struct { } type RolePageModel struct { - ID string `db:"id"` - Name string `db:"name"` - Icon sql.NullString `db:"icon"` - Url sql.NullString `db:"url"` - Level int `db:"level"` - Sort int `db:"sort"` - ParentId sql.NullString `db:"parent"` + ID string `db:"id"` + Name string `db:"name"` + Icon sql.NullString `db:"icon"` + Url sql.NullString `db:"url"` + Level int `db:"level"` + Sort int `db:"sort"` + ParentId sql.NullString `db:"parent"` + Permission RolePagePermissionModel } type RoleUserModel struct { @@ -36,4 +37,8 @@ type RolePagePermissionModel struct { ID string `db:"id"` IdPermission string `db:"id_permission"` IdPage string `db:"id_page"` + Create bool `db:"create"` + Read bool `db:"read"` + Update bool `db:"update"` + Delete bool `db:"delete"` } diff --git a/internal/domain/access/repository.go b/internal/domain/access/repository.go index e0c8daf..2f5ca15 100644 --- a/internal/domain/access/repository.go +++ b/internal/domain/access/repository.go @@ -170,12 +170,14 @@ func (r accessRepo) GetAvailablePageByKeycloakId(c context.Context, keycloakId s } var pageIds []string + mapPagePermission := make(map[string]RolePagePermissionModel) fetchPagePermission, err := r.getPageIdsByPermissionIds(c, dbconn, permissionIds) if err != nil { return nil, err } for _, pg := range fetchPagePermission { pageIds = append(pageIds, pg.IdPage) + mapPagePermission[pg.IdPage] = pg } result, err = r.getPageByIds(c, dbconn, pageIds) @@ -183,6 +185,12 @@ func (r accessRepo) GetAvailablePageByKeycloakId(c context.Context, keycloakId s return nil, err } + // map result page with permission + for i := range len(result) { + log.Println(result[i].ID) + result[i].Permission = mapPagePermission[result[i].ID] + } + return result, nil } @@ -779,6 +787,10 @@ func (r accessRepo) getPageIdsByPermissionIds(c context.Context, db *sqlx.DB, pe {Expression: "id"}, {Expression: "id_permission"}, {Expression: "id_page"}, + {Expression: "create"}, + {Expression: "read"}, + {Expression: "update"}, + {Expression: "delete"}, }, Filters: []queryUtils.FilterGroup{ { diff --git a/internal/domain/access/response.go b/internal/domain/access/response.go index f4dff3a..db3b7ee 100644 --- a/internal/domain/access/response.go +++ b/internal/domain/access/response.go @@ -2,11 +2,19 @@ package access import "antrian-operasi/internal/shared" +type AvailableMenuAccessResponse struct { + Create bool `json:"create"` + Read bool `json:"read"` + Update bool `json:"update"` + Delete bool `json:"delete"` +} + type AvailableMenuChildResponse struct { Title string `json:"title"` Icon string `json:"icon"` To string `json:"to"` Children []*AvailableMenuChildResponse `json:"children"` + Access AvailableMenuAccessResponse `json:"access"` } type AvailableMenuResponse struct { @@ -24,9 +32,16 @@ func MapMenuModelToResponse(pages []RolePageModel) []AvailableMenuResponse { // First pass: create all menu items for _, p := range pages { pageMap[p.ID] = &AvailableMenuChildResponse{ + Title: p.Name, Icon: p.Icon.String, To: p.Url.String, + Access: AvailableMenuAccessResponse{ + Create: p.Permission.Create, + Read: p.Permission.Read, + Update: p.Permission.Update, + Delete: p.Permission.Delete, + }, } }