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
|
||
}
|