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:
+33
-3
@@ -1,7 +1,37 @@
|
||||
package user
|
||||
|
||||
import "errors"
|
||||
import (
|
||||
"errors"
|
||||
|
||||
var (
|
||||
ErrUserNotFound = errors.New("user not found")
|
||||
orm "tm/pkg/mongo"
|
||||
)
|
||||
|
||||
var ErrUserNotFound = errors.New("user not found")
|
||||
|
||||
func mapUserWriteError(err error) error {
|
||||
if err == nil || !orm.IsDuplicateKeyError(err) {
|
||||
return err
|
||||
}
|
||||
switch {
|
||||
case orm.DuplicateKeyMatchesField(err, "phone"):
|
||||
return errors.New("phone number already exists")
|
||||
case orm.DuplicateKeyMatchesField(err, "email"):
|
||||
return errors.New("email already exists")
|
||||
case orm.DuplicateKeyMatchesField(err, "username"):
|
||||
return errors.New("username already exists")
|
||||
default:
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
func isUserConflictError(err error) bool {
|
||||
if err == nil {
|
||||
return false
|
||||
}
|
||||
switch err.Error() {
|
||||
case "phone number already exists", "email already exists", "username already exists":
|
||||
return true
|
||||
default:
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user