Fix friend search and status
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/pr Build is failing Details

pull/14/head
avalin 11 months ago
parent c30826ecfe
commit 6fcfefd7b0

@ -1,6 +1,7 @@
package allin.data package allin.data
import allin.dto.UserDTO import allin.dto.UserDTO
import allin.model.FriendStatus
interface FriendDataSource { interface FriendDataSource {
fun addFriend(sender: String, receiver: String) fun addFriend(sender: String, receiver: String)
@ -8,4 +9,11 @@ interface FriendDataSource {
fun deleteFriend(senderId: String, receiverId: String): Boolean fun deleteFriend(senderId: String, receiverId: String): Boolean
fun isFriend(firstUser: String, secondUser: String): Boolean fun isFriend(firstUser: String, secondUser: String): Boolean
fun filterUsersByUsername(fromUserId: String, search: String): List<UserDTO> fun filterUsersByUsername(fromUserId: String, search: String): List<UserDTO>
fun getFriendStatus(firstUser: String, secondUser: String) =
if (isFriend(firstUser, secondUser)) {
if (isFriend(secondUser, firstUser)) {
FriendStatus.FRIEND
} else FriendStatus.REQUESTED
} else FriendStatus.NOT_FRIEND
} }

@ -18,9 +18,12 @@ class MockFriendDataSource(private val mockData: MockDataSource.MockData) : Frie
friends.map { Friend(sender = it.sender, receiver = it.receiver) } friends.map { Friend(sender = it.sender, receiver = it.receiver) }
.filter { it.sender == id } .filter { it.sender == id }
.mapNotNull { .mapNotNull {
users users.find { usr -> it.receiver == usr.id }
.find { usr -> it.receiver == usr.id } ?.toDto(
?.toDto(friendStatus = FriendStatus.FRIEND) friendStatus = if (isFriend(it.receiver, id)) {
FriendStatus.FRIEND
} else FriendStatus.REQUESTED
)
} }
override fun deleteFriend(senderId: String, receiverId: String) = override fun deleteFriend(senderId: String, receiverId: String) =
@ -28,27 +31,12 @@ class MockFriendDataSource(private val mockData: MockDataSource.MockData) : Frie
override fun isFriend(firstUser: String, secondUser: String) = override fun isFriend(firstUser: String, secondUser: String) =
friends friends.any { (it.sender == firstUser) and (it.receiver == secondUser) }
.filter { (it.sender == firstUser) and (it.receiver == secondUser) }
.map { Friend(sender = it.sender, receiver = it.receiver) }
.isNotEmpty()
override fun filterUsersByUsername(fromUserId: String, search: String): List<UserDTO> = override fun filterUsersByUsername(fromUserId: String, search: String): List<UserDTO> =
users.filter { (it.username.contains(search, ignoreCase = true)) } users.filter { (it.username.contains(search, ignoreCase = true)) }
.map { user -> .map { user ->
user.toDto( user.toDto(friendStatus = getFriendStatus(fromUserId, user.id))
friendStatus = friends.filter { friend ->
friend.sender == fromUserId && friend.receiver == user.id
}.let {
if (it.isEmpty()) FriendStatus.NOT_FRIEND
else friends.filter { friend ->
friend.sender == user.id && friend.receiver == fromUserId
}.let {
if (it.isEmpty()) FriendStatus.REQUESTED
else FriendStatus.FRIEND
}
}
)
} }
} }

