From 33449ea8342d4075a01eefc229353cb3487adda5 Mon Sep 17 00:00:00 2001
From: Jan Tymel <410388@mail.muni.cz>
Date: Sat, 14 Nov 2020 21:43:27 +0100
Subject: [PATCH] Very simple implementation of GameDefinitionService creating
 DB entities

---
 .../controller/GameDefinitionController.java  |  6 ++-
 .../com/example/demo/domain/UnityLevel.java   | 16 +++---
 .../com/example/demo/dto/UnityLevelDto.java   | 17 ++++++
 .../dto/input/GameDefinitionCreateDto.java    | 43 +++++++++++++--
 .../com/example/demo/dto/input/LevelType.java |  8 +--
 .../com/example/demo/mapper/BeanMapper.java   |  6 +++
 .../demo/repository/UnityLevelRepository.java |  7 +++
 .../demo/service/GameDefinitionService.java   | 54 ++++++++++++++++++-
 src/main/resources/application.properties     |  3 ++
 9 files changed, 143 insertions(+), 17 deletions(-)
 create mode 100644 src/main/java/com/example/demo/dto/UnityLevelDto.java
 create mode 100644 src/main/java/com/example/demo/repository/UnityLevelRepository.java

diff --git a/src/main/java/com/example/demo/controller/GameDefinitionController.java b/src/main/java/com/example/demo/controller/GameDefinitionController.java
index 7b27160b..18b333e2 100644
--- a/src/main/java/com/example/demo/controller/GameDefinitionController.java
+++ b/src/main/java/com/example/demo/controller/GameDefinitionController.java
@@ -18,6 +18,8 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.List;
+
 @RestController
 @RequestMapping("/game-definition")
 @CrossOrigin(origins = "*", allowCredentials = "true", allowedHeaders = "*",
@@ -39,7 +41,7 @@ public class GameDefinitionController {
     @ApiResponses(value = {@ApiResponse(code = 200, message = "New game definition created"),
                            @ApiResponse(code = 500, message = "Unexpected application error")})
     public GameDefinitionCreateDto createGameLevel(@ApiParam(value = "Game definition", required = true) @RequestBody(required = true)
-                                            GameDefinitionCreateDto gameLevelCreateDto) {
-        return gameDefinitionService.createGameDefinition(gameLevelCreateDto);
+                                                       List<GameDefinitionCreateDto> gameDefinition) {
+        return gameDefinitionService.createGameDefinition(gameDefinition);
     }
 }
diff --git a/src/main/java/com/example/demo/domain/UnityLevel.java b/src/main/java/com/example/demo/domain/UnityLevel.java
index 3b145a38..fe50f737 100644
--- a/src/main/java/com/example/demo/domain/UnityLevel.java
+++ b/src/main/java/com/example/demo/domain/UnityLevel.java
@@ -3,20 +3,22 @@ package com.example.demo.domain;
 import javax.persistence.CascadeType;
 import javax.persistence.Entity;
 import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
 import javax.persistence.OneToMany;
 import javax.persistence.OrderBy;
 import java.util.List;
 
 @Entity
-public class UnityLevel {
-
-    @Id
-    @GeneratedValue
-    private Long id;
+public class UnityLevel extends BaseLevel {
 
     @OrderBy
     @OneToMany(mappedBy = "unityLevel", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
     private List<BaseLevel> subLevels;
+
+    public List<BaseLevel> getSubLevels() {
+        return subLevels;
+    }
+
+    public void setSubLevels(List<BaseLevel> subLevels) {
+        this.subLevels = subLevels;
+    }
 }
diff --git a/src/main/java/com/example/demo/dto/UnityLevelDto.java b/src/main/java/com/example/demo/dto/UnityLevelDto.java
new file mode 100644
index 00000000..be0ac4af
--- /dev/null
+++ b/src/main/java/com/example/demo/dto/UnityLevelDto.java
@@ -0,0 +1,17 @@
+package com.example.demo.dto;
+
+import java.util.List;
+
+public class UnityLevelDto extends BaseLevelDto {
+
+    // TODO any class extending BaseLevel could be used here - this piece of art is here in order to make mapstruct happy
+    private List<GameLevelDto> subLevels;
+
+    public List<GameLevelDto> getSubLevels() {
+        return subLevels;
+    }
+
+    public void setSubLevels(List<GameLevelDto> subLevels) {
+        this.subLevels = subLevels;
+    }
+}
diff --git a/src/main/java/com/example/demo/dto/input/GameDefinitionCreateDto.java b/src/main/java/com/example/demo/dto/input/GameDefinitionCreateDto.java
index 60ead660..c19d1608 100644
--- a/src/main/java/com/example/demo/dto/input/GameDefinitionCreateDto.java
+++ b/src/main/java/com/example/demo/dto/input/GameDefinitionCreateDto.java
@@ -1,14 +1,51 @@
 package com.example.demo.dto.input;
 
-import lombok.Data;
-
 import java.util.List;
 
-@Data
 public class GameDefinitionCreateDto {
     private Long id;
     private String title;
     private Integer order;
     private LevelType type;
     private List<? extends GameDefinitionCreateDto> subLevels;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public Integer getOrder() {
+        return order;
+    }
+
+    public void setOrder(Integer order) {
+        this.order = order;
+    }
+
+    public LevelType getType() {
+        return type;
+    }
+
+    public void setType(LevelType type) {
+        this.type = type;
+    }
+
+    public List<? extends GameDefinitionCreateDto> getSubLevels() {
+        return subLevels;
+    }
+
+    public void setSubLevels(List<? extends GameDefinitionCreateDto> subLevels) {
+        this.subLevels = subLevels;
+    }
 }
diff --git a/src/main/java/com/example/demo/dto/input/LevelType.java b/src/main/java/com/example/demo/dto/input/LevelType.java
index 9b0c5cd3..14855c59 100644
--- a/src/main/java/com/example/demo/dto/input/LevelType.java
+++ b/src/main/java/com/example/demo/dto/input/LevelType.java
@@ -1,8 +1,8 @@
 package com.example.demo.dto.input;
 
 public enum LevelType {
-    ASSESSMENT,
-    GAME,
-    INFO,
-    UNITY
+    assessment,
+    game,
+    info,
+    unity
 }
diff --git a/src/main/java/com/example/demo/mapper/BeanMapper.java b/src/main/java/com/example/demo/mapper/BeanMapper.java
index 522a136d..3707c0d0 100644
--- a/src/main/java/com/example/demo/mapper/BeanMapper.java
+++ b/src/main/java/com/example/demo/mapper/BeanMapper.java
@@ -5,6 +5,7 @@ import com.example.demo.domain.Attachment;
 import com.example.demo.domain.GameLevel;
 import com.example.demo.domain.Hint;
 import com.example.demo.domain.InfoLevel;
+import com.example.demo.domain.UnityLevel;
 import com.example.demo.dto.AssessmentLevelDto;
 import com.example.demo.dto.AttachmentDto;
 import com.example.demo.dto.GameLevelCreateDto;
@@ -14,6 +15,7 @@ import com.example.demo.dto.HintDto;
 import com.example.demo.dto.InfoLevelCreateDto;
 import com.example.demo.dto.InfoLevelDto;
 import com.example.demo.dto.InfoLevelUpdateDto;
+import com.example.demo.dto.UnityLevelDto;
 import org.mapstruct.Mapper;
 import org.mapstruct.factory.Mappers;
 
@@ -50,4 +52,8 @@ public interface BeanMapper {
     AttachmentDto toDto(Attachment hint);
 
     Attachment toEntity(AttachmentDto hint);
+
+    UnityLevelDto toDto(UnityLevel unityLevel);
+
+    UnityLevel toEntity(UnityLevelDto unityLevel);
 }
diff --git a/src/main/java/com/example/demo/repository/UnityLevelRepository.java b/src/main/java/com/example/demo/repository/UnityLevelRepository.java
new file mode 100644
index 00000000..0843c7cd
--- /dev/null
+++ b/src/main/java/com/example/demo/repository/UnityLevelRepository.java
@@ -0,0 +1,7 @@
+package com.example.demo.repository;
+
+import com.example.demo.domain.UnityLevel;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+public interface UnityLevelRepository extends JpaRepository<UnityLevel, Long> {
+}
diff --git a/src/main/java/com/example/demo/service/GameDefinitionService.java b/src/main/java/com/example/demo/service/GameDefinitionService.java
index 3e343398..5dc2624f 100644
--- a/src/main/java/com/example/demo/service/GameDefinitionService.java
+++ b/src/main/java/com/example/demo/service/GameDefinitionService.java
@@ -1,13 +1,65 @@
 package com.example.demo.service;
 
+import com.example.demo.domain.AssessmentLevel;
+import com.example.demo.domain.BaseLevel;
+import com.example.demo.domain.GameLevel;
+import com.example.demo.domain.UnityLevel;
 import com.example.demo.dto.input.GameDefinitionCreateDto;
+import com.example.demo.dto.input.LevelType;
+import com.example.demo.repository.AssessmentLevelRepository;
+import com.example.demo.repository.GameLevelRepository;
+import com.example.demo.repository.UnityLevelRepository;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
+import java.util.List;
+
 @Service
 public class GameDefinitionService {
 
-    public GameDefinitionCreateDto createGameDefinition(GameDefinitionCreateDto gameDefinitionCreateDto) {
+    @Autowired
+    private AssessmentLevelRepository assessmentLevelRepository;
+
+    @Autowired
+    private UnityLevelRepository unityLevelRepository;
+
+    @Autowired
+    private GameLevelRepository gameLevelRepository;
+
+    public GameDefinitionCreateDto createGameDefinition(List<GameDefinitionCreateDto> gameDefinition) {
+
+        for (GameDefinitionCreateDto gameDefinitionCreateDto : gameDefinition) {
+            if (gameDefinitionCreateDto.getType() == LevelType.assessment) {
+                AssessmentLevel assessmentLevel = new AssessmentLevel();
+                assessmentLevel.setTitle(gameDefinitionCreateDto.getTitle());
+                assessmentLevel.setOrderInTrainingDefinition(gameDefinitionCreateDto.getOrder());
+
+                assessmentLevelRepository.save(assessmentLevel);
+            } else if (gameDefinitionCreateDto.getType() == LevelType.unity) {
+                UnityLevel unityLevel = new UnityLevel();
+                unityLevel.setTitle(gameDefinitionCreateDto.getTitle());
+                unityLevel.setOrderInTrainingDefinition(gameDefinitionCreateDto.getOrder());
+
+                unityLevelRepository.save(unityLevel);
+
+
+                List<BaseLevel> subLevels = new ArrayList<>();
+                for (GameDefinitionCreateDto subLevel : gameDefinitionCreateDto.getSubLevels()) {
+                    if (subLevel.getType() == LevelType.game) {
+                        GameLevel gameLevel = new GameLevel();
+                        gameLevel.setTitle(subLevel.getTitle());
+                        gameLevel.setOrderInTrainingDefinition(subLevel.getOrder());
+                        gameLevel.setUnityLevel(unityLevel);
 
+                        subLevels.add(gameLevel);
+                        gameLevelRepository.save(gameLevel);
+                    }
+                }
+                unityLevel.setSubLevels(subLevels);
+                unityLevelRepository.save(unityLevel);
+            }
+        }
 
         return null;
     }
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index 5e482e30..e3165b96 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -3,3 +3,6 @@
 #spring.datasource.username=sa
 #spring.datasource.password=password
 #spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
+
+spring.h2.console.enabled=true
+spring.h2.console.path=/h2-console
-- 
GitLab