From 0a4c1948b0e29ea49a3981c6a5601237cc4bf112 Mon Sep 17 00:00:00 2001 From: igor Date: Mon, 30 Jun 2025 07:22:30 +0500 Subject: [PATCH] Add springdoc --- org_ccalm_dbms.yml | 3 +- pom.xml | 24 +++- src/main/java/logging/JavaLogger.java | 18 +++ src/main/java/logging/Logger.java | 12 ++ src/main/java/logging/LoggerFactory.java | 14 +++ src/main/java/models/ErrorResponseModel.java | 113 ++++++++++++++++++ .../java/org/ccalm/dbms/MainController.java | 51 +++++--- .../SingleLineThrowableProxyConverter.java | 14 +++ src/main/java/org/ccalm/dbms/Translation.java | 68 +++++++++++ src/main/resources/logback-spring.xml | 22 ++-- 10 files changed, 310 insertions(+), 29 deletions(-) create mode 100644 src/main/java/logging/JavaLogger.java create mode 100644 src/main/java/logging/Logger.java create mode 100644 src/main/java/logging/LoggerFactory.java create mode 100644 src/main/java/models/ErrorResponseModel.java create mode 100644 src/main/java/org/ccalm/dbms/SingleLineThrowableProxyConverter.java create mode 100644 src/main/java/org/ccalm/dbms/Translation.java diff --git a/org_ccalm_dbms.yml b/org_ccalm_dbms.yml index ea83e88..97fad5b 100644 --- a/org_ccalm_dbms.yml +++ b/org_ccalm_dbms.yml @@ -11,7 +11,7 @@ issuer: spring: application: - name: org_ccalm_dbms + name: org-ccalm-dbms datasource: url: jdbc:postgresql://91.201.214.156:5432/CCALM?ApplicationName=org_ccalm_dbms&ssl=true&sslmode=require&connectTimeout=10000&socketTimeout=10000 username: postgres @@ -41,7 +41,6 @@ access: refresh: time: 43200 - mail: host: smtp.yandex.ru port: 465 diff --git a/pom.xml b/pom.xml index d12b9ea..286d1d6 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ org.ccalm dbms - 0.0.1-SNAPSHOT + 1.0.1 dbms Database management system @@ -100,9 +100,29 @@ commons-io 2.16.1 + + + org.springdoc + springdoc-openapi-starter-webmvc-ui + 2.8.4 + + + javax.annotation + javax.annotation-api + 1.3.2 + + + + org.projectlombok + lombok + 1.18.36 + provided + + + org-ccalm-dbms org.springframework.boot @@ -121,7 +141,7 @@ 2.22.2 - file:kz_mcp_dbms.properties + file:org_ccalm_dbms.yml diff --git a/src/main/java/logging/JavaLogger.java b/src/main/java/logging/JavaLogger.java new file mode 100644 index 0000000..2fb41f9 --- /dev/null +++ b/src/main/java/logging/JavaLogger.java @@ -0,0 +1,18 @@ +package logging; + +import dbms.DBMSRecords; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +public class JavaLogger implements logging.Logger { + private final Logger logger; + + public JavaLogger(Class clazz) { + this.logger = LogManager.getLogger(clazz); + } + + public void debug(String msg) { this.logger.debug(msg); } + public void info(String msg) { this.logger.info(msg); } + public void warn(String msg) { this.logger.warn(msg); } + public void error(String msg) { this.logger.error(msg); } +} diff --git a/src/main/java/logging/Logger.java b/src/main/java/logging/Logger.java new file mode 100644 index 0000000..02de834 --- /dev/null +++ b/src/main/java/logging/Logger.java @@ -0,0 +1,12 @@ +package logging; + +public interface Logger { + void debug(String msg); + void info(String msg); + void warn(String msg); + void error(String msg); + + static Logger getLogger(Class clazz) { + return LoggerFactory.createLogger(clazz); // Подменяется реализацией + } +} diff --git a/src/main/java/logging/LoggerFactory.java b/src/main/java/logging/LoggerFactory.java new file mode 100644 index 0000000..30d3660 --- /dev/null +++ b/src/main/java/logging/LoggerFactory.java @@ -0,0 +1,14 @@ +package logging; + +import org.apache.logging.slf4j.SLF4JLogger; + +public class LoggerFactory { + public static Logger createLogger(Class clazz) { + // Тут выбираешь реализацию по флагу/условию + //if (isAndroid()) { + // return new AndroidLogger(clazz); + //} else { + return new JavaLogger(clazz); + //} + } +} \ No newline at end of file diff --git a/src/main/java/models/ErrorResponseModel.java b/src/main/java/models/ErrorResponseModel.java new file mode 100644 index 0000000..a7b5689 --- /dev/null +++ b/src/main/java/models/ErrorResponseModel.java @@ -0,0 +1,113 @@ +package models; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.util.Collections; +import java.util.List; +import java.util.UUID; + +@Schema( + description = "Error API response", + example = "{ \"error_code\": 10000, \"error_message\": [\"Internal_Server_Error\",\"Please_log_in\"], \"error_setting\": [\"99;day\",\"1;2\"], \"error_marker\": \"2a449883-c7c6-468e-b3ae-5f73fc96627d\" }" +) + +public class ErrorResponseModel { + + @JsonIgnore + private int httpCode; + + @Schema(description = "Error code", example = "10000") + @JsonProperty("error_code") + private int errorCode; + + @Schema(description = "List of error descriptions", example = "[\"Internal_Server_Error\",\"Please_log_in\"]") + @JsonProperty("error_message") + private List errorMessage; + + @Schema(description = "Options for translated text", example = "[\"99;day\",\"1;2\"]") + @JsonProperty("error_setting") + private List errorSetting; + + @Schema(description = "Unique identifier for searching in the database", example = "4260aad8-f7ee-4be4-b52c-15d56ec83232") + @JsonProperty("error_marker") + private String errorMarker; + + public ErrorResponseModel(int httpCode, int errorCode) { + this.httpCode = httpCode; + this.errorCode = errorCode; + this.errorMessage = null; + this.errorSetting = null; + this.errorMarker = UUID.randomUUID().toString(); + } + + public ErrorResponseModel(int httpCode, int errorCode, List errorMessage, String errorMarker) { + this.httpCode = httpCode; + this.errorCode = errorCode; + this.errorMessage = errorMessage; + this.errorMarker = errorMarker; + } + + public ErrorResponseModel(int httpCode, int errorCode, String errorMessage, String errorMarker) { + this.httpCode = httpCode; + this.errorCode = errorCode; + this.errorMessage = Collections.singletonList(errorMessage); + this.errorMarker = errorMarker; + } + + public ErrorResponseModel(int httpCode, int errorCode, String errorMessage, String errorSetting, String errorMarker) { + this.httpCode = httpCode; + this.errorCode = errorCode; + this.errorMessage = Collections.singletonList(errorMessage); + this.errorSetting = Collections.singletonList(errorSetting); + this.errorMarker = errorMarker; + } + + public ErrorResponseModel(int httpCode, int errorCode, List errorMessage, List errorSetting, String errorMarker) { + this.httpCode = httpCode; + this.errorCode = errorCode; + this.errorMessage = errorMessage; + this.errorSetting = errorSetting; + this.errorMarker = errorMarker; + } + + public int getHttp_code() { + return httpCode; + } + public void setHttp_code(int errorCode) { + this.httpCode = httpCode; + } + + public int getError_code() { + return errorCode; + } + + public void setError_code(int errorCode) { + this.errorCode = errorCode; + } + + public List getError_message() { + return errorMessage; + } + + public void setError_message(List errorMessage) { + this.errorMessage = errorMessage; + } + + public void setError_setting(List errorSetting) { + this.errorSetting = errorSetting; + } + + public List getError_setting() { + return errorSetting; + } + + public void setError_marker(String errorMarker) { + this.errorMarker = errorMarker; + } + + public String getError_marker() { + return errorMarker; + } +} \ No newline at end of file diff --git a/src/main/java/org/ccalm/dbms/MainController.java b/src/main/java/org/ccalm/dbms/MainController.java index d479894..069449d 100644 --- a/src/main/java/org/ccalm/dbms/MainController.java +++ b/src/main/java/org/ccalm/dbms/MainController.java @@ -1,28 +1,37 @@ package org.ccalm.dbms; import com.zaxxer.hikari.HikariDataSource; +import models.ErrorResponseModel; import org.json.JSONException; import org.json.JSONObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.slf4j.MarkerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.ApplicationContext; +import org.springframework.core.env.Environment; +import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; import java.io.InputStream; import java.util.Properties; import java.util.Set; +import java.util.UUID; import java.util.stream.Collectors; @Controller public class MainController { + private static final Logger logger = LoggerFactory.getLogger(MainController.class); + + private final NamedParameterJdbcTemplate jdbcTemplate; + private final Environment environment; private HikariDataSource dataSource; @Value("${spring.application.name}") @@ -32,36 +41,46 @@ public class MainController { public void DatabaseService(HikariDataSource dataSource) { this.dataSource = dataSource; } - + //--------------------------------------------------------------------------- + @Autowired + public MainController(NamedParameterJdbcTemplate jdbcTemplate, HikariDataSource dataSource, Environment environment) { + this.jdbcTemplate = jdbcTemplate; + this.environment = environment; + this.dataSource = dataSource; + } + //--------------------------------------------------------------------------- @RequestMapping(value = "/",method = {RequestMethod.POST,RequestMethod.GET},produces = "application/json;charset=utf-8") @ResponseBody - public ResponseEntity index() { - JSONObject json = new JSONObject(); + public ResponseEntity index( + @CookieValue(value = "lng", defaultValue = "1") String language_id + ) { + Translation trt = new Translation(language_id,jdbcTemplate); try { + JSONObject json = new JSONObject(); json.put("error_code",0); json.put("error_message",""); json.put("error_marker",(String)null); String buildDate=""; - //String buildVersion=""; + String buildVersion=""; try { InputStream inputStream = MainController.class.getClassLoader().getResourceAsStream("META-INF/build-info.properties"); if (inputStream != null) { Properties properties = new Properties(); properties.load(inputStream); buildDate = properties.getProperty("build.time"); - //buildVersion = properties.getProperty("build.version"); + buildVersion = properties.getProperty("build.version"); } } catch (Exception e) { e.printStackTrace(); } json.put("build_date",buildDate); - //json.put("build_version",buildVersion); + json.put("version",buildVersion); json.put("name",application_name); //json.put("active_connections",dataSource.getHikariPoolMXBean().getActiveConnections()); //json.put("idle_connections",dataSource.getHikariPoolMXBean().getIdleConnections()); // Вывод всех зарегистрированных маршрутов в системе - ApplicationContext context = SpringContext.getApplicationContext(); + /*ApplicationContext context = SpringContext.getApplicationContext(); if (context != null) { RequestMappingHandlerMapping mapping = context.getBean(RequestMappingHandlerMapping.class); Set endpoints = mapping.getHandlerMethods().keySet().stream() @@ -69,12 +88,14 @@ public class MainController { .collect(Collectors.toSet()); System.out.println("=== Registered API endpoints ==="); endpoints.forEach(System.out::println); - } + }*/ - } catch (JSONException e) { - throw new RuntimeException(e); + return new ResponseEntity<>(json.toString(), HttpStatus.OK); + } catch (Exception e) { + String uuid = UUID.randomUUID().toString(); + logger.error(MarkerFactory.getMarker(uuid), e.getMessage()); + return new ResponseEntity<>(new ErrorResponseModel(500, 10000, trt.trt(false, "Internal_Server_Error"), null, uuid), HttpStatus.INTERNAL_SERVER_ERROR); } - return ResponseEntity.ok(json.toString()); } } diff --git a/src/main/java/org/ccalm/dbms/SingleLineThrowableProxyConverter.java b/src/main/java/org/ccalm/dbms/SingleLineThrowableProxyConverter.java new file mode 100644 index 0000000..b75dfac --- /dev/null +++ b/src/main/java/org/ccalm/dbms/SingleLineThrowableProxyConverter.java @@ -0,0 +1,14 @@ +package org.ccalm.dbms; + +import ch.qos.logback.classic.pattern.ThrowableProxyConverter; +import ch.qos.logback.classic.spi.IThrowableProxy; +import ch.qos.logback.classic.spi.ThrowableProxyUtil; + +public class SingleLineThrowableProxyConverter extends ThrowableProxyConverter { + @Override + protected String throwableProxyToString(IThrowableProxy tp) { + if (tp == null) return ""; + String stackTrace = ThrowableProxyUtil.asString(tp); + return stackTrace.replace("\r", "").replace("\n", "\\n").replace("\t", " "); + } +} diff --git a/src/main/java/org/ccalm/dbms/Translation.java b/src/main/java/org/ccalm/dbms/Translation.java new file mode 100644 index 0000000..bc9e6d4 --- /dev/null +++ b/src/main/java/org/ccalm/dbms/Translation.java @@ -0,0 +1,68 @@ +package org.ccalm.dbms; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import tools.DBTools; +import org.json.JSONObject; +import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; + +import java.util.List; + +public class Translation { + + private static final Logger logger = LogManager.getLogger(Translation.class); + + public int language_id; + public NamedParameterJdbcTemplate jdbcTemplate; + Translation(String lng, NamedParameterJdbcTemplate jdbcTemplate){ + language_id=1; + switch (lng) { + case "kz": + case "kk": + language_id = 2; + break; + case "en": + language_id = 3; + break; + case "uz": + language_id = 4; + break; + case "ru": + default: + language_id = 1; + break; + } + this.jdbcTemplate = jdbcTemplate; + } + + String trt(boolean translate,String text){ + if(translate) { + String sql = """ + select + translation + from + main._translations + where + del=false + and language_id=:language_id + and identifier=:identifier; + """; + MapSqlParameterSource parameters = new MapSqlParameterSource(); + parameters.addValue("language_id", language_id); + parameters.addValue("identifier", text); + List ret = jdbcTemplate.query(sql, parameters, new DBTools.JsonRowMapper()); + int i = 0; + for (i = 0; i < ret.size(); i++) { + JSONObject json = new JSONObject(ret.get(i)); + text = json.getString("translation"); + } + if(i==0){ + text = text.replace("_", " "); + } + return text; + }else { + return text; + } + } +} diff --git a/src/main/resources/logback-spring.xml b/src/main/resources/logback-spring.xml index 411713f..ab561eb 100644 --- a/src/main/resources/logback-spring.xml +++ b/src/main/resources/logback-spring.xml @@ -1,34 +1,36 @@ - + + ${LOGS}/${appName}.log - {"timestamp":"%d{yyyy-MM-dd'T'HH:mm:ss.SSS'Z'}","thread":"[%thread]","level":"%level","logger":"%logger{36}","marker":"%X{marker}","message":"%msg"}%n + {"timestamp":"%d{yyyy-MM-dd'T'HH:mm:ss.SSS'Z'}","thread":"[%thread]","level":"%level","logger":"%logger{36}","marker":"%marker","message":"%msg","exception":"%exOneLine"}%n - + ${LOGS}/${appName}.%d{yyyy-MM-dd}.%i.log + 100MB 30 - - 100MB - + 3GB - %d{yyyy-MM-dd'T'HH:mm:ss.SSS'Z'} | %level | %logger{36} | %X{marker} | %msg%n + + %d{yyyy-MM-dd'T'HH:mm:ss.SSS'Z'} | %level | %logger{36} | %marker | %msg%n + - - + + - \ No newline at end of file +