From de940a6e05fa24c7424fbe34021a43ce7e6cd997 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9D=D0=B0=D0=B7=D0=B0=D1=80=20=D0=93=D0=BE=D0=BB=D1=8C?= =?UTF-8?q?=D1=87=D0=B5=D0=BD=D0=BA=D0=BE?= Date: Fri, 17 Oct 2025 16:38:48 +0300 Subject: [PATCH] feat: Added logic for work with support API and removed mocks. --- .../handlers/profile/universalTextHandler.go | 20 +++- internal/infrastructure/grpcClient/client.go | 101 +++++------------- 2 files changed, 42 insertions(+), 79 deletions(-) diff --git a/internal/infrastructure/botService/handlers/profile/universalTextHandler.go b/internal/infrastructure/botService/handlers/profile/universalTextHandler.go index b7be3e1..343e0f0 100644 --- a/internal/infrastructure/botService/handlers/profile/universalTextHandler.go +++ b/internal/infrastructure/botService/handlers/profile/universalTextHandler.go @@ -3,7 +3,6 @@ package profileHandler import ( "fmt" "runtime/debug" - "strings" "gitea.cybertalant.ru/VisionCareerMiniapp/MiniappGoService/internal/application/constants" "gitea.cybertalant.ru/VisionCareerMiniapp/MiniappGoService/internal/application/types" @@ -210,11 +209,22 @@ func (t *handler) universalTextHandler(ctx tele.Context) error { } else if len(vacancies) == 0 { return ctx.Send(constants.NoVacanciesBotMessage) } - needUpdateUser = false - // Set menu - mainKeys = &tele.ReplyMarkup{RemoveKeyboard: true} - msg = strings.Join(vacancies, "\n") + for _, vacancy := range vacancies { + _, err = t.bot.Send( + &tele.Chat{ID: user.ID}, + vacancy, + &tele.SendOptions{ + ParseMode: tele.ModeHTML, + }, + ) + + if err != nil { + t.logger.Error(fmt.Sprintf("%v: %v", op, err.Error())) + } + } + + return nil } else { needUpdateUser = false msg = constants.UnknownCommandBotMessage diff --git a/internal/infrastructure/grpcClient/client.go b/internal/infrastructure/grpcClient/client.go index e456a6c..056b3bd 100644 --- a/internal/infrastructure/grpcClient/client.go +++ b/internal/infrastructure/grpcClient/client.go @@ -4,102 +4,55 @@ import ( "context" pbVC "gitea.cybertalant.ru/VisionCareerMiniapp/DataManagement/pb/golang" + "gitea.cybertalant.ru/VisionCareerMiniapp/MiniappGoService/internal/application/constants" "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" + "google.golang.org/grpc/metadata" ) type grpcClient struct { - apiKey string - // conn *grpc.ClientConn - // vсClient pbVC.VisionCareerApiServiceV1Client + apiKey string + conn *grpc.ClientConn + vсClient pbVC.VisionCareerApiServiceV1Client } func (t *grpcClient) Close() error { - // return t.conn.Close() - return nil + return t.conn.Close() } func (t *grpcClient) GetUserVacancies(ctx context.Context, in *pbVC.GetUserVacanciesRequest, opts ...grpc.CallOption) (*pbVC.GetUserVacanciesResponse, error) { - // // Append api key to Meta-data - // md := metadata.Pairs(constants.APIKey.String(), t.apiKey) - // ctx = metadata.NewOutgoingContext(ctx, md) + // Append api key to Meta-data + md := metadata.Pairs(constants.APIKey.String(), t.apiKey) + ctx = metadata.NewOutgoingContext(ctx, md) - // return t.vсClient.GetUserVacancies(ctx, in, opts...) - return &pbVC.GetUserVacanciesResponse{ - Status: "success", - Items: []string{ - "THIS IS MOCKS", - ` - ЗП: до 500 000 рублей net - Penetration Tester – Red Team, Wildberries & Russ 💜 - Уровень: Middle/Senior - Формат: удаленка или гибрид - 📭 Вместе с масштабным развитием IT направления Wildberries и Russ развивает информационную безопасность. Мы решаем сложные и разнообразные задачи: от повышения защищенности каждого сервиса до развития безопасности в рамках всей нашей инфраструктуры. Сейчас мы в поиске опытного Penetration Tester в Red Team. Команда занимается проведением аудитов безопасности инфраструктуры, продуктов и сервисов в различных форматах (тестирования на проникновение, анализ защищенности, кибер-учения). - - 📝 Ключевые задачи: - • Проведение аудитов в формате тестирования на проникновение (внешняя и внутренняя инфраструктура, социалка) - - • Проведение аудитов в формате анализа защищенности (веб и мобильные приложения) - • Проведение аудитов в формате Red/Purple Teaming - • Поиск и эксплуатация уязвимостей веб и мобильных приложений - • Поиск и эксплуатация уязвимостей и недостатков конфигурации ОС Linux а также специфичных для нее сервисов - • Поиск и эксплуатация уязвимостей OC Windows и недостатков конфигурации Active Directory - • Поиск и эксплуатация уязвимостей и недостатков конфигурации СУБД, систем виртуализации и контейнеризации - • Оформление найденных уязвимостей для отчетов по итогам проектов - 💫 Основные требования: - • Опыт проведения проектов по анализу защищенности веб и мобильных приложений - - • Опыт проведения проектов по тестированию на проникновение (внешняя и внутренняя инфраструктура) - • Опыт поиска и эксплуатации уязвимостей веб и мобильных приложений - • Опыт поиска и эксплуатации уязвимостей ОС Linux - • Опыт поиска и эксплуатации уязвимостей OC Windows и недостатков конфигурации AD - • Опыт поиска и эксплуатации уязвимостей и недостатков конфигурации систем виртуализации и контейнеризации - • Знание любого языка программирования на уровне достаточном для понимания/создания эксплойтов и автоматизации задач по поиску уязвимостей - ❤️ Будет плюсом: - • Образование (бакалавр, магистр) в одном из технических вузов РФ (МИФИ, МГТУ им. Баумана, МГУ) - - • Наличие профильных сертификатов (OSCP, OSWE, OSEP, CRTO) - • Выступления на крупных конференциях и митапах, например PHDays, OffZone, Standoff и других - • Участие в CTF и Bug Bounty - 🔥 Что мы предлагаем: - - • Полная удаленка или гибрид с офисами в Москве и Санкт-Петербурге - • IT-ипотека и оформление в аккредитованную IT-компанию - • Бесплатное питание в офисах, ДМС со стоматологией (после испытательного срока) - • Корпоративное обучение и IT-мероприятия - - 💘 Контакты: @alina_velbik - `, - }, - }, nil + return t.vсClient.GetUserVacancies(ctx, in, opts...) } func (t *grpcClient) UpsertUserData(ctx context.Context, in *pbVC.UpsertUserDataRequest, opts ...grpc.CallOption) (*pbVC.UpsertUserDataResponse, error) { - // // Append api key to Meta-data - // md := metadata.Pairs(constants.APIKey.String(), t.apiKey) - // ctx = metadata.NewOutgoingContext(ctx, md) + // Append api key to Meta-data + md := metadata.Pairs(constants.APIKey.String(), t.apiKey) + ctx = metadata.NewOutgoingContext(ctx, md) - // return t.vсClient.UpsertUserData(ctx, in, opts...) - return &pbVC.UpsertUserDataResponse{ - Status: "success", - }, nil + return t.vсClient.UpsertUserData(ctx, in, opts...) } // Init : Инициализирует общий gRPC клиент func Init(addr, apiKey string) (*grpcClient, error) { // Открытие соединения - // conn, err := grpc.Dial( - // addr, - // grpc.WithTransportCredentials(insecure.NewCredentials()), - // grpc.WithBlock(), - // ) + conn, err := grpc.Dial( + addr, + grpc.WithTransportCredentials(insecure.NewCredentials()), + grpc.WithBlock(), + ) + + if err != nil { + return nil, err + } - // if err != nil { - // return nil, err - // } // Инициализация gRPC клиентов return &grpcClient{ - apiKey: apiKey, - // conn: conn, - // vсClient: pbVC.NewVisionCareerApiServiceV1Client(conn), + apiKey: apiKey, + conn: conn, + vсClient: pbVC.NewVisionCareerApiServiceV1Client(conn), }, nil }