|
|
@ -5,7 +5,7 @@ import allin.data.postgres.entities.FriendEntity
|
|
|
|
import allin.data.postgres.entities.friends
|
|
|
|
import allin.data.postgres.entities.friends
|
|
|
|
import allin.data.postgres.entities.users
|
|
|
|
import allin.data.postgres.entities.users
|
|
|
|
import allin.dto.UserDTO
|
|
|
|
import allin.dto.UserDTO
|
|
|
|
import allin.ext.levenshtein
|
|
|
|
import allin.ext.levenshteinLessEq
|
|
|
|
import allin.ext.toLowerCase
|
|
|
|
import allin.ext.toLowerCase
|
|
|
|
import allin.model.FriendStatus
|
|
|
|
import allin.model.FriendStatus
|
|
|
|
import org.ktorm.database.Database
|
|
|
|
import org.ktorm.database.Database
|
|
|
@ -50,7 +50,7 @@ class PostgresFriendDataSource(private val database: Database) : FriendDataSourc
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
database.users.find { usr ->
|
|
|
|
database.users.find { usr ->
|
|
|
|
usr.id eq it.sender
|
|
|
|
usr.id eq it.sender
|
|
|
|
}?.toUserDTO(database,friendStatus = FriendStatus.NOT_FRIEND)
|
|
|
|
}?.toUserDTO(database, friendStatus = FriendStatus.NOT_FRIEND)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -66,10 +66,25 @@ class PostgresFriendDataSource(private val database: Database) : FriendDataSourc
|
|
|
|
override fun isFriend(firstUser: String, secondUser: String) =
|
|
|
|
override fun isFriend(firstUser: String, secondUser: String) =
|
|
|
|
database.friends.any { (it.sender eq firstUser) and (it.receiver eq secondUser) }
|
|
|
|
database.friends.any { (it.sender eq firstUser) and (it.receiver eq secondUser) }
|
|
|
|
|
|
|
|
|
|
|
|
override fun filterUsersByUsername(fromUserId: String, search: String): List<UserDTO> =
|
|
|
|
override fun filterUsersByUsername(fromUserId: String, search: String): List<UserDTO> {
|
|
|
|
database.users
|
|
|
|
val maxSize = search.length / 2
|
|
|
|
.filter { it.id notEq fromUserId }
|
|
|
|
return database.users
|
|
|
|
.sortedBy { it.username.toLowerCase().levenshtein(search.lowercase()) }
|
|
|
|
.filter { (it.id notEq fromUserId) }
|
|
|
|
.take(10)
|
|
|
|
.mapColumns {
|
|
|
|
.map { user -> user.toUserDTO(database,friendStatus = getFriendStatus(fromUserId, user.id)) }
|
|
|
|
tupleOf(
|
|
|
|
|
|
|
|
it.id,
|
|
|
|
|
|
|
|
it.username.toLowerCase().levenshteinLessEq(search.lowercase(), maxSize)
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
.filter { (_, distance) ->
|
|
|
|
|
|
|
|
distance?.let { it <= maxSize } ?: false
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
.sortedBy { it.second }
|
|
|
|
|
|
|
|
.mapNotNull { (id, _) ->
|
|
|
|
|
|
|
|
id?.let {
|
|
|
|
|
|
|
|
val user = database.users.find { it.id eq id }
|
|
|
|
|
|
|
|
user?.toUserDTO(database, friendStatus = getFriendStatus(fromUserId, user.id))
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|