Files
test_deploy/internal/http/feed.go
Alex Shevchuk d84487d238 1
2025-08-18 17:12:04 +03:00

475 lines
14 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package http_router
import (
"context"
"encoding/json"
"fmt"
"log/slog"
"git-molva.ru/Molva/molva-backend/services/api_gateway/internal/feed"
"git-molva.ru/Molva/molva-backend/services/api_gateway/internal/types"
pbfAgent "github.com/AlexOreL-272/ProtoMolva/go/gen/agent"
pbfDistr "github.com/AlexOreL-272/ProtoMolva/go/gen/distributor"
"google.golang.org/protobuf/encoding/protojson"
"google.golang.org/protobuf/proto"
)
//nolint:unused // TODO: review feed handlers
func (h *handler) createCreateCompanyFeedEvent(ctx context.Context, uid string, isAgent bool, resp []byte, handlerName string) {
var (
jsonResp interface{}
companyID string
companyName string
)
if isAgent {
jsonResp = new(pbfAgent.SetCompanyDataResponse)
} else {
jsonResp = new(pbfDistr.SetCompanyDataResponse)
}
ownerType := feed.RoleDistributor
if isAgent {
ownerType = feed.RoleAgent
}
if err := json.Unmarshal(resp, jsonResp); err != nil {
h.logger.Error(fmt.Sprintf("failed to unmarshal %s SetCompanyDataResponse", ownerType),
slog.String("error", err.Error()),
slog.String("handler", handlerName),
)
return
}
switch resp := jsonResp.(type) {
case *pbfAgent.SetCompanyDataResponse:
company := resp.GetCompany()
companyID = company.GetCompanyId()
companyName = company.GetName()
case *pbfDistr.SetCompanyDataResponse:
company := resp.GetCompany()
companyID = company.GetCompanyId()
companyName = company.GetName()
default:
h.logger.Error("unexpected response type",
slog.String("handler", handlerName))
return
}
event := feed.Event{
OwnerId: uid,
OwnerType: ownerType,
EventType: feed.EventCompanyCreated,
Message: fmt.Sprintf("Компания %s создана", companyName),
Visibility: feed.VisibilityCompanyWide,
CompanyID: &companyID,
Payload: feed.EventPayload{
AttachmentId: companyID,
AttachmentType: feed.AttachmentTypeCompany,
},
}
if err := h.feed.CreateEvent(ctx, &event); err != nil {
h.logger.Error("failed to create feed event",
slog.String("uid", uid),
slog.String("error", err.Error()),
slog.String("handler", handlerName),
slog.String("company_id", companyID),
slog.String("company_id", companyID),
)
}
}
//nolint:unused // TODO: review feed handlers
func (h *handler) createAddNewStaffMemberFeedEvent(ctx context.Context, uid string, isAgent bool, newStaffMember, companyId, handlerName string) {
ownerType := feed.RoleDistributor
if isAgent {
ownerType = feed.RoleAgent
}
event := feed.Event{
OwnerId: uid,
OwnerType: ownerType,
EventType: feed.EventNewCompanyMember,
Message: "Новый сотрудник добавлен в компанию",
Visibility: feed.VisibilityCompanyWide,
CompanyID: &companyId,
Payload: feed.EventPayload{
AttachmentId: newStaffMember,
AttachmentType: feed.AttachmentTypeProfile,
},
}
if err := h.feed.CreateEvent(ctx, &event); err != nil {
h.logger.Error("failed to create feed event",
slog.String("uid", uid),
slog.String("error", err.Error()),
slog.String("handler", handlerName),
slog.String("company_id", companyId),
slog.String("new_staff_member", newStaffMember),
)
}
}
//nolint:unused // TODO: review feed handlers
func (h *handler) createSetSubmissionStatusFeedEvent(ctx context.Context, distributorId, submissionId string, submissionStatus types.Status, handlerName string) {
var message string
switch submissionStatus {
case types.StatusAccepted:
message = "Отклик на вакансию принят"
case types.StatusDeclined:
message = "Отклик на вакансию отклонен"
case types.StatusSuspended:
message = "Отклик на вакансию отложен"
default:
message = "Статус отклика на вакансию был изменен"
}
companyIds, err := h.feed.GetCompanyIdByUidTmp(ctx, distributorId)
if err != nil {
h.logger.Error("failed to get company Id",
slog.String("error", err.Error()),
slog.String("handler", handlerName),
slog.String("distributor_id", distributorId))
}
agentId, err := h.feed.GetAgentIdBySubmissionId(ctx, submissionId)
if err != nil {
//я хз стоит ли отдельно как-то обрабатывать ErrorNotFound(вроде как нет)
h.logger.Error("failed to get agent Id",
slog.String("error", err.Error()),
slog.String("handler", handlerName),
slog.String("submission_id", submissionId))
}
for _, companyId := range companyIds {
event := feed.Event{
OwnerId: distributorId,
OwnerType: feed.RoleDistributor,
EventType: feed.EventSubmissionStatusChanged,
Message: message,
Visibility: feed.VisibilityCompanyWide,
CompanyID: &companyId,
Payload: feed.EventPayload{
AttachmentId: submissionId,
AttachmentType: feed.AttachmentTypeCV,
AdditionalReceiver: agentId,
CustomData: submissionStatus.String(),
},
}
if err := h.feed.CreateEvent(ctx, &event); err != nil {
h.logger.Error("failed to create feed event",
slog.String("distributor_id", distributorId),
slog.String("agent_id", agentId),
slog.String("error", err.Error()),
slog.String("handler", handlerName),
slog.String("submission_id", submissionId),
slog.String("company_id", companyId),
)
}
}
}
//nolint:unused // TODO: review feed handlers
func (h *handler) createTransactionFeedEvent(ctx context.Context, uid string, isAgent bool, amount int64, currency, bankAccountId, handlerName string) {
var message string
if amount > 0 {
message = fmt.Sprintf("Вы получили %.2f %s", float64(amount)/100, currency)
} else {
message = fmt.Sprintf("С вашего аккаунта выведено %.2f %s", float64(-amount)/100, currency)
}
ownerType := feed.RoleDistributor
if isAgent {
ownerType = feed.RoleAgent
}
event := feed.Event{
OwnerId: uid,
OwnerType: ownerType,
EventType: feed.EventTransactionCreated,
Message: message,
Visibility: feed.VisibilityPrivate,
Payload: feed.EventPayload{
AttachmentId: bankAccountId,
AttachmentType: feed.AttachmentTypeBankAccount,
},
}
if err := h.feed.CreateEvent(ctx, &event); err != nil {
h.logger.Error("failed to create feed event",
slog.String("error", err.Error()),
slog.String("uid", uid),
slog.String("handler", handlerName),
slog.String("bank_account_id", bankAccountId))
}
}
//nolint:unused // TODO: review feed handlers
func (h *handler) createCreateBankAccountFeedEvent(ctx context.Context, uid string, isAgent bool, resp []byte, bankName, handlerName string) {
var msg proto.Message
var ownerType feed.UserRole
if isAgent {
msg = &pbfAgent.CreateBankAccountResponse{}
ownerType = feed.RoleAgent
} else {
msg = &pbfDistr.CreateBankAccountResponse{}
ownerType = feed.RoleDistributor
}
if err := protojson.Unmarshal(resp, msg); err != nil {
h.logger.Error(fmt.Sprintf("failed to unmarshal %s CreateBankAccountResponse", ownerType),
slog.String("error", err.Error()),
slog.String("handler", handlerName),
)
return
}
var bankAccountId string
switch v := msg.(type) {
case *pbfAgent.CreateBankAccountResponse:
bankAccountId = v.GetBankAccountId()
case *pbfDistr.CreateBankAccountResponse:
bankAccountId = v.GetBankAccountId()
default:
h.logger.Error("unexpected response type",
slog.String("handler", handlerName),
)
return
}
event := feed.Event{
OwnerId: uid,
OwnerType: ownerType,
EventType: feed.EventBankAccountCreated,
Message: fmt.Sprintf("Банковский счёт %s создан", bankName),
Visibility: feed.VisibilityPrivate,
Payload: feed.EventPayload{
AttachmentId: bankAccountId,
AttachmentType: feed.AttachmentTypeBankAccount,
},
}
if err := h.feed.CreateEvent(ctx, &event); err != nil {
h.logger.Error("failed to create feed event",
slog.String("uid", uid),
slog.String("error", err.Error()),
slog.String("handler", handlerName),
slog.String("bank_account_id", bankAccountId),
)
}
}
func (h *handler) createEditBankAccountFeedEvent(ctx context.Context, uid string, isAgent bool, bankAccountID, handlerName string) {
ownerType := feed.RoleDistributor
if isAgent {
ownerType = feed.RoleAgent
}
event := feed.Event{
OwnerId: uid,
OwnerType: ownerType,
EventType: feed.EventBankAccountChanged,
Message: "Банковский счёт обновлён",
Visibility: feed.VisibilityPrivate,
Payload: feed.EventPayload{
AttachmentId: bankAccountID,
AttachmentType: feed.AttachmentTypeBankAccount,
},
}
if err := h.feed.CreateEvent(ctx, &event); err != nil {
h.logger.Error("failed to create feed event",
slog.String("uid", uid),
slog.String("error", err.Error()),
slog.String("handler", handlerName),
slog.String("bank_account_id", bankAccountID))
}
}
func (h *handler) createEditCompanyFeedEvent(ctx context.Context, uid string, isAgent bool, companyID, handlerName string) {
ownerType := feed.RoleDistributor
if isAgent {
ownerType = feed.RoleAgent
}
event := feed.Event{
OwnerId: uid,
OwnerType: ownerType,
EventType: feed.EventCompanyChanged,
Message: "Данные компании обновлены",
Visibility: feed.VisibilityCompanyWide,
CompanyID: &companyID,
Payload: feed.EventPayload{
AttachmentId: companyID,
AttachmentType: feed.AttachmentTypeCompany,
},
}
if err := h.feed.CreateEvent(ctx, &event); err != nil {
h.logger.Error("failed to create feed event",
slog.String("uid", uid),
slog.String("error", err.Error()),
slog.String("handler", handlerName),
slog.String("company_id", companyID))
}
}
func (h *handler) createSetProfileEvent(ctx context.Context, uid string, isAgent bool, handlerName string) {
ownerType := feed.RoleDistributor
if isAgent {
ownerType = feed.RoleAgent
}
event := feed.Event{
OwnerId: uid,
OwnerType: ownerType,
EventType: feed.EventProfileChanged,
Message: "Ваши данные профиля обновлены",
Visibility: feed.VisibilityPrivate,
Payload: feed.EventPayload{
AttachmentId: uid,
AttachmentType: feed.AttachmentTypeProfile,
},
}
if err := h.feed.CreateEvent(ctx, &event); err != nil {
h.logger.Error("failed to create feed event",
slog.String("uid", uid),
slog.String("error", err.Error()),
slog.String("handler", handlerName),
)
}
}
func (h *handler) createSetDistributorVacancyEvent(ctx context.Context, distributorId, vacancyId, vacancyName, handlerName string) {
event := feed.Event{
OwnerId: distributorId,
OwnerType: feed.RoleDistributor,
EventType: feed.EventVacancyCreated,
Message: fmt.Sprintf("Вакансия %s была создана", vacancyName),
Visibility: feed.VisibilityPublic,
Payload: feed.EventPayload{
AttachmentId: vacancyId,
AttachmentType: feed.AttachmentTypeVacancy,
},
}
if err := h.feed.CreateEvent(ctx, &event); err != nil {
h.logger.Error("failed to create feed event",
slog.String("distributor_id", distributorId),
slog.String("error", err.Error()),
slog.String("handler", handlerName),
slog.String("vacancy_id", vacancyId),
)
}
}
func (h *handler) createEditDistributorVacancyEvent(ctx context.Context, distributorId, vacancyId, handlerName string) {
event := feed.Event{
OwnerId: distributorId,
OwnerType: feed.RoleDistributor,
EventType: feed.EventVacancyChanged,
Message: "Вакансия была изменена",
Visibility: feed.VisibilityPublic,
Payload: feed.EventPayload{
AttachmentId: vacancyId,
AttachmentType: feed.AttachmentTypeVacancy,
},
}
if err := h.feed.CreateEvent(ctx, &event); err != nil {
h.logger.Error("failed to create feed event",
slog.String("distributor_id", distributorId),
slog.String("error", err.Error()),
slog.String("handler", handlerName),
slog.String("vacancy_id", vacancyId))
}
}
func (h *handler) createSendVacancyToModerationEvent(ctx context.Context, distributorId, vacancyId, handlerName string) {
companyIds, err := h.feed.GetCompanyIdByUidTmp(ctx, distributorId)
if err != nil {
h.logger.Error("failed to get company Id",
slog.String("error", err.Error()),
slog.String("handler", handlerName),
slog.String("distributor_id", distributorId))
}
for _, companyId := range companyIds {
event := feed.Event{
OwnerId: distributorId,
OwnerType: feed.RoleDistributor,
EventType: feed.EventVacancyModerationSent,
Message: "Вакансия была отправлена на модерацию",
Visibility: feed.VisibilityCompanyWide,
CompanyID: &companyId,
Payload: feed.EventPayload{
AttachmentId: vacancyId,
AttachmentType: feed.AttachmentTypeVacancy,
},
}
if err := h.feed.CreateEvent(ctx, &event); err != nil {
h.logger.Error("failed to create feed event",
slog.String("distributor_id", distributorId),
slog.String("error", err.Error()),
slog.String("handler", handlerName),
slog.String("vacancy_id", vacancyId),
slog.String("company_id", companyId),
)
}
}
}
func (h *handler) createPostAnketaEvent(ctx context.Context, agentID, submissionId, handlerName string) {
companyIds, err := h.feed.GetCompanyIdByUidTmp(ctx, agentID)
if err != nil {
h.logger.Error("failed to get company Id",
slog.String("error", err.Error()),
slog.String("handler", handlerName),
slog.String("agent_id", agentID))
}
for _, companyId := range companyIds {
event := feed.Event{
OwnerId: agentID,
OwnerType: feed.RoleAgent,
EventType: feed.EventPostAnketa,
Message: "Анкета была заполнена",
Visibility: feed.VisibilityPrivate,
CompanyID: &companyId,
Payload: feed.EventPayload{
AttachmentId: submissionId,
AttachmentType: feed.AttachmentTypeSubmission,
},
}
if err := h.feed.CreateEvent(ctx, &event); err != nil {
h.logger.Error("failed to create feed event",
slog.String("agent_id", agentID),
slog.String("error", err.Error()),
slog.String("handler", handlerName),
slog.String("submission_id", submissionId),
slog.String("company_id", companyId),
)
}
}
}