From 008a1c0e3333ad93e88b69f86a00047fbc74d030 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jan=20Pokorn=C3=BD?= <xpokorn8@fi.muni.cz>
Date: Sun, 30 Apr 2023 00:23:12 +0200
Subject: [PATCH] Course entity - adding finished, list of ids;

---
 .../fuseri/model/dto/course/CourseDto.java    |  38 +++--
 .../modulelanguageschool/course/Course.java   |  18 +--
 .../course/CourseMapper.java                  |  62 +++++++-
 .../course/CourseControllerTest.java          |   4 +-
 .../course/CourseFacadeTest.java              |   9 +-
 .../course/CourseMapperTest.java              | 135 +++++++++---------
 .../course/CourseServiceTest.java             |  19 ++-
 7 files changed, 175 insertions(+), 110 deletions(-)

diff --git a/application/model/src/main/java/org/fuseri/model/dto/course/CourseDto.java b/application/model/src/main/java/org/fuseri/model/dto/course/CourseDto.java
index 15588e7e..c9d2d39b 100644
--- a/application/model/src/main/java/org/fuseri/model/dto/course/CourseDto.java
+++ b/application/model/src/main/java/org/fuseri/model/dto/course/CourseDto.java
@@ -10,7 +10,6 @@ import lombok.EqualsAndHashCode;
 import lombok.Getter;
 import lombok.Setter;
 import org.fuseri.model.dto.common.DomainObjectDto;
