From 5a4a968015872b329962b72206da0db327f74723 Mon Sep 17 00:00:00 2001
From: Anton Romanov <a.romanov@ulstu.ru>
Date: Wed, 29 Jan 2025 00:53:22 +0400
Subject: [PATCH] Show indicators list

---
 .../ru/ulstu/admin/model/IndicatorForm.java   | 13 ++++++++
 .../ulstu/admin/service/AdminController.java  | 30 +++++++++++++++++++
 .../ru/ulstu/admin/service/AdminService.java  | 30 +++++++++++++++++++
 .../ru/ulstu/indicator/model/Indicator.java   | 24 +++++++++++++++
 .../repository/IndicatorRepository.java       |  8 +++++
 .../indicator/service/IndicatorService.java   | 28 +++++++++++++++++
 src/main/resources/templates/default.html     |  5 +++-
 .../resources/templates/indicatorsList.html   | 13 ++++++++
 8 files changed, 150 insertions(+), 1 deletion(-)
 create mode 100644 src/main/java/ru/ulstu/admin/model/IndicatorForm.java
 create mode 100644 src/main/java/ru/ulstu/admin/service/AdminController.java
 create mode 100644 src/main/java/ru/ulstu/admin/service/AdminService.java
 create mode 100644 src/main/java/ru/ulstu/indicator/model/Indicator.java
 create mode 100644 src/main/java/ru/ulstu/indicator/repository/IndicatorRepository.java
 create mode 100644 src/main/java/ru/ulstu/indicator/service/IndicatorService.java
 create mode 100644 src/main/resources/templates/indicatorsList.html

