From 3d98b06a16a06652224961da8e13c2f0696b7d95 Mon Sep 17 00:00:00 2001 From: esoe Date: Tue, 15 Oct 2024 16:27:52 +0300 Subject: [PATCH] qq --- documentation/general/architecture.md | 3 + documentation/general/states.png | Bin 0 -> 156610 bytes documentation/general/states.puml | 49 +- face/logs/teh.log | 75 +- face/logs/teh.log.2024-10-07.0.gz | Bin 480 -> 0 bytes face/logs/teh.log.2024-10-14.0.gz | Bin 0 -> 2295 bytes .../technologies/face/config/WebConfig.java | 21 + .../v1/mainframe/MainframeController.java | 128 +++- .../face/models/FileMetadata.java | 56 ++ .../gsp/technologies/face/models/Post.java | 21 + .../face/services/StorageService.java | 698 ++++++++++++++++++ .../gsp/technologies/face/teh/fs/MpFile.java | 72 ++ .../resources/static/content/md/mainframe.md | 9 +- .../templates/fragments/common/footer.html | 13 + .../templates/fragments/storage.html | 27 + .../main/resources/templates/mainframe.html | 132 +++- source/docker-compose.yaml | 25 + source/dockerfile | 8 + source/pom.xml | 12 +- .../controllers/api/v1/StorageController.java | 86 +++ .../technologies/source/models/Building.java | 36 + .../technologies/source/models/Course.java | 47 ++ .../source/models/EducationEntry.java | 36 + .../source/models/FileMetadata.java | 56 ++ .../source/models/Organization.java | 44 ++ .../gsp/technologies/source/models/Post.java | 21 + .../technologies/source/models/Program.java | 32 + .../source/models/ProgramCretarea.java | 42 ++ .../technologies/source/models/Student.java | 44 ++ .../technologies/source/models/Teacher.java | 72 ++ .../repositories/FileMetadataRepository.java | 14 + .../source/repositories/PostRepository.java | 10 + .../source/services/FileMetadataService.java | 15 + .../source/services/PostService.java | 15 + .../source/teh/strings/Arrayer.java | 51 ++ .../source/teh/strings/Dater.java | 16 + .../source/teh/strings/Naimer.java | 237 ++++++ .../source/teh/strings/Stringer.java | 54 ++ .../src/main/resources/application.properties | 1 - source/src/main/resources/application.yaml | 18 + 40 files changed, 2255 insertions(+), 41 deletions(-) create mode 100644 documentation/general/states.png delete mode 100644 face/logs/teh.log.2024-10-07.0.gz create mode 100644 face/logs/teh.log.2024-10-14.0.gz create mode 100644 face/src/main/java/gsp/technologies/face/config/WebConfig.java create mode 100644 face/src/main/java/gsp/technologies/face/models/FileMetadata.java create mode 100644 face/src/main/java/gsp/technologies/face/models/Post.java create mode 100644 face/src/main/java/gsp/technologies/face/services/StorageService.java create mode 100644 face/src/main/java/gsp/technologies/face/teh/fs/MpFile.java create mode 100644 face/src/main/resources/templates/fragments/common/footer.html create mode 100644 face/src/main/resources/templates/fragments/storage.html create mode 100644 source/docker-compose.yaml create mode 100644 source/dockerfile create mode 100644 source/src/main/java/gsp/technologies/source/controllers/api/v1/StorageController.java create mode 100644 source/src/main/java/gsp/technologies/source/models/Building.java create mode 100644 source/src/main/java/gsp/technologies/source/models/Course.java create mode 100644 source/src/main/java/gsp/technologies/source/models/EducationEntry.java create mode 100644 source/src/main/java/gsp/technologies/source/models/FileMetadata.java create mode 100644 source/src/main/java/gsp/technologies/source/models/Organization.java create mode 100644 source/src/main/java/gsp/technologies/source/models/Post.java create mode 100644 source/src/main/java/gsp/technologies/source/models/Program.java create mode 100644 source/src/main/java/gsp/technologies/source/models/ProgramCretarea.java create mode 100644 source/src/main/java/gsp/technologies/source/models/Student.java create mode 100644 source/src/main/java/gsp/technologies/source/models/Teacher.java create mode 100644 source/src/main/java/gsp/technologies/source/repositories/FileMetadataRepository.java create mode 100644 source/src/main/java/gsp/technologies/source/repositories/PostRepository.java create mode 100644 source/src/main/java/gsp/technologies/source/services/FileMetadataService.java create mode 100644 source/src/main/java/gsp/technologies/source/services/PostService.java create mode 100644 source/src/main/java/gsp/technologies/source/teh/strings/Arrayer.java create mode 100644 source/src/main/java/gsp/technologies/source/teh/strings/Dater.java create mode 100644 source/src/main/java/gsp/technologies/source/teh/strings/Naimer.java create mode 100644 source/src/main/java/gsp/technologies/source/teh/strings/Stringer.java delete mode 100644 source/src/main/resources/application.properties create mode 100644 source/src/main/resources/application.yaml diff --git a/documentation/general/architecture.md b/documentation/general/architecture.md index fdceb7a..e703f36 100644 --- a/documentation/general/architecture.md +++ b/documentation/general/architecture.md @@ -1,3 +1,6 @@ # Архитектура платформы teh ## диаграмма компонентов ![диаграмма компонентов](architecture.png) +## диаграмма состояний (teh.face) +![диаграмма компонентов](states.png) + diff --git a/documentation/general/states.png b/documentation/general/states.png new file mode 100644 index 0000000000000000000000000000000000000000..32b2cb6dc28fbb7846454438653c942c5c5c4bdf GIT binary patch literal 156610 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 T#+A>)Z>SR{-x-s?w)y$rNabMe literal 0 HcmV?d00001 diff --git a/documentation/general/states.puml b/documentation/general/states.puml index 8641f82..c9496bf 100644 --- a/documentation/general/states.puml +++ b/documentation/general/states.puml @@ -1,4 +1,5 @@ @startuml +title "teh.face : диаграмма состояний (state)\n {структура графического интерфейса платформы}" left to right direction ' МЕЙНФРЕЙМ @@ -11,25 +12,46 @@ state "mainframe" as mainframe { baseStat : - количество программ обучения baseStat : - ... - state teachersLink { - teachersLink : Переход к работе с данными преподавателей + state buildingsLink { + buildingsLink : Переход к работе с данными объектов строительства + } + state coursesLink { + coursesLink : Переход к работе с данными курсов + } + state cretareasLink { + cretareasLink : Переход к работе с критериями программ обучения + } + state educationsLink { + educationsLink : Переход к работе с записями реестра обученных + } + state organizationsLink { + organizationsLink : Переход к работе с записями реестра обученных } state programsLink { programsLink : Переход к работе с данными программ обучения } - state coursesLink { - coursesLink : Переход к работе с данными курсов + state studentsLink { + studentsLink : Переход к работе с данными программ обучения } - state buildingsLink { - buildingsLink : Переход к работе с данными объектов строительства + state teachersLink { + teachersLink : Переход к работе с данными преподавателей } + } + + state "Извлечение данных с сервера" as execute { + execute: Формы ФРДО + execute: Формы ЕИСОТ + execute: Протоколы + execute: Документы об обучении + execute: Приказы о зачислении + execute: Приказы об отчислении } - state "Статистика по файлобменнику" as storageStat { - storageStat: Данные по загруженным документам: - storageStat: - количество загруженных документов\n по видам документов - storageStat: - + state "Загрузка данных на сервер" as storageStat { + storageStat: Последние загруженные документы + storageStat: Загрузка файлов в хранилище + state storageLink { storageLink : Переход к работе с файлообменником } @@ -103,11 +125,4 @@ toMainframe --> mainframe storageLink --> storage viewLink --> view -' mainframe : пользователь видит: -' mainframe : - статистика базы данных -' mainframe : - статистика файлообменника -' mainframe : - панель для переходов - - - @enduml \ No newline at end of file diff --git a/face/logs/teh.log b/face/logs/teh.log index 9d8571d..19614eb 100644 --- a/face/logs/teh.log +++ b/face/logs/teh.log @@ -1,3 +1,72 @@ -{"@timestamp":"2024-10-14T07:42:59.798197100Z","log.level":"INFO","process.pid":24236,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"Starting FaceApplicationTests using Java 17.0.7 with PID 24236 (started by devuser in C:\\Users\\devuser\\Documents\\code\\teh\\face)","ecs.version":"8.11"} -{"@timestamp":"2024-10-14T07:42:59.811604300Z","log.level":"INFO","process.pid":24236,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"No active profile set, falling back to 1 default profile: \"default\"","ecs.version":"8.11"} -{"@timestamp":"2024-10-14T07:43:01.511680800Z","log.level":"INFO","process.pid":24236,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"Started FaceApplicationTests in 2.178 seconds (process running for 3.357)","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T06:58:25.401365200Z","log.level":"INFO","process.pid":18360,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"Starting FaceApplicationTests using Java 17.0.7 with PID 18360 (started by devuser in C:\\Users\\devuser\\Documents\\code\\teh\\face)","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T06:58:25.420342800Z","log.level":"INFO","process.pid":18360,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"No active profile set, falling back to 1 default profile: \"default\"","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T06:58:27.149308400Z","log.level":"INFO","process.pid":18360,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"Started FaceApplicationTests in 2.195 seconds (process running for 3.296)","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T06:59:59.876416300Z","log.level":"INFO","process.pid":21256,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"Starting FaceApplicationTests using Java 17.0.7 with PID 21256 (started by devuser in C:\\Users\\devuser\\Documents\\code\\teh\\face)","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T06:59:59.884775400Z","log.level":"INFO","process.pid":21256,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"No active profile set, falling back to 1 default profile: \"default\"","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T07:00:01.898558600Z","log.level":"INFO","process.pid":21256,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"Started FaceApplicationTests in 2.456 seconds (process running for 3.62)","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T07:01:15.761298200Z","log.level":"INFO","process.pid":25484,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"Starting FaceApplicationTests using Java 17.0.7 with PID 25484 (started by devuser in C:\\Users\\devuser\\Documents\\code\\teh\\face)","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T07:01:15.768132300Z","log.level":"INFO","process.pid":25484,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"No active profile set, falling back to 1 default profile: \"default\"","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T07:01:17.384655100Z","log.level":"INFO","process.pid":25484,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"Started FaceApplicationTests in 2.041 seconds (process running for 3.126)","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T07:01:34.475610100Z","log.level":"INFO","process.pid":13404,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"Starting FaceApplicationTests using Java 17.0.7 with PID 13404 (started by devuser in C:\\Users\\devuser\\Documents\\code\\teh\\face)","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T07:01:34.486051900Z","log.level":"INFO","process.pid":13404,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"No active profile set, falling back to 1 default profile: \"default\"","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T07:01:36.009313200Z","log.level":"INFO","process.pid":13404,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"Started FaceApplicationTests in 1.981 seconds (process running for 3.109)","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T07:03:51.509645700Z","log.level":"INFO","process.pid":3924,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"Starting FaceApplicationTests using Java 17.0.7 with PID 3924 (started by devuser in C:\\Users\\devuser\\Documents\\code\\teh\\face)","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T07:03:51.515645500Z","log.level":"INFO","process.pid":3924,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"No active profile set, falling back to 1 default profile: \"default\"","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T07:03:53.098716800Z","log.level":"INFO","process.pid":3924,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"Started FaceApplicationTests in 2.027 seconds (process running for 3.091)","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T07:04:44.875344100Z","log.level":"INFO","process.pid":11632,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"Starting FaceApplicationTests using Java 17.0.7 with PID 11632 (started by devuser in C:\\Users\\devuser\\Documents\\code\\teh\\face)","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T07:04:44.885344900Z","log.level":"INFO","process.pid":11632,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"No active profile set, falling back to 1 default profile: \"default\"","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T07:04:46.599374900Z","log.level":"INFO","process.pid":11632,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"Started FaceApplicationTests in 2.208 seconds (process running for 3.45)","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T07:17:20.407868200Z","log.level":"INFO","process.pid":20068,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"Starting FaceApplicationTests using Java 17.0.7 with PID 20068 (started by devuser in C:\\Users\\devuser\\Documents\\code\\teh\\face)","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T07:17:20.414844100Z","log.level":"INFO","process.pid":20068,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"No active profile set, falling back to 1 default profile: \"default\"","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T07:17:22.041664800Z","log.level":"INFO","process.pid":20068,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"Started FaceApplicationTests in 2.199 seconds (process running for 3.335)","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T07:20:25.233141700Z","log.level":"INFO","process.pid":18632,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"Starting FaceApplicationTests using Java 17.0.7 with PID 18632 (started by devuser in C:\\Users\\devuser\\Documents\\code\\teh\\face)","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T07:20:25.239706500Z","log.level":"INFO","process.pid":18632,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"No active profile set, falling back to 1 default profile: \"default\"","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T07:20:26.883033200Z","log.level":"INFO","process.pid":18632,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"Started FaceApplicationTests in 2.12 seconds (process running for 3.2)","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T07:20:41.404344Z","log.level":"INFO","process.pid":10532,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"Starting FaceApplicationTests using Java 17.0.7 with PID 10532 (started by devuser in C:\\Users\\devuser\\Documents\\code\\teh\\face)","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T07:20:41.410344700Z","log.level":"INFO","process.pid":10532,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"No active profile set, falling back to 1 default profile: \"default\"","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T07:20:43.516986100Z","log.level":"INFO","process.pid":10532,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"Started FaceApplicationTests in 2.638 seconds (process running for 3.995)","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T07:27:16.970919600Z","log.level":"INFO","process.pid":18168,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"Starting FaceApplicationTests using Java 17.0.7 with PID 18168 (started by devuser in C:\\Users\\devuser\\Documents\\code\\teh\\face)","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T07:27:16.980920100Z","log.level":"INFO","process.pid":18168,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"No active profile set, falling back to 1 default profile: \"default\"","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T07:27:18.804281800Z","log.level":"INFO","process.pid":18168,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"Started FaceApplicationTests in 2.313 seconds (process running for 3.511)","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T07:29:00.247600900Z","log.level":"INFO","process.pid":13576,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"Starting FaceApplicationTests using Java 17.0.7 with PID 13576 (started by devuser in C:\\Users\\devuser\\Documents\\code\\teh\\face)","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T07:29:00.258902300Z","log.level":"INFO","process.pid":13576,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"No active profile set, falling back to 1 default profile: \"default\"","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T07:29:02.130547300Z","log.level":"INFO","process.pid":13576,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"Started FaceApplicationTests in 2.438 seconds (process running for 3.687)","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T08:15:33.927111800Z","log.level":"INFO","process.pid":19756,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"Starting FaceApplicationTests using Java 17.0.7 with PID 19756 (started by devuser in C:\\Users\\devuser\\Documents\\code\\teh\\face)","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T08:15:33.934116500Z","log.level":"INFO","process.pid":19756,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"No active profile set, falling back to 1 default profile: \"default\"","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T08:15:35.917222400Z","log.level":"INFO","process.pid":19756,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"Started FaceApplicationTests in 2.559 seconds (process running for 3.912)","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T08:17:20.248731200Z","log.level":"INFO","process.pid":18980,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"Starting FaceApplicationTests using Java 17.0.7 with PID 18980 (started by devuser in C:\\Users\\devuser\\Documents\\code\\teh\\face)","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T08:17:20.256729800Z","log.level":"INFO","process.pid":18980,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"No active profile set, falling back to 1 default profile: \"default\"","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T08:17:22.171203900Z","log.level":"INFO","process.pid":18980,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"Started FaceApplicationTests in 2.491 seconds (process running for 3.731)","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T08:36:01.602371300Z","log.level":"INFO","process.pid":15980,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"Starting FaceApplicationTests using Java 17.0.7 with PID 15980 (started by devuser in C:\\Users\\devuser\\Documents\\code\\teh\\face)","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T08:36:01.608341Z","log.level":"INFO","process.pid":15980,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"No active profile set, falling back to 1 default profile: \"default\"","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T08:36:03.146454900Z","log.level":"INFO","process.pid":15980,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"Started FaceApplicationTests in 2.055 seconds (process running for 3.15)","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T08:41:59.441333900Z","log.level":"INFO","process.pid":14156,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"Starting FaceApplicationTests using Java 17.0.7 with PID 14156 (started by devuser in C:\\Users\\devuser\\Documents\\code\\teh\\face)","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T08:41:59.447360Z","log.level":"INFO","process.pid":14156,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"No active profile set, falling back to 1 default profile: \"default\"","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T08:42:00.967345600Z","log.level":"INFO","process.pid":14156,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"Started FaceApplicationTests in 1.995 seconds (process running for 3.092)","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T09:04:42.999341700Z","log.level":"INFO","process.pid":18848,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"Starting FaceApplicationTests using Java 17.0.7 with PID 18848 (started by devuser in C:\\Users\\devuser\\Documents\\code\\teh\\face)","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T09:04:43.008365200Z","log.level":"INFO","process.pid":18848,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"No active profile set, falling back to 1 default profile: \"default\"","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T09:04:45.431310200Z","log.level":"INFO","process.pid":18848,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"Started FaceApplicationTests in 3.125 seconds (process running for 4.801)","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T09:38:53.193947900Z","log.level":"INFO","process.pid":10880,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"Starting FaceApplicationTests using Java 17.0.7 with PID 10880 (started by devuser in C:\\Users\\devuser\\Documents\\code\\teh\\face)","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T09:38:53.200484Z","log.level":"INFO","process.pid":10880,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"No active profile set, falling back to 1 default profile: \"default\"","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T09:38:55.226375300Z","log.level":"INFO","process.pid":10880,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"Started FaceApplicationTests in 2.507 seconds (process running for 3.716)","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T09:44:15.428223500Z","log.level":"INFO","process.pid":21836,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"Starting FaceApplicationTests using Java 17.0.7 with PID 21836 (started by devuser in C:\\Users\\devuser\\Documents\\code\\teh\\face)","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T09:44:15.438215900Z","log.level":"INFO","process.pid":21836,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"No active profile set, falling back to 1 default profile: \"default\"","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T09:44:16.927268900Z","log.level":"INFO","process.pid":21836,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"Started FaceApplicationTests in 1.968 seconds (process running for 3.16)","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T09:47:54.022919800Z","log.level":"INFO","process.pid":24984,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"Starting FaceApplicationTests using Java 17.0.7 with PID 24984 (started by devuser in C:\\Users\\devuser\\Documents\\code\\teh\\face)","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T09:47:54.030918800Z","log.level":"INFO","process.pid":24984,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"No active profile set, falling back to 1 default profile: \"default\"","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T09:47:55.955495200Z","log.level":"INFO","process.pid":24984,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"Started FaceApplicationTests in 2.448 seconds (process running for 3.591)","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T09:49:45.291168600Z","log.level":"INFO","process.pid":20836,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"Starting FaceApplicationTests using Java 17.0.7 with PID 20836 (started by devuser in C:\\Users\\devuser\\Documents\\code\\teh\\face)","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T09:49:45.297167300Z","log.level":"INFO","process.pid":20836,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"No active profile set, falling back to 1 default profile: \"default\"","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T09:49:46.828682100Z","log.level":"INFO","process.pid":20836,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"Started FaceApplicationTests in 1.994 seconds (process running for 3.093)","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T09:53:07.279315Z","log.level":"INFO","process.pid":25072,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"Starting FaceApplicationTests using Java 17.0.7 with PID 25072 (started by devuser in C:\\Users\\devuser\\Documents\\code\\teh\\face)","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T09:53:07.286315500Z","log.level":"INFO","process.pid":25072,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"No active profile set, falling back to 1 default profile: \"default\"","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T09:53:08.864121700Z","log.level":"INFO","process.pid":25072,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"Started FaceApplicationTests in 2.028 seconds (process running for 3.193)","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T12:10:18.164651800Z","log.level":"INFO","process.pid":28300,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"Starting FaceApplicationTests using Java 17.0.7 with PID 28300 (started by devuser in C:\\Users\\devuser\\Documents\\code\\teh\\face)","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T12:10:18.172651500Z","log.level":"INFO","process.pid":28300,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"No active profile set, falling back to 1 default profile: \"default\"","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T12:10:19.745267700Z","log.level":"INFO","process.pid":28300,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"Started FaceApplicationTests in 2.047 seconds (process running for 3.157)","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T12:14:59.582298700Z","log.level":"INFO","process.pid":27480,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"Starting FaceApplicationTests using Java 17.0.7 with PID 27480 (started by devuser in C:\\Users\\devuser\\Documents\\code\\teh\\face)","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T12:14:59.589299300Z","log.level":"INFO","process.pid":27480,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"No active profile set, falling back to 1 default profile: \"default\"","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T12:15:01.111189500Z","log.level":"INFO","process.pid":27480,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"Started FaceApplicationTests in 1.986 seconds (process running for 3.104)","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T12:17:12.827823700Z","log.level":"INFO","process.pid":25856,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"Starting FaceApplicationTests using Java 17.0.7 with PID 25856 (started by devuser in C:\\Users\\devuser\\Documents\\code\\teh\\face)","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T12:17:12.833491600Z","log.level":"INFO","process.pid":25856,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"No active profile set, falling back to 1 default profile: \"default\"","ecs.version":"8.11"} +{"@timestamp":"2024-10-15T12:17:14.373969600Z","log.level":"INFO","process.pid":25856,"process.thread.name":"main","service.name":"face","service.version":"1","service.environment":"Production","service.node.name":"Primary","log.logger":"gsp.technologies.face.FaceApplicationTests","message":"Started FaceApplicationTests in 1.987 seconds (process running for 3.053)","ecs.version":"8.11"} diff --git a/face/logs/teh.log.2024-10-07.0.gz b/face/logs/teh.log.2024-10-07.0.gz deleted file mode 100644 index 3d0d08ddfc570856407a99665afd1e2ee7c423ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 480 zcmV<60U!P!iwFP!00000|K*iUYuqpphVT6q!lx7xA<6Q``qa`8NDt{k(o4}rk!QW4 zwqzvPC4~O>j>B%chm?f91iBX^Ud@bV=3&N<*{5U&h)EA))?|VSdBNEQtM1sUk!2$p zEm^$pzM|+r|N8{_8t8XZc!5fH?j<(GjE*O)4wX_YOTk7-x=rCyO&>=#Y zt%1F|(FP9G8A7z);RQcX!Ob>!H-JlcvktzUOj^ti!uj?&<~rCxhlhQ_zUv^M+{KY5 zFk9zQvJmO=Hod~n=W*<<(M!lX>_$XS>`K(#674qWkgV&-OO|Ac%hgvsYr-qaXhnY6 zv?c57OY+nWauyeVXvzHpX#uJUN%|NiOjqQO%Natju`+k9Uugy=AJmJV^qo+RY z%^ISzousm(2?)w-$t#whFoE0M47@l(I1Pd_!I6sbu8rhuS3C)ma|@x34FVEp691b;Pp+$ W%i^_7hChUV&cPo_rkgL62><{EEA>(U diff --git a/face/logs/teh.log.2024-10-14.0.gz b/face/logs/teh.log.2024-10-14.0.gz new file mode 100644 index 0000000000000000000000000000000000000000..0d11b5e61993d8d24472a503739e14b9eabf180c GIT binary patch literal 2295 zcmV*=$KUr?9OS73T0x{JQ94f>Rut$Sx(l>@8T{fp zC%MKFJFuM$MX~>VRO}@8p{odCfB+iE4K9v<#O4S3ilj)M-){bL+CDDF)B5r0X1+m> z^bPoLfPV5k6V9Itv#xLXlUU;@uN12s*Z1|^emt!Yr|s^3`n_jP&&T@E-`6ke3D|kZ)4#W; z&(o*xznxyKF@1HcuU~GbUw)l#mzQVxz|(d&{cT>YewP0qSF6j_)#}^*=DB`Hxwet7 zvs#^&&#P7alz)~_v}}%Fm?t}coB#ajw>H5HkUWJeCiugCTFYO1Stj{jciV?$IxeTL zr@QsTLxuOtdh@U8w4Xru+^wG z9dH&ZoBi(gIDK{b^3&mYx2uHi_J=9B5V>a^l$m%2awON7H3&lV*(8A;6|2S=Ct@G) zvM+&kOUNR>Q5tpzkQ|gu0Lop&B7nApVQEWPDSfLT`k9jBlzfqYDhQmDHwmFf#i}tz zs@R1eL&B_d1T69!r(zXAb^(0M0k0Q8TgANRmWqiHJ68eC9$jK4SqDmY7{zxsNuevG ztkxK+V`qXn2*InxH&DgI{3I$CJ&KQY!cjiEAjCWw$jR&GQl2@X^;Awc2^0Esto#RN2&vC>wu(6J7{&k*JSvY&A9tW2&z z_R(g3vP;RTHHInK2SFsv>b=M!!9hxPAs~B6lCVCPD<+^wkmb-)vPije9Yk@C9Yx3# zl?fIo*(ilRpDYhnvNOSyASUfPvPf{Ck_mz2JTXU9`(y?QD10&>n@O^s;Icx399SRp$T1d5oHg)=4z4iqvWkR5r>FnfD=<>8lBGFD zmnAL{hgZ3uFtW}4q{}C())=Z}7lQ18wMiO_1P3aa5MUQFB)v~&k$}P{%grJTpL=S_ zDupt~>^ugayz=0SgVFQju8P<&umt0SUjRgHve_cPfihNVcUa88kd;X?ivSe%Orx+P++wW_&q=ADkJ_rWNqz!FM5*(*wLO_B`yKF^I8ew^ooSh( zXMNMYMFI*X!={pX?mV?5u4i5u2{Gzod-gUDj{EXsVvV6PcE(o=$g=j(*&@M#GRF1D zGH{HbJ}t9IKp|rUO@}N%=Q=1gxQ{86KuQYCM)#7gLRcQ`j-B~QOcS*CS+K}&po|Fs zc0e9bTfJlvfTj?(IrYMq&NP37*_Ya(nOPlH0vj#l>k2EYHAd>#g&<*OR?dkxNpPHy z2?6jmtW1TpM`acXXiCW1V=sJXnm=Mq6H^Ehv8xC8lxVY%uWx{lSYxP?oe7demj0Rv z4pcIHozLr2%y`WNG?8VyhO9T$AGs!qb4i3jKU0xyQs|ti$YYi4m0Ab|r0R_Wt#;seRHnG8sn7gogf5M7tfd^ zI7-RR1d7YGK`E-|TpJ|NRx&P)Y(Kf!*J=rK@N-B`0u$t-?XHkDW3vdR>)f(hW2BN@ z2nMF4T}LJfj#IKqptw>XF6vq_4}^7C!uWPwXwxhk{{h+3mDx* z`VK5%q$Bo@FQTWYK5{llaGZiw0_19XIVJUxu|WcwR`F(X402biIKDRQdl#S{w&(_o z7o$xTeM9=o$hM?+e8>c-9uaSl;6ND@0`=}@Og?I5%p!rdjHTuc;0knwlVOH3d+$;y zzM%SE6;^vH`h;v~U(y>v_9-P*KZZ$sqg3o{esqB|LeVxQStRiPnRY>aYXISOD*=w| zwd1QWlFdVwzO0y7W2A~*2!@zJ+uLW7;5Z?x1ju=x(eu@sUoq;!HxpyA@78aEAkMMg zT&`eEuPDdz2C!N6(l^>#tT9x^&IE(t)8#fT;v1-8V*cQAiZK*zxr;>t3TMnWoiXe? zq73yG37#BL@FD0Bu+e&#J`LlMHDmAiWc?6n6Z{ql4wNw=5M5!ypzRPhNkDN-$<13O z0d@wJ@inps0K}p}kb!LWg!QOcHO5F0dxMuFYSa4``Hj=C3Lv;d1){c}&msVYgq600 Rh5y}(^k4XLw5N@t000IUSEK*{ literal 0 HcmV?d00001 diff --git a/face/src/main/java/gsp/technologies/face/config/WebConfig.java b/face/src/main/java/gsp/technologies/face/config/WebConfig.java new file mode 100644 index 0000000..c3faea9 --- /dev/null +++ b/face/src/main/java/gsp/technologies/face/config/WebConfig.java @@ -0,0 +1,21 @@ +package gsp.technologies.face.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.reactive.function.client.ExchangeStrategies; +import org.springframework.web.reactive.function.client.WebClient; + +@Configuration +public class WebConfig { + @Bean + WebClient webClient() { + final int maxInMemorySize = 1000 * 1024 * 1024; // 1000MB + final ExchangeStrategies exchangeStrategies = ExchangeStrategies.builder() + .codecs(configurer -> configurer.defaultCodecs().maxInMemorySize(maxInMemorySize)) + .build(); + WebClient webClient = WebClient.builder() + .exchangeStrategies(exchangeStrategies) + .build(); + return webClient; + } +} diff --git a/face/src/main/java/gsp/technologies/face/controllers/face/v1/mainframe/MainframeController.java b/face/src/main/java/gsp/technologies/face/controllers/face/v1/mainframe/MainframeController.java index 6eb2863..ea4305d 100644 --- a/face/src/main/java/gsp/technologies/face/controllers/face/v1/mainframe/MainframeController.java +++ b/face/src/main/java/gsp/technologies/face/controllers/face/v1/mainframe/MainframeController.java @@ -1,13 +1,137 @@ package gsp.technologies.face.controllers.face.v1.mainframe; +import java.time.Duration; +import java.util.Optional; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.ParameterizedTypeReference; +import org.springframework.http.HttpMethod; +import org.springframework.http.client.MultipartBodyBuilder; import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.reactive.function.BodyInserters; +import org.springframework.web.reactive.function.client.WebClient; + +import gsp.technologies.face.models.FileMetadata; +import gsp.technologies.face.models.Post; +import gsp.technologies.face.teh.fs.MpFile; +import reactor.core.publisher.Mono; @Controller +@RequestMapping(path = "/face/v1") public class MainframeController { + private static final Logger log = LoggerFactory.getLogger(MainframeController.class); + + @Autowired + private WebClient client; + + // @Autowired + // private Storage storage; + + @GetMapping("/mainframe") + public String mainframe(Model model) { + log.info("GET /face/v1/mainframe"); + + //добавляем объект Post для отправки сведений о новом документе в базу + Post post = new Post(); + model.addAttribute("newPost", post); - @GetMapping("/face/v1/mainframe") - public String mainframe(){ return "mainframe"; } + + /** + * Загрузка файла на сервер, + * + * Реализация: + * постим запись в базу ресурсов, получаем id документа + * отправляем файл в хранилище с новым именем {id}.{ext} + * + * @param file + * @return + */ + @PostMapping("/document/upload") + public String upload(@RequestParam("file") MultipartFile file, Model model, @ModelAttribute("post") Post post) { + log.info("POST /face/v1/document/upload, file: {}, type: {}", file.getOriginalFilename(), post.getType()); + + //подготавливаем объект метаданных + FileMetadata metadata = new FileMetadata(); + metadata.setName(file.getOriginalFilename()); + metadata.setSize(file.getSize()); + + // получаем объект метаданных с id + metadata = client.post() + .uri("http://source:8181/api/v1/metadata/create") + .body(Mono.just(metadata), FileMetadata.class) + .retrieve() + .bodyToMono(new ParameterizedTypeReference (){}) + .timeout(Duration.ofSeconds(1)) + .block(); + + // Добавление файла в файловое хранилище + MultipartBodyBuilder builder = new MultipartBodyBuilder(); + Boolean ok; + MultipartFile out = new MpFile(file, metadata.getId() + "." + metadata.getExtension()); + builder.part("file", out.getResource()); + + // Document doc = new Document(); + // doc.setName(file.getOriginalFilename()); + // doc.setSize(file.getSize()); + + // Optional ext = Optional.ofNullable(file.getOriginalFilename()) + // .filter(f -> f.contains(".")) + // .map(f -> f.substring(file.getOriginalFilename().lastIndexOf(".") + 1)); + // doc.setExtension(ext.get()); + // doc.setExtension( ext.get()); + + // Добавление записи о файле в базу данных + // doc = client.post() + // .uri("http://resource-service-api:8181/storage-entry/create") + // .body(Mono.just(doc), Document.class) + // .retrieve() + // .bodyToMono(new ParameterizedTypeReference (){}) + // .timeout(Duration.ofSeconds(1)) + // .block(); + + // post.setDocument(doc); + // post = client.post() + // .uri("http://resource-service-api:8181/post/create") + // .body(Mono.just(post), Post.class) + // .retrieve() + // .bodyToMono(new ParameterizedTypeReference (){}) + // .timeout(Duration.ofSeconds(1)) + // .block(); + + // System.out.println("Пакет передан в ресурсный сервис ..."); + // System.out.println("Пакет: " + post.toString()); + + // Добавление файла в файловое хранилище + // MultipartBodyBuilder builder = new MultipartBodyBuilder(); + // Boolean ok; + // MultipartFile out = new MpFile(file, doc.getId() + "." + doc.getExtension()); + // builder.part("file", out.getResource()); + + // ok = client.method(HttpMethod.POST) + // .uri("http://storage:8282/api/document/store") + // .body(BodyInserters + // .fromMultipartData(builder.build())) + // .retrieve() + // .bodyToMono(new ParameterizedTypeReference (){}) + // .block(); + + + // System.out.println("Файл добавлен в хранилище: " + ok); + // System.out.println("ID: " + doc.getId()); + // System.out.println(doc.toString()); + + //переход на страницу импорта данных из документа + return "redirect:/face/v1/mainframe"; + } } diff --git a/face/src/main/java/gsp/technologies/face/models/FileMetadata.java b/face/src/main/java/gsp/technologies/face/models/FileMetadata.java new file mode 100644 index 0000000..3ce0b7f --- /dev/null +++ b/face/src/main/java/gsp/technologies/face/models/FileMetadata.java @@ -0,0 +1,56 @@ +package gsp.technologies.face.models; + +import java.nio.file.Path; +import java.time.LocalDateTime; + +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@Data +public class FileMetadata { + //идентификатор записи о фале + private Long id; + + //имя файла + private String name; + + //расширение + private String extension; + + //путь к корневому каталогу на сервере, где размещено хранилище данныхприложения + private Path rootPath; + + //путь относительно корневого каталога + private Path relativePath; + + //абсолютный путь к файлу или директории на сервере + private Path absolutePath; + + //размер файла в байтах + private Long size; + + //дата создания файла или директории + private LocalDateTime createdDate; + + //дата последнего изенения файла или директории + private LocalDateTime lastModifiedDate; + + //пользователь - владелец файла или директории + private String owner; + + //тип: файл или директория + private String type; + + //права доступа к файлу или директории + private String permissions; + + /** + * Определение типа объекта (файл или директория) + * + * @return Возвращает true, если текущий объект является директорией + */ + public boolean isDirectory() { + return type.equals("directory"); + } +} \ No newline at end of file diff --git a/face/src/main/java/gsp/technologies/face/models/Post.java b/face/src/main/java/gsp/technologies/face/models/Post.java new file mode 100644 index 0000000..d2f8181 --- /dev/null +++ b/face/src/main/java/gsp/technologies/face/models/Post.java @@ -0,0 +1,21 @@ +package gsp.technologies.face.models; + +import java.io.Serializable; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@AllArgsConstructor +@NoArgsConstructor +@Data +public class Post implements Serializable { + private long id; + private String type;//тип документа (реестр/ списочный состав/ прочее) + private FileMetadata metadata; + + public Post(String type, FileMetadata metadata) { + this.type = type; + this.metadata = metadata; + } +} diff --git a/face/src/main/java/gsp/technologies/face/services/StorageService.java b/face/src/main/java/gsp/technologies/face/services/StorageService.java new file mode 100644 index 0000000..b572bb7 --- /dev/null +++ b/face/src/main/java/gsp/technologies/face/services/StorageService.java @@ -0,0 +1,698 @@ +package gsp.technologies.face.services; + +import java.util.List; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.ParameterizedTypeReference; +import org.springframework.http.HttpMethod; +import org.springframework.stereotype.Service; +import org.springframework.web.reactive.function.client.WebClient; + +import gsp.technologies.face.models.Post; + +@Service +public class StorageService { + private static final Logger log = LoggerFactory.getLogger(StorageService.class); + + // private String programCretareaCountFromBaseLink = "http://resource-service-api:8181/cretarea/count"; + // private String storageLink = "http://storage-rs:8282/api/document/content/"; + private String storageDocumentContentLink = "http://storage-rs:8282/api/document/content/"; + // private String storageListLink = "http://resource-service-api:8181/storage-entry/list"; + private String postListLink = "http://resource-service-api:8181/post/list"; + // private String programsLink = "http://resource-service-api:8181/program/list"; + // private String buildingsLink = "http://resource-service-api:8181/building/list"; + // private String coursesLink = "http://resource-service-api:8181/course/list"; + // private String teachersLink = "http://resource-service-api:8181/teacher/list"; + // private String cretareasLink = "http://resource-service-api:8181/cretarea/list"; + // private String organizationsLink = "http://resource-service-api:8181/organization/list"; + // private String studentsLink = "http://resource-service-api:8181/student/list"; + // private String educationEntriesLink = "http://resource-service-api:8181/education/list"; + + @Autowired + private WebClient client; + + /** + * Получение списка документов, размещенных в файловом хранилище + * @param id + * @return + */ + // public List getDocumentList() { + // System.out.println("Получение списка документов, размещенных в файловом хранилище ..."); + // return client.method(HttpMethod.GET) + // .uri(storageListLink) + // .retrieve() + // .bodyToMono(new ParameterizedTypeReference >(){}) + // .block(); + // } + + // public Document getDocumentById(String id) { + // // TODO: добавить линк в storage-rs, для получения документа по id + // List documents = client.method(HttpMethod.GET) + // .uri(storageListLink) + // .retrieve() + // .bodyToMono(new ParameterizedTypeReference >(){}) + // .block(); + // Document result = new Document(); + // for (Document document : documents) { + // if (document.getId() == Integer.parseInt(id)) { + // result = document; + // } + // } + // return result; + // } + + /** + * Получение списка постов, размещенных в ресурсном сервисе + * @param id + * @return + */ + public List getPostList() { + System.out.println("Получение списка постов, размещенных в ресурсном сервисе ..."); + return client.method(HttpMethod.GET) + .uri(postListLink) + .retrieve() + .bodyToMono(new ParameterizedTypeReference >(){}) + .block(); + } + + /** + * Получение поста по id + * @param postID + * @return + */ + public Post getPostById(String postID) { + // TODO: добавить линк в storage-rs, для получения поста по id + List posts = client.method(HttpMethod.GET) + .uri(postListLink) + .retrieve() + .bodyToMono(new ParameterizedTypeReference >(){}) + .block(); + Post result = new Post(); + for (Post post : posts) { + if (post.getId() == Integer.parseInt(postID)) { + result = post; + } + } + return result; + } + + public Post getPostById(int postID) { + // TODO: добавить линк в storage-rs, для получения поста по id + List posts = client.method(HttpMethod.GET) + .uri(postListLink) + .retrieve() + .bodyToMono(new ParameterizedTypeReference >(){}) + .block(); + Post result = new Post(); + for (Post post : posts) { + if (post.getId() == postID) { + result = post; + } + } + return result; + } + + public int getPostCount(){ + // TODO: добавить линк в resource-service, для получения количества постов + return getPostList().size(); + } + + /** + * Получение содержимого xlsx-файла в виде Map> + * @param docId + * @return + */ + // public Map> getDocumentContentAsMap(String docId) { + // System.out.println("Получение данных xlsx-файла в виде Map> ..."); + // String url = storageDocumentContentLink + "?filename=" + docId + ".xlsx"; + // Map> cells = client.method(HttpMethod.GET) + // .uri(url) + // .retrieve() + // .bodyToMono(new ParameterizedTypeReference >>(){}) + // .block(); + // return cells; + // } + + /** + * Получение строки из xlsx-файла + * @param docId + * @param line + * @return + */ + // public List getDocumentContentByLines(String docId, String line) { + // System.out.println("Получение данных xlsx-файла в виде List по строке ..."); + // String url = storageDocumentContentLink + "/line" + "?filename=" + docId + ".xlsx&line=" + line; + // List cells = client.method(HttpMethod.GET) + // .uri(url) + // .retrieve() + // .bodyToMono(new ParameterizedTypeReference >(){}) + // .block(); + // return cells; + // } + + /** + * Получение частей из xlsx-файла + * @param docId + * @param from + * @param count + * @return + */ + // public Map> getDocumentContentByParts(String docId, int from, int count) { + // System.out.println("Получение данных xlsx-файла в виде Map> по частям ..."); + // String url = storageDocumentContentLink + "/part" + "?filename=" + docId + ".xlsx&from=" + from + "&count=" + count; + // Map> cells = client.method(HttpMethod.GET) + // .uri(url) + // .retrieve() + // .bodyToMono(new ParameterizedTypeReference >>(){}) + // .block(); + // return cells; + // } + + /** + * Получение количества записей в xlsx-файле + * @param docId + * @return + */ + public Integer getDocumentContentLenght(String docId) { + System.out.println("Получение количества записей в xlsx-файле ..."); + String url = storageDocumentContentLink + "/lenght" + "?filename=" + docId + ".xlsx"; + Integer count = client.method(HttpMethod.GET) + .uri(url) + .retrieve() + .bodyToMono(Integer.class) + .block(); + return count; + } + + /** + * Получение столбца из xlsx-файла + * @param docId + * @param column + * @return + */ + // public List getDocumentContentByColumn(Integer docId, Integer column) { + // System.out.println("Получение данных xlsx-файла в виде List по столбцу ..."); + // String url = storageDocumentContentLink + "/column" + "?filename=" + docId + ".xlsx&column=" + column; + // List cells = client.method(HttpMethod.GET) + // .uri(url) + // .retrieve() + // .bodyToMono(new ParameterizedTypeReference >(){}) + // .block(); + // return cells; + // } + + // public List getUniqueDocumentContentByColumn(int docId, int column) { + // System.out.println("Получение уникальных данных xlsx-файла в виде List по столбцу #" + column + " ..."); + // String url = storageDocumentContentLink + "/column/unique" + "?filename=" + docId + ".xlsx&column=" + column; + // List cells = client.method(HttpMethod.GET) + // .uri(url) + // .retrieve() + // .bodyToMono(new ParameterizedTypeReference >(){}) + // .block(); + // return cells; + // } + + + /*********************************************************************** */ + /* + * Извлечение данных (списков моделей) из xlsx - перебор xlsx по кускам + */ + // public List getProgramCretareasFromFile(Post post) { + // List programCretareas = new ArrayList<>(); + // int max = this.getDocumentContentLenght(String.valueOf(post.getDocument().getId())); + // int portion = 10000; + // int from = 0; + // while (from < max) { + // portion = Math.min(max - from, portion); + // Map> cells = this.getDocumentContentByParts(post.getDocument().getId().toString(), from, portion); + // for (Map.Entry> entry : cells.entrySet()) { + // ProgramCretarea programCretarea = new ProgramCretarea(entry); + // if(!programCretareas.contains(programCretarea) + // && !programCretarea.isEmpty()){ + // programCretareas.add(programCretarea); + // } + // } + // from += portion; + // } + // programCretareas.sort(Comparator.comparing(ProgramCretarea::getNameShort)); + + // return programCretareas; + // } + + + /*********************************************************************** */ + /** + * Получение всего содержимого xlsx-файла из файлового хранилища + * по id документа в хранилище + * + * @param id Идентфикатор файла + * @return XlsxDocument Объект с данными xlsx файла + */ + // public XlsxDocument getXlsxDocument(String id) { + // System.out.println("Получение всего содержимого xlsx-файла ..."); + // return client.method(HttpMethod.GET) + // .uri(storageLink + // + id + ".xlsx") + // .retrieve() + // .bodyToMono(new ParameterizedTypeReference (){}) + // .block(); + // } + + /** + * Получение перечня программ обучения из базы + * @param id + * @return + */ + // public List getBasePrograms() { + // System.out.println("Получение перечня программ обучения из базы ..."); + // List list = client.method(HttpMethod.GET) + // .uri(programsLink) + // .retrieve() + // .bodyToMono(new ParameterizedTypeReference >(){}) + // .block(); + // return list; + // } + + // public List getAbsentPrograms(List xlsxList) { + // List baseList = getBasePrograms(); + + // if (xlsxList == null || xlsxList.isEmpty()) { + // return new ArrayList(); + // } + + // List result = new ArrayList<>(xlsxList); + + // if (baseList == null || baseList.isEmpty()) { + // return result; + // } + + // for (Program program : xlsxList) { + // for (Program baseProgram : baseList) { + // if (program.isSimilar(baseProgram)) { + // result.remove(program); + // break; + // } + // } + // } + + // return result; + // } + + // public int getAbsentProgramsCount(List xlsxList) { + // return getAbsentPrograms(xlsxList).size(); + // } + + /** + * Получение перечня объектов строительства из базы + * @param id + * @return + */ + // public List getBaseBuildings() { + // System.out.println("Получение перечня объектов строительства из базы ..."); + // List list = client.method(HttpMethod.GET) + // .uri(buildingsLink) + // .retrieve() + // .bodyToMono(new ParameterizedTypeReference >(){}) + // .block(); + // return list; + // } + + // public List getAbsentBuildings(List xlsxList) { + // List baseList = getBaseBuildings(); + + // if (xlsxList == null || xlsxList.isEmpty()) { + // return new ArrayList(); + // } + // List result = new ArrayList<>(xlsxList); + // if (baseList == null || baseList.isEmpty()) { + // return result; + // } + + // for (Building building : xlsxList) { + // for (Building baseBuilding : baseList) { + // if (building.getName_short().equals(baseBuilding.getName_short())) { + // result.remove(building); + // break; + // } + // } + // } + // return result; + // } + + // public int getAbsentBuildingsCount(List xlsxList) { + // return getAbsentBuildings(xlsxList).size(); + // } + + // public int getBuildingsCount() { + // return getBaseBuildings().size(); + // } + + /** + * Получение списка курсов из базы данных + */ + // public List getBaseCourses() { + // System.out.println("Получение списка курсов из базы данных ..."); + // List list = client.method(HttpMethod.GET) + // .uri(coursesLink) + // .retrieve() + // .bodyToMono(new ParameterizedTypeReference >(){}) + // .block(); + // return list; + // } + + // public List getAbsentCourses(List xlsxList) { + // List baseList = getBaseCourses(); + + // if (xlsxList == null || xlsxList.isEmpty()) { + // return new ArrayList(); + // } + // List result = new ArrayList<>(xlsxList); + // if (baseList == null || baseList.isEmpty()) { + // return result; + // } + + // for (Course course : xlsxList) { + // for (Course baseCourse : baseList) { + // if(course.isSimilar(baseCourse)) { + // result.remove(course); + // break; + // } + // } + // } + // return result; + // } + + // public int getAbsentCoursesCount(List xlsxList) { + // return getAbsentCourses(xlsxList).size(); + // } + + /** + * Получение перечня преподавателей из базы данных + */ + // public List getBaseTeachers() { + // System.out.println("Получение перечня преподавателей из базы данных ..."); + // List list = client.method(HttpMethod.GET) + // .uri(teachersLink) + // .retrieve() + // .bodyToMono(new ParameterizedTypeReference >(){}) + // .block(); + // return list; + // } + + /** + * Получение перечня преподавателей из xlsx-файла + * + * @return > Перечень преподавателей, полученных из xlsx-файла + * В объектах перечня незаполнены поля id + * Объекты сформированы на основании ФИО преподавателя, указанного в xlsx-файле + * + */ + // public List getXlsxTeachers(XlsxDocument xlsx) { + // System.out.println("Получение перечня преподавателей из xlsx-файла ..."); + // List list = new ArrayList<>(); + // // получаем данные в виде мапы строк + // Map> map = xlsx.getData(); + + // // удаляем строку заголовков + // map.remove(0); + + // for (Map.Entry> entry : map.entrySet()) { + // String fio = Stringer.clear(entry + // .getValue() + // .get(18) + // .getContent()); + // list.add(new Teacher(fio)); + // } + + // // удаляем дубликаты + // Set set = new HashSet<>(list); + // list = new ArrayList<>(set); + // return list; + // } + + + + /** + * Получение списка преподавателей, отсутствующих в базе данных (новых преподавателей) + * + * @param xlsxList список уникальных преподаватетей из файла + * @param baseList список преподавателей из базы + * @return List + */ + // public List getAbsentTeachers(List xlsxList, List baseList) { + // System.out.println("Получение списка преподавателей, отсутствующих в базе данных ..."); + // if (xlsxList == null || xlsxList.isEmpty()) { + // return new ArrayList(); + // } + // List result = new ArrayList<>(xlsxList); + // if (baseList == null || baseList.isEmpty()) { + // return result; + // } + + // for (Teacher xlsxTeacher : xlsxList) { + // for (Teacher baseTeacher : baseList) { + // if (xlsxTeacher.getFullName().equals(baseTeacher.getFullName())) { + // result.remove(xlsxTeacher); + // break; + // } + // } + // } + // return result; + // } + + // public List getAbsentTeachers(List xlsxList) { + // return getAbsentTeachers(xlsxList, getBaseTeachers()); + // } + + // public List sortTeachers(List list) { + // System.out.println("Сортировка списка преподавателей ..."); + // Comparator compareBySecondName = Comparator + // .comparing(Teacher::getSecond_name) + // .thenComparing(Teacher::getFirst_name) + // .thenComparing(Teacher::getLast_name); + // return list.stream() + // .sorted(compareBySecondName) + // .collect(Collectors.toCollection(ArrayList::new)); + // } + + // public int getAbsentTeachersCount(List uniqueTeachers) { + // return getAbsentTeachers(uniqueTeachers).size(); + // } + + + /** + * Получение списка критериев из баз данных + */ + // public List getBaseCretareas() { + // System.out.println("Получение списка критериев из баз данных ..."); + // List list = client.method(HttpMethod.GET) + // .uri(cretareasLink) + // .retrieve() + // .bodyToMono(new ParameterizedTypeReference >(){}) + // .block(); + // return list; + // } + + // public List getAbsentCretareas(List xlsxList) { + // List baseList = getBaseCretareas(); + + // if (xlsxList == null || xlsxList.isEmpty()) { + // return new ArrayList(); + // } + + // List result = new ArrayList<>(xlsxList); + // if (baseList == null || baseList.isEmpty()) { + // return result; + // } + + // for (ProgramCretarea xlsxCretarea : xlsxList) { + // for (ProgramCretarea baseCretarea : baseList) { + // if (xlsxCretarea.getNameShort().equals(baseCretarea.getNameShort())) { + // result.remove(xlsxCretarea); + // break; + // } + // } + // } + + // return result; + // } + + // public int getAbsentCretareasCount(List xlsxList) { + // return getAbsentCretareas(xlsxList).size(); + // } + + /** + * Получение списка организаций из базы данных + */ + // public List getBaseOrganizations() { + // System.out.println("Получение списка организаций из базы данных ..."); + // List list = client.method(HttpMethod.GET) + // .uri(organizationsLink) + // .retrieve() + // .bodyToMono(new ParameterizedTypeReference >(){}) + // .block(); + // return list; + // } + + // public List getAbsentOrganizations(List xlsxList) { + // List baseList = getBaseOrganizations(); + // if (xlsxList == null || xlsxList.isEmpty()) { + // return new ArrayList(); + // } + + // List result = new ArrayList<>(xlsxList); + // if (baseList == null || baseList.isEmpty()) { + // return result; + // } + + // for (Organization xlsxOrganization : xlsxList) { + // for (Organization baseOrganization : baseList) { + // if (xlsxOrganization.getNameFull().equals(baseOrganization.getNameFull())) { + // result.remove(xlsxOrganization); + // break; + // } + // } + // } + // return result; + // } + + // public int getAbsentOrganizationsCount(List xlsxList) { + // return getAbsentOrganizations(xlsxList).size(); + // } + + // /** + // * Получение списка студентов из базы данных + // */ + // public List getBaseStudents() { + // System.out.println("Получение списка студентов из базы данных ..."); + // List list = client.method(HttpMethod.GET) + // .uri(studentsLink) + // .retrieve() + // .bodyToMono(new ParameterizedTypeReference >(){}) + // .block(); + // return list; + // } + + // public List getAbsentStudents(List xlsxList) { + // List baseList = getBaseStudents(); + // if (xlsxList == null || xlsxList.isEmpty()) { + // return new ArrayList(); + // } + + // List result = new ArrayList<>(xlsxList); + // if (baseList == null || baseList.isEmpty()) { + // return result; + // } + + // for (Student xlsxStudent : xlsxList) { + // for (Student baseStudent : baseList) { + // if (xlsxStudent.getSecond_name().equals(baseStudent.getSecond_name()) + // && xlsxStudent.getFirst_name().equals(baseStudent.getFirst_name()) + // && xlsxStudent.getLast_name().equals(baseStudent.getLast_name()) + // && xlsxStudent.getProfession().equals(baseStudent.getProfession()) + // && xlsxStudent.getDirection().equals(baseStudent.getDirection()) + // && xlsxStudent.getProfession().equals(baseStudent.getProfession()) + // && xlsxStudent.getOrganization().getNameFull().equals(baseStudent.getOrganization().getNameFull())) { + // result.remove(xlsxStudent); + // break; + // } + // } + // } + + // return result; + // } + + // public int getAbsentStudentsCount(List xlsxList) { + // return getAbsentStudents(xlsxList).size(); + // } + + // public List getBaseEducationEntries() { + // System.out.println("Получение списка записей об обучениях из базы данных ..."); + // List list = client.method(HttpMethod.GET) + // .uri(educationEntriesLink) + // .retrieve() + // .bodyToMono(new ParameterizedTypeReference >(){}) + // .block(); + // return list; + // } + + // public List getAbsentEducationEntries(List xlsxList) { + // List baseList = getBaseEducationEntries(); + // if (xlsxList == null || xlsxList.isEmpty()) { + // return new ArrayList(); + // } + + // List result = new ArrayList<>(xlsxList); + // if (baseList == null || baseList.isEmpty()) { + // return result; + // } + + // for (EducatonEntry xlsxEducatonEntry : xlsxList) { + // for (EducatonEntry baseEducatonEntry : baseList) { + // if (xlsxEducatonEntry.isSimilar(baseEducatonEntry)) { + // result.remove(xlsxEducatonEntry); + // break; + // } + // } + // } + + // return result; + // } + + // public int getAbsentEducationsCount(List uniqueEducations) { + // return getAbsentEducationEntries(uniqueEducations).size(); + // } + + + + + + // public int getCoursesCount() { + // return getBaseCourses().size(); + // } + + // public int getEducationsCount() { + // return getBaseEducationEntries().size(); + // } + + // public int getProgramsCount() { + // return getBasePrograms().size(); + // } + + // public int getStudentsCount() { + // return getBaseStudents().size(); + // } + + // public int getTeachersCount() { + // return getBaseTeachers().size(); + // } + + // public int getCretareasCount() { + // return getBaseCretareas().size(); + // } + + // public int getOrganizationsCount() { + // return getBaseOrganizations().size(); + // } + + // public List getProgramCretareasFromBase() { + // System.out.println("Получение списка критериев из баз данных ..."); + // List list = client.method(HttpMethod.GET) + // .uri(cretareasLink) + // .retrieve() + // .bodyToMono(new ParameterizedTypeReference >(){}) + // .block(); + // return list; + // } + + // public Integer getProgramCretareaCountFromBase(){ + // int count = client.method(HttpMethod.GET) + // .uri(programCretareaCountFromBaseLink) + // .retrieve() + // .bodyToMono(Integer.class) + // .block(); + // return count; + // } +} diff --git a/face/src/main/java/gsp/technologies/face/teh/fs/MpFile.java b/face/src/main/java/gsp/technologies/face/teh/fs/MpFile.java new file mode 100644 index 0000000..19ff7b2 --- /dev/null +++ b/face/src/main/java/gsp/technologies/face/teh/fs/MpFile.java @@ -0,0 +1,72 @@ +package gsp.technologies.face.teh.fs; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; + +import org.springframework.lang.NonNull; +import org.springframework.lang.Nullable; +import org.springframework.web.multipart.MultipartFile; + +/** + * Переопределены методы MultipartFile + */ +public class MpFile implements MultipartFile{ + private MultipartFile file; + private String name; + + /** + * @param file + * @param name + */ + public MpFile(MultipartFile file, String name) { + this.file = file; + this.name = name; + } + + @NonNull + @Override + public byte[] getBytes() throws IOException { + return file.getBytes(); + } + + @Override + @Nullable + public String getContentType() { + return file.getContentType(); + } + + @NonNull + @Override + public InputStream getInputStream() throws IOException { + return file.getInputStream(); + } + + @NonNull + @Override + public String getName() { + return file.getName(); + } + + @Override + @Nullable + public String getOriginalFilename() { + return this.name; + } + + @Override + public long getSize() { + return file.getSize(); + } + + @Override + public boolean isEmpty() { + return file.isEmpty(); + } + + @Override + public void transferTo(File dest) throws IOException, IllegalStateException { + //NO REALIZATION + } + +} diff --git a/face/src/main/resources/static/content/md/mainframe.md b/face/src/main/resources/static/content/md/mainframe.md index c7e4897..f86ea7d 100644 --- a/face/src/main/resources/static/content/md/mainframe.md +++ b/face/src/main/resources/static/content/md/mainframe.md @@ -1,5 +1,10 @@ -# mainframe.md +# Инструкция по работе с платформой (mainframe.md) Форма предоставляет пользователю доступ ко всему функционалу платформы - ссылка на страницу работы с файлами (загрузка, проверка файлов) - ссылка на страницу работы с данными базы (редактирование данных, формирование отчетов) -- \ No newline at end of file + +## Загрузка файлов на платформу +### Общее +- xlsx файл не должен содержать более 5 тыс. строк +- все ячейки должны содержать значения (формулы платформа не пересчитает) +### Реестры обученных diff --git a/face/src/main/resources/templates/fragments/common/footer.html b/face/src/main/resources/templates/fragments/common/footer.html new file mode 100644 index 0000000..51062d3 --- /dev/null +++ b/face/src/main/resources/templates/fragments/common/footer.html @@ -0,0 +1,13 @@ + + + +

+
+ © 2024 ООО "ГСП-Технологии" +
+
+
+ +
+ + \ No newline at end of file diff --git a/face/src/main/resources/templates/fragments/storage.html b/face/src/main/resources/templates/fragments/storage.html new file mode 100644 index 0000000..66cbe4a --- /dev/null +++ b/face/src/main/resources/templates/fragments/storage.html @@ -0,0 +1,27 @@ + + + + +
+
+

Добавление пакетов:

+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/face/src/main/resources/templates/mainframe.html b/face/src/main/resources/templates/mainframe.html index 79cde0d..f900ad1 100644 --- a/face/src/main/resources/templates/mainframe.html +++ b/face/src/main/resources/templates/mainframe.html @@ -7,29 +7,139 @@ th-шаблон, для предоставления доступа к функ xmlns:th="http://www.thymeleaf.org"> + teh-mainframe -

teh-mainframe

-
+
- + +

Хранилище данных

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Критерии0
Программы0
Преподаватели0
Объекты строительства0
Организации0
Курсы0
Студенты0
Обучения0
+
+ +

Извлечение данных

+ + + + + + + + + + + + + + + + + + + + + + +
Формы ФРДО
Формы ЕИСОТ
Протокол
Приказ о зачислении
Приказ об отчислении
Документы об обучении
+
+ +

