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, username = it.username,
email = it.email, email = it.email,
nbCoins = it.nbCoins, nbCoins = it.nbCoins,
token = it.token token = it.token,
image = null
), ),
it.password it.password
) )

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

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

@ -1,8 +1,12 @@
package allin.data.postgres.entities package allin.data.postgres.entities
import allin.dto.UserDTO import allin.dto.UserDTO
import allin.routing.imageManagerUser
import allin.utils.AppConfig
import org.ktorm.database.Database import org.ktorm.database.Database
import org.ktorm.dsl.eq
import org.ktorm.entity.Entity import org.ktorm.entity.Entity
import org.ktorm.entity.find
import org.ktorm.entity.sequenceOf import org.ktorm.entity.sequenceOf
import org.ktorm.schema.Table import org.ktorm.schema.Table
import org.ktorm.schema.int import org.ktorm.schema.int
@ -20,14 +24,24 @@ interface UserEntity : Entity<UserEntity> {
var nbCoins: Int var nbCoins: Int
var lastGift: Instant var lastGift: Instant
fun toUserDTO() = fun toUserDTO(database: Database) =
UserDTO( UserDTO(
id = id, id = id,
username = username, username = username,
email = email, email = email,
nbCoins = nbCoins, 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") { object UsersEntity : Table<UserEntity>("users") {

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

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