commit 786d367b5f7bbf2445a87a58d632298ebe58e303 Author: Anastasia Tarazevich Date: Tue Jan 20 12:59:58 2026 +0300 feat: Initial commit 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 0000000..4a2cb86 Binary files /dev/null and b/libs/NTO-2025-Encoder-1.0-SNAPSHOT-obf.jar differ diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..ed31811 --- /dev/null +++ b/pom.xml @@ -0,0 +1,49 @@ + + + 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 + + + + + org.springframework.boot + spring-boot-starter-web + + + 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..2b66c55 --- /dev/null +++ b/src/main/java/ru/example/nto/App.java @@ -0,0 +1,11 @@ +package ru.example.nto; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +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..0bf37b7 --- /dev/null +++ b/src/main/java/ru/example/nto/controller/CodeController.java @@ -0,0 +1,39 @@ +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) { + //Ответ: 1721890220 - (id % 100) * 17 + return encoderApi.encode(null, id); + } + + @GetMapping("/task2/{id}") + public int getTask2Code(@PathVariable long id) { + //Ответ: 951167143 - (id % 100) * 17 + return encoderApi.encode(departmentService.getAll(), id); + } + + @GetMapping("/task3/{id}") + public int getTask3Code(@PathVariable long id) { + //Ответ: 1650897291 - (id % 100) * 17 + 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..437e9ac --- /dev/null +++ b/src/main/java/ru/example/nto/entity/Department.java @@ -0,0 +1,60 @@ +package ru.example.nto.entity; + +import jakarta.persistence.*; + +import java.util.Objects; + +@Entity +@Table(name = "department") +public class Department { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private long id; + + @Column(name = "name") + 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..873c2e8 --- /dev/null +++ b/src/main/java/ru/example/nto/repository/DepartmentRepository.java @@ -0,0 +1,10 @@ +package ru.example.nto.repository; + +import org.springframework.data.jpa.repository.JpaRepository; +import ru.example.nto.entity.Department; + +import java.util.Optional; + +public interface DepartmentRepository extends JpaRepository { + Optional findByName(String name); +} 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..8eb13c8 --- /dev/null +++ b/src/main/java/ru/example/nto/service/impl/DepartmentServiceImpl.java @@ -0,0 +1,30 @@ +package ru.example.nto.service.impl; + +import org.springframework.stereotype.Service; +import ru.example.nto.entity.Department; +import ru.example.nto.exception.DepartmentNotFoundException; +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; + + public DepartmentServiceImpl(DepartmentRepository departmentRepository) { + this.departmentRepository = departmentRepository; + } + + @Override + public List getAll() { + return departmentRepository.findAll(); + } + + @Override + public Department getByName(String name) { + return departmentRepository.findByName(name) + .orElseThrow(() -> new DepartmentNotFoundException("Department " + name + " not found!")); + } +} 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