diff --git a/Sources/pom.xml b/Sources/pom.xml
index 9edef89..dd83b7a 100644
--- a/Sources/pom.xml
+++ b/Sources/pom.xml
@@ -37,12 +37,22 @@
ktorm-core
3.2.0
+
+ ch.qos.logback
+ logback-classic
+ ${logback_version}
+
io.ktor
ktor-server-tests-jvm
${ktor_version}
test
+
+ org.slf4j
+ slf4j-api
+ ${slf4j_version}
+
io.ktor
ktor-server-core
diff --git a/Sources/src/main/kotlin/allin/dto/UserDTO.kt b/Sources/src/main/kotlin/allin/dto/UserDTO.kt
new file mode 100644
index 0000000..d59f39c
--- /dev/null
+++ b/Sources/src/main/kotlin/allin/dto/UserDTO.kt
@@ -0,0 +1,15 @@
+package allin.dto
+
+import allin.model.User
+import kotlinx.serialization.Serializable
+
+@Serializable
+data class UserDTO(val username: String,val email: String, val nbCoins: Int)
+@Serializable
+data class UserDTOWithToken(val username: String,val email: String, val nbCoins: Int, val token:String?)
+fun convertUserToUserDTO(user: User): UserDTO {
+ return UserDTO(user.username, user.email, user.nbCoins)
+}
+fun convertUserToUserDTOToken(user: User): UserDTOWithToken {
+ return UserDTOWithToken(user.username, user.email, user.nbCoins,user.token)
+}
diff --git a/Sources/src/main/kotlin/allin/routing/UserRouter.kt b/Sources/src/main/kotlin/allin/routing/UserRouter.kt
index 0630642..473de5e 100644
--- a/Sources/src/main/kotlin/allin/routing/UserRouter.kt
+++ b/Sources/src/main/kotlin/allin/routing/UserRouter.kt
@@ -1,5 +1,6 @@
package allin.routing
+import allin.dto.*
import allin.model.CheckUser
import allin.model.User
import com.typesafe.config.ConfigFactory
@@ -29,7 +30,7 @@ fun Application.UserRouter() {
val user = users.find { it.username == TempUser.username || it.email == TempUser.email }
if(user == null) {
users.add(TempUser)
- call.respond(HttpStatusCode.Created, TempUser)
+ call.respond(HttpStatusCode.Created, convertUserToUserDTO(TempUser))
}
call.respond(HttpStatusCode.Conflict,"Mail or/and username already exist")
}
@@ -40,8 +41,8 @@ fun Application.UserRouter() {
val checkUser = call.receive()
val user = users.find { it.username == checkUser.login || it.email == checkUser.login }
if (user != null && user.password == checkUser.password) {
- user.token=tokenManager.generateJWTToken(user)
- call.respond(HttpStatusCode.OK, user)
+ user.token=tokenManager.generateOrReplaceJWTToken(user)
+ call.respond(HttpStatusCode.OK, convertUserToUserDTOToken(user))
} else {
call.respond(HttpStatusCode.NotFound,"Login and/or password incorrect.")
}
@@ -54,7 +55,7 @@ fun Application.UserRouter() {
val user = users.find { it.username == checkUser.login || it.email == checkUser.login }
if (user != null && user.password == checkUser.password) {
users.remove(user)
- call.respond(HttpStatusCode.Accepted, user)
+ call.respond(HttpStatusCode.Accepted,convertUserToUserDTO(user))
} else {
call.respond(HttpStatusCode.NotFound,"Login and/or password incorrect.")
}
@@ -67,7 +68,7 @@ fun Application.UserRouter() {
val username = principal!!.payload.getClaim("username").asString()
val user = users.find { it.username == username }
if (user != null) {
- call.respond(HttpStatusCode.OK, user)
+ call.respond(HttpStatusCode.OK,convertUserToUserDTO(user))
} else {
call.respond(HttpStatusCode.NotFound, "User not found with the valid token !")
}
diff --git a/Sources/src/main/kotlin/allin/utils/TokenManager.kt b/Sources/src/main/kotlin/allin/utils/TokenManager.kt
index 82999d2..5729406 100644
--- a/Sources/src/main/kotlin/allin/utils/TokenManager.kt
+++ b/Sources/src/main/kotlin/allin/utils/TokenManager.kt
@@ -12,8 +12,9 @@ class TokenManager (val config: HoconApplicationConfig){
val audience=config.property("audience").getString()
val secret=config.property("secret").getString()
val issuer=config.property("issuer").getString()
- val expirationDate = System.currentTimeMillis() + 60000
- fun generateJWTToken(user : User): String {
+ private fun generateJWTToken(user : User): String {
+ val expirationDate = System.currentTimeMillis() + 604800000 // une semaine en miliseconde
+
val token = JWT.create()
.withAudience(audience)
.withIssuer(issuer)
@@ -29,4 +30,22 @@ class TokenManager (val config: HoconApplicationConfig){
.withIssuer(issuer)
.build()
}
+
+ fun generateOrReplaceJWTToken(user: User): String {
+ val userToken = getUserToken(user)
+ if (userToken != null && !isTokenExpired(userToken)) {
+ return userToken
+ } else {
+ return generateJWTToken(user)
+ }
+ }
+
+ private fun isTokenExpired(token: String): Boolean {
+ val expirationTime = JWT.decode(token).expiresAt.time
+ return System.currentTimeMillis() > expirationTime
+ }
+
+ private fun getUserToken(user: User): String? {
+ return user.token
+ }
}
\ No newline at end of file