From b35f3d9900e5a491d8228158fbcf7d424737c2cc Mon Sep 17 00:00:00 2001
From: Dominika Zemanovicova <xzemanov@fi.muni.cz>
Date: Sat, 15 Apr 2023 18:52:56 +0200
Subject: [PATCH] Get rid of mixing DTOs and entities

---
 .../model/dto/course/ProficiencyLevelDto.java | 42 +++++++++++++++----
 .../org/fuseri/model/dto/user/Language.java   | 32 --------------
 .../model/dto/user/ProficiencyLevel.java      | 36 ----------------
 .../model/dto/user/UserAddLanguageDto.java    |  6 ++-
 .../fuseri/model/dto/user/UserCreateDto.java  |  6 ++-
 .../org/fuseri/model/dto/user/UserDto.java    |  7 +++-
 .../modulelanguageschool/user/User.java       |  4 +-
 .../modulelanguageschool/user/UserFacade.java |  7 +++-
 8 files changed, 54 insertions(+), 86 deletions(-)
 delete mode 100644 application/model/src/main/java/org/fuseri/model/dto/user/Language.java
 delete mode 100644 application/model/src/main/java/org/fuseri/model/dto/user/ProficiencyLevel.java

diff --git a/application/model/src/main/java/org/fuseri/model/dto/course/ProficiencyLevelDto.java b/application/model/src/main/java/org/fuseri/model/dto/course/ProficiencyLevelDto.java
index 10697363..0031b4b9 100644
--- a/application/model/src/main/java/org/fuseri/model/dto/course/ProficiencyLevelDto.java
+++ b/application/model/src/main/java/org/fuseri/model/dto/course/ProficiencyLevelDto.java
@@ -1,12 +1,36 @@
 package org.fuseri.model.dto.course;
 
+/**
+ * An enum representing language proficiency levels based on the CEFR standard.
+ */
 public enum ProficiencyLevelDto {
-    A1,
-    A2,
-    B1,
-    B2,
-    C1,
-    C2,
-    C1N,
-    C2N
-}
+
+    A1("Beginner"),
+    A2("Elementary"),
+    B1("Intermediate"),
+    B2("Upper Intermediate"),
+    C1("Advanced"),
+    C2("Proficient"),
+    C1N("Advanced Native speaker"),
+    C2N("Proficient Native speaker");
+
+    private final String description;
+
+    /**
+     * Constructor for LanguageLevel enum.
+     *
+     * @param description a String representing a brief description of the language proficiency level
+     */
+    ProficiencyLevelDto(String description) {
+        this.description = description;
+    }
+
+    /**
+     * Returns a brief description of the language proficiency level.
+     *
+     * @return a String representing the description of the language proficiency level
+     */
+    public String getDescription() {
+        return description;
+    }
+}
\ No newline at end of file
diff --git a/application/model/src/main/java/org/fuseri/model/dto/user/Language.java b/application/model/src/main/java/org/fuseri/model/dto/user/Language.java
deleted file mode 100644
index 79116a0a..00000000
--- a/application/model/src/main/java/org/fuseri/model/dto/user/Language.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package org.fuseri.model.dto.user;
-
-/**
- * An enum representing individual languages.
- */
-public enum Language {
-
-    ENGLISH("English"),
-    GERMAN("Deutsch"),
-    SPANISH("Español"),
-    CZECH("Čeština");
-
-    private final String nativeName;
-
-    /**
-     * Constructor for Language enum.
-     *
-     * @param nativeName a String representing the native name of the language
-     */
-    Language(String nativeName) {
-        this.nativeName = nativeName;
-    }
-
-    /**
-     * Returns the native name of the language.
-     *
-     * @return a String representing the native name of the language
-     */
-    public String getNativeName() {
-        return nativeName;
-    }
-}
diff --git a/application/model/src/main/java/org/fuseri/model/dto/user/ProficiencyLevel.java b/application/model/src/main/java/org/fuseri/model/dto/user/ProficiencyLevel.java
deleted file mode 100644
index 47ea8e15..00000000
--- a/application/model/src/main/java/org/fuseri/model/dto/user/ProficiencyLevel.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package org.fuseri.model.dto.user;
-
-/**
- * An enum representing language proficiency levels based on the CEFR standard.
- */
-public enum ProficiencyLevel {
-
-    A1("Beginner"),
-    A2("Elementary"),
-    B1("Intermediate"),
-    B2("Upper Intermediate"),
-    C1("Advanced"),
-    C2("Proficient"),
-    C1N("Advanced Native speaker"),
-    C2N("Proficient Native speaker");
-
-    private final String description;
-
-    /**
-     * Constructor for LanguageLevel enum.
-     *
-     * @param description a String representing a brief description of the language proficiency level
-     */
-    ProficiencyLevel(String description) {
-        this.description = description;
-    }
-
-    /**
-     * Returns a brief description of the language proficiency level.
-     *
-     * @return a String representing the description of the language proficiency level
-     */
-    public String getDescription() {
-        return description;
-    }
-}
diff --git a/application/model/src/main/java/org/fuseri/model/dto/user/UserAddLanguageDto.java b/application/model/src/main/java/org/fuseri/model/dto/user/UserAddLanguageDto.java
index 7c8f9777..271ce643 100644
--- a/application/model/src/main/java/org/fuseri/model/dto/user/UserAddLanguageDto.java
+++ b/application/model/src/main/java/org/fuseri/model/dto/user/UserAddLanguageDto.java
@@ -5,6 +5,8 @@ import jakarta.validation.constraints.NotNull;
 import lombok.AllArgsConstructor;
 import lombok.Getter;
 import lombok.Setter;
