Fix friends
continuous-integration/drone/push Build is passing Details

pull/14/head
avalin 11 months ago
parent de80aecc63
commit 04860d14e5

@ -1,8 +1,10 @@
package allin.data
import allin.dto.UserDTO
interface FriendDataSource {
fun addFriend(sender: String, receiver: String)
fun getFriendFromUserId(id: String): List<String>
fun getFriendFromUserId(id: String): List<UserDTO>
fun deleteFriend(senderId: String, receiverId: String): Boolean
fun isFriend(firstUser: String, secondUser: String): Boolean
}

@ -6,6 +6,7 @@ import allin.model.Friend
class MockFriendDataSource(private val mockData: MockDataSource.MockData) : FriendDataSource {
private val friends get() = mockData.friends
private val users get() = mockData.users
override fun addFriend(sender: String, receiver: String) {
mockData.friends.add(Friend(sender, receiver))
@ -14,7 +15,7 @@ class MockFriendDataSource(private val mockData: MockDataSource.MockData) : Frie
override fun getFriendFromUserId(id: String) =
friends.map { Friend(sender = it.sender, receiver = it.receiver) }
.filter { it.sender == id }
.map { it.receiver }
.mapNotNull { users.find { usr -> it.receiver == usr.id }?.toDto() }
override fun deleteFriend(senderId: String, receiverId: String) =
friends.removeIf { (it.sender == senderId) && (it.receiver == receiverId) }

@ -3,8 +3,6 @@ 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 {
@ -13,16 +11,7 @@ class MockUserDataSource(private val mockData: MockDataSource.MockData) : UserDa
override fun getUserByUsername(username: String): Pair<UserDTO?, String?> =
users.find { (it.username == username) or (it.email == username) }?.let {
Pair(
UserDTO(
id = it.id,
username = it.username,
email = it.email,
nbCoins = it.nbCoins,
token = it.token
),
it.password
)
it.toDto() to it.password
} ?: Pair(null, null)
override fun addUser(user: User) {

@ -3,13 +3,11 @@ package allin.data.postgres
import allin.data.FriendDataSource
import allin.data.postgres.entities.FriendEntity
import allin.data.postgres.entities.friends
import allin.data.postgres.entities.users
import org.ktorm.database.Database
import org.ktorm.dsl.and
import org.ktorm.dsl.eq
import org.ktorm.entity.add
import org.ktorm.entity.filter
import org.ktorm.entity.map
import org.ktorm.entity.removeIf
import org.ktorm.entity.*
class PostgresFriendDataSource(private val database: Database) : FriendDataSource {
override fun addFriend(sender: String, receiver: String) {
@ -24,11 +22,15 @@ class PostgresFriendDataSource(private val database: Database) : FriendDataSourc
override fun getFriendFromUserId(id: String) =
database.friends.map { it.toFriend() }
.filter { it.sender == id }
.map { it.receiver }
.mapNotNull {
database.users.find { usr ->
usr.id eq it.receiver
}?.toUserDTO()
}
override fun deleteFriend(senderId: String, receiverId: String): Boolean {
database.friends.removeIf { (it.sender eq senderId) and (it.receiver eq receiverId) }
database.friends.removeIf { (it.sender eq receiverId) and (it.receiver eq senderId) }
return database.friends.removeIf { (it.sender eq senderId) and (it.receiver eq receiverId) } > 0
}

@ -1,5 +1,6 @@
package allin.model
import allin.dto.UserDTO
import kotlinx.serialization.Serializable
const val DEFAULT_COIN_AMOUNT = 500
@ -14,7 +15,16 @@ data class User(
var password: String,
var nbCoins: Int = DEFAULT_COIN_AMOUNT,
var token: String? = null
)
) {
fun toDto() =
UserDTO(
id = id,
username = username,
email = email,
nbCoins = nbCoins,
token = token
)
}
@Serializable
data class UserRequest(

@ -1,14 +1,13 @@
package allin.routing
import allin.dataSource
import allin.dto.UserDTO
import allin.ext.hasToken
import allin.ext.verifyUserFromToken
import allin.model.ApiMessage
import allin.model.Bet
import io.github.smiley4.ktorswaggerui.dsl.get
import io.github.smiley4.ktorswaggerui.dsl.post
import io.ktor.http.*
import io.ktor.server.application.*
import io.ktor.server.auth.*
import io.ktor.server.auth.jwt.*
@ -32,7 +31,7 @@ fun Application.friendRouter() {
response {
HttpStatusCode.Accepted to {
description = "The list of friends is available"
body<List<Bet>> {
body<List<UserDTO>> {
description = "List of friends"
}
}
@ -58,7 +57,7 @@ fun Application.friendRouter() {
response {
HttpStatusCode.Created to {
description = "the friend has been added"
body<String>() {
body<String> {
description = "Friend with assigned id"
}
}
@ -70,7 +69,10 @@ fun Application.friendRouter() {
}) {
hasToken { principal ->
val requestMap = call.receive<Map<String, String>>()
val usernameFriend = requestMap["username"] ?: return@hasToken call.respond(HttpStatusCode.BadRequest, "Username is missing")
val usernameFriend = requestMap["username"] ?: return@hasToken call.respond(
HttpStatusCode.BadRequest,
"Username is missing"
)
val username = tokenManagerBet.getUsernameFromToken(principal)
val user = userDataSource.getUserByUsername(username).first
@ -78,14 +80,12 @@ fun Application.friendRouter() {
if (user == null || userFriend == null) {
call.respond(HttpStatusCode.Conflict, ApiMessage.USER_NOT_FOUND)
}
else if (userFriend == user) {
call.respond(HttpStatusCode.Conflict,ApiMessage.FRIENDS_REQUEST_HIMSELF)
}
else {
} else if (userFriend == user) {
call.respond(HttpStatusCode.Conflict, ApiMessage.FRIENDS_REQUEST_HIMSELF)
} else {
val friendlist = friendDataSource.getFriendFromUserId(user.id)
if (friendlist.contains(userFriend.id)) {
call.respond(HttpStatusCode.Conflict,ApiMessage.FRIENDS_ALREADY_EXISTS)
if (friendlist.map { it.id }.contains(userFriend.id)) {
call.respond(HttpStatusCode.Conflict, ApiMessage.FRIENDS_ALREADY_EXISTS)
} else {
friendDataSource.addFriend(user.id, userFriend.id)
call.respond(HttpStatusCode.Created, usernameFriend)
@ -105,7 +105,7 @@ fun Application.friendRouter() {
response {
HttpStatusCode.Created to {
description = "the friend has been delete"
body<String>() {
body<String> {
description = "Friend with assigned id"
}
}
@ -117,7 +117,10 @@ fun Application.friendRouter() {
}) {
hasToken { principal ->
val requestMap = call.receive<Map<String, String>>()
val usernameFriend = requestMap["username"] ?: return@hasToken call.respond(HttpStatusCode.BadRequest, "Username is missing")
val usernameFriend = requestMap["username"] ?: return@hasToken call.respond(
HttpStatusCode.BadRequest,
"Username is missing"
)
val username = tokenManagerBet.getUsernameFromToken(principal)
val user = userDataSource.getUserByUsername(username).first
@ -127,8 +130,8 @@ fun Application.friendRouter() {
call.respond(HttpStatusCode.Conflict, ApiMessage.USER_NOT_FOUND)
} else {
val friendlist = friendDataSource.getFriendFromUserId(user.id)
if (!friendlist.contains(userFriend.id)) {
call.respond(HttpStatusCode.Conflict,ApiMessage.FRIENDS_DOESNT_EXISTS)
if (!friendlist.map { it.id }.contains(userFriend.id)) {
call.respond(HttpStatusCode.Conflict, ApiMessage.FRIENDS_DOESNT_EXISTS)
} else {
friendDataSource.deleteFriend(user.id, userFriend.id)
call.respond(HttpStatusCode.Created, usernameFriend)

Loading…
Cancel
Save