From 9b2b5e681f2a16eb8e0902916d09f1fa74cd0f29 Mon Sep 17 00:00:00 2001 From: Fabrice Lecomte Date: Tue, 20 Aug 2019 09:41:01 +0200 Subject: [PATCH] feature #14: Add routes for follow/unfollow coonstitution --- src/main/kotlin/fr/dcproject/Application.kt | 6 +-- src/main/kotlin/fr/dcproject/Module.kt | 1 + src/main/kotlin/fr/dcproject/entity/Follow.kt | 3 +- .../kotlin/fr/dcproject/repository/Follow.kt | 2 + .../fr/dcproject/routes/FollowConstitution.kt | 37 +++++++++++++++++++ src/main/kotlin/fr/dcproject/routes/Paths.kt | 1 + src/test/resources/feature/follow.feature | 20 +++++++++- 7 files changed, 64 insertions(+), 6 deletions(-) create mode 100644 src/main/kotlin/fr/dcproject/routes/FollowConstitution.kt diff --git a/src/main/kotlin/fr/dcproject/Application.kt b/src/main/kotlin/fr/dcproject/Application.kt index e9ce188..5a5616d 100644 --- a/src/main/kotlin/fr/dcproject/Application.kt +++ b/src/main/kotlin/fr/dcproject/Application.kt @@ -9,10 +9,7 @@ import com.fasterxml.jackson.datatype.joda.JodaModule import fr.dcproject.entity.Article import fr.dcproject.entity.Citizen import fr.dcproject.entity.Constitution -import fr.dcproject.routes.article -import fr.dcproject.routes.citizen -import fr.dcproject.routes.constitution -import fr.dcproject.routes.followArticle +import fr.dcproject.routes.* import fr.postgresjson.migration.Migrations import io.ktor.application.Application import io.ktor.application.install @@ -121,6 +118,7 @@ fun Application.module() { citizen(get()) constitution(get()) followArticle(get()) + followConstitution(get()) } // TODO move to postgresJson lib diff --git a/src/main/kotlin/fr/dcproject/Module.kt b/src/main/kotlin/fr/dcproject/Module.kt index 75d4ad7..06cc485 100644 --- a/src/main/kotlin/fr/dcproject/Module.kt +++ b/src/main/kotlin/fr/dcproject/Module.kt @@ -30,6 +30,7 @@ val Module = module { single { CitizenRepository(get()) } single { ConstitutionRepository(get()) } single { FollowArticleRepository(get()) } + single { FollowConstitutionRepository(get()) } single { Migrations(connection = get(), directory = config.sqlFiles) } } diff --git a/src/main/kotlin/fr/dcproject/entity/Follow.kt b/src/main/kotlin/fr/dcproject/entity/Follow.kt index 8467c74..3829aa6 100644 --- a/src/main/kotlin/fr/dcproject/entity/Follow.kt +++ b/src/main/kotlin/fr/dcproject/entity/Follow.kt @@ -8,4 +8,5 @@ class Follow > ( override var target: T ): Extra(id, citizen) -typealias FollowArticleEntity = Follow
\ No newline at end of file +typealias FollowArticleEntity = Follow
+typealias FollowConstitutionEntity = Follow \ No newline at end of file diff --git a/src/main/kotlin/fr/dcproject/repository/Follow.kt b/src/main/kotlin/fr/dcproject/repository/Follow.kt index 06d9d18..e02ac1f 100644 --- a/src/main/kotlin/fr/dcproject/repository/Follow.kt +++ b/src/main/kotlin/fr/dcproject/repository/Follow.kt @@ -6,6 +6,7 @@ import fr.postgresjson.repository.RepositoryI import java.util.* import kotlin.reflect.KClass import fr.dcproject.entity.Article as ArticleEntity +import fr.dcproject.entity.Constitution as ConstitutionEntity import fr.dcproject.entity.Follow as FollowEntity open class Follow >(override var requester: Requester): RepositoryI> { @@ -34,3 +35,4 @@ open class Follow >(override var requester: Requester): Reposit } } class FollowArticleRepository(override var requester: Requester): Follow(requester) +class FollowConstitutionRepository(override var requester: Requester): Follow(requester) diff --git a/src/main/kotlin/fr/dcproject/routes/FollowConstitution.kt b/src/main/kotlin/fr/dcproject/routes/FollowConstitution.kt new file mode 100644 index 0000000..89a844a --- /dev/null +++ b/src/main/kotlin/fr/dcproject/routes/FollowConstitution.kt @@ -0,0 +1,37 @@ +package fr.dcproject.routes + +import Paths +import fr.dcproject.entity.Citizen +import fr.dcproject.entity.User +import fr.dcproject.repository.FollowConstitutionRepository +import io.ktor.application.call +import io.ktor.http.HttpStatusCode +import io.ktor.locations.KtorExperimentalLocationsAPI +import io.ktor.locations.delete +import io.ktor.locations.post +import io.ktor.response.respond +import io.ktor.routing.Route +import org.joda.time.DateTime +import java.util.* +import fr.dcproject.entity.Follow as FollowEntity + +// TODO get current citizen +val currentCitizen2 = Citizen( + id = UUID.fromString("64b7b379-2298-43ec-b428-ba134930cabd"), + name = Citizen.Name("todo", "todo"), + birthday = DateTime.now(), + user = User(username = "plop", plainPassword = "plip") +) + +@KtorExperimentalLocationsAPI +fun Route.followConstitution(repo: FollowConstitutionRepository) { + post { + repo.follow(FollowEntity(target = it.constitution, citizen = currentCitizen2)) + call.respond(HttpStatusCode.Created) + } + + delete { + repo.unfollow(FollowEntity(target = it.constitution, citizen = currentCitizen2)) + call.respond(HttpStatusCode.NoContent) + } +} diff --git a/src/main/kotlin/fr/dcproject/routes/Paths.kt b/src/main/kotlin/fr/dcproject/routes/Paths.kt index 9e8e55f..da898ec 100644 --- a/src/main/kotlin/fr/dcproject/routes/Paths.kt +++ b/src/main/kotlin/fr/dcproject/routes/Paths.kt @@ -22,6 +22,7 @@ object Paths { val limit: Int = if (limit > 50) 50 else if (limit < 1) 1 else limit } @Location("/constitutions/{constitution}") class ConstitutionRequest(val constitution: Constitution) + @Location("/constitutions/{constitution}/follow") class ConstitutionFollowRequest(val constitution: Constitution) @Location("/constitutions") class PostConstitutionRequest diff --git a/src/test/resources/feature/follow.feature b/src/test/resources/feature/follow.feature index 3aacfcf..5f2dcd9 100644 --- a/src/test/resources/feature/follow.feature +++ b/src/test/resources/feature/follow.feature @@ -1,5 +1,6 @@ -Feature: follow routes +Feature: follow Article and Constitution + # Article Scenario: The route for follow article must response a 201 and return object Given I have citizen: | id | 64b7b379-2298-43ec-b428-ba134930cabd | @@ -15,3 +16,20 @@ Feature: follow routes | lastName | Dupuis | When I send a "DELETE" request to "/articles/9226c1a3-8091-c3fa-7d0d-c2e98c9bee7b/follow" Then the response status code should be 204 + + # Constitution + Scenario: The route for follow constitution must response a 201 and return object + Given I have citizen: + | id | 64b7b379-2298-43ec-b428-ba134930cabd | + | firstName | Jaque | + | lastName | Dupuis | + When I send a "POST" request to "/constitutions/72aa1ee1-4963-eb44-c9e0-5ce6e0f18f00/follow" + Then the response status code should be 201 + + Scenario: The route for unfollow constitution must response a 204 + Given I have citizen: + | id | 64b7b379-2298-43ec-b428-ba134930cabd | + | firstName | Jaque | + | lastName | Dupuis | + When I send a "DELETE" request to "/constitutions/72aa1ee1-4963-eb44-c9e0-5ce6e0f18f00/follow" + Then the response status code should be 204