role corrections

This commit is contained in:
Jottyfan 2023-04-02 22:38:01 +02:00
parent 93a1289629
commit c4f81c425b
12 changed files with 194 additions and 71 deletions

View File

@ -18,7 +18,7 @@ apply plugin: 'war'
apply plugin: 'application' apply plugin: 'application'
group = 'de.jottyfan.camporganizer' group = 'de.jottyfan.camporganizer'
version = '0.4.0' version = '0.4.1'
sourceCompatibility = 17 sourceCompatibility = 17
mainClassName = "de.jottyfan.camporganizer.Main" mainClassName = "de.jottyfan.camporganizer.Main"

View File

@ -0,0 +1,80 @@
package de.jottyfan.camporganizer.db;
import java.util.ArrayList;
import java.util.List;
import de.jottyfan.camporganizer.db.jooq.enums.EnumCamprole;
import de.jottyfan.camporganizer.db.jooq.enums.EnumSex;
/**
*
* @author jotty
*
*/
public class EnumConverter {
/**
* get the German names of the camprole
*
* @param role the role
* @return the German names
*/
public static final String role2GermanNames(EnumCamprole role) {
if (EnumCamprole.student.equals(role)) {
return "Teilnehmer";
} else if (EnumCamprole.director.equals(role)) {
return "Leitungsteam";
} else if (EnumCamprole.feeder.equals(role)) {
return "Küchenteam";
} else if (EnumCamprole.teacher.equals(role)) {
return "Mitarbeiter";
} else if (EnumCamprole.observer.equals(role)) {
return "Mitarbeiterkind";
} else {
return role == null ? null : role.getLiteral();
}
}
/**
* get the German names of the sex
*
* @param sex the sex
* @return the German names
*/
public static final String sex2GermanNames(EnumSex sex) {
if (EnumSex.female.equals(sex)) {
return "weiblich";
} else if (EnumSex.male.equals(sex)) {
return "männlich";
} else {
return sex == null ? null : sex.getLiteral();
}
}
/**
* get all the enum values in a list of German translations
*
* @return the list
*/
public static final List<KeyValueBean> getSexes() {
List<KeyValueBean> list = new ArrayList<>();
list.add(new KeyValueBean().of(EnumSex.female.getLiteral(), "weiblich"));
list.add(new KeyValueBean().of(EnumSex.male.getLiteral(), "männlich"));
return list;
}
/**
* get all the enum values in a list of German translations
*
* @return the list
*/
public static final List<KeyValueBean> getRoles() {
List<KeyValueBean> list = new ArrayList<>();
list.add(new KeyValueBean().of(EnumCamprole.director.getLiteral(), "Leitungsteam"));
list.add(new KeyValueBean().of(EnumCamprole.feeder.getLiteral(), "Küchenteam"));
list.add(new KeyValueBean().of(EnumCamprole.teacher.getLiteral(), "Mitarbeiter"));
list.add(new KeyValueBean().of(EnumCamprole.student.getLiteral(), "Teilnehmer"));
list.add(new KeyValueBean().of(EnumCamprole.observer.getLiteral(), "Mitarbeiterkind"));
return list;
}
}

View File

@ -0,0 +1,57 @@
package de.jottyfan.camporganizer.db;
import java.io.Serializable;
/**
*
* @author jotty
*
*/
public class KeyValueBean implements Serializable {
private static final long serialVersionUID = 1L;
private String key;
private String value;
/**
* create a new bean from the arguments
*
* @param key the key
* @param value the value
* @return the bean
*/
public KeyValueBean of(String key, String value) {
KeyValueBean bean = new KeyValueBean();
bean.setKey(key);
bean.setValue(value);
return bean;
}
/**
* @return the key
*/
public String getKey() {
return key;
}
/**
* @param key the key to set
*/
public void setKey(String key) {
this.key = key;
}
/**
* @return the value
*/
public String getValue() {
return value;
}
/**
* @param value the value to set
*/
public void setValue(String value) {
this.value = value;
}
}

