[add] sui template asset upload api

This commit is contained in:
Max 2023-10-31 19:25:36 +08:00
parent 08b7cd5aaf
commit 92d22afb0d
4 changed files with 88 additions and 4 deletions

View file

@ -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",

View file

@ -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)

View file

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

View file

@ -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) {