in backend/server/api/router.go [112:174]
func handlePluginCall(basicRes context.BasicRes, pluginName string, handler plugin.ApiResourceHandler) func(c *gin.Context) {
return func(c *gin.Context) {
var err errors.Error
input := &plugin.ApiResourceInput{}
input.Params = make(map[string]string)
if len(c.Params) > 0 {
for _, param := range c.Params {
input.Params[param.Key] = param.Value
}
}
input.Params["plugin"] = pluginName
input.Query = c.Request.URL.Query()
user, exist := shared.GetUser(c)
if !exist {
basicRes.GetLogger().Debug("user doesn't exist")
} else {
input.User = user
}
if c.Request.Body != nil {
if strings.HasPrefix(c.Request.Header.Get("Content-Type"), "multipart/form-data;") {
input.Request = c.Request
} else {
shouldBindJSONErr := c.ShouldBindJSON(&input.Body)
if shouldBindJSONErr != nil && shouldBindJSONErr.Error() != "EOF" {
shared.ApiOutputError(c, shouldBindJSONErr)
return
}
}
}
output, err := handler(input)
if err != nil {
if output != nil && output.Body != nil {
logruslog.Global.Error(err, "")
shared.ApiOutputSuccess(c, output.Body, err.GetType().GetHttpCode())
} else {
shared.ApiOutputError(c, err)
}
} else if output != nil {
status := output.Status
if status < http.StatusContinue {
status = http.StatusOK
}
if output.Header != nil {
for k, vs := range output.Header {
for _, v := range vs {
c.Header(k, v)
}
}
}
if output.File != nil {
c.Data(status, output.File.ContentType, output.File.Data)
return
}
if blob, ok := output.Body.([]byte); ok && output.ContentType != "" {
c.Data(status, output.ContentType, blob)
} else {
shared.ApiOutputSuccess(c, output.Body, status)
}
} else {
shared.ApiOutputSuccess(c, nil, http.StatusOK)
}
}
}