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, } }