2025-03-09 16:24:14 +08:00
|
|
|
package api
|
|
|
|
|
|
|
|
import (
|
|
|
|
restfulspec "github.com/emicklei/go-restful-openapi/v2"
|
|
|
|
"github.com/emicklei/go-restful/v3"
|
|
|
|
"github.com/gin-gonic/gin/binding"
|
2025-03-16 09:44:04 +08:00
|
|
|
"github.com/gorilla/websocket"
|
2025-03-09 16:24:14 +08:00
|
|
|
"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"
|
|
|
|
"gitlab.com/go-course-project/go17/devcloud-mini/cmdb/apps/secret"
|
|
|
|
)
|
|
|
|
|
|
|
|
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).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).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("")))
|
2025-03-16 09:44:04 +08:00
|
|
|
|
|
|
|
// :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("")))
|
2025-03-09 16:24:14 +08:00
|
|
|
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)
|
|
|
|
}
|
2025-03-16 09:44:04 +08:00
|
|
|
|
|
|
|
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
|
|
|
|
}
|
|
|
|
}
|