#54 Can create article under the name of the Workgroup

This commit is contained in:
2020-07-10 15:41:39 +02:00
parent 3d319605de
commit 01c3d85a17
6 changed files with 40 additions and 9 deletions

4
.env
View File

@@ -23,4 +23,6 @@ REDIS_COMMANDER_PORT=8081
RABBITMQ_PORT=5672 RABBITMQ_PORT=5672
RABBITMQ_CONNECTION=amqp://rabbitmq:5672 RABBITMQ_CONNECTION=amqp://rabbitmq:5672
RABBITMQ_MANAGEMENT_PORT=15672 RABBITMQ_MANAGEMENT_PORT=15672
SEND_GRID_KEY=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

View File

@@ -16,10 +16,11 @@ class Article(
override var tags: List<String> = emptyList(), override var tags: List<String> = emptyList(),
draft: Boolean = false, draft: Boolean = false,
override var lastVersion: Boolean = false, override var lastVersion: Boolean = false,
override val createdBy: CitizenBasic override val createdBy: CitizenBasic,
workgroup: WorkgroupSimple<CitizenRef>? = null
) : ArticleFull, ) : ArticleFull,
ArticleAuthI<CitizenBasicI>, ArticleAuthI<CitizenBasicI>,
ArticleSimple(id, title, createdBy, draft), ArticleSimple(id, title, createdBy, draft, workgroup),
Viewable by ViewableImp() { Viewable by ViewableImp() {
init { init {
tags = tags.distinct() tags = tags.distinct()
@@ -30,7 +31,8 @@ open class ArticleSimple(
id: UUID = UUID.randomUUID(), id: UUID = UUID.randomUUID(),
override var title: String, override var title: String,
override val createdBy: CitizenBasic, override val createdBy: CitizenBasic,
override var draft: Boolean = false override var draft: Boolean = false,
override var workgroup: WorkgroupSimple<CitizenRef>? = null
) : ArticleSimpleI, ) : ArticleSimpleI,
ArticleAuthI<CitizenBasicI>, ArticleAuthI<CitizenBasicI>,
ArticleRefVersioning(id), ArticleRefVersioning(id),
@@ -61,6 +63,7 @@ interface ArticleSimpleI :
EntityDeletedAt, EntityDeletedAt,
Votable { Votable {
var title: String var title: String
var workgroup: WorkgroupSimple<CitizenRef>?
} }
interface ArticleBasicI : interface ArticleBasicI :

View File

@@ -2,9 +2,13 @@ package fr.dcproject.routes
import fr.dcproject.citizen import fr.dcproject.citizen
import fr.dcproject.citizenOrNull 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.ArticleUpdate
import fr.dcproject.event.raiseEvent import fr.dcproject.event.raiseEvent
import fr.dcproject.repository.Article.Filter 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.CREATE
import fr.dcproject.security.voter.ArticleVoter.Action.VIEW import fr.dcproject.security.voter.ArticleVoter.Action.VIEW
import fr.dcproject.views.ArticleViewManager import fr.dcproject.views.ArticleViewManager
@@ -20,6 +24,8 @@ import io.ktor.request.receive
import io.ktor.response.respond import io.ktor.response.respond
import io.ktor.routing.Route import io.ktor.routing.Route
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import org.koin.core.KoinComponent
import org.koin.core.inject
import java.util.* import java.util.*
import fr.dcproject.entity.Article as ArticleEntity import fr.dcproject.entity.Article as ArticleEntity
import fr.dcproject.repository.Article as ArticleRepository import fr.dcproject.repository.Article as ArticleRepository
@@ -56,7 +62,7 @@ object ArticlesPaths {
} }
@Location("/articles") @Location("/articles")
class PostArticleRequest { class PostArticleRequest: KoinComponent {
class Article( class Article(
val id: UUID?, val id: UUID?,
val title: String, val title: String,
@@ -65,9 +71,12 @@ object ArticlesPaths {
val description: String, val description: String,
val tags: List<String> = emptyList(), val tags: List<String> = emptyList(),
val draft: Boolean = false, 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<Article>().run { suspend fun getNewArticle(call: ApplicationCall): ArticleEntity = call.receive<Article>().run {
ArticleEntity( ArticleEntity(
id ?: UUID.randomUUID(), id ?: UUID.randomUUID(),
@@ -77,7 +86,8 @@ object ArticlesPaths {
description, description,
tags, tags,
draft, draft,
createdBy = call.citizen createdBy = call.citizen,
workgroup = if (workgroup != null) workgroupRepository.findById(workgroup.id) as WorkgroupSimple<CitizenRef> else null
).also { ).also {
it.versionId = versionId ?: UUID.randomUUID() it.versionId = versionId ?: UUID.randomUUID()
} }

View File

@@ -1334,6 +1334,8 @@ components:
properties: properties:
user: user:
$ref: '#/components/schemas/UserResponse' $ref: '#/components/schemas/UserResponse'
workgroups:
$ref: '#/components/schemas/WorkgroupSimple'
CitizenBase: CitizenBase:
type: object type: object
properties: properties:
@@ -1365,6 +1367,8 @@ components:
properties: properties:
user: user:
$ref: '#/components/schemas/UserRequest' $ref: '#/components/schemas/UserRequest'
workgroups:
$ref: '#/components/schemas/UuidEntity'
RegisterRequest: RegisterRequest:
$ref: '#/components/schemas/CitizenRequest' $ref: '#/components/schemas/CitizenRequest'
@@ -1419,6 +1423,11 @@ components:
type: boolean type: boolean
required: false required: false
default: false default: false
workgroup:
allOf:
- $ref: '#/components/schemas/UuidEntity'
- required: false
- default: null
- $ref: '#/components/schemas/versionId' - $ref: '#/components/schemas/versionId'
ArticleResponse: ArticleResponse:
type: object type: object

View File

@@ -7,9 +7,15 @@ begin
from ( from (
select select
z.*, 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 from citizen as z
left join citizen_in_workgroup ciw on z.id = ciw.citizen_id
where z.user_id = _user_id where z.user_id = _user_id
group by z.id, ciw.workgroup_id
) as t; ) as t;
end; end;
$$; $$;

View File

@@ -58,7 +58,8 @@ internal class CommentVoterTest {
content = "Hi", content = "Hi",
createdBy = einstein, createdBy = einstein,
description = "blablabla", description = "blablabla",
title = "Super article" title = "Super article",
workgroup = null
).apply { deletedAt = DateTime.now() } ).apply { deletedAt = DateTime.now() }
) )