поменял все названия таблиц и полей в таблицах на стиль только маленькие буквы и разделение через "_"  . Все тесты проходят норм
This commit is contained in:
AidarKC
2026-01-06 01:49:26 +03:00
parent 93c007b2b9
commit 8fd7f4676b
16 changed files with 467 additions and 532 deletions
@@ -2,27 +2,23 @@ package shine.db.entities;
/**
* Модель активной сессии (таблица active_sessions).
*
* Теперь вместо loginId:
* - login TEXT NOT NULL (FK -> solana_users(login))
*/
public class ActiveSessionEntry {
private String sessionId; // TEXT base64(32 bytes)
private String login; // TEXT NOT NULL
private String sessionPwd; // TEXT
private String storagePwd; // TEXT
private long sessionCreatedAtMs; // INTEGER
private long lastAuthirificatedAtMs; // INTEGER
private String pushEndpoint; // TEXT (nullable)
private String pushP256dhKey; // TEXT (nullable)
private String pushAuthKey; // TEXT (nullable)
private String sessionId;
private String login;
private String sessionPwd;
private String storagePwd;
private long sessionCreatedAtMs;
private long lastAuthirificatedAtMs;
private String pushEndpoint;
private String pushP256dhKey;
private String pushAuthKey;
// Новые поля
private String clientIp; // IP клиента при auth/refresh
private String clientInfoFromClient; // строка от клиента (PWA)
private String clientInfoFromRequest; // строка, собранная на сервере
private String userLanguage; // prefer-language (например, "ru-RU")
private String clientIp;
private String clientInfoFromClient;
private String clientInfoFromRequest;
private String userLanguage;
public ActiveSessionEntry() {
}
@@ -2,41 +2,28 @@ package shine.db.entities;
/**
* Запись блока (таблица blocks).
*
* Теперь:
* - login TEXT NOT NULL
* - bchName TEXT NOT NULL (идёт сразу после login)
* - to_login TEXT nullable
* - toBchName TEXT nullable
* - toBlockGlobalNumber INTEGER nullable
* - toBlockHashe TEXT nullable
*
* ДОБАВЛЕНО:
* - msgSubType INTEGER (uint16 по смыслу, храним как int)
*
* PRIMARY KEY пока убран вообще.
*/
public class BlockEntry {
private String login; // TEXT
private String bchName; // TEXT
private String login;
private String bchName;
private int blockGlobalNumber; // int32
private String blockGlobalPreHashe; // TEXT
private int blockGlobalNumber;
private String blockGlobalPreHashe;
private int blockLineIndex; // int16 (храним как int)
private int blockLineNumber; // int32
private String blockLinePreHashe; // TEXT
private int blockLineIndex;
private int blockLineNumber;
private String blockLinePreHashe;
private int msgType; // int16 (храним как int)
private int msgSubType; // int16 (храним как int)
private int msgType;
private int msgSubType;
private byte[] blockByte; // BLOB
private byte[] blockByte;
private String toLogin; // TEXT nullable
private String toBchName; // TEXT nullable
private Integer toBlockGlobalNumber; // INTEGER nullable
private String toBlockHashe; // TEXT nullable
private String toLogin;
private String toBchName;
private Integer toBlockGlobalNumber;
private String toBlockHashe;
public BlockEntry() {}
@@ -5,29 +5,22 @@ import java.util.Base64;
/**
* Агрегатная сущность текущего состояния блокчейна.
* 1 строка = 1 blockchainName, плюс состояние линий 0..7.
* 1 строка = 1 blockchain_name, плюс состояние линий 0..7.
*/
public final class BlockchainStateEntry {
private String blockchainName;
private String login;
/** Ключ блокчейна (pubkey), которым подписываются блоки. Base64(32 bytes). */
private String blockchainKey;
/** Лимит (теперь long). */
private long sizeLimit;
/** Размер файла блокчейна в байтах (то, что будем сверять/чинить при старте). */
private long fileSizeBytes;
private int lastGlobalNumber;
private String lastGlobalHash; // HEX(64) либо пустая строка для "нулевого"
private String lastGlobalHash;
/** line 0..7 */
private final int[] lastLineNumbers = new int[8];
/** line 0..7 */
private final String[] lastLineHashes = new String[8];
private long updatedAtMs;
@@ -78,7 +71,6 @@ public final class BlockchainStateEntry {
public String getBlockchainKey() { return blockchainKey; }
public void setBlockchainKey(String blockchainKey) { this.blockchainKey = blockchainKey; }
/** blockchainKey в байтах (32) или null, если битый. */
public byte[] getBlockchainKeyBytes() {
if (blockchainKey == null) return null;
String s = blockchainKey.trim();
@@ -103,7 +95,6 @@ public final class BlockchainStateEntry {
public String getLastGlobalHash() { return lastGlobalHash; }
public void setLastGlobalHash(String lastGlobalHash) { this.lastGlobalHash = lastGlobalHash == null ? "" : lastGlobalHash; }
/** line in [0..7] */
public int getLastLineNumber(int line) {
checkLine(line);
return lastLineNumbers[line];
@@ -113,7 +104,6 @@ public final class BlockchainStateEntry {
lastLineNumbers[line] = value;
}
/** line in [0..7] */
public String getLastLineHash(int line) {
checkLine(line);
return lastLineHashes[line];
@@ -2,11 +2,6 @@ package shine.db.entities;
/**
* Запись в таблице ip_geo_cache.
*
* Храним:
* - ip — строка IP-адреса (PRIMARY KEY)
* - geo — строка "Country, City" или любое текстовое описание
* - updatedAtMs — время последнего обновления (Unix time в мс)
*/
public class IpGeoCacheEntry {
@@ -8,35 +8,15 @@ import java.util.Base64;
* Таблица: solana_users
*
* Поля:
* - login — PRIMARY KEY (TEXT)
* Уникальный логин пользователя.
*
* - deviceKey — TEXT NOT NULL
* Публичный ключ устройства.
* Поддерживаемые форматы:
* • Base64 (32 байта)
* • HEX (64 hex-символа)
*
* - solanaKey — TEXT NULLABLE
* Публичный ключ Solana-аккаунта пользователя (если используется).
*
* Назначение:
* - хранение минимальной локальной информации о пользователе
* - используется для:
* • проверки подписи запросов
* • привязки пользователя к блокчейну
* • сопоставления login ↔ ключи
*
* ВАЖНО:
* - deviceKey обязателен всегда
* - solanaKey может отсутствовать (null)
* - login — PRIMARY KEY (TEXT)
* - device_key — TEXT NOT NULL
* - solana_key — TEXT NULLABLE
*/
public class SolanaUserEntry {
private String login; // TEXT PK
private String deviceKey; // TEXT NOT NULL (Base64(32 bytes))
private String solanaKey; // TEXT
private String login;
private String deviceKey;
private String solanaKey;
public SolanaUserEntry() {}
@@ -54,32 +34,22 @@ public class SolanaUserEntry {
public String getLogin() { return login; }
public void setLogin(String login) { this.login = login; }
/** Публичный ключ устройства (device key). */
public String getDeviceKey() { return deviceKey; }
public void setDeviceKey(String deviceKey) { this.deviceKey = deviceKey; }
public String getSolanaKey() { return solanaKey; }
public void setSolanaKey(String solanaKey) { this.solanaKey = solanaKey; }
/**
* Device key в байтах (32 байта) или null, если ключ битый/пустой.
*
* Поддержка форматов:
* - Base64 (предпочтительно)
* - HEX (ровно 64 hex-символа, без пробелов)
*/
public byte[] getDeviceKeyByte() {
if (deviceKey == null) return null;
String s = deviceKey.trim();
if (s.isEmpty()) return null;
// 1) пробуем Base64
try {
byte[] b = Base64.getDecoder().decode(s);
if (b != null && b.length == 32) return b;
} catch (IllegalArgumentException ignore) {}
// 2) пробуем HEX (64 символа)
if (s.length() == 64 && s.matches("^[0-9a-fA-F]+$")) {
byte[] out = new byte[32];
for (int i = 0; i < 32; i++) {
@@ -10,12 +10,6 @@ package shine.db.entities;
* - value TEXT NOT NULL
* - device_key TEXT NULL
* - signature TEXT NULL
*
* UNIQUE(login, param)
*
* Смысл:
* - в таблице всегда хранится "последнее" значение параметра по времени.
* - time_ms монотонно растёт для каждого (login,param) — сервер не принимает более старые обновления.
*/
public class UserParamEntry {
@@ -24,8 +18,8 @@ public class UserParamEntry {
private long timeMs;
private String value;
private String deviceKey; // base64(32) — можно хранить как "каким ключом подписано"
private String signature; // base64(64)
private String deviceKey;
private String signature;
public UserParamEntry() {}