diff --git a/Sources/src/main/kotlin/allin/data/mock/MockUserDataSource.kt b/Sources/src/main/kotlin/allin/data/mock/MockUserDataSource.kt index 03a63b2..369dcb9 100644 --- a/Sources/src/main/kotlin/allin/data/mock/MockUserDataSource.kt +++ b/Sources/src/main/kotlin/allin/data/mock/MockUserDataSource.kt @@ -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 ) diff --git a/Sources/src/main/kotlin/allin/data/postgres/PostgresDataSource.kt b/Sources/src/main/kotlin/allin/data/postgres/PostgresDataSource.kt index 8df9ea3..f20b047 100644 --- a/Sources/src/main/kotlin/allin/data/postgres/PostgresDataSource.kt +++ b/Sources/src/main/kotlin/allin/data/postgres/PostgresDataSource.kt @@ -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 diff --git a/Sources/src/main/kotlin/allin/data/postgres/PostgresUserDataSource.kt b/Sources/src/main/kotlin/allin/data/postgres/PostgresUserDataSource.kt index c9e858f..40329f5 100644 --- a/Sources/src/main/kotlin/allin/data/postgres/PostgresUserDataSource.kt +++ b/Sources/src/main/kotlin/allin/data/postgres/PostgresUserDataSource.kt @@ -18,7 +18,7 @@ class PostgresUserDataSource(private val database: Database) : UserDataSource { override fun getUserByUsername(username: String): Pair = 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) { diff --git a/Sources/src/main/kotlin/allin/data/postgres/entities/UserEntity.kt b/Sources/src/main/kotlin/allin/data/postgres/entities/UserEntity.kt index 463b91e..b90fb5d 100644 --- a/Sources/src/main/kotlin/allin/data/postgres/entities/UserEntity.kt +++ b/Sources/src/main/kotlin/allin/data/postgres/entities/UserEntity.kt @@ -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 { 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("users") { diff --git a/Sources/src/main/kotlin/allin/dto/UserDTO.kt b/Sources/src/main/kotlin/allin/dto/UserDTO.kt index b4cc2bf..83b5bd9 100644 --- a/Sources/src/main/kotlin/allin/dto/UserDTO.kt +++ b/Sources/src/main/kotlin/allin/dto/UserDTO.kt @@ -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? ) \ No newline at end of file diff --git a/Sources/src/main/kotlin/allin/model/User.kt b/Sources/src/main/kotlin/allin/model/User.kt index 534add7..fec7d28 100644 --- a/Sources/src/main/kotlin/allin/model/User.kt +++ b/Sources/src/main/kotlin/allin/model/User.kt @@ -33,4 +33,4 @@ data class CheckUser( data class UserImage( val id: String, val image: ByteArray, -) \ No newline at end of file +) diff --git a/Sources/src/main/kotlin/allin/routing/userRouter.kt b/Sources/src/main/kotlin/allin/routing/userRouter.kt index b81a378..7a04fe9 100644 --- a/Sources/src/main/kotlin/allin/routing/userRouter.kt +++ b/Sources/src/main/kotlin/allin/routing/userRouter.kt @@ -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() 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) - userDataSource.removeImage(user.id) - userDataSource.addImage(user.id,imageBytes) - if(isCodeFirstContainer.isEmpty()){ - call.respond(HttpStatusCode.OK, "http://${hostIP}:${hostPort}/users/${urlfile}") + val imageByteArray = imageManagerUser.saveImage(urlfile, base64Image) + if (imageByteArray != null && imageByteArray.isNotEmpty()) { + userDataSource.removeImage(user.id) + 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}") } } } diff --git a/Sources/src/main/kotlin/allin/utils/AppConfig.kt b/Sources/src/main/kotlin/allin/utils/AppConfig.kt index 554e138..7aaddc8 100644 --- a/Sources/src/main/kotlin/allin/utils/AppConfig.kt +++ b/Sources/src/main/kotlin/allin/utils/AppConfig.kt @@ -8,4 +8,6 @@ object AppConfig { val tokenManager = TokenManager.getInstance(config) val regexChecker = RegexChecker() val cryptManager = CryptManager() + val imageManager = ImageManager() + val urlManager = URLManager() } diff --git a/Sources/src/main/kotlin/allin/utils/ImageManager.kt b/Sources/src/main/kotlin/allin/utils/ImageManager.kt new file mode 100644 index 0000000..6429544 --- /dev/null +++ b/Sources/src/main/kotlin/allin/utils/ImageManager.kt @@ -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() +} \ No newline at end of file diff --git a/Sources/src/main/kotlin/allin/utils/URLManager.kt b/Sources/src/main/kotlin/allin/utils/URLManager.kt new file mode 100644 index 0000000..8d4432f --- /dev/null +++ b/Sources/src/main/kotlin/allin/utils/URLManager.kt @@ -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 + } +} \ No newline at end of file