package api import ( restfulspec "github.com/emicklei/go-restful-openapi/v2" "github.com/emicklei/go-restful/v3" "github.com/gin-gonic/gin/binding" "github.com/gorilla/websocket" "github.com/infraboard/mcube/v2/exception" "github.com/infraboard/mcube/v2/http/restful/response" "github.com/infraboard/mcube/v2/ioc" "github.com/infraboard/mcube/v2/ioc/config/gorestful" "github.com/infraboard/modules/iam/apps/endpoint" "gitlab.com/go-course-project/go17/devcloud-mini/cmdb/apps/secret" audit "gitlab.com/go-course-project/go17/devcloud-mini/maudit/audit" permission "gitlab.com/go-course-project/go17/devcloud-mini/mcenter/permisson" ) func init() { ioc.Api().Registry(&SecretApiHandler{}) } type SecretApiHandler struct { ioc.ObjectImpl } func (r *SecretApiHandler) Name() string { return secret.AppName } func (r *SecretApiHandler) Init() error { // WebService ws // api/v1/resource ws := gorestful.ObjectRouter(r) tags := []string{"凭证管理"} ws.Route(ws.GET("").To(r.QuerySecret). Metadata(permission.Auth(true)). Metadata(permission.Permission(true)). Metadata(audit.Audit(true)). Metadata(endpoint.META_RESOURCE_KEY, "secret"). Metadata(endpoint.META_ACTION_KEY, "list"). Doc("凭证列表"). Param(ws.QueryParameter("page_size", "分页大小").DataType("intger")). Param(ws.QueryParameter("page_number", "页码").DataType("intger")). Param(ws.QueryParameter("keywords", "关键字过滤").DataType("string")). Metadata(restfulspec.KeyOpenAPITags, tags). Writes(SecretSet{}). Returns(200, "OK", SecretSet{}). Returns(404, "Not Found", exception.NewNotFound(""))) // :id -> {id} ws.Route(ws.GET("/{id}").To(r.DescribeSecret). Metadata(permission.Auth(true)). Metadata(permission.Permission(true)). Metadata(endpoint.META_RESOURCE_KEY, "secret"). Metadata(endpoint.META_ACTION_KEY, "get"). Doc("凭证详情"). Param(ws.PathParameter("id", "凭证Id").DataType("string")). Metadata(restfulspec.KeyOpenAPITags, tags). Writes(secret.Secret{}). Returns(200, "OK", secret.Secret{}). Returns(404, "Not Found", exception.NewNotFound(""))) // :id -> {id} // websocket api ws.Route(ws.GET("/{id}/sync").To(r.SyncResource).Doc("资源同步"). Param(ws.PathParameter("id", "凭证Id").DataType("string")). Metadata(restfulspec.KeyOpenAPITags, tags). Writes(secret.ResourceResponse{}). Returns(200, "OK", secret.ResourceResponse{}). Returns(404, "Not Found", exception.NewNotFound(""))) return nil } type SecretSet struct { Total int64 `json:"total"` Items []*secret.Secret `json:"items"` } func (r *SecretApiHandler) QuerySecret(req *restful.Request, resp *restful.Response) { sr := secret.NewQuerySecretRequest() // 获取参数, bind err := binding.Query.Bind(req.Request, sr) if err != nil { response.Failed(resp, exception.NewBadRequest(err.Error())) return } // 业务逻辑 set, err := secret.GetService().QuerySecret(req.Request.Context(), sr) if err != nil { response.Failed(resp, err) return } response.Success(resp, set) } func (r *SecretApiHandler) DescribeSecret(req *restful.Request, resp *restful.Response) { sr := secret.NewDescribeSecretRequeset(req.PathParameter("id")) // 业务逻辑 ins, err := secret.GetService().DescribeSecret(req.Request.Context(), sr) if err != nil { response.Failed(resp, err) return } response.Success(resp, ins) } var upgrader = websocket.Upgrader{} // use default options // websocket api // http 协议(短链接)--> websocket(长链接) conn.write() // websocket: https://github.com/gorilla/websocket/tree/main/examples/chat // Go Websocket Client: https://github.com/gorilla/websocket/blob/main/examples/echo/client.go // Web Browser Websocket Client: https://github.com/gorilla/websocket/blob/main/examples/chat/home.html func (r *SecretApiHandler) SyncResource(req *restful.Request, resp *restful.Response) { sr := secret.NewSyncResourceRequest(req.PathParameter("id")) // websocket upgrade conn, err := upgrader.Upgrade(resp, req.Request, nil) if err != nil { response.Failed(resp, err) return } // 业务逻辑 err = secret.GetService().SyncResource(req.Request.Context(), sr, func(rr secret.ResourceResponse) { conn.WriteJSON(rr) }) if err != nil { response.Failed(resp, err) return } }