diff --git a/src/main/java/ru/ulstu/admin/model/IndicatorForm.java b/src/main/java/ru/ulstu/admin/model/IndicatorForm.java
new file mode 100644
index 0000000..57cd476
--- /dev/null
+++ b/src/main/java/ru/ulstu/admin/model/IndicatorForm.java
@@ -0,0 +1,13 @@
+package ru.ulstu.admin.model;
+
+public class IndicatorForm {
+    private String name;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+}
diff --git a/src/main/java/ru/ulstu/admin/service/AdminController.java b/src/main/java/ru/ulstu/admin/service/AdminController.java
new file mode 100644
index 0000000..488d398
--- /dev/null
+++ b/src/main/java/ru/ulstu/admin/service/AdminController.java
@@ -0,0 +1,30 @@
+package ru.ulstu.admin.service;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import ru.ulstu.admin.model.IndicatorForm;
+
+@Controller
+@RequestMapping("/admin")
+public class AdminController {
+    private final AdminService adminService;
+
+    public AdminController(AdminService adminService) {
+        this.adminService = adminService;
+    }
+
+    @GetMapping("indicators")
+    public String getListOfIndicators(Model model) {
+        model.addAttribute("indicators", adminService.getIndicators());
+        return "indicatorsList";
+    }
+
+    @PostMapping("addIndicator")
+    public String addIndicator(IndicatorForm indicatorForm, Model model) {
+        adminService.saveIndicator(indicatorForm);
+        return "indicatorsList";
+    }
+}
diff --git a/src/main/java/ru/ulstu/admin/service/AdminService.java b/src/main/java/ru/ulstu/admin/service/AdminService.java
new file mode 100644
index 0000000..147c821
--- /dev/null
+++ b/src/main/java/ru/ulstu/admin/service/AdminService.java
@@ -0,0 +1,30 @@
+package ru.ulstu.admin.service;
+
+import org.springframework.stereotype.Service;
+import ru.ulstu.admin.model.IndicatorForm;
+import ru.ulstu.indicator.model.Indicator;
+import ru.ulstu.indicator.service.IndicatorService;
+
+import java.util.List;
+
+@Service
+public class AdminService {
+    private final IndicatorService indicatorService;
+
+    public AdminService(IndicatorService indicatorService) {
+        this.indicatorService = indicatorService;
+    }
+
+    public List<Indicator> getIndicators() {
+        return indicatorService.getIndicatorList();
+    }
+
+    public void saveIndicator(IndicatorForm indicatorForm) {
+        Indicator indicator = indicatorService.findByName(indicatorForm.getName());
+        if (indicator == null) {
+            indicatorService.save(new Indicator(indicatorForm.getName()));
+        } else {
+            // TODO: update other fields
+        }
+    }
+}
diff --git a/src/main/java/ru/ulstu/indicator/model/Indicator.java b/src/main/java/ru/ulstu/indicator/model/Indicator.java
new file mode 100644
index 0000000..92ba741
--- /dev/null
+++ b/src/main/java/ru/ulstu/indicator/model/Indicator.java
@@ -0,0 +1,24 @@
+package ru.ulstu.indicator.model;
+
+import jakarta.persistence.Entity;
+import ru.ulstu.model.BaseEntity;
+
+@Entity
+public class Indicator extends BaseEntity {
+    private String name;
+
+    public Indicator() {
+    }
+
+    public Indicator(String name) {
+        this.name = name;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+}
diff --git a/src/main/java/ru/ulstu/indicator/repository/IndicatorRepository.java b/src/main/java/ru/ulstu/indicator/repository/IndicatorRepository.java
new file mode 100644
index 0000000..dce70b2
--- /dev/null
+++ b/src/main/java/ru/ulstu/indicator/repository/IndicatorRepository.java
@@ -0,0 +1,8 @@
+package ru.ulstu.indicator.repository;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import ru.ulstu.indicator.model.Indicator;
+
+public interface IndicatorRepository extends JpaRepository<Indicator, Integer> {
+    Indicator findByName(String name);
+}
diff --git a/src/main/java/ru/ulstu/indicator/service/IndicatorService.java b/src/main/java/ru/ulstu/indicator/service/IndicatorService.java
new file mode 100644
index 0000000..31286c6
--- /dev/null
+++ b/src/main/java/ru/ulstu/indicator/service/IndicatorService.java
@@ -0,0 +1,28 @@
+package ru.ulstu.indicator.service;
+
+import org.springframework.stereotype.Service;
+import ru.ulstu.indicator.model.Indicator;
+import ru.ulstu.indicator.repository.IndicatorRepository;
+
+import java.util.List;
+
+@Service
+public class IndicatorService {
+    private final IndicatorRepository indicatorRepository;
+
+    public IndicatorService(IndicatorRepository indicatorRepository) {
+        this.indicatorRepository = indicatorRepository;
+    }
+
+    public List<Indicator> getIndicatorList() {
+        return indicatorRepository.findAll();
+    }
+
+    public void save(Indicator indicator) {
+        indicatorRepository.save(indicator);
+    }
+
+    public Indicator findByName(String name) {
+        return indicatorRepository.findByName(name);
+    }
+}
diff --git a/src/main/resources/templates/default.html b/src/main/resources/templates/default.html
index 6100fa6..7b3f377 100644
--- a/src/main/resources/templates/default.html
+++ b/src/main/resources/templates/default.html
@@ -58,6 +58,9 @@
                 <li class="nav-item dropdown" sec:authorize="hasRole('ROLE_ADMIN')">
                     <a class="nav-link dropdown-toggle" href="#" role="button" data-toggle="dropdown"
                        aria-haspopup="true" aria-expanded="false">Администратору</a>
+                    <div class="dropdown-menu" aria-labelledby="navbarDropdown">
+                        <a class="dropdown-item" href="/admin/indicators">Список показателей</a>
+                    </div>
                 </li>
                 <li class="nav-item">
                     <a class="nav-link disabled" href="#" sec:authorize="hasRole('ROLE_ADMIN')">Личный кабинет
@@ -118,7 +121,7 @@
 
 </div>
 <footer>
-    2022
+    2025
 </footer>
 </body>
 </html>
\ No newline at end of file
diff --git a/src/main/resources/templates/indicatorsList.html b/src/main/resources/templates/indicatorsList.html
new file mode 100644
index 0000000..acb2aa2
--- /dev/null
+++ b/src/main/resources/templates/indicatorsList.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html SYSTEM "http://www.thymeleaf.org/dtd/xhtml1-strict-thymeleaf-spring4-4.dtd">
+<html xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" xmlns:th="http://www.w3.org/1999/xhtml"
+      layout:decorate="~{default}">
+<div class="container" layout:fragment="content">
+    <a href="/editIndicator/0" class="btn btn-outline-dark">
+        <i class="fa fa-plus-square" aria-hidden="true"> Добавить показатель</i>
+    </a>
+
+    <div th:each="i : ${indicators}">
+        <div th:text="${i.name}"></div>
+    </div>
+</div>
+</html>