Test User image
continuous-integration/drone/push Build is passing Details

pull/17/head
Lucas EVARD 11 months ago
parent 6de6f78fe2
commit f9ae6c399b

@ -17,7 +17,8 @@ class MockUserDataSource(private val mockData: MockDataSource.MockData) : UserDa
username = it.username,
email = it.email,
nbCoins = it.nbCoins,
token = it.token
token = it.token,
image = null
),
it.password
)

@ -128,7 +128,7 @@ class PostgresDataSource : AllInDataSource() {
database.execute(
"""
CREATE TABLE IF NOT EXISTS public.userimage
CREATE TABLE IF NOT EXISTS userimage
(
user_id VARCHAR(255) PRIMARY KEY,
image bytea

@ -18,7 +18,7 @@ class PostgresUserDataSource(private val database: Database) : UserDataSource {
override fun getUserByUsername(username: String): Pair<UserDTO?, String?> =
database.users
.find { (it.username eq username) or (it.email eq username) }
?.let { it.toUserDTO() to it.password }
?.let { it.toUserDTO(database) to it.password }
?: (null to null)
override fun addUser(user: User) {

@ -1,8 +1,12 @@
package allin.data.postgres.entities
import allin.dto.UserDTO
import allin.routing.imageManagerUser
import allin.utils.AppConfig
import org.ktorm.database.Database
import org.ktorm.dsl.eq
import org.ktorm.entity.Entity
import org.ktorm.entity.find
import org.ktorm.entity.sequenceOf
import org.ktorm.schema.Table
import org.ktorm.schema.int
@ -20,14 +24,24 @@ interface UserEntity : Entity<UserEntity> {
var nbCoins: Int
var lastGift: Instant
fun toUserDTO() =
fun toUserDTO(database: Database) =
UserDTO(
id = id,
username = username,
email = email,
nbCoins = nbCoins,
token = null
token = null,
image = getImage(id, database)
)
fun getImage(userId: String, database: Database): String? {
val imageByte = database.usersimage.find { it.id eq id }?.image ?: return null
val urlfile = "image/$userId"
if (!imageManagerUser.imageAvailable(urlfile)) {
imageManagerUser.saveImage(urlfile, imageByte)
}
return "${AppConfig.urlManager.getURL()}${urlfile}"
}
}
object UsersEntity : Table<UserEntity>("users") {

@ -8,5 +8,6 @@ data class UserDTO(
val username: String,
val email: String,
val nbCoins: Int,
var token: String?
var token: String?,
val image: String?
)

@ -24,6 +24,8 @@ import java.util.*
val RegexCheckerUser = AppConfig.regexChecker
val CryptManagerUser = AppConfig.cryptManager
val tokenManagerUser = AppConfig.tokenManager
val imageManagerUser = AppConfig.imageManager
const val DEFAULT_COINS = 500
@ -59,11 +61,9 @@ fun Application.userRouter() {
val tempUser = call.receive<UserRequest>()
if (RegexCheckerUser.isEmailInvalid(tempUser.email)) {
call.respond(HttpStatusCode.Forbidden, ApiMessage.INVALID_MAIL)
}
else if (userDataSource.userExists(tempUser.username)) {
} else if (userDataSource.userExists(tempUser.username)) {
call.respond(HttpStatusCode.Conflict, ApiMessage.USER_ALREADY_EXISTS)
}
else if (userDataSource.emailExists(tempUser.email)) {
} else if (userDataSource.emailExists(tempUser.email)) {
call.respond(HttpStatusCode.Conflict, ApiMessage.MAIL_ALREADY_EXISTS)
} else {
val user = User(
@ -113,14 +113,16 @@ fun Application.userRouter() {
get("/users/images/{fileName}") {
val fileName = call.parameters["fileName"]
val file = File("images/$fileName.png")
val urlfile = "images/$fileName"
val file = File("$urlfile.png")
if (file.exists()) {
call.respondFile(file)
} else {
val imageBytes = userDataSource.getImage(fileName.toString())
if (imageBytes != null) {
file.parentFile.mkdirs()
file.writeBytes(imageBytes)
imageManagerUser.saveImage(urlfile, imageBytes.toString())
call.respondFile(file)
} else {
call.respond(HttpStatusCode.NotFound, "File not found")
@ -241,21 +243,19 @@ fun Application.userRouter() {
}) {
hasToken { principal ->
verifyUserFromToken(userDataSource, principal) { user , _ ->
verifyUserFromToken(userDataSource, principal) { user, _ ->
val base64Image = call.receiveText()
val imageBytes = Base64.getDecoder().decode(base64Image)
val urlfile = "images/${user.id}"
val file = File("${urlfile}.png")
file.parentFile.mkdirs()
file.writeBytes(imageBytes)
val imageByteArray = imageManagerUser.saveImage(urlfile, base64Image)
if (imageByteArray != null && imageByteArray.isNotEmpty()) {
userDataSource.removeImage(user.id)
userDataSource.addImage(user.id,imageBytes)
if(isCodeFirstContainer.isEmpty()){
userDataSource.addImage(user.id, imageByteArray)
if (isCodeFirstContainer.isEmpty()) {
call.respond(HttpStatusCode.OK, "http://${hostIP}:${hostPort}/users/${urlfile}")
} else call.respond(HttpStatusCode.OK, "${isCodeFirstContainer}/${urlfile}")
}
else call.respond(HttpStatusCode.OK, "${isCodeFirstContainer}/${urlfile}")
}
}
}

@ -8,4 +8,6 @@ object AppConfig {
val tokenManager = TokenManager.getInstance(config)
val regexChecker = RegexChecker()
val cryptManager = CryptManager()
val imageManager = ImageManager()
val urlManager = URLManager()
}

@ -0,0 +1,22 @@
package allin.utils
import java.io.File
import java.util.*
class ImageManager {
fun saveImage(urlfile: String, base64Image: String): ByteArray? {
val imageBytes = Base64.getDecoder().decode(base64Image)
val file = File("${urlfile}.png")
file.parentFile.mkdirs()
file.writeBytes(imageBytes)
return imageBytes
}
fun saveImage(urlfile: String, base64Image: ByteArray) {
val file = File("${urlfile}.png")
file.parentFile.mkdirs()
file.writeBytes(base64Image)
}
fun imageAvailable(urlfile: String) = File(urlfile).exists()
}

@ -0,0 +1,13 @@
package allin.utils
import allin.hostIP
import allin.hostPort
import allin.isCodeFirstContainer
class URLManager {
fun getURL(): String {
return if (isCodeFirstContainer.isEmpty()) {
"http://$hostIP:$hostPort/"
} else isCodeFirstContainer
}
}
Loading…
Cancel
Save