Сессии работают пользователи добавляются. Плюс сделал автоматические тесты как положенно
This commit is contained in:
AidarKC 2025-12-23 13:51:20 +03:00
parent ae63a653c8
commit c515d5287e
6 changed files with 598 additions and 528 deletions

View File

@ -66,6 +66,32 @@ public final class SolanaUsersDAO {
} }
} }
// -------------------- EXISTS --------------------
/** Проверка существования по login (case-insensitive) с внешним соединением. Соединение НЕ закрывает. */
public boolean existsByLogin(Connection c, String login) throws SQLException {
String sql = """
SELECT 1
FROM solana_users
WHERE LOWER(login) = LOWER(?)
LIMIT 1
""";
try (PreparedStatement ps = c.prepareStatement(sql)) {
ps.setString(1, login);
try (ResultSet rs = ps.executeQuery()) {
return rs.next();
}
}
}
/** Проверка существования по login (case-insensitive) без внешнего соединения. Сам открывает/закрывает. */
public boolean existsByLogin(String login) throws SQLException {
try (Connection c = db.getConnection()) {
return existsByLogin(c, login);
}
}
// -------------------- SELECT -------------------- // -------------------- SELECT --------------------
/** Получить по login (case-insensitive) с внешним соединением. Соединение НЕ закрывает. */ /** Получить по login (case-insensitive) с внешним соединением. Соединение НЕ закрывает. */

View File

@ -45,6 +45,18 @@ public class Net_AddUser_Handler implements JsonMessageHandler {
try { try {
SolanaUsersDAO dao = SolanaUsersDAO.getInstance(); SolanaUsersDAO dao = SolanaUsersDAO.getInstance();
// Новая логика: если пользователь уже есть возвращаем понятную ошибку
SolanaUserEntry exists = dao.getByLogin(req.getLogin());
if (exists != null) {
log.info("⚠️ AddUser: user already exists, login={}", req.getLogin());
return NetExceptionResponseFactory.error(
req,
409, // CONFLICT
"USER_ALREADY_EXISTS",
"Пользователь с таким login уже существует в системе"
);
}
SolanaUserEntry user = new SolanaUserEntry( SolanaUserEntry user = new SolanaUserEntry(
req.getLogin(), req.getLogin(),
req.getBlockchainName(), req.getBlockchainName(),

File diff suppressed because it is too large Load Diff

View File

@ -13,19 +13,30 @@ public class AddUserIT {
try (WsTestClient client = new WsTestClient(TestConfig.WS_URI)) { try (WsTestClient client = new WsTestClient(TestConfig.WS_URI)) {
String reqId = "it-adduser-1"; String reqId = "it-adduser-1";
String resp = client.request(reqId, JsonBuilders.addUser(reqId), Duration.ofSeconds(5)); String reqJson = JsonBuilders.addUser(reqId);
TestLog.section("AddUserIT: AddUser");
TestLog.req("AddUser requestId=" + reqId, reqJson);
String resp = client.request(reqId, reqJson, Duration.ofSeconds(5));
TestLog.resp("AddUser responseId=" + reqId, resp);
int st = JsonParsers.status(resp); int st = JsonParsers.status(resp);
// ВАЖНО: тут подставь свой реальный код "уже существует", если он не 200.
// Я оставляю пример: 409.
boolean created = (st == 200); boolean created = (st == 200);
boolean already = (st == 409); boolean already = (st == 409);
if (already) {
String code = JsonParsers.errorCode(resp);
// если сервер кладет code в payload.code парсер должен это поддерживать (см. ниже)
assertEquals("USER_ALREADY_EXISTS", code,
"Expected errorCode=USER_ALREADY_EXISTS, but got: " + code + ", resp=" + resp);
}
if (created) { if (created) {
System.out.println("✅ AddUser: создан/добавлен (status=200)"); System.out.println("✅ AddUser: создан/добавлен (status=200)");
} else if (already) { } else if (already) {
System.out.println("✅ AddUser: возможно уже есть в базе (status=409)"); System.out.println("✅ AddUser: уже есть в системе (status=409, USER_ALREADY_EXISTS)");
} else { } else {
fail("❌ AddUser: неожиданный status=" + st + ", resp=" + resp); fail("❌ AddUser: неожиданный status=" + st + ", resp=" + resp);
} }

View File

@ -79,4 +79,25 @@ public final class JsonParsers {
} catch (Exception ignored) {} } catch (Exception ignored) {}
return res; return res;
} }
public static String errorCode(String json) {
try {
JsonNode root = MAPPER.readTree(json);
// поддержка старого формата (верхний уровень)
if (root.has("errorCode")) return root.get("errorCode").asText();
// поддержка нового формата (верхний уровень)
if (root.has("code")) return root.get("code").asText();
JsonNode payload = root.get("payload");
if (payload != null) {
// поддержка старого формата (внутри payload)
if (payload.has("errorCode")) return payload.get("errorCode").asText();
// поддержка нового формата (внутри payload)
if (payload.has("code")) return payload.get("code").asText();
}
} catch (Exception ignored) {}
return null;
}
} }