syntax = "v1"

info (
	title:                  "演示 API" // 對應 swagger 的 title
	description:            "演示 api 生成 swagger 文件的 api 完整寫法" // 對應 swagger 的 description
	version:                "v1" // 對應 swagger 的 version
	termsOfService:         "https://github.com/zeromicro/go-zero" // 對應 swagger 的 termsOfService
	contactName:            "keson.an" // 對應 swagger 的 contactName
	contactURL:             "https://github.com/zeromicro/go-zero" // 對應 swagger 的 contactURL
	contactEmail:           "example@gmail.com" // 對應 swagger 的 contactEmail
	licenseName:            "MIT" // 對應 swagger 的 licenseName
	licenseURL:             "https://github.com/zeromicro/go-zero" // 對應 swagger 的 licenseURL
	consumes:               "application/json" // 對應 swagger 的 consumes，不填預設為 application/json
	produces:               "application/json" // 對應 swagger 的 produces，不填預設為 application/json
	schemes:                "http,https" // 對應 swagger 的 schemes，不填預設為 https
	host:                   "example.com" // 對應 swagger 的 host，不填預設為 127.0.0.1
	basePath:               "/v1" // 對應 swagger 的 basePath，不填預設為 /
	wrapCodeMsg:            true // 是否用 code-msg 通用回應體，如果開啟，則以格式 {"code":0,"msg":"OK","data":$data} 包括回應體
	bizCodeEnumDescription: "1001-未登入<br>1002-無權限操作" // 全域業務錯誤碼列舉描述，json 格式，key 為業務錯誤碼，value 為該錯誤碼的描述，僅當 wrapCodeMsg 為 true 時生效
	// securityDefinitionsFromJson 為自訂鑑權配置，json 內容將直接放入 swagger 的 securityDefinitions 中，
	// 格式參考 https://swagger.io/specification/v2/#security-definitions-object
	// 在 api 的 @server 中可宣告 authType 來指定其路由使用的鑑權類型
	securityDefinitionsFromJson: `{"apiKey":{"description":"apiKey 類型鑑權自訂","type":"apiKey","name":"x-api-key","in":"header"}}`
    useDefinitions: true// 開啟宣告將生成 models 進行關聯，definitions 僅對回應體和 json 請求體生效
)

type (
	QueryReq {
		Id     int    `form:"id,range=[1:10000],example=10"`
		Name   string `form:"name,example=keson.an"`
		Avatar string `form:"avatar,optional,example=https://example.com/avatar.png"`
	}
	QueryResp {
		Id   int    `json:"id,example=10"`
		Name string `json:"name,example=keson.an"`
	}
	// 錯誤響應
	ErrorResponse {
		Code    string `json:"code"`
		Message string `json:"message"`
		Details string `json:"details,omitempty"`
	}
	
	// 具體錯誤類型
	ValidationError {
		Code    string   `json:"code"`
		Message string   `json:"message"`
		Fields  []string `json:"fields"`
	}
	
	InsufficientStockError {
		Code      string `json:"code"`
		Message   string `json:"message"`
		ProductID string `json:"product_id"`
		Required  int    `json:"required"`
		Available int    `json:"available"`
	}
	
	InvalidPaymentError {
		Code    string `json:"code"`
		Message string `json:"message"`
		Method  string `json:"method"`
	}
	
	UnauthorizedError {
		Code    string `json:"code"`
		Message string `json:"message"`
		Reason  string `json:"reason"`
	}
)

@server (
	tags:    "query 演示" // 對應 swagger 的 tags，可以對 swagger 中的 api 進行分組
	summary: "query 類型介面集合" // 對應 swagger 的 summary
	prefix: v1
	authType: apiKey // 指定該路由使用的鑑權類型，值為 securityDefinitionsFromJson 中定義的名稱
	group:"demo"
)
service Swagger {
	@doc (
		description: "query 接口"
	)
	/*
    	@respdoc-201 (QueryResp) // 創建成功
    	@respdoc-400 (
        	300101: (ValidationError) 參數驗證失敗
        	300102: (InsufficientStockError) 庫存不足
        	300103: (InvalidPaymentError) 支付方式無效
    	) // 客戶端錯誤
    	@respdoc-401 (UnauthorizedError) // 未授權
    	@respdoc-500 (ErrorResponse) // 服務器錯誤
    */
	@handler query
	get /query (QueryReq) returns (QueryResp)
}
