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:
+50
-3
@@ -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.
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user