assign tags

master
Josha von Gizycki 2 weeks ago
parent 97fe0acdea
commit 26fdc13a77

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

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

@ -33,6 +33,11 @@ data class DocumentTagging(
tagId = AggregateReference.to(tagId), tagId = AggregateReference.to(tagId),
documentId = AggregateReference.to(doc.id) documentId = AggregateReference.to(doc.id)
) )
fun between(docId: DocumentId, tagId: TagId) =
DocumentTagging(
tagId = AggregateReference.to(tagId),
documentId = AggregateReference.to(docId)
)
} }
} }

@ -25,13 +25,16 @@ class ShowController(
val document = docDao.findById(id) ?: throw DocumentNotFound() val document = docDao.findById(id) ?: throw DocumentNotFound()
model["document"] = document model["document"] = document
model["tags"] = tagDao.ofDocument(id)
val descHtml = Parser.builder().build().parse(document.description).let { val descHtml = Parser.builder().build().parse(document.description).let {
HtmlRenderer.builder().build().render(it) HtmlRenderer.builder().build().render(it)
} }
model["descHtml"] = descHtml 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" return "show"
} }

@ -1,32 +1,35 @@
package wanijo.wanijo2.http.controller package wanijo.wanijo2.http.controller
import jakarta.validation.Valid
import org.springframework.stereotype.Controller import org.springframework.stereotype.Controller
import org.springframework.web.bind.annotation.PostMapping import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RequestParam import wanijo.wanijo2.domain.event.AssignTaggingCommand
import wanijo.wanijo2.domain.DocumentId
import wanijo.wanijo2.domain.TagId
import wanijo.wanijo2.domain.event.DeleteTaggingCommand import wanijo.wanijo2.domain.event.DeleteTaggingCommand
import wanijo.wanijo2.domain.handler.AssignTaggingHandler
import wanijo.wanijo2.domain.handler.DeleteTaggingHandler import wanijo.wanijo2.domain.handler.DeleteTaggingHandler
@Controller @Controller
class TaggingController( class TaggingController(
val deleteTaggingHandler: DeleteTaggingHandler val deleteTaggingHandler: DeleteTaggingHandler,
val assignTaggingHandler: AssignTaggingHandler
) { ) {
@PostMapping("/tagging/delete") @PostMapping("/tagging/delete")
fun delete( fun delete(
@RequestParam("docId") @Valid
documentId: DocumentId, command: DeleteTaggingCommand
@RequestParam("tagId")
tagId: TagId
): String { ): String {
deleteTaggingHandler.exec( deleteTaggingHandler.exec(command)
DeleteTaggingCommand( return "redirect:/document/${command.documentId}"
tagId = tagId, }
documentId = documentId
) @PostMapping("/tagging/assign")
) fun assign(
return "redirect:/document/${documentId}" @Valid
command: AssignTaggingCommand
): String {
assignTaggingHandler.exec(command)
return "redirect:/document/${command.documentId}"
} }
} }

@ -30,15 +30,13 @@ main {
font-size: 90%; font-size: 90%;
} }
.show__tags { .tag-container {
ul { list-style-type: none;
list-style-type: none; margin: 0;
margin: 0; padding: 0;
padding: 0;
display: flex;
display: flex; justify-content: space-evenly;
justify-content: space-evenly;
}
} }
.tag-block { .tag-block {

@ -33,12 +33,12 @@
<fieldset class="show__tags"> <fieldset class="show__tags">
<legend>tags</legend> <legend>tags</legend>
<ul> <ul class="tag-container">
<li th:each="tag : ${tags}" class="tag-block"> <li th:each="tag : ${documentTags}" class="tag-block">
<th:block th:text="${tag.name}"/> <th:block th:text="${tag.name}"/>
<form class="form-link" th:action="@{/tagging/delete}" method="post"> <form class="form-link" th:action="@{/tagging/delete}" method="post">
<input type="hidden" name="tagId" th:value="${tag.id}"> <input type="hidden" name="tagId" th:value="${tag.id}">
<input type="hidden" name="docId" th:value="${document.id}"> <input type="hidden" name="documentId" th:value="${document.id}">
<button type="submit">🞭</button> <button type="submit">🞭</button>
</form> </form>
</li> </li>
@ -51,6 +51,16 @@
</fieldset> </fieldset>
<h2 class="low-key-hint">taggen</h2> <h2 class="low-key-hint">taggen</h2>
<ul class="tag-container">
<li th:each="tag : ${assignableTags}" class="tag-block">
<th:block th:text="${tag.name}"/>
<form class="form-link" th:action="@{/tagging/assign}" method="post">
<input type="hidden" name="tagId" th:value="${tag.id}">
<input type="hidden" name="documentId" th:value="${document.id}">
<button type="submit"></button>
</form>
</li>
</ul>
</main> </main>
</body> </body>
</html> </html>

Loading…
Cancel
Save