diff --git a/src/main/java/de/jottyfan/camporganizer/module/admin/AdminController.java b/src/main/java/de/jottyfan/camporganizer/module/admin/AdminController.java index bf2811c..245f205 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/admin/AdminController.java +++ b/src/main/java/de/jottyfan/camporganizer/module/admin/AdminController.java @@ -102,4 +102,11 @@ public class AdminController extends CommonController { service.updateDocument(bean); return "redirect:/admin/document"; } + + @GetMapping("/admin/document/delete/{id}") + public String deleteDocument(@PathVariable Integer id, Model model, HttpServletRequest request) { + super.setupSession(model, request); + service.deleteDocument(id); + return "redirect:/admin/document"; + } } diff --git a/src/main/java/de/jottyfan/camporganizer/module/admin/AdminRepository.java b/src/main/java/de/jottyfan/camporganizer/module/admin/AdminRepository.java index f3ac379..066c413 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/admin/AdminRepository.java +++ b/src/main/java/de/jottyfan/camporganizer/module/admin/AdminRepository.java @@ -1,7 +1,9 @@ package de.jottyfan.camporganizer.module.admin; +import static de.jottyfan.camporganizer.db.jooq.Tables.T_CAMP; import static de.jottyfan.camporganizer.db.jooq.Tables.T_DOCUMENT; import static de.jottyfan.camporganizer.db.jooq.Tables.T_DOCUMENTROLE; +import static de.jottyfan.camporganizer.db.jooq.Tables.T_LOCATION; import java.util.ArrayList; import java.util.Arrays; @@ -19,6 +21,7 @@ import org.jooq.InsertReturningStep; import org.jooq.Record5; import org.jooq.SelectSeekStep1; import org.jooq.UpdateConditionStep; +import org.jooq.UpdateSetMoreStep; import org.jooq.exception.DataAccessException; import org.jooq.impl.DSL; import org.springframework.beans.factory.annotation.Autowired; @@ -28,8 +31,10 @@ import org.springframework.transaction.annotation.Transactional; import de.jottyfan.camporganizer.db.jooq.enums.EnumCamprole; import de.jottyfan.camporganizer.db.jooq.enums.EnumDocument; import de.jottyfan.camporganizer.db.jooq.enums.EnumFiletype; +import de.jottyfan.camporganizer.db.jooq.tables.records.TCampRecord; import de.jottyfan.camporganizer.db.jooq.tables.records.TDocumentRecord; import de.jottyfan.camporganizer.db.jooq.tables.records.TDocumentroleRecord; +import de.jottyfan.camporganizer.db.jooq.tables.records.TLocationRecord; import de.jottyfan.camporganizer.module.camplist.LambdaResultWrapper; /** @@ -125,14 +130,19 @@ public class AdminRepository { jooq.transaction(c -> { Integer pk = bean.getPk(); if (bean.getPk() != null) { - UpdateConditionStep sql = DSL.using(c) + UpdateSetMoreStep sqlPart = DSL.using(c) // @formatter:off .update(T_DOCUMENT) .set(T_DOCUMENT.NAME, bean.getName()) - .set(T_DOCUMENT.DOCTYPE, bean.getDoctype()) - .set(T_DOCUMENT.DOCUMENT, bean.getDocument()) - .set(T_DOCUMENT.FILETYPE, bean.getFiletype()) - .where(T_DOCUMENT.PK.eq(bean.getPk())); + .set(T_DOCUMENT.DOCTYPE, bean.getDoctype()); + // @formatter:on + if (bean.getDocument() != null) { + sqlPart = sqlPart.set(T_DOCUMENT.DOCUMENT, bean.getDocument()); + } + // @formatter:off + UpdateConditionStep sql = sqlPart + .set(T_DOCUMENT.FILETYPE, bean.getFiletype()) + .where(T_DOCUMENT.PK.eq(bean.getPk())); // @formatter:on LOGGER.debug("{}", sql.toString()); lrw.add(sql.execute()); @@ -183,4 +193,53 @@ public class AdminRepository { }); return lrw.getCounter(); } + + /** + * delete entry from t_document where pk = ? + * + * @param pk + * to be used as reference + * @return number of affected database lines + * @throws DataAccessException + */ + public Integer deleteDocument(Integer pk) throws DataAccessException { + LambdaResultWrapper lrw = new LambdaResultWrapper(); + jooq.transaction(t -> { + UpdateConditionStep sql = DSL.using(t) + // @formatter:off + .update(T_CAMP) + .set(T_CAMP.FK_DOCUMENT, (Integer) null) + .where(T_CAMP.FK_DOCUMENT.eq(pk)); + // @formatter:on + LOGGER.debug("{}", sql.toString()); + lrw.add(sql.execute()); + + UpdateConditionStep sql1 = DSL.using(t) + // @formatter:off + .update(T_LOCATION) + .set(T_LOCATION.FK_DOCUMENT, (Integer) null) + .where(T_LOCATION.FK_DOCUMENT.eq(pk)); + // @formatter:on + LOGGER.debug("{}", sql1.toString()); + lrw.add(sql1.execute()); + + DeleteConditionStep sql2 = DSL.using(t) + // @formatter:off + .deleteFrom(T_DOCUMENTROLE) + .where(T_DOCUMENTROLE.FK_DOCUMENT.eq(pk)); + // @formatter:on + LOGGER.debug("{}", sql2.toString()); + lrw.add(sql2.execute()); + + DeleteConditionStep sql3 = DSL.using(t) + // @formatter:off + .deleteFrom(T_DOCUMENT) + .where(T_DOCUMENT.PK.eq(pk)); + // @formatter:on + LOGGER.debug("{}", sql3.toString()); + lrw.add(sql3.execute()); + }); + return lrw.getCounter(); + } + } diff --git a/src/main/java/de/jottyfan/camporganizer/module/admin/AdminService.java b/src/main/java/de/jottyfan/camporganizer/module/admin/AdminService.java index 1529d1d..d6d2db9 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/admin/AdminService.java +++ b/src/main/java/de/jottyfan/camporganizer/module/admin/AdminService.java @@ -1,9 +1,12 @@ package de.jottyfan.camporganizer.module.admin; +import java.io.IOException; import java.util.List; import javax.validation.Valid; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -17,6 +20,7 @@ import de.jottyfan.camporganizer.module.mail.MailRepository; */ @Service public class AdminService { + private static final Logger LOGGER = LogManager.getLogger(AdminService.class); @Autowired private MailRepository mailRepository; @@ -54,6 +58,21 @@ public class AdminService { * @return the number of affected database lines */ public Integer updateDocument(@Valid DocumentBean bean) { + try { + bean.encodeUpload(); + } catch (IOException e) { + LOGGER.error(e.getMessage()); + } return adminRepository.upsert(bean); } + + /** + * delete document with id from the database + * + * @param id the ID of the document + * @return the number of affected database lines + */ + public Integer deleteDocument(Integer id) { + return adminRepository.deleteDocument(id); + } } diff --git a/src/main/java/de/jottyfan/camporganizer/module/admin/DocumentBean.java b/src/main/java/de/jottyfan/camporganizer/module/admin/DocumentBean.java index d4b5df3..1c0dfd4 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/admin/DocumentBean.java +++ b/src/main/java/de/jottyfan/camporganizer/module/admin/DocumentBean.java @@ -5,11 +5,11 @@ import java.io.InputStream; import java.io.Serializable; import java.util.Base64; -import javax.servlet.http.Part; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import org.apache.commons.io.IOUtils; +import org.springframework.web.multipart.MultipartFile; import de.jottyfan.camporganizer.db.jooq.enums.EnumCamprole; import de.jottyfan.camporganizer.db.jooq.enums.EnumDocument; @@ -33,9 +33,14 @@ public class DocumentBean implements Serializable{ @NotNull private EnumFiletype filetype; @NotNull - private Part uploadfile; + private MultipartFile uploadfile; private EnumCamprole[] roles; + /** + * convert the uploadfile to the document + * + * @throws IOException on IO errors + */ public void encodeUpload() throws IOException { if (uploadfile != null) { InputStream inputStream = uploadfile.getInputStream(); @@ -82,11 +87,11 @@ public class DocumentBean implements Serializable{ return filetype; } - public Part getUploadfile() { + public MultipartFile getUploadfile() { return uploadfile; } - public void setUploadfile(Part uploadfile) { + public void setUploadfile(MultipartFile uploadfile) { this.uploadfile = uploadfile; } diff --git a/src/main/resources/static/css/style.css b/src/main/resources/static/css/style.css index d82940b..01af74f 100644 --- a/src/main/resources/static/css/style.css +++ b/src/main/resources/static/css/style.css @@ -104,10 +104,10 @@ div { .mainpage { background-color: rgba(255, 255, 255, 0.4); - padding: 8px; + padding: 16px; overflow: auto; width: 100%; - height: calc(100vh - 60px); + height: calc(100vh - 72px); /* 60 px is the current height of the headline; TODO: calculate it */ } diff --git a/src/main/resources/templates/admin/document_edit.html b/src/main/resources/templates/admin/document_edit.html index 6deeb04..9ac32fa 100644 --- a/src/main/resources/templates/admin/document_edit.html +++ b/src/main/resources/templates/admin/document_edit.html @@ -76,13 +76,16 @@ - -