package services import ( "errors" "gobeyhan/database" "gobeyhan/database/models" "gorm.io/gorm" ) type RoleService struct{} func NewRoleService() *RoleService { return &RoleService{} } // GetAllRoles retrieves all roles func (s *RoleService) GetAllRoles() ([]models.Role, error) { var roles []models.Role err := database.DB.Preload("Permissions").Find(&roles).Error return roles, err } // GetRoleByID retrieves a role by ID func (s *RoleService) GetRoleByID(id uint64) (*models.Role, error) { var role models.Role err := database.DB.Preload("Permissions").First(&role, id).Error if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return nil, nil } return nil, err } return &role, nil } // CreateRole creates a new role func (s *RoleService) CreateRole(role *models.Role) error { return database.DB.Create(role).Error } // UpdateRole updates an existing role func (s *RoleService) UpdateRole(id uint64, updates map[string]interface{}) error { result := database.DB.Model(&models.Role{}).Where("id = ?", id).Updates(updates) if result.Error != nil { return result.Error } if result.RowsAffected == 0 { return gorm.ErrRecordNotFound } return nil } // DeleteRole deletes a role by ID func (s *RoleService) DeleteRole(id uint64) error { result := database.DB.Delete(&models.Role{}, id) if result.Error != nil { return result.Error } if result.RowsAffected == 0 { return gorm.ErrRecordNotFound } return nil } // AssignPermission assigns a permission to a role func (s *RoleService) AssignPermission(roleID, permissionID uint64) error { var role models.Role if err := database.DB.First(&role, roleID).Error; err != nil { return err } var permission models.Permission if err := database.DB.First(&permission, permissionID).Error; err != nil { return err } return database.DB.Model(&role).Association("Permissions").Append(&permission) } // RemovePermission removes a permission from a role func (s *RoleService) RemovePermission(roleID, permissionID uint64) error { var role models.Role if err := database.DB.Preload("Permissions").First(&role, roleID).Error; err != nil { return err } var permission models.Permission if err := database.DB.First(&permission, permissionID).Error; err != nil { return err } return database.DB.Model(&role).Association("Permissions").Delete(&permission) }