diff --git a/src/main/java/mops/gruppen2/controller/Gruppen2Controller.java b/src/main/java/mops/gruppen2/controller/Gruppen2Controller.java index 8ab6403..af08948 100644 --- a/src/main/java/mops/gruppen2/controller/Gruppen2Controller.java +++ b/src/main/java/mops/gruppen2/controller/Gruppen2Controller.java @@ -3,7 +3,6 @@ package mops.gruppen2.controller; import mops.gruppen2.config.Gruppen2Config; import mops.gruppen2.domain.Exceptions.EventException; import mops.gruppen2.domain.Group; - import mops.gruppen2.domain.User; import mops.gruppen2.domain.event.CreateGroupEvent; import mops.gruppen2.security.Account; @@ -14,17 +13,13 @@ import org.springframework.http.HttpStatus; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; -import org.springframework.web.client.RestTemplate; -import org.springframework.web.context.annotation.SessionScope; import org.springframework.web.server.ResponseStatusException; import javax.annotation.security.RolesAllowed; import java.util.ArrayList; import java.util.List; - @Controller -@SessionScope @RequestMapping("/gruppen2") public class Gruppen2Controller { @@ -36,13 +31,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; } /** @@ -75,15 +72,14 @@ 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"; } - @PostMapping("/createGroup") public String pCreateGroup(KeycloakAuthenticationToken token, @RequestParam(value = "title") String title, @@ -91,11 +87,7 @@ public class Gruppen2Controller { @RequestParam(value = "visibility", required = false) Boolean visibility) { Account account = keyCloakService.createAccountFromPrincipal(token); - if (visibility == null) { - visibility = true; - }else{ - visibility = false; - } + visibility = visibility == null; controllerService.createGroup(account, title, beschreibung, visibility); return "redirect:/gruppen2/"; @@ -103,12 +95,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"; @@ -127,16 +119,27 @@ 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"); + } @RolesAllowed({"ROLE_orga", "ROLE_studentin", "ROLE_actuator)"}) @PostMapping("/leaveGroup") public String pLeaveGroup(KeycloakAuthenticationToken token, @RequestParam (value="group_id") Long id) { diff --git a/src/main/java/mops/gruppen2/domain/EventDTO.java b/src/main/java/mops/gruppen2/domain/dto/EventDTO.java similarity index 89% rename from src/main/java/mops/gruppen2/domain/EventDTO.java rename to src/main/java/mops/gruppen2/domain/dto/EventDTO.java index 764a454..e3f5462 100644 --- a/src/main/java/mops/gruppen2/domain/EventDTO.java +++ b/src/main/java/mops/gruppen2/domain/dto/EventDTO.java @@ -1,4 +1,4 @@ -package mops.gruppen2.domain; +package mops.gruppen2.domain.dto; import lombok.Data; import org.springframework.data.annotation.Id; diff --git a/src/main/java/mops/gruppen2/domain/dto/InviteLinkDTO.java b/src/main/java/mops/gruppen2/domain/dto/InviteLinkDTO.java new file mode 100644 index 0000000..cac347a --- /dev/null +++ b/src/main/java/mops/gruppen2/domain/dto/InviteLinkDTO.java @@ -0,0 +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 + 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 5efc363..7b84ce0 100644 --- a/src/main/java/mops/gruppen2/repository/EventRepository.java +++ b/src/main/java/mops/gruppen2/repository/EventRepository.java @@ -1,6 +1,6 @@ package mops.gruppen2.repository; -import mops.gruppen2.domain.EventDTO; +import mops.gruppen2.domain.dto.EventDTO; import org.springframework.data.jdbc.repository.query.Query; import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.query.Param; diff --git a/src/main/java/mops/gruppen2/repository/InviteLinkRepository.java b/src/main/java/mops/gruppen2/repository/InviteLinkRepository.java new file mode 100644 index 0000000..4cd5932 --- /dev/null +++ b/src/main/java/mops/gruppen2/repository/InviteLinkRepository.java @@ -0,0 +1,17 @@ +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 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 126d519..48e8f75 100644 --- a/src/main/java/mops/gruppen2/service/ControllerService.java +++ b/src/main/java/mops/gruppen2/service/ControllerService.java @@ -7,15 +7,21 @@ import mops.gruppen2.domain.Visibility; import mops.gruppen2.domain.event.*; import mops.gruppen2.security.Account; import org.springframework.stereotype.Service; -import java.util.*; + +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; } /** @@ -28,13 +34,13 @@ public class ControllerService { * @param description Gruppenbeschreibung */ public void createGroup(Account account, String title, String description, Boolean visibility) { - Visibility visibility1; Long group_id = eventService.checkGroup(); - - if (visibility){ + Visibility visibility1; + if (visibility) { visibility1 = Visibility.PUBLIC; - }else{ + } else { visibility1 = Visibility.PRIVATE; + createInviteLink(group_id); } CreateGroupEvent createGroupEvent = new CreateGroupEvent(group_id, account.getName(), null , GroupType.LECTURE, visibility1); @@ -46,6 +52,11 @@ public class ControllerService { updateRole(account, group_id); } + private void createInviteLink(Long group_id) { + inviteLinkRepositoryService.saveInvite(group_id, UUID.randomUUID()); + } + + public void addUser(Account account, Long group_id){ AddUserEvent addUserEvent = new AddUserEvent(group_id,account.getName(),account.getGivenname(),account.getFamilyname(),account.getEmail()); eventService.saveEvent(addUserEvent); diff --git a/src/main/java/mops/gruppen2/service/EventService.java b/src/main/java/mops/gruppen2/service/EventService.java index d6fb3da..f545456 100644 --- a/src/main/java/mops/gruppen2/service/EventService.java +++ b/src/main/java/mops/gruppen2/service/EventService.java @@ -1,8 +1,8 @@ package mops.gruppen2.service; import com.fasterxml.jackson.core.JsonProcessingException; -import mops.gruppen2.domain.EventDTO; import mops.gruppen2.domain.Visibility; +import mops.gruppen2.domain.dto.EventDTO; import mops.gruppen2.domain.event.CreateGroupEvent; import mops.gruppen2.domain.event.Event; import mops.gruppen2.repository.EventRepository; diff --git a/src/main/java/mops/gruppen2/service/GroupService.java b/src/main/java/mops/gruppen2/service/GroupService.java index a4b034b..e6adcb3 100644 --- a/src/main/java/mops/gruppen2/service/GroupService.java +++ b/src/main/java/mops/gruppen2/service/GroupService.java @@ -1,6 +1,6 @@ package mops.gruppen2.service; -import mops.gruppen2.domain.EventDTO; +import mops.gruppen2.domain.dto.EventDTO; import mops.gruppen2.domain.Exceptions.EventException; import mops.gruppen2.domain.Group; import mops.gruppen2.domain.Visibility; diff --git a/src/main/java/mops/gruppen2/service/InviteLinkRepositoryService.java b/src/main/java/mops/gruppen2/service/InviteLinkRepositoryService.java new file mode 100644 index 0000000..4bc082d --- /dev/null +++ b/src/main/java/mops/gruppen2/service/InviteLinkRepositoryService.java @@ -0,0 +1,26 @@ +package mops.gruppen2.service; + +import mops.gruppen2.domain.dto.InviteLinkDTO; +import mops.gruppen2.repository.InviteLinkRepository; +import org.springframework.stereotype.Service; + +import java.util.UUID; + +@Service +public class InviteLinkRepositoryService { + + private final InviteLinkRepository inviteLinkRepository; + + public InviteLinkRepositoryService(InviteLinkRepository inviteLinkRepository) { + this.inviteLinkRepository = inviteLinkRepository; + } + + public long findGroupIdByInvite(String link) { + return inviteLinkRepository.findGroupIdByLink(link); + } + + public void saveInvite(Long group_id, UUID link) { + inviteLinkRepository.save(new InviteLinkDTO(null, group_id, link.toString())); + } + +} diff --git a/src/main/java/mops/gruppen2/service/SerializationService.java b/src/main/java/mops/gruppen2/service/SerializationService.java index 86b00ed..3c7f8ba 100644 --- a/src/main/java/mops/gruppen2/service/SerializationService.java +++ b/src/main/java/mops/gruppen2/service/SerializationService.java @@ -2,7 +2,6 @@ package mops.gruppen2.service; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; -import mops.gruppen2.domain.EventDTO; import mops.gruppen2.domain.event.Event; import mops.gruppen2.repository.EventRepository; import org.slf4j.Logger; 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 9a3fe1f..5ad3f09 100644 --- a/src/main/resources/schema.sql +++ b/src/main/resources/schema.sql @@ -10,3 +10,12 @@ CREATE TABLE event event_payload VARCHAR(255), visibility BOOLEAN ); + +DROP TABLE IF EXISTS invite; + +CREATE TABLE invite +( + link_id INT PRIMARY KEY AUTO_INCREMENT, + group_id INT NOT NULL, + invite_link varchar(255) NOT NULL +); diff --git a/src/test/java/mops/gruppen2/service/EventServiceTest.java b/src/test/java/mops/gruppen2/service/EventServiceTest.java index 4991baf..122e219 100644 --- a/src/test/java/mops/gruppen2/service/EventServiceTest.java +++ b/src/test/java/mops/gruppen2/service/EventServiceTest.java @@ -1,8 +1,8 @@ package mops.gruppen2.service; -import mops.gruppen2.domain.EventDTO; import mops.gruppen2.domain.GroupType; import mops.gruppen2.domain.Visibility; +import mops.gruppen2.domain.dto.EventDTO; import mops.gruppen2.domain.event.AddUserEvent; import mops.gruppen2.domain.event.CreateGroupEvent; import mops.gruppen2.repository.EventRepository; @@ -14,7 +14,7 @@ import org.mockito.junit.MockitoJUnitRunner; import java.util.ArrayList; import java.util.List; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -86,4 +86,4 @@ class EventServiceTest { assertEquals(eventDTO.isVisibility(), false); } -} \ No newline at end of file +}