Update Configuration and Enhance Tender Approval Pagination

- Changed the server port from 8081 to 8082 for the web application.
- Updated MongoDB URI to include authentication credentials for improved security.
- Added new query parameters `limit` and `offset` for pagination in tender approval retrieval, enhancing the API's flexibility.
- Modified the response structure to include metadata for pagination, improving the clarity of responses.
- Updated API documentation to reflect the new pagination parameters and response format, ensuring consistency for API consumers.
This commit is contained in:
n.nakhostin
2025-09-06 12:07:32 +03:30
parent 61a217cf09
commit eb69a842f0
10 changed files with 171 additions and 52 deletions
+32 -17
View File
@@ -3,9 +3,11 @@ package tender_approval
import (
"context"
"errors"
"math"
"time"
"tm/internal/tender"
"tm/pkg/logger"
"tm/pkg/response"
)
// Service defines business logic for tender approval operations
@@ -17,8 +19,8 @@ type Service interface {
GetTenderApprovalByTenderAndCompany(ctx context.Context, tenderID, companyID string) (*TenderApproval, error)
GetTenderApprovalByTenderAndCompanyWithTender(ctx context.Context, tenderID, companyID string) (*TenderApprovalWithTenderResponse, error)
GetTenderApprovalsByTenderID(ctx context.Context, tenderID string) ([]*TenderApproval, error)
GetTenderApprovalsByCompanyID(ctx context.Context, companyID string, submissionMode *SubmissionMode, status *ApprovalStatus, from *int64, to *int64) ([]*TenderApproval, error)
GetTenderApprovalsByCompanyIDWithTender(ctx context.Context, companyID string, submissionMode *SubmissionMode, status *ApprovalStatus, from *int64, to *int64) ([]*TenderApprovalWithTenderResponse, error)
GetTenderApprovalsByCompanyID(ctx context.Context, companyID string, submissionMode *SubmissionMode, status *ApprovalStatus, from *int64, to *int64, limit int, offset int) ([]*TenderApproval, int64, error)
GetTenderApprovalsByCompanyIDWithTender(ctx context.Context, companyID string, submissionMode *SubmissionMode, status *ApprovalStatus, from *int64, to *int64, limit int, offset int) (*TenderApprovalWithTenderListResponse, error)
GetTenderApprovalsByIDs(ctx context.Context, ids []string) ([]*TenderApproval, error)
UpdateTenderApproval(ctx context.Context, id string, form *UpdateTenderApprovalForm) (*TenderApproval, error)
UpdateTenderApprovalWithTender(ctx context.Context, id string, form *UpdateTenderApprovalForm) (*TenderApprovalWithTenderResponse, error)
@@ -261,14 +263,14 @@ func (s *tenderApprovalService) GetTenderApprovalsByTenderID(ctx context.Context
}
// GetTenderApprovalsByCompanyID retrieves all tender approvals for a specific company with optional filters
func (s *tenderApprovalService) GetTenderApprovalsByCompanyID(ctx context.Context, companyID string, submissionMode *SubmissionMode, status *ApprovalStatus, from *int64, to *int64) ([]*TenderApproval, error) {
tenderApprovals, err := s.repository.GetByCompanyID(ctx, companyID, submissionMode, status, from, to)
func (s *tenderApprovalService) GetTenderApprovalsByCompanyID(ctx context.Context, companyID string, submissionMode *SubmissionMode, status *ApprovalStatus, from *int64, to *int64, limit int, offset int) ([]*TenderApproval, int64, error) {
tenderApprovals, total, err := s.repository.GetByCompanyID(ctx, companyID, submissionMode, status, limit, offset, from, to)
if err != nil {
s.logger.Error("Failed to get tender approvals by company ID", map[string]interface{}{
"error": err.Error(),
"company_id": companyID,
})
return nil, err
return nil, 0, err
}
s.logger.Info("Tender approvals retrieved successfully", map[string]interface{}{
@@ -276,12 +278,12 @@ func (s *tenderApprovalService) GetTenderApprovalsByCompanyID(ctx context.Contex
"count": len(tenderApprovals),
})
return tenderApprovals, nil
return tenderApprovals, total, nil
}
// GetTenderApprovalsByCompanyIDWithTender retrieves all tender approvals for a specific company with tender details
func (s *tenderApprovalService) GetTenderApprovalsByCompanyIDWithTender(ctx context.Context, companyID string, submissionMode *SubmissionMode, status *ApprovalStatus, from *int64, to *int64) ([]*TenderApprovalWithTenderResponse, error) {
tenderApprovals, err := s.repository.GetByCompanyID(ctx, companyID, submissionMode, status, from, to)
func (s *tenderApprovalService) GetTenderApprovalsByCompanyIDWithTender(ctx context.Context, companyID string, submissionMode *SubmissionMode, status *ApprovalStatus, from *int64, to *int64, limit, offset int) (*TenderApprovalWithTenderListResponse, error) {
tenderApprovals, total, err := s.repository.GetByCompanyID(ctx, companyID, submissionMode, status, limit, offset, from, to)
if err != nil {
s.logger.Error("Failed to get tender approvals by company ID", map[string]interface{}{
"error": err.Error(),
@@ -291,7 +293,10 @@ func (s *tenderApprovalService) GetTenderApprovalsByCompanyIDWithTender(ctx cont
}
// Convert to response with tender details
var responses []*TenderApprovalWithTenderResponse
responses := &TenderApprovalWithTenderListResponse{
Approvals: []*TenderApprovalWithTenderResponse{},
Metadata: &response.Meta{},
}
for _, approval := range tenderApprovals {
// Get tender details
tenderResponse, err := s.tenderService.GetTenderByID(ctx, approval.TenderID)
@@ -301,7 +306,7 @@ func (s *tenderApprovalService) GetTenderApprovalsByCompanyIDWithTender(ctx cont
"error": err.Error(),
})
// Continue without tender details rather than failing completely
responses = append(responses, approval.ToResponseWithTender(nil))
responses.Approvals = append(responses.Approvals, approval.ToResponseWithTender(nil))
continue
}
@@ -319,12 +324,20 @@ func (s *tenderApprovalService) GetTenderApprovalsByCompanyIDWithTender(ctx cont
Status: string(tenderResponse.Status),
}
responses = append(responses, approval.ToResponseWithTender(tenderDetails))
responses.Approvals = append(responses.Approvals, approval.ToResponseWithTender(tenderDetails))
}
responses.Metadata = &response.Meta{
Total: int(total),
Limit: limit,
Offset: offset,
Pages: int(math.Ceil(float64(total) / float64(limit))),
Page: int(math.Ceil(float64(offset) / float64(limit))),
}
s.logger.Info("Tender approvals with tender details retrieved successfully", map[string]interface{}{
"company_id": companyID,
"count": len(responses),
"count": len(responses.Approvals),
})
return responses, nil
@@ -960,11 +973,13 @@ func (s *tenderApprovalService) ListTenderApprovalsWithTender(ctx context.Contex
meta := &TenderApprovalListResponseWithTender{
TenderApprovals: responses,
Total: total,
Limit: limit,
Offset: offset,
Page: page,
Pages: pages,
Metadata: &response.Meta{
Total: int(total),
Limit: limit,
Offset: offset,
Page: page,
Pages: pages,
},
}
return meta, nil