2025-03-23 16:28:38 +08:00

140 lines
4.2 KiB
Go

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