diff --git a/internal/tender/form.go b/internal/tender/form.go index fca4f04..c0a862a 100644 --- a/internal/tender/form.go +++ b/internal/tender/form.go @@ -34,6 +34,7 @@ type SearchForm struct { Source []string `query:"source" valid:"optional"` BuyerOrganizationID *string `query:"buyer_organization_id" valid:"optional"` Languages []string `query:"languages" valid:"optional"` + OnlyActiveDeadlines bool `query:"-" valid:"optional"` } // SearchResponse represents the response for listing tenders diff --git a/internal/tender/handler.go b/internal/tender/handler.go index 74a6dde..1966088 100644 --- a/internal/tender/handler.go +++ b/internal/tender/handler.go @@ -1,6 +1,7 @@ package tender import ( + "time" "tm/pkg/logger" "tm/pkg/response" @@ -215,6 +216,7 @@ func (h *TenderHandler) GetPublicTenders(c echo.Context) error { } form.Status = []string{string(TenderStatusActive)} + form.OnlyActiveDeadlines = true // Get company ID and customer ID from customer context for automatic matching var companyID *string @@ -234,16 +236,6 @@ func (h *TenderHandler) GetPublicTenders(c echo.Context) error { return response.InternalServerError(c, "Failed to retrieve tenders") } - if result != nil { - filtered := make([]TenderResponse, 0, len(result.Tenders)) - for _, t := range result.Tenders { - if t.TenderDeadline != 0 { - filtered = append(filtered, t) - } - } - result.Tenders = filtered - result.Metadata.Total = int(len(filtered)) - } return response.SuccessWithMeta(c, result, result.Metadata, "Tenders retrieved successfully") } @@ -287,12 +279,8 @@ func (h *TenderHandler) RecommendTenders(c echo.Context) error { return response.ValidationError(c, err.Error(), "") } - result, err := h.service.Recommend(c.Request().Context(), form, response.NewPagination(c)) - if err != nil { - return response.InternalServerError(c, "Failed to retrieve tenders") - } - form.Status = []string{string(TenderStatusActive)} + form.OnlyActiveDeadlines = true var companyID *string if customerCompanyID, ok := c.Get("company_id").(string); ok { @@ -306,16 +294,11 @@ func (h *TenderHandler) RecommendTenders(c echo.Context) error { } form.CustomerID = customerID - if result != nil { - filtered := make([]TenderResponse, 0, len(result.Tenders)) - for _, t := range result.Tenders { - if t.TenderDeadline != 0 { - filtered = append(filtered, t) - } - } - result.Tenders = filtered - result.Metadata.Total = int(len(filtered)) + result, err := h.service.Recommend(c.Request().Context(), form, response.NewPagination(c)) + if err != nil { + return response.InternalServerError(c, "Failed to retrieve tenders") } + return response.SuccessWithMeta(c, result, result.Metadata, "Tenders retrieved successfully") } @@ -341,6 +324,11 @@ func (h *TenderHandler) GetPublicTenderDetails(c echo.Context) error { return response.NotFound(c, "Tender not found") } + // Only show tenders whose deadlines have not been reached + if tender.TenderDeadline > 0 && tender.TenderDeadline <= time.Now().Unix() { + return response.NotFound(c, "Tender not found") + } + return response.Success(c, tender, "Tender details retrieved successfully") } diff --git a/internal/tender/repository.go b/internal/tender/repository.go index 69b53c0..6109c0f 100644 --- a/internal/tender/repository.go +++ b/internal/tender/repository.go @@ -526,8 +526,11 @@ func (r *tenderRepository) buildSearchFilter(form *SearchForm) bson.M { filter["currency"] = form.Currency } - if form.DeadlineFrom != nil || form.DeadlineTo != nil { + if form.DeadlineFrom != nil || form.DeadlineTo != nil || form.OnlyActiveDeadlines { deadlineFilter := bson.M{} + if form.OnlyActiveDeadlines { + deadlineFilter["$gt"] = time.Now().Unix() + } if form.DeadlineFrom != nil { deadlineFilter["$gte"] = *form.DeadlineFrom } diff --git a/internal/tender/service.go b/internal/tender/service.go index 72817f4..b1302a6 100644 --- a/internal/tender/service.go +++ b/internal/tender/service.go @@ -305,13 +305,12 @@ func (s *tenderService) Recommend(ctx context.Context, form *SearchForm, paginat if form.CompanyID != nil && *form.CompanyID != "" { company, err := s.companyService.GetByID(ctx, *form.CompanyID) if err != nil { - s.logger.Error("Failed to get company", map[string]interface{}{ + s.logger.Error("Failed to get company for CPV codes, skipping CPV-based filtering", map[string]interface{}{ "company_id": form.CompanyID, "error": err.Error(), }) - return nil, fmt.Errorf("failed to get company: %w", err) - } - if company.Tags != nil && len(company.Tags.CPVCodes) > 0 { + // Continue without CPV-based filtering instead of failing + } else if company.Tags != nil && len(company.Tags.CPVCodes) > 0 { form.Classifications = company.Tags.CPVCodes } }