diff --git a/.project b/.project index ebcb21c..f2a18a9 100644 --- a/.project +++ b/.project @@ -25,6 +25,11 @@ + + org.springframework.ide.eclipse.boot.validation.springbootbuilder + + + org.eclipse.jdt.core.javanature diff --git a/.settings/org.springframework.ide.eclipse.prefs b/.settings/org.springframework.ide.eclipse.prefs new file mode 100644 index 0000000..a12794d --- /dev/null +++ b/.settings/org.springframework.ide.eclipse.prefs @@ -0,0 +1,2 @@ +boot.validation.initialized=true +eclipse.preferences.version=1 diff --git a/build.gradle b/build.gradle index cdd526a..3e2bd9f 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ plugins { - id 'org.springframework.boot' version '3.1.5' - id "io.spring.dependency-management" version "1.1.3" + id 'org.springframework.boot' version '3.2.1' + id "io.spring.dependency-management" version "1.1.4" id 'java' id 'war' id 'eclipse' @@ -8,7 +8,7 @@ plugins { } group = 'de.jottyfan.camporganizer' -version = '0.6.5' +version = '0.6.6' description = """CampOrganizer2""" @@ -41,12 +41,12 @@ war { } dependencies { - implementation 'org.apache.logging.log4j:log4j-api:2.21.0' - implementation 'org.apache.logging.log4j:log4j-core:2.21.0' - implementation 'org.apache.logging.log4j:log4j-to-slf4j:2.21.0' + implementation 'org.apache.logging.log4j:log4j-api:2.22.0' + implementation 'org.apache.logging.log4j:log4j-core:2.22.0' + implementation 'org.apache.logging.log4j:log4j-to-slf4j:2.22.0' implementation 'org.webjars:bootstrap:5.3.2' - implementation 'org.webjars:font-awesome:6.4.2' + implementation 'org.webjars:font-awesome:6.5.1' implementation 'org.webjars:jquery:3.7.1' implementation 'org.webjars:popper.js:2.11.7' implementation 'org.webjars:datatables:1.13.5' @@ -55,9 +55,9 @@ dependencies { implementation 'net.sf.biweekly:biweekly:0.6.7' // for using the keycloak rest interface - implementation 'org.keycloak:keycloak-server-spi:22.0.4' - implementation 'org.keycloak:keycloak-admin-client:22.0.4' - implementation 'org.jboss.resteasy:resteasy-client:6.2.5.Final' + implementation 'org.keycloak:keycloak-server-spi:23.0.3' + implementation 'org.keycloak:keycloak-admin-client:23.0.3' + implementation 'org.jboss.resteasy:resteasy-client:6.2.6.Final' // backward compatibility until the complete registration is converted to keycloak implementation 'org.jasypt:jasypt:1.9.3' @@ -66,13 +66,13 @@ dependencies { implementation 'com.rometools:rome:2.1.0' // mail support - implementation 'commons-validator:commons-validator:1.7' + implementation 'commons-validator:commons-validator:1.8.0' implementation 'org.springframework.boot:spring-boot-starter-mail' implementation 'org.springframework.boot:spring-boot-starter-jooq' implementation 'org.springframework.boot:spring-boot-starter-security' implementation "org.springframework.boot:spring-boot-starter-oauth2-client" - implementation 'org.springframework.security:spring-security-oauth2-authorization-server:1.1.3' + implementation 'org.springframework.security:spring-security-oauth2-authorization-server:1.2.1' implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-validation' @@ -80,7 +80,7 @@ dependencies { implementation 'de.jottyfan:COJooq:2023.03' implementation 'nz.net.ultraq.thymeleaf:thymeleaf-layout-dialect:3.3.0' - implementation 'commons-io:commons-io:2.14.0' + implementation 'commons-io:commons-io:2.15.1' runtimeOnly 'org.springframework.boot:spring-boot-starter-tomcat' testImplementation 'org.springframework.boot:spring-boot-starter-test' 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 25016c1..db1a989 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/admin/AdminController.java +++ b/src/main/java/de/jottyfan/camporganizer/module/admin/AdminController.java @@ -74,7 +74,7 @@ public class AdminController extends CommonController { } @GetMapping("/admin/document/edit/{id}") - public String prepareAddDocument(@PathVariable Integer id, Model model, HttpServletRequest request) { + public String prepareAddDocument(@PathVariable("id") Integer id, Model model, HttpServletRequest request) { model.addAttribute("bean", service.getDocument(id)); return "/admin/document_edit"; } @@ -92,7 +92,7 @@ public class AdminController extends CommonController { } @GetMapping("/admin/document/delete/{id}") - public String deleteDocument(@PathVariable Integer id, Model model, HttpServletRequest request) { + public String deleteDocument(@PathVariable("id") Integer id, Model model, HttpServletRequest request) { service.deleteDocument(id); return "redirect:/admin/document"; } @@ -111,7 +111,7 @@ public class AdminController extends CommonController { } @GetMapping("/admin/location/edit/{id}") - public String prepareAddLocation(@PathVariable Integer id, Model model, HttpServletRequest request) { + public String prepareAddLocation(@PathVariable("id") Integer id, Model model, HttpServletRequest request) { model.addAttribute("bean", service.getLocation(id)); model.addAttribute("documents", service.getLocationDocuments()); return "/admin/location_edit"; @@ -132,7 +132,7 @@ public class AdminController extends CommonController { } @GetMapping("/admin/location/delete/{id}") - public String deleteLocation(@PathVariable Integer id, Model model, HttpServletRequest request) { + public String deleteLocation(@PathVariable("id") Integer id, Model model, HttpServletRequest request) { service.deleteLocation(id); return "redirect:/admin/location"; } @@ -154,7 +154,7 @@ public class AdminController extends CommonController { } @GetMapping("/admin/camp/edit/{id}") - public String prepareEditCamp(@PathVariable Integer id, Model model, HttpServletRequest request) { + public String prepareEditCamp(@PathVariable("id") Integer id, Model model, HttpServletRequest request) { model.addAttribute("bean", service.getCamp(id)); model.addAttribute("documents", service.getCampDocuments()); model.addAttribute("locations", service.getLocations()); @@ -186,7 +186,7 @@ public class AdminController extends CommonController { } @GetMapping("/admin/camp/delete/{id}") - public String deleteCamp(@PathVariable Integer id, Model model, HttpServletRequest request, + public String deleteCamp(@PathVariable("id") Integer id, Model model, HttpServletRequest request, RedirectAttributes redirect) { String error = service.deleteCamp(id); redirect.addAttribute("error", error); diff --git a/src/main/java/de/jottyfan/camporganizer/module/admin/AdminPrivilegesController.java b/src/main/java/de/jottyfan/camporganizer/module/admin/AdminPrivilegesController.java index 4905aff..88788c5 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/admin/AdminPrivilegesController.java +++ b/src/main/java/de/jottyfan/camporganizer/module/admin/AdminPrivilegesController.java @@ -49,7 +49,7 @@ public class AdminPrivilegesController extends CommonController { } @GetMapping("/admin/privileges/rolebased/{role}") - public String getRolebased(@PathVariable String role, Model model) { + public String getRolebased(@PathVariable("role") String role, Model model) { model.addAttribute("list", service.getAllModules()); model.addAttribute("selected", role); model.addAttribute("container", service.getPersonCampMappingByModule(EnumModule.valueOf(role))); @@ -58,7 +58,7 @@ public class AdminPrivilegesController extends CommonController { } @GetMapping("/admin/privileges/campbased/{campid}") - public String getCampbased(@PathVariable Integer campid, Model model) { + public String getCampbased(@PathVariable("campid") Integer campid, Model model) { List list = service.getAllCamps(); model.addAttribute("list", list); String campname = "?"; @@ -74,7 +74,7 @@ public class AdminPrivilegesController extends CommonController { } @GetMapping("/admin/privileges/userbased/{userid}") - public String getUserbased(@PathVariable Integer userid, Model model) { + public String getUserbased(@PathVariable("userid") Integer userid, Model model) { List list = service.getProfiles(); model.addAttribute("list", list); String selected = "?"; @@ -90,13 +90,13 @@ public class AdminPrivilegesController extends CommonController { } @GetMapping("/admin/privileges/delete/{id}/{pagedest}") - public String deleteFromCampProfile(@PathVariable Integer id, @PathVariable String pagedest) { + public String deleteFromCampProfile(@PathVariable("id") Integer id, @PathVariable("pagedest") String pagedest) { service.deleteFromCampProfile(id); return "redirect:" + pagedest.replace("_", "/"); } @GetMapping("/admin/privileges/add/{pagedest}") - public String prepareAdd(Model model, @PathVariable String pagedest) { + public String prepareAdd(Model model, @PathVariable("pagedest") String pagedest) { model.addAttribute("pagedest", pagedest); model.addAttribute("bean", new CampProfileBean()); model.addAttribute("profiles", service.getProfiles()); @@ -106,7 +106,7 @@ public class AdminPrivilegesController extends CommonController { } @PostMapping("/admin/privileges/insert/{pagedest}") - public String insertCampProfile(@Valid @ModelAttribute("bean") CampProfileBean bean, final BindingResult bindingResult, @PathVariable String pagedest, Model model) { + public String insertCampProfile(@Valid @ModelAttribute("bean") CampProfileBean bean, final BindingResult bindingResult, @PathVariable("pagedest") String pagedest, Model model) { if (bindingResult.hasErrors()) { model.addAttribute("pagedest", pagedest); model.addAttribute("profiles", service.getProfiles()); @@ -119,7 +119,7 @@ public class AdminPrivilegesController extends CommonController { } @GetMapping("/admin/privileges/abortinsert/{pagedest}") - public String abortInsert(@PathVariable String pagedest) { + public String abortInsert(@PathVariable("pagedest") String pagedest) { return "redirect:" + pagedest.replace("_", "/"); } } diff --git a/src/main/java/de/jottyfan/camporganizer/module/business/bookings/BookingsController.java b/src/main/java/de/jottyfan/camporganizer/module/business/bookings/BookingsController.java index 9d98036..e86d21b 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/business/bookings/BookingsController.java +++ b/src/main/java/de/jottyfan/camporganizer/module/business/bookings/BookingsController.java @@ -39,7 +39,7 @@ public class BookingsController extends CommonController { @GetMapping("/business/bookings/{id}") @RolesAllowed({"business_booking"}) - public String getBooking(Model model, @PathVariable Integer id) { + public String getBooking(Model model, @PathVariable("id") Integer id) { BookerBean bean = bookingsService.getBooker(id, getCurrentUser()); model.addAttribute("booker", bean); model.addAttribute("addBean", new AddPaymentBean()); @@ -48,7 +48,7 @@ public class BookingsController extends CommonController { @PostMapping("/business/bookings/payment/{id}") @RolesAllowed({"business_booking"}) - public String addPayment(Model model, @ModelAttribute AddPaymentBean bean, @PathVariable Integer id) { + public String addPayment(Model model, @ModelAttribute("bean") AddPaymentBean bean, @PathVariable("id") Integer id) { Double payment = bean.getPayment(); bookingsService.addPayment(id, payment); return getBooking(model, id); @@ -56,7 +56,7 @@ public class BookingsController extends CommonController { @PostMapping("/business/bookings/listpayment/{id}") @RolesAllowed({"business_booking"}) - public String addListPayment(Model model, @ModelAttribute AddPaymentBean bean, @PathVariable Integer id, @RequestParam(defaultValue = "") String search) { + public String addListPayment(Model model, @ModelAttribute("bean") AddPaymentBean bean, @PathVariable("id") Integer id, @RequestParam(defaultValue = "") String search) { Double payment = bean.getPayment(); bookingsService.addPayment(id, payment); LOGGER.debug("search is {}", search); diff --git a/src/main/java/de/jottyfan/camporganizer/module/business/bookings/BookingsRepository.java b/src/main/java/de/jottyfan/camporganizer/module/business/bookings/BookingsRepository.java index b76a929..47dee5e 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/business/bookings/BookingsRepository.java +++ b/src/main/java/de/jottyfan/camporganizer/module/business/bookings/BookingsRepository.java @@ -2,7 +2,7 @@ package de.jottyfan.camporganizer.module.business.bookings; import static de.jottyfan.camporganizer.db.jooq.Tables.T_PERSON; import static de.jottyfan.camporganizer.db.jooq.Tables.T_PROFILE; -import static de.jottyfan.camporganizer.db.jooq.Tables.T_SALESPROFILE; +import static de.jottyfan.camporganizer.db.jooq.Tables.T_CAMPPROFILE; import static de.jottyfan.camporganizer.db.jooq.Tables.V_CAMP; import java.math.BigDecimal; @@ -25,6 +25,7 @@ import org.springframework.transaction.annotation.Transactional; import de.jottyfan.camporganizer.db.EnumConverter; import de.jottyfan.camporganizer.db.jooq.enums.EnumCamprole; +import de.jottyfan.camporganizer.db.jooq.enums.EnumModule; import de.jottyfan.camporganizer.db.jooq.enums.EnumSex; import de.jottyfan.camporganizer.db.jooq.tables.records.TPersonRecord; import de.jottyfan.camporganizer.module.business.bookings.model.BookerBean; @@ -55,8 +56,8 @@ public class BookingsRepository { .select(T_PERSON.PK, T_PERSON.ACCEPT, T_PERSON.PAID, T_PERSON.FORENAME, T_PERSON.SURNAME, T_PERSON.CAMPROLE, T_PERSON.SEX, T_PERSON.CREATED, V_CAMP.NAME, V_CAMP.YEAR) .from(T_PERSON) .leftJoin(V_CAMP).on(V_CAMP.PK.eq(T_PERSON.FK_CAMP)) - .leftJoin(T_SALESPROFILE).on(T_SALESPROFILE.FK_CAMP.eq(T_PERSON.FK_CAMP)) - .leftJoin(T_PROFILE).on(T_PROFILE.PK.eq(T_SALESPROFILE.FK_PROFILE)) + .leftJoin(T_CAMPPROFILE).on(T_CAMPPROFILE.FK_CAMP.eq(T_PERSON.FK_CAMP)).and(T_CAMPPROFILE.MODULE.eq(EnumModule.business)) + .leftJoin(T_PROFILE).on(T_PROFILE.PK.eq(T_CAMPPROFILE.FK_PROFILE)) .where(T_PROFILE.USERNAME.eq(username)) .orderBy(T_PERSON.CAMPROLE, T_PERSON.SEX, T_PERSON.SURNAME, T_PERSON.FORENAME); // @formatter:on @@ -108,8 +109,8 @@ public class BookingsRepository { V_CAMP.PK) .from(T_PERSON) .leftJoin(V_CAMP).on(V_CAMP.PK.eq(T_PERSON.FK_CAMP)) - .leftJoin(T_SALESPROFILE).on(T_SALESPROFILE.FK_CAMP.eq(T_PERSON.FK_CAMP)) - .leftJoin(T_PROFILE).on(T_PROFILE.PK.eq(T_SALESPROFILE.FK_PROFILE)) + .leftJoin(T_CAMPPROFILE).on(T_CAMPPROFILE.FK_CAMP.eq(T_PERSON.FK_CAMP)).and(T_CAMPPROFILE.MODULE.eq(EnumModule.business)) + .leftJoin(T_PROFILE).on(T_PROFILE.PK.eq(T_CAMPPROFILE.FK_PROFILE)) .where(T_PROFILE.USERNAME.eq(username)) .and(T_PERSON.PK.eq(id)); // @formatter:on diff --git a/src/main/java/de/jottyfan/camporganizer/module/business/business/BusinessRepository.java b/src/main/java/de/jottyfan/camporganizer/module/business/business/BusinessRepository.java index 0dca9e5..10d5d4b 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/business/business/BusinessRepository.java +++ b/src/main/java/de/jottyfan/camporganizer/module/business/business/BusinessRepository.java @@ -4,7 +4,7 @@ import static de.jottyfan.camporganizer.db.jooq.Tables.T_CAMP; import static de.jottyfan.camporganizer.db.jooq.Tables.T_LOCATION; import static de.jottyfan.camporganizer.db.jooq.Tables.T_PERSON; import static de.jottyfan.camporganizer.db.jooq.Tables.T_PROFILE; -import static de.jottyfan.camporganizer.db.jooq.Tables.T_SALESPROFILE; +import static de.jottyfan.camporganizer.db.jooq.Tables.T_CAMPPROFILE; import static de.jottyfan.camporganizer.db.jooq.Tables.V_CAMP_BUDGET; import java.math.BigDecimal; @@ -24,6 +24,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; +import de.jottyfan.camporganizer.db.jooq.enums.EnumModule; import de.jottyfan.camporganizer.db.jooq.tables.records.TPersonRecord; import de.jottyfan.camporganizer.module.business.business.model.BusinessBean; import de.jottyfan.camporganizer.module.business.business.model.CampBudgetBean; @@ -57,8 +58,8 @@ public class BusinessRepository { V_CAMP_BUDGET.FK_CAMP) .from(V_CAMP_BUDGET) .leftJoin(T_CAMP).on(T_CAMP.PK.eq(V_CAMP_BUDGET.FK_CAMP)) - .leftJoin(T_SALESPROFILE).on(T_SALESPROFILE.FK_CAMP.eq(V_CAMP_BUDGET.FK_CAMP)) - .leftJoin(T_PROFILE).on(T_PROFILE.PK.eq(T_SALESPROFILE.FK_PROFILE)) + .leftJoin(T_CAMPPROFILE).on(T_CAMPPROFILE.FK_CAMP.eq(V_CAMP_BUDGET.FK_CAMP)).and(T_CAMPPROFILE.MODULE.eq(EnumModule.business)) + .leftJoin(T_PROFILE).on(T_PROFILE.PK.eq(T_CAMPPROFILE.FK_PROFILE)) .where(T_PROFILE.USERNAME.eq(username)) .orderBy(T_CAMP.ARRIVE); // @formatter:on @@ -96,8 +97,8 @@ public class BusinessRepository { .from(T_PERSON) .leftJoin(T_CAMP).on(T_CAMP.PK.eq(T_PERSON.FK_CAMP)) .leftJoin(T_LOCATION).on(T_LOCATION.PK.eq(T_CAMP.FK_LOCATION)) - .leftJoin(T_SALESPROFILE).on(T_SALESPROFILE.FK_CAMP.eq(T_CAMP.PK)) - .leftJoin(T_PROFILE).on(T_PROFILE.PK.eq(T_SALESPROFILE.FK_PROFILE)) + .leftJoin(T_CAMPPROFILE).on(T_CAMPPROFILE.FK_CAMP.eq(T_CAMP.PK)).and(T_CAMPPROFILE.MODULE.eq(EnumModule.business)) + .leftJoin(T_PROFILE).on(T_PROFILE.PK.eq(T_CAMPPROFILE.FK_PROFILE)) .where(T_PROFILE.USERNAME.eq(username)); // @formatter:on LOGGER.debug(sql.toString()); diff --git a/src/main/java/de/jottyfan/camporganizer/module/business/camp/CampController.java b/src/main/java/de/jottyfan/camporganizer/module/business/camp/CampController.java index aa21300..3c3e6f9 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/business/camp/CampController.java +++ b/src/main/java/de/jottyfan/camporganizer/module/business/camp/CampController.java @@ -22,7 +22,7 @@ public class CampController extends CommonController { @GetMapping("/business/camp/{id}") @RolesAllowed({ "business" }) - public String getCamp(Model model, @PathVariable Integer id) { + public String getCamp(Model model, @PathVariable("id") Integer id) { String username = super.getCurrentUser(); model.addAttribute("currentUser", username); model.addAttribute("campId", id); diff --git a/src/main/java/de/jottyfan/camporganizer/module/business/camp/CampRepository.java b/src/main/java/de/jottyfan/camporganizer/module/business/camp/CampRepository.java index 78917e2..ffd4a21 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/business/camp/CampRepository.java +++ b/src/main/java/de/jottyfan/camporganizer/module/business/camp/CampRepository.java @@ -2,7 +2,7 @@ package de.jottyfan.camporganizer.module.business.camp; import static de.jottyfan.camporganizer.db.jooq.Tables.T_PERSON; import static de.jottyfan.camporganizer.db.jooq.Tables.T_PROFILE; -import static de.jottyfan.camporganizer.db.jooq.Tables.T_SALESPROFILE; +import static de.jottyfan.camporganizer.db.jooq.Tables.T_CAMPPROFILE; import static de.jottyfan.camporganizer.db.jooq.Tables.V_CAMP; import java.math.BigDecimal; @@ -24,6 +24,7 @@ import org.springframework.transaction.annotation.Transactional; import de.jottyfan.camporganizer.db.EnumConverter; import de.jottyfan.camporganizer.db.jooq.enums.EnumCamprole; +import de.jottyfan.camporganizer.db.jooq.enums.EnumModule; import de.jottyfan.camporganizer.db.jooq.enums.EnumSex; import de.jottyfan.camporganizer.module.business.camp.model.CampBean; import de.jottyfan.camporganizer.module.business.camp.model.PersonBean; @@ -54,8 +55,8 @@ public class CampRepository { // @formatter:off .select(V_CAMP.NAME, V_CAMP.YEAR, V_CAMP.ARRIVE, V_CAMP.DEPART, V_CAMP.LOCATION_NAME, V_CAMP.PRICE) .from(V_CAMP) - .leftJoin(T_SALESPROFILE).on(T_SALESPROFILE.FK_CAMP.eq(V_CAMP.PK)) - .leftJoin(T_PROFILE).on(T_PROFILE.PK.eq(T_SALESPROFILE.FK_PROFILE)) + .leftJoin(T_CAMPPROFILE).on(T_CAMPPROFILE.FK_CAMP.eq(V_CAMP.PK)).and(T_CAMPPROFILE.MODULE.eq(EnumModule.business)) + .leftJoin(T_PROFILE).on(T_PROFILE.PK.eq(T_CAMPPROFILE.FK_PROFILE)) .where(V_CAMP.PK.eq(pk)) .and(T_PROFILE.USERNAME.eq(username)); // @formatter:on @@ -85,8 +86,8 @@ public class CampRepository { // @formatter:off .select(T_PERSON.PK, T_PERSON.ACCEPT, T_PERSON.PAID, T_PERSON.FORENAME, T_PERSON.SURNAME, T_PERSON.CAMPROLE, T_PERSON.SEX, T_PERSON.CREATED) .from(T_PERSON) - .leftJoin(T_SALESPROFILE).on(T_SALESPROFILE.FK_CAMP.eq(T_PERSON.FK_CAMP)) - .leftJoin(T_PROFILE).on(T_PROFILE.PK.eq(T_SALESPROFILE.FK_PROFILE)) + .leftJoin(T_CAMPPROFILE).on(T_CAMPPROFILE.FK_CAMP.eq(T_PERSON.FK_CAMP)).and(T_CAMPPROFILE.MODULE.eq(EnumModule.business)) + .leftJoin(T_PROFILE).on(T_PROFILE.PK.eq(T_CAMPPROFILE.FK_PROFILE)) .where(T_PERSON.FK_CAMP.eq(pk)) .and(T_PROFILE.USERNAME.eq(username)) .orderBy(T_PERSON.CAMPROLE, T_PERSON.SEX, T_PERSON.SURNAME, T_PERSON.FORENAME); diff --git a/src/main/java/de/jottyfan/camporganizer/module/business/privileges/BusinessPrivilegesController.java b/src/main/java/de/jottyfan/camporganizer/module/business/privileges/BusinessPrivilegesController.java new file mode 100644 index 0000000..30198e6 --- /dev/null +++ b/src/main/java/de/jottyfan/camporganizer/module/business/privileges/BusinessPrivilegesController.java @@ -0,0 +1,64 @@ +package de.jottyfan.camporganizer.module.business.privileges; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; + +import de.jottyfan.camporganizer.db.jooq.enums.EnumCamprole; +import de.jottyfan.camporganizer.module.business.privileges.model.BusinessPrivilegesBean; +import de.jottyfan.camporganizer.module.camplist.CommonController; +import jakarta.annotation.security.RolesAllowed; +import jakarta.validation.Valid; + +/** + * + * @author jotty + * + */ +@Controller +public class BusinessPrivilegesController extends CommonController { + + @Autowired + private BusinessPrivilegesService service; + + @GetMapping("/business/privileges") + @RolesAllowed({ "admin" }) + public String getIndex(Model model) { + String username = super.getCurrentUser(); + model.addAttribute("currentUser", username); + model.addAttribute("privileges", service.getPrivileges()); + model.addAttribute("profiles", service.getProfiles(EnumCamprole.director, EnumCamprole.teacher)); + model.addAttribute("bean", new BusinessPrivilegesBean()); + return "business/privileges"; + } + + @PostMapping("/business/privileges/add") + @RolesAllowed({ "admin" }) + public String getAdd(@Valid @ModelAttribute("bean") BusinessPrivilegesBean bean, BindingResult br, Model model) { + if (br.hasErrors()) { + String username = super.getCurrentUser(); + model.addAttribute("currentUser", username); + model.addAttribute("privileges", service.getPrivileges()); + model.addAttribute("profiles", service.getProfiles(EnumCamprole.director, EnumCamprole.teacher)); + return "business/privileges"; + } + service.add(bean); + return "redirect:/business/privileges"; + } + + @GetMapping("/business/privileges/delete") + @RolesAllowed({ "admin" }) + public String getDelete(@RequestParam("fkCamp") Integer fkCamp, @RequestParam("fkProfile") Integer fkProfile, + Model model) { + BusinessPrivilegesBean bean = new BusinessPrivilegesBean(); + bean.setFkCamp(fkCamp); + bean.setFkProfile(fkProfile); + service.remove(bean, super.getCurrentUser()); + return "redirect:/business/privileges"; + } +} diff --git a/src/main/java/de/jottyfan/camporganizer/module/business/privileges/PrivilegesRepository.java b/src/main/java/de/jottyfan/camporganizer/module/business/privileges/BusinessPrivilegesRepository.java similarity index 70% rename from src/main/java/de/jottyfan/camporganizer/module/business/privileges/PrivilegesRepository.java rename to src/main/java/de/jottyfan/camporganizer/module/business/privileges/BusinessPrivilegesRepository.java index a927596..b2183ad 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/business/privileges/PrivilegesRepository.java +++ b/src/main/java/de/jottyfan/camporganizer/module/business/privileges/BusinessPrivilegesRepository.java @@ -1,8 +1,8 @@ package de.jottyfan.camporganizer.module.business.privileges; +import static de.jottyfan.camporganizer.db.jooq.Tables.T_CAMPPROFILE; import static de.jottyfan.camporganizer.db.jooq.Tables.T_PERSON; import static de.jottyfan.camporganizer.db.jooq.Tables.T_PROFILE; -import static de.jottyfan.camporganizer.db.jooq.Tables.T_SALESPROFILE; import static de.jottyfan.camporganizer.db.jooq.Tables.V_CAMP; import java.time.LocalDateTime; @@ -23,8 +23,9 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; -import de.jottyfan.camporganizer.db.jooq.tables.records.TSalesprofileRecord; -import de.jottyfan.camporganizer.module.business.privileges.model.PrivilegesBean; +import de.jottyfan.camporganizer.db.jooq.enums.EnumModule; +import de.jottyfan.camporganizer.db.jooq.tables.records.TCampprofileRecord; +import de.jottyfan.camporganizer.module.business.privileges.model.BusinessPrivilegesBean; import de.jottyfan.camporganizer.module.business.privileges.model.ProfileBean; /** @@ -34,25 +35,25 @@ import de.jottyfan.camporganizer.module.business.privileges.model.ProfileBean; */ @Repository @Transactional(transactionManager = "transactionManager") -public class PrivilegesRepository { - private static final Logger LOGGER = LogManager.getLogger(PrivilegesRepository.class); +public class BusinessPrivilegesRepository { + private static final Logger LOGGER = LogManager.getLogger(BusinessPrivilegesRepository.class); @Autowired private DSLContext jooq; - public List getPrivileges() { + public List getPrivileges() { SelectSeekStep3, LocalDateTime, String, String> sql = jooq // @formatter:off .select(T_PROFILE.FORENAME, T_PROFILE.SURNAME, T_PROFILE.DUEDATE, T_PROFILE.USERNAME, T_PROFILE.PK, V_CAMP.PK, V_CAMP.NAME, V_CAMP.YEAR) .from(V_CAMP) - .leftJoin(T_SALESPROFILE).on(T_SALESPROFILE.FK_CAMP.eq(V_CAMP.PK)) - .leftJoin(T_PROFILE).on(T_PROFILE.PK.eq(T_SALESPROFILE.FK_PROFILE)) + .leftJoin(T_CAMPPROFILE).on(T_CAMPPROFILE.FK_CAMP.eq(V_CAMP.PK)).and(T_CAMPPROFILE.MODULE.eq(EnumModule.business)) + .leftJoin(T_PROFILE).on(T_PROFILE.PK.eq(T_CAMPPROFILE.FK_PROFILE)) .orderBy(V_CAMP.ARRIVE, T_PROFILE.SURNAME, T_PROFILE.FORENAME); // @formatter:on LOGGER.debug(sql.toString()); - List list = new ArrayList<>(); + List list = new ArrayList<>(); for (Record8 r : sql.fetch()) { - PrivilegesBean bean = new PrivilegesBean(); + BusinessPrivilegesBean bean = new BusinessPrivilegesBean(); bean.setCampName(r.get(V_CAMP.NAME)); bean.setCampYear(r.get(V_CAMP.YEAR)); bean.setFkCamp(r.get(V_CAMP.PK)); @@ -93,25 +94,26 @@ public class PrivilegesRepository { return list; } - public Integer add(PrivilegesBean bean) { - InsertReturningStep sql = jooq + public Integer add(BusinessPrivilegesBean bean) { + InsertReturningStep sql = jooq // @formatter:off - .insertInto(T_SALESPROFILE, T_SALESPROFILE.FK_CAMP, T_SALESPROFILE.FK_PROFILE) - .values(bean.getFkCamp(), bean.getFkProfile()) - .onConflict(T_SALESPROFILE.FK_CAMP, T_SALESPROFILE.FK_PROFILE) + .insertInto(T_CAMPPROFILE, T_CAMPPROFILE.FK_CAMP, T_CAMPPROFILE.FK_PROFILE, T_CAMPPROFILE.MODULE) + .values(bean.getFkCamp(), bean.getFkProfile(), EnumModule.business) + .onConflict(T_CAMPPROFILE.FK_CAMP, T_CAMPPROFILE.FK_PROFILE, T_CAMPPROFILE.MODULE) .doNothing(); // @formatter:on LOGGER.debug(sql.toString()); return sql.execute(); } - public Integer remove(PrivilegesBean bean, String currentUser) { - DeleteConditionStep sql = jooq + public Integer remove(BusinessPrivilegesBean bean, String currentUser) { + DeleteConditionStep sql = jooq // @formatter:off - .deleteFrom(T_SALESPROFILE) - .where(T_SALESPROFILE.FK_CAMP.eq(bean.getFkCamp())) - .and(T_SALESPROFILE.FK_PROFILE.eq(bean.getFkProfile())) - .and(T_SALESPROFILE.FK_PROFILE.notIn(jooq + .deleteFrom(T_CAMPPROFILE) + .where(T_CAMPPROFILE.MODULE.eq(EnumModule.business)) + .and(T_CAMPPROFILE.FK_CAMP.eq(bean.getFkCamp())) + .and(T_CAMPPROFILE.FK_PROFILE.eq(bean.getFkProfile())) + .and(T_CAMPPROFILE.FK_PROFILE.notIn(jooq .select(T_PROFILE.PK) .from(T_PROFILE) .where(T_PROFILE.USERNAME.eq(currentUser)))); diff --git a/src/main/java/de/jottyfan/camporganizer/module/business/privileges/PrivilegesService.java b/src/main/java/de/jottyfan/camporganizer/module/business/privileges/BusinessPrivilegesService.java similarity index 82% rename from src/main/java/de/jottyfan/camporganizer/module/business/privileges/PrivilegesService.java rename to src/main/java/de/jottyfan/camporganizer/module/business/privileges/BusinessPrivilegesService.java index c1e086c..e86a4d6 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/business/privileges/PrivilegesService.java +++ b/src/main/java/de/jottyfan/camporganizer/module/business/privileges/BusinessPrivilegesService.java @@ -11,7 +11,7 @@ import org.springframework.stereotype.Service; import de.jottyfan.camporganizer.db.jooq.enums.EnumCamprole; import de.jottyfan.camporganizer.module.business.camp.model.CampBean; -import de.jottyfan.camporganizer.module.business.privileges.model.PrivilegesBean; +import de.jottyfan.camporganizer.module.business.privileges.model.BusinessPrivilegesBean; import de.jottyfan.camporganizer.module.business.privileges.model.ProfileBean; /** @@ -20,14 +20,14 @@ import de.jottyfan.camporganizer.module.business.privileges.model.ProfileBean; * */ @Service -public class PrivilegesService { +public class BusinessPrivilegesService { @Autowired - private PrivilegesRepository gateway; + private BusinessPrivilegesRepository gateway; public Map getPrivileges() { - List list = gateway.getPrivileges(); + List list = gateway.getPrivileges(); Map camps = new HashMap<>(); - for (PrivilegesBean bean : list) { + for (BusinessPrivilegesBean bean : list) { CampBean campBean = camps.get(bean.getFkCamp()); if (campBean == null) { campBean = new CampBean(); @@ -55,11 +55,11 @@ public class PrivilegesService { return gateway.getProfiles(allowed == null ? null : set); } - public void add(PrivilegesBean bean) { + public void add(BusinessPrivilegesBean bean) { gateway.add(bean); } - public void remove(PrivilegesBean bean, String currentUser) { + public void remove(BusinessPrivilegesBean bean, String currentUser) { gateway.remove(bean, currentUser); } } diff --git a/src/main/java/de/jottyfan/camporganizer/module/business/privileges/PrivilegesController.java b/src/main/java/de/jottyfan/camporganizer/module/business/privileges/PrivilegesController.java deleted file mode 100644 index 69bcc46..0000000 --- a/src/main/java/de/jottyfan/camporganizer/module/business/privileges/PrivilegesController.java +++ /dev/null @@ -1,55 +0,0 @@ -package de.jottyfan.camporganizer.module.business.privileges; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.ui.Model; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PostMapping; - -import de.jottyfan.camporganizer.db.jooq.enums.EnumCamprole; -import de.jottyfan.camporganizer.module.business.privileges.model.PrivilegesBean; -import de.jottyfan.camporganizer.module.camplist.CommonController; -import jakarta.annotation.security.RolesAllowed; -import jakarta.websocket.server.PathParam; - -/** - * - * @author jotty - * - */ -@Controller -public class PrivilegesController extends CommonController { - - @Autowired - private PrivilegesService privilegesService; - - @GetMapping("/business/privileges") - @RolesAllowed({ "admin" }) - public String getIndex(Model model) { - String username = super.getCurrentUser(); - model.addAttribute("currentUser", username); - model.addAttribute("privileges", privilegesService.getPrivileges()); - model.addAttribute("profiles", privilegesService.getProfiles(EnumCamprole.director, EnumCamprole.teacher)); - model.addAttribute("bean", new PrivilegesBean()); - return "business/privileges"; - } - - @PostMapping("/business/privileges/add") - @RolesAllowed({ "admin" }) - public String getAdd(@ModelAttribute PrivilegesBean bean, Model model) { - privilegesService.add(bean); - return getIndex(model); - } - - @GetMapping("/business/privileges/delete") - @RolesAllowed({ "admin" }) - public String getDelete(@PathParam(value = "fkCamp") Integer fkCamp, - @PathParam(value = "fkProfile") Integer fkProfile, Model model) { - PrivilegesBean bean = new PrivilegesBean(); - bean.setFkCamp(fkCamp); - bean.setFkProfile(fkProfile); - privilegesService.remove(bean, super.getCurrentUser()); - return getIndex(model); - } -} diff --git a/src/main/java/de/jottyfan/camporganizer/module/business/privileges/model/PrivilegesBean.java b/src/main/java/de/jottyfan/camporganizer/module/business/privileges/model/BusinessPrivilegesBean.java similarity index 94% rename from src/main/java/de/jottyfan/camporganizer/module/business/privileges/model/PrivilegesBean.java rename to src/main/java/de/jottyfan/camporganizer/module/business/privileges/model/BusinessPrivilegesBean.java index 31894b3..23d8c4b 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/business/privileges/model/PrivilegesBean.java +++ b/src/main/java/de/jottyfan/camporganizer/module/business/privileges/model/BusinessPrivilegesBean.java @@ -3,19 +3,23 @@ package de.jottyfan.camporganizer.module.business.privileges.model; import java.io.Serializable; import java.time.LocalDateTime; +import jakarta.validation.constraints.NotNull; + /** * * @author jotty * */ -public class PrivilegesBean implements Serializable { +public class BusinessPrivilegesBean implements Serializable { private static final long serialVersionUID = 1L; private String forename; private String surname; private String username; private LocalDateTime duedate; + @NotNull private Integer fkProfile; + @NotNull private Integer fkCamp; private String campName; private Double campYear; diff --git a/src/main/java/de/jottyfan/camporganizer/module/camplist/CamplistController.java b/src/main/java/de/jottyfan/camporganizer/module/camplist/CamplistController.java index 0bd2e4f..f530121 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/camplist/CamplistController.java +++ b/src/main/java/de/jottyfan/camporganizer/module/camplist/CamplistController.java @@ -42,7 +42,7 @@ public class CamplistController extends CommonController { } @PostMapping("/dashboard/update") - public String updateBooking(Model model, @ModelAttribute BookingBean bean) { + public String updateBooking(Model model, @ModelAttribute("bean") BookingBean bean) { service.update(bean); return dashboard(model); } diff --git a/src/main/java/de/jottyfan/camporganizer/module/confirmation/board/ConfirmationBoardController.java b/src/main/java/de/jottyfan/camporganizer/module/confirmation/board/ConfirmationBoardController.java index 97d4e88..6ef89fa 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/confirmation/board/ConfirmationBoardController.java +++ b/src/main/java/de/jottyfan/camporganizer/module/confirmation/board/ConfirmationBoardController.java @@ -32,7 +32,7 @@ public class ConfirmationBoardController extends CommonController { } @GetMapping("/confirmation/board/camp/{id}") - public String getCamplist(Model model, @PathVariable Integer id, Principal principal) { + public String getCamplist(Model model, @PathVariable("id") Integer id, Principal principal) { model.addAttribute("campId", id); model.addAttribute("campStartDate", service.getCampStartDate(super.getCurrentUser(principal), id)); model.addAttribute("persons", service.loadPersonList(super.getCurrentUser(principal), id)); @@ -40,7 +40,7 @@ public class ConfirmationBoardController extends CommonController { } @GetMapping("/confirmation/board/download/{id}") - public void getCsvOfAll(@PathVariable Integer id, Principal principal, HttpServletResponse response) + public void getCsvOfAll(@PathVariable("id") Integer id, Principal principal, HttpServletResponse response) throws IOException { response.setContentType("text/csv"); String filename = String.format("camplist_%d_%s.csv", id, diff --git a/src/main/java/de/jottyfan/camporganizer/module/confirmation/confirmation/SearchController.java b/src/main/java/de/jottyfan/camporganizer/module/confirmation/confirmation/SearchController.java index 1a2a40a..95be588 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/confirmation/confirmation/SearchController.java +++ b/src/main/java/de/jottyfan/camporganizer/module/confirmation/confirmation/SearchController.java @@ -4,11 +4,11 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import de.jottyfan.camporganizer.module.camplist.CommonController; import jakarta.servlet.http.HttpServletRequest; -import jakarta.websocket.server.PathParam; /** * @@ -26,7 +26,7 @@ public class SearchController extends CommonController { @GetMapping("/confirmation/search") @ResponseBody - public String search(@PathParam(value = "needle") String needle, Model model) { + public String search(@RequestParam("needle") String needle, Model model) { return service.search(needle, request.getRequestURI().replace("search", "person"), super.getCurrentUser()); } } diff --git a/src/main/java/de/jottyfan/camporganizer/module/confirmation/person/PersonController.java b/src/main/java/de/jottyfan/camporganizer/module/confirmation/person/PersonController.java index 33d89e4..6cc1319 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/confirmation/person/PersonController.java +++ b/src/main/java/de/jottyfan/camporganizer/module/confirmation/person/PersonController.java @@ -23,7 +23,7 @@ public class PersonController extends CommonController { private PersonService personService; @GetMapping("/confirmation/person/{pk}") - public String getIndex(Model model, @PathVariable Integer pk) { + public String getIndex(Model model, @PathVariable("pk") Integer pk) { String username = super.getCurrentUser(); model.addAttribute("currentUser", username); model.addAttribute("person", personService.getPerson(username, pk)); @@ -33,7 +33,7 @@ public class PersonController extends CommonController { } @PostMapping("/confirmation/person/update") - public String doUpdate(@ModelAttribute PersonBean bean, Model model) { + public String doUpdate(@ModelAttribute("bean") PersonBean bean, Model model) { String username = super.getCurrentUser(); personService.updatePerson(bean, username); return "redirect:/confirmation"; diff --git a/src/main/java/de/jottyfan/camporganizer/module/document/DocumentController.java b/src/main/java/de/jottyfan/camporganizer/module/document/DocumentController.java index d2d6e7e..2eac17d 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/document/DocumentController.java +++ b/src/main/java/de/jottyfan/camporganizer/module/document/DocumentController.java @@ -10,9 +10,8 @@ import org.springframework.core.io.Resource; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import de.jottyfan.camporganizer.module.camplist.CommonController; @@ -28,8 +27,8 @@ public class DocumentController extends CommonController { @Autowired private DocumentService service; - @RequestMapping(path = "/document/{id}", method = RequestMethod.GET) - public ResponseEntity getDocument(@PathVariable Integer id, HttpServletResponse response) { + @GetMapping("/document/{id}") + public ResponseEntity getDocument(@PathVariable("id") Integer id, HttpServletResponse response) { DownloadBean bean = service.getDocument(id); if (bean != null) { byte[] decoded = Base64.getDecoder().decode(bean.getContent()); diff --git a/src/main/java/de/jottyfan/camporganizer/module/registration/RegistrationController.java b/src/main/java/de/jottyfan/camporganizer/module/registration/RegistrationController.java index a90715c..2e92140 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/registration/RegistrationController.java +++ b/src/main/java/de/jottyfan/camporganizer/module/registration/RegistrationController.java @@ -72,19 +72,19 @@ public class RegistrationController extends CommonController { } @GetMapping("/registration/cancel/{id}") - public String cancellation(@PathVariable Integer id, final Model model) { + public String cancellation(@PathVariable("id") Integer id, final Model model) { model.addAttribute("bean", service.getBooking(id)); return "/registration/cancellation"; } @GetMapping("/registration/remove/{id}") - public String remove(@PathVariable Integer id, final Model model) { + public String remove(@PathVariable("id") Integer id, final Model model) { service.removeBooking(id); return "redirect:/dashboard"; } @GetMapping("/registration/toggleconsent/{id}") - public String toggleConsent(@PathVariable Integer id, final Model model) { + public String toggleConsent(@PathVariable("id") Integer id, final Model model) { service.toggleConsent(id); return "redirect:/dashboard"; } diff --git a/src/main/java/de/jottyfan/camporganizer/module/registration/RegistrationService.java b/src/main/java/de/jottyfan/camporganizer/module/registration/RegistrationService.java index 97fb808..80fa902 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/registration/RegistrationService.java +++ b/src/main/java/de/jottyfan/camporganizer/module/registration/RegistrationService.java @@ -1,6 +1,5 @@ package de.jottyfan.camporganizer.module.registration; -import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; @@ -90,7 +89,7 @@ public class RegistrationService { /** * get already registered entries from the database - * + * * @param currentUser the name of the current user; may be null * @return the list or null if current user is null */ diff --git a/src/main/java/de/jottyfan/camporganizer/module/rss/RssController.java b/src/main/java/de/jottyfan/camporganizer/module/rss/RssController.java index 8e8e84d..feeefd3 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/rss/RssController.java +++ b/src/main/java/de/jottyfan/camporganizer/module/rss/RssController.java @@ -21,7 +21,7 @@ public class RssController extends CommonController { private RssService service; @GetMapping("/rss/{recipientCode}") - public void toRssDirectly(@PathVariable String recipientCode, HttpServletResponse response) { + public void toRssDirectly(@PathVariable("recipientCode") String recipientCode, HttpServletResponse response) { service.getRss(recipientCode, response); } } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index e93b2db..9eb60e0 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,5 +1,5 @@ # database credentials from defined config file -spring.config.import = /etc/CampOrganizer2/prod.properties +spring.config.import = /etc/camporganizer.properties # define overwriteable arguments spring.datasource.driver-class-name = ${spring.datasource.driver-class-name:org.postgresql.Driver} @@ -35,7 +35,3 @@ spring.mail.protocol = ${spring.mail.protocol} spring.mail.test-connection = ${spring.mail.test-connection} spring.mail.properties.mail.smtp.auth = ${spring.mail.properties.mail.smtp.auth} spring.mail.properties.mail.smtp.starttls.enable = ${spring.mail.properties.mail.smtp.starttls.enable} - -# for development only -server.port = 8081 - diff --git a/src/main/resources/templates/business/privileges.html b/src/main/resources/templates/business/privileges.html index 8e3976b..06ff421 100644 --- a/src/main/resources/templates/business/privileges.html +++ b/src/main/resources/templates/business/privileges.html @@ -45,6 +45,7 @@
+