This commit is contained in:
Alex Shevchuk
2025-08-18 17:12:04 +03:00
commit d84487d238
157 changed files with 160686 additions and 0 deletions

474
internal/http/feed.go Normal file
View File

@@ -0,0 +1,474 @@
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),
)
}
}
}