diff --git a/src/main/kotlin/fr/dcproject/repository/Follow.kt b/src/main/kotlin/fr/dcproject/repository/Follow.kt index 3224a8b..ab42fe0 100644 --- a/src/main/kotlin/fr/dcproject/repository/Follow.kt +++ b/src/main/kotlin/fr/dcproject/repository/Follow.kt @@ -13,14 +13,14 @@ import fr.dcproject.entity.Follow as FollowEntity open class Follow (override var requester: Requester): RepositoryI> { override val entityName = FollowEntity::class as KClass> - open fun findByCitizenId( + open fun findByCitizen( citizen: CitizenEntity, page: Int = 1, limit: Int = 50 ): Paginated> = - findByCitizenId(citizen.id ?: error("The citizen must have an id"), page, limit) + findByCitizen(citizen.id ?: error("The citizen must have an id"), page, limit) - open fun findByCitizenId( + open fun findByCitizen( citizenId: UUID, page: Int = 1, limit: Int = 50 @@ -57,7 +57,7 @@ open class Follow (override var requester: Requester): Repository } class FollowArticle (requester: Requester): Follow(requester) { - override fun findByCitizenId( + override fun findByCitizen( citizenId: UUID, page: Int, limit: Int @@ -72,7 +72,7 @@ class FollowArticle (requester: Requester): Follow(requester) { } class FollowConstitution (requester: Requester): Follow(requester) { - override fun findByCitizenId( + override fun findByCitizen( citizenId: UUID, page: Int, limit: Int diff --git a/src/main/kotlin/fr/dcproject/routes/Article.kt b/src/main/kotlin/fr/dcproject/routes/Article.kt index a535cac..cf89c10 100644 --- a/src/main/kotlin/fr/dcproject/routes/Article.kt +++ b/src/main/kotlin/fr/dcproject/routes/Article.kt @@ -1,11 +1,12 @@ package fr.dcproject.routes -import Paths import fr.dcproject.security.voter.ArticleVoter.Action.CREATE import fr.dcproject.security.voter.ArticleVoter.Action.VIEW import fr.dcproject.security.voter.assertCan +import fr.postgresjson.repository.RepositoryI import io.ktor.application.call import io.ktor.locations.KtorExperimentalLocationsAPI +import io.ktor.locations.Location import io.ktor.locations.get import io.ktor.locations.post import io.ktor.request.receive @@ -14,22 +15,34 @@ import io.ktor.routing.Route import fr.dcproject.entity.Article as ArticleEntity import fr.dcproject.repository.Article as ArticleRepository + +@KtorExperimentalLocationsAPI +object ArticlesPaths { + @Location("/articles") class ArticlesRequest(page: Int = 1, limit: Int = 50, val sort: String? = null, val direction: RepositoryI.Direction? = null, val search: String? = null) { + val page: Int = if (page < 1) 1 else page + val limit: Int = if (limit > 50) 50 else if (limit < 1) 1 else limit + } + @Location("/articles/{article}") class ArticleRequest(val article: fr.dcproject.entity.Article) + @Location("/articles/{article}/follow") class ArticleFollowRequest(val article: fr.dcproject.entity.Article) + @Location("/articles") class PostArticleRequest +} + @KtorExperimentalLocationsAPI fun Route.article(repo: ArticleRepository) { - get { + get { assertCan(VIEW) val articles = repo.find(it.page, it.limit, it.sort, it.direction, it.search) call.respond(articles) } - get { + get { assertCan(VIEW, it.article) call.respond(it.article) } - post { + post { assertCan(CREATE) val article = call.receive() diff --git a/src/main/kotlin/fr/dcproject/routes/Auth.kt b/src/main/kotlin/fr/dcproject/routes/Auth.kt index 6b3d229..407dc28 100644 --- a/src/main/kotlin/fr/dcproject/routes/Auth.kt +++ b/src/main/kotlin/fr/dcproject/routes/Auth.kt @@ -1,12 +1,12 @@ package fr.dcproject.routes -import Paths import com.fasterxml.jackson.databind.exc.MismatchedInputException import fr.dcproject.JwtConfig import io.ktor.application.call import io.ktor.auth.UserPasswordCredential import io.ktor.features.BadRequestException import io.ktor.locations.KtorExperimentalLocationsAPI +import io.ktor.locations.Location import io.ktor.locations.post import io.ktor.request.receive import io.ktor.response.respondText @@ -16,10 +16,16 @@ import fr.dcproject.entity.Citizen as CitizenEntity import fr.dcproject.repository.Citizen as CitizenRepository import fr.dcproject.repository.User as UserRepository +@KtorExperimentalLocationsAPI +object AuthPaths { + @Location("/login") class LoginRequest + @Location("/register") class RegisterRequest +} + @KtorExperimentalLocationsAPI @KtorExperimentalAPI fun Route.auth(userRepo: UserRepository, citizenRepo: CitizenRepository) { - post { + post { try { val credentials = call.receive() val user = userRepo.findByCredentials(credentials) ?: throw BadRequestException("Username not exist or password is wrong") @@ -29,7 +35,7 @@ fun Route.auth(userRepo: UserRepository, citizenRepo: CitizenRepository) { } } - post { + post { val citizen = call.receive() val created = citizenRepo.insertWithUser(citizen)?.user ?: throw BadRequestException("Bad request") diff --git a/src/main/kotlin/fr/dcproject/routes/Citizen.kt b/src/main/kotlin/fr/dcproject/routes/Citizen.kt index 82d2c73..4355356 100644 --- a/src/main/kotlin/fr/dcproject/routes/Citizen.kt +++ b/src/main/kotlin/fr/dcproject/routes/Citizen.kt @@ -1,25 +1,38 @@ package fr.dcproject.routes -import Paths +import fr.dcproject.entity.Citizen import fr.dcproject.security.voter.CitizenVoter.Action.VIEW import fr.dcproject.security.voter.assertCan +import fr.postgresjson.repository.RepositoryI import io.ktor.application.call import io.ktor.locations.KtorExperimentalLocationsAPI +import io.ktor.locations.Location import io.ktor.locations.get import io.ktor.response.respond import io.ktor.routing.Route import fr.dcproject.repository.Citizen as CitizenRepository +@KtorExperimentalLocationsAPI +object CitizenPaths { + @Location("/citizens") class CitizensRequest(page: Int = 1, limit: Int = 50, val sort: String? = null, val direction: RepositoryI.Direction? = null, val search: String? = null) { + val page: Int = if (page < 1) 1 else page + val limit: Int = if (limit > 50) 50 else if (limit < 1) 1 else limit + } + @Location("/citizens/{citizen}") class CitizenRequest(val citizen: Citizen) + @Location("/citizens/{citizen}/follows/articles") class CitizenFollowArticleRequest(val citizen: Citizen) + @Location("/citizens/{citizen}/follows/constitutions") class CitizenFollowConstitutionRequest(val citizen: Citizen) +} + @KtorExperimentalLocationsAPI fun Route.citizen(repo: CitizenRepository) { - get { + get { assertCan(VIEW) val citizens = repo.find(it.page, it.limit, it.sort, it.direction, it.search) call.respond(citizens) } - get { + get { assertCan(VIEW, it.citizen) call.respond(it.citizen) diff --git a/src/main/kotlin/fr/dcproject/routes/Constitution.kt b/src/main/kotlin/fr/dcproject/routes/Constitution.kt index 9076cec..a27e52b 100644 --- a/src/main/kotlin/fr/dcproject/routes/Constitution.kt +++ b/src/main/kotlin/fr/dcproject/routes/Constitution.kt @@ -1,8 +1,9 @@ package fr.dcproject.routes -import Paths +import fr.postgresjson.repository.RepositoryI import io.ktor.application.call import io.ktor.locations.KtorExperimentalLocationsAPI +import io.ktor.locations.Location import io.ktor.locations.get import io.ktor.locations.post import io.ktor.request.receive @@ -11,18 +12,29 @@ import io.ktor.routing.Route import fr.dcproject.entity.Constitution as ConstitutionEntity import fr.dcproject.repository.Constitution as ConstitutionRepository +@KtorExperimentalLocationsAPI +object ConstitutionPaths { + @Location("/constitutions") class ConstitutionsRequest(page: Int = 1, limit: Int = 50, val sort: String? = null, val direction: RepositoryI.Direction? = null, val search: String? = null) { + val page: Int = if (page < 1) 1 else page + val limit: Int = if (limit > 50) 50 else if (limit < 1) 1 else limit + } + @Location("/constitutions/{constitution}") class ConstitutionRequest(val constitution: fr.dcproject.entity.Constitution) + @Location("/constitutions/{constitution}/follow") class ConstitutionFollowRequest(val constitution: fr.dcproject.entity.Constitution) + @Location("/constitutions") class PostConstitutionRequest +} + @KtorExperimentalLocationsAPI fun Route.constitution(repo: ConstitutionRepository) { - get { + get { val constitutions = repo.find(it.page, it.limit, it.sort, it.direction, it.search) call.respond(constitutions) } - get { + get { call.respond(it.constitution) } - post() { + post() { val constitution = call.receive() repo.upsert(constitution) call.respond(constitution) diff --git a/src/main/kotlin/fr/dcproject/routes/FollowArticle.kt b/src/main/kotlin/fr/dcproject/routes/FollowArticle.kt index 8fcc00a..95b567e 100644 --- a/src/main/kotlin/fr/dcproject/routes/FollowArticle.kt +++ b/src/main/kotlin/fr/dcproject/routes/FollowArticle.kt @@ -1,18 +1,15 @@ package fr.dcproject.routes -import Paths import fr.dcproject.entity.Citizen import fr.dcproject.entity.User import io.ktor.application.call import io.ktor.http.HttpStatusCode -import io.ktor.locations.KtorExperimentalLocationsAPI -import io.ktor.locations.delete -import io.ktor.locations.get -import io.ktor.locations.post +import io.ktor.locations.* import io.ktor.response.respond import io.ktor.routing.Route import org.joda.time.DateTime import java.util.* +import fr.dcproject.entity.Article as ArticleEntity import fr.dcproject.entity.Follow as FollowEntity import fr.dcproject.repository.FollowArticle as FollowArticleRepository @@ -24,20 +21,26 @@ val currentCitizen = Citizen( user = User(username = "plop", plainPassword = "plip") ) +@KtorExperimentalLocationsAPI +object FollowArticlePaths { + @Location("/articles/{article}/follow") class ArticleFollowRequest(val article: ArticleEntity) + @Location("/citizens/{citizen}/follows/articles") class CitizenFollowArticleRequest(val citizen: Citizen) +} + @KtorExperimentalLocationsAPI fun Route.followArticle(repo: FollowArticleRepository) { - post { + post { repo.follow(FollowEntity(target = it.article, citizen = currentCitizen)) call.respond(HttpStatusCode.Created) } - delete { + delete { repo.unfollow(FollowEntity(target = it.article, citizen = currentCitizen)) call.respond(HttpStatusCode.NoContent) } - get { - val follows = repo.findByCitizenId(it.citizen) + get { + val follows = repo.findByCitizen(it.citizen) call.respond(follows) } } \ No newline at end of file diff --git a/src/main/kotlin/fr/dcproject/routes/FollowConstitution.kt b/src/main/kotlin/fr/dcproject/routes/FollowConstitution.kt index c3b95a2..ddf76f2 100644 --- a/src/main/kotlin/fr/dcproject/routes/FollowConstitution.kt +++ b/src/main/kotlin/fr/dcproject/routes/FollowConstitution.kt @@ -1,18 +1,15 @@ package fr.dcproject.routes -import Paths import fr.dcproject.entity.Citizen import fr.dcproject.entity.User import io.ktor.application.call import io.ktor.http.HttpStatusCode -import io.ktor.locations.KtorExperimentalLocationsAPI -import io.ktor.locations.delete -import io.ktor.locations.get -import io.ktor.locations.post +import io.ktor.locations.* import io.ktor.response.respond import io.ktor.routing.Route import org.joda.time.DateTime import java.util.* +import fr.dcproject.entity.Constitution as ConstitutionEntity import fr.dcproject.entity.Follow as FollowEntity import fr.dcproject.repository.FollowConstitution as FollowConstitutionRepository @@ -24,20 +21,26 @@ val currentCitizen2 = Citizen( user = User(username = "plop", plainPassword = "plip") ) +@KtorExperimentalLocationsAPI +object FollowConstitutionPaths { + @Location("/constitutions/{constitution}/follow") class ConstitutionFollowRequest(val constitution: ConstitutionEntity) + @Location("/citizens/{citizen}/follows/constitutions") class CitizenFollowConstitutionRequest(val citizen: Citizen) +} + @KtorExperimentalLocationsAPI fun Route.followConstitution(repo: FollowConstitutionRepository) { - post { + post { repo.follow(FollowEntity(target = it.constitution, citizen = currentCitizen2)) call.respond(HttpStatusCode.Created) } - delete { + delete { repo.unfollow(FollowEntity(target = it.constitution, citizen = currentCitizen2)) call.respond(HttpStatusCode.NoContent) } - get { - val follows = repo.findByCitizenId(it.citizen) + get { + val follows = repo.findByCitizen(it.citizen) call.respond(follows) } } diff --git a/src/main/kotlin/fr/dcproject/routes/Paths.kt b/src/main/kotlin/fr/dcproject/routes/Paths.kt deleted file mode 100644 index 1257452..0000000 --- a/src/main/kotlin/fr/dcproject/routes/Paths.kt +++ /dev/null @@ -1,38 +0,0 @@ -import fr.dcproject.entity.Article -import fr.dcproject.entity.Citizen -import fr.dcproject.entity.Constitution -import fr.postgresjson.repository.RepositoryI.Direction -import io.ktor.locations.KtorExperimentalLocationsAPI -import io.ktor.locations.Location - -@KtorExperimentalLocationsAPI -object Paths { - @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) { - val page: Int = if (page < 1) 1 else page - val limit: Int = if (limit > 50) 50 else if (limit < 1) 1 else limit - } - @Location("/articles/{article}") class ArticleRequest(val article: Article) - @Location("/articles/{article}/follow") class ArticleFollowRequest(val article: Article) - @Location("/articles") class PostArticleRequest - - - @Location("/constitutions") class ConstitutionsRequest(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 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 - - - @Location("/citizens") class CitizensRequest(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 limit: Int = if (limit > 50) 50 else if (limit < 1) 1 else limit - } - @Location("/citizens/{citizen}") class CitizenRequest(val citizen: Citizen) - @Location("/citizens/{citizen}/follows/articles") class CitizenFollowArticleRequest(val citizen: Citizen) - @Location("/citizens/{citizen}/follows/constitutions") class CitizenFollowConstitutionRequest(val citizen: Citizen) -} \ No newline at end of file