feature #9: Create route for register

This commit is contained in:
2019-08-24 02:03:29 +02:00
parent 29463e310e
commit f887b99536
6 changed files with 59 additions and 4 deletions

View File

@@ -145,7 +145,7 @@ fun Application.module() {
// trace { application.log.trace(it.buildText()) } // trace { application.log.trace(it.buildText()) }
authenticate(optional = true) { authenticate(optional = true) {
article(get()) article(get())
auth(get()) auth(get(), get())
citizen(get()) citizen(get())
constitution(get()) constitution(get())
followArticle(get()) followArticle(get())

View File

@@ -40,7 +40,7 @@ class Citizen(override var requester: Requester) : RepositoryI<CitizenEntity> {
.selectOne("resource" to citizen) .selectOne("resource" to citizen)
} }
fun createWithUser(citizen: CitizenEntity): CitizenEntity? { fun insertWithUser(citizen: CitizenEntity): CitizenEntity? {
return requester return requester
.getFunction("insert_citizen_with_user") .getFunction("insert_citizen_with_user")
.selectOne("resource" to citizen) .selectOne("resource" to citizen)

View File

@@ -12,18 +12,27 @@ import io.ktor.request.receive
import io.ktor.response.respondText import io.ktor.response.respondText
import io.ktor.routing.Route import io.ktor.routing.Route
import io.ktor.util.KtorExperimentalAPI import io.ktor.util.KtorExperimentalAPI
import fr.dcproject.entity.Citizen as CitizenEntity
import fr.dcproject.repository.Citizen as CitizenRepository
import fr.dcproject.repository.User as UserRepository import fr.dcproject.repository.User as UserRepository
@KtorExperimentalLocationsAPI @KtorExperimentalLocationsAPI
@KtorExperimentalAPI @KtorExperimentalAPI
fun Route.auth(repo: UserRepository) { fun Route.auth(userRepo: UserRepository, citizenRepo: CitizenRepository) {
post <Paths.LoginRequest> { post <Paths.LoginRequest> {
try { try {
val credentials = call.receive<UserPasswordCredential>() val credentials = call.receive<UserPasswordCredential>()
val user = repo.findByCredentials(credentials) ?: throw BadRequestException("Username not exist or password is wrong") val user = userRepo.findByCredentials(credentials) ?: throw BadRequestException("Username not exist or password is wrong")
call.respondText(JwtConfig.makeToken(user)) call.respondText(JwtConfig.makeToken(user))
} catch (e: MismatchedInputException) { } catch (e: MismatchedInputException) {
throw BadRequestException("You must be send name and password to the request") throw BadRequestException("You must be send name and password to the request")
} }
} }
post <Paths.RegisterRequest> {
val citizen = call.receive<CitizenEntity>()
val created = citizenRepo.insertWithUser(citizen)?.user ?: throw BadRequestException("Bad request")
call.respondText(JwtConfig.makeToken(created))
}
} }

View File

@@ -8,6 +8,7 @@ import io.ktor.locations.Location
@KtorExperimentalLocationsAPI @KtorExperimentalLocationsAPI
object Paths { object Paths {
@Location("/login") class LoginRequest @Location("/login") class LoginRequest
@Location("/register") class RegisterRequest
@Location("/articles") class ArticlesRequest(page: Int = 1, limit: Int = 50, val sort: String? = null, val direction: Direction? = null, val search: String? = null) { @Location("/articles") class ArticlesRequest(page: Int = 1, limit: Int = 50, val sort: String? = null, val direction: Direction? = null, val search: String? = null) {
val page: Int = if (page < 1) 1 else page val page: Int = if (page < 1) 1 else page

View File

@@ -9,6 +9,7 @@ import kotlinx.serialization.json.JsonElement
import kotlinx.serialization.json.JsonPrimitive import kotlinx.serialization.json.JsonPrimitive
import kotlinx.serialization.parse import kotlinx.serialization.parse
import kotlin.test.assertEquals import kotlin.test.assertEquals
import kotlin.test.assertTrue
import kotlin.test.fail import kotlin.test.fail
@ImplicitReflectionSerializer @ImplicitReflectionSerializer
@@ -30,6 +31,14 @@ class KtorServerRestSteps : En {
val jsonArray = responseJsonElement as? JsonArray ?: fail("The json response isn't array") val jsonArray = responseJsonElement as? JsonArray ?: fail("The json response isn't array")
assertEquals(count, jsonArray.size) assertEquals(count, jsonArray.size)
} }
Then("the Response should be:") { body: String ->
assertEquals(body, response)
}
Then("the Response should contain:") { body: String ->
assertTrue(response.contains(body))
}
} }
private fun findJsonElement(node: String): JsonElement { private fun findJsonElement(node: String): JsonElement {
@@ -52,4 +61,7 @@ class KtorServerRestSteps : En {
private val responseJsonElement: JsonElement private val responseJsonElement: JsonElement
get() = Json.parse(KtorServerContext.defaultServer.call?.response?.content ?: fail("The response isn't valid JSON")) get() = Json.parse(KtorServerContext.defaultServer.call?.response?.content ?: fail("The response isn't valid JSON"))
private val response: String
get() = KtorServerContext.defaultServer.call?.response?.content ?: fail("The response isn't valid")
} }

View File

@@ -0,0 +1,33 @@
Feature: Auth routes
Scenario: The route for create citizen must response a 200 and return object
When I send a POST request to "/register" with body:
"""
{
"name": {"first_name":"George", "last_name":"MICHEL"},
"birthday": "2001-01-01",
"user":{
"username": "george-junior",
"plain_password": "azerty"
}
}
"""
Then the response status code should be 200
And the Response should contain:
"""
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.
"""
Scenario: The route for create citizen must response a 200 and return object
When I send a POST request to "/login" with body:
"""
{
"name": "username1",
"password": "azerty"
}
"""
Then the response status code should be 200
And the Response should contain:
"""
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.
"""