From 4b7f207de31153ecc15ccd7322ae95f6d31fb509 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Marek=20Sk=C3=A1cel=C3=ADk?= <xskacel@fi.muni.cz>
Date: Sun, 19 Mar 2023 16:41:37 +0100
Subject: [PATCH] Added implementation for User W.I.P

---
 core/pom.xml                                  | 46 +++++++++++++--
 .../java/cz/fi/muni/pa165/core/user/.gitkeep  |  0
 .../fi}/pa165/core/CoreApplication.java       |  2 +-
 .../muni/fi/pa165/core/DataInitializer.java   | 29 +++++++++
 .../fi/pa165/core/common/DomainMapper.java    | 24 ++++++++
 .../fi/pa165/core/common/DomainObject.java    | 17 ++++++
 .../fi/pa165/core/common/DomainService.java   | 30 ++++++++++
 .../fi}/pa165/core/company/.gitkeep           |  0
 .../fi}/pa165/core/device/.gitkeep            |  0
 .../fi}/pa165/core/house/.gitkeep             |  0
 .../fi}/pa165/core/smartmeter/.gitkeep        |  0
 .../java/cz/muni/fi/pa165/core/user/User.java | 36 +++++++++++
 .../fi/pa165/core/user/UserController.java    | 48 +++++++++++++++
 .../muni/fi/pa165/core/user/UserMapper.java   | 13 ++++
 .../fi/pa165/core/user/UserRepository.java    |  9 +++
 .../muni/fi/pa165/core/user/UserService.java  | 35 +++++++++++
 .../cz/muni/fi/pa165/core/user/UserType.java  |  7 +++
 .../fi}/pa165/core/CoreApplicationTest.java   |  2 +-
 microservice3/pom.xml                         |  2 +-
 .../fi}/pa165/microservice3/App.java          |  2 +-
 .../fi}/pa165/microservice3/AppTest.java      |  2 +-
 microservice4/pom.xml                         |  2 +-
 .../fi}/pa165/microservice4/App.java          |  2 +-
 .../fi}/pa165/microservice4/AppTest.java      |  2 +-
 model/pom.xml                                 | 20 +++++++
 .../model/dto/common/DomainObjectDto.java     | 11 ++++
 .../pa165/model/dto/user/UserCreateDto.java   | 22 +++++++
 .../muni/fi/pa165/model/dto/user/UserDto.java | 20 +++++++
 pom.xml                                       | 59 ++++++++++++++++++-
 statistics/pom.xml                            |  2 +-
 .../statistics/StatisticsApplication.java     |  2 +-
 .../statistics/StatisticsApplicationTest.java |  2 +-
 32 files changed, 430 insertions(+), 18 deletions(-)
 delete mode 100644 core/src/main/java/cz/fi/muni/pa165/core/user/.gitkeep
 rename core/src/main/java/cz/{fi/muni => muni/fi}/pa165/core/CoreApplication.java (90%)
 create mode 100644 core/src/main/java/cz/muni/fi/pa165/core/DataInitializer.java
 create mode 100644 core/src/main/java/cz/muni/fi/pa165/core/common/DomainMapper.java
 create mode 100644 core/src/main/java/cz/muni/fi/pa165/core/common/DomainObject.java
 create mode 100644 core/src/main/java/cz/muni/fi/pa165/core/common/DomainService.java
 rename core/src/main/java/cz/{fi/muni => muni/fi}/pa165/core/company/.gitkeep (100%)
 rename core/src/main/java/cz/{fi/muni => muni/fi}/pa165/core/device/.gitkeep (100%)
 rename core/src/main/java/cz/{fi/muni => muni/fi}/pa165/core/house/.gitkeep (100%)
 rename core/src/main/java/cz/{fi/muni => muni/fi}/pa165/core/smartmeter/.gitkeep (100%)
 create mode 100644 core/src/main/java/cz/muni/fi/pa165/core/user/User.java
 create mode 100644 core/src/main/java/cz/muni/fi/pa165/core/user/UserController.java
 create mode 100644 core/src/main/java/cz/muni/fi/pa165/core/user/UserMapper.java
 create mode 100644 core/src/main/java/cz/muni/fi/pa165/core/user/UserRepository.java
 create mode 100644 core/src/main/java/cz/muni/fi/pa165/core/user/UserService.java
 create mode 100644 core/src/main/java/cz/muni/fi/pa165/core/user/UserType.java
 rename core/src/test/java/cz/{fi/muni => muni/fi}/pa165/core/CoreApplicationTest.java (85%)
 rename microservice3/src/main/java/cz/{fi/muni => muni/fi}/pa165/microservice3/App.java (86%)
 rename microservice3/src/test/java/cz/{fi/muni => muni/fi}/pa165/microservice3/AppTest.java (81%)
 rename microservice4/src/main/java/cz/{fi/muni => muni/fi}/pa165/microservice4/App.java (86%)
 rename microservice4/src/test/java/cz/{fi/muni => muni/fi}/pa165/microservice4/AppTest.java (81%)
 create mode 100644 model/pom.xml
 create mode 100644 model/src/main/java/cz/muni/fi/pa165/model/dto/common/DomainObjectDto.java
 create mode 100644 model/src/main/java/cz/muni/fi/pa165/model/dto/user/UserCreateDto.java
 create mode 100644 model/src/main/java/cz/muni/fi/pa165/model/dto/user/UserDto.java
 rename statistics/src/main/java/cz/{fi/muni => muni/fi}/pa165/statistics/StatisticsApplication.java (88%)
 rename statistics/src/test/java/cz/{fi/muni => muni/fi}/pa165/statistics/StatisticsApplicationTest.java (83%)

