Skip to content

Commit 80783ef

Browse files
committed
#45 Handle link violation exception
1 parent 3010b8e commit 80783ef

File tree

11 files changed

+36
-17
lines changed

11 files changed

+36
-17
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
package ru.ifmo.se.dating.exception
2+
3+
class ConflictException(message: String) : GenericException(message)

backend/foundation/src/main/kotlin/ru/ifmo/se/dating/spring/SpringExceptionMapping.kt

+5-3
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,11 @@ import org.springframework.http.ResponseEntity
55
import org.springframework.web.bind.annotation.ExceptionHandler
66
import org.springframework.web.bind.annotation.RestControllerAdvice
77
import ru.ifmo.se.dating.api.GeneralErrorMessage
8-
import ru.ifmo.se.dating.exception.AuthenticationException
98
import ru.ifmo.se.dating.exception.GenericException
109
import ru.ifmo.se.dating.exception.InvalidValueException
1110
import ru.ifmo.se.dating.exception.NotFoundException
11+
import ru.ifmo.se.dating.exception.ConflictException
12+
import ru.ifmo.se.dating.exception.AuthenticationException
1213

1314
interface SpringExceptionMapping {
1415
fun httpCode(exception: GenericException): HttpStatus?
@@ -31,17 +32,18 @@ interface SpringDomainExceptionMapping<T : GenericException> : SpringExceptionMa
3132
class SpringGenericExceptionHandler(private val mapping: SpringExceptionMapping) {
3233
val GenericException.httpCode: HttpStatus
3334
get() = mapping.httpCode(this) ?: when (this) {
35+
is AuthenticationException -> HttpStatus.UNAUTHORIZED
36+
is ConflictException -> HttpStatus.CONFLICT
3437
is InvalidValueException -> HttpStatus.BAD_REQUEST
3538
is NotFoundException -> HttpStatus.NOT_FOUND
36-
is AuthenticationException -> HttpStatus.UNAUTHORIZED
3739
else -> throw NotImplementedError("$this")
3840
}
3941

4042
@ExceptionHandler(GenericException::class)
4143
fun handle(exception: GenericException) =
4244
exception.toResponseEntity()
4345

44-
fun GenericException.toResponseEntity() =
46+
fun GenericException.toResponseEntity(): ResponseEntity<GeneralErrorMessage> =
4547
ResponseEntity
4648
.status(this.httpCode)
4749
.body(

backend/foundation/src/main/kotlin/ru/ifmo/se/dating/spring/SpringJooqDatabase.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import reactor.core.publisher.Mono
1717
import reactor.kotlin.core.publisher.toFlux
1818
import ru.ifmo.se.dating.storage.jooq.DSLBlock
1919
import ru.ifmo.se.dating.storage.jooq.JooqDatabase
20-
import ru.ifmo.se.dating.storage.jooq.exception.toStorage
20+
import ru.ifmo.se.dating.storage.jooq.toStorage
2121

2222
@Component
2323
class SpringJooqDatabase(private val database: DatabaseClient) : JooqDatabase {

backend/foundation/src/main/kotlin/ru/ifmo/se/dating/storage/jooq/exception/LinkViolationException.kt backend/foundation/src/main/kotlin/ru/ifmo/se/dating/storage/exception/LinkViolationException.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package ru.ifmo.se.dating.storage.jooq.exception
1+
package ru.ifmo.se.dating.storage.exception
22

33
import ru.ifmo.se.dating.exception.StorageException
44

backend/foundation/src/main/kotlin/ru/ifmo/se/dating/storage/jooq/exception/UniqueViolationException.kt backend/foundation/src/main/kotlin/ru/ifmo/se/dating/storage/exception/UniqueViolationException.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package ru.ifmo.se.dating.storage.jooq.exception
1+
package ru.ifmo.se.dating.storage.exception
22

33
import ru.ifmo.se.dating.exception.StorageException
44

backend/foundation/src/main/kotlin/ru/ifmo/se/dating/storage/jooq/exception/UnknownException.kt backend/foundation/src/main/kotlin/ru/ifmo/se/dating/storage/exception/UnknownException.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package ru.ifmo.se.dating.storage.jooq.exception
1+
package ru.ifmo.se.dating.storage.exception
22

33
import ru.ifmo.se.dating.exception.StorageException
44

backend/foundation/src/main/kotlin/ru/ifmo/se/dating/storage/jooq/exception/ConstraintViolationMapping.kt backend/foundation/src/main/kotlin/ru/ifmo/se/dating/storage/jooq/ConstraintViolationMapping.kt

+4-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
1-
package ru.ifmo.se.dating.storage.jooq.exception
1+
package ru.ifmo.se.dating.storage.jooq
22

33
import org.jooq.exception.IntegrityConstraintViolationException
44
import ru.ifmo.se.dating.exception.StorageException
5+
import ru.ifmo.se.dating.storage.exception.LinkViolationException
6+
import ru.ifmo.se.dating.storage.exception.UniqueViolationException
7+
import ru.ifmo.se.dating.storage.exception.UnknownException
58

69
private typealias Mapping =
710
(IntegrityConstraintViolationException) -> StorageException

backend/people/src/main/kotlin/ru/ifmo/se/dating/people/api/HttpExceptionMapping.kt

+5-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@ package ru.ifmo.se.dating.people.api
22

33
import org.springframework.http.HttpStatus
44
import org.springframework.stereotype.Controller
5+
import ru.ifmo.se.dating.exception.ConflictException
56
import ru.ifmo.se.dating.people.exception.DomainException
7+
import ru.ifmo.se.dating.people.exception.IncompletePersonException
68
import ru.ifmo.se.dating.spring.SpringDomainExceptionMapping
79

810
@Controller
@@ -11,5 +13,7 @@ class HttpExceptionMapping : SpringDomainExceptionMapping<DomainException> {
1113
get() = DomainException::class.java
1214

1315
override fun domainHttpCode(exception: DomainException): HttpStatus =
14-
TODO("There are no domain exceptions yet")
16+
when(exception) {
17+
is IncompletePersonException -> TODO()
18+
}
1519
}

backend/people/src/main/kotlin/ru/ifmo/se/dating/people/exception/ConflictException.kt

-3
This file was deleted.

backend/people/src/main/kotlin/ru/ifmo/se/dating/people/logic/basic/BasicPersonService.kt

+7-2
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,24 @@ package ru.ifmo.se.dating.people.logic.basic
33
import org.springframework.stereotype.Service
44
import org.springframework.transaction.annotation.Isolation
55
import org.springframework.transaction.annotation.Transactional
6+
import ru.ifmo.se.dating.exception.InvalidValueException
67
import ru.ifmo.se.dating.exception.orThrowNotFound
7-
import ru.ifmo.se.dating.people.exception.ConflictException
8+
import ru.ifmo.se.dating.exception.ConflictException
89
import ru.ifmo.se.dating.people.exception.IncompletePersonException
910
import ru.ifmo.se.dating.people.logic.PersonService
1011
import ru.ifmo.se.dating.people.model.Person
1112
import ru.ifmo.se.dating.people.model.PersonVariant
1213
import ru.ifmo.se.dating.people.storage.PersonStorage
1314
import ru.ifmo.se.dating.security.auth.User
15+
import ru.ifmo.se.dating.storage.exception.LinkViolationException
1416

1517
@Service
1618
class BasicPersonService(private val storage: PersonStorage) : PersonService {
17-
override suspend fun edit(draft: Person.Draft) =
19+
override suspend fun edit(draft: Person.Draft) = try {
1820
storage.upsert(draft)
21+
} catch (exception: LinkViolationException) {
22+
throw InvalidValueException("faculty or location id does not exist", exception)
23+
}
1924

2025
@Transactional(isolation = Isolation.SERIALIZABLE)
2126
override suspend fun save(expected: Person.Draft) {

backend/people/src/main/kotlin/ru/ifmo/se/dating/people/storage/jooq/JooqPersonStorage.kt

+8-3
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,15 @@ import ru.ifmo.se.dating.people.model.Person
1212
import ru.ifmo.se.dating.people.model.PersonVariant
1313
import ru.ifmo.se.dating.people.storage.PersonStorage
1414
import ru.ifmo.se.dating.security.auth.User
15+
import ru.ifmo.se.dating.storage.TxEnv
1516
import ru.ifmo.se.dating.storage.jooq.JooqDatabase
1617

1718
@Repository
18-
class JooqPersonStorage(private val database: JooqDatabase) : PersonStorage {
19-
@Transactional(isolation = Isolation.SERIALIZABLE)
20-
override suspend fun upsert(draft: Person.Draft) {
19+
class JooqPersonStorage(
20+
private val database: JooqDatabase,
21+
private val txEnv: TxEnv,
22+
) : PersonStorage {
23+
override suspend fun upsert(draft: Person.Draft) = txEnv.transactional {
2124
database.only {
2225
val record = draft.toRecord()
2326
insertInto(PERSON)
@@ -38,6 +41,8 @@ class JooqPersonStorage(private val database: JooqDatabase) : PersonStorage {
3841
.set(PERSON.UPDATE_MOMENT, currentOffsetDateTime())
3942
.where(PERSON.ACCOUNT_ID.eq(draft.id.number))
4043
}
44+
45+
Unit
4146
}
4247

4348
override suspend fun setReadyMoment(id: User.Id) = database.only {

0 commit comments

Comments
 (0)