fix(qa-report): version tag, /drafts redirect, audit filter complete, i18n cleanup

QA report v2.31.x batch:

- **VersionController.tag**: было 'none' (maven build на main без git tag) → UI
  показывал «dev · 6077d4df». Helm передаёт image.tag через env
  ORDINIS_BUILD_IMAGE_TAG, controller парсит «v2-31-2-e3c82775» → «v2.31.2».
  Helm chart change в ordinis-infra (separate MR).

- **/drafts redirect** (BUG-003): пустой 404 «Not Found» plain text → теперь
  static redirect на /my-drafts.

- **Audit action filter** (BUG-004): дропдаун содержал только 3 значения
  (CREATE/UPDATE/CLOSE), но в таблице 11 типов (DRAFT_*, DEFINITION_*).
  Frontend AuditAction enum + ACTIONS list синхронизированы с backend
  AuditLogger/SchemaDraftService/DraftService.

- **i18n cleanup** (BUG-006/007/UX-005):
  - myDrafts.description: «Все ваши submissions с pending/approved...» →
    «Все ваши черновики с историей: ожидает рассмотрения, одобрен...»
  - reviews.description: «Pending drafts от makers, ждут approve/reject» →
    «Черновики от авторов, ждут одобрения или отклонения. Общая очередь...»
  - reviews.queueTotal: «N pending drafts» → «N черновиков в очереди»
  - myDrafts.col.reviewer: «Reviewer» → «Рецензент» (RU only)
  - notifications chip labels: 'submit/approved/rejected' → 'отправлен/
    одобрен/отклонён'
  - audit.action.* expanded к 13 entries для каждого backend action
    type, с понятными лейблами «Черновик одобрен» вместо «DRAFT_APPROVE»

- **WhatsNewModal markdown** (UX-006): тексты вроде «**График доставки
  webhook'ов**» рендерились с буквальными звёздочками. Mini inline renderer
  для **bold**, *italic*, `code` — без full markdown library.
This commit is contained in:
Zimin A.N.
2026-05-15 22:02:29 +03:00
parent e3c827752e
commit ff7e72e0fd
8 changed files with 201 additions and 28 deletions
@@ -1,6 +1,7 @@
package cloud.nstart.terravault.ordinis.restapi.web;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.info.BuildProperties;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
@@ -9,6 +10,8 @@ import org.springframework.web.bind.annotation.RestController;
import java.time.Instant;
import java.util.Optional;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* {@code GET /api/v1/version} — экспонирует server build identity для UI
@@ -39,29 +42,73 @@ import java.util.Optional;
public class VersionController {
private final Optional<BuildProperties> buildProps;
private final String imageTagEnv;
/**
* Image tag from helm-time env (`ORDINIS_BUILD_IMAGE_TAG`). Format: docker
* tag like `v2-31-2-e3c82775`. Maven build runs на main commit (без git tag),
* поэтому build-info build.tag всегда empty — в k8s deploy реальный tag
* приходит только из helm chart, не из jar metadata.
*
* <p>Empty default → fallback на BuildProperties.tag (тоже empty в проде,
* но valid в локальном dev если кто-то билдит на git tag).
*/
// BuildProperties может отсутствовать в dev — оптимально через Optional.
public VersionController(@Autowired(required = false) BuildProperties buildProps) {
public VersionController(
@Autowired(required = false) BuildProperties buildProps,
@Value("${ordinis.build.image-tag:}") String imageTagEnv) {
this.buildProps = Optional.ofNullable(buildProps);
this.imageTagEnv = imageTagEnv == null ? "" : imageTagEnv;
}
@GetMapping(produces = MediaType.APPLICATION_JSON_VALUE)
public VersionInfo current() {
String resolvedTag = resolveTag();
return buildProps.map(b -> new VersionInfo(
b.getVersion(),
Optional.ofNullable(b.get("commit")).orElse("unknown"),
Optional.ofNullable(b.get("branch")).orElse(""),
Optional.ofNullable(b.get("tag")).orElse(""),
resolvedTag,
b.getTime() != null ? b.getTime().toString() : ""
)).orElseGet(() -> new VersionInfo(
"0.0.0-dev",
"unknown",
"",
"",
resolvedTag,
Instant.now().toString()
));
}
/**
* Resolve human-readable semver tag из docker image tag.
*
* <p>Helm passes ROW image.tag like {@code v2-31-2-e3c82775}. Frontend
* хочет {@code v2.31.2}. Strips trailing {@code -{8-12 hex}} commit suffix
* и заменяет dashes между digits на dots.
*
* <p>Examples:
* <ul>
* <li>{@code v2-31-2-e3c82775} → {@code v2.31.2}</li>
* <li>{@code v2-31-2} → {@code v2.31.2}</li>
* <li>{@code latest} → {@code latest} (passes через без транформации)</li>
* <li>{@code main-abc1234} → {@code main} (branch tag, strips sha)</li>
* <li>empty/null → BuildProperties fallback → empty</li>
* </ul>
*/
private static final Pattern SHA_SUFFIX = Pattern.compile("-[0-9a-f]{7,12}$");
String resolveTag() {
String raw = imageTagEnv;
if (raw == null || raw.isBlank() || raw.equals("latest")) {
return buildProps.map(b -> Optional.ofNullable(b.get("tag")).orElse("")).orElse("");
}
// Strip trailing -{sha} commit suffix
Matcher m = SHA_SUFFIX.matcher(raw);
String stripped = m.find() ? raw.substring(0, m.start()) : raw;
// Convert v2-31-2 → v2.31.2 (only between digits to preserve branch names)
return stripped.replaceAll("(?<=\\d)-(?=\\d)", ".");
}
/**
* Stable JSON shape для UI client.
*