From 6e067d1b4740028ce6481ddb72215847fb20f1a4 Mon Sep 17 00:00:00 2001 From: Christoph Date: Tue, 17 Mar 2020 16:16:58 +0100 Subject: [PATCH] Fix InviteLink DB Schema + Implement Frontend InviteLink Handling Co-authored-by: [Mahgs] Co-authored-by: Christoph --- .../controller/Gruppen2Controller.java | 36 ++++++++++++------- .../gruppen2/domain/dto/InviteLinkDTO.java | 7 ++-- .../gruppen2/repository/EventRepository.java | 2 +- .../repository/InviteLinkRepository.java | 10 ++++-- .../gruppen2/service/ControllerService.java | 27 +++++++++----- src/main/resources/application-dev.properties | 10 +++--- src/main/resources/schema.sql | 7 ++-- 7 files changed, 62 insertions(+), 37 deletions(-) diff --git a/src/main/java/mops/gruppen2/controller/Gruppen2Controller.java b/src/main/java/mops/gruppen2/controller/Gruppen2Controller.java index 11f8209..6eb18d4 100644 --- a/src/main/java/mops/gruppen2/controller/Gruppen2Controller.java +++ b/src/main/java/mops/gruppen2/controller/Gruppen2Controller.java @@ -11,10 +11,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.*; import org.springframework.web.server.ResponseStatusException; import javax.annotation.security.RolesAllowed; @@ -33,13 +30,15 @@ public class Gruppen2Controller { private final GroupService groupService; private final UserService userService; private final ControllerService controllerService; + private final InviteLinkRepositoryService inviteLinkRepositoryService; - public Gruppen2Controller(KeyCloakService keyCloakService, EventService eventService, GroupService groupService, UserService userService, ControllerService controllerService) { + public Gruppen2Controller(KeyCloakService keyCloakService, EventService eventService, GroupService groupService, UserService userService, ControllerService controllerService, InviteLinkRepositoryService inviteLinkRepositoryService) { this.keyCloakService = keyCloakService; this.eventService = eventService; this.groupService = groupService; this.userService = userService; this.controllerService = controllerService; + this.inviteLinkRepositoryService = inviteLinkRepositoryService; } /** @@ -57,7 +56,7 @@ public class Gruppen2Controller { model.addAttribute("account", keyCloakService.createAccountFromPrincipal(token)); model.addAttribute("gruppen", userService.getUserGroups(user.getUser_id())); - model.addAttribute("user",user); + model.addAttribute("user", user); return "index"; } @@ -72,11 +71,11 @@ public class Gruppen2Controller { @GetMapping("/findGroup") public String findGroup(KeycloakAuthenticationToken token, Model model, @RequestParam(value = "suchbegriff", required = false) String suchbegriff) throws EventException { List groupse = new ArrayList<>(); - if(suchbegriff!=null) { + if (suchbegriff != null) { groupse = groupService.findGroupWith(suchbegriff); } model.addAttribute("account", keyCloakService.createAccountFromPrincipal(token)); - model.addAttribute("gruppen",groupse); + model.addAttribute("gruppen", groupse); return "search"; } @@ -95,12 +94,12 @@ public class Gruppen2Controller { @RolesAllowed({"ROLE_orga", "ROLE_studentin", "ROLE_actuator)"}) @GetMapping("/details") - public String showGroupDetails(KeycloakAuthenticationToken token, Model model, @RequestParam (value="id") Long id) throws EventException, ResponseStatusException { + public String showGroupDetails(KeycloakAuthenticationToken token, Model model, @RequestParam(value = "id") Long id) throws EventException, ResponseStatusException { model.addAttribute("account", keyCloakService.createAccountFromPrincipal(token)); Group group = userService.getGroupById(id); - Account account = keyCloakService.createAccountFromPrincipal (token); + Account account = keyCloakService.createAccountFromPrincipal(token); User user = new User(account.getName(), account.getGivenname(), account.getFamilyname(), account.getEmail()); - if(group!= null) { + if (group != null) { model.addAttribute("group", group); model.addAttribute("role", group.getRoles().get(user.getUser_id())); return "detailsMember"; @@ -110,14 +109,25 @@ public class Gruppen2Controller { @RolesAllowed({"ROLE_orga", "ROLE_studentin", "ROLE_actuator)"}) @GetMapping("/detailsSearch") - public String showGroupDetailsNoMember (KeycloakAuthenticationToken token, Model model, @RequestParam (value="id") Long id) throws EventException { + public String showGroupDetailsNoMember(KeycloakAuthenticationToken token, Model model, @RequestParam(value = "id") Long id) throws EventException { model.addAttribute("account", keyCloakService.createAccountFromPrincipal(token)); Group group = userService.getGroupById(id); - if (group!=null) { + if (group != null) { model.addAttribute("group", group); return "detailsNoMember"; } throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Group not found"); } + @RolesAllowed({"ROLE_orga", "ROLE_studentin", "ROLE_actuator)"}) + @GetMapping("/acceptinvite/{link}") + public String acceptInvite(KeycloakAuthenticationToken token, Model model, @PathVariable String link) throws EventException { + model.addAttribute("account", keyCloakService.createAccountFromPrincipal(token)); + Group group = userService.getGroupById(inviteLinkRepositoryService.findGroupIdByInvite(link)); + if (group != null) { + model.addAttribute("group", group); + return "redirect:/gruppen2/detailsSearch?id=" + group.getId(); + } + throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Group not found"); + } } diff --git a/src/main/java/mops/gruppen2/domain/dto/InviteLinkDTO.java b/src/main/java/mops/gruppen2/domain/dto/InviteLinkDTO.java index 14beb7d..cac347a 100644 --- a/src/main/java/mops/gruppen2/domain/dto/InviteLinkDTO.java +++ b/src/main/java/mops/gruppen2/domain/dto/InviteLinkDTO.java @@ -1,13 +1,16 @@ package mops.gruppen2.domain.dto; +import lombok.AllArgsConstructor; import lombok.Data; import org.springframework.data.annotation.Id; import org.springframework.data.relational.core.mapping.Table; @Table("invite") @Data +@AllArgsConstructor public class InviteLinkDTO { @Id - private Long group_id; - private String invite_link; + Long link_id; + Long group_id; + String invite_link; } diff --git a/src/main/java/mops/gruppen2/repository/EventRepository.java b/src/main/java/mops/gruppen2/repository/EventRepository.java index 1cdfd01..5eb0139 100644 --- a/src/main/java/mops/gruppen2/repository/EventRepository.java +++ b/src/main/java/mops/gruppen2/repository/EventRepository.java @@ -19,7 +19,7 @@ public interface EventRepository extends CrudRepository { //@Query("SELECT * FROM event WHERE event_id > ?#{[0]}") //Iterable findNewEventSinceStatus(@Param("status") Long status); - @Query("select * from event where visibility =:vis") + @Query("select * from event where visibility =:vis") List findEventDTOByVisibility(@Param("vis") Boolean visibility); @Query("SELECT DISTINCT group_id FROM event WHERE event_id > :status") diff --git a/src/main/java/mops/gruppen2/repository/InviteLinkRepository.java b/src/main/java/mops/gruppen2/repository/InviteLinkRepository.java index ee70999..4cd5932 100644 --- a/src/main/java/mops/gruppen2/repository/InviteLinkRepository.java +++ b/src/main/java/mops/gruppen2/repository/InviteLinkRepository.java @@ -7,7 +7,11 @@ import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; @Repository -public interface InviteLinkRepository extends CrudRepository { - @Query("select invite_link from inviteLink where group_id =:id") - String findLinkByGroupID(@Param("id") Long GroupID); +public interface InviteLinkRepository extends CrudRepository { + + //@Query("SELECT invite_link FROM invite WHERE group_id = :id") + //String findLinkByGroupID(@Param("id") Long GroupID); + + @Query("SELECT group_id FROM invite WHERE invite_link = :link") + Long findGroupIdByLink(@Param("link") String link); } diff --git a/src/main/java/mops/gruppen2/service/ControllerService.java b/src/main/java/mops/gruppen2/service/ControllerService.java index 2bd70c3..e6dd3ef 100644 --- a/src/main/java/mops/gruppen2/service/ControllerService.java +++ b/src/main/java/mops/gruppen2/service/ControllerService.java @@ -11,14 +11,17 @@ import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.UUID; @Service public class ControllerService { private final EventService eventService; + private final InviteLinkRepositoryService inviteLinkRepositoryService; - public ControllerService(EventService eventService) { + public ControllerService(EventService eventService, InviteLinkRepositoryService inviteLinkRepositoryService) { this.eventService = eventService; + this.inviteLinkRepositoryService = inviteLinkRepositoryService; } /** @@ -31,25 +34,31 @@ public class ControllerService { * @param description Gruppenbeschreibung */ public void createGroup(Account account, String title, String description, Boolean visibility) { + Long groupID = eventService.checkGroup(); Visibility visibility1; if (visibility) { visibility1 = Visibility.PUBLIC; } else { visibility1 = Visibility.PRIVATE; + createInviteLink(groupID); } List eventList = new ArrayList<>(); - Collections.addAll(eventList, new CreateGroupEvent(eventService.checkGroup(), account.getName(), null , GroupType.LECTURE, visibility1), - new AddUserEvent(eventService.checkGroup(), account.getName(),account.getGivenname(),account.getFamilyname(),account.getEmail()), - new UpdateRoleEvent(eventService.checkGroup(), account.getName(), Role.ADMIN), - new UpdateGroupTitleEvent(eventService.checkGroup(), account.getName(), title), - new UpdateGroupDescriptionEvent(eventService.checkGroup(), account.getName(), description), - new UpdateRoleEvent(eventService.checkGroup(),account.getName(), Role.ADMIN)); + Collections.addAll(eventList, new CreateGroupEvent(groupID, account.getName(), null, GroupType.LECTURE, visibility1), + new AddUserEvent(groupID, account.getName(), account.getGivenname(), account.getFamilyname(), account.getEmail()), + new UpdateRoleEvent(groupID, account.getName(), Role.ADMIN), + new UpdateGroupTitleEvent(groupID, account.getName(), title), + new UpdateGroupDescriptionEvent(groupID, account.getName(), description), + new UpdateRoleEvent(groupID, account.getName(), Role.ADMIN)); eventService.saveEventList(eventList); } - public void addUser(Account account, Group group){ - AddUserEvent addUserEvent = new AddUserEvent(eventService.checkGroup(),group.getId(),account.getName(),account.getGivenname(),account.getFamilyname(),account.getEmail()); + private void createInviteLink(Long group_id) { + inviteLinkRepositoryService.saveInvite(group_id, UUID.randomUUID()); + } + + public void addUser(Account account, Group group) { + AddUserEvent addUserEvent = new AddUserEvent(eventService.checkGroup(), group.getId(), account.getName(), account.getGivenname(), account.getFamilyname(), account.getEmail()); eventService.saveEvent(addUserEvent); } } diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties index 79a9404..ee53a97 100644 --- a/src/main/resources/application-dev.properties +++ b/src/main/resources/application-dev.properties @@ -1,23 +1,21 @@ server.port=8080 application.name=gruppen2 - logging.pattern.console=[${application.name}],%magenta(%-5level), %d{dd-MM-yyyy HH:mm:ss.SSS}, %highlight(%msg),%thread,%logger.%M%n - spring.datasource.url=jdbc:h2:mem:blogdb spring.datasource.driverClassName=org.h2.Driver spring.datasource.username=sa spring.datasource.password= spring.jpa.database-platform=org.hibernate.dialect.H2Dialect - +spring.h2.console.enabled=true +logging.level.org.springframework.jdbc.core=DEBUG keycloak.principal-attribute=preferred_username keycloak.auth-server-url=https://keycloak.cs.hhu.de/auth keycloak.realm=MOPS - hhu_keycloak.token-uri=https://keycloak.cs.hhu.de/auth/realms/MOPS/protocol/openid-connect/token keycloak.resource=gruppenfindung -keycloak.credentials.secret= fc6ebf10-8c63-4e71-a667-4eae4e8209a1 +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 \ No newline at end of file +keycloak.confidential-port= 443 diff --git a/src/main/resources/schema.sql b/src/main/resources/schema.sql index 27cc591..5ad3f09 100644 --- a/src/main/resources/schema.sql +++ b/src/main/resources/schema.sql @@ -15,6 +15,7 @@ DROP TABLE IF EXISTS invite; CREATE TABLE invite ( - group_id INT FOREIGN KEY REFERENCES event(group_id), - invite_link varchar(255) -) + link_id INT PRIMARY KEY AUTO_INCREMENT, + group_id INT NOT NULL, + invite_link varchar(255) NOT NULL +);