Files
fm_be/internal/shared/pkg/apperrorsx/mysql_map.go
2026-07-16 22:16:45 +07:00

142 lines
4.4 KiB
Go

package apperrorsx
import (
"errors"
mysqldriver "github.com/go-sql-driver/mysql"
)
const (
mysqlErrAccessDenied uint16 = 1045
mysqlErrDuplicateEntry uint16 = 1062
mysqlErrCommandDenied uint16 = 1142
mysqlErrLockWaitTimeout uint16 = 1205
mysqlErrDeadlockFound uint16 = 1213
mysqlErrSpecificAccessDenied uint16 = 1227
mysqlErrColumnCannotBeNull uint16 = 1048
mysqlErrTruncatedWrongValue uint16 = 1292
mysqlErrIncorrectValue uint16 = 1366
mysqlErrServerGone uint16 = 2006
mysqlErrFkParentStillReferenced uint16 = 1451
mysqlErrFkChildNotFound uint16 = 1452
mysqlErrCheckConstraintViolated uint16 = 3819
mysqlErrConstraintFailed uint16 = 4025
)
func mapMySQLError(module string, err error) *AppError {
var mysqlErr *mysqldriver.MySQLError
if !errors.As(err, &mysqlErr) {
return nil
}
switch module {
case ModuleHelicopter:
return mapMySQLErrorHelicopter(mysqlErr, err)
case ModuleHospital:
return mapMySQLErrorHospital(mysqlErr, err)
case ModuleFleetStatus:
return mapMySQLErrorFleetStatus(mysqlErr, err)
case ModuleComplaint:
return mapMySQLErrorComplaint(mysqlErr, err)
default:
return mapMySQLErrorGeneral(mysqlErr, err)
}
}
func mapMySQLErrorFleetStatus(mysqlErr *mysqldriver.MySQLError, cause error) *AppError {
switch mysqlErr.Number {
case mysqlErrDuplicateEntry:
return New(ErrFleetStatusDuplicate).WithCause(cause)
case mysqlErrFkParentStillReferenced:
return New(ErrFleetStatusRelationDelete).WithCause(cause)
case mysqlErrFkChildNotFound:
// fleet_status.helicopter_id references a non-existent helicopter.
return New(ErrFleetStatusHelicopterInvalid).WithCause(cause)
case mysqlErrColumnCannotBeNull,
mysqlErrTruncatedWrongValue,
mysqlErrIncorrectValue,
mysqlErrCheckConstraintViolated,
mysqlErrConstraintFailed:
return New(ErrFleetStatusInvalidPayload).WithCause(cause)
default:
return nil
}
}
func mapMySQLErrorGeneral(mysqlErr *mysqldriver.MySQLError, cause error) *AppError {
switch mysqlErr.Number {
case mysqlErrAccessDenied:
return New(ErrUserUnauthorized).WithCause(cause)
case mysqlErrCommandDenied, mysqlErrSpecificAccessDenied:
return New(ErrForbiddenAccess).WithCause(cause)
case mysqlErrLockWaitTimeout, mysqlErrDeadlockFound:
return New(ErrBusinessRuleFailed).WithCause(cause)
case mysqlErrServerGone:
return New(ErrInternal).WithCause(cause)
case mysqlErrDuplicateEntry, mysqlErrFkParentStillReferenced:
return New(ErrBusinessRuleFailed).WithCause(cause)
case mysqlErrColumnCannotBeNull,
mysqlErrTruncatedWrongValue,
mysqlErrIncorrectValue,
mysqlErrFkChildNotFound,
mysqlErrCheckConstraintViolated,
mysqlErrConstraintFailed:
return New(ErrValidation).WithCause(cause)
default:
return nil
}
}
func mapMySQLErrorHelicopter(mysqlErr *mysqldriver.MySQLError, cause error) *AppError {
switch mysqlErr.Number {
case mysqlErrDuplicateEntry:
return New(ErrHelicopterDuplicate).WithCause(cause)
case mysqlErrFkParentStillReferenced:
return New(ErrHelicopterRelationDelete).WithCause(cause)
case mysqlErrColumnCannotBeNull,
mysqlErrTruncatedWrongValue,
mysqlErrIncorrectValue,
mysqlErrFkChildNotFound,
mysqlErrCheckConstraintViolated,
mysqlErrConstraintFailed:
return New(ErrHelicopterInvalidPayload).WithCause(cause)
default:
return nil
}
}
func mapMySQLErrorHospital(mysqlErr *mysqldriver.MySQLError, cause error) *AppError {
switch mysqlErr.Number {
case mysqlErrFkParentStillReferenced:
return New(ErrHospitalRelationDelete).WithCause(cause)
case mysqlErrColumnCannotBeNull,
mysqlErrTruncatedWrongValue,
mysqlErrIncorrectValue,
mysqlErrFkChildNotFound,
mysqlErrCheckConstraintViolated,
mysqlErrConstraintFailed:
return New(ErrHospitalInvalidPayload).WithCause(cause)
default:
return nil
}
}
func mapMySQLErrorComplaint(mysqlErr *mysqldriver.MySQLError, cause error) *AppError {
switch mysqlErr.Number {
case mysqlErrDuplicateEntry:
return New(ErrComplaintInvalidPayload).WithCause(cause)
case mysqlErrFkParentStillReferenced:
return New(ErrComplaintRelationDelete).WithCause(cause)
case mysqlErrFkChildNotFound:
return New(ErrComplaintInvalidHelicopterID).WithCause(cause)
case mysqlErrColumnCannotBeNull,
mysqlErrTruncatedWrongValue,
mysqlErrIncorrectValue,
mysqlErrCheckConstraintViolated,
mysqlErrConstraintFailed:
return New(ErrComplaintInvalidPayload).WithCause(cause)
default:
return nil
}
}