feat: Add new entities for maintenance management and user roles

- Created M_Location, M_MaintenanceGroup, M_MaintenanceGroupRole, M_MaintenanceGroupUser, M_MaintenanceScheduleHeader, M_MaintenanceScheduleLine, M_MaintenanceStaff, M_Menu_Client, M_Menu, M_Permissions, M_Role, M_Role_Menu, M_Role_Permission, M_User, M_User_Role entities.
- Implemented relationships and foreign keys for user roles and permissions.
- Added JSON seed files for roles and user roles, along with corresponding seed functions.
- Updated migration and seeder files to include new entities and ensure proper database setup.
- Commented out legacy product and tenant entities and their seed functions for future reference.
This commit is contained in:
Habib Fatkhul Rohman 2025-10-21 15:06:43 +07:00
parent 3cf87f7527
commit 465908965e
28 changed files with 693 additions and 202 deletions

View File

@ -0,0 +1,19 @@
package entities
import "github.com/google/uuid"
type M_Client 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"`
PIC string `gorm:"type:varchar(100)" json:"pic"`
Phone string `gorm:"type:varchar(20)" json:"phone"`
Email string `gorm:"type:varchar(100)" json:"email"`
Address string `gorm:"type:text" json:"address"`
LogoUrl string `gorm:"type:varchar(255)" json:"logo_url"`
Users []M_User `gorm:"foreignKey:ClientID;references:ID" json:"users"`
MaintenanceGroups []M_MaintenanceGroup `gorm:"foreignKey:ClientID;references:ID" json:"maintenance_groups"`
Roles []M_Role `gorm:"foreignKey:ClientID;references:ID" json:"roles"`
FullAuditTrail
}

View File

@ -0,0 +1,18 @@
package entities
import (
"github.com/google/uuid"
)
type M_Location 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"`
Description string `gorm:"type:text" json:"description"`
ClientID uuid.UUID `gorm:"type:uuid;not null" json:"client_id"`
SiteID uuid.UUID `gorm:"type:uuid;not null" json:"site_id"`
CategoryID uuid.UUID `gorm:"type:uuid;not null" json:"category_id"`
PatchCode string `gorm:"type:varchar(50)" json:"patch_code"`
DisposalLocation bool `gorm:"default:false" json:"disposal_location"`
FullAuditTrail
}

View File

@ -0,0 +1,15 @@
package entities
import "github.com/google/uuid"
type M_MaintenanceGroup struct {
ID uuid.UUID `gorm:"type:uuid;primary_key;default:uuid_generate_v4()" json:"id"`
Code string `gorm:"type:varchar(50);uniqueIndex;not null" json:"code"`
Name string `gorm:"type:varchar(100);not null" json:"name"`
Description string `gorm:"type:text" json:"description"`
ClientID uuid.UUID `gorm:"type:uuid;not null;index" json:"client_id"`
Client M_Client `gorm:"foreignKey:ClientID;references:ID"`
FullAuditTrail
}

View File

@ -0,0 +1,13 @@
package entities
import "github.com/google/uuid"
type M_MaintenanceGroupRole struct {
ID uuid.UUID `gorm:"type:uuid;primary_key;default:uuid_generate_v4()" json:"id"`
MaintenanceGroupID uuid.UUID `gorm:"type:uuid;not null;index" json:"maintenance_group_id"`
RoleID uuid.UUID `gorm:"type:uuid;not null;index" json:"role_id"`
ClientID uuid.UUID `gorm:"type:uuid;not null;index" json:"client_id"`
Level int `gorm:"not null" json:"level"`
FullAuditTrail
}

View File

@ -0,0 +1,12 @@
package entities
import "github.com/google/uuid"
type M_MaintenanceGroupUser struct {
ID uuid.UUID `gorm:"type:uuid;primary_key;default:uuid_generate_v4()" json:"id"`
MaintenanceGroupRoleID uuid.UUID `gorm:"type:uuid;not null;index" json:"maintenance_group_role_id"`
UserID uuid.UUID `gorm:"type:uuid;not null;index" json:"user_id"`
ClientID uuid.UUID `gorm:"type:uuid;not null;index" json:"client_id"`
FullAuditTrail
}