diff --git a/core/pom.xml b/core/pom.xml
index d7d561c..6bb3086 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -4,17 +4,55 @@
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
         <artifactId>smart-energy-management-system</artifactId>
-        <groupId>cz.fi.muni.pa165</groupId>
+        <groupId>cz.muni.fi.pa165</groupId>
         <version>0.0.1-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
-
     <artifactId>core</artifactId>
-
+    <name>core</name>
+    <description>Core application for smart energy management system</description>
+    <dependencies>
+        <dependency>
+            <groupId>cz.muni.fi.pa165</groupId>
+            <artifactId>model</artifactId>
+            <version>0.0.1-SNAPSHOT</version>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.h2database</groupId>
+            <artifactId>h2</artifactId>
+            <scope>runtime</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-jpa</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.mapstruct</groupId>
+            <artifactId>mapstruct</artifactId>
+            <version>1.5.3.Final</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
     <properties>
         <maven.compiler.source>17</maven.compiler.source>
         <maven.compiler.target>17</maven.compiler.target>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     </properties>
-
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+        </plugins>
+    </build>
 </project>
\ No newline at end of file
diff --git a/core/src/main/java/cz/fi/muni/pa165/core/user/.gitkeep b/core/src/main/java/cz/fi/muni/pa165/core/user/.gitkeep
deleted file mode 100644
index e69de29..0000000
diff --git a/core/src/main/java/cz/fi/muni/pa165/core/CoreApplication.java b/core/src/main/java/cz/muni/fi/pa165/core/CoreApplication.java
similarity index 90%
rename from core/src/main/java/cz/fi/muni/pa165/core/CoreApplication.java
rename to core/src/main/java/cz/muni/fi/pa165/core/CoreApplication.java
index 8d64445..f76cdbe 100644
--- a/core/src/main/java/cz/fi/muni/pa165/core/CoreApplication.java
+++ b/core/src/main/java/cz/muni/fi/pa165/core/CoreApplication.java
@@ -1,4 +1,4 @@
-package cz.fi.muni.pa165.core;
+package cz.muni.fi.pa165.core;
 
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
diff --git a/core/src/main/java/cz/muni/fi/pa165/core/DataInitializer.java b/core/src/main/java/cz/muni/fi/pa165/core/DataInitializer.java
new file mode 100644
index 0000000..8a13146
--- /dev/null
+++ b/core/src/main/java/cz/muni/fi/pa165/core/DataInitializer.java
@@ -0,0 +1,29 @@
+package cz.muni.fi.pa165.core;
+
+import cz.muni.fi.pa165.core.user.User;
+import cz.muni.fi.pa165.core.user.UserService;
+import cz.muni.fi.pa165.core.user.UserType;
+import lombok.RequiredArgsConstructor;
+import org.springframework.boot.ApplicationArguments;
+import org.springframework.boot.ApplicationRunner;
+import org.springframework.stereotype.Component;
+
+@RequiredArgsConstructor
+@Component
+public class DataInitializer implements ApplicationRunner {
+	private final UserService userService;
+
+	@Override
+	public void run(ApplicationArguments args) throws Exception {
+		User user = User.builder()
+				.email("test@email.com")
+				.firstName("John")
+				.lastName("Doe")
+				.username("johnD")
+				.password("password")
+				.userType(UserType.ADMIN)
+				.build();
+		userService.create(user);
+
+	}
+}
diff --git a/core/src/main/java/cz/muni/fi/pa165/core/common/DomainMapper.java b/core/src/main/java/cz/muni/fi/pa165/core/common/DomainMapper.java
new file mode 100644
index 0000000..099ae1a
--- /dev/null
+++ b/core/src/main/java/cz/muni/fi/pa165/core/common/DomainMapper.java
@@ -0,0 +1,24 @@
+package cz.muni.fi.pa165.core.common;
+
+import cz.muni.fi.pa165.model.dto.common.DomainObjectDto;
+
+import java.util.List;
+
+public interface DomainMapper<T extends DomainObject, S extends DomainObjectDto> {
+
+	T fromDto(S dto);
+
+	S toDto(T entity);
+
+	List<S> toDtoList(List<T> entities);
+
+   /*
+	@Mappings({
+			@Mapping(target = "total", expression = "java(source.getTotalElements())"),
+			@Mapping(target = "page", expression = "java(source.getNumber())"),
+			@Mapping(target = "pageSize", expression = "java(source.getSize())"),
+			@Mapping(target = "items", expression = "java(toDtoList(source.getContent()))")
+	})
+	Result<S> toResult(Page<T> source);
+    */
+}
diff --git a/core/src/main/java/cz/muni/fi/pa165/core/common/DomainObject.java b/core/src/main/java/cz/muni/fi/pa165/core/common/DomainObject.java
new file mode 100644
index 0000000..f49c035
--- /dev/null
+++ b/core/src/main/java/cz/muni/fi/pa165/core/common/DomainObject.java
@@ -0,0 +1,17 @@
+package cz.muni.fi.pa165.core.common;
+
+import jakarta.persistence.Id;
+import jakarta.persistence.MappedSuperclass;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.UUID;
+
+@Getter
+@Setter
+@MappedSuperclass
+public abstract class DomainObject {
+
+	@Id
+	private String id = UUID.randomUUID().toString();
+}
diff --git a/core/src/main/java/cz/muni/fi/pa165/core/common/DomainService.java b/core/src/main/java/cz/muni/fi/pa165/core/common/DomainService.java
new file mode 100644
index 0000000..2d09402
--- /dev/null
+++ b/core/src/main/java/cz/muni/fi/pa165/core/common/DomainService.java
@@ -0,0 +1,30 @@
+package cz.muni.fi.pa165.core.common;
+
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.transaction.annotation.Transactional;
+
+public abstract class DomainService<T extends DomainObject> {
+
+	public static final int DEFAULT_PAGE_SIZE = 10;
+
+	public abstract JpaRepository<T, String> getRepository();
+
+	@Transactional
+	public T create(T entity) {
+		return getRepository().save(entity);
+	}
+
+	@Transactional(readOnly = true)
+	public Page<T> findAll(Pageable pageable) {
+		return getRepository().findAll(pageable);
+	}
+
+	@Transactional(readOnly = true)
+	public Page<T> findAll(int page) {
+		return getRepository().findAll(PageRequest.of(page, DEFAULT_PAGE_SIZE));
+	}
+}
+
diff --git a/core/src/main/java/cz/fi/muni/pa165/core/company/.gitkeep b/core/src/main/java/cz/muni/fi/pa165/core/company/.gitkeep
similarity index 100%
rename from core/src/main/java/cz/fi/muni/pa165/core/company/.gitkeep
rename to core/src/main/java/cz/muni/fi/pa165/core/company/.gitkeep
diff --git a/core/src/main/java/cz/fi/muni/pa165/core/device/.gitkeep b/core/src/main/java/cz/muni/fi/pa165/core/device/.gitkeep
similarity index 100%
rename from core/src/main/java/cz/fi/muni/pa165/core/device/.gitkeep
rename to core/src/main/java/cz/muni/fi/pa165/core/device/.gitkeep
diff --git a/core/src/main/java/cz/fi/muni/pa165/core/house/.gitkeep b/core/src/main/java/cz/muni/fi/pa165/core/house/.gitkeep
similarity index 100%
rename from core/src/main/java/cz/fi/muni/pa165/core/house/.gitkeep
rename to core/src/main/java/cz/muni/fi/pa165/core/house/.gitkeep
diff --git a/core/src/main/java/cz/fi/muni/pa165/core/smartmeter/.gitkeep b/core/src/main/java/cz/muni/fi/pa165/core/smartmeter/.gitkeep
similarity index 100%
rename from core/src/main/java/cz/fi/muni/pa165/core/smartmeter/.gitkeep
rename to core/src/main/java/cz/muni/fi/pa165/core/smartmeter/.gitkeep
diff --git a/core/src/main/java/cz/muni/fi/pa165/core/user/User.java b/core/src/main/java/cz/muni/fi/pa165/core/user/User.java
new file mode 100644
index 0000000..6ae1b42
--- /dev/null
+++ b/core/src/main/java/cz/muni/fi/pa165/core/user/User.java
@@ -0,0 +1,36 @@
+package cz.muni.fi.pa165.core.user;
+
+import cz.muni.fi.pa165.core.common.DomainObject;
+import jakarta.persistence.Entity;
+import jakarta.persistence.EnumType;
+import jakarta.persistence.Enumerated;
+import jakarta.persistence.Table;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+@Getter
+@Setter
+@Entity
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@Table(name = "domain_user")
+public class User extends DomainObject {
+
+	private String username;
+
+	@Enumerated(EnumType.STRING)
+	private UserType userType;
+
+	private String password;
+
+	private String email;
+
+	private String firstName;
+
+	private String lastName;
+
+}
diff --git a/core/src/main/java/cz/muni/fi/pa165/core/user/UserController.java b/core/src/main/java/cz/muni/fi/pa165/core/user/UserController.java
new file mode 100644
index 0000000..b143a7c
--- /dev/null
+++ b/core/src/main/java/cz/muni/fi/pa165/core/user/UserController.java
@@ -0,0 +1,48 @@
+package cz.muni.fi.pa165.core.user;
+
+import cz.muni.fi.pa165.model.dto.user.UserCreateDto;
+import cz.muni.fi.pa165.model.dto.user.UserDto;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@RestController
+@RequestMapping("/users")
+public class UserController {
+
+	private final UserService service;
+
+	private final UserMapper mapper;
+
+	@Autowired
+	public UserController(UserService service, UserMapper mapper) {
+		this.service = service;
+		this.mapper = mapper;
+	}
+
+	@GetMapping
+	public List<UserDto> findAll() {
+		return service.findAll().stream().map(mapper::toDto).toList();
+	}
+
+	@GetMapping("/{id}")
+	public UserDto find(@PathVariable String id) {
+		return mapper.toDto(service.find(id));
+	}
+
+	@PostMapping
+	public UserDto create(@RequestBody UserCreateDto dto) {
+		return mapper.toDto(service.create(mapper.fromCreateDto(dto)));
+	}
+
+	// @GetMapping
+	// public Result<UserDto> findAll(@RequestParam int page) {
+	//  	return mapper.toResult(service.findAll(page));
+	// }
+}
diff --git a/core/src/main/java/cz/muni/fi/pa165/core/user/UserMapper.java b/core/src/main/java/cz/muni/fi/pa165/core/user/UserMapper.java
new file mode 100644
index 0000000..ce1a629
--- /dev/null
+++ b/core/src/main/java/cz/muni/fi/pa165/core/user/UserMapper.java
@@ -0,0 +1,13 @@
+package cz.muni.fi.pa165.core.user;
+
+import cz.muni.fi.pa165.core.common.DomainMapper;
+import cz.muni.fi.pa165.model.dto.user.UserCreateDto;
+import cz.muni.fi.pa165.model.dto.user.UserDto;
+import org.mapstruct.Mapper;
+
+@Mapper
+public interface UserMapper extends DomainMapper<User, UserDto> {
+
+	User fromCreateDto(UserCreateDto dto);
+}
+
diff --git a/core/src/main/java/cz/muni/fi/pa165/core/user/UserRepository.java b/core/src/main/java/cz/muni/fi/pa165/core/user/UserRepository.java
new file mode 100644
index 0000000..58f12b1
--- /dev/null
+++ b/core/src/main/java/cz/muni/fi/pa165/core/user/UserRepository.java
@@ -0,0 +1,9 @@
+package cz.muni.fi.pa165.core.user;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface UserRepository extends JpaRepository<User, String> {
+}
+
diff --git a/core/src/main/java/cz/muni/fi/pa165/core/user/UserService.java b/core/src/main/java/cz/muni/fi/pa165/core/user/UserService.java
new file mode 100644
index 0000000..1411527
--- /dev/null
+++ b/core/src/main/java/cz/muni/fi/pa165/core/user/UserService.java
@@ -0,0 +1,35 @@
+package cz.muni.fi.pa165.core.user;
+
+import cz.muni.fi.pa165.core.common.DomainService;
+import jakarta.persistence.EntityNotFoundException;
+import lombok.Getter;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+@Service
+public class UserService extends DomainService<User> {
+
+	@Getter
+	private final UserRepository repository;
+
+	@Autowired
+	public UserService(UserRepository repository) {
+		this.repository = repository;
+	}
+
+	@Transactional(readOnly = true)
+	public User find(String id) {
+		return repository.findById(id)
+				.orElseThrow(() -> new EntityNotFoundException("User '" + id + "' not found."));
+	}
+
+	@Transactional(readOnly = true)
+	public List<User> findAll() {
+		return repository.findAll();
+	}
+
+}
+
diff --git a/core/src/main/java/cz/muni/fi/pa165/core/user/UserType.java b/core/src/main/java/cz/muni/fi/pa165/core/user/UserType.java
new file mode 100644
index 0000000..3208d51
--- /dev/null
+++ b/core/src/main/java/cz/muni/fi/pa165/core/user/UserType.java
@@ -0,0 +1,7 @@
+package cz.muni.fi.pa165.core.user;
+
+public enum UserType {
+	NORMAL,
+	EMPLOYEE,
+	ADMIN
+}
diff --git a/core/src/test/java/cz/fi/muni/pa165/core/CoreApplicationTest.java b/core/src/test/java/cz/muni/fi/pa165/core/CoreApplicationTest.java
similarity index 85%
rename from core/src/test/java/cz/fi/muni/pa165/core/CoreApplicationTest.java
rename to core/src/test/java/cz/muni/fi/pa165/core/CoreApplicationTest.java
index e658bb4..9b7b7c0 100644
--- a/core/src/test/java/cz/fi/muni/pa165/core/CoreApplicationTest.java
+++ b/core/src/test/java/cz/muni/fi/pa165/core/CoreApplicationTest.java
@@ -1,4 +1,4 @@
-package cz.fi.muni.pa165.core;
+package cz.muni.fi.pa165.core;
 
 import org.junit.jupiter.api.Test;
 import org.springframework.boot.test.context.SpringBootTest;
