diff --git a/.gitignore b/.gitignore index 26e2888..3866aae 100644 --- a/.gitignore +++ b/.gitignore @@ -33,4 +33,4 @@ out/ .floo .flooignore -/mysql/* +/mysql/db/storage/ diff --git a/config/checkstyle/checkstyle.xml b/config/checkstyle/checkstyle.xml index 5f8e664..60ed2b6 100644 --- a/config/checkstyle/checkstyle.xml +++ b/config/checkstyle/checkstyle.xml @@ -226,7 +226,6 @@ - events = eventService.getNewEvents(status); @@ -44,16 +48,16 @@ public class APIController { } @GetMapping("/getGroupIdsOfUser/{teilnehmer}") - //@Secured("ROLE_api_user") + @Secured("ROLE_api_user") @ApiOperation("Gibt alle Gruppen zurück in denen sich ein Teilnehmer befindet") public List getGroupsOfUser(@ApiParam("Teilnehmer dessen groupIds zurückgegeben werden sollen") @PathVariable String teilnehmer) { - return eventService.findGroupIdsByUser(teilnehmer).stream() - .map(UUID::toString) - .collect(Collectors.toList()); + return userService.getUserGroups(teilnehmer).stream() + .map(group -> group.getId().toString()) + .collect(Collectors.toList()); } @GetMapping("/getGroup/{groupId}") - //@Secured("ROLE_api_user") + @Secured("ROLE_api_user") @ApiOperation("Gibt die Gruppe mit der als Parameter mitgegebenden groupId zurück") public Group getGroupFromId(@ApiParam("GruppenId der gefordeten Gruppe") @PathVariable String groupId) throws EventException { List eventList = eventService.getEventsOfGroup(UUID.fromString(groupId)); diff --git a/src/main/java/mops/gruppen2/controller/WebController.java b/src/main/java/mops/gruppen2/controller/WebController.java index 94fc6a6..5a09ce9 100644 --- a/src/main/java/mops/gruppen2/controller/WebController.java +++ b/src/main/java/mops/gruppen2/controller/WebController.java @@ -3,15 +3,18 @@ package mops.gruppen2.controller; import mops.gruppen2.domain.Group; import mops.gruppen2.domain.Role; import mops.gruppen2.domain.User; +import mops.gruppen2.domain.Visibility; import mops.gruppen2.domain.exception.EventException; import mops.gruppen2.domain.exception.PageNotFoundException; import mops.gruppen2.security.Account; import mops.gruppen2.service.ControllerService; import mops.gruppen2.service.GroupService; +import mops.gruppen2.service.InviteService; import mops.gruppen2.service.KeyCloakService; import mops.gruppen2.service.UserService; import mops.gruppen2.service.ValidationService; import org.keycloak.adapters.springsecurity.token.KeycloakAuthenticationToken; +import org.springframework.cache.annotation.CacheEvict; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; @@ -39,13 +42,15 @@ public class WebController { private final UserService userService; private final ControllerService controllerService; private final ValidationService validationService; + private final InviteService inviteService; - public WebController(KeyCloakService keyCloakService, GroupService groupService, UserService userService, ControllerService controllerService, ValidationService validationService) { + public WebController(KeyCloakService keyCloakService, GroupService groupService, UserService userService, ControllerService controllerService, ValidationService validationService, InviteService inviteService) { this.keyCloakService = keyCloakService; this.groupService = groupService; this.userService = userService; this.controllerService = controllerService; this.validationService = validationService; + this.inviteService = inviteService; } /** @@ -55,7 +60,6 @@ public class WebController { * @param model tolles model * @return index.html */ - @RolesAllowed({"ROLE_orga", "ROLE_studentin", "ROLE_actuator"}) @GetMapping("") public String index(KeycloakAuthenticationToken token, Model model) throws EventException { @@ -78,6 +82,7 @@ public class WebController { @RolesAllowed({"ROLE_orga", "ROLE_actuator)"}) @PostMapping("/createOrga") + @CacheEvict(value = "groups", allEntries = true) public String postCrateGroupAsOrga(KeycloakAuthenticationToken token, @RequestParam("title") String title, @RequestParam("description") String description, @@ -108,6 +113,7 @@ public class WebController { @RolesAllowed({"ROLE_studentin"}) @PostMapping("/createStudent") + @CacheEvict(value = "groups", allEntries = true) public String postCreateGroupAsStudent(KeycloakAuthenticationToken token, @RequestParam("title") String title, @RequestParam("description") String description, @@ -125,6 +131,7 @@ public class WebController { @RolesAllowed({"ROLE_orga", "ROLE_actuator)"}) @PostMapping("/details/members/addUsersFromCsv") + @CacheEvict(value = "groups", allEntries = true) public String addUsersFromCsv(KeycloakAuthenticationToken token, @RequestParam("group_id") String groupId, @RequestParam(value = "file", required = false) MultipartFile file) throws IOException { @@ -164,6 +171,7 @@ public class WebController { @RolesAllowed({"ROLE_orga", "ROLE_studentin", "ROLE_actuator"}) @PostMapping("/details/changeMetadata") + @CacheEvict(value = "groups", allEntries = true) public String pChangeMetadata(KeycloakAuthenticationToken token, @RequestParam("title") String title, @RequestParam("description") String description, @@ -187,12 +195,16 @@ public class WebController { groups = validationService.checkSearch(search, groups, account); model.addAttribute("account", account); model.addAttribute("gruppen", groups); + model.addAttribute("inviteService", inviteService); return "search"; } @RolesAllowed({"ROLE_orga", "ROLE_studentin", "ROLE_actuator)"}) @GetMapping("/details/{id}") - public String showGroupDetails(KeycloakAuthenticationToken token, Model model, HttpServletRequest request, @PathVariable("id") String groupId) throws EventException { + public String showGroupDetails(KeycloakAuthenticationToken token, + Model model, + HttpServletRequest request, + @PathVariable("id") String groupId) throws EventException { model.addAttribute("account", keyCloakService.createAccountFromPrincipal(token)); Group group = userService.getGroupById(UUID.fromString(groupId)); @@ -219,13 +231,14 @@ public class WebController { String actualURL = request.getRequestURL().toString(); String serverURL = actualURL.substring(0, actualURL.indexOf("gruppen2/")); - model.addAttribute("link", serverURL + "gruppen2/acceptinvite/" + groupId); + model.addAttribute("link", serverURL + "gruppen2/acceptinvite/" + inviteService.getLinkByGroupId(group.getId())); return "detailsMember"; } @RolesAllowed({"ROLE_orga", "ROLE_studentin", "ROLE_actuator"}) @PostMapping("/detailsBeitreten") + @CacheEvict(value = "groups", allEntries = true) public String joinGroup(KeycloakAuthenticationToken token, Model model, @RequestParam("id") String groupId) throws EventException { model.addAttribute("account", keyCloakService.createAccountFromPrincipal(token)); @@ -234,7 +247,7 @@ public class WebController { Group group = userService.getGroupById(UUID.fromString(groupId)); validationService.checkIfUserInGroupJoin(group, user); validationService.checkIfGroupFull(group); - controllerService.addUser(account, UUID.fromString(groupId)); + controllerService.addUser(account, group.getId()); return "redirect:/gruppen2/"; } @@ -257,19 +270,46 @@ public class WebController { return "detailsNoMember"; } + //TODO: Muss post-mapping sein @RolesAllowed({"ROLE_orga", "ROLE_studentin", "ROLE_actuator"}) - @GetMapping("/acceptinvite/{groupId}") + @GetMapping("/acceptinvite/{link}") public String acceptInvite(KeycloakAuthenticationToken token, - Model model, @PathVariable String groupId) throws EventException { + Model model, + @PathVariable("link") String link) throws EventException { model.addAttribute("account", keyCloakService.createAccountFromPrincipal(token)); - Group group = userService.getGroupById(UUID.fromString(groupId)); + Group group = userService.getGroupById(inviteService.getGroupIdFromLink(link)); validationService.checkGroup(group.getTitle()); model.addAttribute("group", group); - return "redirect:/gruppen2/detailsSearch?id=" + group.getId(); + + //controllerService.addUser(keyCloakService.createAccountFromPrincipal(token), group.getId()); + + if (group.getVisibility() == Visibility.PUBLIC) { + return "redirect:/gruppen2/details/" + group.getId(); + } + + return "joinprivate"; + } + + @RolesAllowed({"ROLE_orga", "ROLE_studentin", "ROLE_actuator"}) + @PostMapping("/acceptinvite") + @CacheEvict(value = "groups", allEntries = true) + public String postAcceptInvite(KeycloakAuthenticationToken token, + @RequestParam("id") String groupId) { + + Account acc = keyCloakService.createAccountFromPrincipal(token); + + User user = new User(acc.getName(), acc.getGivenname(), acc.getFamilyname(), acc.getEmail()); + + if (!validationService.checkIfUserInGroup(userService.getGroupById(UUID.fromString(groupId)), user)) { + controllerService.addUser(keyCloakService.createAccountFromPrincipal(token), UUID.fromString(groupId)); + } + + return "redirect:/gruppen2/"; } @RolesAllowed({"ROLE_orga", "ROLE_studentin", "ROLE_actuator"}) @PostMapping("/leaveGroup") + @CacheEvict(value = "groups", allEntries = true) public String pLeaveGroup(KeycloakAuthenticationToken token, @RequestParam("group_id") String groupId) throws EventException { Account account = keyCloakService.createAccountFromPrincipal(token); @@ -282,6 +322,7 @@ public class WebController { @RolesAllowed({"ROLE_orga", "ROLE_studentin", "ROLE_actuator"}) @PostMapping("/deleteGroup") + @CacheEvict(value = "groups", allEntries = true) public String pDeleteGroup(KeycloakAuthenticationToken token, @RequestParam("group_id") String groupId) { Account account = keyCloakService.createAccountFromPrincipal(token); @@ -310,6 +351,7 @@ public class WebController { @RolesAllowed({"ROLE_orga", "ROLE_studentin", "ROLE_actuator)"}) @PostMapping("/details/members/changeRole") + @CacheEvict(value = "groups", allEntries = true) public String changeRole(KeycloakAuthenticationToken token, @RequestParam("group_id") String groupId, @RequestParam("user_id") String userId) throws EventException { @@ -322,6 +364,7 @@ public class WebController { @RolesAllowed({"ROLE_orga", "ROLE_studentin", "ROLE_actuator)"}) @PostMapping("/details/members/changeMaximum") + @CacheEvict(value = "groups", allEntries = true) public String changeMaxSize(@RequestParam("maximum") Long maximum, @RequestParam("group_id") String groupId, KeycloakAuthenticationToken token) { @@ -333,6 +376,7 @@ public class WebController { @RolesAllowed({"ROLE_orga", "ROLE_studentin", "ROLE_actuator)"}) @PostMapping("/details/members/deleteUser") + @CacheEvict(value = "groups", allEntries = true) public String deleteUser(@RequestParam("group_id") String groupId, @RequestParam("user_id") String userId) throws EventException { User user = new User(userId, "", "", ""); diff --git a/src/main/java/mops/gruppen2/domain/User.java b/src/main/java/mops/gruppen2/domain/User.java index 7b961c4..bf6c172 100644 --- a/src/main/java/mops/gruppen2/domain/User.java +++ b/src/main/java/mops/gruppen2/domain/User.java @@ -11,8 +11,8 @@ import lombok.NoArgsConstructor; @EqualsAndHashCode(exclude = {"givenname", "familyname", "email"}) public class User { - private String id; - private String givenname; - private String familyname; - private String email; + private String id; + private String givenname; + private String familyname; + private String email; } diff --git a/src/main/java/mops/gruppen2/domain/dto/InviteLinkDTO.java b/src/main/java/mops/gruppen2/domain/dto/InviteLinkDTO.java index 0047527..b325f6b 100644 --- a/src/main/java/mops/gruppen2/domain/dto/InviteLinkDTO.java +++ b/src/main/java/mops/gruppen2/domain/dto/InviteLinkDTO.java @@ -11,7 +11,7 @@ import org.springframework.data.relational.core.mapping.Table; public class InviteLinkDTO { @Id - Long link_id; + Long invite_id; String group_id; String invite_link; } diff --git a/src/main/java/mops/gruppen2/domain/exception/InvalidInviteException.java b/src/main/java/mops/gruppen2/domain/exception/InvalidInviteException.java new file mode 100644 index 0000000..6202155 --- /dev/null +++ b/src/main/java/mops/gruppen2/domain/exception/InvalidInviteException.java @@ -0,0 +1,10 @@ +package mops.gruppen2.domain.exception; + +import org.springframework.http.HttpStatus; + +public class InvalidInviteException extends EventException { + + public InvalidInviteException(String info) { + super(HttpStatus.NOT_FOUND, "Der Einladungslink ist ungültig.", info); + } +} diff --git a/src/main/java/mops/gruppen2/domain/exception/NoInviteExistException.java b/src/main/java/mops/gruppen2/domain/exception/NoInviteExistException.java new file mode 100644 index 0000000..9a61523 --- /dev/null +++ b/src/main/java/mops/gruppen2/domain/exception/NoInviteExistException.java @@ -0,0 +1,10 @@ +package mops.gruppen2.domain.exception; + +import org.springframework.http.HttpStatus; + +public class NoInviteExistException extends EventException { + + public NoInviteExistException(String info) { + super(HttpStatus.NOT_FOUND, "Für diese Gruppe existiert kein Link.", info); + } +} diff --git a/src/main/java/mops/gruppen2/repository/EventRepository.java b/src/main/java/mops/gruppen2/repository/EventRepository.java index f2199e8..87f192f 100644 --- a/src/main/java/mops/gruppen2/repository/EventRepository.java +++ b/src/main/java/mops/gruppen2/repository/EventRepository.java @@ -12,15 +12,12 @@ import java.util.List; //TODO Rename Queries + Formatting public interface EventRepository extends CrudRepository { - @Query("select distinct group_id from event where user_id =:id") + @Query("SELECT DISTINCT group_id FROM event WHERE user_id = :id") List findGroup_idsWhereUser_id(@Param("id") String userId); - @Query("select * from event where group_id =:id") + @Query("SELECT * FROM event WHERE group_id = :id") List findEventDTOByGroup_id(@Param("id") String groupId); - //@Query("SELECT * FROM event WHERE event_id > ?#{[0]}") - //Iterable findNewEventSinceStatus(@Param("status") Long status); - @Query("SELECT DISTINCT group_id FROM event WHERE event_id > :status") List findNewEventSinceStatus(@Param("status") Long status); diff --git a/src/main/java/mops/gruppen2/repository/InviteRepository.java b/src/main/java/mops/gruppen2/repository/InviteRepository.java new file mode 100644 index 0000000..fdecb4d --- /dev/null +++ b/src/main/java/mops/gruppen2/repository/InviteRepository.java @@ -0,0 +1,20 @@ +package mops.gruppen2.repository; + +import mops.gruppen2.domain.dto.InviteLinkDTO; +import org.springframework.data.jdbc.repository.query.Query; +import org.springframework.data.repository.CrudRepository; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +@Repository +public interface InviteRepository extends CrudRepository { + + @Query("SELECT group_id FROM invite WHERE invite_link = :link") + String findGroupIdByLink(@Param("link") String link); + + @Query("DELETE FROM invite WHERE group_id = :group") + void deleteLinkOfGroup(@Param("group") String group); + + @Query("SELECT invite_link FROM invite WHERE group_id = :group") + String findLinkByGroupId(@Param("group") String group); +} diff --git a/src/main/java/mops/gruppen2/security/SecurityConfig.java b/src/main/java/mops/gruppen2/security/SecurityConfig.java index 981103e..6683f3a 100644 --- a/src/main/java/mops/gruppen2/security/SecurityConfig.java +++ b/src/main/java/mops/gruppen2/security/SecurityConfig.java @@ -48,7 +48,7 @@ class SecurityConfig extends KeycloakWebSecurityConfigurerAdapter { @Bean @Scope(scopeName = WebApplicationContext.SCOPE_REQUEST, - proxyMode = ScopedProxyMode.TARGET_CLASS) + proxyMode = ScopedProxyMode.TARGET_CLASS) public AccessToken getAccessToken() { HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder @@ -61,14 +61,10 @@ class SecurityConfig extends KeycloakWebSecurityConfigurerAdapter { protected void configure(HttpSecurity http) throws Exception { super.configure(http); http.authorizeRequests() - .antMatchers("/actuator/**") - .hasRole("monitoring") - .anyRequest() - .permitAll() - .and() - .csrf() - .ignoringAntMatchers("/gruppen2/createOrga") - .ignoringAntMatchers("/gruppen2/details/members/addUsersFromCsv"); + .antMatchers("/actuator/**") + .hasRole("monitoring") + .anyRequest() + .permitAll(); } /** diff --git a/src/main/java/mops/gruppen2/service/ControllerService.java b/src/main/java/mops/gruppen2/service/ControllerService.java index 0198c75..7fd9261 100644 --- a/src/main/java/mops/gruppen2/service/ControllerService.java +++ b/src/main/java/mops/gruppen2/service/ControllerService.java @@ -38,11 +38,13 @@ public class ControllerService { private final EventService eventService; private final UserService userService; + private final InviteService inviteService; private final Logger logger; - public ControllerService(EventService eventService, UserService userService) { + public ControllerService(EventService eventService, UserService userService, InviteService inviteService) { this.eventService = eventService; this.userService = userService; + this.inviteService = inviteService; this.logger = Logger.getLogger("controllerServiceLogger"); } @@ -66,6 +68,8 @@ public class ControllerService { CreateGroupEvent createGroupEvent = new CreateGroupEvent(groupId, account.getName(), parent, groupType, groupVisibility, userMaximum); eventService.saveEvent(createGroupEvent); + inviteService.createLink(groupId); + addUser(account, groupId); updateTitle(account, groupId, title); updateDescription(account, groupId, description); @@ -221,6 +225,7 @@ public class ControllerService { public void deleteGroupEvent(String userId, UUID groupId) { DeleteGroupEvent deleteGroupEvent = new DeleteGroupEvent(groupId, userId); + inviteService.destroyLink(groupId); eventService.saveEvent(deleteGroupEvent); } diff --git a/src/main/java/mops/gruppen2/service/EventService.java b/src/main/java/mops/gruppen2/service/EventService.java index 92a671f..c4bce89 100644 --- a/src/main/java/mops/gruppen2/service/EventService.java +++ b/src/main/java/mops/gruppen2/service/EventService.java @@ -115,7 +115,6 @@ public class EventService { return translateEventDTOs(eventDTOList); } - //TODO: Nur AddUserEvents betrachten public List findGroupIdsByUser(String userId) { return eventStore.findGroup_idsWhereUser_id(userId).stream() .map(UUID::fromString) diff --git a/src/main/java/mops/gruppen2/service/GroupService.java b/src/main/java/mops/gruppen2/service/GroupService.java index 2cab31b..d4087cf 100644 --- a/src/main/java/mops/gruppen2/service/GroupService.java +++ b/src/main/java/mops/gruppen2/service/GroupService.java @@ -8,6 +8,7 @@ import mops.gruppen2.domain.event.Event; import mops.gruppen2.domain.exception.EventException; import mops.gruppen2.repository.EventRepository; import mops.gruppen2.security.Account; +import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import java.util.ArrayList; @@ -77,6 +78,7 @@ public class GroupService { * @throws EventException Projektionsfehler */ //TODO Rename + @Cacheable("groups") public List getAllGroupWithVisibilityPublic(String userId) throws EventException { List groupEvents = eventService.translateEventDTOs(eventRepository.findAllEventsByType("CreateGroupEvent")); groupEvents.addAll(eventService.translateEventDTOs(eventRepository.findAllEventsByType("UpdateGroupDescriptionEvent"))); @@ -100,6 +102,7 @@ public class GroupService { * * @return List of groups */ + @Cacheable("groups") public List getAllLecturesWithVisibilityPublic() { List createEvents = eventService.translateEventDTOs(eventRepository.findAllEventsByType("CreateGroupEvent")); createEvents.addAll(eventService.translateEventDTOs(eventRepository.findAllEventsByType("DeleteGroupEvent"))); @@ -124,6 +127,7 @@ public class GroupService { * @throws EventException Projektionsfehler */ //Todo Rename + @Cacheable("groups") public List findGroupWith(String search, Account account) throws EventException { if (search.isEmpty()) { return getAllGroupWithVisibilityPublic(account.getName()); diff --git a/src/main/java/mops/gruppen2/service/InviteService.java b/src/main/java/mops/gruppen2/service/InviteService.java new file mode 100644 index 0000000..69f21e2 --- /dev/null +++ b/src/main/java/mops/gruppen2/service/InviteService.java @@ -0,0 +1,47 @@ +package mops.gruppen2.service; + +import mops.gruppen2.domain.dto.InviteLinkDTO; +import mops.gruppen2.domain.exception.InvalidInviteException; +import mops.gruppen2.domain.exception.NoInviteExistException; +import mops.gruppen2.repository.InviteRepository; +import org.springframework.stereotype.Service; + +import java.util.UUID; + +@Service +public class InviteService { + + private final InviteRepository inviteRepository; + + public InviteService(InviteRepository inviteRepository) { + this.inviteRepository = inviteRepository; + } + + public void createLink(UUID groupId) { + inviteRepository.save(new InviteLinkDTO(null, groupId.toString(), UUID.randomUUID().toString())); + } + + public void destroyLink(UUID groupId) { + inviteRepository.deleteLinkOfGroup(groupId.toString()); + } + + public UUID getGroupIdFromLink(String link) { + try { + return UUID.fromString(inviteRepository.findGroupIdByLink(link)); + } catch (Exception e) { + e.printStackTrace(); + } + + throw new InvalidInviteException(link); + } + + public String getLinkByGroupId(UUID groupId) { + try { + return inviteRepository.findLinkByGroupId(groupId.toString()); + } catch (Exception e) { + e.printStackTrace(); + } + + throw new NoInviteExistException(groupId.toString()); + } +} diff --git a/src/main/java/mops/gruppen2/service/UserService.java b/src/main/java/mops/gruppen2/service/UserService.java index 39fecff..b70338a 100644 --- a/src/main/java/mops/gruppen2/service/UserService.java +++ b/src/main/java/mops/gruppen2/service/UserService.java @@ -5,6 +5,7 @@ import mops.gruppen2.domain.User; import mops.gruppen2.domain.event.Event; import mops.gruppen2.domain.exception.EventException; import mops.gruppen2.domain.exception.GroupNotFoundException; +import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import java.util.ArrayList; @@ -25,6 +26,7 @@ public class UserService { //Test nötig?? + @Cacheable("groups") public List getUserGroups(User user) throws EventException { List groupIds = eventService.findGroupIdsByUser(user.getId()); List events = groupService.getGroupEvents(groupIds); @@ -41,6 +43,11 @@ public class UserService { return newGroups; } + @Cacheable("groups") + public List getUserGroups(String userId) throws EventException { + return getUserGroups(new User(userId, null, null, null)); + } + public Group getGroupById(UUID groupId) throws EventException { List groupIds = new ArrayList<>(); groupIds.add(groupId); diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties index b18e217..0a56ff4 100644 --- a/src/main/resources/application-dev.properties +++ b/src/main/resources/application-dev.properties @@ -19,3 +19,5 @@ keycloak.use-resource-role-mappings=true keycloak.autodetect-bearer-only=true keycloak.confidential-port=443 server.error.include-stacktrace=always +management.endpoints.web.exposure.include=info,health +spring.cache.type=NONE diff --git a/src/main/resources/application-docker.properties b/src/main/resources/application-docker.properties index 253b9c9..3474f7a 100644 --- a/src/main/resources/application-docker.properties +++ b/src/main/resources/application-docker.properties @@ -15,4 +15,5 @@ keycloak.credentials.secret=fc6ebf10-8c63-4e71-a667-4eae4e8209a1 keycloak.verify-token-audience=true keycloak.use-resource-role-mappings=true keycloak.autodetect-bearer-only=true -keycloak.confidential-port= 443 +keycloak.confidential-port=443 +management.endpoints.web.exposure.include=info,health diff --git a/src/main/resources/schema-h2.sql b/src/main/resources/schema-h2.sql index 5616313..72405f2 100644 --- a/src/main/resources/schema-h2.sql +++ b/src/main/resources/schema-h2.sql @@ -8,3 +8,12 @@ CREATE TABLE event event_type VARCHAR(32), event_payload VARCHAR(2500) ); + +DROP TABLE IF EXISTS invite; + +CREATE TABLE invite +( + invite_id INT PRIMARY KEY AUTO_INCREMENT, + group_id VARCHAR(36) NOT NULL, + invite_link VARCHAR(36) NOT NULL +); diff --git a/src/main/resources/templates/changeMetadata.html b/src/main/resources/templates/changeMetadata.html index 659445e..7488365 100644 --- a/src/main/resources/templates/changeMetadata.html +++ b/src/main/resources/templates/changeMetadata.html @@ -40,7 +40,7 @@

Metadaten ändern

-
+
diff --git a/src/main/resources/templates/createOrga.html b/src/main/resources/templates/createOrga.html index d6f3d7e..ca74dae 100644 --- a/src/main/resources/templates/createOrga.html +++ b/src/main/resources/templates/createOrga.html @@ -38,7 +38,8 @@

Gruppenerstellung

- +
diff --git a/src/main/resources/templates/createStudent.html b/src/main/resources/templates/createStudent.html index e64299c..f466cb0 100644 --- a/src/main/resources/templates/createStudent.html +++ b/src/main/resources/templates/createStudent.html @@ -37,8 +37,9 @@

Gruppenerstellung

- -
+ +
diff --git a/src/main/resources/templates/detailsMember.html b/src/main/resources/templates/detailsMember.html index 664cfc7..104f8e2 100644 --- a/src/main/resources/templates/detailsMember.html +++ b/src/main/resources/templates/detailsMember.html @@ -57,7 +57,7 @@ th:text="${parent.getTitle()}">Parent
+ th:if="${roles.get(user.getId()) == admin}">
Einladungslink: @@ -83,15 +83,16 @@ style="background: #52a1eb; border: none; margin: 5px"> Zurück - + -
+
@@ -132,7 +133,7 @@