package be.vandewalleh.routing import be.vandewalleh.entities.User import be.vandewalleh.extensions.respondStatus import be.vandewalleh.extensions.userId import be.vandewalleh.services.UserService import be.vandewalleh.validation.receiveValidated import be.vandewalleh.validation.user.registerValidator import io.ktor.application.* import io.ktor.auth.* import io.ktor.http.* import io.ktor.request.* import io.ktor.response.* import io.ktor.routing.* import org.kodein.di.Kodein import org.kodein.di.generic.instance import org.mindrot.jbcrypt.BCrypt import java.time.LocalDateTime fun Routing.user(kodein: Kodein) { val userService by kodein.instance() route("/user") { post { val user = call.receiveValidated(registerValidator) if (userService.userExists(user.username, user.email)) return@post call.respondStatus(HttpStatusCode.Conflict) val hashedPassword = BCrypt.hashpw(user.password, BCrypt.gensalt()) userService.createUser(user.username, user.email, hashedPassword) call.respondStatus(HttpStatusCode.Created) } authenticate { put { val user = call.receiveValidated(registerValidator) if (userService.userExists(user.username, user.email)) return@put call.respond(HttpStatusCode.Conflict) val hashedPassword = BCrypt.hashpw(user.password, BCrypt.gensalt()) userService.updateUser(call.userId(), user.username, user.email, hashedPassword) call.respondStatus(HttpStatusCode.OK) } delete { val status = if (userService.deleteUser(call.userId())) HttpStatusCode.OK else HttpStatusCode.NotFound call.respondStatus(status) } } } }