129 lines
4.0 KiB
Go
129 lines
4.0 KiB
Go
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)
|
||
}
|
||
|
||
// UpdateDocumentationEntity 更新文档实体(用于更新PDFFilePath等字段)
|
||
func (s *ProductDocumentationService) UpdateDocumentationEntity(ctx context.Context, doc *entities.ProductDocumentation) error {
|
||
// 验证文档是否存在
|
||
_, err := s.docRepo.FindByID(ctx, doc.ID)
|
||
if err != nil {
|
||
return fmt.Errorf("文档不存在: %w", err)
|
||
}
|
||
|
||
// 保存更新
|
||
return s.docRepo.Update(ctx, doc)
|
||
}
|