Commit: 9c24ca4

Commit Details

SHA9c24ca40dbca995b0007e09659176f7c90e13392
Tree4c630341b69f778f78daa19bfebcc1bfdebe1836
Author<f69e50@finnacloud.com> 1766442705 +0300
Committer<f69e50@finnacloud.com> 1766442705 +0300
Message
add CI configuration and test script for Jenkins build
GPG Signature
-----BEGIN PGP SIGNATURE-----

iQJSBAABCAA8FiEEWJb139mJI+vZ81KkoAIVSUsXI0oFAmlJxtEeHHNvcGhpYS5l
cmFzbGFuQGZpbm5hY2xvdWQuY29tAAoJEKACFUlLFyNKwOEP/RJdPEnaGlYKr4zE
NkU5vATgzcYMHxCO6p3T6JqsfHsvv2d65vedOJ8LsSHFtT9AN/yXqZKV2722R5CG
WLsPzbVYJSXexKVZ8D7Zpf+DTu+/OAlWUE+XHMm+bJYVpDmqUo0ak/qX6vz6VYtW
bSRPMtM9g8WZKZqbBxLK7Sg1IkYFsFjEWmvn6mbD9C7k/0y4Sxp6Xee26xAx1sdI
+srAjwFgF+wJw0OAQoBA2jykTOiib93n9gdc9wbgl4AYUvdcaX3Hxv8LTl3Bu88N
2rqaL+OmjXtkFkEAiBaruvZZCt+aqp14gTgOM0wcLp1I1FP7uOFNOg0F0zSUawzY
Fuw3w6CKebkpbixGfxtJqrLl1IbPAhd92TxRVerZbDEnWpXW3a9HoGWRu5KFX/ny
ww+8M53ziWFNcHqpIyI5adRjG74C+5MdvC04J0/Sh1X8mykWcjE96Wu2/iRY9XQe
07I94ZVO0RaBSjSUnIItfhAgBXi03nzx+ZPw2tM4VHosn2zZjpzT8+KNQ0EXYhuT
AzgqcOKV94ZkM+48ZePvUFXsJxhMSkpXIQxGWWBnU9gjm3QAUsuCyqZGKXgVY9Vo
mDlLBl83Nhx+/7V8AFJO2gUmaph9YB01p3SMDfE++lLqX1BwdguFVrQib30OsRnq
e86d/6MrRABKf+FjtaulHY9+e8LS
=9ZJj
-----END PGP SIGNATURE-----

✓ Verified

File: src/main/java/com/paymentlink/service/NodeIdService.java

1 package com.paymentlink.service;
2
3 import org.slf4j.Logger;
4 import org.slf4j.LoggerFactory;
5 import org.springframework.beans.factory.annotation.Value;
6 import org.springframework.stereotype.Service;
7
8 import java.io.IOException;
9 import java.nio.file.Files;
10 import java.nio.file.Path;
11 import java.nio.file.Paths;
12 import java.security.SecureRandom;
13
14 @Service
15 public class NodeIdService {
16
17 private static final Logger logger = LoggerFactory.getLogger(NodeIdService.class);
18 private static final SecureRandom RANDOM = new SecureRandom();
19 private static final String CHARACTERS = "abcdefghijklmnopqrstuvwxyz0123456789";
20
21 @Value("${app.server-id-file:incl/server-id.txt}")
22 private String serverIdFile;
23
24 @Value("${app.tld:ironpath.ai}")
25 private String tld;
26
27 private String nodeId;
28
29 /**
30 * Get or create node ID
31 */
32 public String getNodeId() {
33 if (nodeId == null) {
34 nodeId = loadOrCreateNodeId();
35 }
36 return nodeId;
37 }
38
39 /**
40 * Get short ID (without TLD)
41 */
42 public String getShortId() {
43 String fullId = getNodeId();
44 return fullId.split("\\.")[0];
45 }
46
47 private String loadOrCreateNodeId() {
48 try {
49 Path filePath = Paths.get(serverIdFile);
50
51 // Ensure parent directory exists
52 if (filePath.getParent() != null) {
53 Files.createDirectories(filePath.getParent());
54 }
55
56 // Try to read existing ID
57 if (Files.exists(filePath)) {
58 String id = Files.readString(filePath).trim();
59 if (!id.isEmpty()) {
60 logger.info("Loaded existing server ID: {}", id);
61 return id;
62 }
63 }
64
65 // Generate new ID
66 String newId = generateNodeId();
67 Files.writeString(filePath, newId);
68 logger.info("Generated new server ID: {}", newId);
69 return newId;
70
71 } catch (IOException e) {
72 logger.error("Failed to load/create server ID file", e);
73 // Generate temporary ID
74 String tempId = generateNodeId();
75 logger.warn("Using temporary server ID: {}", tempId);
76 return tempId;
77 }
78 }
79
80 private String generateNodeId() {
81 StringBuilder sb = new StringBuilder(6);
82 for (int i = 0; i < 6; i++) {
83 sb.append(CHARACTERS.charAt(RANDOM.nextInt(CHARACTERS.length())));
84 }
85 return sb.toString() + "." + tld;
86 }
87 }
88
89