+import org.fuseri.model.dto.course.LanguageTypeDto;
+import org.fuseri.model.dto.course.ProficiencyLevelDto;
 
 @Getter
 @Setter
@@ -13,9 +15,9 @@ public class UserAddLanguageDto {
 
     @NotNull
     @Valid
-    Language language;
+    LanguageTypeDto language;
 
     @NotNull
     @Valid
-    ProficiencyLevel proficiency;
+    ProficiencyLevelDto proficiency;
 }
diff --git a/application/model/src/main/java/org/fuseri/model/dto/user/UserCreateDto.java b/application/model/src/main/java/org/fuseri/model/dto/user/UserCreateDto.java
index 0f07d513..ef7fbecc 100644
--- a/application/model/src/main/java/org/fuseri/model/dto/user/UserCreateDto.java
+++ b/application/model/src/main/java/org/fuseri/model/dto/user/UserCreateDto.java
@@ -6,8 +6,9 @@ import jakarta.validation.constraints.NotNull;
 import lombok.AllArgsConstructor;
 import lombok.Getter;
 import lombok.Setter;
+import org.fuseri.model.dto.course.LanguageTypeDto;
+import org.fuseri.model.dto.course.ProficiencyLevelDto;
 
-import java.util.List;
 import java.util.Map;
 
 @Getter
@@ -37,6 +38,7 @@ public class UserCreateDto {
     @NotNull
     private UserType userType;
 
-    private Map<Language,ProficiencyLevel> languageProficiency;
+    @Valid
+    private Map<LanguageTypeDto, ProficiencyLevelDto> languageProficiency;
 
 }
diff --git a/application/model/src/main/java/org/fuseri/model/dto/user/UserDto.java b/application/model/src/main/java/org/fuseri/model/dto/user/UserDto.java
index a0258db3..5cfe9ff3 100644
--- a/application/model/src/main/java/org/fuseri/model/dto/user/UserDto.java
+++ b/application/model/src/main/java/org/fuseri/model/dto/user/UserDto.java
@@ -1,10 +1,13 @@
 package org.fuseri.model.dto.user;
 
+import jakarta.validation.Valid;
 import jakarta.validation.constraints.NotBlank;
 import jakarta.validation.constraints.NotNull;
 import org.fuseri.model.dto.common.DomainObjectDto;
 import lombok.Getter;
 import lombok.Setter;
+import org.fuseri.model.dto.course.LanguageTypeDto;
+import org.fuseri.model.dto.course.ProficiencyLevelDto;
 
 import java.util.Map;
 
@@ -29,7 +32,9 @@ public class UserDto extends DomainObjectDto {
     @NotNull
     private UserType userType;
 
-    private Map<Language,ProficiencyLevel> languageProficiency;
+    @NotNull
+    @Valid
+    private Map<LanguageTypeDto, ProficiencyLevelDto> languageProficiency;
 
     public UserDto(String username, String email, String firstName, String lastName, AddressDto address) {
         setId(0L);
diff --git a/application/module-language-school/src/main/java/org/fuseri/modulelanguageschool/user/User.java b/application/module-language-school/src/main/java/org/fuseri/modulelanguageschool/user/User.java
index 143a7ccd..390b03e2 100644
--- a/application/module-language-school/src/main/java/org/fuseri/modulelanguageschool/user/User.java
+++ b/application/module-language-school/src/main/java/org/fuseri/modulelanguageschool/user/User.java
@@ -2,10 +2,10 @@ package org.fuseri.modulelanguageschool.user;
 
 import jakarta.persistence.*;
 import lombok.*;
-import org.fuseri.model.dto.user.Language;
-import org.fuseri.model.dto.user.ProficiencyLevel;
 import org.fuseri.modulelanguageschool.common.DomainObject;
 import org.fuseri.modulelanguageschool.course.Course;
+import org.fuseri.modulelanguageschool.course.Language;
+import org.fuseri.modulelanguageschool.course.ProficiencyLevel;
 
 import java.util.Map;
 import java.util.Set;
diff --git a/application/module-language-school/src/main/java/org/fuseri/modulelanguageschool/user/UserFacade.java b/application/module-language-school/src/main/java/org/fuseri/modulelanguageschool/user/UserFacade.java
index 73ad519f..0f29f752 100644
--- a/application/module-language-school/src/main/java/org/fuseri/modulelanguageschool/user/UserFacade.java
+++ b/application/module-language-school/src/main/java/org/fuseri/modulelanguageschool/user/UserFacade.java
@@ -6,6 +6,8 @@ import org.fuseri.model.dto.user.UserAddLanguageDto;
 import org.fuseri.model.dto.user.UserCreateDto;
 import org.fuseri.model.dto.user.UserDto;
 import org.fuseri.modulelanguageschool.course.CourseMapper;
+import org.fuseri.modulelanguageschool.course.Language;
+import org.fuseri.modulelanguageschool.course.ProficiencyLevel;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -57,9 +59,10 @@ public class UserFacade {
     public UserDto addLanguage(Long id, UserAddLanguageDto body) {
         var user = service.find(id);
         var languages = user.getLanguageProficiency();
-        var language = body.getLanguage();
+        var language = Language.valueOf(body.getLanguage().name());
+        var proficiency = ProficiencyLevel.valueOf(body.getProficiency().name());
 
-        languages.put(language, body.getProficiency());
+        languages.put(language, proficiency);
         user.setLanguageProficiency(languages);
         return mapper.toDto(service.update(user));
     }
-- 
GitLab