Импорт данных в базу

+ + +
+ + +

Последние загруженные документы: COUNT

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Вид документаНаименованиеВремя загрузкиСтатус
Реестр обученныхНаименование.xlsxдатаобработан/не обработан
Реестр обученныхНаименование.xlsxдатаобработан/не обработан
Реестр обученныхНаименование.xlsxдатаобработан/не обработан
Реестр обученныхНаименование.xlsxдатаобработан/не обработан
Реестр обученныхНаименование.xlsxдатаобработан/не обработан
+
- +
+
diff --git a/source/docker-compose.yaml b/source/docker-compose.yaml new file mode 100644 index 0000000..0ae8816 --- /dev/null +++ b/source/docker-compose.yaml @@ -0,0 +1,25 @@ +version: "3.7" +services: + source: + container_name: source + hostname: source + build: + context: ../source + dockerfile: dockerfile + image: "source" + command: ["java","-jar","/app/source/source-0.1.jar"] + volumes: + - teh-logs:${LOGGER_DATA} + ports: + - 81:8181 + restart: unless-stopped + networks: + - teh-net +volumes: + teh-logs: + external: true +networks: + teh-net: + name: teh-net + external: true + driver: bridge \ No newline at end of file diff --git a/source/dockerfile b/source/dockerfile new file mode 100644 index 0000000..9c53e24 --- /dev/null +++ b/source/dockerfile @@ -0,0 +1,8 @@ +FROM openjdk:17-jdk-alpine +RUN apk update +RUN apk upgrade +COPY target/source-0.1.jar /app/source/source-0.1.jar +WORKDIR /app/source +# ENTRYPOINT ["java","-jar","/app/resource-service-api-0.1.jar"] +# docker image build -t resource-service-api:latest . +# docker run -p80:8181 resource-service-api:latest \ No newline at end of file diff --git a/source/pom.xml b/source/pom.xml index b9fb17d..9468f07 100644 --- a/source/pom.xml +++ b/source/pom.xml @@ -34,20 +34,23 @@ org.springframework.boot spring-boot-starter-thymeleaf + + org.projectlombok + lombok + true + org.springframework.boot spring-boot-starter-web - org.postgresql postgresql runtime - org.projectlombok - lombok - true + org.springframework.boot + spring-boot-starter-data-jpa org.springframework.boot @@ -72,5 +75,4 @@ - diff --git a/source/src/main/java/gsp/technologies/source/controllers/api/v1/StorageController.java b/source/src/main/java/gsp/technologies/source/controllers/api/v1/StorageController.java new file mode 100644 index 0000000..cd8f19d --- /dev/null +++ b/source/src/main/java/gsp/technologies/source/controllers/api/v1/StorageController.java @@ -0,0 +1,86 @@ +package gsp.technologies.source.controllers.api.v1; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +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.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import gsp.technologies.source.models.FileMetadata; +import gsp.technologies.source.models.Post; +import gsp.technologies.source.repositories.FileMetadataRepository; +import gsp.technologies.source.repositories.PostRepository; + +/** + * Контроллер для работы с таблицей, хранящей сведения о файлах в файловом хранилище + */ +@RestController +@RequestMapping(path = "/api/v1/storage") +public class StorageController { + @Autowired + private FileMetadataRepository metaRepo; + + @Autowired + private PostRepository postRepo; + + @GetMapping("/metadata/list") + public ResponseEntity> getStorageEntries(){ + return new ResponseEntity<>(metaRepo.findAll(), HttpStatus.OK); + } + + @GetMapping("/post/list") + public ResponseEntity> getPostList(){ + return new ResponseEntity<>(postRepo.findAll(), HttpStatus.OK); + } + + @GetMapping("/metadata/{id}") + public ResponseEntity getStorageEntryByID(@PathVariable Integer id){ + return new ResponseEntity<>(metaRepo.findById(id), HttpStatus.OK); + } + + @PostMapping(path = "/metadata/create", + consumes = MediaType.APPLICATION_JSON_VALUE, + produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity saveStorageEntry(@RequestBody FileMetadata metadata) { + metaRepo.save(metadata); + return new ResponseEntity<>(metadata, HttpStatus.CREATED); + } + + @PostMapping(path = "/post/create", + consumes = MediaType.APPLICATION_JSON_VALUE, + produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity savePost(@RequestBody Post post) { + postRepo.save(post); + return new ResponseEntity<>(post, HttpStatus.CREATED); + } + + @PutMapping(path = "/metadata/update/{id}", + consumes = MediaType.APPLICATION_JSON_VALUE, + produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity updateStorageEntry(@PathVariable Integer id, @RequestBody FileMetadata metadata) { + FileMetadata meta = metaRepo.findById(id); + + meta.setName(metadata.getName()); + meta.setRelativePath(metadata.getRelativePath()); + meta.setExtension(metadata.getExtension()); + meta.setSize(metadata.getSize()); + metaRepo.save(meta); + return new ResponseEntity<>(metaRepo.findById(id), HttpStatus.CREATED); + } + + @DeleteMapping("/metadata/delete/{id}") + public ResponseEntity deleteStorageEntry(@PathVariable Integer id){ + FileMetadata meta= metaRepo.findById(id); + metaRepo.delete(meta); + return new ResponseEntity<>("Запись id#" + id + " удалена ... ", HttpStatus.OK); + } +} \ No newline at end of file diff --git a/source/src/main/java/gsp/technologies/source/models/Building.java b/source/src/main/java/gsp/technologies/source/models/Building.java new file mode 100644 index 0000000..f15b7db --- /dev/null +++ b/source/src/main/java/gsp/technologies/source/models/Building.java @@ -0,0 +1,36 @@ +package gsp.technologies.source.models; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * Сущность объекта строительства + */ +@NoArgsConstructor +@AllArgsConstructor +@Entity +@Data +public class Building { + @Id + @GeneratedValue(strategy=GenerationType.AUTO) + private long id; + @Column(length=50) + private String nameShort;//Сокращенное наименование + private String nameFull;//Полное наименование + private String codeShort;//Краткий код + private String codeFull;//Полный код + + // подготовить конструкторы на все варианты внесения информации о преподавателях + public Building(String name_short, String name_full, String code_short, String code_full){ + this.nameShort = name_short; + this.nameFull = name_full; + this.codeShort = code_short; + this.codeFull = code_full; + } +} diff --git a/source/src/main/java/gsp/technologies/source/models/Course.java b/source/src/main/java/gsp/technologies/source/models/Course.java new file mode 100644 index 0000000..e325310 --- /dev/null +++ b/source/src/main/java/gsp/technologies/source/models/Course.java @@ -0,0 +1,47 @@ +package gsp.technologies.source.models; + +import java.util.Date; + +import org.hibernate.annotations.OnDelete; +import org.hibernate.annotations.OnDeleteAction; + +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.ManyToOne; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + + +/** + * Сведения о курсе (учебном потоке) + */ +@NoArgsConstructor +@AllArgsConstructor +@Entity +@Data +public class Course { + @Id + @GeneratedValue(strategy=GenerationType.AUTO) + private long id;//уникальный идентификатор курса + private String place;//место проведения занятий + private Date startDate;//дата начала курса + private Date protocolDate;//дата протокола + private String protocolNumber;//номер протоколаssss + private String reportPeriod;//отчетный период (наименование месяца) + + @ManyToOne(fetch = FetchType.EAGER, optional = false) + @OnDelete(action = OnDeleteAction.SET_NULL) + private Teacher teacher;//сведения о преподаватле + + @ManyToOne(fetch = FetchType.EAGER, optional = false) + @OnDelete(action = OnDeleteAction.SET_NULL) + private Program program;//сведения о программе обучения + + @ManyToOne(fetch = FetchType.EAGER, optional = false) + @OnDelete(action = OnDeleteAction.SET_NULL) + private Building building;//сведения об объекте строительства +} diff --git a/source/src/main/java/gsp/technologies/source/models/EducationEntry.java b/source/src/main/java/gsp/technologies/source/models/EducationEntry.java new file mode 100644 index 0000000..901fad1 --- /dev/null +++ b/source/src/main/java/gsp/technologies/source/models/EducationEntry.java @@ -0,0 +1,36 @@ +package gsp.technologies.source.models; + +import org.hibernate.annotations.OnDelete; +import org.hibernate.annotations.OnDeleteAction; + +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.ManyToOne; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Entity +@Data +public class EducationEntry { + @Id + @GeneratedValue(strategy=GenerationType.AUTO) + private long id; + private String sertificateNumber;//Номер удостоверения + private String frdoNumber;//ФРДО номер по реестру + private String eisotNumber;//ЕИСОТ номер по реестру + private String ones;//Единички (вспомогатльный столбец) + + @ManyToOne(fetch = FetchType.EAGER, optional = false) + @OnDelete(action = OnDeleteAction.SET_NULL) + private Course course;//Сведения о курсе + + @ManyToOne(fetch = FetchType.EAGER, optional = false) + @OnDelete(action = OnDeleteAction.SET_NULL) + private Student student;//Сведения о студенте +} diff --git a/source/src/main/java/gsp/technologies/source/models/FileMetadata.java b/source/src/main/java/gsp/technologies/source/models/FileMetadata.java new file mode 100644 index 0000000..c7e05e4 --- /dev/null +++ b/source/src/main/java/gsp/technologies/source/models/FileMetadata.java @@ -0,0 +1,56 @@ +package gsp.technologies.source.models; + +import java.nio.file.Path; +import java.time.LocalDateTime; + +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@Data +public class FileMetadata { + //идентификатор по базе + private Long id; + + //имя файла + private String name; + + //расширение + private String extension; + + //путь к корневому каталогу на сервере, где размещено хранилище данныхприложения + private Path rootPath; + + //путь относительно корневого каталога + private Path relativePath; + + //абсолютный путь к файлу или директории на сервере + private Path absolutePath; + + //размер файла в байтах + private Long size; + + //дата создания файла или директории + private LocalDateTime createdDate; + + //дата последнего изенения файла или директории + private LocalDateTime lastModifiedDate; + + //пользователь - владелец файла или директории + private String owner; + + //тип: файл или директория + private String type; + + //права доступа к файлу или директории + private String permissions; + + /** + * Определение типа объекта (файл или директория) + * + * @return Возвращает true, если текущий объект является директорией + */ + public boolean isDirectory() { + return type.equals("directory"); + } +} diff --git a/source/src/main/java/gsp/technologies/source/models/Organization.java b/source/src/main/java/gsp/technologies/source/models/Organization.java new file mode 100644 index 0000000..bd41ddb --- /dev/null +++ b/source/src/main/java/gsp/technologies/source/models/Organization.java @@ -0,0 +1,44 @@ +package gsp.technologies.source.models; + +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * Сущность для хранения сведений об организации - контрагенте + * - ПСК + */ +@NoArgsConstructor +@AllArgsConstructor +@Entity +@Data +public class Organization { + @Id + @GeneratedValue(strategy=GenerationType.AUTO) + private long id; + private String ownership;//Форма собственности ПСК + private String nameShort;//Сокращенное наименование + private String nameFull;//Полное наименование + private String type;//вид ПСК - производственная/сервисная + private String inn;//ИНН организации + + /** + * подготовить конструкторы на все варианты внесения информации о преподавателях + * @param ownership + * @param name_short + * @param name_full + * @param type + * @param inn + */ + public Organization(String ownership, String name_short, String name_full, String type, String inn) { + this.ownership = ownership; + this.nameShort = name_short; + this.nameFull = name_full; + this.type = type; + this.inn = inn; + } +} diff --git a/source/src/main/java/gsp/technologies/source/models/Post.java b/source/src/main/java/gsp/technologies/source/models/Post.java new file mode 100644 index 0000000..b92cf30 --- /dev/null +++ b/source/src/main/java/gsp/technologies/source/models/Post.java @@ -0,0 +1,21 @@ +package gsp.technologies.source.models; + +import java.io.Serializable; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@AllArgsConstructor +@NoArgsConstructor +@Data +public class Post implements Serializable { + private Long id; + private String type;//тип документа (реестр/ списочный состав/ прочее) + private FileMetadata metadata; + + public Post(String type, FileMetadata metadata) { + this.type = type; + this.metadata = metadata; + } +} diff --git a/source/src/main/java/gsp/technologies/source/models/Program.java b/source/src/main/java/gsp/technologies/source/models/Program.java new file mode 100644 index 0000000..cc809fa --- /dev/null +++ b/source/src/main/java/gsp/technologies/source/models/Program.java @@ -0,0 +1,32 @@ +package gsp.technologies.source.models; + +import org.hibernate.annotations.OnDelete; +import org.hibernate.annotations.OnDeleteAction; + +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.ManyToOne; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Entity +@Data +public class Program { + @Id + @GeneratedValue(strategy=GenerationType.AUTO) + private long id; + private String name;//Наименование + private Integer lenght;//длительность программы + private String studyDirection;//направление обучения: обязательное-производственное (учесть в ограничениях) + private Integer price; + + @ManyToOne(fetch = FetchType.EAGER, optional = false) + @OnDelete(action = OnDeleteAction.SET_NULL) + private ProgramCretarea cretarea; +} diff --git a/source/src/main/java/gsp/technologies/source/models/ProgramCretarea.java b/source/src/main/java/gsp/technologies/source/models/ProgramCretarea.java new file mode 100644 index 0000000..5be864a --- /dev/null +++ b/source/src/main/java/gsp/technologies/source/models/ProgramCretarea.java @@ -0,0 +1,42 @@ +package gsp.technologies.source.models; + +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * Сущность критериев программы обучения: + * - от + * - в + * - стр + * - птм + * - итд ... + * + * Одному критерию может соответствовать группа программ обучения. + */ +@NoArgsConstructor +@AllArgsConstructor +@Entity +@Data +public class ProgramCretarea { + @Id + @GeneratedValue(strategy=GenerationType.AUTO) + private long id; + private String name;//Наименование + private String nameShort;//Наименование : сокращенно + + /** + * подготовить конструкторы на все варианты внесения информации о преподавателях + * + * @param name + * @param name_short + */ + public ProgramCretarea(String name, String nameShort) { + this.name = name; + this.nameShort = nameShort; + } +} diff --git a/source/src/main/java/gsp/technologies/source/models/Student.java b/source/src/main/java/gsp/technologies/source/models/Student.java new file mode 100644 index 0000000..76c0224 --- /dev/null +++ b/source/src/main/java/gsp/technologies/source/models/Student.java @@ -0,0 +1,44 @@ +package gsp.technologies.source.models; + +import java.util.Date; + +import org.hibernate.annotations.OnDelete; +import org.hibernate.annotations.OnDeleteAction; + +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.ManyToOne; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * Сведения об обученных + */ +@NoArgsConstructor +@AllArgsConstructor +@Entity +@Data +public class Student { + @Id + @GeneratedValue(strategy=GenerationType.AUTO) + private long id; + private String firstName;//Имя + private String secondName;//Отчество + private String lastName;//Фамилия + private String profession;//Профессия + private String category;//Категория (ИТР или рабочий) + private String direction;//Структурное подразделение + private String snils;//СНИЛС + private Date berth;//Дата рождения + private String sitizenship;//Гражданство + private String sex;//Пол (м/ж) + + @ManyToOne(fetch = FetchType.EAGER, optional = false) + @OnDelete(action = OnDeleteAction.SET_NULL) + private Organization organization;//Организация - работодатель + +} diff --git a/source/src/main/java/gsp/technologies/source/models/Teacher.java b/source/src/main/java/gsp/technologies/source/models/Teacher.java new file mode 100644 index 0000000..ffc9f1c --- /dev/null +++ b/source/src/main/java/gsp/technologies/source/models/Teacher.java @@ -0,0 +1,72 @@ +package gsp.technologies.source.models; + +import gsp.technologies.source.teh.strings.Naimer; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + + +/** + * Сущьность преподавателя + * добавить данные: + * - телефоны (список) + * - эл почты (список) + * - программы которые преподает + * - график работы + * - основное место работы (офис, наимеование ОП) + */ +@NoArgsConstructor +@AllArgsConstructor +@Entity +@Data +public class Teacher{ + @Id + @GeneratedValue(strategy=GenerationType.AUTO) + private long id; + private String secondName;//Фамилия + private String firstName;//Имя + private String lastName;//Отчество + private String employeeId; + private String snils; + + // подготовить конструкторы на все варианты внесения информации о преподавателях + public Teacher(String second_name, String first_name, String last_name){ + setSecondName(second_name); + setFirstName(first_name); + setLastName(last_name); + } + + public Teacher(String fio){ + setSecondName(Naimer.getSecondNameOf(fio)); + setFirstName(Naimer.getFirstNameOf(fio)); + setLastName(Naimer.getLastNameOf(fio)); + } + + public String fio(){ + return Naimer.getFioOf(this); + } + + /** + * проверка совпадения ФИО + * @param teacher + * @return + */ + public boolean like(Teacher teacher) { + return this.fio().equals(teacher.fio()); + } + + /** + * проверка совпадения всех полей кроме id + * @param teacher + * @return + */ + public boolean isSimilar(Teacher teacher) { + return this.fio().equals(teacher.fio())&& + this.getEmployeeId().equals(teacher.getEmployeeId())&& + this.getSnils().equals(teacher.getSnils()); + } +} diff --git a/source/src/main/java/gsp/technologies/source/repositories/FileMetadataRepository.java b/source/src/main/java/gsp/technologies/source/repositories/FileMetadataRepository.java new file mode 100644 index 0000000..46bf1f1 --- /dev/null +++ b/source/src/main/java/gsp/technologies/source/repositories/FileMetadataRepository.java @@ -0,0 +1,14 @@ +package gsp.technologies.source.repositories; + +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import gsp.technologies.source.models.FileMetadata; + +@Repository +public interface FileMetadataRepository extends JpaRepository { + FileMetadata findById(long id); + Page findById(PageRequest of, Long id); +} diff --git a/source/src/main/java/gsp/technologies/source/repositories/PostRepository.java b/source/src/main/java/gsp/technologies/source/repositories/PostRepository.java new file mode 100644 index 0000000..ac38c68 --- /dev/null +++ b/source/src/main/java/gsp/technologies/source/repositories/PostRepository.java @@ -0,0 +1,10 @@ +package gsp.technologies.source.repositories; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import gsp.technologies.source.models.Post; + +@Repository +public interface PostRepository extends JpaRepository { +} \ No newline at end of file diff --git a/source/src/main/java/gsp/technologies/source/services/FileMetadataService.java b/source/src/main/java/gsp/technologies/source/services/FileMetadataService.java new file mode 100644 index 0000000..33b9f31 --- /dev/null +++ b/source/src/main/java/gsp/technologies/source/services/FileMetadataService.java @@ -0,0 +1,15 @@ +package gsp.technologies.source.services; + +import org.springframework.stereotype.Service; + +import gsp.technologies.source.repositories.FileMetadataRepository; + +@Service +public class FileMetadataService { + private final FileMetadataRepository repo; + + public FileMetadataService(FileMetadataRepository repo) { + this.repo = repo; + } + +} diff --git a/source/src/main/java/gsp/technologies/source/services/PostService.java b/source/src/main/java/gsp/technologies/source/services/PostService.java new file mode 100644 index 0000000..531cb87 --- /dev/null +++ b/source/src/main/java/gsp/technologies/source/services/PostService.java @@ -0,0 +1,15 @@ +package gsp.technologies.source.services; + +import org.springframework.stereotype.Service; + +import gsp.technologies.source.repositories.PostRepository; + +@Service +public class PostService { + private final PostRepository repo; + + public PostService(PostRepository repo){ + this.repo = repo; + } + +} diff --git a/source/src/main/java/gsp/technologies/source/teh/strings/Arrayer.java b/source/src/main/java/gsp/technologies/source/teh/strings/Arrayer.java new file mode 100644 index 0000000..e2a9e6e --- /dev/null +++ b/source/src/main/java/gsp/technologies/source/teh/strings/Arrayer.java @@ -0,0 +1,51 @@ +package gsp.technologies.source.teh.strings; + +import java.util.List; + +public class Arrayer { + + /** + * Удаляет все пустые строки из массива строк и возвращает новый массив с оставшимися строками. + * + * @param strings Массив строк из которогу удаляются пустые строки. + * @return Новый массив с оставшимися строками. + */ + public static String[] removeEmptyStrings(String[] strings) { + + // Подсчет количества непустых строк в входном массиве + int count = 0; + for (String string : strings) { + if (!string.equals("")) { + count++; + } + } + + // Новый массив для хранения непустых строк + String[] result = new String[count]; + + // Копирование непустых строк из входного массива в новый массив + int index = 0; + for (String string : strings) { + if (!string.equals("")) { + result[index] = string; + index++; + } + } + + // Возвращение нового массива с непустыми строками + return result; + } + + /** + * Удаление повторяющихся элементов списка строк + * Получение списка уникальных строк + * + */ + public static List uniqueList(List list) { + // Удаление повторяющихся элементов списка + List result = list.stream().distinct().toList(); + return result; + } + + +} diff --git a/source/src/main/java/gsp/technologies/source/teh/strings/Dater.java b/source/src/main/java/gsp/technologies/source/teh/strings/Dater.java new file mode 100644 index 0000000..9d81108 --- /dev/null +++ b/source/src/main/java/gsp/technologies/source/teh/strings/Dater.java @@ -0,0 +1,16 @@ +package gsp.technologies.source.teh.strings; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.Date; + +/** + * Обработка строк с датами + */ +public class Dater { + private Long longDate; + private String stringDate; + private Date date; + private LocalDate localDate; + private LocalDateTime localDateTime; +} diff --git a/source/src/main/java/gsp/technologies/source/teh/strings/Naimer.java b/source/src/main/java/gsp/technologies/source/teh/strings/Naimer.java new file mode 100644 index 0000000..df90e56 --- /dev/null +++ b/source/src/main/java/gsp/technologies/source/teh/strings/Naimer.java @@ -0,0 +1,237 @@ +package gsp.technologies.source.teh.strings; + +import gsp.technologies.source.models.Teacher; + +/** + * Обработка строк, содержащих сведения о ФИО + * - Teacher + * - Student + * - Person + */ +public class Naimer { + private static String not = "Нет"; + /** + * Объединяет фамилию, имя и отчество в одну строку. + * Возможые ситуации: + * - фамилия, имя или отчество могут содержать нулевые значения + * - отчество может содержать приписки + * + * @param second_name - фамилия + * @param first_name - имя + * @param last_name - отчество + * @return объединенную строку или пустую строку, + * если все входящие параметры являются нулевыми значениями + */ + public static String getFioOf(String second_name, String first_name, String last_name) { + // Инициализируем StringBuilder для хранения результата. + StringBuilder result = new StringBuilder(); + + // Проверяем, является ли фамилия нулевым значением. + if (!Stringer.checkForEmpty(second_name)) { + // Если фамилия не является нулевым значением, то добавляем ее в строку. + result.append(second_name); + } else { + // Если фамилия является нулевым значением, то добавляем "Нет" в строку. + result.append(not); + } + + // Проверяем, является ли имя нулевым значением. + if (!Stringer.checkForEmpty(first_name)) { + // Если имя не является нулевым значением, то добавляем пробел и имя в строку. + result.append(" " + first_name); + } else { + // Если имя является нулевым значением, то добавляем "Нет" в строку. + result.append(" " + not); + } + + // Проверяем, является ли отчество нулевым значением. + if (!Stringer.checkForEmpty(last_name)) { + // Если отчество не является нулевым значением, то добавляем пробел и отчество в строку. + result.append(" " + last_name); + } else { + // Если отчество является нулевым значением, то добавляем "Нет" в строку. + result.append(" " + not); + } + + // Возвращаем объединенную строку или строку "Нет Нет Нет", + //если все входящие параметры являются нулевыми значениями. + return result.toString().trim(); + } + + + /** + * Объединяет фамилию, имя и отчество из объекта преподавателя в одну строку. + * Возможные ситуации: + * - фамилия, имя или отчество могут содержать нулевые значения + * - отчество может содержать приписки + * + * @param teacher - объект преподавателя + * @return объединенная строка или строка "Нет Нет Нет", + * если все входящие параметры являются нулевыми значениями + */ + public static String getFioOf(Teacher teacher) { + // Инициализируем StringBuilder для хранения результата. + StringBuilder result = new StringBuilder(); + + // Проверяем, является ли фамилия нулевым значением. + if (!Stringer.checkForEmpty(teacher.getSecondName())) { + // Если фамилия не является нулевым значением, то добавляем ее в строку. + result.append(teacher.getSecondName()); + } else { + // Если фамилия является нулевым значением, то добавляем "Нет" в строку. + result.append(not); + } + + // Проверяем, является ли имя нулевым значением. + if (!Stringer.checkForEmpty(teacher.getFirstName())) { + // Если имя не является нулевым значением, то добавляем пробел и имя в строку. + result.append(" " + teacher.getFirstName()); + } else { + // Если имя является нулевым значением, то добавляем "Нет" в строку. + result.append(" " + not); + } + + // Проверяем, является ли отчество нулевым значением. + if (!Stringer.checkForEmpty(teacher.getLastName())) { + // Если отчество не является нулевым значением, то добавляем пробел и отчество в строку. + result.append(" " + teacher.getLastName()); + } else { + // Если отчество является нулевым значением, то добавляем "Нет" в строку. + result.append(" " + not); + } + + // Возвращаем объединенную строку или строку "Нет Нет Нет", если все входящие параметры + // являются нулевыми значениями. + return result.toString().trim(); + } + + /** + * Извлекает фамилию из строки, содержащей полное имя (ФИО). + * Строка ФИО может содержать: + * - пустую строку (null, empty, "") + * - одно слово (фамилия, "Нет", односложный комментарий) + * - два слова (фамилия, имя, "Нет") + * - три слова (фамилия, имя, отчество, "Нет") + * - четыре слова (фамилия, имя, отчество, постфикс отчества, комментарии) + * - и более. + * + * Все слова начиная с пятого однозначно являются бесполезным наполнением, однако + * такие слова должны включены в строку отчества, если они есть. + * + * Строка может быть извлечена из xlsx файла + * или сгенерирована из данныых содержащихся в базе данных + * + * @param fio строка, содержащая ФИО + * @return строка, содержащая первое слово из fio которое является фамилией или содержит слово "Нет" + */ + public static String getSecondNameOf(String fio) { + // Инициализируем StringBuilder для хранения результата. + StringBuilder result = new StringBuilder(); + + // Проверяем, является ли строка null, пустой строкой или состоит только из пробелов. + if (Stringer.checkForEmpty(fio)) { + // Если строка является нулевым значением, то добавляем "Нет" в строку. + result.append(not); + } else { + //убираем пробелы в начале и в конце строки + fio = fio.trim(); + + // Разделяем строку на пробелы и возвращаем первую часть, которая как ожидается является фамилией + result.append(fio.split(" ")[0]); + } + + // Возвращаем первое слово в строке или строку "Нет" + return result.toString().trim(); + } + + /** + * Извлекает имя (фамилия, имя или отчество) из строки, предположительно содержащей только одно слово. + * - проверяет не пустая ли строка, если нет, то добавляет "Нет" + * - очищает строку от лишних пробельных символов + * - возвращает имя или "Нет" + * + * @param name + * @return name + */ + public static String getNameOf(String name) { + // Проверяем, является ли строка null, пустой строкой или состоит только из пробелов. + if (Stringer.checkForEmpty(name)) { + // Если строка является нулевым значением, то добавляем "Нет" в строку. + return not; + } else { + //очищаем строку + name = Stringer.clear(name); + // возвращаем имя + return name; + } + } + + /** + * Извлекает имя из строки, содержащей полное имя (ФИО). + * + * @param fio строка, содержащая ФИО + * @return строка, содержащая второе слово из fio которое является именем или содержит слово "Нет" + */ + public static String getFirstNameOf(String fio) { + // Создаем StringBuilder для хранения результата + StringBuilder result = new StringBuilder(); + + // Проверяем, является ли строка null, пустой строкой или состоит только из пробелов. + if (Stringer.checkForEmpty(fio)) { + // Если строка является нулевым значением, то добавляем "Нет" в строку. + result.append(not); + } else { + //убираем излишние пробельные символы + fio = Stringer.clear(fio); + + // Разбиваем строку по пробелам и пишем слова в массив + String[] strings = fio.split(" "); + + // Если массив содержит два или более слов, то второе слово является именем. + if (strings.length > 1) { + // Пишем второе слово в результат + result.append(strings[1].trim()); + }else { + // Если массив содержит только одно слово, то добавляем "Нет" в строку. + result.append(not); + } + } + // Возвращаем второе слово в строке или строку "Нет" + return result.toString().trim(); + } + + /** + * Извлекает отчество из строки, содержащей полное имя (ФИО). + * @param fio строка, содержащая ФИО + * @return строка, содержащая третье слово из fio которое является отчеством\ + * или содержит слово "Нет" + * или содержит все слова, содержащиеся в ФИО, за исключением первых двух + */ + public static String getLastNameOf(String fio) { + // Создаем StringBuilder для хранения результата + StringBuilder result = new StringBuilder(); + + // Проверяем, является ли строка null, пустой строкой или состоит только из пробелов. + if (Stringer.checkForEmpty(fio)) { + // Если строка является нулевым значением, то добавляем "Нет" в строку. + result.append(not); + } else { + //убираем пробелы в начале и в конце строки + fio = fio.trim(); + fio = Stringer.clear(fio); + + String[] strings = fio.split(" "); + if (strings.length > 2) { + // Пишем третье и последующие слова в результат + for (int i = 2; i < strings.length; i++) { + result.append(strings[i]).append(" "); + } + } else { + // Если массив содержит только два или менее слов, то добавляем "Нет" в строку. + result.append(not); + } + } + // Возвращаем строку ФИО без первых двух слов с удаленными лишними пробелами + return result.toString().trim(); + } +} diff --git a/source/src/main/java/gsp/technologies/source/teh/strings/Stringer.java b/source/src/main/java/gsp/technologies/source/teh/strings/Stringer.java new file mode 100644 index 0000000..071b6e2 --- /dev/null +++ b/source/src/main/java/gsp/technologies/source/teh/strings/Stringer.java @@ -0,0 +1,54 @@ +package gsp.technologies.source.teh.strings; + +/** + * Класс для работы со строками + */ +public class Stringer { + + /** + * Проверяет, является ли переданная строка null, пустой строкой или состоит только из пробелов. + * + * @param str Строка для проверки + * @return True если строка является null, пустой строкой или состоит только из пробелов + * False в противном случае + */ + public static Boolean checkForEmpty(String str) { + // Check if the string is null + if (str == null) { + return true; + } + // Check if the string is empty or consists only of whitespace characters + if (str.isEmpty() || str.trim().isEmpty()) { + return true; + } + // The string is not null, not empty and does not consist only of whitespace characters + return false; + } + + /** + * Удаляет регулярным выражением лишние пробельные символы из строки. + * + * Заменяет знаки переноса строки на пробелы с помощью использования регулярного выражения + * \s+ - пробелы (и все ниже приведенные пробельные символы) + * \t - табуляция + * \v - вертикальная табуляция + * \r - перенос в начало строки + * \n - перенос строки + * \f - форматированный перенос строки + * + * Осавляет по одному пробелу между словами, если слов больше одного + * Возвращает пустую строку, если получена строка null + * + * @param string строка для обработки + * @return строку без лишних пробелов или пустую строку + */ + public static String clear(String string) { + // Проверяем, не является ли строка null. Если строка null, возвращаем пустую строку. + if (string == null) { + return ""; + } + + // Удаляем лишние пробелы из строки. + return string.replaceAll("\\s+", " ").trim(); + } +} diff --git a/source/src/main/resources/application.properties b/source/src/main/resources/application.properties deleted file mode 100644 index 97f565a..0000000 --- a/source/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ -spring.application.name=source diff --git a/source/src/main/resources/application.yaml b/source/src/main/resources/application.yaml new file mode 100644 index 0000000..4ca9b9a --- /dev/null +++ b/source/src/main/resources/application.yaml @@ -0,0 +1,18 @@ +server: + port: 8181 +spring: + application: + name: source + thymeleaf: + enabled: true + encoding: UTF-8 + mode: LEGACYHTML5 +# Разрешение на формирование скрытых запросов (DELETE) + mvc: + hiddenmethod: + filter: + enabled: true + format: + date: yyyy-MM-dd + date-time: yyyy-MM-dd HH:mm:ss + time: HH:mm:ss \ No newline at end of file