From 5297c610adacdde2dc311bda675a3e61a61f064f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Martin=20Slov=C3=ADk?= <xslovik@fi.muni.cz>
Date: Tue, 4 Apr 2023 19:47:50 +0200
Subject: [PATCH] Adding generic BaseFacade

---
 .../pa165/core/facade/common/BaseFacade.java  | 27 ++++++++
 .../core/facade/common/BaseFacadeImpl.java    | 65 +++++++++++++++++++
 2 files changed, 92 insertions(+)
 create mode 100644 core/src/main/java/cz/muni/fi/pa165/core/facade/common/BaseFacade.java
 create mode 100644 core/src/main/java/cz/muni/fi/pa165/core/facade/common/BaseFacadeImpl.java

diff --git a/core/src/main/java/cz/muni/fi/pa165/core/facade/common/BaseFacade.java b/core/src/main/java/cz/muni/fi/pa165/core/facade/common/BaseFacade.java
new file mode 100644
index 0000000..4ec4a63
--- /dev/null
+++ b/core/src/main/java/cz/muni/fi/pa165/core/facade/common/BaseFacade.java
@@ -0,0 +1,27 @@
+package cz.muni.fi.pa165.core.facade.common;
+
+import cz.muni.fi.pa165.core.model.DomainEntityDto;
+
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * BaseFacade for common CRUD operations
+ *
+ * @param <N> NewRequestDto
+ * @param <D> Dto
+ * @param <K> Entity
+ * @author martinslovik
+ */
+public interface BaseFacade<N, D extends DomainEntityDto, K> {
+
+    D save(N newDtoRequest);
+
+    Optional<D> findById(K id);
+
+    List<D> findAll();
+
+    void deleteById(K id);
+
+    void deleteAll();
+}
diff --git a/core/src/main/java/cz/muni/fi/pa165/core/facade/common/BaseFacadeImpl.java b/core/src/main/java/cz/muni/fi/pa165/core/facade/common/BaseFacadeImpl.java
new file mode 100644
index 0000000..cd1f3ec
--- /dev/null
+++ b/core/src/main/java/cz/muni/fi/pa165/core/facade/common/BaseFacadeImpl.java
@@ -0,0 +1,65 @@
+package cz.muni.fi.pa165.core.facade.common;
+
+import cz.muni.fi.pa165.core.data.domain.common.DomainEntity;
+import cz.muni.fi.pa165.core.model.DomainEntityDto;
+import cz.muni.fi.pa165.core.service.common.BaseService;
+import org.modelmapper.ModelMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Optional;
+
+@Service
+public abstract class BaseFacadeImpl<N, D extends DomainEntityDto, E extends DomainEntity, K> implements BaseFacade<N, D, K> {
+
+    private final BaseService<E, K> service;
+    private Class<D> dtoClass;
+    private Class<E> entityClass;
+    private final ModelMapper modelMapper;
+
+    @Autowired
+    protected BaseFacadeImpl(BaseService<E, K> service, ModelMapper modelMapper) {
+        this.service = service;
+        this.modelMapper = modelMapper;
+    }
+
+    public void setDtoClass(Class<D> dtoClass) {
+        this.dtoClass = dtoClass;
+    }
+
+    public void setEntityClass(Class<E> entityClass) {
+        this.entityClass = entityClass;
+    }
+
+    @Override
+    public D save(N newDtoRequest) {
+        var entity = modelMapper.map(newDtoRequest, entityClass);
+        var savedEntity = service.save(entity);
+        return modelMapper.map(savedEntity, dtoClass);
+    }
+
+    @Override
+    public Optional<D> findById(K id) {
+        var entityOptional = service.findById(id);
+        return entityOptional.map(e -> modelMapper.map(e, dtoClass));
+    }
+
+    @Override
+    public List<D> findAll() {
+        var entities = service.findAll();
+        return entities.stream()
+                .map(entity -> modelMapper.map(entity, dtoClass))
+                .toList();
+    }
+
+    @Override
+    public void deleteById(K id) {
+        service.deleteById(id);
+    }
+
+    @Override
+    public void deleteAll() {
+        service.deleteAll();
+    }
+}
-- 
GitLab