feat: Add many-to-many relationship between menus and clients with seeder support
This commit is contained in:
parent
7fa3971c70
commit
04cfb9719b
|
|
@ -14,6 +14,8 @@ type M_Client struct {
|
||||||
Users []M_User `gorm:"foreignKey:ClientID;references:ID" json:"users"`
|
Users []M_User `gorm:"foreignKey:ClientID;references:ID" json:"users"`
|
||||||
MaintenanceGroups []M_MaintenanceGroup `gorm:"foreignKey:ClientID;references:ID" json:"maintenance_groups"`
|
MaintenanceGroups []M_MaintenanceGroup `gorm:"foreignKey:ClientID;references:ID" json:"maintenance_groups"`
|
||||||
Roles []M_Role `gorm:"foreignKey:ClientID;references:ID" json:"roles"`
|
Roles []M_Role `gorm:"foreignKey:ClientID;references:ID" json:"roles"`
|
||||||
|
MenusClients []M_Menu_Client `gorm:"foreignKey:ClientID;references:ID" json:"menus_clients"`
|
||||||
|
Menus []M_Menu `gorm:"many2many:m_menu_clients;joinForeignKey:ClientID;JoinReferences:MenuID" json:"menus"`
|
||||||
|
|
||||||
FullAuditTrail
|
FullAuditTrail
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,9 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
type M_Menu_Client struct {
|
type M_Menu_Client struct {
|
||||||
ID uuid.UUID `gorm:"type:uuid;primary_key;default:uuid_generate_v4()" json:"id"`
|
|
||||||
MenuID uuid.UUID `gorm:"type:uuid;not null;index" json:"menu_id"`
|
MenuID uuid.UUID `gorm:"type:uuid;not null;index" json:"menu_id"`
|
||||||
ClientID uuid.UUID `gorm:"type:uuid;not null;index" json:"client_id"`
|
ClientID uuid.UUID `gorm:"type:uuid;not null;index" json:"client_id"`
|
||||||
|
|
||||||
|
M_Menu M_Menu `gorm:"foreignKey:MenuID;references:ID;constraint:OnUpdate:CASCADE,OnDelete:CASCADE" json:"m_menu"`
|
||||||
|
Client M_Client `gorm:"foreignKey:ClientID;references:ID;constraint:OnUpdate:CASCADE,OnDelete:CASCADE" json:"client"`
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -15,9 +15,11 @@ type M_Menu struct {
|
||||||
Status string `gorm:"type:varchar(50);not null" json:"status"`
|
Status string `gorm:"type:varchar(50);not null" json:"status"`
|
||||||
ParentID *uuid.UUID `gorm:"type:uuid" json:"parent_id"`
|
ParentID *uuid.UUID `gorm:"type:uuid" json:"parent_id"`
|
||||||
|
|
||||||
Children []M_Menu `gorm:"foreignKey:ParentID;references:ID" json:"children"`
|
Children []M_Menu `gorm:"foreignKey:ParentID;references:ID" json:"children"`
|
||||||
RoleMenus []M_Role_Menu `gorm:"foreignKey:MenuID;references:ID" json:"role_menus"`
|
RoleMenus []M_Role_Menu `gorm:"foreignKey:MenuID;references:ID" json:"role_menus"`
|
||||||
Permissions []M_Permissions `gorm:"foreignKey:MenuID;references:ID" json:"permissions"`
|
Permissions []M_Permissions `gorm:"foreignKey:MenuID;references:ID" json:"permissions"`
|
||||||
|
MenusClients []M_Menu_Client `gorm:"foreignKey:MenuID;references:ID" json:"menus_clients"`
|
||||||
|
Clients []M_Client `gorm:"many2many:m_menu_clients;joinForeignKey:MenuID;JoinReferences:ClientID" json:"clients"`
|
||||||
|
|
||||||
FullAuditTrail
|
FullAuditTrail
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -15,6 +15,7 @@ func Seeder(db *gorm.DB) error {
|
||||||
seeds.ListPermissionSeeder,
|
seeds.ListPermissionSeeder,
|
||||||
seeds.ListRolePermissionSeeder,
|
seeds.ListRolePermissionSeeder,
|
||||||
seeds.ListRoleMenuSeeder,
|
seeds.ListRoleMenuSeeder,
|
||||||
|
seeds.ListMenuClientSeeder,
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, seeder := range seeders {
|
for _, seeder := range seeders {
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,102 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"menu_name": "Dashboard",
|
||||||
|
"client_name": "PT Teknologi Maju Indonesia"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"menu_name": "Users",
|
||||||
|
"client_name": "PT Teknologi Maju Indonesia"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"menu_name": "Roles & Permissions",
|
||||||
|
"client_name": "PT Teknologi Maju Indonesia"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"menu_name": "Products",
|
||||||
|
"client_name": "PT Teknologi Maju Indonesia"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"menu_name": "Reports",
|
||||||
|
"client_name": "PT Teknologi Maju Indonesia"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"menu_name": "Dashboard",
|
||||||
|
"client_name": "CV Sumber Rejeki Abadi"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"menu_name": "Users",
|
||||||
|
"client_name": "CV Sumber Rejeki Abadi"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"menu_name": "Roles & Permissions",
|
||||||
|
"client_name": "CV Sumber Rejeki Abadi"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"menu_name": "Products",
|
||||||
|
"client_name": "CV Sumber Rejeki Abadi"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"menu_name": "Reports",
|
||||||
|
"client_name": "CV Sumber Rejeki Abadi"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"menu_name": "Dashboard",
|
||||||
|
"client_name": "PT Logistik Nusantara Prima"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"menu_name": "Users",
|
||||||
|
"client_name": "PT Logistik Nusantara Prima"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"menu_name": "Roles & Permissions",
|
||||||
|
"client_name": "PT Logistik Nusantara Prima"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"menu_name": "Products",
|
||||||
|
"client_name": "PT Logistik Nusantara Prima"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"menu_name": "Reports",
|
||||||
|
"client_name": "PT Logistik Nusantara Prima"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"menu_name": "Dashboard",
|
||||||
|
"client_name": "UD Mandiri Sejahtera"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"menu_name": "Users",
|
||||||
|
"client_name": "UD Mandiri Sejahtera"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"menu_name": "Roles & Permissions",
|
||||||
|
"client_name": "UD Mandiri Sejahtera"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"menu_name": "Products",
|
||||||
|
"client_name": "UD Mandiri Sejahtera"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"menu_name": "Reports",
|
||||||
|
"client_name": "UD Mandiri Sejahtera"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"menu_name": "Dashboard",
|
||||||
|
"client_name": "PT Global Supply Chain"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"menu_name": "Users",
|
||||||
|
"client_name": "PT Global Supply Chain"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"menu_name": "Roles & Permissions",
|
||||||
|
"client_name": "PT Global Supply Chain"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"menu_name": "Products",
|
||||||
|
"client_name": "PT Global Supply Chain"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"menu_name": "Reports",
|
||||||
|
"client_name": "PT Global Supply Chain"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
@ -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 MenuClientSeed struct {
|
||||||
|
MenuName string `json:"menu_name"`
|
||||||
|
ClientName string `json:"client_name"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func ListMenuClientSeeder(db *gorm.DB) error {
|
||||||
|
jsonFile, err := os.Open("./database/seeders/json/menu_clients.json")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
jsonData, err := io.ReadAll(jsonFile)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
var listMenuClient []MenuClientSeed
|
||||||
|
if err := json.Unmarshal(jsonData, &listMenuClient); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
hasTable := db.Migrator().HasTable(&entities.M_Menu_Client{})
|
||||||
|
if !hasTable {
|
||||||
|
if err := db.Migrator().CreateTable(&entities.M_Menu_Client{}); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for _, data := range listMenuClient {
|
||||||
|
var menu entities.M_Menu
|
||||||
|
var client entities.M_Client
|
||||||
|
if err := db.Where("name = ?", data.MenuName).First(&menu).Error; err != nil {
|
||||||
|
logrus.Error("Menu not found: ", err)
|
||||||
|
return err // menu tidak ditemukan
|
||||||
|
}
|
||||||
|
if err := db.Where("name = ?", data.ClientName).First(&client).Error; err != nil {
|
||||||
|
logrus.Error("Client not found: ", err)
|
||||||
|
return err // client tidak ditemukan
|
||||||
|
}
|
||||||
|
var menuClient entities.M_Menu_Client
|
||||||
|
if err := db.FirstOrCreate(&menuClient, entities.M_Menu_Client{
|
||||||
|
MenuID: menu.ID,
|
||||||
|
ClientID: client.ID,
|
||||||
|
}).Error; err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue