mirror of
https://github.com/yusing/godoxy.git
synced 2026-01-15 16:13:32 +01:00
65 lines
1.9 KiB
Go
65 lines
1.9 KiB
Go
package fileapi
|
|
|
|
import (
|
|
"net/http"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
config "github.com/yusing/godoxy/internal/config/types"
|
|
"github.com/yusing/godoxy/internal/net/gphttp/middleware"
|
|
"github.com/yusing/godoxy/internal/route/provider"
|
|
apitypes "github.com/yusing/goutils/apitypes"
|
|
gperr "github.com/yusing/goutils/errs"
|
|
)
|
|
|
|
type ValidateFileRequest struct {
|
|
FileType FileType `form:"type" validate:"required,oneof=config provider middleware"`
|
|
} // @name ValidateFileRequest
|
|
|
|
// @x-id "validate"
|
|
// @BasePath /api/v1
|
|
// @Summary Validate file
|
|
// @Description Validate file
|
|
// @Tags file
|
|
// @Accept text/plain
|
|
// @Produce json
|
|
// @Param type query FileType true "Type"
|
|
// @Param file body string true "File content"
|
|
// @Success 200 {object} apitypes.SuccessResponse "File validated"
|
|
// @Failure 400 {object} apitypes.ErrorResponse "Bad request"
|
|
// @Failure 403 {object} apitypes.ErrorResponse "Forbidden"
|
|
// @Failure 417 {object} any "Validation failed"
|
|
// @Failure 500 {object} apitypes.ErrorResponse "Internal server error"
|
|
// @Router /file/validate [post]
|
|
func Validate(c *gin.Context) {
|
|
var request ValidateFileRequest
|
|
if err := c.ShouldBindQuery(&request); err != nil {
|
|
c.JSON(http.StatusBadRequest, apitypes.Error("invalid request", err))
|
|
return
|
|
}
|
|
|
|
content, err := c.GetRawData()
|
|
if err != nil {
|
|
c.Error(apitypes.InternalServerError(err, "failed to read file"))
|
|
return
|
|
}
|
|
c.Request.Body.Close()
|
|
|
|
if valErr := validateFile(request.FileType, content); valErr != nil {
|
|
c.JSON(http.StatusExpectationFailed, valErr)
|
|
return
|
|
}
|
|
c.JSON(http.StatusOK, apitypes.Success("file validated"))
|
|
}
|
|
|
|
func validateFile(fileType FileType, content []byte) gperr.Error {
|
|
switch fileType {
|
|
case FileTypeConfig:
|
|
return config.Validate(content)
|
|
case FileTypeMiddleware:
|
|
errs := gperr.NewBuilder("middleware errors")
|
|
middleware.BuildMiddlewaresFromYAML("", content, &errs)
|
|
return errs.Error()
|
|
}
|
|
return provider.Validate(content)
|
|
}
|