#54 Can create article under the name of the Workgroup
This commit is contained in:
2
.env
2
.env
@@ -24,3 +24,5 @@ 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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
|
||||||
@@ -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 :
|
||||||
|
|||||||
@@ -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()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
$$;
|
$$;
|
||||||
|
|||||||
@@ -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() }
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user