package user import ( "github.com/veypi/vbase/cfg" "github.com/veypi/vbase/models" "github.com/veypi/vigo" "gorm.io/gorm" ) type GetRolesReq struct { UserID string `src:"path@user_id" desc:"User ID"` } func getRoles(x *vigo.X, req *GetRolesReq) ([]models.Role, error) { var userRoles []models.UserRole if err := cfg.DB().Preload("Role").Where("user_id = ?", req.UserID).Find(&userRoles).Error; err != nil { return nil, vigo.ErrDatabase.WithError(err) } roles := make([]models.Role, 0, len(userRoles)) for _, ur := range userRoles { roles = append(roles, ur.Role) } return roles, nil } type UpdateRolesReq struct { UserID string `src:"path@user_id" desc:"User ID"` RoleIDs []string `json:"role_ids" src:"json" desc:"Role IDs"` } func updateRoles(x *vigo.X, req *UpdateRolesReq) error { var user models.User if err := cfg.DB().First(&user, "id = ?", req.UserID).Error; err != nil { return vigo.ErrNotFound } return cfg.DB().Transaction(func(tx *gorm.DB) error { if err := tx.Where("user_id = ?", req.UserID).Delete(&models.UserRole{}).Error; err != nil { return err } if len(req.RoleIDs) > 0 { userRoles := make([]models.UserRole, 0, len(req.RoleIDs)) for _, rid := range req.RoleIDs { userRoles = append(userRoles, models.UserRole{ UserID: req.UserID, RoleID: rid, }) } if err := tx.Create(&userRoles).Error; err != nil { return err } } return nil }) }