информация о пользователе

This commit is contained in:
Artem Tsyrulnikov
2026-01-07 12:22:56 +03:00
parent 5b46737536
commit 3e1ad27c66
17 changed files with 139 additions and 229 deletions

View File

@@ -7,3 +7,5 @@ class UserOutput(pydantic.BaseModel):
id: uuid.UUID id: uuid.UUID
telegram_id: int telegram_id: int
username: str | None username: str | None
first_name: str | None
last_name: str | None

View File

@@ -17,4 +17,6 @@ async def get_me(self: 'Usecase', user_id: uuid.UUID) -> dto.UserOutput:
id=user.id, id=user.id,
telegram_id=user.telegram_id, telegram_id=user.telegram_id,
username=user.username, username=user.username,
first_name=user.first_name,
last_name=user.last_name,
) )

View File

@@ -68,6 +68,49 @@ func NewBot(
return bot return bot
} }
// GetOrCreateJWT получает JWT токен, передавая актуальные данные пользователя из update
func (b *Bot) GetOrCreateJWT(u *echotron.Update) error {
// Извлекаем данные пользователя из update
var user *echotron.User
if u.Message != nil && u.Message.From != nil {
user = u.Message.From
} else if u.CallbackQuery != nil && u.CallbackQuery.From != nil {
user = u.CallbackQuery.From
}
var username, firstName, lastName *string
if user != nil {
if user.Username != "" {
username = &user.Username
}
if user.FirstName != "" {
firstName = &user.FirstName
}
if user.LastName != "" {
lastName = &user.LastName
}
}
// Запрашиваем JWT с актуальными данными пользователя (или создаем нового если не существует)
jwt, err := b.Backend.GetJWTByTelegramUser(
context.Background(),
b.ChatID,
username,
firstName,
lastName,
)
if err != nil {
return err
}
// Сохраняем в сессию
b.Session.JWT = jwt
if username != nil {
b.Session.UserName = *username
}
return nil
}
func (b *Bot) SetState(s State, mode RenderMode) { func (b *Bot) SetState(s State, mode RenderMode) {
log.Info(). log.Info().
Int64("chat_id", b.ChatID). Int64("chat_id", b.ChatID).
@@ -265,6 +308,12 @@ func (b *Bot) Update(u *echotron.Update) {
return return
} }
// Получаем или создаем JWT, обновляя данные пользователя (username, first_name, last_name)
if err := b.GetOrCreateJWT(u); err != nil {
log.Error().Err(err).Msg("Failed to get or create JWT")
// Не блокируем работу бота если JWT не удалось получить - это не критично для всех действий
}
exec := &Exec{} exec := &Exec{}
b.exec = exec b.exec = exec

View File

@@ -38,8 +38,18 @@ func main() {
log.Info().Msg("bot starting...") log.Info().Msg("bot starting...")
updateOpts := echotron.UpdateOptions{
AllowedUpdates: []echotron.UpdateType{
echotron.MessageUpdate,
echotron.CallbackQueryUpdate,
echotron.MyChatMemberUpdate,
echotron.ChatMemberUpdate,
echotron.UpdateType("chat_join_request"),
},
}
for { for {
if err := dsp.Poll(); err != nil { if err := dsp.PollOptions(false, updateOpts); err != nil {
log.Error().Err(err).Msg("dsp.Poll failed, retrying in 5 seconds...") log.Error().Err(err).Msg("dsp.Poll failed, retrying in 5 seconds...")
time.Sleep(5 * time.Second) time.Sleep(5 * time.Second)
continue continue

View File

@@ -579,14 +579,15 @@ func (s *AddCreative) sendCreativeAndPanel(b *bot.Bot) {
} }
func (s *AddCreative) createCreative(b *bot.Bot) { func (s *AddCreative) createCreative(b *bot.Bot) {
// Получаем JWT // JWT уже создан в Bot.Update(), просто берем из сессии
jwt, err := s.ensureJWT(b) jwt := b.Session.JWT
if err != nil { if jwt == "" {
log.Error().Err(err).Msg("Failed to get JWT") log.Error().Msg("JWT is empty in session")
b.SendNew("<b>❌ Ошибка авторизации</b>\n\nПопробуйте /start login", bot.Keyboard()) b.SendNew("<b>❌ Ошибка авторизации</b>\n\nПопробуйте /start login", bot.Keyboard())
return return
} }
var err error
var mediaData []byte var mediaData []byte
if s.MediaFileID != "" { if s.MediaFileID != "" {
mediaData, err = b.DownloadFileBytes(s.MediaFileID) mediaData, err = b.DownloadFileBytes(s.MediaFileID)
@@ -685,20 +686,3 @@ https://t.me/+AbCdEfGhIjKlMn</i>`
b.SetState(s.BackState, bot.NewMessage) b.SetState(s.BackState, bot.NewMessage)
} }
} }
func (s *AddCreative) ensureJWT(b *bot.Bot) (string, error) {
// Проверяем, есть ли JWT в сессии
if b.Session.JWT != "" {
return b.Session.JWT, nil
}
// Если нет, запрашиваем новый
jwt, err := b.Backend.GetJWTByTelegramID(context.Background(), b.ChatID)
if err != nil {
return "", err
}
// Сохраняем в сессию
b.Session.JWT = jwt
return jwt, nil
}

View File

@@ -28,9 +28,10 @@ type AddPurchase struct {
} }
func (s *AddPurchase) Enter(b *bot.Bot, mode bot.RenderMode) { func (s *AddPurchase) Enter(b *bot.Bot, mode bot.RenderMode) {
jwt, err := s.ensureJWT(b) // JWT уже создан в Bot.Update(), просто берем из сессии
if err != nil { jwt := b.Session.JWT
log.Error().Err(err).Msg("Failed to get JWT") if jwt == "" {
log.Error().Msg("JWT is empty in session")
b.SendNew("❌ Ошибка авторизации. Попробуйте /start", bot.Keyboard()) b.SendNew("❌ Ошибка авторизации. Попробуйте /start", bot.Keyboard())
return return
} }
@@ -203,20 +204,6 @@ func (s *AddPurchase) renderSelection(b *bot.Bot, mode bot.RenderMode, jwt strin
b.Render(text, keyboard, mode) b.Render(text, keyboard, mode)
} }
func (s *AddPurchase) ensureJWT(b *bot.Bot) (string, error) {
if b.Session.JWT != "" {
return b.Session.JWT, nil
}
jwt, err := b.Backend.GetJWTByTelegramID(context.Background(), b.ChatID)
if err != nil {
return "", err
}
b.Session.JWT = jwt
return jwt, nil
}
func (s *AddPurchase) HandleCallback(b *bot.Bot, u *echotron.Update) { func (s *AddPurchase) HandleCallback(b *bot.Bot, u *echotron.Update) {
if u.CallbackQuery == nil || u.CallbackQuery.Data == "" { if u.CallbackQuery == nil || u.CallbackQuery.Data == "" {
return return

View File

@@ -24,10 +24,10 @@ type CreativeDetails struct {
} }
func (s *CreativeDetails) Enter(b *bot.Bot, mode bot.RenderMode) { func (s *CreativeDetails) Enter(b *bot.Bot, mode bot.RenderMode) {
// Получаем JWT // JWT уже создан в Bot.Update(), просто берем из сессии
jwt, err := s.ensureJWT(b) jwt := b.Session.JWT
if err != nil { if jwt == "" {
log.Error().Err(err).Msg("Failed to get JWT") log.Error().Msg("JWT is empty in session")
b.SendNew("<b>❌ Ошибка авторизации</b>\n\nПопробуйте /start", bot.Keyboard()) b.SendNew("<b>❌ Ошибка авторизации</b>\n\nПопробуйте /start", bot.Keyboard())
return return
} }
@@ -400,14 +400,16 @@ func (s *CreativeDetails) showManagementPanelWithDelete(b *bot.Bot) {
} }
func (s *CreativeDetails) updateCreative(b *bot.Bot) { func (s *CreativeDetails) updateCreative(b *bot.Bot) {
// Получаем JWT // JWT уже создан в Bot.Update(), просто берем из сессии
jwt, err := s.ensureJWT(b) jwt := b.Session.JWT
if err != nil { if jwt == "" {
log.Error().Err(err).Msg("Failed to get JWT") log.Error().Msg("JWT is empty in session")
b.SendNew("<b>❌ Ошибка авторизации</b>\n\nПопробуйте /start", bot.Keyboard()) b.SendNew("<b>❌ Ошибка авторизации</b>\n\nПопробуйте /start", bot.Keyboard())
return return
} }
var err error
// Подготавливаем данные для обновления // Подготавливаем данные для обновления
input := backend.UpdateCreativeInput{ input := backend.UpdateCreativeInput{
Name: s.Name, Name: s.Name,
@@ -471,16 +473,16 @@ func (s *CreativeDetails) updateCreative(b *bot.Bot) {
} }
func (s *CreativeDetails) deleteCreative(b *bot.Bot) { func (s *CreativeDetails) deleteCreative(b *bot.Bot) {
// Получаем JWT // JWT уже создан в Bot.Update(), просто берем из сессии
jwt, err := s.ensureJWT(b) jwt := b.Session.JWT
if err != nil { if jwt == "" {
log.Error().Err(err).Msg("Failed to get JWT") log.Error().Msg("JWT is empty in session")
b.SendNew("<b>❌ Ошибка авторизации</b>\n\nПопробуйте /start", bot.Keyboard()) b.SendNew("<b>❌ Ошибка авторизации</b>\n\nПопробуйте /start", bot.Keyboard())
return return
} }
// Отправляем запрос на удаление // Отправляем запрос на удаление
err = b.Backend.DeleteCreative( err := b.Backend.DeleteCreative(
context.Background(), context.Background(),
jwt, jwt,
s.WorkspaceID, s.WorkspaceID,
@@ -503,20 +505,3 @@ func (s *CreativeDetails) deleteCreative(b *bot.Bot) {
b.SetState(s.BackState, bot.NewMessage) b.SetState(s.BackState, bot.NewMessage)
} }
} }
func (s *CreativeDetails) ensureJWT(b *bot.Bot) (string, error) {
// Проверяем есть ли JWT в сессии
if b.Session.JWT != "" {
return b.Session.JWT, nil
}
// Если нет, запрашиваем новый
jwt, err := b.Backend.GetJWTByTelegramID(context.Background(), b.ChatID)
if err != nil {
return "", err
}
// Сохраняем в сессию
b.Session.JWT = jwt
return jwt, nil
}

View File

@@ -45,20 +45,18 @@ type CreativeEditorFields struct {
} }
const inviteLinkPlaceholder = "{{invite_link}}" const inviteLinkPlaceholder = "{{invite_link}}"
const inviteLinkPreviewURL = "https://t.me/placeholder" const inviteLinkPreviewURL = "https://t.me/J7_channel"
// GetCreativeText возвращает текст для превью креатива // GetCreativeText возвращает текст для превью креатива
func (e *CreativeEditorFields) GetCreativeText() string { func (e *CreativeEditorFields) GetCreativeText() string {
var result string var result string
if e.Text != nil && *e.Text != "" { if e.Text != nil && *e.Text != "" {
// Проверяем что текст не является "визуально пустым" HTML
// Например: "<a class=\"tg-link\"></a>" - пустая ссылка
text := strings.TrimSpace(*e.Text) text := strings.TrimSpace(*e.Text)
// Убираем пустые HTML-теги (простая проверка) // Проверяем что текст не пустой
if text == "<a class=\"tg-link\"></a>" || text == "" { if text == "" {
log.Info().Str("text", *e.Text).Msg("GetCreativeText: text is visually empty, using default") log.Info().Str("text", *e.Text).Msg("GetCreativeText: text is empty, using default")
return result + `<i>💭 Я твой креатив return result + `<i>💭 Я твой креатив
У меня пока нет текста, добавь его ниже. У меня пока нет текста, добавь его ниже.
@@ -66,8 +64,14 @@ func (e *CreativeEditorFields) GetCreativeText() string {
</i>` </i>`
} }
// Заменяем пустую ссылку <a class="tg-link"></a> на валидную preview-ссылку
text = strings.ReplaceAll(text, `<a class="tg-link"></a>`, `<a href="`+inviteLinkPreviewURL+`">👉 Подписаться</a>`)
// Также заменяем плейсхолдер {{invite_link}} на preview URL (как в кнопках)
text = strings.ReplaceAll(text, inviteLinkPlaceholder, inviteLinkPreviewURL)
log.Info().Str("text", *e.Text).Msg("GetCreativeText: returning creative text") log.Info().Str("text", *e.Text).Msg("GetCreativeText: returning creative text")
return result + *e.Text return result + text
} }
log.Info().Bool("text_is_nil", e.Text == nil).Msg("GetCreativeText: returning default text") log.Info().Bool("text_is_nil", e.Text == nil).Msg("GetCreativeText: returning default text")
return result + `<i>💭 Я твой креатив return result + `<i>💭 Я твой креатив
@@ -156,6 +160,9 @@ func (e *CreativeEditorFields) SendCreativePreview(b *bot.Bot) {
res, err := b.SendMessage(creativeText, b.ChatID, &echotron.MessageOptions{ res, err := b.SendMessage(creativeText, b.ChatID, &echotron.MessageOptions{
ReplyMarkup: keyboard, ReplyMarkup: keyboard,
ParseMode: echotron.HTML, ParseMode: echotron.HTML,
LinkPreviewOptions: echotron.LinkPreviewOptions{
IsDisabled: true,
},
}) })
if err == nil && res.Result != nil { if err == nil && res.Result != nil {
msgID = res.Result.ID msgID = res.Result.ID
@@ -169,6 +176,9 @@ func (e *CreativeEditorFields) SendCreativePreview(b *bot.Bot) {
res, err := b.SendMessage(creativeText, b.ChatID, &echotron.MessageOptions{ res, err := b.SendMessage(creativeText, b.ChatID, &echotron.MessageOptions{
ReplyMarkup: keyboard, ReplyMarkup: keyboard,
ParseMode: echotron.HTML, ParseMode: echotron.HTML,
LinkPreviewOptions: echotron.LinkPreviewOptions{
IsDisabled: true,
},
}) })
if err != nil { if err != nil {
log.Error().Err(err).Msg("Failed to send creative preview") log.Error().Err(err).Msg("Failed to send creative preview")
@@ -258,6 +268,9 @@ func (e *CreativeEditorFields) UpdateCreativePreview(b *bot.Bot) {
&echotron.MessageTextOptions{ &echotron.MessageTextOptions{
ParseMode: echotron.HTML, ParseMode: echotron.HTML,
ReplyMarkup: keyboard, ReplyMarkup: keyboard,
LinkPreviewOptions: echotron.LinkPreviewOptions{
IsDisabled: true,
},
}, },
) )
if err != nil { if err != nil {

View File

@@ -22,9 +22,10 @@ type Creatives struct {
} }
func (s *Creatives) Enter(b *bot.Bot, mode bot.RenderMode) { func (s *Creatives) Enter(b *bot.Bot, mode bot.RenderMode) {
jwt, err := s.ensureJWT(b) // JWT уже создан в Bot.Update(), просто берем из сессии
if err != nil { jwt := b.Session.JWT
log.Error().Err(err).Msg("Failed to get JWT") if jwt == "" {
log.Error().Msg("JWT is empty in session")
b.SendNew("❌ Ошибка авторизации. Попробуйте /start login", bot.Keyboard()) b.SendNew("❌ Ошибка авторизации. Попробуйте /start login", bot.Keyboard())
return return
} }
@@ -131,23 +132,6 @@ func (s *Creatives) renderCreatives(b *bot.Bot, mode bot.RenderMode, jwt string)
b.Render(text, keyboard, mode) b.Render(text, keyboard, mode)
} }
func (s *Creatives) ensureJWT(b *bot.Bot) (string, error) {
// Проверяем, есть ли JWT в сессии
if b.Session.JWT != "" {
return b.Session.JWT, nil
}
// Если нет, запрашиваем новый
jwt, err := b.Backend.GetJWTByTelegramID(context.Background(), b.ChatID)
if err != nil {
return "", err
}
// Сохраняем в сессию
b.Session.JWT = jwt
return jwt, nil
}
func (s *Creatives) HandleCallback(b *bot.Bot, u *echotron.Update) { func (s *Creatives) HandleCallback(b *bot.Bot, u *echotron.Update) {
if u.CallbackQuery == nil || u.CallbackQuery.Data == "" { if u.CallbackQuery == nil || u.CallbackQuery.Data == "" {
return return

View File

@@ -12,15 +12,15 @@ import (
type Login struct{} type Login struct{}
func (s *Login) Enter(b *bot.Bot, mode bot.RenderMode) { func (s *Login) Enter(b *bot.Bot, mode bot.RenderMode) {
telegramID := b.ChatID // JWT уже создан в Bot.Update() с актуальными данными пользователя
// Теперь создаем login token (это разовый токен для авторизации на сайте)
var username *string var username *string
// Получаем username из сессии если он там сохранен
chatInfo, err := b.GetChat(telegramID) if b.Session.UserName != "" {
if err == nil && chatInfo.Result != nil && chatInfo.Result.Username != "" { username = &b.Session.UserName
username = &chatInfo.Result.Username
} }
token, err := b.Backend.CreateLoginToken(context.Background(), telegramID, username) token, err := b.Backend.CreateLoginToken(context.Background(), b.ChatID, username)
if err != nil { if err != nil {
log.Error().Err(err).Msg("Failed to create login token") log.Error().Err(err).Msg("Failed to create login token")
b.SendMessage("❌ Произошла ошибка при создании токена входа. Попробуйте позже.", b.ChatID, nil) b.SendMessage("❌ Произошла ошибка при создании токена входа. Попробуйте позже.", b.ChatID, nil)

View File

@@ -20,10 +20,10 @@ type MyPlacements struct {
} }
func (s *MyPlacements) Enter(b *bot.Bot, mode bot.RenderMode) { func (s *MyPlacements) Enter(b *bot.Bot, mode bot.RenderMode) {
// Получаем или запрашиваем JWT // JWT уже создан в Bot.Update(), просто берем из сессии
jwt, err := s.ensureJWT(b) jwt := b.Session.JWT
if err != nil { if jwt == "" {
log.Error().Err(err).Msg("Failed to get JWT") log.Error().Msg("JWT is empty in session")
b.SendNew("❌ Ошибка авторизации. Попробуйте /start login", bot.Keyboard()) b.SendNew("❌ Ошибка авторизации. Попробуйте /start login", bot.Keyboard())
return return
} }
@@ -124,23 +124,6 @@ func (s *MyPlacements) renderPlacements(b *bot.Bot, mode bot.RenderMode, jwt str
b.Render(text, keyboard, mode) b.Render(text, keyboard, mode)
} }
func (s *MyPlacements) ensureJWT(b *bot.Bot) (string, error) {
// Проверяем, есть ли JWT в сессии
if b.Session.JWT != "" {
return b.Session.JWT, nil
}
// Если нет, запрашиваем новый
jwt, err := b.Backend.GetJWTByTelegramID(context.Background(), b.ChatID)
if err != nil {
return "", err
}
// Сохраняем в сессию
b.Session.JWT = jwt
return jwt, nil
}
func (s *MyPlacements) HandleCallback(b *bot.Bot, u *echotron.Update) { func (s *MyPlacements) HandleCallback(b *bot.Bot, u *echotron.Update) {
if u.CallbackQuery == nil || u.CallbackQuery.Data == "" { if u.CallbackQuery == nil || u.CallbackQuery.Data == "" {
return return

View File

@@ -21,10 +21,10 @@ type MyProjects struct {
} }
func (s *MyProjects) Enter(b *bot.Bot, mode bot.RenderMode) { func (s *MyProjects) Enter(b *bot.Bot, mode bot.RenderMode) {
// Получаем или запрашиваем JWT // JWT уже создан в Bot.Update(), просто берем из сессии
jwt, err := s.ensureJWT(b) jwt := b.Session.JWT
if err != nil { if jwt == "" {
log.Error().Err(err).Msg("Failed to get JWT") log.Error().Msg("JWT is empty in session")
b.SendNew("❌ Ошибка авторизации. Попробуйте /start login", bot.Keyboard()) b.SendNew("❌ Ошибка авторизации. Попробуйте /start login", bot.Keyboard())
return return
} }
@@ -167,23 +167,6 @@ func (s *MyProjects) renderProjects(b *bot.Bot, mode bot.RenderMode, jwt string)
b.Render(text, keyboard, mode) b.Render(text, keyboard, mode)
} }
func (s *MyProjects) ensureJWT(b *bot.Bot) (string, error) {
// Проверяем, есть ли JWT в сессии
if b.Session.JWT != "" {
return b.Session.JWT, nil
}
// Если нет, запрашиваем новый
jwt, err := b.Backend.GetJWTByTelegramID(context.Background(), b.ChatID)
if err != nil {
return "", err
}
// Сохраняем в сессию
b.Session.JWT = jwt
return jwt, nil
}
func (s *MyProjects) HandleCallback(b *bot.Bot, u *echotron.Update) { func (s *MyProjects) HandleCallback(b *bot.Bot, u *echotron.Update) {
if u.CallbackQuery == nil || u.CallbackQuery.Data == "" { if u.CallbackQuery == nil || u.CallbackQuery.Data == "" {
return return

View File

@@ -18,9 +18,9 @@ type PurchaseDetails struct {
} }
func (s *PurchaseDetails) Enter(b *bot.Bot, mode bot.RenderMode) { func (s *PurchaseDetails) Enter(b *bot.Bot, mode bot.RenderMode) {
jwt, err := s.ensureJWT(b) jwt := b.Session.JWT
if err != nil { if jwt == "" {
log.Error().Err(err).Msg("Failed to get JWT") log.Error().Msg("JWT is empty in session")
b.SendNew("❌ Ошибка авторизации. Попробуйте /start", bot.Keyboard()) b.SendNew("❌ Ошибка авторизации. Попробуйте /start", bot.Keyboard())
return return
} }
@@ -136,20 +136,6 @@ func (s *PurchaseDetails) renderDetails(b *bot.Bot, mode bot.RenderMode, jwt str
b.Render(text, keyboard, mode) b.Render(text, keyboard, mode)
} }
func (s *PurchaseDetails) ensureJWT(b *bot.Bot) (string, error) {
if b.Session.JWT != "" {
return b.Session.JWT, nil
}
jwt, err := b.Backend.GetJWTByTelegramID(context.Background(), b.ChatID)
if err != nil {
return "", err
}
b.Session.JWT = jwt
return jwt, nil
}
func (s *PurchaseDetails) HandleCallback(b *bot.Bot, u *echotron.Update) { func (s *PurchaseDetails) HandleCallback(b *bot.Bot, u *echotron.Update) {
if u.CallbackQuery == nil || u.CallbackQuery.Data == "" { if u.CallbackQuery == nil || u.CallbackQuery.Data == "" {
return return

View File

@@ -207,9 +207,9 @@ func (s *PurchaseOptionalDetails) HandleCallback(b *bot.Bot, u *echotron.Update)
BackState: s.BackState, BackState: s.BackState,
}, bot.EditMessage) }, bot.EditMessage)
case "next": case "next":
jwt, err := s.ensureJWT(b) jwt := b.Session.JWT
if err != nil { if jwt == "" {
log.Error().Err(err).Msg("Failed to get JWT") log.Error().Msg("JWT is empty in session")
b.SendNew("❌ Ошибка авторизации. Попробуйте /start", bot.Keyboard()) b.SendNew("❌ Ошибка авторизации. Попробуйте /start", bot.Keyboard())
return return
} }
@@ -285,20 +285,6 @@ func (s *PurchaseOptionalDetails) HandleMessage(b *bot.Bot, u *echotron.Update)
func (s *PurchaseOptionalDetails) Handle(_ *bot.Bot, _ *echotron.Update) { return } func (s *PurchaseOptionalDetails) Handle(_ *bot.Bot, _ *echotron.Update) { return }
func (s *PurchaseOptionalDetails) ensureJWT(b *bot.Bot) (string, error) {
if b.Session.JWT != "" {
return b.Session.JWT, nil
}
jwt, err := b.Backend.GetJWTByTelegramID(context.Background(), b.ChatID)
if err != nil {
return "", err
}
b.Session.JWT = jwt
return jwt, nil
}
func (s *PurchaseOptionalDetails) SetDateTimeSelection(key string, value time.Time) { func (s *PurchaseOptionalDetails) SetDateTimeSelection(key string, value time.Time) {
switch key { switch key {
case "placement_datetime": case "placement_datetime":

View File

@@ -17,9 +17,9 @@ type Purchases struct {
} }
func (s *Purchases) Enter(b *bot.Bot, mode bot.RenderMode) { func (s *Purchases) Enter(b *bot.Bot, mode bot.RenderMode) {
jwt, err := s.ensureJWT(b) jwt := b.Session.JWT
if err != nil { if jwt == "" {
log.Error().Err(err).Msg("Failed to get JWT") log.Error().Msg("JWT is empty in session")
b.SendNew("❌ Ошибка авторизации. Попробуйте /start", bot.Keyboard()) b.SendNew("❌ Ошибка авторизации. Попробуйте /start", bot.Keyboard())
return return
} }
@@ -109,20 +109,6 @@ func (s *Purchases) renderPurchases(b *bot.Bot, mode bot.RenderMode, jwt string)
b.Render(text, keyboard, mode) b.Render(text, keyboard, mode)
} }
func (s *Purchases) ensureJWT(b *bot.Bot) (string, error) {
if b.Session.JWT != "" {
return b.Session.JWT, nil
}
jwt, err := b.Backend.GetJWTByTelegramID(context.Background(), b.ChatID)
if err != nil {
return "", err
}
b.Session.JWT = jwt
return jwt, nil
}
func (s *Purchases) HandleCallback(b *bot.Bot, u *echotron.Update) { func (s *Purchases) HandleCallback(b *bot.Bot, u *echotron.Update) {
if u.CallbackQuery == nil || u.CallbackQuery.Data == "" { if u.CallbackQuery == nil || u.CallbackQuery.Data == "" {
return return

View File

@@ -130,20 +130,6 @@ func (s *SelectChannelsForPurchase) renderChannelSelection(b *bot.Bot, mode bot.
b.Render(text, keyboard, mode) b.Render(text, keyboard, mode)
} }
func (s *SelectChannelsForPurchase) ensureJWT(b *bot.Bot) (string, error) {
if b.Session.JWT != "" {
return b.Session.JWT, nil
}
jwt, err := b.Backend.GetJWTByTelegramID(context.Background(), b.ChatID)
if err != nil {
return "", err
}
b.Session.JWT = jwt
return jwt, nil
}
func (s *SelectChannelsForPurchase) HandleCallback(b *bot.Bot, u *echotron.Update) { func (s *SelectChannelsForPurchase) HandleCallback(b *bot.Bot, u *echotron.Update) {
if u.CallbackQuery == nil || u.CallbackQuery.Data == "" { if u.CallbackQuery == nil || u.CallbackQuery.Data == "" {
return return

View File

@@ -16,9 +16,10 @@ type SelectWorkspace struct {
} }
func (s *SelectWorkspace) Enter(b *bot.Bot, mode bot.RenderMode) { func (s *SelectWorkspace) Enter(b *bot.Bot, mode bot.RenderMode) {
jwt, err := s.ensureJWT(b) // JWT уже создан в Bot.Update(), просто берем из сессии
if err != nil { jwt := b.Session.JWT
log.Error().Err(err).Msg("Failed to get JWT") if jwt == "" {
log.Error().Msg("JWT is empty in session")
b.SendNew("❌ Ошибка авторизации. Попробуйте /start", bot.Keyboard()) b.SendNew("❌ Ошибка авторизации. Попробуйте /start", bot.Keyboard())
return return
} }
@@ -56,23 +57,6 @@ func (s *SelectWorkspace) Enter(b *bot.Bot, mode bot.RenderMode) {
b.Render(text, keyboard, mode) b.Render(text, keyboard, mode)
} }
func (s *SelectWorkspace) ensureJWT(b *bot.Bot) (string, error) {
// Проверяем, есть ли JWT в сессии
if b.Session.JWT != "" {
return b.Session.JWT, nil
}
// Если нет, запрашиваем новый
jwt, err := b.Backend.GetJWTByTelegramID(context.Background(), b.ChatID)
if err != nil {
return "", err
}
// Сохраняем в сессию
b.Session.JWT = jwt
return jwt, nil
}
func (s *SelectWorkspace) HandleCallback(b *bot.Bot, u *echotron.Update) { func (s *SelectWorkspace) HandleCallback(b *bot.Bot, u *echotron.Update) {
if u.CallbackQuery == nil || u.CallbackQuery.Data == "" { if u.CallbackQuery == nil || u.CallbackQuery.Data == "" {
return return