diff --git a/build.gradle b/build.gradle index 15f22d4..18cce31 100644 --- a/build.gradle +++ b/build.gradle @@ -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') { diff --git a/src/main/java/mops/gruppen2/controllers/Gruppen2Controller.java b/src/main/java/mops/gruppen2/controllers/Gruppen2Controller.java index 2f9fab5..eea8b70 100644 --- a/src/main/java/mops/gruppen2/controllers/Gruppen2Controller.java +++ b/src/main/java/mops/gruppen2/controllers/Gruppen2Controller.java @@ -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"; } } diff --git a/src/main/java/mops/gruppen2/entities/Admin.java b/src/main/java/mops/gruppen2/entities/Admin.java index c4d6e46..dcc21d8 100644 --- a/src/main/java/mops/gruppen2/entities/Admin.java +++ b/src/main/java/mops/gruppen2/entities/Admin.java @@ -1,4 +1,4 @@ package mops.gruppen2.entities; -public class Admin extends Teilnehmer{ +public class Admin extends Rolle { } diff --git a/src/main/java/mops/gruppen2/entities/Aggregat.java b/src/main/java/mops/gruppen2/entities/Aggregat.java new file mode 100644 index 0000000..a259113 --- /dev/null +++ b/src/main/java/mops/gruppen2/entities/Aggregat.java @@ -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(); + } + } +} diff --git a/src/main/java/mops/gruppen2/entities/Gruppe.java b/src/main/java/mops/gruppen2/entities/Gruppe.java index f02bc9d..0a7ba4e 100644 --- a/src/main/java/mops/gruppen2/entities/Gruppe.java +++ b/src/main/java/mops/gruppen2/entities/Gruppe.java @@ -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 teilnehmersList; + Map 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; + } + } + } } diff --git a/src/main/java/mops/gruppen2/entities/GruppeRepository.java b/src/main/java/mops/gruppen2/entities/GruppeRepository.java deleted file mode 100644 index 5064219..0000000 --- a/src/main/java/mops/gruppen2/entities/GruppeRepository.java +++ /dev/null @@ -1,6 +0,0 @@ -package mops.gruppen2.entities; - -import org.springframework.data.repository.CrudRepository; - -public interface GruppeRepository extends CrudRepository { -} diff --git a/src/main/java/mops/gruppen2/entities/Orga.java b/src/main/java/mops/gruppen2/entities/Orga.java new file mode 100644 index 0000000..ad86b27 --- /dev/null +++ b/src/main/java/mops/gruppen2/entities/Orga.java @@ -0,0 +1,4 @@ +package mops.gruppen2.entities; + +public class Orga extends Rolle { +} diff --git a/src/main/java/mops/gruppen2/entities/Rolle.java b/src/main/java/mops/gruppen2/entities/Rolle.java new file mode 100644 index 0000000..1a7bb04 --- /dev/null +++ b/src/main/java/mops/gruppen2/entities/Rolle.java @@ -0,0 +1,5 @@ +package mops.gruppen2.entities; + +public class Rolle { + +} diff --git a/src/main/java/mops/gruppen2/entities/Student.java b/src/main/java/mops/gruppen2/entities/Student.java deleted file mode 100644 index d3aeeb4..0000000 --- a/src/main/java/mops/gruppen2/entities/Student.java +++ /dev/null @@ -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{ - -} diff --git a/src/main/java/mops/gruppen2/entities/Teilnehmer.java b/src/main/java/mops/gruppen2/entities/Teilnehmer.java index ef665b9..8eff602 100644 --- a/src/main/java/mops/gruppen2/entities/Teilnehmer.java +++ b/src/main/java/mops/gruppen2/entities/Teilnehmer.java @@ -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; diff --git a/src/main/java/mops/gruppen2/entities/TeilnehmerRepository.java b/src/main/java/mops/gruppen2/entities/TeilnehmerRepository.java deleted file mode 100644 index 9f08a23..0000000 --- a/src/main/java/mops/gruppen2/entities/TeilnehmerRepository.java +++ /dev/null @@ -1,6 +0,0 @@ -package mops.gruppen2.entities; - -import org.springframework.data.repository.CrudRepository; - -public interface TeilnehmerRepository extends CrudRepository { -} diff --git a/src/main/java/mops/gruppen2/events/AddUser.java b/src/main/java/mops/gruppen2/events/AddUser.java new file mode 100644 index 0000000..bb705b5 --- /dev/null +++ b/src/main/java/mops/gruppen2/events/AddUser.java @@ -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; + } +} diff --git a/src/main/java/mops/gruppen2/events/CreateGroupEvent.java b/src/main/java/mops/gruppen2/events/CreateGroupEvent.java new file mode 100644 index 0000000..cae95c3 --- /dev/null +++ b/src/main/java/mops/gruppen2/events/CreateGroupEvent.java @@ -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; + } +} diff --git a/src/main/java/mops/gruppen2/events/DeleteUserEvent.java b/src/main/java/mops/gruppen2/events/DeleteUserEvent.java new file mode 100644 index 0000000..97924ce --- /dev/null +++ b/src/main/java/mops/gruppen2/events/DeleteUserEvent.java @@ -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); + } +} diff --git a/src/main/java/mops/gruppen2/events/Event.java b/src/main/java/mops/gruppen2/events/Event.java new file mode 100644 index 0000000..da9c4e6 --- /dev/null +++ b/src/main/java/mops/gruppen2/events/Event.java @@ -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; +} diff --git a/src/main/java/mops/gruppen2/events/UpdateGroupDescriptionEvent.java b/src/main/java/mops/gruppen2/events/UpdateGroupDescriptionEvent.java new file mode 100644 index 0000000..232fe56 --- /dev/null +++ b/src/main/java/mops/gruppen2/events/UpdateGroupDescriptionEvent.java @@ -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; + } +} diff --git a/src/main/java/mops/gruppen2/events/UpdateGroupTitleEvent.java b/src/main/java/mops/gruppen2/events/UpdateGroupTitleEvent.java new file mode 100644 index 0000000..4829561 --- /dev/null +++ b/src/main/java/mops/gruppen2/events/UpdateGroupTitleEvent.java @@ -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; + } +} diff --git a/src/main/java/mops/gruppen2/events/UpdateRoleEvent.java b/src/main/java/mops/gruppen2/events/UpdateRoleEvent.java new file mode 100644 index 0000000..a9d5141 --- /dev/null +++ b/src/main/java/mops/gruppen2/events/UpdateRoleEvent.java @@ -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; + } +} diff --git a/src/main/java/mops/gruppen2/repositories/EventRepository.java b/src/main/java/mops/gruppen2/repositories/EventRepository.java new file mode 100644 index 0000000..a3b329d --- /dev/null +++ b/src/main/java/mops/gruppen2/repositories/EventRepository.java @@ -0,0 +1,7 @@ +package mops.gruppen2.repositories; + +import mops.gruppen2.events.Event; +import org.springframework.data.repository.CrudRepository; + +public interface EventRepository extends CrudRepository { +} diff --git a/src/main/java/mops/gruppen2/services/GruppenService.java b/src/main/java/mops/gruppen2/services/GruppenService.java new file mode 100644 index 0000000..9e72148 --- /dev/null +++ b/src/main/java/mops/gruppen2/services/GruppenService.java @@ -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 eventList){ + Gruppe newGroup = new Gruppe(); + eventList.forEach(newGroup::applyEvent); + return newGroup; + } +} diff --git a/src/main/java/mops/gruppen2/services/KeyCloakService.java b/src/main/java/mops/gruppen2/services/KeyCloakService.java new file mode 100644 index 0000000..99d2548 --- /dev/null +++ b/src/main/java/mops/gruppen2/services/KeyCloakService.java @@ -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()); + } +} diff --git a/src/main/java/mops/gruppen2/services/SerializationService.java b/src/main/java/mops/gruppen2/services/SerializationService.java new file mode 100644 index 0000000..b8de09a --- /dev/null +++ b/src/main/java/mops/gruppen2/services/SerializationService.java @@ -0,0 +1,10 @@ +package mops.gruppen2.services; + +import org.springframework.stereotype.Service; + +/** + * Übersetzt und baut + */ +@Service +public class SerializationService { +} diff --git a/src/test/java/mops/gruppen2/entities/GruppeTest.java b/src/test/java/mops/gruppen2/entities/GruppeTest.java new file mode 100644 index 0000000..ce7da2f --- /dev/null +++ b/src/test/java/mops/gruppen2/entities/GruppeTest.java @@ -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 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); + } + +} \ No newline at end of file