diff --git a/microservice3/pom.xml b/microservice3/pom.xml
index ef83ff9..d5559ef 100644
--- a/microservice3/pom.xml
+++ b/microservice3/pom.xml
@@ -4,7 +4,7 @@
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
         <artifactId>smart-energy-management-system</artifactId>
-        <groupId>cz.fi.muni.pa165</groupId>
+        <groupId>cz.muni.fi.pa165</groupId>
         <version>0.0.1-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
diff --git a/microservice3/src/main/java/cz/fi/muni/pa165/microservice3/App.java b/microservice3/src/main/java/cz/muni/fi/pa165/microservice3/App.java
similarity index 86%
rename from microservice3/src/main/java/cz/fi/muni/pa165/microservice3/App.java
rename to microservice3/src/main/java/cz/muni/fi/pa165/microservice3/App.java
index 6882ed9..8b3f7ae 100644
--- a/microservice3/src/main/java/cz/fi/muni/pa165/microservice3/App.java
+++ b/microservice3/src/main/java/cz/muni/fi/pa165/microservice3/App.java
@@ -1,4 +1,4 @@
-package cz.fi.muni.pa165.microservice3;
+package cz.muni.fi.pa165.microservice3;
 
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
diff --git a/microservice3/src/test/java/cz/fi/muni/pa165/microservice3/AppTest.java b/microservice3/src/test/java/cz/muni/fi/pa165/microservice3/AppTest.java
similarity index 81%
rename from microservice3/src/test/java/cz/fi/muni/pa165/microservice3/AppTest.java
rename to microservice3/src/test/java/cz/muni/fi/pa165/microservice3/AppTest.java
index b5fed3c..927c9db 100644
--- a/microservice3/src/test/java/cz/fi/muni/pa165/microservice3/AppTest.java
+++ b/microservice3/src/test/java/cz/muni/fi/pa165/microservice3/AppTest.java
@@ -1,4 +1,4 @@
-package cz.fi.muni.pa165.microservice3;
+package cz.muni.fi.pa165.microservice3;
 
 import org.junit.jupiter.api.Test;
 import org.springframework.boot.test.context.SpringBootTest;
diff --git a/microservice4/pom.xml b/microservice4/pom.xml
index 8dd8d7b..388b2d4 100644
--- a/microservice4/pom.xml
+++ b/microservice4/pom.xml
@@ -4,7 +4,7 @@
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
         <artifactId>smart-energy-management-system</artifactId>
-        <groupId>cz.fi.muni.pa165</groupId>
+        <groupId>cz.muni.fi.pa165</groupId>
         <version>0.0.1-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
diff --git a/microservice4/src/main/java/cz/fi/muni/pa165/microservice4/App.java b/microservice4/src/main/java/cz/muni/fi/pa165/microservice4/App.java
similarity index 86%
rename from microservice4/src/main/java/cz/fi/muni/pa165/microservice4/App.java
rename to microservice4/src/main/java/cz/muni/fi/pa165/microservice4/App.java
index 1a72bee..9044aa6 100644
--- a/microservice4/src/main/java/cz/fi/muni/pa165/microservice4/App.java
+++ b/microservice4/src/main/java/cz/muni/fi/pa165/microservice4/App.java
@@ -1,4 +1,4 @@
-package cz.fi.muni.pa165.microservice4;
+package cz.muni.fi.pa165.microservice4;
 
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
diff --git a/microservice4/src/test/java/cz/fi/muni/pa165/microservice4/AppTest.java b/microservice4/src/test/java/cz/muni/fi/pa165/microservice4/AppTest.java
similarity index 81%
rename from microservice4/src/test/java/cz/fi/muni/pa165/microservice4/AppTest.java
rename to microservice4/src/test/java/cz/muni/fi/pa165/microservice4/AppTest.java
index 992adf0..3a9a025 100644
--- a/microservice4/src/test/java/cz/fi/muni/pa165/microservice4/AppTest.java
+++ b/microservice4/src/test/java/cz/muni/fi/pa165/microservice4/AppTest.java
@@ -1,4 +1,4 @@
-package cz.fi.muni.pa165.microservice4;
+package cz.muni.fi.pa165.microservice4;
 
 import org.junit.jupiter.api.Test;
 import org.springframework.boot.test.context.SpringBootTest;
diff --git a/model/pom.xml b/model/pom.xml
new file mode 100644
index 0000000..c5662a9
--- /dev/null
+++ b/model/pom.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>smart-energy-management-system</artifactId>
+        <groupId>cz.muni.fi.pa165</groupId>
+        <version>0.0.1-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>model</artifactId>
+    <name>models</name>
+    <description>Library for smart energy management system with domain model objects</description>
+    <properties>
+        <maven.compiler.source>17</maven.compiler.source>
+        <maven.compiler.target>17</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <spring-boot.repackage.skip>true</spring-boot.repackage.skip>
+    </properties>
+</project>
\ No newline at end of file
diff --git a/model/src/main/java/cz/muni/fi/pa165/model/dto/common/DomainObjectDto.java b/model/src/main/java/cz/muni/fi/pa165/model/dto/common/DomainObjectDto.java
new file mode 100644
index 0000000..f99c4d2
--- /dev/null
+++ b/model/src/main/java/cz/muni/fi/pa165/model/dto/common/DomainObjectDto.java
@@ -0,0 +1,11 @@
+package cz.muni.fi.pa165.model.dto.common;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public abstract class DomainObjectDto {
+
+	private String id;
+}
\ No newline at end of file
diff --git a/model/src/main/java/cz/muni/fi/pa165/model/dto/user/UserCreateDto.java b/model/src/main/java/cz/muni/fi/pa165/model/dto/user/UserCreateDto.java
new file mode 100644
index 0000000..8221a48
--- /dev/null
+++ b/model/src/main/java/cz/muni/fi/pa165/model/dto/user/UserCreateDto.java
@@ -0,0 +1,22 @@
+package cz.muni.fi.pa165.model.dto.user;
+
+import cz.muni.fi.pa165.model.dto.common.DomainObjectDto;
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class UserCreateDto extends DomainObjectDto {
+
+	private String username;
+
+	private String password;
+
+	private String email;
+
+	private String firstName;
+
+	private String lastName;
+
+}
+
diff --git a/model/src/main/java/cz/muni/fi/pa165/model/dto/user/UserDto.java b/model/src/main/java/cz/muni/fi/pa165/model/dto/user/UserDto.java
new file mode 100644
index 0000000..ede86ac
--- /dev/null
+++ b/model/src/main/java/cz/muni/fi/pa165/model/dto/user/UserDto.java
@@ -0,0 +1,20 @@
+package cz.muni.fi.pa165.model.dto.user;
+
+import cz.muni.fi.pa165.model.dto.common.DomainObjectDto;
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class UserDto extends DomainObjectDto {
+
+	private String username;
+
+	private String email;
+
+	private String firstName;
+
+	private String lastName;
+
+
+}
diff --git a/pom.xml b/pom.xml
index 95710e8..46c7101 100644
--- a/pom.xml
+++ b/pom.xml
@@ -8,6 +8,7 @@
 		<module>statistics</module>
 		<module>microservice3</module>
 		<module>microservice4</module>
+		<module>model</module>
 	</modules>
     <parent>
 		<groupId>org.springframework.boot</groupId>
@@ -15,13 +16,18 @@
 		<version>3.0.4</version>
 		<relativePath/> <!-- lookup parent from repository -->
 	</parent>
-	<groupId>cz.fi.muni.pa165</groupId>
+	<groupId>cz.muni.fi.pa165</groupId>
 	<artifactId>smart-energy-management-system</artifactId>
 	<version>0.0.1-SNAPSHOT</version>
 	<name>smart-energy-management-system</name>
 	<description>Demo project for Spring Boot</description>
 	<properties>
 		<java.version>17</java.version>
+		<maven.compiler.source>17</maven.compiler.source>
+		<maven.compiler.target>17</maven.compiler.target>
+		<lombok.version>1.18.26</lombok.version>
+		<org.mapstruct.version>1.5.3.Final</org.mapstruct.version>
+		<example.version>0.0.1-SNAPSHOT</example.version>
 	</properties>
 	<dependencies>
 		<dependency>
@@ -34,15 +40,62 @@
 			<artifactId>spring-boot-starter-test</artifactId>
 			<scope>test</scope>
 		</dependency>
+
+		<dependency>
+			<groupId>org.projectlombok</groupId>
+			<artifactId>lombok</artifactId>
+			<version>${lombok.version}</version>
+		</dependency>
+
 	</dependencies>
 
 	<build>
 		<plugins>
 			<plugin>
-				<groupId>org.springframework.boot</groupId>
-				<artifactId>spring-boot-maven-plugin</artifactId>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-compiler-plugin</artifactId>
+				<version>3.8.1</version>
+				<configuration>
+					<source>17</source> <!-- depending on your project -->
+					<target>17</target> <!-- depending on your project -->
+					<annotationProcessorPaths>
+						<!-- Order is IMPORTANT! Lombok needs to go first -->
+						<path>
+							<groupId>org.projectlombok</groupId>
+							<artifactId>lombok</artifactId>
+							<version>${lombok.version}</version>
+						</path>
+						<path>
+							<groupId>org.mapstruct</groupId>
+							<artifactId>mapstruct-processor</artifactId>
+							<version>${org.mapstruct.version}</version>
+						</path>
+						<!-- other annotation processors -->
+					</annotationProcessorPaths>
+					<compilerArgs>
+						<compilerArg>
+							-Amapstruct.defaultComponentModel=spring
+						</compilerArg>
+					</compilerArgs>
+				</configuration>
 			</plugin>
 		</plugins>
+		<pluginManagement>
+			<plugins>
+				<plugin>
+					<groupId>org.springframework.boot</groupId>
+					<artifactId>spring-boot-maven-plugin</artifactId>
+					<configuration>
+						<excludes>
+							<exclude>
+								<groupId>org.projectlombok</groupId>
+								<artifactId>lombok</artifactId>
+							</exclude>
+						</excludes>
+					</configuration>
+				</plugin>
+			</plugins>
+		</pluginManagement>
 	</build>
 
 </project>
diff --git a/statistics/pom.xml b/statistics/pom.xml
index f012129..eb661fc 100644
--- a/statistics/pom.xml
+++ b/statistics/pom.xml
@@ -4,7 +4,7 @@
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
         <artifactId>smart-energy-management-system</artifactId>
-        <groupId>cz.fi.muni.pa165</groupId>
+        <groupId>cz.muni.fi.pa165</groupId>
         <version>0.0.1-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
diff --git a/statistics/src/main/java/cz/fi/muni/pa165/statistics/StatisticsApplication.java b/statistics/src/main/java/cz/muni/fi/pa165/statistics/StatisticsApplication.java
similarity index 88%
rename from statistics/src/main/java/cz/fi/muni/pa165/statistics/StatisticsApplication.java
rename to statistics/src/main/java/cz/muni/fi/pa165/statistics/StatisticsApplication.java
index 588560d..f73b192 100644
--- a/statistics/src/main/java/cz/fi/muni/pa165/statistics/StatisticsApplication.java
+++ b/statistics/src/main/java/cz/muni/fi/pa165/statistics/StatisticsApplication.java
@@ -1,4 +1,4 @@
-package cz.fi.muni.pa165.statistics;
+package cz.muni.fi.pa165.statistics;
 
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
diff --git a/statistics/src/test/java/cz/fi/muni/pa165/statistics/StatisticsApplicationTest.java b/statistics/src/test/java/cz/muni/fi/pa165/statistics/StatisticsApplicationTest.java
similarity index 83%
rename from statistics/src/test/java/cz/fi/muni/pa165/statistics/StatisticsApplicationTest.java
rename to statistics/src/test/java/cz/muni/fi/pa165/statistics/StatisticsApplicationTest.java
index ebce479..07c0c26 100644
--- a/statistics/src/test/java/cz/fi/muni/pa165/statistics/StatisticsApplicationTest.java
+++ b/statistics/src/test/java/cz/muni/fi/pa165/statistics/StatisticsApplicationTest.java
@@ -1,4 +1,4 @@
-package cz.fi.muni.pa165.statistics;
+package cz.muni.fi.pa165.statistics;
 
 import org.junit.jupiter.api.Test;
 import org.springframework.boot.test.context.SpringBootTest;
-- 
GitLab