diff --git a/src/main/kotlin/fr/dcproject/entity/Comment.kt b/src/main/kotlin/fr/dcproject/entity/Comment.kt index 4f1551e..ca94e69 100644 --- a/src/main/kotlin/fr/dcproject/entity/Comment.kt +++ b/src/main/kotlin/fr/dcproject/entity/Comment.kt @@ -10,7 +10,8 @@ open class Comment ( var content: String, var responses: List>? = null, var parent: Comment? = null, - var parentsIds: List? = null + var parentsIds: List? = null, + val childrenCount: Int? = null ): Extra(id, createdBy), EntityUpdatedAt by EntityUpdatedAtImp(), EntityDeletedAt by EntityDeletedAtImp() diff --git a/src/main/kotlin/fr/dcproject/routes/Comment.kt b/src/main/kotlin/fr/dcproject/routes/Comment.kt index e9deee9..8fc9f75 100644 --- a/src/main/kotlin/fr/dcproject/routes/Comment.kt +++ b/src/main/kotlin/fr/dcproject/routes/Comment.kt @@ -19,6 +19,17 @@ import fr.dcproject.repository.CommentGeneric as CommentRepository object CommentPaths { // TODO: change UUID by entity converter @Location("/comments/{comment}") class CommentRequest(val comment: UUID) + + @Location("/comments/{comment}/children") + class CommentChildrenRequest( + val comment: UUID, + page: Int = 1, + limit: Int = 50, + 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 + } } @KtorExperimentalLocationsAPI @@ -30,6 +41,19 @@ fun Route.comment(repo: CommentRepository) { call.respond(HttpStatusCode.OK, comment) } + get { + val comments = + repo.findByParent( + it.comment, + it.page, + it.limit + ) + + assertCan(VIEW, comments.result) + + call.respond(HttpStatusCode.OK, comments) + } + put { val comment = repo.findById(it.comment)!! assertCan(UPDATE,comment) diff --git a/src/main/resources/openApi.yaml b/src/main/resources/openApi.yaml index c65ddce..2972407 100644 --- a/src/main/resources/openApi.yaml +++ b/src/main/resources/openApi.yaml @@ -257,8 +257,17 @@ paths: schema: $ref: '#/components/schemas/ConstitutionResponse' /comments/{comment}: + parameters: + - name: comment + in: path + description: The ID of comment + example: 701dc504-db49-7e3a-2c0a-32542507ea57 + required: true + schema: + type: string + format: uuid get: - summary: Get Comment and children by Comment ID + summary: Get Comment by Comment ID tags: - comment responses: @@ -286,6 +295,36 @@ paths: application/json: schema: $ref: '#/components/schemas/CommentResponse' + + /comments/{comment}/children: + parameters: + - name: comment + in: path + description: The ID of comment + example: 701dc504-db49-7e3a-2c0a-32542507ea57 + required: true + schema: + type: string + format: uuid + get: + summary: Get Comment children by Comment ID + tags: + - comment + responses: + 200: + description: Return Comment children + content: + application/json: + schema: + allOf: + - $ref: '#/components/schemas/Paginated' + - type: object + properties: + result: + type: array + items: + $ref: '#/components/schemas/CommentResponse' + /articles/{article}/comments: parameters: - name: article @@ -297,7 +336,7 @@ paths: type: string format: uuid get: - summary: Get comment and children of one article + summary: Get comments of one article tags: - comment responses: @@ -547,7 +586,7 @@ components: CreatedBy: properties: created_by: - $ref: '#/components/schemas/UuidEntity' + $ref: '#/components/schemas/CitizenResponse' CreatedAt: properties: diff --git a/src/main/resources/sql/functions/comment/find_comments_by_parent.sql b/src/main/resources/sql/functions/comment/find_comments_by_parent.sql index 9edcdb4..00b9d57 100644 --- a/src/main/resources/sql/functions/comment/find_comments_by_parent.sql +++ b/src/main/resources/sql/functions/comment/find_comments_by_parent.sql @@ -7,16 +7,17 @@ create or replace function find_comments_by_parent( ) language plpgsql as $$ begin - select json_agg(t), (select count(id) from "comment" com where com.parents_ids @> array[_parent_id]) + select json_agg(t), (select count(id) from "comment" c3 where c3.parent_id = _parent_id) into resource, total from ( select com.*, + (select count(*) from "comment" c2 where c2.parents_ids @> array[com.id]) as children_count, find_reference_by_id(com.target_id, com.target_reference) as target, find_citizen_by_id(com.created_by_id) as created_by from "comment" as com where parent_id = _parent_id - order by com.parents_ids nulls first, created_at desc, + order by created_at desc, com.created_at desc limit "limit" offset "offset" ) as t; diff --git a/src/main/resources/sql/functions/comment/find_comments_by_target.sql b/src/main/resources/sql/functions/comment/find_comments_by_target.sql index 96aea91..13b0373 100644 --- a/src/main/resources/sql/functions/comment/find_comments_by_target.sql +++ b/src/main/resources/sql/functions/comment/find_comments_by_target.sql @@ -7,16 +7,17 @@ create or replace function find_comments_by_target( ) language plpgsql as $$ begin - select json_agg(t), (select count(id) from "comment" com where com.target_id = _target_id) + select json_agg(t), (select count(id) from "comment" c3 where c3.parent_id = _target_id) into resource, total from ( select com.*, + (select count(*) from "comment" c2 where c2.parents_ids @> array[com.id]) as children_count, find_reference_by_id(com.target_id, com.target_reference) as target, find_citizen_by_id(com.created_by_id) as created_by from "comment" as com - where com.target_id = _target_id - order by com.parents_ids nulls first, created_at desc, + where com.parent_id = _target_id + order by created_at desc, com.created_at desc limit "limit" offset "offset" ) as t;