Attualmente sto lavorando a un progetto di School Management utilizzando Spring stack, Kotlin come linguaggio di programmazione e Neo4j per la soluzione di storage.
Ecco lo scenario, sto creando una voce di classe nel DB. Supponiamo che le proprietà dell'oggetto di classe Class siano Name: Nine, Section: A, Shift: Morning
. Quando sto andando a salvare in DB, devo assicurarmi che non ci sia una classe con le stesse proprietà.
La mia domanda è, dopo la duplicazione, verificare come suppongo di propagare il massaggio all'altro livello o al lato client? Lancia un Exception
nel livello in cui ha trovato la duplicazione o qualsiasi altro flusso normale?
Ecco cosa sto gestendo attualmente questo scenario. Fornire Kotlin
code.
Controller
open fun post(@RequestBody cls: Course, request: HttpServletRequest): ResponseEntity<*> {
try {
createdClass = classService.save(cls)
}
catch (ex: DuplicateCourseException) {
return responseConflict(cls)
}catch (ex: DuplicateKeyException){
return responseConflict(cls)
}
return responseOK(createdClass)
}
Livello di servizio
open fun save(course: Course): Course {
// Checking the DB
val foundDuplicate = classRepo.findListByOrganizationName(course.organization?.name)
.filter {
it.name == course.name
it.section == course.section
it.shift == course.shift
}
.isEmpty()
.not()
if (foundDuplicate) {
// Custom Exception
throw DuplicateCourseException("Duplicate Class Found")
}
return classRepo.save(course)
}
O semplicemente controllando dal controller, come il seguente codice
open fun post(@RequestBody cls: Course, request: HttpServletRequest): ResponseEntity<*> {
if (classService.checkClassAlreadyExist(cls)) {
return responseConflict(cls)
}
createdClass = classService.save(createdClass)
return responseOK(createdClass)
}
Oppure potrei usare un po 'di DTO
per comunicare tra il livello di servizio e il controller. E quel DTO
ha alcune proprietà, che possono indicare lo stato della voce duplicata trovata. Sono anche consapevole del fatto che ControllerAdvice
può gestire Eccezione in modo più elegante.
Quindi avrei bisogno di un suggerimento quale sarà il modo migliore per gestire la voce duplicata in DB?
======= ======= UPDATE
Nel mio caso applicare un vincolo di unicità in DB potrebbe non essere possibile. Ad esempio, le proprietà di una classe possono essere Name: Nine, Section: A, Shift: Morning
e un'altra proprietà di classe Name: Nine, Section: A, Shift: Day
. In questo caso il vincolo è la combinazione dei valori dell'entità. La stessa combinazione non dovrebbe essere presente in DB. Quindi dovrei controllare l'univocità dal livello dell'applicazione.