package services import ( "context" "errors" "fmt" "tyapi-server/internal/domains/product/entities" "tyapi-server/internal/domains/product/repositories" ) // ProductDocumentationService 产品文档服务 type ProductDocumentationService struct { docRepo repositories.ProductDocumentationRepository productRepo repositories.ProductRepository } // NewProductDocumentationService 创建文档服务实例 func NewProductDocumentationService( docRepo repositories.ProductDocumentationRepository, productRepo repositories.ProductRepository, ) *ProductDocumentationService { return &ProductDocumentationService{ docRepo: docRepo, productRepo: productRepo, } } // CreateDocumentation 创建文档 func (s *ProductDocumentationService) CreateDocumentation(ctx context.Context, productID string, doc *entities.ProductDocumentation) error { // 验证产品是否存在 product, err := s.productRepo.GetByID(ctx, productID) if err != nil { return fmt.Errorf("产品不存在: %w", err) } if !product.IsValid() { return errors.New("产品已禁用或删除") } // 检查是否已存在文档 existingDoc, err := s.docRepo.FindByProductID(ctx, productID) if err == nil && existingDoc != nil { return errors.New("该产品已存在文档") } // 设置产品ID doc.ProductID = productID // 验证文档完整性 if err := doc.Validate(); err != nil { return fmt.Errorf("文档验证失败: %w", err) } // 创建文档 return s.docRepo.Create(ctx, doc) } // UpdateDocumentation 更新文档 func (s *ProductDocumentationService) UpdateDocumentation(ctx context.Context, id string, requestURL, requestMethod, basicInfo, requestParams, responseFields, responseExample, errorCodes string) error { // 查找现有文档 doc, err := s.docRepo.FindByID(ctx, id) if err != nil { return fmt.Errorf("文档不存在: %w", err) } // 使用实体的更新方法 err = doc.UpdateDocumentation(requestURL, requestMethod, basicInfo, requestParams, responseFields, responseExample, errorCodes) if err != nil { return fmt.Errorf("文档更新失败: %w", err) } // 保存更新 return s.docRepo.Update(ctx, doc) } // GetDocumentation 获取文档 func (s *ProductDocumentationService) GetDocumentation(ctx context.Context, id string) (*entities.ProductDocumentation, error) { return s.docRepo.FindByID(ctx, id) } // GetDocumentationByProductID 通过产品ID获取文档 func (s *ProductDocumentationService) GetDocumentationByProductID(ctx context.Context, productID string) (*entities.ProductDocumentation, error) { return s.docRepo.FindByProductID(ctx, productID) } // DeleteDocumentation 删除文档 func (s *ProductDocumentationService) DeleteDocumentation(ctx context.Context, id string) error { _, err := s.docRepo.FindByID(ctx, id) if err != nil { return fmt.Errorf("文档不存在: %w", err) } return s.docRepo.Delete(ctx, id) } // GetDocumentationWithProduct 获取文档及其关联的产品信息 func (s *ProductDocumentationService) GetDocumentationWithProduct(ctx context.Context, id string) (*entities.ProductDocumentation, error) { doc, err := s.docRepo.FindByID(ctx, id) if err != nil { return nil, err } // 加载产品信息 product, err := s.productRepo.GetByID(ctx, doc.ProductID) if err != nil { return nil, fmt.Errorf("获取产品信息失败: %w", err) } doc.Product = &product return doc, nil } // GetDocumentationsByProductIDs 批量获取文档 func (s *ProductDocumentationService) GetDocumentationsByProductIDs(ctx context.Context, productIDs []string) ([]*entities.ProductDocumentation, error) { return s.docRepo.FindByProductIDs(ctx, productIDs) }