@ -3,6 +3,7 @@ package allin.data.postgres
import allin.data.* import allin.data.*
import allin.ext.execute import allin.ext.execute
import org.ktorm.database.Database import org.ktorm.database.Database
import org.ktorm.support.postgresql.PostgreSqlDialect
class PostgresDataSource : AllInDataSource() { class PostgresDataSource : AllInDataSource() {
@ -20,7 +21,8 @@ class PostgresDataSource : AllInDataSource() {
database = Database.connect( database = Database.connect(
url = url, url = url,
user = dbUser, user = dbUser,
password = dbPassword password = dbPassword,
dialect = PostgreSqlDialect()
) )
database.execute( database.execute(

@ -3,14 +3,15 @@ package allin.data.postgres
import allin.data.FriendDataSource import allin.data.FriendDataSource
import allin.data.postgres.entities.FriendEntity import allin.data.postgres.entities.FriendEntity
import allin.data.postgres.entities.friends import allin.data.postgres.entities.friends
import allin.data.postgres.entities.getFriendStatus
import allin.data.postgres.entities.users import allin.data.postgres.entities.users
import allin.dto.UserDTO import allin.dto.UserDTO
import allin.ext.toLowerCase
import allin.model.FriendStatus import allin.model.FriendStatus
import org.ktorm.database.Database import org.ktorm.database.Database
import org.ktorm.dsl.and import org.ktorm.dsl.and
import org.ktorm.dsl.eq import org.ktorm.dsl.eq
import org.ktorm.dsl.like import org.ktorm.dsl.like
import org.ktorm.dsl.notEq
import org.ktorm.entity.* import org.ktorm.entity.*
class PostgresFriendDataSource(private val database: Database) : FriendDataSource { class PostgresFriendDataSource(private val database: Database) : FriendDataSource {
@ -29,7 +30,11 @@ class PostgresFriendDataSource(private val database: Database) : FriendDataSourc
.mapNotNull { .mapNotNull {
database.users.find { usr -> database.users.find { usr ->
usr.id eq it.receiver usr.id eq it.receiver
}?.toUserDTO(friendStatus = FriendStatus.FRIEND) }?.toUserDTO(
friendStatus = if (isFriend(it.receiver, id)) {
FriendStatus.FRIEND
} else FriendStatus.REQUESTED
)
} }
@ -39,18 +44,10 @@ class PostgresFriendDataSource(private val database: Database) : FriendDataSourc
} }
override fun isFriend(firstUser: String, secondUser: String) = override fun isFriend(firstUser: String, secondUser: String) =
database.friends database.friends.any { (it.sender eq firstUser) and (it.receiver eq secondUser) }
.filter { (it.sender eq firstUser) and (it.receiver eq secondUser) }
.map { it.toFriend() }
.isNotEmpty()
override fun filterUsersByUsername(fromUserId: String, search: String): List<UserDTO> = override fun filterUsersByUsername(fromUserId: String, search: String): List<UserDTO> =
database.users.filter { database.users
it.username like "%$search%" .filter { (it.username.toLowerCase() like "%$search%") and (it.id notEq fromUserId) }
} .map { user -> user.toUserDTO(friendStatus = getFriendStatus(fromUserId, user.id)) }
.map { user ->
user.toUserDTO(
friendStatus = database.getFriendStatus(fromUserId, user.id)
)
}
} }

@ -1,13 +1,8 @@
package allin.data.postgres.entities package allin.data.postgres.entities
import allin.model.Friend import allin.model.Friend
import allin.model.FriendStatus
import org.ktorm.database.Database import org.ktorm.database.Database
import org.ktorm.dsl.and
import org.ktorm.dsl.eq
import org.ktorm.entity.Entity import org.ktorm.entity.Entity
import org.ktorm.entity.filter
import org.ktorm.entity.isEmpty
import org.ktorm.entity.sequenceOf import org.ktorm.entity.sequenceOf
import org.ktorm.schema.Table import org.ktorm.schema.Table
import org.ktorm.schema.varchar import org.ktorm.schema.varchar
@ -30,19 +25,4 @@ object FriendsEntity : Table<FriendEntity>("friend") {
val receiver = varchar("receiver").primaryKey().bindTo { it.receiver } val receiver = varchar("receiver").primaryKey().bindTo { it.receiver }
} }
val Database.friends get() = this.sequenceOf(FriendsEntity) val Database.friends get() = this.sequenceOf(FriendsEntity)
fun Database.getFriendStatus(ofUserId: String, withUserId: String) =
this.friends
.filter { (it.receiver eq withUserId) and (it.sender eq ofUserId) }
.let {
if (it.isEmpty()) {
FriendStatus.NOT_FRIEND
} else {
this.friends
.filter { (it.receiver eq ofUserId) and (it.sender eq withUserId) }
.let {
if (it.isEmpty()) FriendStatus.REQUESTED
else FriendStatus.FRIEND
}
}
}

@ -1,6 +1,9 @@
package allin.ext package allin.ext
import org.ktorm.database.Database import org.ktorm.database.Database
import org.ktorm.expression.FunctionExpression
import org.ktorm.schema.ColumnDeclaring
import org.ktorm.schema.VarcharSqlType
import java.sql.ResultSet import java.sql.ResultSet
fun Database.executeWithResult(request: String): ResultSet? { fun Database.executeWithResult(request: String): ResultSet? {
@ -26,4 +29,20 @@ fun Database.execute(request: String) {
connection.prepareStatement(request).execute() connection.prepareStatement(request).execute()
connection.commit() connection.commit()
} }
}
fun ColumnDeclaring<String>.toLowerCase(): FunctionExpression<String> {
return FunctionExpression(
functionName = "LOWER",
arguments = listOf(this.asExpression()),
sqlType = VarcharSqlType
)
}
fun ColumnDeclaring<String>.toUpperCase(): FunctionExpression<String> {
return FunctionExpression(
functionName = "UPPER",
arguments = listOf(this.asExpression()),
sqlType = VarcharSqlType
)
} }
Loading…
Cancel
Save