From 8e4b400193d29d73aa04e360b2b1d3907de16fe5 Mon Sep 17 00:00:00 2001 From: Josha von Gizycki Date: Fri, 8 Aug 2025 19:28:31 +0200 Subject: [PATCH] editing documents --- .../kotlin/wanijo/wanijo2/domain/document.kt | 27 +++++++++--- .../domain/event/EditDocumentCommand.kt | 25 +++++++++++ .../domain/handler/EditDocumentHandler.kt | 20 +++++++++ src/main/kotlin/wanijo/wanijo2/domain/tag.kt | 3 +- .../wanijo2/http/controller/EditController.kt | 43 +++++++++++++++++++ src/main/resources/static/stylesheet.css | 2 +- src/main/resources/templates/edit.html | 26 +++++++++++ src/main/resources/templates/new.html | 2 +- src/main/resources/templates/show.html | 7 ++- 9 files changed, 145 insertions(+), 10 deletions(-) create mode 100644 src/main/kotlin/wanijo/wanijo2/domain/event/EditDocumentCommand.kt create mode 100644 src/main/kotlin/wanijo/wanijo2/domain/handler/EditDocumentHandler.kt create mode 100644 src/main/kotlin/wanijo/wanijo2/http/controller/EditController.kt create mode 100644 src/main/resources/templates/edit.html diff --git a/src/main/kotlin/wanijo/wanijo2/domain/document.kt b/src/main/kotlin/wanijo/wanijo2/domain/document.kt index 9ade1fc..18e77e5 100644 --- a/src/main/kotlin/wanijo/wanijo2/domain/document.kt +++ b/src/main/kotlin/wanijo/wanijo2/domain/document.kt @@ -8,13 +8,15 @@ import org.springframework.data.repository.Repository import java.time.ZonedDateTime typealias DocumentId = Long +typealias DocumentName = String +typealias DocumentDescription = String @Table("T_DOCUMENT") data class Document( @Id val id: DocumentId = 0, - val name: String, - val description: String = "", + val name: DocumentName, + val description: DocumentDescription = "", val updatedAt: ZonedDateTime = ZonedDateTime.now(), val createdAt: ZonedDateTime = ZonedDateTime.now(), val labelFields: Set = emptySet(), @@ -23,8 +25,8 @@ data class Document( interface DocumentDao: Repository { fun findAll(): List - fun findById(id: Long): Document? - fun findByName(name: String): List + fun findById(id: DocumentId): Document? + fun findByName(name: DocumentName): List fun save(doc: Document): Document @Query( @@ -38,7 +40,22 @@ interface DocumentDao: Repository { WHERE LOWER(tag.name) LIKE '%' || LOWER(:tagName) || '%' """ ) - fun findByTagName(tagName: String): List + fun findByTagName(tagName: TagName): List + + @Modifying + @Query( + """ + UPDATE t_document + SET name = :name, + description = :description + WHERE id = :id + """ + ) + fun edit( + id: DocumentId, + name: DocumentName, + description: DocumentDescription + ) @Modifying @Query( diff --git a/src/main/kotlin/wanijo/wanijo2/domain/event/EditDocumentCommand.kt b/src/main/kotlin/wanijo/wanijo2/domain/event/EditDocumentCommand.kt new file mode 100644 index 0000000..7a1601f --- /dev/null +++ b/src/main/kotlin/wanijo/wanijo2/domain/event/EditDocumentCommand.kt @@ -0,0 +1,25 @@ +package wanijo.wanijo2.domain.event + +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotEmpty +import wanijo.wanijo2.domain.Document +import wanijo.wanijo2.domain.DocumentDescription +import wanijo.wanijo2.domain.DocumentId +import wanijo.wanijo2.domain.DocumentName + +data class EditDocumentCommand( + @Min(0) + val id: DocumentId, + @NotEmpty + val name: DocumentName, + val description: DocumentDescription +) { + companion object { + fun fromDocument(doc: Document) = + EditDocumentCommand( + id = doc.id, + name = doc.name, + description = doc.description + ) + } +} diff --git a/src/main/kotlin/wanijo/wanijo2/domain/handler/EditDocumentHandler.kt b/src/main/kotlin/wanijo/wanijo2/domain/handler/EditDocumentHandler.kt new file mode 100644 index 0000000..e15c33c --- /dev/null +++ b/src/main/kotlin/wanijo/wanijo2/domain/handler/EditDocumentHandler.kt @@ -0,0 +1,20 @@ +package wanijo.wanijo2.domain.handler + +import org.springframework.stereotype.Service +import wanijo.wanijo2.domain.DocumentDao +import wanijo.wanijo2.domain.event.EditDocumentCommand + +@Service +class EditDocumentHandler( + val documentDao: DocumentDao +) { + + fun exec(command: EditDocumentCommand) { + documentDao.edit( + id = command.id, + name = command.name, + description = command.description + ) + } + +} diff --git a/src/main/kotlin/wanijo/wanijo2/domain/tag.kt b/src/main/kotlin/wanijo/wanijo2/domain/tag.kt index 371c380..9983f90 100644 --- a/src/main/kotlin/wanijo/wanijo2/domain/tag.kt +++ b/src/main/kotlin/wanijo/wanijo2/domain/tag.kt @@ -9,12 +9,13 @@ import org.springframework.data.repository.Repository import java.time.ZonedDateTime typealias TagId = Long +typealias TagName = String @Table("T_TAG") data class Tag( @Id val id: TagId = 0, - val name: String, + val name: TagName, val createdAt: ZonedDateTime = ZonedDateTime.now() ) diff --git a/src/main/kotlin/wanijo/wanijo2/http/controller/EditController.kt b/src/main/kotlin/wanijo/wanijo2/http/controller/EditController.kt new file mode 100644 index 0000000..fc503e0 --- /dev/null +++ b/src/main/kotlin/wanijo/wanijo2/http/controller/EditController.kt @@ -0,0 +1,43 @@ +package wanijo.wanijo2.http.controller + +import jakarta.validation.Valid +import org.springframework.stereotype.Controller +import org.springframework.ui.Model +import org.springframework.ui.set +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.PathVariable +import org.springframework.web.bind.annotation.PostMapping +import wanijo.wanijo2.domain.DocumentDao +import wanijo.wanijo2.domain.DocumentId +import wanijo.wanijo2.domain.event.EditDocumentCommand +import wanijo.wanijo2.domain.handler.EditDocumentHandler + +@Controller +class EditController( + val documentDao: DocumentDao, + val editDocumentHandler: EditDocumentHandler +) { + + @GetMapping("/document/{id}/edit") + fun edit( + @PathVariable + id: DocumentId, + model: Model + ): String { + val doc = documentDao.findById(id)!! + model["form"] = EditDocumentCommand.fromDocument(doc) + + return "edit" + } + + @PostMapping("/document/edit") + fun edit( + @Valid + command: EditDocumentCommand + ): String { + editDocumentHandler.exec(command) + + return "redirect:/document/${command.id}" + } + +} diff --git a/src/main/resources/static/stylesheet.css b/src/main/resources/static/stylesheet.css index 08d82b7..bc78dcd 100644 --- a/src/main/resources/static/stylesheet.css +++ b/src/main/resources/static/stylesheet.css @@ -116,7 +116,7 @@ form { } textarea { - min-height: 10rem; + min-height: 20rem; } [type=submit] { diff --git a/src/main/resources/templates/edit.html b/src/main/resources/templates/edit.html new file mode 100644 index 0000000..35457f9 --- /dev/null +++ b/src/main/resources/templates/edit.html @@ -0,0 +1,26 @@ + + + + + + +
+
+ + + + + + + + + +
+
+ + diff --git a/src/main/resources/templates/new.html b/src/main/resources/templates/new.html index 36f87e4..6c58ebe 100644 --- a/src/main/resources/templates/new.html +++ b/src/main/resources/templates/new.html @@ -4,7 +4,7 @@ layout:decorate="~{base}" lang=""> - Home + neu
diff --git a/src/main/resources/templates/show.html b/src/main/resources/templates/show.html index 0e8302c..59f0524 100644 --- a/src/main/resources/templates/show.html +++ b/src/main/resources/templates/show.html @@ -4,7 +4,7 @@ layout:decorate="~{base}" lang=""> - Home +
@@ -14,7 +14,10 @@
- meta + + meta + bearbeiten +
id: