diff --git a/NauJava/pom.xml b/NauJava/pom.xml
index 26e9ab9..5e6e9d6 100644
--- a/NauJava/pom.xml
+++ b/NauJava/pom.xml
@@ -1,12 +1,12 @@
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
org.springframework.boot
spring-boot-starter-parent
4.0.3
-
+
ru.andrmuratov
NauJava
@@ -37,7 +37,18 @@
org.springframework.boot
- spring-boot-starter-actuator-test
+ spring-boot-starter-data-jpa
+
+
+
+ org.postgresql
+ postgresql
+ runtime
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
test
@@ -51,4 +62,4 @@
-
+
\ No newline at end of file
diff --git a/NauJava/src/main/java/ru/andrmuratov/NauJava/config/Config.java b/NauJava/src/main/java/ru/andrmuratov/NauJava/config/Config.java
index cf505fd..14b469a 100644
--- a/NauJava/src/main/java/ru/andrmuratov/NauJava/config/Config.java
+++ b/NauJava/src/main/java/ru/andrmuratov/NauJava/config/Config.java
@@ -4,7 +4,7 @@
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;
-import org.springframework.boot.CommandLineRunner;
+//import org.springframework.boot.CommandLineRunner;
import org.springframework.beans.factory.annotation.Value;
import jakarta.annotation.PostConstruct;
import ru.andrmuratov.NauJava.entity.Task;
@@ -33,8 +33,8 @@ public List taskContainer() {
return new ArrayList<>();
}
- @Bean
- public CommandLineRunner run(CommandProcessor processor) {
- return args -> processor.start();
- }
+// @Bean
+// public CommandLineRunner run(CommandProcessor processor) {
+// return args -> processor.start();
+// }
}
\ No newline at end of file
diff --git a/NauJava/src/main/java/ru/andrmuratov/NauJava/dao/CrudRepository.java b/NauJava/src/main/java/ru/andrmuratov/NauJava/dao/CrudRepository.java
deleted file mode 100644
index 2fbaf77..0000000
--- a/NauJava/src/main/java/ru/andrmuratov/NauJava/dao/CrudRepository.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package ru.andrmuratov.NauJava.dao;
-
-public interface CrudRepository {
- void create(T entity);
- T read(ID id);
- void update(T entity);
- void delete(ID id);
-}
\ No newline at end of file
diff --git a/NauJava/src/main/java/ru/andrmuratov/NauJava/dao/TaskRepository.java b/NauJava/src/main/java/ru/andrmuratov/NauJava/dao/TaskRepository.java
deleted file mode 100644
index 379cec9..0000000
--- a/NauJava/src/main/java/ru/andrmuratov/NauJava/dao/TaskRepository.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package ru.andrmuratov.NauJava.dao;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-import ru.andrmuratov.NauJava.entity.Task;
-
-import java.util.List;
-
-@Component
-public class TaskRepository implements CrudRepository {
-
- private final List taskContainer;
-
- @Autowired
- public TaskRepository(List taskContainer) {
- this.taskContainer = taskContainer;
- }
-
- @Override
- public void create(Task task) {
- taskContainer.add(task);
- }
-
- @Override
- public Task read(Long id) {
- for (Task task : taskContainer) {
- if (task.getId().equals(id)) {
- return task;
- }
- }
- return null;
- }
-
- @Override
- public void update(Task task) {
- for (int i = 0; i < taskContainer.size(); i++) {
- if (taskContainer.get(i).getId().equals(task.getId())) {
- taskContainer.set(i, task);
- return;
- }
- }
- }
-
- @Override
- public void delete(Long id) {
- taskContainer.removeIf(task -> task.getId().equals(id));
- }
-
- // Дополнительный метод для получения всех задач
- public List findAll() {
- return taskContainer;
- }
-}
\ No newline at end of file
diff --git a/NauJava/src/main/java/ru/andrmuratov/NauJava/dao/UserRepositoryCustom.java b/NauJava/src/main/java/ru/andrmuratov/NauJava/dao/UserRepositoryCustom.java
new file mode 100644
index 0000000..bac4a79
--- /dev/null
+++ b/NauJava/src/main/java/ru/andrmuratov/NauJava/dao/UserRepositoryCustom.java
@@ -0,0 +1,9 @@
+package ru.andrmuratov.NauJava.dao;
+
+import ru.andrmuratov.NauJava.entity.User;
+import java.util.List;
+
+public interface UserRepositoryCustom {
+ List findByNameCriteria(String name);
+ List findByRoleCriteria(String role);
+}
\ No newline at end of file
diff --git a/NauJava/src/main/java/ru/andrmuratov/NauJava/dao/UserRepositoryImpl.java b/NauJava/src/main/java/ru/andrmuratov/NauJava/dao/UserRepositoryImpl.java
new file mode 100644
index 0000000..ff7e2b7
--- /dev/null
+++ b/NauJava/src/main/java/ru/andrmuratov/NauJava/dao/UserRepositoryImpl.java
@@ -0,0 +1,43 @@
+package ru.andrmuratov.NauJava.dao;
+
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.criteria.CriteriaBuilder;
+import jakarta.persistence.criteria.CriteriaQuery;
+import jakarta.persistence.criteria.Predicate;
+import jakarta.persistence.criteria.Root;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Repository;
+import ru.andrmuratov.NauJava.entity.User;
+
+import java.util.List;
+
+@Repository
+public class UserRepositoryImpl implements UserRepositoryCustom {
+
+ private final EntityManager entityManager;
+
+ @Autowired
+ public UserRepositoryImpl(EntityManager entityManager) {
+ this.entityManager = entityManager;
+ }
+
+ @Override
+ public List findByNameCriteria(String name) {
+ CriteriaBuilder cb = entityManager.getCriteriaBuilder();
+ CriteriaQuery cq = cb.createQuery(User.class);
+ Root root = cq.from(User.class);
+ Predicate predicate = cb.equal(root.get("name"), name);
+ cq.select(root).where(predicate);
+ return entityManager.createQuery(cq).getResultList();
+ }
+
+ @Override
+ public List findByRoleCriteria(String role) {
+ CriteriaBuilder cb = entityManager.getCriteriaBuilder();
+ CriteriaQuery cq = cb.createQuery(User.class);
+ Root root = cq.from(User.class);
+ Predicate predicate = cb.equal(root.get("role"), role);
+ cq.select(root).where(predicate);
+ return entityManager.createQuery(cq).getResultList();
+ }
+}
\ No newline at end of file
diff --git a/NauJava/src/main/java/ru/andrmuratov/NauJava/entity/Category.java b/NauJava/src/main/java/ru/andrmuratov/NauJava/entity/Category.java
new file mode 100644
index 0000000..f3e8e95
--- /dev/null
+++ b/NauJava/src/main/java/ru/andrmuratov/NauJava/entity/Category.java
@@ -0,0 +1,30 @@
+package ru.andrmuratov.NauJava.entity;
+
+import jakarta.persistence.*;
+import java.util.List;
+
+@Entity
+@Table(name = "categories")
+public class Category {
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Long id;
+
+ @Column(nullable = false, unique = true)
+ private String name;
+
+ private String description;
+
+ @OneToMany(mappedBy = "category")
+ private List tasks;
+
+ public Category() {}
+ public Long getId() { return id; }
+ public void setId(Long id) { this.id = id; }
+ public String getName() { return name; }
+ public void setName(String name) { this.name = name; }
+ public String getDescription() { return description; }
+ public void setDescription(String description) { this.description = description; }
+ public List getTasks() { return tasks; }
+ public void setTasks(List tasks) { this.tasks = tasks; }
+}
\ No newline at end of file
diff --git a/NauJava/src/main/java/ru/andrmuratov/NauJava/entity/Comment.java b/NauJava/src/main/java/ru/andrmuratov/NauJava/entity/Comment.java
new file mode 100644
index 0000000..092070c
--- /dev/null
+++ b/NauJava/src/main/java/ru/andrmuratov/NauJava/entity/Comment.java
@@ -0,0 +1,31 @@
+package ru.andrmuratov.NauJava.entity;
+
+import jakarta.persistence.*;
+import java.time.LocalDateTime;
+
+@Entity
+@Table(name = "comments")
+public class Comment {
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Long id;
+
+ @Column(nullable = false, length = 1000)
+ private String text;
+
+ private LocalDateTime createdAt;
+
+ @ManyToOne
+ @JoinColumn(name = "task_id", nullable = false)
+ private Task task;
+
+ public Comment() {}
+ public Long getId() { return id; }
+ public void setId(Long id) { this.id = id; }
+ public String getText() { return text; }
+ public void setText(String text) { this.text = text; }
+ public LocalDateTime getCreatedAt() { return createdAt; }
+ public void setCreatedAt(LocalDateTime createdAt) { this.createdAt = createdAt; }
+ public Task getTask() { return task; }
+ public void setTask(Task task) { this.task = task; }
+}
\ No newline at end of file
diff --git a/NauJava/src/main/java/ru/andrmuratov/NauJava/entity/Tag.java b/NauJava/src/main/java/ru/andrmuratov/NauJava/entity/Tag.java
new file mode 100644
index 0000000..0292a28
--- /dev/null
+++ b/NauJava/src/main/java/ru/andrmuratov/NauJava/entity/Tag.java
@@ -0,0 +1,26 @@
+package ru.andrmuratov.NauJava.entity;
+
+import jakarta.persistence.*;
+import java.util.Set;
+
+@Entity
+@Table(name = "tags")
+public class Tag {
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Long id;
+
+ @Column(nullable = false, unique = true)
+ private String name;
+
+ @ManyToMany(mappedBy = "tags")
+ private Set tasks;
+
+ public Tag() {}
+ public Long getId() { return id; }
+ public void setId(Long id) { this.id = id; }
+ public String getName() { return name; }
+ public void setName(String name) { this.name = name; }
+ public Set getTasks() { return tasks; }
+ public void setTasks(Set tasks) { this.tasks = tasks; }
+}
\ No newline at end of file
diff --git a/NauJava/src/main/java/ru/andrmuratov/NauJava/entity/Task.java b/NauJava/src/main/java/ru/andrmuratov/NauJava/entity/Task.java
index de62452..abc3fb5 100644
--- a/NauJava/src/main/java/ru/andrmuratov/NauJava/entity/Task.java
+++ b/NauJava/src/main/java/ru/andrmuratov/NauJava/entity/Task.java
@@ -1,66 +1,77 @@
package ru.andrmuratov.NauJava.entity;
+import jakarta.persistence.*;
import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Set;
+@Entity
+@Table(name = "tasks")
public class Task {
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
+
+ @Column(nullable = false)
private String title;
+
private String description;
- private Priority priority;
- private Status status;
+
+ @Column(nullable = false)
+ private String status;
+
+ private String priority;
+
private LocalDateTime deadline;
+ @ManyToOne
+ @JoinColumn(name = "user_id", nullable = false)
+ private User user;
- public Task() {}
+ @ManyToOne
+ @JoinColumn(name = "category_id")
+ private Category category;
+ @OneToMany(mappedBy = "task", cascade = CascadeType.ALL, orphanRemoval = true)
+ private List comments;
- public Task(Long id, String title, String description, Priority priority, Status status, LocalDateTime deadline) {
- this.id = id;
- this.title = title;
- this.description = description;
- this.priority = priority;
- this.status = status;
- this.deadline = deadline;
- }
+ @ManyToMany
+ @JoinTable(
+ name = "task_tag",
+ joinColumns = @JoinColumn(name = "task_id"),
+ inverseJoinColumns = @JoinColumn(name = "tag_id")
+ )
+ private Set tags;
+
+ public Task() {}
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 String getDescription() { return description; }
public void setDescription(String description) { this.description = description; }
-
- public Priority getPriority() { return priority; }
- public void setPriority(Priority priority) { this.priority = priority; }
-
- public Status getStatus() { return status; }
- public void setStatus(Status status) { this.status = status; }
-
+ public String getStatus() { return status; }
+ public void setStatus(String status) { this.status = status; }
+ public String getPriority() { return priority; }
+ public void setPriority(String priority) { this.priority = priority; }
public LocalDateTime getDeadline() { return deadline; }
public void setDeadline(LocalDateTime deadline) { this.deadline = deadline; }
-
+ public User getUser() { return user; }
+ public void setUser(User user) { this.user = user; }
+ public Category getCategory() { return category; }
+ public void setCategory(Category category) { this.category = category; }
+ public List getComments() { return comments; }
+ public void setComments(List comments) { this.comments = comments; }
+ public Set getTags() { return tags; }
+ public void setTags(Set tags) { this.tags = tags; }
public enum Priority {
LOW, MEDIUM, HIGH
}
-
public enum Status {
TODO, IN_PROGRESS, DONE
}
-
-
- @Override
- public String toString() {
- return "Task{" +
- "id=" + id +
- ", title='" + title + '\'' +
- ", priority=" + priority +
- ", status=" + status +
- ", deadline=" + deadline +
- '}';
- }
}
\ No newline at end of file
diff --git a/NauJava/src/main/java/ru/andrmuratov/NauJava/entity/User.java b/NauJava/src/main/java/ru/andrmuratov/NauJava/entity/User.java
new file mode 100644
index 0000000..27ee2d9
--- /dev/null
+++ b/NauJava/src/main/java/ru/andrmuratov/NauJava/entity/User.java
@@ -0,0 +1,37 @@
+package ru.andrmuratov.NauJava.entity;
+
+import jakarta.persistence.*;
+import java.util.List;
+
+@Entity
+@Table(name = "users")
+public class User {
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Long id;
+
+ @Column(nullable = false)
+ private String name;
+
+ @Column(unique = true, nullable = false)
+ private String email;
+
+ @Column(nullable = false)
+ private String role;
+
+ @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true)
+ private List tasks;
+
+
+ public User() {}
+ public Long getId() { return id; }
+ public void setId(Long id) { this.id = id; }
+ public String getName() { return name; }
+ public void setName(String name) { this.name = name; }
+ public String getEmail() { return email; }
+ public void setEmail(String email) { this.email = email; }
+ public String getRole() { return role; }
+ public void setRole(String role) { this.role = role; }
+ public List getTasks() { return tasks; }
+ public void setTasks(List tasks) { this.tasks = tasks; }
+}
\ No newline at end of file
diff --git a/NauJava/src/main/java/ru/andrmuratov/NauJava/repository/CategoryRepository.java b/NauJava/src/main/java/ru/andrmuratov/NauJava/repository/CategoryRepository.java
new file mode 100644
index 0000000..bbc866b
--- /dev/null
+++ b/NauJava/src/main/java/ru/andrmuratov/NauJava/repository/CategoryRepository.java
@@ -0,0 +1,7 @@
+package ru.andrmuratov.NauJava.repository;
+
+import org.springframework.data.repository.CrudRepository;
+import ru.andrmuratov.NauJava.entity.Category;
+
+public interface CategoryRepository extends CrudRepository {
+}
\ No newline at end of file
diff --git a/NauJava/src/main/java/ru/andrmuratov/NauJava/repository/CommentRepository.java b/NauJava/src/main/java/ru/andrmuratov/NauJava/repository/CommentRepository.java
new file mode 100644
index 0000000..220888f
--- /dev/null
+++ b/NauJava/src/main/java/ru/andrmuratov/NauJava/repository/CommentRepository.java
@@ -0,0 +1,7 @@
+package ru.andrmuratov.NauJava.repository;
+
+import org.springframework.data.repository.CrudRepository;
+import ru.andrmuratov.NauJava.entity.Comment;
+
+public interface CommentRepository extends CrudRepository {
+}
\ No newline at end of file
diff --git a/NauJava/src/main/java/ru/andrmuratov/NauJava/repository/TagRepository.java b/NauJava/src/main/java/ru/andrmuratov/NauJava/repository/TagRepository.java
new file mode 100644
index 0000000..2678372
--- /dev/null
+++ b/NauJava/src/main/java/ru/andrmuratov/NauJava/repository/TagRepository.java
@@ -0,0 +1,7 @@
+package ru.andrmuratov.NauJava.repository;
+
+import org.springframework.data.repository.CrudRepository;
+import ru.andrmuratov.NauJava.entity.Tag;
+
+public interface TagRepository extends CrudRepository {
+}
\ No newline at end of file
diff --git a/NauJava/src/main/java/ru/andrmuratov/NauJava/repository/TaskRepository.java b/NauJava/src/main/java/ru/andrmuratov/NauJava/repository/TaskRepository.java
new file mode 100644
index 0000000..fc93244
--- /dev/null
+++ b/NauJava/src/main/java/ru/andrmuratov/NauJava/repository/TaskRepository.java
@@ -0,0 +1,14 @@
+package ru.andrmuratov.NauJava.repository;
+
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.CrudRepository;
+import ru.andrmuratov.NauJava.entity.Task;
+import java.util.List;
+
+public interface TaskRepository extends CrudRepository {
+ List findByStatus(String status);
+ List findByUserId(Long userId);
+
+ @Query("SELECT t FROM Task t WHERE t.user.email = :email")
+ List findByUserEmailJPQL(String email);
+}
\ No newline at end of file
diff --git a/NauJava/src/main/java/ru/andrmuratov/NauJava/repository/UserRepository.java b/NauJava/src/main/java/ru/andrmuratov/NauJava/repository/UserRepository.java
new file mode 100644
index 0000000..ec6ff16
--- /dev/null
+++ b/NauJava/src/main/java/ru/andrmuratov/NauJava/repository/UserRepository.java
@@ -0,0 +1,15 @@
+package ru.andrmuratov.NauJava.repository;
+
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.CrudRepository;
+import ru.andrmuratov.NauJava.dao.UserRepositoryCustom;
+import ru.andrmuratov.NauJava.entity.User;
+import java.util.List;
+
+public interface UserRepository extends CrudRepository, UserRepositoryCustom {
+ List findByName(String name);
+ List findByRoleAndEmailContaining(String role, String emailDomain);
+
+ @Query("SELECT u FROM User u WHERE u.role = :role")
+ List findByRoleJPQL(String role);
+}
\ No newline at end of file
diff --git a/NauJava/src/main/java/ru/andrmuratov/NauJava/service/TaskServiceImpl.java b/NauJava/src/main/java/ru/andrmuratov/NauJava/service/TaskServiceImpl.java
index 72450cc..ea56f28 100644
--- a/NauJava/src/main/java/ru/andrmuratov/NauJava/service/TaskServiceImpl.java
+++ b/NauJava/src/main/java/ru/andrmuratov/NauJava/service/TaskServiceImpl.java
@@ -2,18 +2,17 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
-import ru.andrmuratov.NauJava.dao.TaskRepository;
+import ru.andrmuratov.NauJava.repository.TaskRepository;
import ru.andrmuratov.NauJava.entity.Task;
import java.time.LocalDateTime;
import java.util.List;
-import java.util.concurrent.atomic.AtomicLong;
+import java.util.stream.StreamSupport;
@Service
public class TaskServiceImpl implements TaskService {
private final TaskRepository taskRepository;
- private final AtomicLong idGenerator = new AtomicLong(1);
@Autowired
public TaskServiceImpl(TaskRepository taskRepository) {
@@ -23,46 +22,44 @@ public TaskServiceImpl(TaskRepository taskRepository) {
@Override
public void createTask(String title, String description, Task.Priority priority, Task.Status status) {
Task task = new Task();
- task.setId(idGenerator.getAndIncrement());
task.setTitle(title);
task.setDescription(description);
- task.setPriority(priority);
- task.setStatus(status);
+ task.setPriority(priority.name());
+ task.setStatus(status.name());
task.setDeadline(LocalDateTime.now().plusDays(7));
- taskRepository.create(task);
+ taskRepository.save(task);
}
@Override
public Task findById(Long id) {
- return taskRepository.read(id);
+ return taskRepository.findById(id).orElse(null);
}
@Override
public void deleteById(Long id) {
- taskRepository.delete(id);
+ taskRepository.deleteById(id);
}
@Override
public void updateTask(Long id, String title, String description, Task.Priority priority, Task.Status status) {
- Task task = taskRepository.read(id);
+ Task task = taskRepository.findById(id).orElse(null);
if (task != null) {
task.setTitle(title);
task.setDescription(description);
- task.setPriority(priority);
- task.setStatus(status);
- taskRepository.update(task);
+ task.setPriority(priority.name());
+ task.setStatus(status.name());
+ taskRepository.save(task);
}
}
@Override
public List findAll() {
- return taskRepository.findAll();
+ return StreamSupport.stream(taskRepository.findAll().spliterator(), false)
+ .toList();
}
@Override
public List findByStatus(Task.Status status) {
- return taskRepository.findAll().stream()
- .filter(task -> task.getStatus() == status)
- .toList();
+ return taskRepository.findByStatus(status.name());
}
}
\ No newline at end of file
diff --git a/NauJava/src/main/java/ru/andrmuratov/NauJava/service/UserService.java b/NauJava/src/main/java/ru/andrmuratov/NauJava/service/UserService.java
new file mode 100644
index 0000000..41a49e0
--- /dev/null
+++ b/NauJava/src/main/java/ru/andrmuratov/NauJava/service/UserService.java
@@ -0,0 +1,6 @@
+package ru.andrmuratov.NauJava.service;
+
+public interface UserService {
+ void createUserWithTask(String name, String email, String role, String taskTitle);
+ void deleteUserWithTasks(Long userId);
+}
\ No newline at end of file
diff --git a/NauJava/src/main/java/ru/andrmuratov/NauJava/service/UserServiceImpl.java b/NauJava/src/main/java/ru/andrmuratov/NauJava/service/UserServiceImpl.java
new file mode 100644
index 0000000..6142745
--- /dev/null
+++ b/NauJava/src/main/java/ru/andrmuratov/NauJava/service/UserServiceImpl.java
@@ -0,0 +1,47 @@
+package ru.andrmuratov.NauJava.service;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import ru.andrmuratov.NauJava.entity.Task;
+import ru.andrmuratov.NauJava.entity.User;
+import ru.andrmuratov.NauJava.repository.TaskRepository;
+import ru.andrmuratov.NauJava.repository.UserRepository;
+
+import java.time.LocalDateTime;
+
+@Service
+public class UserServiceImpl implements UserService {
+
+ private final UserRepository userRepository;
+ private final TaskRepository taskRepository;
+
+ @Autowired
+ public UserServiceImpl(UserRepository userRepository, TaskRepository taskRepository) {
+ this.userRepository = userRepository;
+ this.taskRepository = taskRepository;
+ }
+
+ @Override
+ @Transactional
+ public void createUserWithTask(String name, String email, String role, String taskTitle) {
+ User user = new User();
+ user.setName(name);
+ user.setEmail(email);
+ user.setRole(role);
+ userRepository.save(user);
+
+ Task task = new Task();
+ task.setTitle(taskTitle);
+ task.setStatus("TODO");
+ task.setDeadline(LocalDateTime.now().plusDays(7));
+ task.setUser(user);
+ taskRepository.save(task);
+ }
+
+ @Override
+ @Transactional
+ public void deleteUserWithTasks(Long userId) {
+ userRepository.deleteById(userId);
+ }
+}
\ No newline at end of file
diff --git a/NauJava/src/main/resources/application.properties b/NauJava/src/main/resources/application.properties
index 8eb9f8b..b9c2b85 100644
--- a/NauJava/src/main/resources/application.properties
+++ b/NauJava/src/main/resources/application.properties
@@ -1,3 +1,14 @@
app.name=TaskFlow
-app.version=1.0.0
+app.version=2.0.0
+
+spring.datasource.url=jdbc:postgresql://localhost:5432/taskflow
+spring.datasource.username=postgres
+spring.datasource.password=naumen
+spring.datasource.driver-class-name=org.postgresql.Driver
+
+spring.jpa.hibernate.ddl-auto=update
+spring.jpa.show-sql=true
+spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
+spring.jpa.properties.hibernate.format_sql=true
+
management.endpoints.web.exposure.include=*
\ No newline at end of file
diff --git a/NauJava/src/test/java/ru/andrmuratov/NauJava/UserRepositoryTest.java b/NauJava/src/test/java/ru/andrmuratov/NauJava/UserRepositoryTest.java
new file mode 100644
index 0000000..9980a16
--- /dev/null
+++ b/NauJava/src/test/java/ru/andrmuratov/NauJava/UserRepositoryTest.java
@@ -0,0 +1,46 @@
+package ru.andrmuratov.NauJava;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import ru.andrmuratov.NauJava.entity.User;
+import ru.andrmuratov.NauJava.repository.UserRepository;
+
+import java.util.List;
+import java.util.UUID;
+
+@SpringBootTest
+class UserRepositoryTest {
+
+ @Autowired
+ private UserRepository userRepository;
+
+ @Test
+ void testFindByName() {
+ String name = UUID.randomUUID().toString();
+ User user = new User();
+ user.setName(name);
+ user.setEmail(name + "@test.com");
+ user.setRole("USER");
+ userRepository.save(user);
+
+ List found = userRepository.findByName(name);
+ Assertions.assertFalse(found.isEmpty());
+ Assertions.assertEquals(name, found.get(0).getName());
+ }
+
+ @Test
+ void testCriteriaAPI() {
+ String name = UUID.randomUUID().toString();
+ User user = new User();
+ user.setName(name);
+ user.setEmail(name + "@test.com");
+ user.setRole("ADMIN");
+ userRepository.save(user);
+
+ List found = userRepository.findByNameCriteria(name);
+ Assertions.assertFalse(found.isEmpty());
+ Assertions.assertEquals(name, found.get(0).getName());
+ }
+}
\ No newline at end of file
diff --git a/NauJava/src/test/java/ru/andrmuratov/NauJava/UserServiceTest.java b/NauJava/src/test/java/ru/andrmuratov/NauJava/UserServiceTest.java
new file mode 100644
index 0000000..8f766db
--- /dev/null
+++ b/NauJava/src/test/java/ru/andrmuratov/NauJava/UserServiceTest.java
@@ -0,0 +1,35 @@
+package ru.andrmuratov.NauJava;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import ru.andrmuratov.NauJava.entity.User;
+import ru.andrmuratov.NauJava.repository.UserRepository;
+import ru.andrmuratov.NauJava.service.UserService;
+
+import java.util.UUID;
+
+@SpringBootTest
+class UserServiceTest {
+
+ @Autowired
+ private UserService userService;
+
+ @Autowired
+ private UserRepository userRepository;
+
+ @Test
+ void testCreateUserWithTask() {
+ String name = UUID.randomUUID().toString();
+ String email = name + "@test.com";
+ userService.createUserWithTask(name, email, "USER", "Test Task");
+
+ User found = userRepository.findByRoleJPQL("USER").stream()
+ .filter(u -> u.getEmail().equals(email))
+ .findFirst()
+ .orElse(null);
+ Assertions.assertNotNull(found);
+ Assertions.assertEquals(name, found.getName());
+ }
+}
\ No newline at end of file