From ffc341980cebc97ca9308049ba6c8e90bf8dcbe9 Mon Sep 17 00:00:00 2001 From: vityaman Date: Sat, 25 May 2024 09:09:08 +0300 Subject: [PATCH 1/3] #120 Handle duplicate yandex connect --- .../core/external/yandex/YandexUser.kt | 8 +++-- .../storage/jooq/JooqYandexAuthStorage.kt | 13 ++++++++- .../spring/api/http/endpoint/AuthApiTest.kt | 29 +++++++++++++++++++ 3 files changed, 47 insertions(+), 3 deletions(-) diff --git a/botalka/src/main/kotlin/ru/vityaman/lms/botalka/core/external/yandex/YandexUser.kt b/botalka/src/main/kotlin/ru/vityaman/lms/botalka/core/external/yandex/YandexUser.kt index 94114ce..56a6849 100644 --- a/botalka/src/main/kotlin/ru/vityaman/lms/botalka/core/external/yandex/YandexUser.kt +++ b/botalka/src/main/kotlin/ru/vityaman/lms/botalka/core/external/yandex/YandexUser.kt @@ -5,8 +5,12 @@ data class YandexUser( val login: Login, ) { @JvmInline - value class Id(val number: Int) + value class Id(val number: Int) { + override fun toString(): String = number.toString() + } @JvmInline - value class Login(val text: String) + value class Login(val text: String) { + override fun toString(): String = text + } } diff --git a/botalka/src/main/kotlin/ru/vityaman/lms/botalka/storage/jooq/JooqYandexAuthStorage.kt b/botalka/src/main/kotlin/ru/vityaman/lms/botalka/storage/jooq/JooqYandexAuthStorage.kt index 365fc2a..f3735e4 100644 --- a/botalka/src/main/kotlin/ru/vityaman/lms/botalka/storage/jooq/JooqYandexAuthStorage.kt +++ b/botalka/src/main/kotlin/ru/vityaman/lms/botalka/storage/jooq/JooqYandexAuthStorage.kt @@ -1,14 +1,16 @@ package ru.vityaman.lms.botalka.storage.jooq +import ru.vityaman.lms.botalka.core.exception.InvalidValueException import ru.vityaman.lms.botalka.core.external.yandex.YandexUser import ru.vityaman.lms.botalka.core.model.User import ru.vityaman.lms.botalka.core.storage.YandexAuthStorage +import ru.vityaman.lms.botalka.storage.jooq.exception.UniqueViolationException import ru.vityaman.lms.botalka.storage.jooq.tables.references.AUTH_YANDEX class JooqYandexAuthStorage( private val database: JooqDatabase, ) : YandexAuthStorage { - override suspend fun create(userId: User.Id, yandexUser: YandexUser) = + override suspend fun create(userId: User.Id, yandexUser: YandexUser) = try { database.only { insertInto( AUTH_YANDEX, @@ -21,6 +23,15 @@ class JooqYandexAuthStorage( yandexUser.login.text, ) }.let { } + } catch (e: UniqueViolationException) { + throw InvalidValueException( + buildString { + append("yandex user '${yandexUser.login}' ") + append("(id '${yandexUser.id}') already connected") + }, + e, + ) + } override suspend fun corresponding(id: YandexUser.Id): User.Id? = database.maybe { diff --git a/botalka/src/test/kotlin/ru/vityaman/lms/botalka/app/spring/api/http/endpoint/AuthApiTest.kt b/botalka/src/test/kotlin/ru/vityaman/lms/botalka/app/spring/api/http/endpoint/AuthApiTest.kt index 4c38040..183fa7b 100644 --- a/botalka/src/test/kotlin/ru/vityaman/lms/botalka/app/spring/api/http/endpoint/AuthApiTest.kt +++ b/botalka/src/test/kotlin/ru/vityaman/lms/botalka/app/spring/api/http/endpoint/AuthApiTest.kt @@ -3,6 +3,8 @@ package ru.vityaman.lms.botalka.app.spring.api.http.endpoint import kotlinx.coroutines.reactor.awaitSingle import kotlinx.coroutines.runBlocking import org.junit.jupiter.api.Test +import org.junit.jupiter.api.assertThrows +import org.springframework.web.reactive.function.client.WebClientResponseException import ru.vityaman.lms.botalka.app.spring.BotalkaTestSuite import ru.vityaman.lms.botalka.app.spring.api.http.client.Api import ru.vityaman.lms.botalka.app.spring.api.http.client.Auth2ViaCodeMessage @@ -32,4 +34,31 @@ class AuthApiTest : BotalkaTestSuite() { ), ).awaitSingle() } + + @Test + fun duplicateRegistration(): Unit = runBlocking { + val api = Api.ofNewbie() + + api.user.userPost( + PostUserRequestMessage( + user = UserDraftMessage("vanya"), + credential = Auth2ViaCodeMessage( + kind = CredentialKindMessage.yandex_code, + code = 654_321, + ), + ), + ).awaitSingle() + + assertThrows { + api.user.userPost( + PostUserRequestMessage( + user = UserDraftMessage("vitya"), + credential = Auth2ViaCodeMessage( + kind = CredentialKindMessage.yandex_code, + code = 123_456, + ), + ), + ).awaitSingle() + } + } } From bc80763d2d2ab20e6e7b60d7df6404ae2c4f9ef4 Mon Sep 17 00:00:00 2001 From: vityaman Date: Sat, 25 May 2024 09:10:28 +0300 Subject: [PATCH 2/3] #120 Rebase onto trunk --- .../lms/botalka/app/spring/api/http/endpoint/AuthApiTest.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/botalka/src/test/kotlin/ru/vityaman/lms/botalka/app/spring/api/http/endpoint/AuthApiTest.kt b/botalka/src/test/kotlin/ru/vityaman/lms/botalka/app/spring/api/http/endpoint/AuthApiTest.kt index 183fa7b..53500e8 100644 --- a/botalka/src/test/kotlin/ru/vityaman/lms/botalka/app/spring/api/http/endpoint/AuthApiTest.kt +++ b/botalka/src/test/kotlin/ru/vityaman/lms/botalka/app/spring/api/http/endpoint/AuthApiTest.kt @@ -39,7 +39,7 @@ class AuthApiTest : BotalkaTestSuite() { fun duplicateRegistration(): Unit = runBlocking { val api = Api.ofNewbie() - api.user.userPost( + api.user.postUser( PostUserRequestMessage( user = UserDraftMessage("vanya"), credential = Auth2ViaCodeMessage( @@ -50,7 +50,7 @@ class AuthApiTest : BotalkaTestSuite() { ).awaitSingle() assertThrows { - api.user.userPost( + api.user.postUser( PostUserRequestMessage( user = UserDraftMessage("vitya"), credential = Auth2ViaCodeMessage( From 5d9e977816d0d28dec801ea7da17da69a9b84876 Mon Sep 17 00:00:00 2001 From: vityaman Date: Sat, 25 May 2024 09:15:55 +0300 Subject: [PATCH 3/3] #120 Fix test --- .../lms/botalka/app/spring/api/http/endpoint/AuthApiTest.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/botalka/src/test/kotlin/ru/vityaman/lms/botalka/app/spring/api/http/endpoint/AuthApiTest.kt b/botalka/src/test/kotlin/ru/vityaman/lms/botalka/app/spring/api/http/endpoint/AuthApiTest.kt index 53500e8..2a25c8a 100644 --- a/botalka/src/test/kotlin/ru/vityaman/lms/botalka/app/spring/api/http/endpoint/AuthApiTest.kt +++ b/botalka/src/test/kotlin/ru/vityaman/lms/botalka/app/spring/api/http/endpoint/AuthApiTest.kt @@ -55,7 +55,7 @@ class AuthApiTest : BotalkaTestSuite() { user = UserDraftMessage("vitya"), credential = Auth2ViaCodeMessage( kind = CredentialKindMessage.yandex_code, - code = 123_456, + code = 654_321, ), ), ).awaitSingle()