View File

@ -0,0 +1,35 @@
package entities
import (
"time"
"github.com/google/uuid"
)
type M_MaintenanceScheduleHeader struct {
ID uuid.UUID `gorm:"type:uuid;primary_key;default:uuid_generate_v4()" json:"id"`
MaintenanceGroupID uuid.UUID `gorm:"type:uuid;not null;index" json:"maintenance_group_id"`
CategoryID uuid.UUID `gorm:"type:uuid;not null;index" json:"category_id"`
LocationID uuid.UUID `gorm:"type:uuid;not null;index" json:"location_id"`
SpvCreatedId uuid.UUID `gorm:"type:uuid;not null;index" json:"spv_created_id"`
SpvAssignId uuid.UUID `gorm:"type:uuid;not null;index" json:"spv_assign_id"`
Name string `gorm:"type:varchar(100);not null" json:"name"`
Notes string `gorm:"type:text" json:"notes"`
AttachmentUrl string `gorm:"type:varchar(255)" json:"attachment_url"`
IntervalNumber int `gorm:"not null" json:"interval_number"`
IntervalUom uuid.UUID `gorm:"type:uuid;not null;index" json:"interval_uom"`
ApprovalStatus string `gorm:"type:varchar(50);not null" json:"approval_status"`
EndDate time.Time `json:"end_date"`
StartDate time.Time `json:"start_date"`
DocumentNo string `gorm:"type:varchar(50);uniqueIndex;not null" json:"document_no"`
OnDay int `json:"on_day"`
OnMonth int `json:"on_month"`
Repeat string `gorm:"type:varchar(50);not null" json:"repeat"`
RepeatEvery int `json:"repeat_every"`
Weeks string `gorm:"type:varchar(100)" json:"weeks"`
AssetID uuid.UUID `gorm:"type:uuid;index" json:"asset_id"`
StandardMaintenanceID uuid.UUID `gorm:"type:uuid;index" json:"standard_maintenance_id"`
ClientID uuid.UUID `gorm:"type:uuid;not null;index" json:"client_id"`
FullAuditTrail
}

View File

@ -0,0 +1,23 @@
package entities
import (
"time"
"github.com/google/uuid"
)
type M_MaintenanceScheduleLine struct {
ID uuid.UUID `gorm:"type:uuid;primary_key;default:uuid_generate_v4()" json:"id"`
MaintenanceScheduleHeaderID uuid.UUID `gorm:"type:uuid;not null;index" json:"maintenance_schedule_header_id"`
StaffID uuid.UUID `gorm:"type:uuid;not null;index" json:"staff_id"`
Notes string `gorm:"type:text" json:"notes"`
PlannedDate time.Time `gorm:"type:timestamp;not null" json:"planned_date"`
DueDate time.Time `gorm:"type:timestamp;not null" json:"due_date"`
AssetID uuid.UUID `gorm:"type:uuid;not null;index" json:"asset_id"`
TaskDescription string `gorm:"type:text" json:"task_description"`
CategoryID uuid.UUID `gorm:"type:uuid;not null;index" json:"category_id"`
LocationID uuid.UUID `gorm:"type:uuid;not null;index" json:"location_id"`
ClientID uuid.UUID `gorm:"type:uuid;not null;index" json:"client_id"`
FullAuditTrail
}

View File

@ -0,0 +1,17 @@
package entities
import (
"github.com/google/uuid"
)
type M_MaintenanceStaff struct {
ID uuid.UUID `gorm:"type:uuid;primary_key;default:uuid_generate_v4()" json:"id"`
MaintenanceSpvID uuid.UUID `gorm:"type:uuid;not null;index" json:"maintenance_spv_id"`
StaffID uuid.UUID `gorm:"type:uuid;not null;index" json:"staff_id"`
Description string `gorm:"type:text" json:"description"`
CategoryID uuid.UUID `gorm:"type:uuid;not null;index" json:"category_id"`
SiteID uuid.UUID `gorm:"type:uuid;not null;index" json:"site_id"`
ClientID uuid.UUID `gorm:"type:uuid;not null;index" json:"client_id"`
FullAuditTrail
}

View File

@ -0,0 +1,11 @@
package entities
import (
"github.com/google/uuid"
)
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"`
ClientID uuid.UUID `gorm:"type:uuid;not null;index" json:"client_id"`
}

View File

@ -0,0 +1,23 @@
package entities
import (
"github.com/google/uuid"
)
type M_Menu 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"`
IconUrl string `gorm:"type:varchar(255)" json:"icon_url"`
Url string `gorm:"type:varchar(255);not null" json:"url"`
Sequence int `gorm:"type:int;not null" json:"sequence"`
Mode string `gorm:"type:varchar(50);not null" json:"mode"`
TableName string `gorm:"type:varchar(100)" json:"table_name"`
Status string `gorm:"type:varchar(50);not null" json:"status"`
ParentID *uuid.UUID `gorm:"type:uuid" json:"parent_id"`
Children []M_Menu `gorm:"foreignKey:ParentID;references:ID" json:"children"`
RoleMenus []M_Role_Menu `gorm:"foreignKey:MenuID;references:ID" json:"role_menus"`
Permissions []M_Permissions `gorm:"foreignKey:MenuID;references:ID" json:"permissions"`
FullAuditTrail
}

View File

@ -0,0 +1,17 @@
package entities
import (
"github.com/google/uuid"
)
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

@ -0,0 +1,42 @@
package entities
import "github.com/google/uuid"
type M_Role 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"`
Description string `gorm:"type:text" json:"description"`
IconUrl string `gorm:"type:varchar(255)" json:"icon_url"`
Type string `gorm:"type:varchar(50);not null" json:"type"`
HomeUrl string `gorm:"type:varchar(255)" json:"home_url"`
ClientID uuid.UUID `gorm:"type:uuid;not null;index" json:"client_id"`
Client M_Client `gorm:"foreignKey:ClientID;references:ID"`
RoleMenus []M_Role_Menu `gorm:"foreignKey:RoleID;references:ID" json:"role_menus"`
RolePermissions []M_Role_Permission `gorm:"foreignKey:RoleID;references:ID" json:"role_permissions"`
UserRoles []M_User_Role `gorm:"foreignKey:RoleID;references:ID" json:"user_roles"`
Users []M_User `gorm:"many2many:m_user_roles;" json:"users"`
Permissions []M_Permissions `gorm:"many2many:m_role_permissions;joinForeignKey:RoleID;JoinReferences:PermissionID" json:"permissions"`
FullAuditTrail
}
// Assign role ke user
// userRole := M_User_Role{
// UserID: userID,
// RoleID: roleID,
// }
// db.Create(&userRole)
// // Get user dengan roles
// var user M_User
// db.Preload("Roles").First(&user, userID)
// // Get role dengan users
// var role M_Role
// db.Preload("Users").First(&role, roleID)
// // Check apakah user memiliki role tertentu
// var count int64
// db.Model(&M_User_Role{}).Where("user_id = ? AND role_id = ?", userID, roleID).Count(&count)
// hasRole := count > 0

View File

@ -0,0 +1,16 @@
package entities
import (
"github.com/google/uuid"
)
type M_Role_Menu 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"`
MenuID uuid.UUID `gorm:"type:uuid;not null;index" json:"menu_id"`
Role M_Role `gorm:"foreignKey:RoleID;references:ID"`
Menu M_Menu `gorm:"foreignKey:MenuID;references:ID"`
FullAuditTrail
}

View File

@ -0,0 +1,16 @@
package entities
import (
"github.com/google/uuid"
)
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"`
Permission M_Permissions `gorm:"foreignKey:PermissionID;references:ID"`
FullAuditTrail
}

View File

@ -0,0 +1,23 @@
package entities
import "github.com/google/uuid"
type M_User 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"`
Username string `gorm:"type:varchar(100);uniqueIndex;not null" json:"username"`
Password string `gorm:"type:varchar(255);not null" json:"password"`
Gender string `gorm:"type:varchar(10)" json:"gender"`
Address string `gorm:"type:text" json:"address"`
Phone string `gorm:"type:varchar(20);index" json:"phone"`
Email string `gorm:"type:varchar(255);uniqueIndex;not null" json:"email"`
PhotoUrl string `gorm:"type:varchar(255)" json:"photo_url"`
ClientID uuid.UUID `gorm:"type:uuid;not null;index" json:"client_id"`
MaintenanceGroupUserID uuid.UUID `gorm:"type:uuid;index" json:"maintenance_group_user_id"`
LocationID uuid.UUID `gorm:"type:uuid;index" json:"location_id"`
Client M_Client `gorm:"foreignKey:ClientID;references:ID"`
UserRoles []M_User_Role `gorm:"foreignKey:UserID;references:ID" json:"user_roles"`
Roles []M_Role `gorm:"many2many:m_user_roles;foreignKey:ID;joinForeignKey:UserID;References:ID;JoinReferences:RoleID" json:"roles"`
FullAuditTrail
}

View File

@ -0,0 +1,14 @@
package entities
import "github.com/google/uuid"
type M_User_Role struct {
// Timestamp
UserID uuid.UUID `gorm:"type:uuid;not null;index" json:"user_id"`
RoleID uuid.UUID `gorm:"type:uuid;not null;index" json:"role_id"`
User M_User `gorm:"foreignKey:UserID;references:ID"`
Role M_Role `gorm:"foreignKey:RoleID;references:ID"`
Timestamp
}

View File

@ -1,16 +1,16 @@
package entities package entities
import ( // import (
"github.com/google/uuid" // "github.com/google/uuid"
) // )
type Product struct { // type Product 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"`
Price float64 `gorm:"type:numeric;not null" json:"price"` // Price float64 `gorm:"type:numeric;not null" json:"price"`
TenantID uuid.UUID `gorm:"type:uuid;null;index" json:"tenant_id"` // TenantID uuid.UUID `gorm:"type:uuid;null;index" json:"tenant_id"`
Tenant Tenant `gorm:"foreignKey:TenantID;constraint:OnUpdate:CASCADE,OnDelete:SET NULL;" json:"tenant"` // Tenant Tenant `gorm:"foreignKey:TenantID;constraint:OnUpdate:CASCADE,OnDelete:SET NULL;" json:"tenant"`
Timestamp // Timestamp
} // }

View File

@ -1,14 +1,14 @@
package entities package entities
import ( // import (
"github.com/google/uuid" // "github.com/google/uuid"
) // )
type Tenant struct { // type Tenant 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"`
Products []Product `gorm:"foreignKey:TenantID" json:"products"` // Products []Product `gorm:"foreignKey:TenantID" json:"products"`
Users []User `gorm:"foreignKey:TenantID" json:"users"` // Users []User `gorm:"foreignKey:TenantID" json:"users"`
Timestamp // Timestamp
} // }

View File

@ -1,58 +1,59 @@
package entities package entities
import ( // import (
"github.com/Caknoooo/go-gin-clean-starter/pkg/helpers" // "github.com/Caknoooo/go-gin-clean-starter/pkg/helpers"
"github.com/google/uuid" // "github.com/google/uuid"
"gorm.io/gorm" // "gorm.io/gorm"
) // )
type User struct { // type User 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"`
Email string `gorm:"type:varchar(255);uniqueIndex;not null" json:"email"` // Email string `gorm:"type:varchar(255);uniqueIndex;not null" json:"email"`
TelpNumber string `gorm:"type:varchar(20);index" json:"telp_number"` // TelpNumber string `gorm:"type:varchar(20);index" json:"telp_number"`
Password string `gorm:"type:varchar(255);not null" json:"password"` // Password string `gorm:"type:varchar(255);not null" json:"password"`
Role string `gorm:"type:varchar(50);not null;default:'user'" json:"role"` // Role string `gorm:"type:varchar(50);not null;default:'user'" json:"role"`
ImageUrl string `gorm:"type:varchar(255)" json:"image_url"` // ImageUrl string `gorm:"type:varchar(255)" json:"image_url"`
IsVerified bool `gorm:"default:false" json:"is_verified"` // IsVerified bool `gorm:"default:false" json:"is_verified"`
TenantID uuid.UUID `gorm:"type:uuid;null;index" json:"tenant_id"` // TenantID uuid.UUID `gorm:"type:uuid;null;index" json:"tenant_id"`
Tenant Tenant `gorm:"foreignKey:TenantID;constraint:OnUpdate:CASCADE,OnDelete:SET NULL;" json:"tenant"` // Tenant Tenant `gorm:"foreignKey:TenantID;constraint:OnUpdate:CASCADE,OnDelete:SET NULL;" json:"tenant"`
// UserRoles []M_User_Role `gorm:"foreignKey:UserID"` // atau relasi many-to-many
Timestamp // FullAuditTrail
} // }
// BeforeCreate hook to hash password and set defaults // // BeforeCreate hook to hash password and set defaults
func (u *User) BeforeCreate(_ *gorm.DB) (err error) { // func (u *User) BeforeCreate(_ *gorm.DB) (err error) {
// Hash password // // Hash password
if u.Password != "" { // if u.Password != "" {
u.Password, err = helpers.HashPassword(u.Password) // u.Password, err = helpers.HashPassword(u.Password)
if err != nil { // if err != nil {
return err // return err
} // }
} // }
// Ensure UUID is set // // Ensure UUID is set
if u.ID == uuid.Nil { // if u.ID == uuid.Nil {
u.ID = uuid.New() // u.ID = uuid.New()
} // }
// Set default role if not specified // // Set default role if not specified
if u.Role == "" { // if u.Role == "" {
u.Role = "user" // u.Role = "user"
} // }
return nil // return nil
} // }
// BeforeUpdate hook to handle password updates // // BeforeUpdate hook to handle password updates
func (u *User) BeforeUpdate(_ *gorm.DB) (err error) { // func (u *User) BeforeUpdate(_ *gorm.DB) (err error) {
// Only hash password if it has been changed // // Only hash password if it has been changed
if u.Password != "" { // if u.Password != "" {
u.Password, err = helpers.HashPassword(u.Password) // u.Password, err = helpers.HashPassword(u.Password)
if err != nil { // if err != nil {
return err // return err
} // }
} // }
return nil // return nil
} // }

View File

