feat: Implement seeders for menus, permissions, and role-permission associations

This commit is contained in:
Habib Fatkhul Rohman 2025-10-21 20:05:14 +07:00
parent bd93da6264
commit 37d656999e
9 changed files with 433 additions and 4 deletions

View File

@ -8,10 +8,8 @@ type M_Permissions struct {
ID uuid.UUID `gorm:"type:uuid;primary_key;default:uuid_generate_v4()" json:"id"`
Name string `gorm:"type:varchar(100);not null" json:"name"`
MenuID uuid.UUID `gorm:"type:uuid;not null;index" json:"menu_id"`
RoleID uuid.UUID `gorm:"type:uuid;not null;index" json:"role_id"` // <-- Add this line
Menu M_Menu `gorm:"foreignKey:MenuID;references:ID"`
Role M_Role `gorm:"foreignKey:RoleID;references:ID"`
FullAuditTrail
}

View File

@ -5,11 +5,10 @@ import (
)
type M_Role_Permission struct {
ID uuid.UUID `gorm:"type:uuid;primary_key;default:uuid_generate_v4()" json:"id"`
RoleID uuid.UUID `gorm:"type:uuid;not null;index" json:"role_id"`
PermissionID uuid.UUID `gorm:"type:uuid;not null;index" json:"permission_id"`
Role M_Role `gorm:"foreignKey:RoleID;references:ID"`
Role M_Role `gorm:"foreignKey:RoleID;references:ID"`
Permission M_Permissions `gorm:"foreignKey:PermissionID;references:ID"`
FullAuditTrail

View File

@ -8,9 +8,12 @@ import (
func Seeder(db *gorm.DB) error {
seeders := []func(*gorm.DB) error{
seeds.ListClientSeeder,
seeds.ListMenuSeeder,
seeds.ListUserSeeder,
seeds.ListRoleSeeder,
seeds.ListUserRoleSeeder,
seeds.ListPermissionSeeder,
seeds.ListRolePermissionSeeder,
}
for _, seeder := range seeders {

View File

@ -0,0 +1,57 @@
[
{
"id": "c1a8f3b0-1234-4f7d-bc91-9b1f52e91a01",
"name": "Dashboard",
"icon_url": "/icons/dashboard.svg",
"url": "/dashboard",
"sequence": 1,
"mode": "desktop",
"table_name": "m_dashboard",
"status": "active",
"parent_id": null
},
{
"id": "f7e1c5d2-5678-4b8a-bdf3-37b3a76c4e3a",
"name": "Users",
"icon_url": "/icons/users.svg",
"url": "/master/users",
"sequence": 2,
"mode": "desktop",
"table_name": "m_users",
"status": "active",
"parent_id": "c1a8f3b0-1234-4f7d-bc91-9b1f52e91a01"
},
{
"id": "a2e5d6b4-9c1f-4c7b-b9a7-6f2a5d4b1a99",
"name": "Roles & Permissions",
"icon_url": "/icons/roles.svg",
"url": "/master/roles",
"sequence": 3,
"mode": "desktop",
"table_name": "m_roles",
"status": "active",
"parent_id": "c1a8f3b0-1234-4f7d-bc91-9b1f52e91a01"
},
{
"id": "e9f6a2c7-8b1d-45ac-a0b3-6c8b52d8a5e3",
"name": "Products",
"icon_url": "/icons/products.svg",
"url": "/master/products",
"sequence": 4,
"mode": "desktop",
"table_name": "m_products",
"status": "active",
"parent_id": null
},
{
"id": "d3b7e1f5-4c2a-496b-9e9a-2c9d7d3f6f1b",
"name": "Reports",
"icon_url": "/icons/reports.svg",
"url": "/reports",
"sequence": 5,
"mode": "desktop",
"table_name": "m_reports",
"status": "inactive",
"parent_id": null
}
]

View File

@ -0,0 +1,50 @@
[
{
"name": "View-Dashboard",
"menu_name": "Dashboard"
},
{
"name": "Create-User",
"menu_name": "Users"
},
{
"name": "Edit-User",
"menu_name": "Users"
},
{
"name": "Delete-User",
"menu_name": "Users"
},
{
"name": "View-Roles",
"menu_name": "Roles & Permissions"
},
{
"name": "Assign-Role-Permission",
"menu_name": "Roles & Permissions"
},
{
"name": "View-Products",
"menu_name": "Products"
},
{
"name": "Add-Product",
"menu_name": "Products"
},
{
"name": "Edit-Product",
"menu_name": "Products"
},
{
"name": "Delete-Product",
"menu_name": "Products"
},
{
"name": "Generate-Report",
"menu_name": "Reports"
},
{
"name": "Export-Report",
"menu_name": "Reports"
}
]

View File

@ -0,0 +1,96 @@
[
{
"role_name": "Super Admin",
"permission_name": "View-Dashboard"
},
{
"role_name": "Super Admin",
"permission_name": "Create-User"
},
{
"role_name": "Super Admin",
"permission_name": "Edit-User"
},
{
"role_name": "Super Admin",
"permission_name": "Delete-User"
},
{
"role_name": "Super Admin",
"permission_name": "View-Roles"
},
{
"role_name": "Super Admin",
"permission_name": "Assign-Role-Permission"
},
{
"role_name": "Super Admin",
"permission_name": "View-Products"
},
{
"role_name": "Super Admin",
"permission_name": "Add-Product"
},
{
"role_name": "Super Admin",
"permission_name": "Edit-Product"
},
{
"role_name": "Super Admin",
"permission_name": "Delete-Product"
},
{
"role_name": "Super Admin",
"permission_name": "Generate-Report"
},
{
"role_name": "Super Admin",
"permission_name": "Export-Report"
},
{
"role_name": "Admin",
"permission_name": "View-Dashboard"
},
{
"role_name": "Admin",
"permission_name": "Create-User"
},
{
"role_name": "Admin",
"permission_name": "Edit-User"
},
{
"role_name": "Admin",
"permission_name": "View-Roles"
},
{
"role_name": "Admin",
"permission_name": "Assign-Role-Permission"
},
{
"role_name": "Admin",
"permission_name": "View-Products"
},
{
"role_name": "Admin",
"permission_name": "Add-Product"
},
{
"role_name": "Admin",
"permission_name": "Edit-Product"
},
{
"role_name": "Admin",
"permission_name": "Generate-Report"
},
{
"role_name": "User",
"permission_name": "View-Dashboard"
},
{
"role_name": "User",
"permission_name": "View-Products"
}
]

View File

@ -0,0 +1,102 @@
package seeds
import (
"encoding/json"
"fmt"
"io"
"os"
"github.com/Caknoooo/go-gin-clean-starter/database/entities"
"github.com/google/uuid"
"gorm.io/gorm"
)
// {
// "id": "d3b7e1f5-4c2a-496b-9e9a-2c9d7d3f6f1b",
// "name": "Reports",
// "icon_url": "/icons/reports.svg",
// "url": "/reports",
// "sequence": 5,
// "mode": "desktop",
// "table_name": "m_reports",
// "status": "inactive",
// "parent_id": null
// }
type MenuSeed struct {
ID string `json:"id"`
Name string `json:"name"`
IconUrl string `json:"icon_url"`
URL string `json:"url"`
Sequence int `json:"sequence"`
Mode string `json:"mode"`
TableName string `json:"table_name"`
Status string `json:"status"`
ParentID string `json:"parent_id"`
}
func ListMenuSeeder(db *gorm.DB) error {
jsonFile, err := os.Open("./database/seeders/json/menus.json")
if err != nil {
fmt.Println("Error opening file:", err)
return err
}
jsonData, err := io.ReadAll(jsonFile)
if err != nil {
fmt.Println("Error reading file:", err)
return err
}
var listMenu []MenuSeed
if err := json.Unmarshal(jsonData, &listMenu); err != nil {
fmt.Println("Error unmarshalling JSON:", err)
return err
}
hasTable := db.Migrator().HasTable(&entities.M_Menu{})
if !hasTable {
fmt.Println("Creating table: M_Menu")
if err := db.Migrator().CreateTable(&entities.M_Menu{}); err != nil {
return err
}
}
for _, data := range listMenu {
var parentUUID *uuid.UUID
if data.ParentID != "" {
parsed, err := uuid.Parse(data.ParentID)
if err != nil {
fmt.Println("Error parsing ParentID:", err)
return err
}
parentUUID = &parsed
}
menuID := uuid.Nil
if data.ID != "" {
parsedID, err := uuid.Parse(data.ID)
if err != nil {
fmt.Println("Error parsing Menu ID:", err)
return err
}
menuID = parsedID
}
menu := entities.M_Menu{
ID: menuID,
Name: data.Name,
IconUrl: data.IconUrl,
Url: data.URL,
Sequence: data.Sequence,
Mode: data.Mode,
TableName: data.TableName,
Status: data.Status,
ParentID: parentUUID,
}
if err := db.Where("name = ?", data.Name).FirstOrCreate(&menu).Error; err != nil {
fmt.Println("Error seeding Menu:", err)
return err
}
}
return nil
}

View File

@ -0,0 +1,65 @@
package seeds
import (
"encoding/json"
"fmt"
"io"
"os"
"github.com/Caknoooo/go-gin-clean-starter/database/entities"
"gorm.io/gorm"
)
type PermissionSeed struct {
ID string `json:"id"`
Name string `json:"name"`
MenuName string `json:"menu_name"`
}
func ListPermissionSeeder(db *gorm.DB) error {
jsonFile, err := os.Open("./database/seeders/json/permissions.json")
if err != nil {
fmt.Println("Error opening file:", err)
return err
}
jsonData, err := io.ReadAll(jsonFile)
if err != nil {
fmt.Println("Error reading file:", err)
return err
}
var listPermission []PermissionSeed
if err := json.Unmarshal(jsonData, &listPermission); err != nil {
fmt.Println("Error unmarshalling JSON:", err)
return err
}
hasTable := db.Migrator().HasTable(&entities.M_Permissions{})
if !hasTable {
fmt.Println("Creating table: M_Permissions")
if err := db.Migrator().CreateTable(&entities.M_Permissions{}); err != nil {
return err
}
}
for _, data := range listPermission {
var permission entities.M_Permissions
var menu entities.M_Menu
if err := db.Where("name = ?", data.MenuName).First(&menu).Error; err != nil {
fmt.Println("Menu not found:", err)
return err // menu tidak ditemukan
}
if err := db.FirstOrCreate(&permission, entities.M_Permissions{
Name: data.Name,
MenuID: menu.ID,
}).Error; err != nil {
fmt.Println("Error seeding permission:", err)
return err
}
}
return nil
}

View File

@ -0,0 +1,59 @@
package seeds
import (
"encoding/json"
"io"
"os"
"github.com/Caknoooo/go-gin-clean-starter/database/entities"
"github.com/sirupsen/logrus"
"gorm.io/gorm"
)
type RolePermissionSeed struct {
RoleName string `json:"role_name"`
PermissionName string `json:"permission_name"`
}
func ListRolePermissionSeeder(db *gorm.DB) error {
jsonFile, err := os.Open("./database/seeders/json/role_permissions.json")
if err != nil {
return err
}
jsonData, err := io.ReadAll(jsonFile)
if err != nil {
return err
}
var listRolePermission []RolePermissionSeed
if err := json.Unmarshal(jsonData, &listRolePermission); err != nil {
return err
}
hasTable := db.Migrator().HasTable(&entities.M_Role_Permission{})
if !hasTable {
if err := db.Migrator().CreateTable(&entities.M_Role_Permission{}); err != nil {
return err
}
}
for _, data := range listRolePermission {
var role entities.M_Role
var permission entities.M_Permissions
if err := db.Where("name = ?", data.RoleName).First(&role).Error; err != nil {
logrus.Error("Role not found: ", err)
return err // role tidak ditemukan
}
if err := db.Where("name = ?", data.PermissionName).First(&permission).Error; err != nil {
logrus.Error("Permission not found: ", err)
return err // permission tidak ditemukan
}
var rolePermission entities.M_Role_Permission
if err := db.FirstOrCreate(&rolePermission, entities.M_Role_Permission{
RoleID: role.ID,
PermissionID: permission.ID,
}).Error; err != nil {
return err
}
}
return nil
}