fix(user,customer): return 409 on phone duplicate-key races
Map E11000 from the per-collection phone index to friendly conflict errors and skip redundant GetByPhone when the phone is unchanged. Not blocking: IAT test DB may need a one-off dedupe for index build; phone uniqueness is per collection (users vs customers), not global.
This commit is contained in:
@@ -117,6 +117,9 @@ func (s *userService) Register(ctx context.Context, form *CreateUserForm) (*User
|
||||
// Save to database
|
||||
err = s.repository.Create(ctx, user)
|
||||
if err != nil {
|
||||
if mapped := mapUserWriteError(err); mapped != err {
|
||||
return nil, mapped
|
||||
}
|
||||
s.logger.Error("Failed to register user", map[string]interface{}{
|
||||
"error": err.Error(),
|
||||
"email": form.Email,
|
||||
@@ -191,7 +194,7 @@ func (s *userService) Update(ctx context.Context, id string, form *UpdateUserFor
|
||||
user.Position = form.Position
|
||||
}
|
||||
|
||||
if form.Phone != nil {
|
||||
if form.Phone != nil && (user.Phone == nil || *form.Phone != *user.Phone) {
|
||||
if *form.Phone != "" {
|
||||
existingUser, _ := s.repository.GetByPhone(ctx, *form.Phone)
|
||||
if existingUser != nil && existingUser.ID.Hex() != id {
|
||||
@@ -208,6 +211,9 @@ func (s *userService) Update(ctx context.Context, id string, form *UpdateUserFor
|
||||
// Update in database
|
||||
err = s.repository.Update(ctx, user)
|
||||
if err != nil {
|
||||
if mapped := mapUserWriteError(err); mapped != err {
|
||||
return nil, mapped
|
||||
}
|
||||
s.logger.Error("Failed to update user", map[string]interface{}{
|
||||
"error": err.Error(),
|
||||
"user_id": id,
|
||||
@@ -586,7 +592,7 @@ func (s *userService) UpdateProfile(ctx context.Context, userID string, form *Up
|
||||
if form.Position != nil {
|
||||
user.Position = form.Position
|
||||
}
|
||||
if form.Phone != nil {
|
||||
if form.Phone != nil && (user.Phone == nil || *form.Phone != *user.Phone) {
|
||||
if *form.Phone != "" {
|
||||
existingUser, _ := s.repository.GetByPhone(ctx, *form.Phone)
|
||||
if existingUser != nil && existingUser.ID.Hex() != userID {
|
||||
@@ -605,6 +611,9 @@ func (s *userService) UpdateProfile(ctx context.Context, userID string, form *Up
|
||||
// Save to database
|
||||
err = s.repository.Update(ctx, user)
|
||||
if err != nil {
|
||||
if mapped := mapUserWriteError(err); mapped != err {
|
||||
return mapped
|
||||
}
|
||||
s.logger.Error("Failed to update user profile", map[string]interface{}{
|
||||
"error": err.Error(),
|
||||
"user_id": userID,
|
||||
|
||||
Reference in New Issue
Block a user