160 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			160 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
|  | package entities | |||
|  | 
 | |||
|  | import ( | |||
|  | 	"encoding/json" | |||
|  | 	"time" | |||
|  | 
 | |||
|  | 	"github.com/google/uuid" | |||
|  | 	"gorm.io/gorm" | |||
|  | ) | |||
|  | 
 | |||
|  | // ProductApiConfig 产品API配置实体 | |||
|  | type ProductApiConfig struct { | |||
|  | 	ID        string `gorm:"primaryKey;type:varchar(36)" comment:"配置ID"` | |||
|  | 	ProductID string `gorm:"type:varchar(36);not null;uniqueIndex" comment:"产品ID"` | |||
|  | 
 | |||
|  | 	// 请求参数配置 | |||
|  | 	RequestParams string `gorm:"type:json;not null" comment:"请求参数配置JSON"` | |||
|  | 
 | |||
|  | 	// 响应字段配置 | |||
|  | 	ResponseFields string `gorm:"type:json;not null" comment:"响应字段配置JSON"` | |||
|  | 
 | |||
|  | 	// 响应示例 | |||
|  | 	ResponseExample string `gorm:"type:json;not null" comment:"响应示例JSON"` | |||
|  | 
 | |||
|  | 	// 关联关系 | |||
|  | 	Product *Product `gorm:"foreignKey:ProductID" comment:"产品"` | |||
|  | 
 | |||
|  | 	CreatedAt time.Time      `gorm:"autoCreateTime" comment:"创建时间"` | |||
|  | 	UpdatedAt time.Time      `gorm:"autoUpdateTime" comment:"更新时间"` | |||
|  | 	DeletedAt gorm.DeletedAt `gorm:"index" comment:"软删除时间"` | |||
|  | } | |||
|  | 
 | |||
|  | // RequestParam 请求参数结构 | |||
|  | type RequestParam struct { | |||
|  | 	Name        string `json:"name" comment:"参数名称"` | |||
|  | 	Field       string `json:"field" comment:"参数字段名"` | |||
|  | 	Type        string `json:"type" comment:"参数类型"` | |||
|  | 	Required    bool   `json:"required" comment:"是否必填"` | |||
|  | 	Description string `json:"description" comment:"参数描述"` | |||
|  | 	Example     string `json:"example" comment:"参数示例"` | |||
|  | 	Validation  string `json:"validation" comment:"验证规则"` | |||
|  | } | |||
|  | 
 | |||
|  | // ResponseField 响应字段结构 | |||
|  | type ResponseField struct { | |||
|  | 	Name        string `json:"name" comment:"字段名称"` | |||
|  | 	Path        string `json:"path" comment:"字段路径"` | |||
|  | 	Type        string `json:"type" comment:"字段类型"` | |||
|  | 	Description string `json:"description" comment:"字段描述"` | |||
|  | 	Required    bool   `json:"required" comment:"是否必填"` | |||
|  | 	Example     string `json:"example" comment:"字段示例"` | |||
|  | } | |||
|  | 
 | |||
|  | // BeforeCreate GORM钩子:创建前自动生成UUID | |||
|  | func (pac *ProductApiConfig) BeforeCreate(tx *gorm.DB) error { | |||
|  | 	if pac.ID == "" { | |||
|  | 		pac.ID = uuid.New().String() | |||
|  | 	} | |||
|  | 	return nil | |||
|  | } | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | // Validate 验证产品API配置 | |||
|  | func (pac *ProductApiConfig) Validate() error { | |||
|  | 	if pac.ProductID == "" { | |||
|  | 		return NewValidationError("产品ID不能为空") | |||
|  | 	} | |||
|  | 	if pac.RequestParams == "" { | |||
|  | 		return NewValidationError("请求参数配置不能为空") | |||
|  | 	} | |||
|  | 	if pac.ResponseFields == "" { | |||
|  | 		return NewValidationError("响应字段配置不能为空") | |||
|  | 	} | |||
|  | 	if pac.ResponseExample == "" { | |||
|  | 		return NewValidationError("响应示例不能为空") | |||
|  | 	} | |||
|  | 	return nil | |||
|  | } | |||
|  | 
 | |||
|  | // NewValidationError 创建验证错误 | |||
|  | func NewValidationError(message string) error { | |||
|  | 	return &ValidationError{Message: message} | |||
|  | } | |||
|  | 
 | |||
|  | // ValidationError 验证错误 | |||
|  | type ValidationError struct { | |||
|  | 	Message string | |||
|  | } | |||
|  | 
 | |||
|  | func (e *ValidationError) Error() string { | |||
|  | 	return e.Message | |||
|  | } | |||
|  | 
 | |||
|  | // GetRequestParams 获取请求参数列表 | |||
|  | func (pac *ProductApiConfig) GetRequestParams() ([]RequestParam, error) { | |||
|  | 	var params []RequestParam | |||
|  | 	if pac.RequestParams != "" { | |||
|  | 		err := json.Unmarshal([]byte(pac.RequestParams), ¶ms) | |||
|  | 		if err != nil { | |||
|  | 			return nil, err | |||
|  | 		} | |||
|  | 	} | |||
|  | 	return params, nil | |||
|  | } | |||
|  | 
 | |||
|  | // SetRequestParams 设置请求参数列表 | |||
|  | func (pac *ProductApiConfig) SetRequestParams(params []RequestParam) error { | |||
|  | 	data, err := json.Marshal(params) | |||
|  | 	if err != nil { | |||
|  | 		return err | |||
|  | 	} | |||
|  | 	pac.RequestParams = string(data) | |||
|  | 	return nil | |||
|  | } | |||
|  | 
 | |||
|  | // GetResponseFields 获取响应字段列表 | |||
|  | func (pac *ProductApiConfig) GetResponseFields() ([]ResponseField, error) { | |||
|  | 	var fields []ResponseField | |||
|  | 	if pac.ResponseFields != "" { | |||
|  | 		err := json.Unmarshal([]byte(pac.ResponseFields), &fields) | |||
|  | 		if err != nil { | |||
|  | 			return nil, err | |||
|  | 		} | |||
|  | 	} | |||
|  | 	return fields, nil | |||
|  | } | |||
|  | 
 | |||
|  | // SetResponseFields 设置响应字段列表 | |||
|  | func (pac *ProductApiConfig) SetResponseFields(fields []ResponseField) error { | |||
|  | 	data, err := json.Marshal(fields) | |||
|  | 	if err != nil { | |||
|  | 		return err | |||
|  | 	} | |||
|  | 	pac.ResponseFields = string(data) | |||
|  | 	return nil | |||
|  | } | |||
|  | 
 | |||
|  | // GetResponseExample 获取响应示例 | |||
|  | func (pac *ProductApiConfig) GetResponseExample() (map[string]interface{}, error) { | |||
|  | 	var example map[string]interface{} | |||
|  | 	if pac.ResponseExample != "" { | |||
|  | 		err := json.Unmarshal([]byte(pac.ResponseExample), &example) | |||
|  | 		if err != nil { | |||
|  | 			return nil, err | |||
|  | 		} | |||
|  | 	} | |||
|  | 	return example, nil | |||
|  | } | |||
|  | 
 | |||
|  | // SetResponseExample 设置响应示例 | |||
|  | func (pac *ProductApiConfig) SetResponseExample(example map[string]interface{}) error { | |||
|  | 	data, err := json.Marshal(example) | |||
|  | 	if err != nil { | |||
|  | 		return err | |||
|  | 	} | |||
|  | 	pac.ResponseExample = string(data) | |||
|  | 	return nil | |||
|  | } |