117 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			117 lines
		
	
	
		
			3.6 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) | ||
|  | } |