-import org.fuseri.model.dto.user.UserDto;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -21,15 +20,16 @@ import java.util.List;
  * It extends the DomainObjectDto class and includes additional Course-specific fields.
  */
 @Schema(example = """
-{
-  "id": 1,
-  "name": "english a1",
-  "capacity": 10,
-  "language": "ENGLISH",
-  "proficiency": "A1",
-  "students": []
-}
-        """)
+        {
+          "id": 1,
+          "name": "english a1",
+          "capacity": 10,
+          "language": "ENGLISH",
+          "proficiency": "A1",
+          "students": [],
+          "finished": false
+        }
+                """)
 @Getter
 @Setter
 @EqualsAndHashCode(callSuper = false)
@@ -53,14 +53,26 @@ public class CourseDto extends DomainObjectDto {
 
     @NotNull(message = "Student's list is required")
     @Valid
-    private List<UserDto> students;
+    private List<Long> students;
+
+    @NotNull(message = "Finished status required")
+    @Valid
+    private Boolean finished;
 
-    public CourseDto(String name, Integer capacity, LanguageTypeDto languageTypeDto, ProficiencyLevelDto proficiencyLevelDto) {
+    public CourseDto(String name, Integer capacity, LanguageTypeDto languageTypeDto, ProficiencyLevelDto proficiencyLevelDto, List<Long> students, Boolean finished) {
         this.name = name;
         this.capacity = capacity;
         this.language = languageTypeDto;
         this.proficiency = proficiencyLevelDto;
-        this.students = new ArrayList<>();
+        this.students = students;
+        this.finished = finished;
     }
 
+    public CourseDto(String name, int capacity, LanguageTypeDto languageTypeDto, ProficiencyLevelDto proficiencyLevelDto) {
+        this.name = name;
+        this.capacity = capacity;
+        this.language = languageTypeDto;
+        this.proficiency = proficiencyLevelDto;
+        this.students = new ArrayList<>();
+    }
 }
diff --git a/application/module-language-school/src/main/java/org/fuseri/modulelanguageschool/course/Course.java b/application/module-language-school/src/main/java/org/fuseri/modulelanguageschool/course/Course.java
index fd81844e..ba7635e8 100644
--- a/application/module-language-school/src/main/java/org/fuseri/modulelanguageschool/course/Course.java
+++ b/application/module-language-school/src/main/java/org/fuseri/modulelanguageschool/course/Course.java
@@ -5,8 +5,8 @@ import lombok.*;
 import org.fuseri.modulelanguageschool.common.DomainObject;
 import org.fuseri.modulelanguageschool.user.User;
 
+import java.util.ArrayList;
 import java.util.List;
-import java.util.Set;
 
 @Getter
 @Setter
@@ -30,6 +30,15 @@ public class Course extends DomainObject {
     private List<User> students;
 
     private boolean finished = false;
+
+    public Course(String name, int capacity, Language language, ProficiencyLevel proficiency) {
+        this.name = name;
+        this.capacity = capacity;
+        this.language = language;
+        this.proficiency = proficiency;
+        this.students = new ArrayList<>();
+    }
+
     public void enrolStudent(User student) {
         students.add(student);
     }
@@ -38,13 +47,6 @@ public class Course extends DomainObject {
         students.remove(student);
     }
 
-    public Course(String name, Integer capacity, Language language, ProficiencyLevel proficiency) {
-        this.name = name;
-        this.capacity = capacity;
-        this.language = language;
-        this.proficiency = proficiency;
-    }
-
     public void setFinished(boolean finished) {
         this.finished = finished;
     }
diff --git a/application/module-language-school/src/main/java/org/fuseri/modulelanguageschool/course/CourseMapper.java b/application/module-language-school/src/main/java/org/fuseri/modulelanguageschool/course/CourseMapper.java
index 9a5bf7c0..89d3bbc9 100644
--- a/application/module-language-school/src/main/java/org/fuseri/modulelanguageschool/course/CourseMapper.java
+++ b/application/module-language-school/src/main/java/org/fuseri/modulelanguageschool/course/CourseMapper.java
@@ -2,26 +2,78 @@ package org.fuseri.modulelanguageschool.course;
 
 import org.fuseri.model.dto.course.CourseCreateDto;
 import org.fuseri.model.dto.course.CourseDto;
+import org.fuseri.model.dto.course.LanguageTypeDto;
+import org.fuseri.model.dto.course.ProficiencyLevelDto;
+import org.fuseri.modulelanguageschool.user.User;
+import org.fuseri.modulelanguageschool.user.UserService;
 import org.mapstruct.Mapper;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageImpl;
 
+import java.util.ArrayList;
 import java.util.List;
 
-@Mapper(componentModel = "spring")
+@Mapper(componentModel = "spring", uses = {UserService.class})
 public interface CourseMapper {
 
-    CourseDto mapToDto(Course course);
+    default CourseDto mapToDto(Course course) {
+        if (course == null) {
+            return null;
+        }
 
-    Course mapToCourse(CourseDto courseDto);
+        var dto = new CourseDto(course.getName(),
+                course.getCapacity(),
+                LanguageTypeDto.valueOf(course.getLanguage().name()),
+                ProficiencyLevelDto.valueOf(course.getProficiency().name()),
+                new ArrayList<>(),
+                course.isFinished());
+        dto.setId(course.getId());
+        var students = new ArrayList<Long>();
+        for (User user : course.getStudents()) {
+            students.add(user.getId());
+        }
+        dto.setStudents(students);
+        return dto;
+    }
 
-    List<CourseDto> mapToList(List<Course> persons);
+    default Course mapToCourse(CourseDto dto, UserService userService) {
+        if (dto == null) {
+            return null;
+        }
+        var course = new Course(dto.getName(),
+                dto.getCapacity(),
+                Language.valueOf(dto.getLanguage().name()),
+                ProficiencyLevel.valueOf(dto.getProficiency().name()),
+                new ArrayList<>(),
+                dto.getFinished());
+        course.setId(dto.getId());
+        for (Long userId : dto.getStudents()) {
+            course.enrolStudent(userService.find(userId));
+        }
+        return course;
+    }
 
+    default List<CourseDto> mapToList(List<Course> courses) {
+        if (courses == null) {
+            return null;
+        }
+        return new ArrayList<>(courses.stream().map(this::mapToDto).toList());
+    }
 
     default Page<CourseDto> mapToPageDto(Page<Course> courses) {
         return new PageImpl<>(mapToList(courses.getContent()), courses.getPageable(), courses.getTotalPages());
     }
 
-    Course mapToCourse(CourseCreateDto dto);
+    default Course mapToCourse(CourseCreateDto createDto) {
+        if (createDto == null) {
+            return null;
+        }
+        return new Course(createDto.getName(),
+                createDto.getCapacity(),
+                Language.valueOf(createDto.getLanguage().name()),
+                ProficiencyLevel.valueOf(createDto.getProficiency().name()),
+                new ArrayList<>(),
+                false);
+    }
 }
 
diff --git a/application/module-language-school/src/test/java/org/fuseri/modulelanguageschool/course/CourseControllerTest.java b/application/module-language-school/src/test/java/org/fuseri/modulelanguageschool/course/CourseControllerTest.java
index 7e1cde9f..e2ea898b 100644
--- a/application/module-language-school/src/test/java/org/fuseri/modulelanguageschool/course/CourseControllerTest.java
+++ b/application/module-language-school/src/test/java/org/fuseri/modulelanguageschool/course/CourseControllerTest.java
@@ -34,7 +34,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
 public class CourseControllerTest {
 
     private final CourseCreateDto courseCreateDto = new CourseCreateDto("english b2 course", 10, LanguageTypeDto.ENGLISH, ProficiencyLevelDto.B2);
-    private final CourseDto courseDto = new CourseDto("english b2 course", 10, LanguageTypeDto.ENGLISH, ProficiencyLevelDto.B2);
+    private final CourseDto courseDto = new CourseDto("english b2 course", 10, LanguageTypeDto.ENGLISH, ProficiencyLevelDto.B2, new ArrayList<>(), false);
 
     @Autowired
     ObjectMapper objectMapper;
@@ -210,7 +210,7 @@ public class CourseControllerTest {
         student.setId(1L);
 
         CourseDto courseDtoWithStudent = new CourseDto("english b2 course", 10, LanguageTypeDto.ENGLISH, ProficiencyLevelDto.B2);
-        courseDtoWithStudent.setStudents(new ArrayList<>(List.of(student)));
+        courseDtoWithStudent.setStudents(new ArrayList<>(List.of(student.getId())));
 
         Mockito.when(courseFacade.enrol(ArgumentMatchers.anyLong(),
                 ArgumentMatchers.anyLong())).thenReturn(courseDtoWithStudent);
diff --git a/application/module-language-school/src/test/java/org/fuseri/modulelanguageschool/course/CourseFacadeTest.java b/application/module-language-school/src/test/java/org/fuseri/modulelanguageschool/course/CourseFacadeTest.java
index 11cc6485..c1567d67 100644
--- a/application/module-language-school/src/test/java/org/fuseri/modulelanguageschool/course/CourseFacadeTest.java
+++ b/application/module-language-school/src/test/java/org/fuseri/modulelanguageschool/course/CourseFacadeTest.java
@@ -5,9 +5,6 @@ import org.fuseri.model.dto.course.CourseCreateDto;
 import org.fuseri.model.dto.course.CourseDto;
 import org.fuseri.model.dto.course.LanguageTypeDto;
 import org.fuseri.model.dto.course.ProficiencyLevelDto;
-import org.fuseri.model.dto.user.AddressDto;
-import org.fuseri.model.dto.user.UserDto;
-import org.fuseri.model.dto.user.UserType;
 import org.fuseri.modulelanguageschool.user.User;
 import org.fuseri.modulelanguageschool.user.UserService;
 import org.junit.jupiter.api.Test;
@@ -20,6 +17,7 @@ import org.springframework.data.domain.PageImpl;
 import org.springframework.data.domain.PageRequest;
 import org.springframework.data.domain.Pageable;
 
+import java.util.ArrayList;
 import java.util.List;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -34,10 +32,8 @@ import static org.mockito.Mockito.when;
 @AutoConfigureMockMvc
 final class CourseFacadeTest {
 
-    private final UserDto USER = new UserDto("novakovat",
-            "novakova@gamil.com", "Tereza", "Nováková", new AddressDto(), UserType.STUDENT);
     private final CourseDto courseDto = new CourseDto("AJ1", 10,
-            LanguageTypeDto.ENGLISH, ProficiencyLevelDto.A1);
+            LanguageTypeDto.ENGLISH, ProficiencyLevelDto.A1, new ArrayList<>(), false);
     private final CourseCreateDto courseCreateDto = new CourseCreateDto("AJ1", 10,
             LanguageTypeDto.ENGLISH, ProficiencyLevelDto.A1);
     private final Course course = new Course();
@@ -151,5 +147,4 @@ final class CourseFacadeTest {
         assertEquals(courseDto, actualDto);
     }
 
-
 }
diff --git a/application/module-language-school/src/test/java/org/fuseri/modulelanguageschool/course/CourseMapperTest.java b/application/module-language-school/src/test/java/org/fuseri/modulelanguageschool/course/CourseMapperTest.java
index 8e873766..6dcc56d1 100644
--- a/application/module-language-school/src/test/java/org/fuseri/modulelanguageschool/course/CourseMapperTest.java
+++ b/application/module-language-school/src/test/java/org/fuseri/modulelanguageschool/course/CourseMapperTest.java
@@ -4,6 +4,7 @@ import org.fuseri.model.dto.course.CourseCreateDto;
 import org.fuseri.model.dto.course.CourseDto;
 import org.fuseri.model.dto.course.LanguageTypeDto;
 import org.fuseri.model.dto.course.ProficiencyLevelDto;
+import org.fuseri.modulelanguageschool.user.UserService;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
@@ -13,98 +14,102 @@ import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageImpl;
 import org.springframework.data.domain.PageRequest;
 
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
 @SpringBootTest
 final class CourseMapperTest {
 
-        private final CourseDto courseDto = new CourseDto("AJ1", 10,
-                LanguageTypeDto.ENGLISH, ProficiencyLevelDto.A1);
-        private final CourseCreateDto courseCreateDto = new CourseCreateDto("AJ1", 10,
+    private final CourseDto courseDto = new CourseDto("AJ1", 10,
+            LanguageTypeDto.ENGLISH, ProficiencyLevelDto.A1, new ArrayList<>(), false);
+    private final CourseCreateDto courseCreateDto = new CourseCreateDto("AJ1", 10,
             LanguageTypeDto.ENGLISH, ProficiencyLevelDto.A1);
-        private final Course course = new Course("AJ1", 10,
-                Language.ENGLISH, ProficiencyLevel.A1);
-        @Autowired
-        private CourseMapper CourseMapper;
+    private final Course course = new Course("AJ1", 10,
+            Language.ENGLISH, ProficiencyLevel.A1);
 
-        @BeforeEach
-        void setUp()
-        {
-            course.setId(1L);
-            courseDto.setId(1L);
-        }
+    @Autowired
+    private CourseMapper CourseMapper;
 
-        @Test
-        void mapNullToDto() {
-            var createdDto = CourseMapper.mapToDto(null);
+    @Autowired
+    private UserService userService;
 
-            Assertions.assertNull(createdDto);
-        }
+    @BeforeEach
+    void setUp() {
+        course.setId(1L);
+        courseDto.setId(1L);
+    }
 
-        @Test
-        void mapToDto() {
-            var createdDto = CourseMapper.mapToDto(course);
+    @Test
+    void mapNullToDto() {
+        var createdDto = CourseMapper.mapToDto(null);
 
-            Assertions.assertNotNull(createdDto);
-        }
+        Assertions.assertNull(createdDto);
+    }
 
-        @Test
-        void mapNullToCourseCourseDto() {
-            var createdCourse = CourseMapper.mapToCourse((CourseDto) null);
+    @Test
+    void mapToDto() {
+        var createdDto = CourseMapper.mapToDto(course);
 
-            Assertions.assertNull(createdCourse);
-        }
+        Assertions.assertNotNull(createdDto);
+    }
 
-        @Test
-        void mapToCourseCourseDto() {
-            var createdCourse = CourseMapper.mapToCourse(courseDto);
+    @Test
+    void mapNullToCourseCourseDto() {
+        var createdCourse = CourseMapper.mapToCourse((CourseDto) null, null);
 
-            Assertions.assertNotNull(createdCourse);
-        }
+        Assertions.assertNull(createdCourse);
+    }
 
-        @Test
-        void mapNullToList() {
-            var courseDtos = CourseMapper.mapToList(null);
+    @Test
+    void mapToCourseCourseDto() {
+        var createdCourse = CourseMapper.mapToCourse(courseDto, userService);
 
-            Assertions.assertNull(courseDtos);
-        }
+        Assertions.assertNotNull(createdCourse);
+    }
 
-        @Test
-        void mapToEmptyList() {
-            var courseDtos = CourseMapper.mapToList(Collections.emptyList());
+    @Test
+    void mapNullToList() {
+        var courseDtos = CourseMapper.mapToList(null);
 
-            Assertions.assertEquals(courseDtos.size(), 0);
-        }
+        Assertions.assertNull(courseDtos);
+    }
 
-        @Test
-        void mapToList() {
-            var courseDtos = CourseMapper.mapToList(Collections.singletonList(course));
+    @Test
+    void mapToEmptyList() {
+        var courseDtos = CourseMapper.mapToList(Collections.emptyList());
 
-            Assertions.assertEquals(1, courseDtos.size());
-        }
+        Assertions.assertEquals(courseDtos.size(), 0);
+    }
 
-        @Test
-        void mapToEmptyPageDto() {
-            Page<CourseDto> pageDto = CourseMapper.mapToPageDto(Page.empty());
+    @Test
+    void mapToList() {
+        var courseDtos = CourseMapper.mapToList(Collections.singletonList(course));
 
-            Assertions.assertEquals(1, pageDto.getTotalPages());
-        }
+        Assertions.assertEquals(1, courseDtos.size());
+    }
 
-        @Test
-        void mapToPageDto() {
-            List<Course> courses = List.of(course);
-            Page<Course> page = new PageImpl<>(courses, PageRequest.of(0, 1), courses.size());
-            Page<CourseDto> pageDto = CourseMapper.mapToPageDto(page);
+    @Test
+    void mapToEmptyPageDto() {
+        Page<CourseDto> pageDto = CourseMapper.mapToPageDto(Page.empty());
 
-            Assertions.assertEquals(page.getTotalPages(), pageDto.getTotalPages());
-            Assertions.assertEquals(page.getNumber(), pageDto.getNumber());
-            Assertions.assertEquals(page.getNumberOfElements(), pageDto.getNumberOfElements());
-            Assertions.assertEquals(page.getSize(), pageDto.getSize());
-            Assertions.assertEquals(page.getTotalElements(), pageDto.getTotalElements());
+        Assertions.assertEquals(1, pageDto.getTotalPages());
+    }
+
+    @Test
+    void mapToPageDto() {
+        List<Course> courses = List.of(course);
+        Page<Course> page = new PageImpl<>(courses, PageRequest.of(0, 1), courses.size());
+        Page<CourseDto> pageDto = CourseMapper.mapToPageDto(page);
+
+        Assertions.assertEquals(page.getTotalPages(), pageDto.getTotalPages());
+        Assertions.assertEquals(page.getNumber(), pageDto.getNumber());
+        Assertions.assertEquals(page.getNumberOfElements(), pageDto.getNumberOfElements());
+        Assertions.assertEquals(page.getSize(), pageDto.getSize());
+        Assertions.assertEquals(page.getTotalElements(), pageDto.getTotalElements());
 
 //            Assertions.assertEquals(courseDto, pageDto.getContent().get(0));
-        }
+    }
 
     @Test
     void mapNullToCourseCourseCreateDto() {
@@ -119,5 +124,5 @@ final class CourseMapperTest {
 
         Assertions.assertEquals(course, createdCourse);
     }
-    
+
 }
diff --git a/application/module-language-school/src/test/java/org/fuseri/modulelanguageschool/course/CourseServiceTest.java b/application/module-language-school/src/test/java/org/fuseri/modulelanguageschool/course/CourseServiceTest.java
index 5b952e05..3d92ba18 100644
--- a/application/module-language-school/src/test/java/org/fuseri/modulelanguageschool/course/CourseServiceTest.java
+++ b/application/module-language-school/src/test/java/org/fuseri/modulelanguageschool/course/CourseServiceTest.java
@@ -21,22 +21,21 @@ import static org.mockito.Mockito.*;
 @SpringBootTest
 final class CourseServiceTest {
 
-    @MockBean
-    private CourseRepository courseRepository;
-
-    @Autowired
-    private CourseService courseService;
-
-    private final Course course =  new Course("AJ1", 10,
-            Language.ENGLISH, ProficiencyLevel.A1, new ArrayList<>(), false);
-
+    private final Course course = new Course("AJ1", 10,
+            Language.ENGLISH, ProficiencyLevel.A1);
     private final User user = new User("novakovat", UserType.STUDENT,
-           "novakova@gamil.com", "password", "Tereza",
+            "novakova@gamil.com", "password", "Tereza",
             "Nováková", new Address(), new HashSet<>(), new HashMap<>());
     private final Course courseWithEnrolledStudent = new Course("AJ1", 10,
             Language.ENGLISH, ProficiencyLevel.A1, new ArrayList<>(List.of(user)), false);
     private final List<Course> courses = List.of(course, course);
 
+    @MockBean
+    private CourseRepository courseRepository;
+
+    @Autowired
+    private CourseService courseService;
+
     @Test
     void save() {
         when(courseRepository.save(course)).thenReturn(course);
-- 
GitLab