company feedback performance update

This commit is contained in:
Mazyar
2026-05-25 11:27:55 +03:30
parent 3c86d35663
commit 51defd9438
4 changed files with 163 additions and 5 deletions
+82 -2
View File
@@ -137,10 +137,19 @@ func (s *feedbackService) Search(ctx context.Context, criteria SearchForm, pagin
meta := pagination.ListMeta(page.TotalCount, page.NextCursor, page.HasMore, page.PageOffset)
tenderByID, companyByID := s.loadListDetails(ctx, page.Items)
result := make([]*FeedbackResponse, len(page.Items))
for i, feedback := range page.Items {
tender, company := s.getDetails(ctx, feedback.TenderID, feedbackCompanyID(feedback))
result[i] = feedback.ToResponse(tender, company)
var tenderResp *tenderResponse
if t, ok := tenderByID[feedback.TenderID]; ok {
tenderResp = t
}
var companyResp *companyResponse
if cid := feedbackCompanyID(feedback); cid != "" {
companyResp = companyByID[cid]
}
result[i] = feedback.ToResponse(tenderResp, companyResp)
}
return &FeedbackListResponse{
@@ -175,6 +184,77 @@ func feedbackCompanyID(f Feedback) string {
return *f.CompanyID
}
func uniqueNonEmptyStrings(values []string) []string {
seen := make(map[string]struct{}, len(values))
out := make([]string, 0, len(values))
for _, v := range values {
if v == "" {
continue
}
if _, ok := seen[v]; ok {
continue
}
seen[v] = struct{}{}
out = append(out, v)
}
return out
}
func collectFeedbackListIDs(items []Feedback) (tenderIDs, companyIDs []string) {
tenderIDs = make([]string, 0, len(items))
companyIDs = make([]string, 0, len(items))
for _, item := range items {
tenderIDs = append(tenderIDs, item.TenderID)
companyIDs = append(companyIDs, feedbackCompanyID(item))
}
return uniqueNonEmptyStrings(tenderIDs), uniqueNonEmptyStrings(companyIDs)
}
// loadListDetails batch-loads tender and company data for feedback list responses.
func (s *feedbackService) loadListDetails(ctx context.Context, items []Feedback) (
map[string]*tenderResponse,
map[string]*companyResponse,
) {
tenderByID := make(map[string]*tenderResponse)
companyByID := make(map[string]*companyResponse)
if len(items) == 0 {
return tenderByID, companyByID
}
tenderIDs, companyIDs := collectFeedbackListIDs(items)
if len(tenderIDs) > 0 {
tenders, err := s.tenderService.GetByIDs(ctx, tenderIDs)
if err != nil {
s.logger.Error("Failed to batch load tenders for feedback list", map[string]interface{}{
"count": len(tenderIDs),
"error": err.Error(),
})
} else {
for id, t := range tenders {
tenderByID[id] = tenderToFeedbackResponse(t)
}
}
}
if len(companyIDs) > 0 {
companies, err := s.companyService.GetNamesByIDs(ctx, companyIDs)
if err != nil {
s.logger.Error("Failed to batch load companies for feedback list", map[string]interface{}{
"count": len(companyIDs),
"error": err.Error(),
})
} else {
for id, c := range companies {
companyByID[id] = companyToFeedbackResponse(c)
}
}
}
return tenderByID, companyByID
}
func tenderToFeedbackResponse(t *tender.TenderResponse) *tenderResponse {
if t == nil {
return nil