package com.ftptool.sync.service; import com.ftptool.sync.model.PackageManifest; import com.ftptool.sync.model.SyncDirection; import org.springframework.stereotype.Service; import java.time.OffsetDateTime; import java.util.UUID; @Service public class SyncMetadataService { public String newTraceId() { return UUID.randomUUID().toString().replace("-", ""); } public PackageManifest createManifest( String traceId, SyncDirection direction, String sourceEnv, String sourceVersion, String contentHash ) { PackageManifest manifest = new PackageManifest(); manifest.setTraceId(traceId); manifest.setDirection(direction); manifest.setSourceEnv(sourceEnv); manifest.setSourceVersion(sourceVersion); manifest.setContentHash(contentHash); manifest.setCreatedAt(OffsetDateTime.now().toString()); manifest.setPackageName(buildPackageFileName(direction, sourceVersion, traceId)); return manifest; } public String buildPackageFileName(SyncDirection direction, String sourceVersion, String traceId) { return direction.name().toLowerCase() + "-" + sanitize(sourceVersion) + "-" + sanitize(traceId) + ".zip"; } private String sanitize(String value) { if (value == null || value.trim().isEmpty()) { return "unknown"; } return value.replaceAll("[^a-zA-Z0-9._-]", "_"); } }