1

Merge remote-tracking branch 'origin/master' into feature-orga-csv

# Conflicts:
#	src/main/java/mops/gruppen2/controller/Gruppen2Controller.java
#	src/main/java/mops/gruppen2/service/ControllerService.java
This commit is contained in:
XXNitram
2020-03-18 14:27:54 +01:00
13 changed files with 114 additions and 27 deletions

View File

@ -3,7 +3,6 @@ package mops.gruppen2.controller;
import mops.gruppen2.config.Gruppen2Config; import mops.gruppen2.config.Gruppen2Config;
import mops.gruppen2.domain.Exceptions.EventException; import mops.gruppen2.domain.Exceptions.EventException;
import mops.gruppen2.domain.Group; import mops.gruppen2.domain.Group;
import mops.gruppen2.domain.User; import mops.gruppen2.domain.User;
import mops.gruppen2.domain.Visibility; import mops.gruppen2.domain.Visibility;
import mops.gruppen2.domain.event.CreateGroupEvent; import mops.gruppen2.domain.event.CreateGroupEvent;
@ -25,7 +24,6 @@ import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@Controller @Controller
@SessionScope @SessionScope
@RequestMapping("/gruppen2") @RequestMapping("/gruppen2")
@ -39,13 +37,15 @@ public class Gruppen2Controller {
private final GroupService groupService; private final GroupService groupService;
private final UserService userService; private final UserService userService;
private final ControllerService controllerService; 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.keyCloakService = keyCloakService;
this.eventService = eventService; this.eventService = eventService;
this.groupService = groupService; this.groupService = groupService;
this.userService = userService; this.userService = userService;
this.controllerService = controllerService; this.controllerService = controllerService;
this.inviteLinkRepositoryService = inviteLinkRepositoryService;
} }
/** /**
@ -100,15 +100,14 @@ public class Gruppen2Controller {
@GetMapping("/findGroup") @GetMapping("/findGroup")
public String findGroup(KeycloakAuthenticationToken token, Model model, @RequestParam(value = "suchbegriff", required = false) String suchbegriff) throws EventException { public String findGroup(KeycloakAuthenticationToken token, Model model, @RequestParam(value = "suchbegriff", required = false) String suchbegriff) throws EventException {
List<Group> groupse = new ArrayList<>(); List<Group> groupse = new ArrayList<>();
if(suchbegriff!=null) { if (suchbegriff != null) {
groupse = groupService.findGroupWith(suchbegriff); groupse = groupService.findGroupWith(suchbegriff);
} }
model.addAttribute("account", keyCloakService.createAccountFromPrincipal(token)); model.addAttribute("account", keyCloakService.createAccountFromPrincipal(token));
model.addAttribute("gruppen",groupse); model.addAttribute("gruppen", groupse);
return "search"; return "search";
} }
@PostMapping("/createGroup") @PostMapping("/createGroup")
public String pCreateGroup(KeycloakAuthenticationToken token, public String pCreateGroup(KeycloakAuthenticationToken token,
@RequestParam(value = "title") String title, @RequestParam(value = "title") String title,
@ -124,12 +123,12 @@ public class Gruppen2Controller {
@RolesAllowed({"ROLE_orga", "ROLE_studentin", "ROLE_actuator)"}) @RolesAllowed({"ROLE_orga", "ROLE_studentin", "ROLE_actuator)"})
@GetMapping("/details") @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)); model.addAttribute("account", keyCloakService.createAccountFromPrincipal(token));
Group group = userService.getGroupById(id); 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()); User user = new User(account.getName(), account.getGivenname(), account.getFamilyname(), account.getEmail());
if(group!= null) { if (group != null) {
model.addAttribute("group", group); model.addAttribute("group", group);
model.addAttribute("role", group.getRoles().get(user.getUser_id())); model.addAttribute("role", group.getRoles().get(user.getUser_id()));
return "detailsMember"; return "detailsMember";
@ -148,16 +147,27 @@ public class Gruppen2Controller {
@RolesAllowed({"ROLE_orga", "ROLE_studentin", "ROLE_actuator)"}) @RolesAllowed({"ROLE_orga", "ROLE_studentin", "ROLE_actuator)"})
@GetMapping("/detailsSearch") @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)); model.addAttribute("account", keyCloakService.createAccountFromPrincipal(token));
Group group = userService.getGroupById(id); Group group = userService.getGroupById(id);
if (group!=null) { if (group != null) {
model.addAttribute("group", group); model.addAttribute("group", group);
return "detailsNoMember"; return "detailsNoMember";
} }
throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Group not found"); 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)"}) @RolesAllowed({"ROLE_orga", "ROLE_studentin", "ROLE_actuator)"})
@PostMapping("/leaveGroup") @PostMapping("/leaveGroup")
public String pLeaveGroup(KeycloakAuthenticationToken token, @RequestParam (value="group_id") Long id) { public String pLeaveGroup(KeycloakAuthenticationToken token, @RequestParam (value="group_id") Long id) {

View File

@ -1,4 +1,4 @@
package mops.gruppen2.domain; package mops.gruppen2.domain.dto;
import lombok.Data; import lombok.Data;
import org.springframework.data.annotation.Id; import org.springframework.data.annotation.Id;

View File

@ -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;
}

View File

@ -1,6 +1,6 @@
package mops.gruppen2.repository; 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.jdbc.repository.query.Query;
import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param; import org.springframework.data.repository.query.Param;

View File

@ -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<InviteLinkDTO, Long> {
//@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);
}

View File

@ -4,15 +4,21 @@ import mops.gruppen2.domain.*;
import mops.gruppen2.domain.event.*; import mops.gruppen2.domain.event.*;
import mops.gruppen2.security.Account; import mops.gruppen2.security.Account;
import org.springframework.stereotype.Service; 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 @Service
public class ControllerService { public class ControllerService {
private final EventService eventService; private final EventService eventService;
private final InviteLinkRepositoryService inviteLinkRepositoryService;
public ControllerService(EventService eventService) { public ControllerService(EventService eventService, InviteLinkRepositoryService inviteLinkRepositoryService) {
this.eventService = eventService; this.eventService = eventService;
this.inviteLinkRepositoryService = inviteLinkRepositoryService;
} }
/** /**
@ -32,6 +38,7 @@ public class ControllerService {
visibility1 = Visibility.PUBLIC; visibility1 = Visibility.PUBLIC;
} else { } else {
visibility1 = Visibility.PRIVATE; visibility1 = Visibility.PRIVATE;
createInviteLink(group_id);
} }
CreateGroupEvent createGroupEvent = new CreateGroupEvent(group_id, account.getName(), null , GroupType.SIMPLE, visibility1); CreateGroupEvent createGroupEvent = new CreateGroupEvent(group_id, account.getName(), null , GroupType.SIMPLE, visibility1);
@ -43,6 +50,11 @@ public class ControllerService {
updateRole(account, group_id); updateRole(account, group_id);
} }
private void createInviteLink(Long group_id) {
inviteLinkRepositoryService.saveInvite(group_id, UUID.randomUUID());
}
public void addUser(Account account, Long group_id){ public void addUser(Account account, Long group_id){
AddUserEvent addUserEvent = new AddUserEvent(group_id,account.getName(),account.getGivenname(),account.getFamilyname(),account.getEmail()); AddUserEvent addUserEvent = new AddUserEvent(group_id,account.getName(),account.getGivenname(),account.getFamilyname(),account.getEmail());
eventService.saveEvent(addUserEvent); eventService.saveEvent(addUserEvent);

View File

@ -1,8 +1,8 @@
package mops.gruppen2.service; package mops.gruppen2.service;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
import mops.gruppen2.domain.EventDTO;
import mops.gruppen2.domain.Visibility; import mops.gruppen2.domain.Visibility;
import mops.gruppen2.domain.dto.EventDTO;
import mops.gruppen2.domain.event.CreateGroupEvent; import mops.gruppen2.domain.event.CreateGroupEvent;
import mops.gruppen2.domain.event.Event; import mops.gruppen2.domain.event.Event;
import mops.gruppen2.repository.EventRepository; import mops.gruppen2.repository.EventRepository;

View File

@ -1,6 +1,6 @@
package mops.gruppen2.service; 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.Exceptions.EventException;
import mops.gruppen2.domain.Group; import mops.gruppen2.domain.Group;
import mops.gruppen2.domain.Visibility; import mops.gruppen2.domain.Visibility;

View File

@ -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()));
}
}

View File

@ -2,7 +2,6 @@ package mops.gruppen2.service;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import mops.gruppen2.domain.EventDTO;
import mops.gruppen2.domain.event.Event; import mops.gruppen2.domain.event.Event;
import mops.gruppen2.repository.EventRepository; import mops.gruppen2.repository.EventRepository;
import org.slf4j.Logger; import org.slf4j.Logger;

View File

@ -1,21 +1,19 @@
server.port=8080 server.port=8080
application.name=gruppen2 application.name=gruppen2
logging.pattern.console=[${application.name}],%magenta(%-5level), %d{dd-MM-yyyy HH:mm:ss.SSS}, %highlight(%msg),%thread,%logger.%M%n 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.url=jdbc:h2:mem:blogdb
spring.datasource.driverClassName=org.h2.Driver spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa spring.datasource.username=sa
spring.datasource.password= spring.datasource.password=
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect 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.principal-attribute=preferred_username
keycloak.auth-server-url=https://keycloak.cs.hhu.de/auth keycloak.auth-server-url=https://keycloak.cs.hhu.de/auth
keycloak.realm=MOPS keycloak.realm=MOPS
hhu_keycloak.token-uri=https://keycloak.cs.hhu.de/auth/realms/MOPS/protocol/openid-connect/token hhu_keycloak.token-uri=https://keycloak.cs.hhu.de/auth/realms/MOPS/protocol/openid-connect/token
keycloak.resource=gruppenfindung 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.verify-token-audience=true
keycloak.use-resource-role-mappings=true keycloak.use-resource-role-mappings=true

View File

@ -10,3 +10,12 @@ CREATE TABLE event
event_payload VARCHAR(255), event_payload VARCHAR(255),
visibility BOOLEAN 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
);

View File

@ -1,8 +1,8 @@
package mops.gruppen2.service; package mops.gruppen2.service;
import mops.gruppen2.domain.EventDTO;
import mops.gruppen2.domain.GroupType; import mops.gruppen2.domain.GroupType;
import mops.gruppen2.domain.Visibility; import mops.gruppen2.domain.Visibility;
import mops.gruppen2.domain.dto.EventDTO;
import mops.gruppen2.domain.event.AddUserEvent; import mops.gruppen2.domain.event.AddUserEvent;
import mops.gruppen2.domain.event.CreateGroupEvent; import mops.gruppen2.domain.event.CreateGroupEvent;
import mops.gruppen2.repository.EventRepository; import mops.gruppen2.repository.EventRepository;
@ -14,7 +14,7 @@ import org.mockito.junit.MockitoJUnitRunner;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; 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.mock;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;