41 lines
818 B
Go
41 lines
818 B
Go
package repository
|
|
|
|
import (
|
|
"errors"
|
|
"strings"
|
|
|
|
infraerrors "github.com/Wei-Shaw/sub2api/internal/infrastructure/errors"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
func translatePersistenceError(err error, notFound, conflict *infraerrors.ApplicationError) error {
|
|
if err == nil {
|
|
return nil
|
|
}
|
|
|
|
if notFound != nil && errors.Is(err, gorm.ErrRecordNotFound) {
|
|
return notFound.WithCause(err)
|
|
}
|
|
|
|
if conflict != nil && isUniqueConstraintViolation(err) {
|
|
return conflict.WithCause(err)
|
|
}
|
|
|
|
return err
|
|
}
|
|
|
|
func isUniqueConstraintViolation(err error) bool {
|
|
if err == nil {
|
|
return false
|
|
}
|
|
|
|
if errors.Is(err, gorm.ErrDuplicatedKey) {
|
|
return true
|
|
}
|
|
|
|
msg := strings.ToLower(err.Error())
|
|
return strings.Contains(msg, "duplicate key") ||
|
|
strings.Contains(msg, "unique constraint") ||
|
|
strings.Contains(msg, "duplicate entry")
|
|
}
|