package repository import ( "fmt" "github.com/pkg/errors" "gorm.io/gorm" "sghgogs.com/micro/shopping-service/domain/model/base" req "sghgogs.com/micro/shopping-service/domain/model/request" pb "sghgogs.com/micro/shopping-service/proto" "sghgogs.com/micro/shopping-service/utils" ) const ( UserGroupID = 2 ) func (u *Repository) IsUserExists(identifier interface{}) (bool, error) { var user req.User if err := u.db. Where("id = ? OR username = ?", identifier, identifier). Where("group_id", utils.UserUserGroupID). Select("id, username"). First(&user).Error; err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return false, nil // 记录不存在,账号不存在 } return false, err // 发生其他错误 } return true, nil } func (u *Repository) GetUserList(query *pb.GetUserListRequest) ([]req.User, int64, error) { tx := u.db.Model(&req.User{}). Where("group_id = ?", utils.UserUserGroupID). Select("id, username, phone_number, email, avatar, created_at, created_by, updated_at, updated_by, status"). Order("id desc") if query.Keyword != "" { tx.Where("username = ? OR phone_number = ?", query.Keyword, query.Keyword) } if base.IsStatusEnum(query.Status) { tx.Where("status = ?", query.Status) } var totalCount int64 tx.Count(&totalCount) users := make([]req.User, 0) return users, totalCount, tx.Limit(int(query.PageSize)).Offset(int((query.Page - 1) * query.PageSize)).Find(&users).Error } func (u *Repository) GetUser(userID int64) (req.User, error) { var user req.User return user, u.db. Where("id = ? AND group_id = ?", userID, utils.UserUserGroupID). Select("id, username, phone_number, email, avatar, created_at, created_by, updated_at, updated_by, status"). // Preload("Roles"). Find(&user).Error } func (u *Repository) CreateUser(user *req.User) error { // 开始事务 tx := u.db.Begin() // 错误处理 defer func() { if r := recover(); r != nil { tx.Rollback() } }() if err := tx.Model(&req.User{}).Create(user).Error; err != nil { tx.Rollback() return err } var role req.Role if err := tx.Model(&req.Role{}).Where("name = ?", "user").First(&role).Error; err != nil { tx.Rollback() return err } if err := tx.Model(&user).Association("Roles").Append(&req.Role{ID: role.ID}); err != nil { tx.Rollback() return err } return tx.Commit().Error } func (u *Repository) UpdateUser(userID int64, user map[string]interface{}) error { // 开始事务 tx := u.db.Begin() // 错误处理 defer func() { if r := recover(); r != nil { tx.Rollback() } }() if err := tx.Model(&req.User{}).Where("id = ?", userID).Updates(user).Error; err != nil { tx.Rollback() return err } return tx.Commit().Error } func (u *Repository) DeleteUser(userID int64) error { // 开始事务 tx := u.db.Begin() // 错误处理 defer func() { if r := recover(); r != nil { tx.Rollback() } }() var user req.User if err := tx.First(&user, userID).Error; err != nil { tx.Rollback() return err } if err := tx.Model(&user).Association("Roles").Clear(); err != nil { tx.Rollback() return err } if err := tx.Model(&req.User{}).Unscoped().Delete(&req.User{ID: userID}).Error; err != nil { tx.Rollback() return err } return tx.Commit().Error } func (u *Repository) ToggleUser(userID int64, enum pb.StatusEnum, data map[string]interface{}) error { // pb.StatusEnum_DELETED {} fmt.Println("data", data) // 1. 开启事务 tx := u.db.Begin() // 错误处理 defer func() { if r := recover(); r != nil { tx.Rollback() } }() var user req.User // 1.查询角色 if err := tx.First(&user, userID).Error; err != nil { tx.Rollback() return err } if enum == pb.StatusEnum_DELETED { // 1.1删除关联角色 if err := tx.Model(&user).Association("Roles").Clear(); err != nil { tx.Rollback() return err } } // 2. 更新状态 if err := tx.Model(&req.User{}).Where("id = ?", userID).Updates(data).Error; err != nil { tx.Rollback() return err } return tx.Commit().Error } // func (u *Repository) ToggleUser(userID int64, user map[string]interface{}) error { // // 开始事务 // tx := u.db.Begin() // // 错误处理 // defer func() { // if r := recover(); r != nil { // tx.Rollback() // } // }() // if err := tx.Model(&req.User{}).Where("id = ?", userID).Updates(&user).Error; err != nil { // tx.Rollback() // return err // } // return tx.Commit().Error // } // // func (u *Repository) DeleteUser(userID int64) error { // // 开始事务 // tx := u.db.Begin() // // 错误处理 // defer func() { // if r := recover(); r != nil { // tx.Rollback() // } // }() // var user req.User // if err := tx.First(&user, userID).Error; err != nil { // tx.Rollback() // return err // } // if err := tx.Model(&user).Association("Roles").Clear(); err != nil { // tx.Rollback() // return err // } // if err := tx.Model(&req.User{}).Delete(&req.User{ // ID: userID, // }).Error; err != nil { // tx.Rollback() // return err // } // return tx.Commit().Error // } // 检测用户ID如果不存在会抛出错误 func (u *Repository) getUserValidIDs(ids []int64) ([]int64, error) { var validIDs []int64 result := u.db.Model(&req.User{}).Where("id IN ?", ids).Pluck("id", &validIDs) if result.Error != nil { return nil, result.Error } // 检查是否有未找到的 ID if result.RowsAffected != int64(len(ids)) { // 找到的 ID 数量和传入的数量不一致,说明有不存在的 ID missingIDs := findMissingIDs(ids, validIDs) errMsg := fmt.Sprintf("Some IDs do not exist: %v", missingIDs) return nil, errors.New(errMsg) } return validIDs, nil } func findMissingIDs(allIDs, foundIDs []int64) []int64 { var missingIDs []int64 foundSet := make(map[int64]bool) for _, id := range foundIDs { foundSet[id] = true } for _, id := range allIDs { if !foundSet[id] { missingIDs = append(missingIDs, id) } } return missingIDs }