package data import ( "context" "kra/internal/biz" "gorm.io/gorm" ) type menuButtonPO struct { ID uint `gorm:"primaryKey"` Name string Description string `gorm:"column:desc"` MenuID uint `gorm:"column:sys_base_menu_id"` } func (menuButtonPO) TableName() string { return "sys_base_menu_btns" } type authorityButtonPO struct { AuthorityID uint `gorm:"primaryKey;column:authority_id"` MenuID uint `gorm:"primaryKey;column:sys_menu_id"` ButtonID uint `gorm:"primaryKey;column:sys_base_menu_btn_id"` } func (authorityButtonPO) TableName() string { return "sys_authority_btns" } func (r *accessRepo) Buttons(ctx context.Context, menuID uint) ([]*biz.MenuButton, error) { var pos []menuButtonPO if err := r.data.gormDB.WithContext(ctx).Where("sys_base_menu_id = ?", menuID).Find(&pos).Error; err != nil { return nil, err } out := make([]*biz.MenuButton, 0, len(pos)) for _, po := range pos { out = append(out, &biz.MenuButton{ID: po.ID, Name: po.Name, Description: po.Description, MenuID: po.MenuID}) } return out, nil } func (r *accessRepo) SetAuthorityButtons(ctx context.Context, aid uint, buttons map[uint][]uint) error { return r.data.gormDB.WithContext(ctx).Transaction(func(tx *gorm.DB) error { if err := tx.Where("authority_id = ?", aid).Delete(&authorityButtonPO{}).Error; err != nil { return err } var links []authorityButtonPO for menuID, ids := range buttons { for _, id := range ids { links = append(links, authorityButtonPO{AuthorityID: aid, MenuID: menuID, ButtonID: id}) } } if len(links) > 0 { return tx.Create(&links).Error } return nil }) } func (r *accessRepo) SelectedButtons(ctx context.Context, aid, menuID uint) ([]uint, error) { var ids []uint err := r.data.gormDB.WithContext(ctx).Model(&authorityButtonPO{}).Where("authority_id = ? AND sys_menu_id = ?", aid, menuID).Pluck("sys_base_menu_btn_id", &ids).Error return ids, err } func (r *accessRepo) SetSelectedButtons(ctx context.Context, aid, menuID uint, ids []uint) error { return r.data.gormDB.WithContext(ctx).Transaction(func(tx *gorm.DB) error { if err := tx.Where("authority_id = ? AND sys_menu_id = ?", aid, menuID).Delete(&authorityButtonPO{}).Error; err != nil { return err } links := make([]authorityButtonPO, 0, len(ids)) for _, id := range ids { links = append(links, authorityButtonPO{AuthorityID: aid, MenuID: menuID, ButtonID: id}) } if len(links) > 0 { return tx.Create(&links).Error } return nil }) } func (r *accessRepo) CanRemoveButton(ctx context.Context, id uint) (bool, error) { var count int64 err := r.data.gormDB.WithContext(ctx).Model(&authorityButtonPO{}).Where("sys_base_menu_btn_id = ?", id).Count(&count).Error return count == 0, err } func (r *accessRepo) AuthorityButtonIDs(ctx context.Context, aid uint) ([]uint, error) { var ids []uint err := r.data.gormDB.WithContext(ctx).Model(&authorityButtonPO{}).Where("authority_id = ?", aid).Pluck("sys_base_menu_btn_id", &ids).Error return ids, err }