From f96a82153cb0bc0dc9cbd4980b4a41cf44b782e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Henke?= Date: Wed, 6 Jul 2022 17:17:45 +0200 Subject: [PATCH] manipulate projects --- .../timetrack/spring/done/DoneController.java | 30 +++++++++ .../timetrack/spring/done/IDoneService.java | 7 +++ .../spring/done/impl/DoneGateway.java | 63 ++++++++++++++++--- .../spring/done/impl/DoneService.java | 31 +++++++++ src/main/resources/templates/done/list.html | 9 +++ .../resources/templates/done/project.html | 42 +++++++++++++ 6 files changed, 174 insertions(+), 8 deletions(-) create mode 100644 src/main/resources/templates/done/project.html diff --git a/src/main/java/de/jottyfan/timetrack/spring/done/DoneController.java b/src/main/java/de/jottyfan/timetrack/spring/done/DoneController.java index 1e3c8cf..e2825e5 100644 --- a/src/main/java/de/jottyfan/timetrack/spring/done/DoneController.java +++ b/src/main/java/de/jottyfan/timetrack/spring/done/DoneController.java @@ -19,6 +19,8 @@ import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; +import de.jottyfan.timetrack.db.done.tables.records.TProjectRecord; + /** * * @author henkej @@ -93,6 +95,34 @@ public class DoneController { return toItem(bean, model); } + @RolesAllowed("timetrack_user") + @GetMapping("/done/edit/project/{id}") + public String toProject(@PathVariable Integer id, Model model) { + TProjectRecord project = doneService.getProject(id); + model.addAttribute("projectBean", project); + return "done/project"; + } + + @RolesAllowed("timetrack_user") + @RequestMapping(value = "/done/upsert/project", method = RequestMethod.POST) + public String doUpsert(Model model, @ModelAttribute TProjectRecord bean) { + Integer amount = doneService.doUpsertProject(bean); + return amount.equals(1) ? getList(new DoneModel(), model) : toProject(bean.getPk(), model); + } + + @RolesAllowed("timetrack_user") + @RequestMapping(value = "/done/add/project", method = RequestMethod.GET) + public String toAddProject(Model model) { + return toProject(null, model); + } + + @RolesAllowed("timetrack_user") + @GetMapping(value = "/done/delete/project/{id}") + public String doDeleteProject(@PathVariable Integer id, Model model) { + Integer amount = doneService.doDeleteProject(id); + return amount.equals(1) ? getList(new DoneModel(), model) : toProject(id, model); + } + @RolesAllowed("timetrack_user") @RequestMapping(value = "/done/upsert", method = RequestMethod.POST) public String doUpsert(Model model, @ModelAttribute DoneBean bean) { diff --git a/src/main/java/de/jottyfan/timetrack/spring/done/IDoneService.java b/src/main/java/de/jottyfan/timetrack/spring/done/IDoneService.java index 2b60d3a..50b7eb4 100644 --- a/src/main/java/de/jottyfan/timetrack/spring/done/IDoneService.java +++ b/src/main/java/de/jottyfan/timetrack/spring/done/IDoneService.java @@ -5,6 +5,7 @@ import java.util.List; import javax.servlet.http.HttpServletRequest; +import de.jottyfan.timetrack.db.done.tables.records.TProjectRecord; import de.jottyfan.timetrack.db.done.tables.records.VBillingRecord; import de.jottyfan.timetrack.db.done.tables.records.VJobRecord; import de.jottyfan.timetrack.db.done.tables.records.VModuleRecord; @@ -33,4 +34,10 @@ public interface IDoneService { public Integer doUpsert(DoneBean bean, String username); public Integer doDelete(Integer id); + + public TProjectRecord getProject(Integer id); + + public Integer doUpsertProject(TProjectRecord bean); + + public Integer doDeleteProject(Integer id); } diff --git a/src/main/java/de/jottyfan/timetrack/spring/done/impl/DoneGateway.java b/src/main/java/de/jottyfan/timetrack/spring/done/impl/DoneGateway.java index c3c6be8..99ad6e8 100644 --- a/src/main/java/de/jottyfan/timetrack/spring/done/impl/DoneGateway.java +++ b/src/main/java/de/jottyfan/timetrack/spring/done/impl/DoneGateway.java @@ -1,9 +1,10 @@ package de.jottyfan.timetrack.spring.done.impl; -import static de.jottyfan.timetrack.db.done.Tables.T_BILLING; import static de.jottyfan.timetrack.db.done.Tables.T_DONE; -import static de.jottyfan.timetrack.db.done.Tables.T_JOB; -import static de.jottyfan.timetrack.db.done.Tables.T_MODULE; +import static de.jottyfan.timetrack.db.done.Tables.T_PROJECT; +import static de.jottyfan.timetrack.db.done.Tables.V_BILLING; +import static de.jottyfan.timetrack.db.done.Tables.V_JOB; +import static de.jottyfan.timetrack.db.done.Tables.V_MODULE; import static de.jottyfan.timetrack.db.done.Tables.V_PROJECT; import static de.jottyfan.timetrack.db.profile.Tables.T_LOGIN; @@ -19,6 +20,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.jooq.DSLContext; import org.jooq.DeleteConditionStep; +import org.jooq.InsertReturningStep; import org.jooq.InsertValuesStep7; import org.jooq.Record7; import org.jooq.Result; @@ -29,6 +31,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; import de.jottyfan.timetrack.db.done.tables.records.TDoneRecord; +import de.jottyfan.timetrack.db.done.tables.records.TProjectRecord; import de.jottyfan.timetrack.db.done.tables.records.VBillingRecord; import de.jottyfan.timetrack.db.done.tables.records.VJobRecord; import de.jottyfan.timetrack.db.done.tables.records.VModuleRecord; @@ -64,7 +67,7 @@ public class DoneGateway { Result r = getJooq().selectFrom(T_LOGIN).where(T_LOGIN.LOGIN.eq(username)).fetch(); return r == null || r.size() < 1 ? null : r.get(0).getPk(); } - + /** * get all projects from the database * @@ -103,7 +106,7 @@ public class DoneGateway { if (includeNull) { list.add(new VModuleRecord()); } - list.addAll(getJooq().selectFrom(T_MODULE).orderBy(T_MODULE.NAME).fetchInto(VModuleRecord.class)); + list.addAll(getJooq().selectFrom(V_MODULE).orderBy(V_MODULE.NAME).fetchInto(VModuleRecord.class)); return list; } @@ -124,7 +127,7 @@ public class DoneGateway { if (includeNull) { list.add(new VJobRecord()); } - list.addAll(getJooq().selectFrom(T_JOB).orderBy(T_JOB.NAME).fetchInto(VJobRecord.class)); + list.addAll(getJooq().selectFrom(V_JOB).orderBy(V_JOB.NAME).fetchInto(VJobRecord.class)); return list; } @@ -143,9 +146,9 @@ public class DoneGateway { throws DataAccessException, ClassNotFoundException, SQLException { List list = new ArrayList<>(); if (includeNull) { - list.add(new VBillingRecord(null, null, "---", null, null)); + list.add(new VBillingRecord()); } - list.addAll(getJooq().selectFrom(T_BILLING).orderBy(T_BILLING.NAME).fetchInto(VBillingRecord.class)); + list.addAll(getJooq().selectFrom(V_BILLING).orderBy(V_BILLING.NAME).fetchInto(VBillingRecord.class)); return list; } @@ -362,4 +365,48 @@ public class DoneGateway { LOGGER.debug(sql.toString()); return sql.execute(); } + + public TProjectRecord getProject(Integer id) { + SelectConditionStep sql = getJooq().selectFrom(T_PROJECT).where(T_PROJECT.PK.eq(id)); + LOGGER.debug(sql.toString()); + return sql.fetchOne(); + } + + public Integer upsertProject(TProjectRecord bean) { + return bean.getPk() != null ? updateProject(bean) : insertProject(bean); + } + + private Integer insertProject(TProjectRecord bean) { + InsertReturningStep sql = getJooq() + // @formatter:off + .insertInto(T_PROJECT, + T_PROJECT.NAME) + .values(bean.getName()) + .onConflict(T_PROJECT.NAME) + .doNothing(); + // @formatter:on + LOGGER.debug(sql.toString()); + return sql.execute(); + } + + private Integer updateProject(TProjectRecord bean) { + UpdateConditionStep sql = getJooq() + // @formatter:off + .update(T_PROJECT) + .set(T_PROJECT.NAME, bean.getName()) + .where(T_PROJECT.PK.eq(bean.getPk())); + // @formatter:on + LOGGER.debug(sql.toString()); + return sql.execute(); + } + + public Integer deleteProject(Integer id) { + DeleteConditionStep sql = getJooq() + // @formatter:off + .deleteFrom(T_PROJECT) + .where(T_PROJECT.PK.eq(id)); + // @formatter:on + LOGGER.debug("{}", sql.toString()); + return sql.execute(); + } } diff --git a/src/main/java/de/jottyfan/timetrack/spring/done/impl/DoneService.java b/src/main/java/de/jottyfan/timetrack/spring/done/impl/DoneService.java index 90eb51c..3e78cbb 100644 --- a/src/main/java/de/jottyfan/timetrack/spring/done/impl/DoneService.java +++ b/src/main/java/de/jottyfan/timetrack/spring/done/impl/DoneService.java @@ -14,6 +14,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import de.jottyfan.timetrack.db.done.tables.records.TProjectRecord; import de.jottyfan.timetrack.db.done.tables.records.VBillingRecord; import de.jottyfan.timetrack.db.done.tables.records.VJobRecord; import de.jottyfan.timetrack.db.done.tables.records.VModuleRecord; @@ -128,4 +129,34 @@ public class DoneService implements IDoneService { return -1; } } + + @Override + public TProjectRecord getProject(Integer id) { + try { + return id == null ? new TProjectRecord() : new DoneGateway(dsl).getProject(id); + } catch (Exception e) { + LOGGER.error(e); + return null; + } + } + + @Override + public Integer doUpsertProject(TProjectRecord bean) { + try { + return new DoneGateway(dsl).upsertProject(bean); + } catch (Exception e) { + LOGGER.error(e); + return -1; + } + } + + @Override + public Integer doDeleteProject(Integer id) { + try { + return new DoneGateway(dsl).deleteProject(id); + } catch (Exception e) { + LOGGER.error(e); + return -1; + } + } } diff --git a/src/main/resources/templates/done/list.html b/src/main/resources/templates/done/list.html index d3c66b3..4f6a7ba 100644 --- a/src/main/resources/templates/done/list.html +++ b/src/main/resources/templates/done/list.html @@ -81,14 +81,23 @@ Name Benutzt in % + + + + + + neues Projekt + + +
diff --git a/src/main/resources/templates/done/project.html b/src/main/resources/templates/done/project.html new file mode 100644 index 0000000..0f400b4 --- /dev/null +++ b/src/main/resources/templates/done/project.html @@ -0,0 +1,42 @@ + + + +Projekt aktualisieren + + +
    +
+
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
Änderung
+
+ + abbrechen + +
+
+
+
+
+ + \ No newline at end of file