feature #6: implement route for search articles
This commit is contained in:
@@ -15,4 +15,4 @@ class Article(
|
||||
):
|
||||
UuidEntity(id),
|
||||
EntityCreatedAt by EntityCreatedAtImp(),
|
||||
CreatedBy<User> by EntityCreatedByImp()
|
||||
CreatedBy<Citizen> by EntityCreatedByImp()
|
||||
@@ -7,18 +7,18 @@ import java.util.*
|
||||
|
||||
|
||||
class Citizen(
|
||||
id: UUID,
|
||||
var name: Name,
|
||||
var birthday: String,
|
||||
var userId: String,
|
||||
var voteAnnonymous: Boolean,
|
||||
var followAnnonymous: Boolean,
|
||||
var user: User
|
||||
id: UUID?,
|
||||
var name: Name?,
|
||||
var birthday: String?,
|
||||
var userId: String?,
|
||||
var voteAnnonymous: Boolean?,
|
||||
var followAnnonymous: Boolean?,
|
||||
var user: User?
|
||||
) : UuidEntity(id),
|
||||
EntityCreatedAt by EntityCreatedAtImp() {
|
||||
data class Name(
|
||||
var civility: String,
|
||||
var lastName: String,
|
||||
var firstName: String
|
||||
var civility: String?,
|
||||
var lastName: String?,
|
||||
var firstName: String?
|
||||
)
|
||||
}
|
||||
@@ -1,7 +1,6 @@
|
||||
package fr.dcproject.entity
|
||||
|
||||
import fr.postgresjson.entity.*
|
||||
import fr.postgresjson.entity.User
|
||||
import org.joda.time.DateTime
|
||||
import java.util.*
|
||||
|
||||
@@ -13,5 +12,4 @@ class User(
|
||||
override var updatedAt: DateTime?
|
||||
) : UuidEntity(id),
|
||||
EntityCreatedAt by EntityCreatedAtImp(),
|
||||
EntityUpdatedAt by EntityUpdatedAtImp(),
|
||||
User<UUID?>
|
||||
EntityUpdatedAt by EntityUpdatedAtImp()
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
package fr.dcproject.repository
|
||||
|
||||
import fr.postgresjson.connexion.Paginated
|
||||
import fr.postgresjson.connexion.Requester
|
||||
import fr.postgresjson.entity.EntitiesCollections
|
||||
import fr.postgresjson.repository.RepositoryI
|
||||
import net.pearx.kasechange.toSnakeCase
|
||||
import java.util.*
|
||||
import fr.dcproject.entity.Article as ArticleEntity
|
||||
|
||||
@@ -19,6 +21,16 @@ class Article(override var requester: Requester) : RepositoryI<ArticleEntity> {
|
||||
}
|
||||
}
|
||||
|
||||
fun find(page: Int = 1, limit: Int = 50, sort: String? = null, direction: Direction? = null, search: String? = null): Paginated<ArticleEntity> {
|
||||
return requester
|
||||
.getFunction("find_articles")
|
||||
.select(page, limit,
|
||||
"sort" to sort?.toSnakeCase(),
|
||||
"direction" to direction,
|
||||
"search" to search
|
||||
)
|
||||
}
|
||||
|
||||
fun upsert(article: ArticleEntity): ArticleEntity? {
|
||||
return requester
|
||||
.getFunction("upsert_article")
|
||||
@@ -26,4 +38,9 @@ class Article(override var requester: Requester) : RepositoryI<ArticleEntity> {
|
||||
EntitiesCollections().set(it)
|
||||
}
|
||||
}
|
||||
|
||||
enum class Direction {
|
||||
asc,
|
||||
desc
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,14 +1,12 @@
|
||||
package fr.dcproject.routes
|
||||
|
||||
import Paths
|
||||
import fr.postgresjson.serializer.serialize
|
||||
import io.ktor.application.call
|
||||
import io.ktor.locations.KtorExperimentalLocationsAPI
|
||||
import io.ktor.locations.get
|
||||
import io.ktor.locations.post
|
||||
import io.ktor.request.receive
|
||||
import io.ktor.response.respond
|
||||
import io.ktor.response.respondText
|
||||
import io.ktor.routing.Route
|
||||
import fr.dcproject.entity.Article as ArticleEntity
|
||||
import fr.dcproject.repository.Article as ArticleRepository
|
||||
@@ -16,11 +14,14 @@ import fr.dcproject.repository.Article as ArticleRepository
|
||||
@KtorExperimentalLocationsAPI
|
||||
fun Route.article(repo: ArticleRepository) {
|
||||
get<Paths.ArticlesRequest> {
|
||||
call.respondText("todo")
|
||||
val articles = repo.find(it.page, it.limit, it.sort, it.direction, it.search)
|
||||
call.respond(articles)
|
||||
}
|
||||
|
||||
get<Paths.ArticleRequest> {
|
||||
call.respondText(it.article.serialize())
|
||||
call.respond(it.article)
|
||||
}
|
||||
|
||||
post<Paths.PostArticleRequest>() {
|
||||
val article = call.receive<ArticleEntity>()
|
||||
repo.upsert(article)
|
||||
|
||||
@@ -1,10 +1,14 @@
|
||||
import fr.dcproject.entity.Article
|
||||
import fr.dcproject.repository.Article.Direction
|
||||
import io.ktor.locations.KtorExperimentalLocationsAPI
|
||||
import io.ktor.locations.Location
|
||||
|
||||
@KtorExperimentalLocationsAPI
|
||||
object Paths {
|
||||
@Location("/articles") class ArticlesRequest
|
||||
@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") class PostArticleRequest
|
||||
}
|
||||
Reference in New Issue
Block a user