diff --git a/.env b/.env index 60d4429..2c0ee7f 100644 --- a/.env +++ b/.env @@ -23,4 +23,6 @@ REDIS_COMMANDER_PORT=8081 RABBITMQ_PORT=5672 RABBITMQ_CONNECTION=amqp://rabbitmq:5672 -RABBITMQ_MANAGEMENT_PORT=15672 \ No newline at end of file +RABBITMQ_MANAGEMENT_PORT=15672 + +SEND_GRID_KEY=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 \ No newline at end of file diff --git a/src/main/kotlin/entity/Article.kt b/src/main/kotlin/entity/Article.kt index f5de8e5..1e6ae15 100644 --- a/src/main/kotlin/entity/Article.kt +++ b/src/main/kotlin/entity/Article.kt @@ -16,10 +16,11 @@ class Article( override var tags: List = emptyList(), draft: Boolean = false, override var lastVersion: Boolean = false, - override val createdBy: CitizenBasic + override val createdBy: CitizenBasic, + workgroup: WorkgroupSimple? = null ) : ArticleFull, ArticleAuthI, - ArticleSimple(id, title, createdBy, draft), + ArticleSimple(id, title, createdBy, draft, workgroup), Viewable by ViewableImp() { init { tags = tags.distinct() @@ -30,7 +31,8 @@ open class ArticleSimple( id: UUID = UUID.randomUUID(), override var title: String, override val createdBy: CitizenBasic, - override var draft: Boolean = false + override var draft: Boolean = false, + override var workgroup: WorkgroupSimple? = null ) : ArticleSimpleI, ArticleAuthI, ArticleRefVersioning(id), @@ -61,6 +63,7 @@ interface ArticleSimpleI : EntityDeletedAt, Votable { var title: String + var workgroup: WorkgroupSimple? } interface ArticleBasicI : diff --git a/src/main/kotlin/routes/Article.kt b/src/main/kotlin/routes/Article.kt index bdecef1..f15dd21 100644 --- a/src/main/kotlin/routes/Article.kt +++ b/src/main/kotlin/routes/Article.kt @@ -2,9 +2,13 @@ package fr.dcproject.routes import fr.dcproject.citizen import fr.dcproject.citizenOrNull +import fr.dcproject.entity.CitizenRef +import fr.dcproject.entity.WorkgroupRef +import fr.dcproject.entity.WorkgroupSimple import fr.dcproject.event.ArticleUpdate import fr.dcproject.event.raiseEvent import fr.dcproject.repository.Article.Filter +import fr.dcproject.repository.Workgroup as WorkgroupRepository import fr.dcproject.security.voter.ArticleVoter.Action.CREATE import fr.dcproject.security.voter.ArticleVoter.Action.VIEW import fr.dcproject.views.ArticleViewManager @@ -20,6 +24,8 @@ import io.ktor.request.receive import io.ktor.response.respond import io.ktor.routing.Route import kotlinx.coroutines.launch +import org.koin.core.KoinComponent +import org.koin.core.inject import java.util.* import fr.dcproject.entity.Article as ArticleEntity import fr.dcproject.repository.Article as ArticleRepository @@ -56,7 +62,7 @@ object ArticlesPaths { } @Location("/articles") - class PostArticleRequest { + class PostArticleRequest: KoinComponent { class Article( val id: UUID?, val title: String, @@ -65,9 +71,12 @@ object ArticlesPaths { val description: String, val tags: List = emptyList(), val draft: Boolean = false, - val versionId: UUID? + val versionId: UUID?, + val workgroup: WorkgroupRef? ) + private val workgroupRepository: WorkgroupRepository by inject() + suspend fun getNewArticle(call: ApplicationCall): ArticleEntity = call.receive
().run { ArticleEntity( id ?: UUID.randomUUID(), @@ -77,7 +86,8 @@ object ArticlesPaths { description, tags, draft, - createdBy = call.citizen + createdBy = call.citizen, + workgroup = if (workgroup != null) workgroupRepository.findById(workgroup.id) as WorkgroupSimple else null ).also { it.versionId = versionId ?: UUID.randomUUID() } diff --git a/src/main/resources/openapi.yaml b/src/main/resources/openapi.yaml index 02ca22c..49b6c91 100644 --- a/src/main/resources/openapi.yaml +++ b/src/main/resources/openapi.yaml @@ -1334,6 +1334,8 @@ components: properties: user: $ref: '#/components/schemas/UserResponse' + workgroups: + $ref: '#/components/schemas/WorkgroupSimple' CitizenBase: type: object properties: @@ -1365,6 +1367,8 @@ components: properties: user: $ref: '#/components/schemas/UserRequest' + workgroups: + $ref: '#/components/schemas/UuidEntity' RegisterRequest: $ref: '#/components/schemas/CitizenRequest' @@ -1419,6 +1423,11 @@ components: type: boolean required: false default: false + workgroup: + allOf: + - $ref: '#/components/schemas/UuidEntity' + - required: false + - default: null - $ref: '#/components/schemas/versionId' ArticleResponse: type: object diff --git a/src/main/resources/sql/functions/citizen/find_citizen_by_user_id.sql b/src/main/resources/sql/functions/citizen/find_citizen_by_user_id.sql index 9f990cc..2029cc5 100644 --- a/src/main/resources/sql/functions/citizen/find_citizen_by_user_id.sql +++ b/src/main/resources/sql/functions/citizen/find_citizen_by_user_id.sql @@ -7,9 +7,15 @@ begin from ( select z.*, - find_user_by_id(z.user_id) as "user" + find_user_by_id(z.user_id) as "user", + case when ciw.workgroup_id is null then '{}' else array_agg(json_build_object( + 'roles', ciw.roles, + 'workgroup', find_workgroup_by_id_simple(ciw.workgroup_id) + )) end as "workgroups" from citizen as z + left join citizen_in_workgroup ciw on z.id = ciw.citizen_id where z.user_id = _user_id + group by z.id, ciw.workgroup_id ) as t; end; $$; diff --git a/src/test/kotlin/security/voter/CommentVoterTest.kt b/src/test/kotlin/security/voter/CommentVoterTest.kt index 7258bca..43fb89e 100644 --- a/src/test/kotlin/security/voter/CommentVoterTest.kt +++ b/src/test/kotlin/security/voter/CommentVoterTest.kt @@ -58,7 +58,8 @@ internal class CommentVoterTest { content = "Hi", createdBy = einstein, description = "blablabla", - title = "Super article" + title = "Super article", + workgroup = null ).apply { deletedAt = DateTime.now() } )