package apiserver import ( "fmt" "net/http" "github.com/gin-gonic/gin" grpcv1 "minerva.bing89.com/gateway/pkg/grpc/v1" "minerva.bing89.com/gateway/pkg/minerva" ) //响应数据结构 type ResponseMessage struct { Code int `json:"code"` Message string `json:"message"` Data interface{} `json:"data"` } //APIServer 提供api接口 type APIServer struct { // minervas minerva.Minervas grpcv1.Server } func NewAPIServer(svr grpcv1.Server)*APIServer{ return &APIServer{ Server: svr, } } //Ajax式响应 func (a *APIServer)response(c *gin.Context,code int, m string, v interface{}){ c.JSON(http.StatusOK, ResponseMessage{Code: code, Message: m, Data: v}) } //成功,返回数据 func (a *APIServer)success(c *gin.Context, v interface{}){ a.response(c, 0, "success", v) } //失败,返回错误 func (a *APIServer)error(c *gin.Context, e error){ a.response(c, 1000, e.Error(), nil) } //功能正在开发中 func (a *APIServer)functionInDeving(c *gin.Context){ a.error(c, fmt.Errorf("功能正在开发中")) } // 列出当前已注册的Minervas // @router [GET] /minervas // @example /api/v1/minervas func (a *APIServer)ListMinervas(c *gin.Context){ minervas, err := a.Minervas.List() if err != nil { a.error(c, err) return } a.success(c, minervas) } // 查看指定的Minerva信息 // @router [GET] /minervas/:name // @example /api/v1/minervas/aaa func (a *APIServer)GetMinerva(c *gin.Context){ name := c.Param("name") m, err := a.Minervas.Get(name) if err != nil { a.error(c, err) return } a.success(c, m) } // 注册一个Minerva // @router [POST] /minervas // @example /api/v1/minervas // {} // func (a *APIServer)CreateMinerva(c *gin.Context){ a.functionInDeving(c) } // 更新一个Minerva // @router [PUT] /minervas/:name // @example /api/v1/minervas/aaa // {} // func (a *APIServer)UpdateMinerva(c *gin.Context){ a.functionInDeving(c) } // 删除一个Minerva // @router [DELETE] /minervas/:name // @example /api/v1/minervas/aaa // {} // func (a *APIServer)DeleteMinerva(c *gin.Context){ a.functionInDeving(c) } // 执行minerva // @router [POST] /minervas/:name/run // @example /api/v1/minervas/aaa/run // {} // func (a *APIServer)RunMinerva(c *gin.Context){ name := c.Param("name") m, err := a.Minervas.Get(name) if err != nil { a.error(c, err) return } defer c.Request.Body.Close() data := []byte{} _, err = c.Request.Body.Read(data) if err != nil { a.error(c, err) return } clt, err := grpcv1.NewInsecureClient(m) if err != nil { a.error(c, err) return } resp, err := clt.Call(&minerva.Request{Bytes: data}) if err != nil { a.error(c, err) return } if resp.Success { a.success(c, resp.Bytes) return } a.error(c, fmt.Errorf(resp.Error)) } //初始化route表 func (a *APIServer)InitRoute(engine *gin.Engine){ apiGroup := engine.Group("/api/v1") apiGroup.GET("/minervas", a.ListMinervas) minervaGroup := apiGroup.Group("/minervas") minervaGroup.GET("/:name", a.GetMinerva) minervaGroup.POST("/:name", a.CreateMinerva) minervaGroup.PUT("/:name", a.UpdateMinerva) minervaGroup.DELETE("/:name", a.DeleteMinerva) minervaGroup.POST("/:name/run", a.RunMinerva) }