From bf9ddc93f9e66cd6b503e330f2983c19017bafa8 Mon Sep 17 00:00:00 2001 From: luevard <99143550+saucepommefrite@users.noreply.github.com> Date: Thu, 16 May 2024 09:43:27 +0200 Subject: [PATCH] :sparkles: Connect with email OR username --- .../main/kotlin/allin/data/UserDataSource.kt | 3 ++- .../allin/data/mock/MockUserDataSource.kt | 13 ++++++++---- .../data/postgres/PostgresUserDataSource.kt | 20 +++++++++++-------- .../src/main/kotlin/allin/model/ApiMessage.kt | 3 ++- .../main/kotlin/allin/routing/userRouter.kt | 6 ++++-- 5 files changed, 29 insertions(+), 16 deletions(-) diff --git a/Sources/src/main/kotlin/allin/data/UserDataSource.kt b/Sources/src/main/kotlin/allin/data/UserDataSource.kt index 95dfdf7..ba4d54a 100644 --- a/Sources/src/main/kotlin/allin/data/UserDataSource.kt +++ b/Sources/src/main/kotlin/allin/data/UserDataSource.kt @@ -9,6 +9,7 @@ interface UserDataSource { fun deleteUser(username: String): Boolean fun addCoins(username: String, amount: Int) fun removeCoins(username: String, amount: Int) - fun userExists(username: String, email: String): Boolean + fun userExists(username: String): Boolean + fun emailExists(email: String): Boolean fun canHaveDailyGift(username: String): Boolean } \ No newline at end of file diff --git a/Sources/src/main/kotlin/allin/data/mock/MockUserDataSource.kt b/Sources/src/main/kotlin/allin/data/mock/MockUserDataSource.kt index 1f56207..454357f 100644 --- a/Sources/src/main/kotlin/allin/data/mock/MockUserDataSource.kt +++ b/Sources/src/main/kotlin/allin/data/mock/MockUserDataSource.kt @@ -3,6 +3,8 @@ package allin.data.mock import allin.data.UserDataSource import allin.dto.UserDTO import allin.model.User +import org.ktorm.dsl.eq +import org.ktorm.dsl.or import java.time.ZonedDateTime class MockUserDataSource(private val mockData: MockDataSource.MockData) : UserDataSource { @@ -10,7 +12,7 @@ class MockUserDataSource(private val mockData: MockDataSource.MockData) : UserDa private val lastGifts get() = mockData.lastGifts override fun getUserByUsername(username: String): Pair = - users.find { it.username == username }?.let { + users.find { (it.username == username) or (it.email == username) }?.let { Pair( UserDTO( id = it.id, @@ -28,7 +30,7 @@ class MockUserDataSource(private val mockData: MockDataSource.MockData) : UserDa } override fun deleteUser(username: String): Boolean = - users.removeIf { it.username == username } + users.removeIf { (it.username == username) or (it.email == username) } override fun addCoins(username: String, amount: Int) { users.find { it.username == username }?.let { @@ -42,8 +44,11 @@ class MockUserDataSource(private val mockData: MockDataSource.MockData) : UserDa } } - override fun userExists(username: String, email: String): Boolean = - users.any { it.username == username && it.email == email } + override fun userExists(username: String) = + users.any { it.username == username } + + override fun emailExists(email: String) = + users.any { it.email == email } override fun canHaveDailyGift(username: String): Boolean { val value = lastGifts[username]?.let { diff --git a/Sources/src/main/kotlin/allin/data/postgres/PostgresUserDataSource.kt b/Sources/src/main/kotlin/allin/data/postgres/PostgresUserDataSource.kt index 6e48233..932cda8 100644 --- a/Sources/src/main/kotlin/allin/data/postgres/PostgresUserDataSource.kt +++ b/Sources/src/main/kotlin/allin/data/postgres/PostgresUserDataSource.kt @@ -19,7 +19,7 @@ import java.time.Instant.now class PostgresUserDataSource(private val database: Database) : UserDataSource { override fun getUserByUsername(username: String): Pair = database.users - .find { it.username eq username } + .find { (it.username eq username) or (it.email eq username) } ?.let { it.toUserDTO() to it.password } ?: (null to null) @@ -37,13 +37,7 @@ class PostgresUserDataSource(private val database: Database) : UserDataSource { } override fun deleteUser(username: String): Boolean = - database.users.removeIf { it.username eq username } > 0 - - override fun userExists(username: String, email: String): Boolean { - return database.users.filter { - (it.username eq username) and (it.email eq email) - }.totalRecords > 0 - } + database.users.removeIf { (it.username eq username) or (it.email eq username) } > 0 override fun addCoins(username: String, amount: Int) { database.users @@ -57,6 +51,16 @@ class PostgresUserDataSource(private val database: Database) : UserDataSource { ?.set(UsersEntity.nbCoins.name, UsersEntity.nbCoins - amount) } + override fun userExists(username: String) = + database.users.filter { + (it.username eq username) + }.totalRecords > 0 + + override fun emailExists(email: String) = + database.users.filter { + (it.email eq email) + }.totalRecords > 0 + override fun canHaveDailyGift(username: String): Boolean { val request = "SELECT CASE WHEN DATE(NOW()) > DATE(lastgift) THEN true ELSE false END AS is_lastgift_greater_than_1_day FROM utilisateur WHERE username = '$username';" diff --git a/Sources/src/main/kotlin/allin/model/ApiMessage.kt b/Sources/src/main/kotlin/allin/model/ApiMessage.kt index b8b3ed3..a006be2 100644 --- a/Sources/src/main/kotlin/allin/model/ApiMessage.kt +++ b/Sources/src/main/kotlin/allin/model/ApiMessage.kt @@ -7,7 +7,8 @@ object ApiMessage { const val BET_NOT_FOUND = "Bet not found." const val BET_ALREADY_EXIST = "Bet already exists." const val INCORRECT_LOGIN_PASSWORD = "Login and/or password incorrect." - const val USER_ALREADY_EXISTS = "Mail and/or username already exists." + const val USER_ALREADY_EXISTS = "Username already exists." + const val MAIL_ALREADY_EXISTS = "Mail already exists." const val INVALID_MAIL = "Invalid mail." const val PARTICIPATION_NOT_FOUND = "Participation not found." const val NOT_ENOUGH_COINS = "Not enough coins." diff --git a/Sources/src/main/kotlin/allin/routing/userRouter.kt b/Sources/src/main/kotlin/allin/routing/userRouter.kt index a62bc91..d37b4e6 100644 --- a/Sources/src/main/kotlin/allin/routing/userRouter.kt +++ b/Sources/src/main/kotlin/allin/routing/userRouter.kt @@ -56,10 +56,12 @@ fun Application.userRouter() { if (RegexCheckerUser.isEmailInvalid(tempUser.email)) { call.respond(HttpStatusCode.Forbidden, ApiMessage.INVALID_MAIL) } - if (userDataSource.userExists(tempUser.username, tempUser.email)) { + if (userDataSource.userExists(tempUser.username)) { call.respond(HttpStatusCode.Conflict, ApiMessage.USER_ALREADY_EXISTS) } - + if(userDataSource.emailExists(tempUser.email)){ + call.respond(HttpStatusCode.Conflict, ApiMessage.MAIL_ALREADY_EXISTS) + } val user = User( id = UUID.randomUUID().toString(), username = tempUser.username,