View File

@ -23,6 +23,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional; 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.EnumCamprole;
import de.jottyfan.camporganizer.db.jooq.enums.EnumSex; import de.jottyfan.camporganizer.db.jooq.enums.EnumSex;
import de.jottyfan.camporganizer.db.jooq.tables.records.TPersonRecord; import de.jottyfan.camporganizer.db.jooq.tables.records.TPersonRecord;
@ -70,8 +71,8 @@ public class BookingsRepository {
BookerBean bean = new BookerBean(); BookerBean bean = new BookerBean();
bean.setPk(r.get(T_PERSON.PK)); bean.setPk(r.get(T_PERSON.PK));
bean.setName(String.format("%s %s", forename, surname)); bean.setName(String.format("%s %s", forename, surname));
bean.setRole(EnumCamprole.student.equals(role) ? "Teilnehmer" : "Mitarbeiter"); bean.setRole(EnumConverter.role2GermanNames(role));
bean.setSex(EnumSex.female.equals(sex) ? "weiblich" : "männlich"); bean.setSex(EnumConverter.sex2GermanNames(sex));
bean.setBookingDate(r.get(T_PERSON.CREATED)); bean.setBookingDate(r.get(T_PERSON.CREATED));
bean.setAccept(r.get(T_PERSON.ACCEPT)); bean.setAccept(r.get(T_PERSON.ACCEPT));
bean.setPaid(r.get(T_PERSON.PAID)); bean.setPaid(r.get(T_PERSON.PAID));
@ -127,8 +128,8 @@ public class BookingsRepository {
BookerBean bean = new BookerBean(); BookerBean bean = new BookerBean();
bean.setPk(r.get(T_PERSON.PK)); bean.setPk(r.get(T_PERSON.PK));
bean.setName(String.format("%s %s", forename, surname)); bean.setName(String.format("%s %s", forename, surname));
bean.setRole(EnumCamprole.student.equals(role) ? "Teilnehmer" : "Mitarbeiter"); bean.setRole(EnumConverter.role2GermanNames(role));
bean.setSex(EnumSex.female.equals(sex) ? "weiblich" : "männlich"); bean.setSex(EnumConverter.sex2GermanNames(sex));
bean.setBookingDate(r.get(T_PERSON.CREATED)); bean.setBookingDate(r.get(T_PERSON.CREATED));
bean.setAccept(r.get(T_PERSON.ACCEPT)); bean.setAccept(r.get(T_PERSON.ACCEPT));
bean.setPaid(r.get(T_PERSON.PAID)); bean.setPaid(r.get(T_PERSON.PAID));

View File

@ -22,6 +22,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional; 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.EnumCamprole;
import de.jottyfan.camporganizer.db.jooq.enums.EnumSex; import de.jottyfan.camporganizer.db.jooq.enums.EnumSex;
@ -98,8 +99,8 @@ public class CampRepository {
PersonBean bean = new PersonBean(); PersonBean bean = new PersonBean();
bean.setPk(r.get(T_PERSON.PK)); bean.setPk(r.get(T_PERSON.PK));
bean.setName(String.format("%s %s", forename, surname)); bean.setName(String.format("%s %s", forename, surname));
bean.setRole(EnumCamprole.student.equals(role) ? "Teilnehmer" : "Mitarbeiter"); bean.setRole(EnumConverter.role2GermanNames(role));
bean.setSex(EnumSex.female.equals(sex) ? "weiblich" : "männlich"); bean.setSex(EnumConverter.sex2GermanNames(sex));
bean.setBookingDate(r.get(T_PERSON.CREATED)); bean.setBookingDate(r.get(T_PERSON.CREATED));
bean.setAccept(r.get(T_PERSON.ACCEPT)); bean.setAccept(r.get(T_PERSON.ACCEPT));
bean.setPaid(r.get(T_PERSON.PAID)); bean.setPaid(r.get(T_PERSON.PAID));

View File

@ -1,45 +0,0 @@
package de.jottyfan.camporganizer.module.business.privileges;
import java.util.List;
import java.util.Map;
import de.jottyfan.camporganizer.module.business.camp.impl.CampBean;
import de.jottyfan.camporganizer.module.business.privileges.impl.PrivilegesBean;
import de.jottyfan.camporganizer.module.business.privileges.impl.ProfileBean;
/**
*
* @author jotty
*
*/
public interface IPrivilegesService {
/**
* get all current privileges for the sales
*
* @return the privileges for sales
*/
public Map<Integer, CampBean> getPrivileges();
/**
* get all profiles
*
* @return the profiles
*/
public List<ProfileBean> getProfiles();
/**
* add a privilege
*
* @param bean the bean
*/
public void add(PrivilegesBean bean);
/**
* remove a privilege
*
* @param bean the bean
* @param currentUser the current user in this sessionö
*/
public void remove(PrivilegesBean bean, String currentUser);
}

View File

@ -11,8 +11,10 @@ import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import de.jottyfan.camporganizer.db.jooq.enums.EnumCamprole;
import de.jottyfan.camporganizer.module.business.business.IBusinessService; import de.jottyfan.camporganizer.module.business.business.IBusinessService;
import de.jottyfan.camporganizer.module.business.privileges.impl.PrivilegesBean; import de.jottyfan.camporganizer.module.business.privileges.impl.PrivilegesBean;
import de.jottyfan.camporganizer.module.business.privileges.impl.PrivilegesService;
import de.jottyfan.camporganizer.module.camplist.CommonController; import de.jottyfan.camporganizer.module.camplist.CommonController;
/** /**
@ -27,7 +29,7 @@ public class PrivilegesController extends CommonController {
private HttpServletRequest request; private HttpServletRequest request;
@Autowired @Autowired
private IPrivilegesService privilegesService; private PrivilegesService privilegesService;
@Autowired @Autowired
private IBusinessService indexService; private IBusinessService indexService;
@ -38,7 +40,7 @@ public class PrivilegesController extends CommonController {
String username = indexService.getCurrentUser(request); String username = indexService.getCurrentUser(request);
model.addAttribute("currentUser", username); model.addAttribute("currentUser", username);
model.addAttribute("privileges", privilegesService.getPrivileges()); model.addAttribute("privileges", privilegesService.getPrivileges());
model.addAttribute("profiles", privilegesService.getProfiles()); model.addAttribute("profiles", privilegesService.getProfiles(EnumCamprole.director, EnumCamprole.teacher));
model.addAttribute("bean", new PrivilegesBean()); model.addAttribute("bean", new PrivilegesBean());
return "business/privileges"; return "business/privileges";
} }

View File

@ -1,5 +1,6 @@
package de.jottyfan.camporganizer.module.business.privileges.impl; package de.jottyfan.camporganizer.module.business.privileges.impl;
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_PROFILE;
import static de.jottyfan.camporganizer.db.jooq.Tables.T_SALESPROFILE; import static de.jottyfan.camporganizer.db.jooq.Tables.T_SALESPROFILE;
import static de.jottyfan.camporganizer.db.jooq.Tables.V_CAMP; import static de.jottyfan.camporganizer.db.jooq.Tables.V_CAMP;
@ -7,6 +8,7 @@ import static de.jottyfan.camporganizer.db.jooq.Tables.V_CAMP;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Set;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
@ -16,6 +18,7 @@ import org.jooq.InsertReturningStep;
import org.jooq.Record5; import org.jooq.Record5;
import org.jooq.Record8; import org.jooq.Record8;
import org.jooq.SelectSeekStep3; import org.jooq.SelectSeekStep3;
import org.jooq.impl.DSL;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@ -61,11 +64,17 @@ public class PrivilegesRepository {
return list; return list;
} }
public List<ProfileBean> getProfiles() { public List<ProfileBean> getProfiles(Set<String> allowed) {
SelectSeekStep3<Record5<Integer, String, String, LocalDateTime, String>, String, String, LocalDateTime> sql = jooq SelectSeekStep3<Record5<Integer, String, String, LocalDateTime, String>, String, String, LocalDateTime> sql = jooq
// @formatter:off // @formatter:off
.select(T_PROFILE.PK, T_PROFILE.FORENAME, T_PROFILE.SURNAME, T_PROFILE.DUEDATE, T_PROFILE.USERNAME) .select(T_PROFILE.PK,
T_PROFILE.FORENAME,
T_PROFILE.SURNAME,
T_PROFILE.DUEDATE,
T_PROFILE.USERNAME)
.from(T_PROFILE) .from(T_PROFILE)
.leftJoin(T_PERSON).on(T_PERSON.FK_PROFILE.eq(T_PROFILE.PK))
.where((allowed == null || allowed.size() < 1) ? DSL.trueCondition() : T_PERSON.CAMPROLE.in(allowed))
.orderBy(T_PROFILE.SURNAME, T_PROFILE.FORENAME, T_PROFILE.DUEDATE); .orderBy(T_PROFILE.SURNAME, T_PROFILE.FORENAME, T_PROFILE.DUEDATE);
// @formatter:on // @formatter:on
LOGGER.debug(sql.toString()); LOGGER.debug(sql.toString());

View File

@ -1,14 +1,16 @@
package de.jottyfan.camporganizer.module.business.privileges.impl; package de.jottyfan.camporganizer.module.business.privileges.impl;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import de.jottyfan.camporganizer.db.jooq.enums.EnumCamprole;
import de.jottyfan.camporganizer.module.business.camp.impl.CampBean; import de.jottyfan.camporganizer.module.business.camp.impl.CampBean;
import de.jottyfan.camporganizer.module.business.privileges.IPrivilegesService;
/** /**
* *
@ -16,11 +18,10 @@ import de.jottyfan.camporganizer.module.business.privileges.IPrivilegesService;
* *
*/ */
@Service @Service
public class PrivilegesService implements IPrivilegesService { public class PrivilegesService {
@Autowired @Autowired
private PrivilegesRepository gateway; private PrivilegesRepository gateway;
@Override
public Map<Integer, CampBean> getPrivileges() { public Map<Integer, CampBean> getPrivileges() {
List<PrivilegesBean> list = gateway.getPrivileges(); List<PrivilegesBean> list = gateway.getPrivileges();
Map<Integer, CampBean> camps = new HashMap<>(); Map<Integer, CampBean> camps = new HashMap<>();
@ -44,17 +45,18 @@ public class PrivilegesService implements IPrivilegesService {
return camps; return camps;
} }
@Override public List<ProfileBean> getProfiles(EnumCamprole... allowed) {
public List<ProfileBean> getProfiles() { Set<String> set = new HashSet<>();
return gateway.getProfiles(); for (EnumCamprole role : allowed) {
set.add(role.getLiteral());
}
return gateway.getProfiles(allowed == null ? null : set);
} }
@Override
public void add(PrivilegesBean bean) { public void add(PrivilegesBean bean) {
gateway.add(bean); gateway.add(bean);
} }
@Override
public void remove(PrivilegesBean bean, String currentUser) { public void remove(PrivilegesBean bean, String currentUser) {
gateway.remove(bean, currentUser); gateway.remove(bean, currentUser);
} }

View File

@ -2,6 +2,7 @@ package de.jottyfan.camporganizer.module.business.privileges.impl;
import java.io.Serializable; import java.io.Serializable;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
/** /**
* *
@ -21,6 +22,21 @@ public class ProfileBean implements Serializable {
return new StringBuilder().append(forename).append(" ").append(surname).toString(); return new StringBuilder().append(forename).append(" ").append(surname).toString();
} }
/**
* dropdown representation
*
* @return the dropdown string
*/
public String dropdown() {
StringBuilder buf = new StringBuilder();
buf.append(forename).append(" ");
buf.append(surname).append(" (");
buf.append(username).append(", ");
buf.append(duedate == null ? "" : duedate.format(DateTimeFormatter.ofPattern("dd.MM.yyyy")));
buf.append(")");
return buf.toString();
}
@Override @Override
public String toString() { public String toString() {
StringBuilder buf = new StringBuilder(); StringBuilder buf = new StringBuilder();

View File

@ -11,6 +11,7 @@ import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import de.jottyfan.camporganizer.db.EnumConverter;
import de.jottyfan.camporganizer.module.camplist.CommonController; import de.jottyfan.camporganizer.module.camplist.CommonController;
/** /**
@ -33,6 +34,8 @@ public class RegistrationController extends CommonController {
bean.setFkCamp(fkCamp); bean.setFkCamp(fkCamp);
bean.setRegisterInKeycloak(true); // we want people to register generally bean.setRegisterInKeycloak(true); // we want people to register generally
model.addAttribute("bean", bean); model.addAttribute("bean", bean);
model.addAttribute("sexes", EnumConverter.getSexes());
model.addAttribute("roles", EnumConverter.getRoles());
return "/registration/registration"; return "/registration/registration";
} else { } else {
return "/registration/isover"; return "/registration/isover";
@ -45,6 +48,8 @@ public class RegistrationController extends CommonController {
if (bindingResult.hasErrors()) { if (bindingResult.hasErrors()) {
CampBean campBean = service.getCamp(bean.getFkCamp()); CampBean campBean = service.getCamp(bean.getFkCamp());
model.addAttribute("camp", campBean); model.addAttribute("camp", campBean);
model.addAttribute("sexes", EnumConverter.getSexes());
model.addAttribute("roles", EnumConverter.getRoles());
return "/registration/registration"; return "/registration/registration";
} }
Boolean result = service.register(bean, (String) model.getAttribute("currentUser")); Boolean result = service.register(bean, (String) model.getAttribute("currentUser"));

View File

@ -30,8 +30,7 @@
<span class="error" th:each="error : ${#fields.errors('sex')}">[[${error}]]<br /></span> <span class="error" th:each="error : ${#fields.errors('sex')}">[[${error}]]<br /></span>
<select th:field="*{sex}" th:class="${'form-select ' + (#fields.hasErrors('sex') ? 'inputerror' : '')}"> <select th:field="*{sex}" th:class="${'form-select ' + (#fields.hasErrors('sex') ? 'inputerror' : '')}">
<option value="">Geschlecht</option> <option value="">Geschlecht</option>
<option value="female">weiblich</option> <option th:each="o : ${sexes}" th:value="${o.key}" th:text="${o.value}"></option>
<option value="male">männlich</option>
</select> </select>
</div> </div>
<div class="col-sm-6 rowdist"> <div class="col-sm-6 rowdist">
@ -70,11 +69,7 @@
<div class="col-sm-6 rowdist"> <div class="col-sm-6 rowdist">
<span class="error" th:each="error : ${#fields.errors('campRole')}">[[${error}]]<br /></span> <span class="error" th:each="error : ${#fields.errors('campRole')}">[[${error}]]<br /></span>
<select th:field="*{campRole}" th:class="${'form-select' + (#fields.hasErrors('campRole') ? 'inputerror' : '')}"> <select th:field="*{campRole}" th:class="${'form-select' + (#fields.hasErrors('campRole') ? 'inputerror' : '')}">
<option value="student">Teilnehmer</option> <option th:each="o : ${roles}" th:value="${o.key}" th:text="${o.value}"></option>
<option value="teacher">Mitarbeiter</option>
<option value="feeder">Küchenteam</option>
<option value="director">Leiter</option>
<option value="observer">Mitarbeiterkind</option>
</select> </select>
</div> </div>
</div> </div>