Add customer feedback statistics endpoint and refactor feedback handling

This commit is contained in:
Mazyar
2026-05-31 03:32:07 +03:30
parent bca94cd69a
commit 2977f470ac
5 changed files with 214 additions and 65 deletions
+50 -7
View File
@@ -14,8 +14,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)
}
@@ -38,7 +40,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{
@@ -51,9 +53,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
}
@@ -66,10 +69,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
@@ -97,7 +100,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
@@ -177,6 +180,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 ""
@@ -346,3 +365,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
}