diff --git a/sui/api/api.go b/sui/api/api.go index 0cb43c70..1ac51bd0 100644 --- a/sui/api/api.go +++ b/sui/api/api.go @@ -12,7 +12,6 @@ var dsl = []byte(` "paths": [ { "path": "/:id/setting", - "guard": "-", "method": "GET", "process": "sui.Setting", "in": ["$param.id"], @@ -175,6 +174,12 @@ var dsl = []byte(` "body": "?:content", "headers": { "Content-Type": "?:type"} } + },{ + "path": "/:id/asset/:template_id/upload", + "method": "POST", + "process": "sui.Template.AssetUpload", + "in": ["$param.id", "$param.template_id", ":context"], + "out": { "status": 200, "type": "application/json" } },{ "path": "/:id/asset/:template_id/@pages/*path", "guard": "query-jwt", diff --git a/sui/api/process.go b/sui/api/process.go index 691ff657..4f8f2865 100644 --- a/sui/api/process.go +++ b/sui/api/process.go @@ -1,6 +1,7 @@ package api import ( + "encoding/base64" "fmt" "net/url" "path/filepath" @@ -17,9 +18,10 @@ func init() { process.RegisterGroup("sui", map[string]process.Handler{ "setting": Setting, - "template.get": TemplateGet, - "template.find": TemplateFind, - "template.asset": TemplateAsset, + "template.get": TemplateGet, + "template.find": TemplateFind, + "template.asset": TemplateAsset, + "template.assetupload": TemplateAssetUpload, "locale.get": LocaleGet, "theme.get": ThemeGet, @@ -108,6 +110,61 @@ func TemplateAsset(process *process.Process) interface{} { } } +// TemplateAssetUpload handle the find Template request +func TemplateAssetUpload(process *process.Process) interface{} { + process.ValidateArgNums(3) + sui := get(process) + tmpl, err := sui.GetTemplate(process.ArgsString(1)) + if err != nil { + exception.New(err.Error(), 500).Throw() + } + + switch v := process.Args[2].(type) { + case *gin.Context: + file, err := v.FormFile("file") + if err != nil { + exception.New(err.Error(), 500).Throw() + } + + reader, err := file.Open() + if err != nil { + exception.New(err.Error(), 500).Throw() + } + defer reader.Close() + + path, err := tmpl.AssetUpload(reader, file.Filename) + if err != nil { + exception.New(err.Error(), 500).Throw() + } + + url := v.PostForm("url") + fileurl := fmt.Sprintf("%s/%s", url, path) + // time.Sleep(10 * time.Second) + return map[string]interface{}{ + "data": []interface{}{fileurl}, + "header": file.Header, + } + + case string: + data, err := base64.StdEncoding.DecodeString(v) + if err != nil { + exception.New(err.Error(), 500).Throw() + } + + name := process.ArgsString(3, "file.png") + path, err := tmpl.AssetUpload(strings.NewReader(string(data)), name) + if err != nil { + exception.New(err.Error(), 500).Throw() + } + + return path + + default: + exception.New("the file is required", 400).Throw() + return nil + } +} + // LocaleGet handle the find Template request func LocaleGet(process *process.Process) interface{} { process.ValidateArgNums(2) diff --git a/sui/core/interfaces.go b/sui/core/interfaces.go index bb464ef8..5a439c21 100644 --- a/sui/core/interfaces.go +++ b/sui/core/interfaces.go @@ -1,5 +1,7 @@ package core +import "io" + // SUIs the loaded SUI instances var SUIs = map[string]SUI{} @@ -35,6 +37,7 @@ type ITemplate interface { Themes() []SelectOption Asset(file string) (*Asset, error) + AssetUpload(reader io.Reader, name string) (string, error) Build(option *BuildOption) error SyncAssets(option *BuildOption) error diff --git a/sui/storages/local/template.go b/sui/storages/local/template.go index e17a5f96..53ff37bd 100644 --- a/sui/storages/local/template.go +++ b/sui/storages/local/template.go @@ -2,8 +2,13 @@ package local import ( "fmt" + "io" + "os" "path/filepath" + "strings" + "time" + "github.com/google/uuid" "github.com/yaoapp/yao/sui/core" "golang.org/x/text/language" ) @@ -44,6 +49,20 @@ func (tmpl *Template) Themes() []core.SelectOption { return tmpl.Template.Themes } +// AssetUpload upload the asset +func (tmpl *Template) AssetUpload(reader io.Reader, name string) (string, error) { + + fingerprint := strings.ToUpper(uuid.NewString()) + dir := strings.Join([]string{string(os.PathSeparator), time.Now().Format("20060102")}, "") + ext := filepath.Ext(name) + file := filepath.Join(tmpl.Root, "__assets", "upload", dir, fmt.Sprintf("%s%s", fingerprint, ext)) + _, err := tmpl.local.fs.Write(file, reader, 0644) + if err != nil { + return "", err + } + return filepath.Join("upload", dir, fmt.Sprintf("%s%s", fingerprint, ext)), nil +} + // Asset get the asset func (tmpl *Template) Asset(file string) (*core.Asset, error) {