From 26fdc13a77d92a914ea1361e580c1910f5c70874 Mon Sep 17 00:00:00 2001 From: Josha von Gizycki Date: Tue, 29 Jul 2025 11:28:42 +0200 Subject: [PATCH] assign tags --- .../domain/event/AssignTaggingCommand.kt | 15 +++++++++ .../domain/handler/AssignTaggingHandler.kt | 22 +++++++++++++ src/main/kotlin/wanijo/wanijo2/domain/tag.kt | 5 +++ .../wanijo2/http/controller/ShowController.kt | 5 ++- .../http/controller/TaggingController.kt | 33 ++++++++++--------- src/main/resources/static/stylesheet.css | 16 ++++----- src/main/resources/templates/show.html | 16 +++++++-- 7 files changed, 84 insertions(+), 28 deletions(-) create mode 100644 src/main/kotlin/wanijo/wanijo2/domain/event/AssignTaggingCommand.kt create mode 100644 src/main/kotlin/wanijo/wanijo2/domain/handler/AssignTaggingHandler.kt diff --git a/src/main/kotlin/wanijo/wanijo2/domain/event/AssignTaggingCommand.kt b/src/main/kotlin/wanijo/wanijo2/domain/event/AssignTaggingCommand.kt new file mode 100644 index 0000000..cb1edc0 --- /dev/null +++ b/src/main/kotlin/wanijo/wanijo2/domain/event/AssignTaggingCommand.kt @@ -0,0 +1,15 @@ +package wanijo.wanijo2.domain.event + +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotEmpty +import wanijo.wanijo2.domain.DocumentId +import wanijo.wanijo2.domain.TagId + +data class AssignTaggingCommand( + @NotEmpty + @Min(1) + val tagId: TagId, + @NotEmpty + @Min(1) + val documentId: DocumentId +) diff --git a/src/main/kotlin/wanijo/wanijo2/domain/handler/AssignTaggingHandler.kt b/src/main/kotlin/wanijo/wanijo2/domain/handler/AssignTaggingHandler.kt new file mode 100644 index 0000000..f3b154d --- /dev/null +++ b/src/main/kotlin/wanijo/wanijo2/domain/handler/AssignTaggingHandler.kt @@ -0,0 +1,22 @@ +package wanijo.wanijo2.domain.handler + +import org.springframework.stereotype.Service +import wanijo.wanijo2.domain.DocumentTagging +import wanijo.wanijo2.domain.DocumentTaggingDao +import wanijo.wanijo2.domain.event.AssignTaggingCommand + +@Service +class AssignTaggingHandler( + val taggingDao: DocumentTaggingDao +) { + + fun exec(command: AssignTaggingCommand) { + taggingDao.save( + DocumentTagging.between( + command.documentId, + command.tagId + ) + ) + } + +} diff --git a/src/main/kotlin/wanijo/wanijo2/domain/tag.kt b/src/main/kotlin/wanijo/wanijo2/domain/tag.kt index 1321c22..371c380 100644 --- a/src/main/kotlin/wanijo/wanijo2/domain/tag.kt +++ b/src/main/kotlin/wanijo/wanijo2/domain/tag.kt @@ -33,6 +33,11 @@ data class DocumentTagging( tagId = AggregateReference.to(tagId), documentId = AggregateReference.to(doc.id) ) + fun between(docId: DocumentId, tagId: TagId) = + DocumentTagging( + tagId = AggregateReference.to(tagId), + documentId = AggregateReference.to(docId) + ) } } diff --git a/src/main/kotlin/wanijo/wanijo2/http/controller/ShowController.kt b/src/main/kotlin/wanijo/wanijo2/http/controller/ShowController.kt index b384188..a1c770c 100644 --- a/src/main/kotlin/wanijo/wanijo2/http/controller/ShowController.kt +++ b/src/main/kotlin/wanijo/wanijo2/http/controller/ShowController.kt @@ -25,13 +25,16 @@ class ShowController( val document = docDao.findById(id) ?: throw DocumentNotFound() model["document"] = document - model["tags"] = tagDao.ofDocument(id) val descHtml = Parser.builder().build().parse(document.description).let { HtmlRenderer.builder().build().render(it) } model["descHtml"] = descHtml + val documentTags = tagDao.ofDocument(id) + model["documentTags"] = documentTags.sortedBy { it.name.lowercase() } + model["assignableTags"] = (tagDao.findAll() - documentTags).sortedBy { it.name.lowercase() } + return "show" } diff --git a/src/main/kotlin/wanijo/wanijo2/http/controller/TaggingController.kt b/src/main/kotlin/wanijo/wanijo2/http/controller/TaggingController.kt index 3d5199f..7ca8aa8 100644 --- a/src/main/kotlin/wanijo/wanijo2/http/controller/TaggingController.kt +++ b/src/main/kotlin/wanijo/wanijo2/http/controller/TaggingController.kt @@ -1,32 +1,35 @@ package wanijo.wanijo2.http.controller +import jakarta.validation.Valid import org.springframework.stereotype.Controller import org.springframework.web.bind.annotation.PostMapping -import org.springframework.web.bind.annotation.RequestParam -import wanijo.wanijo2.domain.DocumentId -import wanijo.wanijo2.domain.TagId +import wanijo.wanijo2.domain.event.AssignTaggingCommand import wanijo.wanijo2.domain.event.DeleteTaggingCommand +import wanijo.wanijo2.domain.handler.AssignTaggingHandler import wanijo.wanijo2.domain.handler.DeleteTaggingHandler @Controller class TaggingController( - val deleteTaggingHandler: DeleteTaggingHandler + val deleteTaggingHandler: DeleteTaggingHandler, + val assignTaggingHandler: AssignTaggingHandler ) { @PostMapping("/tagging/delete") fun delete( - @RequestParam("docId") - documentId: DocumentId, - @RequestParam("tagId") - tagId: TagId + @Valid + command: DeleteTaggingCommand ): String { - deleteTaggingHandler.exec( - DeleteTaggingCommand( - tagId = tagId, - documentId = documentId - ) - ) - return "redirect:/document/${documentId}" + deleteTaggingHandler.exec(command) + return "redirect:/document/${command.documentId}" + } + + @PostMapping("/tagging/assign") + fun assign( + @Valid + command: AssignTaggingCommand + ): String { + assignTaggingHandler.exec(command) + return "redirect:/document/${command.documentId}" } } diff --git a/src/main/resources/static/stylesheet.css b/src/main/resources/static/stylesheet.css index 0bc7bb2..95e398d 100644 --- a/src/main/resources/static/stylesheet.css +++ b/src/main/resources/static/stylesheet.css @@ -30,15 +30,13 @@ main { font-size: 90%; } - .show__tags { - ul { - list-style-type: none; - margin: 0; - padding: 0; - - display: flex; - justify-content: space-evenly; - } + .tag-container { + list-style-type: none; + margin: 0; + padding: 0; + + display: flex; + justify-content: space-evenly; } .tag-block { diff --git a/src/main/resources/templates/show.html b/src/main/resources/templates/show.html index 13486df..29664ed 100644 --- a/src/main/resources/templates/show.html +++ b/src/main/resources/templates/show.html @@ -33,12 +33,12 @@
tags -

taggen

+