on the application side, get only the tenders with deadlines that have not passed
This commit is contained in:
@@ -34,6 +34,7 @@ type SearchForm struct {
|
|||||||
Source []string `query:"source" valid:"optional"`
|
Source []string `query:"source" valid:"optional"`
|
||||||
BuyerOrganizationID *string `query:"buyer_organization_id" valid:"optional"`
|
BuyerOrganizationID *string `query:"buyer_organization_id" valid:"optional"`
|
||||||
Languages []string `query:"languages" valid:"optional"`
|
Languages []string `query:"languages" valid:"optional"`
|
||||||
|
OnlyActiveDeadlines bool `query:"-" valid:"optional"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// SearchResponse represents the response for listing tenders
|
// SearchResponse represents the response for listing tenders
|
||||||
|
|||||||
+12
-24
@@ -1,6 +1,7 @@
|
|||||||
package tender
|
package tender
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"time"
|
||||||
"tm/pkg/logger"
|
"tm/pkg/logger"
|
||||||
"tm/pkg/response"
|
"tm/pkg/response"
|
||||||
|
|
||||||
@@ -215,6 +216,7 @@ func (h *TenderHandler) GetPublicTenders(c echo.Context) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
form.Status = []string{string(TenderStatusActive)}
|
form.Status = []string{string(TenderStatusActive)}
|
||||||
|
form.OnlyActiveDeadlines = true
|
||||||
|
|
||||||
// Get company ID and customer ID from customer context for automatic matching
|
// Get company ID and customer ID from customer context for automatic matching
|
||||||
var companyID *string
|
var companyID *string
|
||||||
@@ -234,16 +236,6 @@ func (h *TenderHandler) GetPublicTenders(c echo.Context) error {
|
|||||||
return response.InternalServerError(c, "Failed to retrieve tenders")
|
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")
|
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(), "")
|
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.Status = []string{string(TenderStatusActive)}
|
||||||
|
form.OnlyActiveDeadlines = true
|
||||||
|
|
||||||
var companyID *string
|
var companyID *string
|
||||||
if customerCompanyID, ok := c.Get("company_id").(string); ok {
|
if customerCompanyID, ok := c.Get("company_id").(string); ok {
|
||||||
@@ -306,16 +294,11 @@ func (h *TenderHandler) RecommendTenders(c echo.Context) error {
|
|||||||
}
|
}
|
||||||
form.CustomerID = customerID
|
form.CustomerID = customerID
|
||||||
|
|
||||||
if result != nil {
|
result, err := h.service.Recommend(c.Request().Context(), form, response.NewPagination(c))
|
||||||
filtered := make([]TenderResponse, 0, len(result.Tenders))
|
if err != nil {
|
||||||
for _, t := range result.Tenders {
|
return response.InternalServerError(c, "Failed to retrieve 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")
|
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")
|
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")
|
return response.Success(c, tender, "Tender details retrieved successfully")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -526,8 +526,11 @@ func (r *tenderRepository) buildSearchFilter(form *SearchForm) bson.M {
|
|||||||
filter["currency"] = form.Currency
|
filter["currency"] = form.Currency
|
||||||
}
|
}
|
||||||
|
|
||||||
if form.DeadlineFrom != nil || form.DeadlineTo != nil {
|
if form.DeadlineFrom != nil || form.DeadlineTo != nil || form.OnlyActiveDeadlines {
|
||||||
deadlineFilter := bson.M{}
|
deadlineFilter := bson.M{}
|
||||||
|
if form.OnlyActiveDeadlines {
|
||||||
|
deadlineFilter["$gt"] = time.Now().Unix()
|
||||||
|
}
|
||||||
if form.DeadlineFrom != nil {
|
if form.DeadlineFrom != nil {
|
||||||
deadlineFilter["$gte"] = *form.DeadlineFrom
|
deadlineFilter["$gte"] = *form.DeadlineFrom
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -305,13 +305,12 @@ func (s *tenderService) Recommend(ctx context.Context, form *SearchForm, paginat
|
|||||||
if form.CompanyID != nil && *form.CompanyID != "" {
|
if form.CompanyID != nil && *form.CompanyID != "" {
|
||||||
company, err := s.companyService.GetByID(ctx, *form.CompanyID)
|
company, err := s.companyService.GetByID(ctx, *form.CompanyID)
|
||||||
if err != nil {
|
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,
|
"company_id": form.CompanyID,
|
||||||
"error": err.Error(),
|
"error": err.Error(),
|
||||||
})
|
})
|
||||||
return nil, fmt.Errorf("failed to get company: %w", err)
|
// Continue without CPV-based filtering instead of failing
|
||||||
}
|
} else if company.Tags != nil && len(company.Tags.CPVCodes) > 0 {
|
||||||
if company.Tags != nil && len(company.Tags.CPVCodes) > 0 {
|
|
||||||
form.Classifications = company.Tags.CPVCodes
|
form.Classifications = company.Tags.CPVCodes
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user