1

Merge pull request #33 from hhu-propra2/Services

Services
This commit is contained in:
Lukas Ettel
2020-03-06 16:56:13 +01:00
committed by GitHub
23 changed files with 351 additions and 51 deletions

View File

@ -63,6 +63,7 @@ dependencies {
compile group: 'io.springfox', name: 'springfox-swagger-ui', version: '2.7.0'
compileOnly 'org.projectlombok:lombok'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
testImplementation 'org.assertj:assertj-core:3.15.0'
runtimeOnly 'com.h2database:h2'
annotationProcessor 'org.projectlombok:lombok'
testImplementation('org.springframework.boot:spring-boot-starter-test') {

View File

@ -1,32 +1,24 @@
package mops.gruppen2.controllers;
import javax.annotation.security.RolesAllowed;
import mops.gruppen2.security.Account;
import org.keycloak.KeycloakPrincipal;
import mops.gruppen2.services.KeyCloakService;
import org.keycloak.adapters.springsecurity.token.KeycloakAuthenticationToken;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.context.annotation.SessionScope;
@SessionScope
import javax.annotation.security.RolesAllowed;
@Controller
@RequestMapping("/gruppen2")
public class Gruppen2Controller {
/**
* Creates an Account.
*
* @param token Ein toller token
* @return Account with current userdata
*/
private Account createAccountFromPrincipal(KeycloakAuthenticationToken token) {
KeycloakPrincipal principal = (KeycloakPrincipal) token.getPrincipal();
return new Account(
principal.getName(),
principal.getKeycloakSecurityContext().getIdToken().getEmail(),
null,
principal.getKeycloakSecurityContext().getIdToken().getGivenName(),
principal.getKeycloakSecurityContext().getIdToken().getFamilyName(),
token.getAccount().getRoles());
private final KeyCloakService keyCloakService;
public Gruppen2Controller(KeyCloakService keyCloakService) {
this.keyCloakService = keyCloakService;
}
/**Zeigt die index.html an.
@ -35,10 +27,10 @@ public class Gruppen2Controller {
* @param model tolles model
* @return index.html
*/
@GetMapping("/")
@RolesAllowed({"ROLE_orga", "ROLE_studentin", "ROLE_actuator)"})
@GetMapping("")
public String index(KeycloakAuthenticationToken token, Model model) {
model.addAttribute("account", createAccountFromPrincipal(token));
model.addAttribute("account", keyCloakService.createAccountFromPrincipal(token));
return "index";
}
}

View File

@ -1,4 +1,4 @@
package mops.gruppen2.entities;
public class Admin extends Teilnehmer{
public class Admin extends Rolle {
}

View File

@ -0,0 +1,23 @@
package mops.gruppen2.entities;
import mops.gruppen2.events.Event;
import java.lang.reflect.Method;
public abstract class Aggregat {
/**
* Ruft die spezifische applyEvent-Methode im entsprechenden Aggregat auf.
*
* @param event
*/
public void applyEvent(Event event) {
try {
Method method = this.getClass().getDeclaredMethod("applyEvent", event.getClass());
method.setAccessible(true);
method.invoke(this, event);
} catch (Exception e) {
e.printStackTrace();
}
}
}

View File

@ -1,15 +1,69 @@
package mops.gruppen2.entities;
import lombok.Data;
import org.springframework.data.annotation.Id;
import lombok.EqualsAndHashCode;
import mops.gruppen2.events.*;
import mops.gruppen2.events.AddUser;
import mops.gruppen2.events.CreateGroupEvent;
import mops.gruppen2.events.UpdateGroupDescriptionEvent;
import mops.gruppen2.events.UpdateGroupTitleEvent;
import mops.gruppen2.events.DeleteUserEvent;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@EqualsAndHashCode(callSuper=false)
@Data
public class Gruppe {
@Id
Long id;
public class Gruppe extends Aggregat {
long id;
String titel;
String beschreibung;
List<Teilnehmer> teilnehmersList;
Map<Teilnehmer, Rolle> rollenList;
public void applyEvent(CreateGroupEvent event){
this.id = event.getGruppe_id();
this.titel = event.getTitel();
this.beschreibung = event.getBeschreibung();
this.teilnehmersList = new ArrayList<>();
this.rollenList = new HashMap<>();
}
public void applyEvent(UpdateRoleEvent event) {
teilnehmersList.stream()
.filter(teilnehmer -> teilnehmer.getId().equals(event.getUser_id()))
.findFirst()
.ifPresentOrElse(teilnehmer -> rollenList.put(teilnehmer, event.getRole()),
() -> System.out.println("UserNotFoundException"));
}
public void applyEvent(AddUser event){
Teilnehmer teilnehmer = new Teilnehmer();
teilnehmer.setId(event.getUser_id());
teilnehmer.setVorname(event.getVorname());
teilnehmer.setNachname(event.getNachname());
teilnehmer.setEmail(event.getEmail());
this.teilnehmersList.add(teilnehmer);
}
public void applyEvent(UpdateGroupTitleEvent event) {
this.titel = event.getTitel();
}
public void applyEvent(UpdateGroupDescriptionEvent event) {
this.beschreibung = event.getBeschreibung();
}
public void applyEvent(DeleteUserEvent event) {
for (Teilnehmer teilnehmer: teilnehmersList) {
if (teilnehmer.getId().equals(event.getUser_id())) {
this.teilnehmersList.remove(teilnehmer);
break;
}
}
}
}

View File

@ -1,6 +0,0 @@
package mops.gruppen2.entities;
import org.springframework.data.repository.CrudRepository;
public interface GruppeRepository extends CrudRepository<Gruppe,Long> {
}

View File

@ -0,0 +1,4 @@
package mops.gruppen2.entities;
public class Orga extends Rolle {
}

View File

@ -0,0 +1,5 @@
package mops.gruppen2.entities;
public class Rolle {
}

View File

@ -1,10 +0,0 @@
package mops.gruppen2.entities;
import lombok.Data;
import org.springframework.data.annotation.Id;
import java.util.List;
public class Student extends Teilnehmer{
}

View File

@ -1,14 +1,12 @@
package mops.gruppen2.entities;
import lombok.Data;
import org.springframework.data.annotation.Id;
import java.util.List;
@Data
public class Teilnehmer {
@Id
Long id;
String id;
String vorname;
String nachname;
String email;

View File

@ -1,6 +0,0 @@
package mops.gruppen2.entities;
import org.springframework.data.repository.CrudRepository;
public interface TeilnehmerRepository extends CrudRepository<Teilnehmer,Long> {
}

View File

@ -0,0 +1,15 @@
package mops.gruppen2.events;
import lombok.Getter;
@Getter
public class AddUser extends Event{
String vorname, nachname, email;
public AddUser(long id, long gruppe_id, String user_id, String vorname, String nachname, String email) {
super(id, gruppe_id, user_id);
this.vorname = vorname;
this.nachname = nachname;
this.email = email;
}
}

View File

@ -0,0 +1,15 @@
package mops.gruppen2.events;
import lombok.Getter;
@Getter
public class CreateGroupEvent extends Event {
String titel;
String beschreibung;
public CreateGroupEvent(long id, long gruppe_id, String user_id, String titel, String beschreibung) {
super(id, gruppe_id, user_id);
this.titel = titel;
this.beschreibung = beschreibung;
}
}

View File

@ -0,0 +1,11 @@
package mops.gruppen2.events;
import lombok.Getter;
@Getter
public class DeleteUserEvent extends Event{
public DeleteUserEvent(long id, long gruppe_id, String user_id) {
super(id, gruppe_id, user_id);
}
}

View File

@ -0,0 +1,12 @@
package mops.gruppen2.events;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public class Event {
long id;
long gruppe_id;
String user_id;
}

View File

@ -0,0 +1,13 @@
package mops.gruppen2.events;
import lombok.Getter;
@Getter
public class UpdateGroupDescriptionEvent extends Event {
String beschreibung;
public UpdateGroupDescriptionEvent(long id, long gruppe_id, String user_id, String beschreibung) {
super(id, gruppe_id, user_id);
this.beschreibung = beschreibung;
}
}

View File

@ -0,0 +1,13 @@
package mops.gruppen2.events;
import lombok.Getter;
@Getter
public class UpdateGroupTitleEvent extends Event {
String titel;
public UpdateGroupTitleEvent(long id, long gruppe_id, String user_id, String titel) {
super(id, gruppe_id, user_id);
this.titel = titel;
}
}

View File

@ -0,0 +1,16 @@
package mops.gruppen2.events;
import lombok.Getter;
import mops.gruppen2.entities.Rolle;
@Getter
public class UpdateRoleEvent extends Event {
private final Rolle role;
public UpdateRoleEvent(long id, long gruppe_id, String user_id, Rolle newRole) {
super(id, gruppe_id, user_id);
this.role = newRole;
}
}

View File

@ -0,0 +1,7 @@
package mops.gruppen2.repositories;
import mops.gruppen2.events.Event;
import org.springframework.data.repository.CrudRepository;
public interface EventRepository extends CrudRepository<Event, Long> {
}

View File

@ -0,0 +1,16 @@
package mops.gruppen2.services;
import mops.gruppen2.events.Event;
import mops.gruppen2.entities.Gruppe;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class GruppenService {
Gruppe buildGroup(List<Event> eventList){
Gruppe newGroup = new Gruppe();
eventList.forEach(newGroup::applyEvent);
return newGroup;
}
}

View File

@ -0,0 +1,27 @@
package mops.gruppen2.services;
import mops.gruppen2.security.Account;
import org.keycloak.KeycloakPrincipal;
import org.keycloak.adapters.springsecurity.token.KeycloakAuthenticationToken;
import org.springframework.stereotype.Service;
@Service
public class KeyCloakService {
/**
* Creates an Account.
*
* @param token Ein toller token
* @return Account with current userdata
*/
public Account createAccountFromPrincipal(KeycloakAuthenticationToken token) {
KeycloakPrincipal principal = (KeycloakPrincipal) token.getPrincipal();
return new Account(
principal.getName(),
principal.getKeycloakSecurityContext().getIdToken().getEmail(),
null,
principal.getKeycloakSecurityContext().getIdToken().getGivenName(),
principal.getKeycloakSecurityContext().getIdToken().getFamilyName(),
token.getAccount().getRoles());
}
}

View File

@ -0,0 +1,10 @@
package mops.gruppen2.services;
import org.springframework.stereotype.Service;
/**
* Übersetzt und baut
*/
@Service
public class SerializationService {
}

View File

@ -0,0 +1,90 @@
package mops.gruppen2.entities;
import mops.gruppen2.events.AddUser;
import mops.gruppen2.events.CreateGroupEvent;
import mops.gruppen2.events.UpdateRoleEvent;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertEquals;
class GruppeTest {
AddUser addUser;
CreateGroupEvent createGroupEvent;
@BeforeEach
public void setUp(){
}
@Test
void applyEvent() {
}
@Test
void applyAddUserEvent(){
Gruppe gruppe = new Gruppe();
Gruppe testGruppe = new Gruppe();
Teilnehmer teilnehmer = new Teilnehmer();
addUser = new AddUser(1L,1L,"prof","jens","bendi", "hi@gmail.com");
createGroupEvent = new CreateGroupEvent(1L,1L,"prof1", "hi", "foo");
gruppe.applyEvent(createGroupEvent);
gruppe.applyEvent(addUser);
testGruppe.applyEvent(createGroupEvent);
teilnehmer.setId("prof");
teilnehmer.setVorname("jens");
teilnehmer.setNachname("bendi");
teilnehmer.setEmail("hi@gmail.com");
List<Teilnehmer> testTeil= new ArrayList<>();
testTeil.add(teilnehmer);
testGruppe.setTeilnehmersList(testTeil);
assertEquals(testGruppe,gruppe);
}
// Verwendet CreateGroupEvent und AddUserEvent
@Test
void updateRoleForExistingUser() {
// Arrange
Gruppe gruppe = new Gruppe();
Orga orga = new Orga();
gruppe.applyEvent(new CreateGroupEvent(1L, 1L, "1L", "gruppe1", "Eine Testgruppe"));
gruppe.applyEvent(new AddUser(1L, 1L, "5L", "Peter", "Pan", "123@mail.de"));
// Act
gruppe.applyEvent(new UpdateRoleEvent(1L, 1L, "5L", orga));
// Assert
assertThat(gruppe.getRollenList())
.containsOnlyKeys(gruppe.getTeilnehmersList().get(0))
.containsValue(orga);
}
@Test
void applyCreteGroupEvent() {
String userId = "asd";
CreateGroupEvent event = new CreateGroupEvent(1L,2,userId, "hello", "foo");
Gruppe gruppe1 = new Gruppe();
gruppe1.applyEvent(event);
Gruppe gruppe2 = new Gruppe();
gruppe2.id = 2L;
gruppe2.titel = "hello";
gruppe2.beschreibung = "foo";
gruppe2.teilnehmersList = new ArrayList<>();
gruppe2.rollenList = new HashMap<>();
assertEquals(gruppe2, gruppe1);
}
}