Add customer feedback statistics endpoint and refactor feedback handling
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user