delete documents

master
Josha von Gizycki 2 weeks ago
parent d9e7b2e85a
commit d235451f07

@ -1,6 +1,7 @@
package wanijo.wanijo2.domain
import org.springframework.data.annotation.Id
import org.springframework.data.jdbc.repository.query.Modifying
import org.springframework.data.jdbc.repository.query.Query
import org.springframework.data.relational.core.mapping.Table
import org.springframework.data.repository.Repository
@ -38,4 +39,13 @@ interface DocumentDao: Repository<Document, DocumentId> {
"""
)
fun findByTagName(tagName: String): List<Document>
@Modifying
@Query(
"""
DELETE FROM t_document
WHERE id = :documentId
"""
)
fun delete(documentId: DocumentId)
}

@ -1,15 +1,12 @@
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,9 @@
package wanijo.wanijo2.domain.event
import jakarta.validation.constraints.Min
import wanijo.wanijo2.domain.DocumentId
data class DeleteDocumentCommand(
@Min(1)
val documentId: DocumentId
)

@ -1,15 +1,12 @@
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 DeleteTaggingCommand(
@NotEmpty
@Min(1)
val tagId: TagId,
@NotEmpty
@Min(1)
val documentId: DocumentId
)

@ -0,0 +1,16 @@
package wanijo.wanijo2.domain.handler
import org.springframework.stereotype.Service
import wanijo.wanijo2.domain.DocumentDao
import wanijo.wanijo2.domain.event.DeleteDocumentCommand
@Service
class DeleteDocumentHandler(
val documentDao: DocumentDao
) {
fun exec(command: DeleteDocumentCommand) {
documentDao.delete(command.documentId)
}
}

@ -0,0 +1,24 @@
package wanijo.wanijo2.http.controller
import jakarta.validation.Valid
import org.springframework.stereotype.Controller
import org.springframework.web.bind.annotation.PostMapping
import wanijo.wanijo2.domain.event.DeleteDocumentCommand
import wanijo.wanijo2.domain.handler.DeleteDocumentHandler
@Controller
class DeleteController(
val deleteDocumentHandler: DeleteDocumentHandler
) {
@PostMapping("/document/delete")
fun delete(
@Valid
command: DeleteDocumentCommand
): String {
deleteDocumentHandler.exec(command)
return "redirect:/"
}
}

@ -15,6 +15,7 @@ class ListController(
fun list(
model: Model
): String {
// TODO build overview class for documents without sub fields
model["documents"] = docDao.findAll()
return "list"
}

@ -1,23 +1,33 @@
CREATE TABLE t_label_field
(
id INT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
name VARCHAR NOT NULL,
"ORDER" INT NOT NULL DEFAULT 0,
name VARCHAR NOT NULL,
"ORDER" INT NOT NULL DEFAULT 0,
"VALUE" VARCHAR,
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(),
updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(),
t_document INT REFERENCES t_document (id) NOT NULL
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(),
updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(),
t_document INT NOT NULL,
CONSTRAINT fk_label_field_doc_id
FOREIGN KEY (t_document)
REFERENCES t_document
ON DELETE CASCADE
);
CREATE TABLE t_date_field
(
id INT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
name VARCHAR NOT NULL,
"ORDER" INT NOT NULL DEFAULT 0,
name VARCHAR NOT NULL,
"ORDER" INT NOT NULL DEFAULT 0,
"VALUE" TIMESTAMP WITH TIME ZONE,
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(),
updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(),
t_document INT REFERENCES t_document (id) NOT NULL
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(),
updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(),
t_document INT NOT NULL,
CONSTRAINT fk_date_field_doc_id
FOREIGN KEY (t_document)
REFERENCES t_document
ON DELETE CASCADE
);
CREATE TABLE t_tag
@ -30,6 +40,19 @@ CREATE TABLE t_tag
CREATE TABLE t_document_tagging
(
id INT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
tag_id INT references t_tag,
document_id INT references t_document
tag_id INT NOT NULL,
document_id INT NOT NULL,
CONSTRAINT fk_doc_tagging_tag_id
FOREIGN KEY (tag_id)
REFERENCES t_tag
ON DELETE CASCADE,
CONSTRAINT fk_doc_tagging_doc_id
FOREIGN KEY (document_id)
REFERENCES t_document
ON DELETE CASCADE,
CONSTRAINT uq_doc_tagging
UNIQUE (document_id, tag_id)
);

@ -1,6 +1,7 @@
body {
--dark-grey: #717171;
--light-grey: #858585;
--warning: #ce0000;
margin: 0 5rem;
font-family: sans-serif;
@ -13,6 +14,10 @@ body {
a:hover, a:active {
text-decoration: underline;
}
.warning {
color: var(--warning);
}
}
nav {
@ -113,6 +118,10 @@ form {
textarea {
min-height: 10rem;
}
[type=submit] {
padding: .3rem;
}
}
.form-link {
@ -130,3 +139,7 @@ form {
}
}
}
.form-inline {
display: block;
}

@ -33,11 +33,12 @@
<ul class="tag-container">
<li th:each="tag : ${documentTags}" class="tag-block">
<th:block th:text="${tag.name}"/>
<form class="form-link" th:action="@{/tagging/delete}" method="post">
<input type="hidden" name="tagId" th:value="${tag.id}">
<input type="hidden" name="documentId" th:value="${document.id}">
<button type="submit">🞭</button>
<button type="submit">
<th:block th:text="${tag.name}"/>
</button>
</form>
</li>
</ul>
@ -51,14 +52,23 @@
<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>
<button type="submit">
<th:block th:text="${tag.name}"/>
</button>
</form>
</li>
</ul>
<h2 class="warning">gefahr</h2>
<form class="form-inline" th:action="@{/document/delete}" method="post">
<input type="hidden" name="documentId" th:value="${document.id}">
<button type="submit" class="warning">
LÖSCHEN
</button>
</form>
</main>
</body>
</html>

Loading…
Cancel
Save