Merge branch '17-unmodifiable-system-material-types' into feature/18-add-existing-files-cache

This commit is contained in:
FyloZ 2021-12-29 17:56:02 -05:00
commit fa8052d053
Signed by: william
GPG Key ID: 835378AE9AF4AE97
5 changed files with 55 additions and 1 deletions

View File

@ -59,6 +59,17 @@ class AlreadyExistsException(
extensions = extensions.apply { this[identifierName] = identifierValue }.toMap() extensions = extensions.apply { this[identifierName] = identifierValue }.toMap()
) )
class CannotUpdateException(
errorCode: String,
title: String,
details: String
) : RestException(
errorCode = "cannotupdate-$errorCode",
title = title,
status = HttpStatus.BAD_REQUEST,
details = details
)
class CannotDeleteException( class CannotDeleteException(
errorCode: String, errorCode: String,
title: String, title: String,

View File

@ -2,6 +2,7 @@ package dev.fyloz.colorrecipesexplorer.model
import dev.fyloz.colorrecipesexplorer.exception.AlreadyExistsException import dev.fyloz.colorrecipesexplorer.exception.AlreadyExistsException
import dev.fyloz.colorrecipesexplorer.exception.CannotDeleteException import dev.fyloz.colorrecipesexplorer.exception.CannotDeleteException
import dev.fyloz.colorrecipesexplorer.exception.CannotUpdateException
import dev.fyloz.colorrecipesexplorer.exception.NotFoundException import dev.fyloz.colorrecipesexplorer.exception.NotFoundException
import dev.fyloz.colorrecipesexplorer.model.validation.NullOrNotBlank import dev.fyloz.colorrecipesexplorer.model.validation.NullOrNotBlank
import dev.fyloz.colorrecipesexplorer.model.validation.NullOrSize import dev.fyloz.colorrecipesexplorer.model.validation.NullOrSize
@ -105,6 +106,7 @@ fun materialTypeUpdateDto(
private const val MATERIAL_TYPE_NOT_FOUND_EXCEPTION_TITLE = "Material type not found" private const val MATERIAL_TYPE_NOT_FOUND_EXCEPTION_TITLE = "Material type not found"
private const val MATERIAL_TYPE_ALREADY_EXISTS_EXCEPTION_TITLE = "Material type already exists" private const val MATERIAL_TYPE_ALREADY_EXISTS_EXCEPTION_TITLE = "Material type already exists"
private const val MATERIAL_TYPE_CANNOT_DELETE_EXCEPTION_TITLE = "Cannot delete material type" private const val MATERIAL_TYPE_CANNOT_DELETE_EXCEPTION_TITLE = "Cannot delete material type"
private const val MATERIAL_TYPE_CANNOT_UPDATE_EXCEPTION_TITLE = "Cannot update material type"
private const val MATERIAL_TYPE_EXCEPTION_ERROR_CODE = "materialtype" private const val MATERIAL_TYPE_EXCEPTION_ERROR_CODE = "materialtype"
fun materialTypeIdNotFoundException(id: Long) = fun materialTypeIdNotFoundException(id: Long) =
@ -150,9 +152,23 @@ fun materialTypePrefixAlreadyExistsException(prefix: String) =
"prefix" "prefix"
) )
fun cannotUpdateSystemMaterialTypeException(materialType: MaterialType) =
CannotUpdateException(
MATERIAL_TYPE_EXCEPTION_ERROR_CODE,
MATERIAL_TYPE_CANNOT_UPDATE_EXCEPTION_TITLE,
"Cannot update material type ${materialType.name} because it is a system material type"
)
fun cannotDeleteMaterialTypeException(materialType: MaterialType) = fun cannotDeleteMaterialTypeException(materialType: MaterialType) =
CannotDeleteException( CannotDeleteException(
MATERIAL_TYPE_EXCEPTION_ERROR_CODE, MATERIAL_TYPE_EXCEPTION_ERROR_CODE,
MATERIAL_TYPE_CANNOT_DELETE_EXCEPTION_TITLE, MATERIAL_TYPE_CANNOT_DELETE_EXCEPTION_TITLE,
"Cannot delete material type ${materialType.name} because one or more materials depends on it" "Cannot delete material type ${materialType.name} because one or more materials depends on it"
) )
fun cannotDeleteSystemMaterialTypeException(materialType: MaterialType) =
CannotDeleteException(
MATERIAL_TYPE_EXCEPTION_ERROR_CODE,
MATERIAL_TYPE_CANNOT_DELETE_EXCEPTION_TITLE,
"Cannot delete material type ${materialType.name} because it is a system material type"
)

View File

@ -9,6 +9,9 @@ interface MaterialTypeRepository : NamedJpaRepository<MaterialType> {
/** Checks if a material type exists with the given [prefix]. */ /** Checks if a material type exists with the given [prefix]. */
fun existsByPrefix(prefix: String): Boolean fun existsByPrefix(prefix: String): Boolean
/** Checks if a system material type with the given [id] exists. */
fun existsByIdAndSystemTypeIsTrue(id: Long): Boolean
/** Gets all material types which are not system types. */ /** Gets all material types which are not system types. */
fun findAllBySystemTypeIs(value: Boolean): Collection<MaterialType> fun findAllBySystemTypeIs(value: Boolean): Collection<MaterialType>

View File

@ -61,6 +61,10 @@ class MaterialTypeServiceImpl(repository: MaterialTypeRepository, private val ma
} }
override fun update(entity: MaterialType): MaterialType { override fun update(entity: MaterialType): MaterialType {
if (repository.existsByIdAndSystemTypeIsTrue(entity.id!!)) {
throw cannotUpdateSystemMaterialTypeException(entity)
}
with(repository.findByPrefix(entity.prefix)) { with(repository.findByPrefix(entity.prefix)) {
if (this != null && id != entity.id) if (this != null && id != entity.id)
throw materialTypePrefixAlreadyExistsException(entity.prefix) throw materialTypePrefixAlreadyExistsException(entity.prefix)
@ -70,7 +74,11 @@ class MaterialTypeServiceImpl(repository: MaterialTypeRepository, private val ma
} }
override fun delete(entity: MaterialType) { override fun delete(entity: MaterialType) {
if (!repository.canBeDeleted(entity.id!!)) throw cannotDeleteMaterialTypeException(entity) if (repository.existsByIdAndSystemTypeIsTrue(entity.id!!)) {
throw cannotDeleteSystemMaterialTypeException(entity)
}
if (!repository.canBeDeleted(entity.id)) throw cannotDeleteMaterialTypeException(entity)
super.delete(entity) super.delete(entity)
} }
} }

View File

@ -2,6 +2,8 @@ package dev.fyloz.colorrecipesexplorer.service
import com.nhaarman.mockitokotlin2.* import com.nhaarman.mockitokotlin2.*
import dev.fyloz.colorrecipesexplorer.exception.AlreadyExistsException import dev.fyloz.colorrecipesexplorer.exception.AlreadyExistsException
import dev.fyloz.colorrecipesexplorer.exception.CannotDeleteException
import dev.fyloz.colorrecipesexplorer.exception.CannotUpdateException
import dev.fyloz.colorrecipesexplorer.exception.NotFoundException import dev.fyloz.colorrecipesexplorer.exception.NotFoundException
import dev.fyloz.colorrecipesexplorer.model.* import dev.fyloz.colorrecipesexplorer.model.*
import dev.fyloz.colorrecipesexplorer.repository.MaterialTypeRepository import dev.fyloz.colorrecipesexplorer.repository.MaterialTypeRepository
@ -164,8 +166,22 @@ class MaterialTypeServiceTest :
.assertErrorCode("prefix") .assertErrorCode("prefix")
} }
@Test
fun `update() throws CannotUpdateException when updating a system material type`() {
whenever(repository.existsByIdAndSystemTypeIsTrue(systemType.id!!)).doReturn(true)
assertThrows<CannotUpdateException> { service.update(systemType) }
}
// delete() // delete()
@Test
fun `delete() throws CannotDeleteException when deleting a system material type`() {
whenever(repository.existsByIdAndSystemTypeIsTrue(systemType.id!!)).doReturn(true)
assertThrows<CannotDeleteException> { service.delete(systemType) }
}
override fun `delete() deletes in the repository`() { override fun `delete() deletes in the repository`() {
whenCanBeDeleted { whenCanBeDeleted {
super.`delete() deletes in the repository`() super.`delete() deletes in the repository`()