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