#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_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(),
draft: Boolean = false,
override var lastVersion: Boolean = false,
override val createdBy: CitizenBasic
override val createdBy: CitizenBasic,
workgroup: WorkgroupSimple<CitizenRef>? = null
) : ArticleFull,
ArticleAuthI<CitizenBasicI>,
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<CitizenRef>? = null
) : ArticleSimpleI,
ArticleAuthI<CitizenBasicI>,
ArticleRefVersioning(id),
@@ -61,6 +63,7 @@ interface ArticleSimpleI :
EntityDeletedAt,
Votable {
var title: String
var workgroup: WorkgroupSimple<CitizenRef>?
}
interface ArticleBasicI :

View File

@@ -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<String> = 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<Article>().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<CitizenRef> else null
).also {
it.versionId = versionId ?: UUID.randomUUID()
}

View File

@@ -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

View File

@@ -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;
$$;

View File

@@ -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() }
)