Аватары: общий компонент, кэш txId и avatar.ar в графе связей

This commit is contained in:
AidarKC
2026-04-26 02:27:41 +03:00
parent 667c5310bf
commit 4c1aeeeac8
13 changed files with 392 additions and 103 deletions
@@ -21,8 +21,11 @@ import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.regex.Pattern;
public class Net_GetUserConnectionsGraph_Handler implements JsonMessageHandler {
private static final Pattern AR_TX_ID_PATTERN = Pattern.compile("^[A-Za-z0-9_-]{43}$");
@Override
public Net_Response handle(Net_Request baseRequest, ConnectionContext ctx) throws Exception {
Net_GetUserConnectionsGraph_Request req = (Net_GetUserConnectionsGraph_Request) baseRequest;
@@ -139,11 +142,12 @@ public class Net_GetUserConnectionsGraph_Handler implements JsonMessageHandler {
su.login AS login,
MAX(CASE WHEN up.param = 'gender' THEN up.value END) AS gender_value,
MAX(CASE WHEN up.param = 'official' THEN up.value END) AS official_value,
MAX(CASE WHEN up.param = 'shine' THEN up.value END) AS shine_value
MAX(CASE WHEN up.param = 'shine' THEN up.value END) AS shine_value,
MAX(CASE WHEN up.param = 'ava' THEN up.value END) AS avatar_value
FROM solana_users su
LEFT JOIN users_params up
ON up.login = su.login COLLATE NOCASE
AND up.param IN ('gender', 'official', 'shine')
AND up.param IN ('gender', 'official', 'shine', 'ava')
WHERE su.login COLLATE NOCASE IN (%s)
GROUP BY su.login
ORDER BY su.login
@@ -163,6 +167,7 @@ public class Net_GetUserConnectionsGraph_Handler implements JsonMessageHandler {
meta.gender = normalizeGender(rs.getString("gender_value"));
meta.official = parseToggle(rs.getString("official_value"));
meta.shine = parseToggle(rs.getString("shine_value"));
meta.avatarAr = extractArAvatarTxId(rs.getString("avatar_value"));
out.put(normKey(login), meta);
}
}
@@ -188,6 +193,22 @@ public class Net_GetUserConnectionsGraph_Handler implements JsonMessageHandler {
return "не указан";
}
private String extractArAvatarTxId(String rawValue) {
String value = String.valueOf(rawValue == null ? "" : rawValue).trim();
if (!value.startsWith("AR:")) return null;
String txId = value.substring(3).trim();
if (!AR_TX_ID_PATTERN.matcher(txId).matches()) return null;
return txId;
}
private Net_GetUserConnectionsGraph_Response.AvatarItem makeAvatarItem(String avatarAr) {
String txId = String.valueOf(avatarAr == null ? "" : avatarAr).trim();
if (txId.isEmpty()) return null;
Net_GetUserConnectionsGraph_Response.AvatarItem avatar = new Net_GetUserConnectionsGraph_Response.AvatarItem();
avatar.setAr(txId);
return avatar;
}
private List<Net_GetUserConnectionsGraph_Response.RelativeItem> toRelativeItems(
List<String> logins,
Map<String, UserMeta> metaByLogin
@@ -204,6 +225,7 @@ public class Net_GetUserConnectionsGraph_Handler implements JsonMessageHandler {
it.setLogin(clean);
it.setGender(gender);
it.setGenderLabel(genderLabel(gender));
it.setAvatar(makeAvatarItem(meta == null ? null : meta.avatarAr));
items.add(it);
}
return items;
@@ -230,6 +252,7 @@ public class Net_GetUserConnectionsGraph_Handler implements JsonMessageHandler {
it.setShine(shine);
it.setOfficialLabel(official ? "официальный" : "неофициальный");
it.setShineLabel(shine ? "сияющий" : "несияющий");
it.setAvatar(makeAvatarItem(meta == null ? null : meta.avatarAr));
items.add(it);
}
return items;
@@ -239,5 +262,6 @@ public class Net_GetUserConnectionsGraph_Handler implements JsonMessageHandler {
private String gender = "unknown";
private boolean official = false;
private boolean shine = false;
private String avatarAr = null;
}
}
@@ -24,10 +24,18 @@ public class Net_GetUserConnectionsGraph_Response extends Net_Response {
private List<RelativeItem> siblings = new ArrayList<>();
private List<UserMarkItem> allUsers = new ArrayList<>();
public static class AvatarItem {
private String ar;
public String getAr() { return ar; }
public void setAr(String ar) { this.ar = ar; }
}
public static class RelativeItem {
private String login;
private String gender;
private String genderLabel;
private AvatarItem avatar;
public String getLogin() { return login; }
public void setLogin(String login) { this.login = login; }
@@ -35,6 +43,8 @@ public class Net_GetUserConnectionsGraph_Response extends Net_Response {
public void setGender(String gender) { this.gender = gender; }
public String getGenderLabel() { return genderLabel; }
public void setGenderLabel(String genderLabel) { this.genderLabel = genderLabel; }
public AvatarItem getAvatar() { return avatar; }
public void setAvatar(AvatarItem avatar) { this.avatar = avatar; }
}
public static class UserMarkItem {
@@ -43,6 +53,7 @@ public class Net_GetUserConnectionsGraph_Response extends Net_Response {
private boolean shine;
private String officialLabel;
private String shineLabel;
private AvatarItem avatar;
public String getLogin() { return login; }
public void setLogin(String login) { this.login = login; }
@@ -54,6 +65,8 @@ public class Net_GetUserConnectionsGraph_Response extends Net_Response {
public void setOfficialLabel(String officialLabel) { this.officialLabel = officialLabel; }
public String getShineLabel() { return shineLabel; }
public void setShineLabel(String shineLabel) { this.shineLabel = shineLabel; }
public AvatarItem getAvatar() { return avatar; }
public void setAvatar(AvatarItem avatar) { this.avatar = avatar; }
}
public String getLogin() { return login; }