Сделал что бы в базу писался msgSubType и поля to (to login, toBlockchainName и т.д.)
This commit is contained in:
AidarKC
2026-01-02 20:15:59 +03:00
parent eef760d776
commit dd49c4de00
8 changed files with 129 additions and 22 deletions
@@ -0,0 +1,32 @@
package blockchain.body;
/**
* BodyToFields — дополнительный интерфейс для body, которые "ссылаются" на цель (to-поля).
*
* Идея:
* - Не все body имеют "to".
* - Но для индексации и удобства запросов в БД мы хотим единообразно доставать:
* toLogin, toBchName, toBlockGlobalNumber, toBlockHashe
*
* Важно:
* - Все методы могут возвращать null.
* - toLogin может отсутствовать в самом формате body (например, ReactionBody, TextBody reply/repost),
* но в БД мы пишем toLogin "про запас".
* Поэтому writer может:
* - взять toLogin из body (если есть),
* - либо попытаться вычислить из toBchName.
*/
public interface BodyHasTarget {
/** login цели (nullable). */
String toLogin();
/** blockchainName цели (nullable). */
String toBchName();
/** globalNumber цели (nullable). */
Integer toBlockGlobalNumber();
/** hash цели в HEX(64) (nullable). */
String toBlockHashe();
}
@@ -42,7 +42,7 @@ import java.util.Objects;
* ЛИНИЯ:
* - строго lineIndex=3 (выделяем отдельную линию под связи).
*/
public final class ConnectionBody implements BodyRecord {
public final class ConnectionBody implements BodyRecord, BodyHasTarget {
public static final short TYPE = 3;
public static final short VER = 1;
@@ -279,4 +279,16 @@ public final class ConnectionBody implements BodyRecord {
}
return new String(out);
}
/* ===================================================================== */
/* ====================== BodyToFields контракт ========================= */
/* ===================================================================== */
@Override public String toLogin() { return toLogin; }
@Override public String toBchName() { return toBlockchainName; }
@Override public Integer toBlockGlobalNumber() { return toBlockGlobalNumber; }
@Override public String toBlockHashe() { return toBlockHashHex(); }
}
@@ -31,7 +31,7 @@ import java.util.Objects;
* - Здесь мы НЕ проверяем, существует ли цель реакции.
* - Мы проверяем только корректность формата и целостность полей.
*/
public final class ReactionBody implements BodyRecord {
public final class ReactionBody implements BodyRecord, BodyHasTarget {
public static final short TYPE = 2;
public static final short VER = 1;
@@ -172,11 +172,11 @@ public final class ReactionBody implements BodyRecord {
hash цели (hex) : %s
}
""".formatted(
st,
toBlockchainName,
toBlockGlobalNumber,
toBlockHashHex()
);
st,
toBlockchainName,
toBlockGlobalNumber,
toBlockHashHex()
);
}
public String toBlockHashHex() {
@@ -189,4 +189,17 @@ public final class ReactionBody implements BodyRecord {
}
return new String(out);
}
/* ===================================================================== */
/* ====================== BodyToFields контракт ========================= */
/* ===================================================================== */
/** В самом формате ReactionBody login цели не хранится => null. */
@Override public String toLogin() { return null; }
@Override public String toBchName() { return toBlockchainName; }
@Override public Integer toBlockGlobalNumber() { return toBlockGlobalNumber; }
@Override public String toBlockHashe() { return toBlockHashHex(); }
}
@@ -41,7 +41,7 @@ import java.util.Objects;
* - для subType=NEW запрещены поля ссылки и запрещены любые “лишние байты” в хвосте
* - для subType=REPLY/REPOST хвост обязан быть ровно по формату и без мусора в конце
*/
public final class TextBody implements BodyRecord {
public final class TextBody implements BodyRecord, BodyHasTarget {
public static final short TYPE = 1;
public static final short VER = 1;
@@ -219,8 +219,6 @@ public final class TextBody implements BodyRecord {
@Override public short type() { return TYPE; }
@Override public short version() { return VER; }
/** ✅ ВАЖНО: теперь BodyRecord требует subType() */
@Override public short subType() { return subType; }
@Override
@@ -363,4 +361,26 @@ public final class TextBody implements BodyRecord {
}
return new String(out);
}
/* ===================================================================== */
/* ====================== BodyToFields контракт ========================= */
/* ===================================================================== */
/** В формате TextBody login цели не хранится => null. */
@Override public String toLogin() { return null; }
@Override
public String toBchName() {
return (subType == SUB_REPLY || subType == SUB_REPOST) ? toBlockchainName : null;
}
@Override
public Integer toBlockGlobalNumber() {
return (subType == SUB_REPLY || subType == SUB_REPOST) ? toBlockGlobalNumber : null;
}
@Override
public String toBlockHashe() {
return (subType == SUB_REPLY || subType == SUB_REPOST) ? toBlockHashHex() : null;
}
}