feat: Implement seeders for menus, permissions, and role-permission associations
This commit is contained in:
parent
bd93da6264
commit
37d656999e
|
|
@ -8,10 +8,8 @@ type M_Permissions struct {
|
||||||
ID uuid.UUID `gorm:"type:uuid;primary_key;default:uuid_generate_v4()" json:"id"`
|
ID uuid.UUID `gorm:"type:uuid;primary_key;default:uuid_generate_v4()" json:"id"`
|
||||||
Name string `gorm:"type:varchar(100);not null" json:"name"`
|
Name string `gorm:"type:varchar(100);not null" json:"name"`
|
||||||
MenuID uuid.UUID `gorm:"type:uuid;not null;index" json:"menu_id"`
|
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"`
|
Menu M_Menu `gorm:"foreignKey:MenuID;references:ID"`
|
||||||
Role M_Role `gorm:"foreignKey:RoleID;references:ID"`
|
|
||||||
|
|
||||||
FullAuditTrail
|
FullAuditTrail
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,11 +5,10 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
type M_Role_Permission struct {
|
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"`
|
RoleID uuid.UUID `gorm:"type:uuid;not null;index" json:"role_id"`
|
||||||
PermissionID uuid.UUID `gorm:"type:uuid;not null;index" json:"permission_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"`
|
Permission M_Permissions `gorm:"foreignKey:PermissionID;references:ID"`
|
||||||
|
|
||||||
FullAuditTrail
|
FullAuditTrail
|
||||||
|
|
|
||||||
|
|
@ -8,9 +8,12 @@ import (
|
||||||
func Seeder(db *gorm.DB) error {
|
func Seeder(db *gorm.DB) error {
|
||||||
seeders := []func(*gorm.DB) error{
|
seeders := []func(*gorm.DB) error{
|
||||||
seeds.ListClientSeeder,
|
seeds.ListClientSeeder,
|
||||||
|
seeds.ListMenuSeeder,
|
||||||
seeds.ListUserSeeder,
|
seeds.ListUserSeeder,
|
||||||
seeds.ListRoleSeeder,
|
seeds.ListRoleSeeder,
|
||||||
seeds.ListUserRoleSeeder,
|
seeds.ListUserRoleSeeder,
|
||||||
|
seeds.ListPermissionSeeder,
|
||||||
|
seeds.ListRolePermissionSeeder,
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, seeder := range seeders {
|
for _, seeder := range seeders {
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
@ -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"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
@ -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"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue