101 lines
2.5 KiB
Go
101 lines
2.5 KiB
Go
package repository
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/Caknoooo/go-gin-clean-starter/database/entities"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type (
|
|
MenuRepository interface {
|
|
Create(ctx context.Context, tx *gorm.DB, menu entities.M_Menu) (entities.M_Menu, error)
|
|
GetById(ctx context.Context, tx *gorm.DB, menuId string) (entities.M_Menu, error)
|
|
GetByName(ctx context.Context, tx *gorm.DB, name string) (entities.M_Menu, error)
|
|
Update(ctx context.Context, tx *gorm.DB, menu entities.M_Menu) (entities.M_Menu, error)
|
|
Delete(ctx context.Context, tx *gorm.DB, menuId string) error
|
|
}
|
|
|
|
menuRepository struct {
|
|
db *gorm.DB
|
|
}
|
|
)
|
|
|
|
// Create implements MenuRepository.
|
|
func (m *menuRepository) Create(ctx context.Context, tx *gorm.DB, menu entities.M_Menu) (entities.M_Menu, error) {
|
|
if tx == nil {
|
|
tx = m.db
|
|
}
|
|
|
|
if err := tx.WithContext(ctx).Create(&menu).Error; err != nil {
|
|
return entities.M_Menu{}, err
|
|
}
|
|
|
|
return menu, nil
|
|
}
|
|
|
|
// Delete implements MenuRepository.
|
|
func (m *menuRepository) Delete(ctx context.Context, tx *gorm.DB, menuId string) error {
|
|
if tx == nil {
|
|
tx = m.db
|
|
}
|
|
|
|
// Use a parameterized WHERE clause to ensure the ID is passed as a bound parameter
|
|
if err := tx.WithContext(ctx).Where("id = ?", menuId).Delete(&entities.M_Menu{}).Error; err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// GetById implements MenuRepository.
|
|
func (m *menuRepository) GetById(ctx context.Context, tx *gorm.DB, menuId string) (entities.M_Menu, error) {
|
|
if tx == nil {
|
|
tx = m.db
|
|
}
|
|
|
|
var menu entities.M_Menu
|
|
// preload Parent relation jika entitas M_Menu punya association Parent
|
|
if err := tx.WithContext(ctx).
|
|
Preload("Parent").
|
|
Preload("Permissions").
|
|
First(&menu, "id = ?", menuId).Error; err != nil {
|
|
return entities.M_Menu{}, err
|
|
}
|
|
|
|
return menu, nil
|
|
}
|
|
|
|
// GetByName implements MenuRepository.
|
|
func (m *menuRepository) GetByName(ctx context.Context, tx *gorm.DB, name string) (entities.M_Menu, error) {
|
|
if tx == nil {
|
|
tx = m.db
|
|
}
|
|
|
|
var menu entities.M_Menu
|
|
if err := tx.WithContext(ctx).Where("name = ?", name).First(&menu).Error; err != nil {
|
|
return entities.M_Menu{}, err
|
|
}
|
|
|
|
return menu, nil
|
|
}
|
|
|
|
// Update implements MenuRepository.
|
|
func (m *menuRepository) Update(ctx context.Context, tx *gorm.DB, menu entities.M_Menu) (entities.M_Menu, error) {
|
|
if tx == nil {
|
|
tx = m.db
|
|
}
|
|
|
|
if err := tx.WithContext(ctx).Updates(&menu).Error; err != nil {
|
|
return entities.M_Menu{}, err
|
|
}
|
|
|
|
return menu, nil
|
|
}
|
|
|
|
func NewMenuRepository(db *gorm.DB) MenuRepository {
|
|
return &menuRepository{
|
|
db: db,
|
|
}
|
|
}
|