From 80b7e8e22fbd8e90c4a2620feaa52604886f09cc Mon Sep 17 00:00:00 2001 From: Andrey Limasov Date: Tue, 4 Nov 2025 14:25:40 +0300 Subject: [PATCH] Initial commit --- .gitignore | 35 +++++++++++ libs/NTO-2025-Encoder-1.0-SNAPSHOT-obf.jar | Bin 0 -> 3632 bytes pom.xml | 45 ++++++++++++++ src/main/java/ru/example/nto/App.java | 9 +++ .../nto/controller/CodeController.java | 35 +++++++++++ .../nto/controller/DepartmentController.java | 31 ++++++++++ .../ru/example/nto/entity/Department.java | 56 ++++++++++++++++++ .../DepartmentNotFoundException.java | 7 +++ .../nto/repository/DepartmentRepository.java | 11 ++++ .../nto/service/DepartmentService.java | 11 ++++ .../service/impl/DepartmentServiceImpl.java | 37 ++++++++++++ src/main/resources/application.yml | 26 ++++++++ .../1.0/2025-10-12--0001-department.xml | 31 ++++++++++ .../data/2025-10-12--0001-department-data.xml | 16 +++++ .../csv/2025-10-12--0001-department-data.csv | 4 ++ .../db.changelog/db.changelog-master.xml | 10 ++++ 16 files changed, 364 insertions(+) create mode 100644 .gitignore create mode 100644 libs/NTO-2025-Encoder-1.0-SNAPSHOT-obf.jar create mode 100644 pom.xml create mode 100644 src/main/java/ru/example/nto/App.java create mode 100644 src/main/java/ru/example/nto/controller/CodeController.java create mode 100644 src/main/java/ru/example/nto/controller/DepartmentController.java create mode 100644 src/main/java/ru/example/nto/entity/Department.java create mode 100644 src/main/java/ru/example/nto/exception/DepartmentNotFoundException.java create mode 100644 src/main/java/ru/example/nto/repository/DepartmentRepository.java create mode 100644 src/main/java/ru/example/nto/service/DepartmentService.java create mode 100644 src/main/java/ru/example/nto/service/impl/DepartmentServiceImpl.java create mode 100644 src/main/resources/application.yml create mode 100644 src/main/resources/db.changelog/1.0/2025-10-12--0001-department.xml create mode 100644 src/main/resources/db.changelog/data/2025-10-12--0001-department-data.xml create mode 100644 src/main/resources/db.changelog/data/csv/2025-10-12--0001-department-data.csv create mode 100644 src/main/resources/db.changelog/db.changelog-master.xml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d769462 --- /dev/null +++ b/.gitignore @@ -0,0 +1,35 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/libs/NTO-2025-Encoder-1.0-SNAPSHOT-obf.jar b/libs/NTO-2025-Encoder-1.0-SNAPSHOT-obf.jar new file mode 100644 index 0000000000000000000000000000000000000000..4a2cb86065c2f65730bfec1eeef900ef8b524689 GIT binary patch literal 3632 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 literal 0 HcmV?d00001 diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..05ea605 --- /dev/null +++ b/pom.xml @@ -0,0 +1,45 @@ + + + 4.0.0 + + org.example + NTO-2025-Individual-Task + 1.0-SNAPSHOT + + + 17 + 17 + UTF-8 + + + + org.springframework.boot + spring-boot-starter-parent + 3.5.5 + + + + + com.h2database + h2 + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.liquibase + liquibase-core + + + org.example + NTO-2025-Encoder + 1.0-SNAPSHOT + system + ${project.basedir}/libs/NTO-2025-Encoder-1.0-SNAPSHOT-obf.jar + + + + \ No newline at end of file diff --git a/src/main/java/ru/example/nto/App.java b/src/main/java/ru/example/nto/App.java new file mode 100644 index 0000000..87bb934 --- /dev/null +++ b/src/main/java/ru/example/nto/App.java @@ -0,0 +1,9 @@ +package ru.example.nto; + +import org.springframework.boot.SpringApplication; + +public class App { + public static void main(String[] args) { + SpringApplication.run(App.class, args); + } +} diff --git a/src/main/java/ru/example/nto/controller/CodeController.java b/src/main/java/ru/example/nto/controller/CodeController.java new file mode 100644 index 0000000..0b17d14 --- /dev/null +++ b/src/main/java/ru/example/nto/controller/CodeController.java @@ -0,0 +1,35 @@ +package ru.example.nto.controller; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import ru.example.nto.service.DepartmentService; +import ru.nto.security.Encoder; +import ru.nto.security.EncoderApi; + +@RestController +@RequestMapping("code") +public class CodeController { + private final DepartmentService departmentService; + private final EncoderApi encoderApi = Encoder.create(); + + public CodeController(DepartmentService departmentService) { + this.departmentService = departmentService; + } + + @GetMapping("/task1/{id}") + public int getTask1Code(@PathVariable long id) { + return encoderApi.encode(null, id); + } + + @GetMapping("/task2/{id}") + public int getTask2Code(@PathVariable long id) { + return encoderApi.encode(departmentService.getAll(), id); + } + + @GetMapping("/task3/{id}") + public int getTask3Code(@PathVariable long id) { + return encoderApi.encode(departmentService.getByName("Департамент аналитики"), id); + } +} diff --git a/src/main/java/ru/example/nto/controller/DepartmentController.java b/src/main/java/ru/example/nto/controller/DepartmentController.java new file mode 100644 index 0000000..8290262 --- /dev/null +++ b/src/main/java/ru/example/nto/controller/DepartmentController.java @@ -0,0 +1,31 @@ +package ru.example.nto.controller; + +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.*; +import ru.example.nto.entity.Department; +import ru.example.nto.service.DepartmentService; + +import java.util.List; + +@RestController +@RequestMapping("api/v1/department") +public class DepartmentController { + + private final DepartmentService departmentService; + + public DepartmentController(DepartmentService departmentService) { + this.departmentService = departmentService; + } + + @GetMapping + @ResponseStatus(code = HttpStatus.OK) + public List getAll() { + return departmentService.getAll(); + } + + @GetMapping("/{name}") + @ResponseStatus(HttpStatus.OK) + public Department getByName(@PathVariable String name) { + return departmentService.getByName(name); + } +} diff --git a/src/main/java/ru/example/nto/entity/Department.java b/src/main/java/ru/example/nto/entity/Department.java new file mode 100644 index 0000000..c9bf32b --- /dev/null +++ b/src/main/java/ru/example/nto/entity/Department.java @@ -0,0 +1,56 @@ +package ru.example.nto.entity; + +import java.util.Objects; + +//TODO: Задание 2 +// Добавьте все необходимые аннотации для класса-сущности Department. +public class Department { + + private long id; + + private String name; + + public Department() { + } + + public Department(long id, String name) { + this.id = id; + this.name = name; + } + + public long getId() { + return id; + } + + public String getName() { + return name; + } + + public void setId(long id) { + this.id = id; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public String toString() { + return "Department{" + + "id=" + id + + ", name='" + name + '\'' + + '}'; + } + + @Override + public boolean equals(Object o) { + if (o == null || getClass() != o.getClass()) return false; + Department that = (Department) o; + return id == that.id && Objects.equals(name, that.name); + } + + @Override + public int hashCode() { + return Objects.hash(id, name); + } +} diff --git a/src/main/java/ru/example/nto/exception/DepartmentNotFoundException.java b/src/main/java/ru/example/nto/exception/DepartmentNotFoundException.java new file mode 100644 index 0000000..d0fe942 --- /dev/null +++ b/src/main/java/ru/example/nto/exception/DepartmentNotFoundException.java @@ -0,0 +1,7 @@ +package ru.example.nto.exception; + +public class DepartmentNotFoundException extends RuntimeException { + public DepartmentNotFoundException(String msg) { + super(msg); + } +} diff --git a/src/main/java/ru/example/nto/repository/DepartmentRepository.java b/src/main/java/ru/example/nto/repository/DepartmentRepository.java new file mode 100644 index 0000000..92330e6 --- /dev/null +++ b/src/main/java/ru/example/nto/repository/DepartmentRepository.java @@ -0,0 +1,11 @@ +package ru.example.nto.repository; + +//TODO: Задание 2 +// Опишите интерфейс DepartmentRepository, +// так чтобы он обеспечивал корректную работу со всеми CRUD-операциями сущности Department. +public interface DepartmentRepository { + + //TODO: Задание 3 + // Добавьте метод для получения из базы данных департамента по его наименованию. + +} diff --git a/src/main/java/ru/example/nto/service/DepartmentService.java b/src/main/java/ru/example/nto/service/DepartmentService.java new file mode 100644 index 0000000..012a9a8 --- /dev/null +++ b/src/main/java/ru/example/nto/service/DepartmentService.java @@ -0,0 +1,11 @@ +package ru.example.nto.service; + +import ru.example.nto.entity.Department; + +import java.util.List; + +public interface DepartmentService { + List getAll(); + + Department getByName(String name); +} diff --git a/src/main/java/ru/example/nto/service/impl/DepartmentServiceImpl.java b/src/main/java/ru/example/nto/service/impl/DepartmentServiceImpl.java new file mode 100644 index 0000000..bc99cb7 --- /dev/null +++ b/src/main/java/ru/example/nto/service/impl/DepartmentServiceImpl.java @@ -0,0 +1,37 @@ +package ru.example.nto.service.impl; + +import org.springframework.stereotype.Service; +import ru.example.nto.entity.Department; +import ru.example.nto.repository.DepartmentRepository; +import ru.example.nto.service.DepartmentService; + +import java.util.List; + +@Service +public class DepartmentServiceImpl implements DepartmentService { + + private final DepartmentRepository departmentRepository; + + //TODO: Задание 2 + // Исправьте конструктор так, чтобы он корректно инициализировал поле departmentRepository. + public DepartmentServiceImpl() { + this.departmentRepository = null; + } + + @Override + public List getAll() { + //TODO: Задание 2 + // Реализуйте метод, который возвращает всех департаментов, которые есть в базе данных. + return null; + } + + @Override + public Department getByName(String name) { + //TODO: Задание 3 + // Реализуйте метод, который получает департамент по его наименованию + // и обрабатывает результат слоя repository. + // Если департамента с указанным наименованием в базе данных нет, + // то необходимо выбрасывать DepartmentNotFoundException + return null; + } +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml new file mode 100644 index 0000000..2246a16 --- /dev/null +++ b/src/main/resources/application.yml @@ -0,0 +1,26 @@ +spring: + datasource: + url: jdbc:h2:mem:testdb + + h2: + console: + #enabled: false + enabled: true + + jpa: + generate-ddl: false + #generate-ddl: true + + hibernate: + ddl-auto: none + #ddl-auto: create-drop + + # Показываем запросы + show-sql: true + + liquibase: + enabled: true + change-log: classpath:db.changelog/db.changelog-master.xml + +server: + port: 8083 \ No newline at end of file diff --git a/src/main/resources/db.changelog/1.0/2025-10-12--0001-department.xml b/src/main/resources/db.changelog/1.0/2025-10-12--0001-department.xml new file mode 100644 index 0000000..8451c4d --- /dev/null +++ b/src/main/resources/db.changelog/1.0/2025-10-12--0001-department.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/db.changelog/data/2025-10-12--0001-department-data.xml b/src/main/resources/db.changelog/data/2025-10-12--0001-department-data.xml new file mode 100644 index 0000000..bcbae22 --- /dev/null +++ b/src/main/resources/db.changelog/data/2025-10-12--0001-department-data.xml @@ -0,0 +1,16 @@ + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/db.changelog/data/csv/2025-10-12--0001-department-data.csv b/src/main/resources/db.changelog/data/csv/2025-10-12--0001-department-data.csv new file mode 100644 index 0000000..3ca7be3 --- /dev/null +++ b/src/main/resources/db.changelog/data/csv/2025-10-12--0001-department-data.csv @@ -0,0 +1,4 @@ +id;name +1;Департамент по работе с персоналом +2;Департамент информационных технологий +3;Департамент аналитики \ No newline at end of file diff --git a/src/main/resources/db.changelog/db.changelog-master.xml b/src/main/resources/db.changelog/db.changelog-master.xml new file mode 100644 index 0000000..d945125 --- /dev/null +++ b/src/main/resources/db.changelog/db.changelog-master.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file