Merge branch 'develop' into TM-571

This commit is contained in:
Mazyar
2026-05-31 18:36:59 +03:30
17 changed files with 556 additions and 209 deletions
+50 -7
View File
@@ -15,8 +15,10 @@ type Service interface {
Search(ctx context.Context, criteria SearchForm, pagination *response.Pagination) (*FeedbackListResponse, error)
Get(ctx context.Context, id string) (*FeedbackResponse, error)
GetByTenderID(ctx context.Context, tenderID, companyID string) (*FeedbackResponse, error)
GetByTenderIDForCustomer(ctx context.Context, tenderID, customerID string) (*FeedbackResponse, error)
Delete(ctx context.Context, id string) error
CompanyStats(ctx context.Context, companyID string) (*StatsResponse, error)
CustomerStats(ctx context.Context, customerID string) (*CustomerStatsResponse, error)
getDetails(ctx context.Context, tenderID, companyID string) (*tenderResponse, *companyResponse)
}
@@ -39,7 +41,7 @@ func NewService(feedbackRepo Repository, tenderService tender.Service, companySe
}
func (s *feedbackService) Toggle(ctx context.Context, req ToggleFeedbackForm, customerID *string, companyID *string) (*FeedbackResponse, error) {
existing, err := s.feedbackRepo.GetByCompanyID(ctx, *companyID, req.Tender)
existing, err := s.feedbackRepo.GetByCustomerID(ctx, *customerID, req.Tender)
if err != nil {
feedback := &Feedback{
@@ -52,9 +54,10 @@ func (s *feedbackService) Toggle(ctx context.Context, req ToggleFeedbackForm, cu
err = s.feedbackRepo.Create(ctx, feedback)
if err != nil {
s.logger.Error("Failed to create new feedback", map[string]interface{}{
"tender_id": req.Tender,
"company_id": *companyID,
"error": err.Error(),
"tender_id": req.Tender,
"customer_id": *customerID,
"company_id": *companyID,
"error": err.Error(),
})
return nil, err
}
@@ -67,10 +70,10 @@ func (s *feedbackService) Toggle(ctx context.Context, req ToggleFeedbackForm, cu
if existing.FeedbackType == req.Type {
err = s.feedbackRepo.Delete(ctx, existing.GetID())
if err != nil {
s.logger.Error("Failed to update existing feedback", map[string]interface{}{
s.logger.Error("Failed to delete existing feedback", map[string]interface{}{
"feedback_id": existing.GetID(),
"tender_id": req.Tender,
"company_id": *companyID,
"customer_id": *customerID,
"error": err.Error(),
})
return nil, err
@@ -98,7 +101,7 @@ func (s *feedbackService) Toggle(ctx context.Context, req ToggleFeedbackForm, cu
s.logger.Error("Failed to update existing feedback", map[string]interface{}{
"feedback_id": existing.GetID(),
"tender_id": req.Tender,
"company_id": *companyID,
"customer_id": *customerID,
"error": err.Error(),
})
return nil, err
@@ -181,6 +184,22 @@ func (s *feedbackService) GetByTenderID(ctx context.Context, tenderID, companyID
return feedback.ToResponse(tender, company), nil
}
func (s *feedbackService) GetByTenderIDForCustomer(ctx context.Context, tenderID, customerID string) (*FeedbackResponse, error) {
feedback, err := s.feedbackRepo.GetByTenderIDForCustomer(ctx, tenderID, customerID)
if err != nil {
s.logger.Error("Failed to get feedback by tender ID for customer", map[string]interface{}{
"tender_id": tenderID,
"customer_id": customerID,
"error": err.Error(),
})
return nil, err
}
tender, company := s.getDetails(ctx, feedback.TenderID, feedbackCompanyID(*feedback))
return feedback.ToResponse(tender, company), nil
}
func feedbackCompanyID(f Feedback) string {
if f.CompanyID == nil {
return ""
@@ -350,3 +369,27 @@ func (s *feedbackService) CompanyStats(ctx context.Context, companyID string) (*
return stats, nil
}
func (s *feedbackService) CustomerStats(ctx context.Context, customerID string) (*CustomerStatsResponse, error) {
s.logger.Info("Getting customer feedback statistics", map[string]interface{}{
"customer_id": customerID,
})
stats, err := s.feedbackRepo.CustomerStats(ctx, customerID)
if err != nil {
s.logger.Error("Failed to get customer stats", map[string]interface{}{
"customer_id": customerID,
"error": err.Error(),
})
return nil, err
}
s.logger.Info("Customer stats retrieved successfully", map[string]interface{}{
"customer_id": customerID,
"total_feedback": stats.TotalFeedback,
"total_likes": stats.TotalLikes,
"total_dislikes": stats.TotalDislikes,
})
return stats, nil
}