@ -11,10 +11,11 @@ func Migrate(db *gorm.DB) error {
&entities.M_User{}, &entities.M_User{},
&entities.RefreshToken{}, &entities.RefreshToken{},
&entities.M_Menu{}, &entities.M_Menu{},
&entities.M_MaintenanceGroup{},
&entities.M_Role{}, &entities.M_Role{},
&entities.M_Role_Menu{},
&entities.M_Permissions{}, &entities.M_Permissions{},
&entities.M_MaintenanceGroup{},
&entities.M_User_Role{},
&entities.M_Role_Menu{},
&entities.M_Role_Permission{}, &entities.M_Role_Permission{},
); err != nil { ); err != nil {
return err return err
@ -28,16 +29,14 @@ func MigrateFresh(db *gorm.DB) error {
if err := db.Migrator().DropTable( if err := db.Migrator().DropTable(
&entities.M_Client{}, &entities.M_Client{},
&entities.M_User{}, &entities.M_User{},
&entities.M_Menu{},
&entities.M_MaintenanceGroup{},
&entities.M_Role{},
&entities.M_Role_Menu{},
&entities.M_Permissions{},
&entities.M_Role_Permission{},
&entities.Tenant{},
&entities.User{},
&entities.RefreshToken{}, &entities.RefreshToken{},
&entities.Product{}, &entities.M_Menu{},
&entities.M_Role{},
&entities.M_Permissions{},
&entities.M_MaintenanceGroup{},
&entities.M_User_Role{},
&entities.M_Role_Menu{},
&entities.M_Role_Permission{},
); err != nil { ); err != nil {
return err return err
} }

View File

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

View File

@ -0,0 +1,29 @@
[
{
"id": "a9e7c8b2-4f1a-4e6d-9c3e-1b2a3c4d5e6f",
"name": "Super Admin",
"description": "Super Administrator role",
"icon_url": "https://example.com/logo-super-admin.png",
"type": "system",
"home_url": "/admin/dashboard",
"client_name": "PT Teknologi Maju Indonesia"
},
{
"id": "a9e7c8b2-4f1a-4e6d-9c3e-1b2a3c4d5e6f",
"name": "Admin",
"description": "Administrator role",
"icon_url": "https://example.com/logo-admin.png",
"type": "system",
"home_url": "/admin/dashboard",
"client_name": "PT Teknologi Maju Indonesia"
},
{
"id": "b7d6e5c4-3a2b-4c1d-8e9f-0a1b2c3d4e5f",
"name": "User",
"description": "Regular user role",
"icon_url": "https://example.com/logo-user.png",
"type": "system",
"home_url": "/user/home",
"client_name": "PT Teknologi Maju Indonesia"
}
]

View File

@ -0,0 +1,14 @@
[
{
"name": "Super Admin",
"role_name": "Super Admin"
},
{
"name": "Admin",
"role_name": "Admin"
},
{
"name": "User",
"role_name": "User"
}
]

View File

@ -1,74 +1,23 @@
package seeds package seeds
import ( // import (
"encoding/json" // "encoding/json"
"errors" // "errors"
"io" // "io"
"os" // "os"
"github.com/Caknoooo/go-gin-clean-starter/database/entities" // "github.com/Caknoooo/go-gin-clean-starter/database/entities"
"gorm.io/gorm" // "gorm.io/gorm"
) // )
type ProductSeed struct { // type ProductSeed struct {
Name string `json:"name"` // Name string `json:"name"`
Price float64 `json:"price"` // Price float64 `json:"price"`
TenantName string `json:"tenant_name"` // TenantName string `json:"tenant_name"`
} // }
func ListProductSeeder(db *gorm.DB) error { // func ListProductSeeder(db *gorm.DB) error {
jsonFile, err := os.Open("./database/seeders/json/products.json") // jsonFile, err := os.Open("./database/seeders/json/products.json")
if err != nil {
return err
}
jsonData, err := io.ReadAll(jsonFile)
if err != nil {
return err
}
var listProduct []ProductSeed
if err := json.Unmarshal(jsonData, &listProduct); err != nil {
return err
}
hasTable := db.Migrator().HasTable(&entities.Product{})
if !hasTable {
if err := db.Migrator().CreateTable(&entities.Product{}); err != nil {
return err
}
}
for _, data := range listProduct {
var tenant entities.Tenant
if err := db.Where("name = ?", data.TenantName).First(&tenant).Error; err != nil {
return err // tenant tidak ditemukan
}
var product entities.Product
err := db.Where(&entities.Product{Name: data.Name}).First(&product).Error
if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
return err
}
isData := db.Find(&product, "name = ?", data.Name).RowsAffected
if isData == 0 {
newProduct := entities.Product{
Name: data.Name,
Price: data.Price,
TenantID: tenant.ID,
}
if err := db.Create(&newProduct).Error; err != nil {
return err
}
}
}
return nil
}
// func ListUserSeeder(db *gorm.DB) error {
// jsonFile, err := os.Open("./database/seeders/json/users.json")
// if err != nil { // if err != nil {
// return err // return err
// } // }
@ -78,28 +27,38 @@ func ListProductSeeder(db *gorm.DB) error {
// return err // return err
// } // }
// var listUser []entities.User // var listProduct []ProductSeed
// if err := json.Unmarshal(jsonData, &listUser); err != nil { // if err := json.Unmarshal(jsonData, &listProduct); err != nil {
// return err // return err
// } // }
// hasTable := db.Migrator().HasTable(&entities.User{}) // hasTable := db.Migrator().HasTable(&entities.Product{})
// if !hasTable { // if !hasTable {
// if err := db.Migrator().CreateTable(&entities.User{}); err != nil { // if err := db.Migrator().CreateTable(&entities.Product{}); err != nil {
// return err // return err
// } // }
// } // }
// for _, data := range listUser { // for _, data := range listProduct {
// var user entities.User // var tenant entities.Tenant
// err := db.Where(&entities.User{Email: data.Email}).First(&user).Error // if err := db.Where("name = ?", data.TenantName).First(&tenant).Error; err != nil {
// return err // tenant tidak ditemukan
// }
// var product entities.Product
// err := db.Where(&entities.Product{Name: data.Name}).First(&product).Error
// if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) { // if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
// return err // return err
// } // }
// isData := db.Find(&user, "email = ?", data.Email).RowsAffected // isData := db.Find(&product, "name = ?", data.Name).RowsAffected
// if isData == 0 { // if isData == 0 {
// if err := db.Create(&data).Error; err != nil { // newProduct := entities.Product{
// Name: data.Name,
// Price: data.Price,
// TenantID: tenant.ID,
// }
// if err := db.Create(&newProduct).Error; err != nil {
// return err // return err
// } // }
// } // }
@ -107,3 +66,44 @@ func ListProductSeeder(db *gorm.DB) error {
// return nil // return nil
// } // }
// // func ListUserSeeder(db *gorm.DB) error {
// // jsonFile, err := os.Open("./database/seeders/json/users.json")
// // if err != nil {
// // return err
// // }
// // jsonData, err := io.ReadAll(jsonFile)
// // if err != nil {
// // return err
// // }
// // var listUser []entities.User
// // if err := json.Unmarshal(jsonData, &listUser); err != nil {
// // return err
// // }
// // hasTable := db.Migrator().HasTable(&entities.User{})
// // if !hasTable {
// // if err := db.Migrator().CreateTable(&entities.User{}); err != nil {
// // return err
// // }
// // }
// // for _, data := range listUser {
// // var user entities.User
// // err := db.Where(&entities.User{Email: data.Email}).First(&user).Error
// // if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
// // return err
// // }
// // isData := db.Find(&user, "email = ?", data.Email).RowsAffected
// // if isData == 0 {
// // if err := db.Create(&data).Error; err != nil {
// // return err
// // }
// // }
// // }
// // return nil
// // }

View File

@ -0,0 +1,79 @@
package seeds
import (
"encoding/json"
"fmt"
"io"
"os"
"github.com/Caknoooo/go-gin-clean-starter/database/entities"
"gorm.io/gorm"
)
type RoleSeed struct {
ID string `json:"id"`
Name string `json:"name"`
Description string `json:"description"`
IconUrl string `json:"icon_url"`
Type string `json:"type"`
HomeUrl string `json:"home_url"`
ClientName string `json:"client_name"`
}
func ListRoleSeeder(db *gorm.DB) error {
jsonFile, err := os.Open("./database/seeders/json/roles.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 listRole []RoleSeed
if err := json.Unmarshal(jsonData, &listRole); err != nil {
fmt.Println("Error unmarshalling JSON:", err)
return err
}
hasTable := db.Migrator().HasTable(&entities.M_Role{})
if !hasTable {
fmt.Println("Creating table: M_Role")
if err := db.Migrator().CreateTable(&entities.M_Role{}); err != nil {
return err
}
}
for _, data := range listRole {
var role entities.M_Role
var client entities.M_Client
if err := db.Where("name = ?", data.ClientName).First(&client).Error; err != nil {
fmt.Println("Client not found:", err)
return err // client tidak ditemukan
}
// err := db.Where(&entities.M_Role{Name: data.Name}).First(&role).Error
// if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
// fmt.Println("Error querying role:", err)
// return err
// }
if err := db.FirstOrCreate(&role, entities.M_Role{
Name: data.Name,
Description: data.Description,
IconUrl: data.IconUrl,
Type: data.Type,
HomeUrl: data.HomeUrl,
ClientID: client.ID,
}).Error; err != nil {
fmt.Println("Error seeding role:", err)
return err
}
}
return nil
}

View File

@ -1,52 +1,52 @@
package seeds package seeds
import ( // import (
"encoding/json" // "encoding/json"
"errors" // "errors"
"io" // "io"
"os" // "os"
"github.com/Caknoooo/go-gin-clean-starter/database/entities" // "github.com/Caknoooo/go-gin-clean-starter/database/entities"
"gorm.io/gorm" // "gorm.io/gorm"
) // )
func ListTenantSeeder(db *gorm.DB) error { // func ListTenantSeeder(db *gorm.DB) error {
jsonFile, err := os.Open("./database/seeders/json/tenants.json") // jsonFile, err := os.Open("./database/seeders/json/tenants.json")
if err != nil { // if err != nil {
return err // return err
} // }
jsonData, err := io.ReadAll(jsonFile) // jsonData, err := io.ReadAll(jsonFile)
if err != nil { // if err != nil {
return err // return err
} // }
var listTenant []entities.Tenant // var listTenant []entities.Tenant
if err := json.Unmarshal(jsonData, &listTenant); err != nil { // if err := json.Unmarshal(jsonData, &listTenant); err != nil {
return err // return err
} // }
hasTable := db.Migrator().HasTable(&entities.Tenant{}) // hasTable := db.Migrator().HasTable(&entities.Tenant{})
if !hasTable { // if !hasTable {
if err := db.Migrator().CreateTable(&entities.Tenant{}); err != nil { // if err := db.Migrator().CreateTable(&entities.Tenant{}); err != nil {
return err // return err
} // }
} // }
for _, data := range listTenant { // for _, data := range listTenant {
var tenant entities.Tenant // var tenant entities.Tenant
err := db.Where(&entities.Tenant{Name: data.Name}).First(&tenant).Error // err := db.Where(&entities.Tenant{Name: data.Name}).First(&tenant).Error
if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) { // if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
return err // return err
} // }
isData := db.Find(&tenant, "name = ?", data.Name).RowsAffected // isData := db.Find(&tenant, "name = ?", data.Name).RowsAffected
if isData == 0 { // if isData == 0 {
if err := db.Create(&data).Error; err != nil { // if err := db.Create(&data).Error; err != nil {
return err // return err
} // }
} // }
} // }
return nil // return nil
} // }

View File

@ -0,0 +1,58 @@
package seeds
import (
"encoding/json"
"io"
"os"
"github.com/Caknoooo/go-gin-clean-starter/database/entities"
"gorm.io/gorm"
)
type UserRoleSeed struct {
UserName string `json:"name"`
RoleName string `json:"role_name"`
}
func ListUserRoleSeeder(db *gorm.DB) error {
jsonFile, err := os.Open("./database/seeders/json/users_roles.json")
if err != nil {
return err
}
jsonData, err := io.ReadAll(jsonFile)
if err != nil {
return err
}
var listUserRole []UserRoleSeed
if err := json.Unmarshal(jsonData, &listUserRole); err != nil {
return err
}
hasTable := db.Migrator().HasTable(&entities.M_User_Role{})
if !hasTable {
if err := db.Migrator().CreateTable(&entities.M_User_Role{}); err != nil {
return err
}
}
for _, data := range listUserRole {
var user entities.M_User
var role entities.M_Role
if err := db.Where("name = ?", data.UserName).First(&user).Error; err != nil {
return err // user tidak ditemukan
}
if err := db.Where("name = ?", data.RoleName).First(&role).Error; err != nil {
return err // role tidak ditemukan
}
var userRole entities.M_User_Role
if err := db.FirstOrCreate(&userRole, entities.M_User_Role{
UserID: user.ID,
RoleID: role.ID,
}).Error; err != nil {
return err
}
}
return nil
}

View File

@ -3,7 +3,6 @@ package seeds
import ( import (
"encoding/json" "encoding/json"
"errors" "errors"
"fmt"
"io" "io"
"os" "os"
@ -49,22 +48,18 @@ func ListUserSeeder(db *gorm.DB) error {
for _, data := range listUser { for _, data := range listUser {
var client entities.M_Client var client entities.M_Client
fmt.Println("Finding client: ", data.ClientName)
if err := db.Where("name = ?", data.ClientName).First(&client).Error; err != nil { if err := db.Where("name = ?", data.ClientName).First(&client).Error; err != nil {
fmt.Println("Client not found:", err)
return err // client tidak ditemukan return err // client tidak ditemukan
} }
var user entities.M_User var user entities.M_User
err := db.Where(&entities.M_User{Email: data.Email}).First(&user).Error err := db.Where(&entities.M_User{Email: data.Email}).First(&user).Error
if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) { if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
fmt.Println("Error querying user:", err)
return err return err
} }
isData := db.Find(&user, "email = ?", data.Email).RowsAffected isData := db.Find(&user, "email = ?", data.Email).RowsAffected
if isData == 0 { if isData == 0 {
fmt.Println("Seeding user:", data.Email)
passwordEncrypted, err := utils.HashPassword(data.Password) passwordEncrypted, err := utils.HashPassword(data.Password)
if err != nil { if err != nil {
return err return err