feat(profile): carry linked identities in the profile (email, telegram, vk)

Add email / telegram_linked / vk_linked to the Profile (fbs table + regenerated
Go/TS bindings, gateway ProfileResp + encodeProfile, backend DTO, UI model +
decode). They are filled outside the pure projection — Server.profileResponse now
reads the account's identities (like the banner seam) — and will drive the profile's
Add / Unlink / change-email controls.
This commit is contained in:
Ilia Denisov
2026-07-03 09:17:17 +02:00
parent 76e7916ff6
commit 3a823ca7ef
10 changed files with 130 additions and 2 deletions
+5
View File
@@ -37,6 +37,11 @@ type ProfileResp struct {
// Banner is the advertising-banner block, present only for a viewer eligible to
// see the banner. The gateway forwards it verbatim into the Profile payload.
Banner *BannerResp `json:"banner,omitempty"`
// Email is the confirmed email ("" when none); TelegramLinked/VkLinked report an
// attached platform identity — they drive the profile's link/unlink/change controls.
Email string `json:"email"`
TelegramLinked bool `json:"telegram_linked"`
VkLinked bool `json:"vk_linked"`
}
// BannerResp is the advertising-banner block of an eligible viewer's profile: the
+4
View File
@@ -76,6 +76,7 @@ func encodeProfile(p backendclient.ProfileResp) []byte {
tz := b.CreateString(p.TimeZone)
awayStart := b.CreateString(p.AwayStart)
awayEnd := b.CreateString(p.AwayEnd)
email := b.CreateString(p.Email)
// Build the banner table (and its children) before opening Profile: FlatBuffers
// forbids a nested table while another is under construction.
var banner flatbuffers.UOffsetT
@@ -96,6 +97,9 @@ func encodeProfile(p backendclient.ProfileResp) []byte {
fb.ProfileAddAwayEnd(b, awayEnd)
fb.ProfileAddNotificationsInAppOnly(b, p.NotificationsInAppOnly)
fb.ProfileAddVariantPreferences(b, prefs)
fb.ProfileAddEmail(b, email)
fb.ProfileAddTelegramLinked(b, p.TelegramLinked)
fb.ProfileAddVkLinked(b, p.VkLinked)
if p.Banner != nil {
fb.ProfileAddBanner(b, banner)
}