diff --git a/build.gradle b/build.gradle index 25ea948..d3c5650 100644 --- a/build.gradle +++ b/build.gradle @@ -68,6 +68,7 @@ dependencies { implementation 'io.springfox:springfox-swagger2:2.9.2' implementation 'io.springfox:springfox-swagger-ui:2.9.2' implementation 'com.github.javafaker:javafaker:1.0.2' + implementation 'com.fasterxml.jackson.dataformat:jackson-dataformat-csv:2.10.2' compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' @@ -77,6 +78,8 @@ dependencies { compile group: 'org.springframework.security.oauth', name: 'spring-security-oauth2', version: '2.4.0.RELEASE' + compile 'com.fasterxml.jackson.dataformat:jackson-dataformat-csv:2.10.3' + testImplementation 'org.assertj:assertj-core:3.15.0' testImplementation('org.springframework.boot:spring-boot-starter-test') { exclude group: 'org.junit.vintage', module: 'junit-vintage-engine' diff --git a/src/main/java/mops/gruppen2/controller/APIController.java b/src/main/java/mops/gruppen2/controller/APIController.java index 459e125..28ce4f5 100644 --- a/src/main/java/mops/gruppen2/controller/APIController.java +++ b/src/main/java/mops/gruppen2/controller/APIController.java @@ -7,13 +7,13 @@ import mops.gruppen2.domain.Exceptions.EventException; import mops.gruppen2.domain.Group; import mops.gruppen2.domain.apiWrapper.UpdatedGroupRequestMapper; import mops.gruppen2.domain.event.Event; -import mops.gruppen2.service.APIFormatterService; -import mops.gruppen2.service.EventService; -import mops.gruppen2.service.GroupService; -import mops.gruppen2.service.SerializationService; +import mops.gruppen2.service.*; import org.springframework.security.access.annotation.Secured; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import java.io.IOException; +import java.io.InputStream; import java.util.List; /** @@ -59,4 +59,5 @@ public class APIController { List groups = groupService.projectEventList(eventList); return groups.get(0); } + } diff --git a/src/main/java/mops/gruppen2/controller/Gruppen2Controller.java b/src/main/java/mops/gruppen2/controller/Gruppen2Controller.java index ddedc06..a6bdcca 100644 --- a/src/main/java/mops/gruppen2/controller/Gruppen2Controller.java +++ b/src/main/java/mops/gruppen2/controller/Gruppen2Controller.java @@ -4,6 +4,7 @@ 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.Visibility; import mops.gruppen2.domain.event.CreateGroupEvent; import mops.gruppen2.security.Account; import mops.gruppen2.service.*; @@ -13,13 +14,18 @@ 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.multipart.MultipartFile; import org.springframework.web.server.ResponseStatusException; import javax.annotation.security.RolesAllowed; +import java.io.IOException; import java.util.ArrayList; import java.util.List; @Controller +@SessionScope @RequestMapping("/gruppen2") public class Gruppen2Controller { @@ -54,14 +60,36 @@ public class Gruppen2Controller { public String index(KeycloakAuthenticationToken token, Model model) throws EventException { Account account = keyCloakService.createAccountFromPrincipal(token); User user = new User(account.getName(), account.getGivenname(), account.getFamilyname(), account.getEmail()); - model.addAttribute("account", keyCloakService.createAccountFromPrincipal(token)); model.addAttribute("gruppen", userService.getUserGroups(user)); model.addAttribute("user", user); return "index"; } - @RolesAllowed({"ROLE_orga", "ROLE_studentin", "ROLE_actuator"}) + @RolesAllowed({"ROLE_orga", "ROLE_actuator)"}) + @GetMapping("/createLecture") + public String createLecture(KeycloakAuthenticationToken token, Model model) { + model.addAttribute("account", keyCloakService.createAccountFromPrincipal(token)); + return "createLecture"; + } + + @RolesAllowed({"ROLE_orga", "ROLE_actuator)"}) + @PostMapping("/createLecture") + public String pCreateLecture(KeycloakAuthenticationToken token, + @RequestParam(value = "title") String title, + @RequestParam(value = "beschreibung") String beschreibung, + @RequestParam(value = "visibility", required = false) Boolean visibility, + @RequestParam("file") MultipartFile file) throws IOException { + + Account account = keyCloakService.createAccountFromPrincipal(token); + List userList = CsvService.read(file.getInputStream()); + visibility = visibility == null; + controllerService.createLecture(account, title, beschreibung, visibility, userList); + + return "redirect:/gruppen2/"; + } + + @RolesAllowed({"ROLE_orga", "ROLE_studentin", "ROLE_actuator)"}) @GetMapping("/createGroup") public String createGroup(KeycloakAuthenticationToken token, Model model) { model.addAttribute("account", keyCloakService.createAccountFromPrincipal(token)); diff --git a/src/main/java/mops/gruppen2/domain/User.java b/src/main/java/mops/gruppen2/domain/User.java index c929135..5e103ae 100644 --- a/src/main/java/mops/gruppen2/domain/User.java +++ b/src/main/java/mops/gruppen2/domain/User.java @@ -3,10 +3,11 @@ package mops.gruppen2.domain; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; -import lombok.Value; +import lombok.NoArgsConstructor; -@Value +@Data @AllArgsConstructor +@NoArgsConstructor @EqualsAndHashCode(exclude = {"givenname", "familyname", "email"}) public class User { String user_id; diff --git a/src/main/java/mops/gruppen2/service/ControllerService.java b/src/main/java/mops/gruppen2/service/ControllerService.java index 48e8f75..b4ce5dc 100644 --- a/src/main/java/mops/gruppen2/service/ControllerService.java +++ b/src/main/java/mops/gruppen2/service/ControllerService.java @@ -1,9 +1,6 @@ package mops.gruppen2.service; -import mops.gruppen2.domain.Group; -import mops.gruppen2.domain.GroupType; -import mops.gruppen2.domain.Role; -import mops.gruppen2.domain.Visibility; +import mops.gruppen2.domain.*; import mops.gruppen2.domain.event.*; import mops.gruppen2.security.Account; import org.springframework.stereotype.Service; @@ -34,16 +31,17 @@ public class ControllerService { * @param description Gruppenbeschreibung */ public void createGroup(Account account, String title, String description, Boolean visibility) { - Long group_id = eventService.checkGroup(); Visibility visibility1; - if (visibility) { + Long group_id = eventService.checkGroup(); + + if(visibility) { visibility1 = Visibility.PUBLIC; } else { visibility1 = Visibility.PRIVATE; createInviteLink(group_id); } - CreateGroupEvent createGroupEvent = new CreateGroupEvent(group_id, account.getName(), null , GroupType.LECTURE, visibility1); + CreateGroupEvent createGroupEvent = new CreateGroupEvent(group_id, account.getName(), null , GroupType.SIMPLE, visibility1); eventService.saveEvent(createGroupEvent); addUser(account, group_id); @@ -62,6 +60,13 @@ public class ControllerService { eventService.saveEvent(addUserEvent); } + public void addUserList(List users, Long group_id) { + for (User user : users) { + AddUserEvent addUserEvent = new AddUserEvent(group_id, user.getUser_id(), user.getGivenname(), user.getFamilyname(), user.getEmail()); + eventService.saveEvent(addUserEvent); + } + } + public void updateTitle(Account account, Long group_id, String title){ UpdateGroupTitleEvent updateGroupTitleEvent = new UpdateGroupTitleEvent(group_id,account.getName(),title); eventService.saveEvent(updateGroupTitleEvent); @@ -81,4 +86,24 @@ public class ControllerService { DeleteUserEvent deleteUserEvent = new DeleteUserEvent(group_id,account.getName()); eventService.saveEvent(deleteUserEvent); } + + public void createLecture(Account account, String title, String description, Boolean visibility, List users) { + Visibility visibility1; + Long group_id = eventService.checkGroup(); + + if (visibility) { + visibility1 = Visibility.PUBLIC; + } else { + visibility1 = Visibility.PRIVATE; + } + + CreateGroupEvent createGroupEvent = new CreateGroupEvent(group_id, account.getName(), null, GroupType.LECTURE, visibility1); + eventService.saveEvent(createGroupEvent); + + addUser(account, group_id); + updateTitle(account, group_id, title); + updateDescription(account, group_id, description); + updateRole(account, group_id); + addUserList(users, group_id); + } } diff --git a/src/main/java/mops/gruppen2/service/CsvService.java b/src/main/java/mops/gruppen2/service/CsvService.java new file mode 100644 index 0000000..a876d04 --- /dev/null +++ b/src/main/java/mops/gruppen2/service/CsvService.java @@ -0,0 +1,24 @@ +package mops.gruppen2.service; + +import com.fasterxml.jackson.databind.ObjectReader; +import com.fasterxml.jackson.dataformat.csv.CsvMapper; +import com.fasterxml.jackson.dataformat.csv.CsvSchema; +import mops.gruppen2.domain.User; +import org.springframework.stereotype.Service; + +import java.io.IOException; +import java.io.InputStream; +import java.util.List; + +@Service +public class CsvService { + + public static List read(InputStream stream) throws IOException { + CsvMapper mapper = new CsvMapper(); + + CsvSchema schema = mapper.schemaFor(User.class).withHeader().withColumnReordering(true); + ObjectReader reader = mapper.readerFor(User.class).with(schema); + + return reader.readValues(stream).readAll(); + } +} diff --git a/src/main/resources/templates/create.html b/src/main/resources/templates/create.html index f9084b8..c43add0 100644 --- a/src/main/resources/templates/create.html +++ b/src/main/resources/templates/create.html @@ -22,6 +22,9 @@
  • Suche
  • +
  • + Veranstaltung +
  • @@ -64,4 +67,4 @@ - \ No newline at end of file + diff --git a/src/main/resources/templates/createLecture.html b/src/main/resources/templates/createLecture.html new file mode 100644 index 0000000..e6fb1e5 --- /dev/null +++ b/src/main/resources/templates/createLecture.html @@ -0,0 +1,70 @@ + + + + + Gruppenerstellung + + + + + +
    + +
    +
    +
    +
    +
    +

    Veranstaltung erstellen

    +
    +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    +
    +
    +
    + + +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    + + \ No newline at end of file diff --git a/src/main/resources/templates/detailsMember.html b/src/main/resources/templates/detailsMember.html index 6086619..935d4d1 100644 --- a/src/main/resources/templates/detailsMember.html +++ b/src/main/resources/templates/detailsMember.html @@ -21,6 +21,9 @@
  • Suche
  • +
  • + Veranstaltung +
  • diff --git a/src/main/resources/templates/detailsNoMember.html b/src/main/resources/templates/detailsNoMember.html index 44f1dfd..eb8a506 100644 --- a/src/main/resources/templates/detailsNoMember.html +++ b/src/main/resources/templates/detailsNoMember.html @@ -21,6 +21,9 @@
  • Suche
  • +
  • + Veranstaltung +
  • diff --git a/src/main/resources/templates/index.html b/src/main/resources/templates/index.html index 9b9ea12..6ebad4a 100644 --- a/src/main/resources/templates/index.html +++ b/src/main/resources/templates/index.html @@ -21,6 +21,10 @@
  • Suche
  • + +
  • + Veranstaltung +
  • diff --git a/src/main/resources/templates/search.html b/src/main/resources/templates/search.html index 624e933..b06443b 100644 --- a/src/main/resources/templates/search.html +++ b/src/main/resources/templates/search.html @@ -21,6 +21,9 @@
  • Suche
  • +
  • + Veranstaltung +