diff --git a/models/error.go b/models/error.go index d6e643a..768d68a 100644 --- a/models/error.go +++ b/models/error.go @@ -94,6 +94,19 @@ func (err ErrCouldNotGetUserID) Error() string { return fmt.Sprintf("could not get user ID") } +// ErrCannotDeleteLastUser represents a "ErrCannotDeleteLastUser" kind of error. +type ErrCannotDeleteLastUser struct{} + +// IsErrCannotDeleteLastUser checks if an error is a ErrCannotDeleteLastUser. +func IsErrCannotDeleteLastUser(err error) bool { + _, ok := err.(ErrCannotDeleteLastUser) + return ok +} + +func (err ErrCannotDeleteLastUser) Error() string { + return fmt.Sprintf("cannot delete last user") +} + // =================== // Empty things errors // =================== diff --git a/models/user_delete.go b/models/user_delete.go index 8ff6fa4..1320402 100644 --- a/models/user_delete.go +++ b/models/user_delete.go @@ -1,5 +1,7 @@ package models +import "fmt" + // DeleteUserByID deletes a user by its ID func DeleteUserByID(id int64) error { // Check if the id is 0 @@ -7,8 +9,18 @@ func DeleteUserByID(id int64) error { return ErrIDCannotBeZero{} } + // Check if there is > 1 user + total, err := x.Count(User{}) + if err != nil { + return err + } + + if total < 2 { + return ErrCannotDeleteLastUser{} + } + // Delete the user - _, err := x.Id(id).Delete(&User{}) + _, err = x.Id(id).Delete(&User{}) if err != nil { return err diff --git a/routes/api/v1/user_delete.go b/routes/api/v1/user_delete.go index 88313ad..3dd4e63 100644 --- a/routes/api/v1/user_delete.go +++ b/routes/api/v1/user_delete.go @@ -42,6 +42,11 @@ func UserDelete(c echo.Context) error { if models.IsErrIDCannotBeZero(err) { return c.JSON(http.StatusBadRequest, models.Message{"Id cannot be 0"}) } + + if models.IsErrCannotDeleteLastUser(err) { + return c.JSON(http.StatusBadRequest, models.Message{"Cannot delete last user."}) + } + return c.JSON(http.StatusInternalServerError, models.Message{"Could not delete user."}) }