refactor: change files controller to use new files service api
This commit is contained in:
parent
118c679f76
commit
73bc836cbc
|
@ -1,38 +1,20 @@
|
|||
package controller
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/hex"
|
||||
"errors"
|
||||
"fmt"
|
||||
"git.lumeweb.com/LumeWeb/portal/bao"
|
||||
"git.lumeweb.com/LumeWeb/portal/cid"
|
||||
"git.lumeweb.com/LumeWeb/portal/db"
|
||||
"git.lumeweb.com/LumeWeb/portal/model"
|
||||
"git.lumeweb.com/LumeWeb/portal/renterd"
|
||||
"github.com/go-resty/resty/v2"
|
||||
"git.lumeweb.com/LumeWeb/portal/service/files"
|
||||
"github.com/kataras/iris/v12"
|
||||
"io"
|
||||
"lukechampine.com/blake3"
|
||||
)
|
||||
|
||||
type FilesController struct {
|
||||
Ctx iris.Context
|
||||
}
|
||||
|
||||
var client *resty.Client
|
||||
|
||||
type UploadResponse struct {
|
||||
Cid string `json:"cid"`
|
||||
}
|
||||
|
||||
func InitFiles() {
|
||||
client = resty.New()
|
||||
client.SetBaseURL(renterd.GetApiAddr() + "/api")
|
||||
client.SetBasicAuth("", renterd.GetAPIPassword())
|
||||
client.SetDisableWarn(true)
|
||||
}
|
||||
|
||||
func (f *FilesController) PostUpload() {
|
||||
ctx := f.Ctx
|
||||
|
||||
|
@ -41,86 +23,19 @@ func (f *FilesController) PostUpload() {
|
|||
return
|
||||
}
|
||||
|
||||
buf, err := io.ReadAll(file)
|
||||
if internalError(ctx, err) {
|
||||
return
|
||||
}
|
||||
|
||||
if internalErrorCustom(ctx, err, errors.New("failed to read file data")) {
|
||||
return
|
||||
}
|
||||
|
||||
hashBytes := blake3.Sum256(buf)
|
||||
hashHex := hex.EncodeToString(hashBytes[:])
|
||||
fileCid, err := cid.EncodeFixed(hashBytes, uint64(meta.Size))
|
||||
upload, err := files.Upload(file)
|
||||
|
||||
if internalError(ctx, err) {
|
||||
return
|
||||
}
|
||||
|
||||
_, err = file.Seek(0, io.SeekStart)
|
||||
if internalError(ctx, err) {
|
||||
return
|
||||
}
|
||||
|
||||
var upload model.Upload
|
||||
result := db.Get().Where("hash = ?", hashHex).First(&upload)
|
||||
if (result.Error != nil && result.Error.Error() != "record not found") || result.RowsAffected > 0 {
|
||||
ctx.JSON(&UploadResponse{Cid: fileCid})
|
||||
return
|
||||
}
|
||||
|
||||
_, err = file.Seek(0, io.SeekStart)
|
||||
if internalError(ctx, err) {
|
||||
return
|
||||
}
|
||||
|
||||
tree, err := bao.ComputeBaoTree(bytes.NewReader(buf))
|
||||
if internalError(ctx, err) {
|
||||
return
|
||||
}
|
||||
|
||||
objectExistsResult, err := client.R().Get(fmt.Sprintf("/worker/objects/%s", hashHex))
|
||||
cidString, err := cid.EncodeString(upload.Hash, uint64(meta.Size))
|
||||
|
||||
if internalError(ctx, err) {
|
||||
return
|
||||
}
|
||||
|
||||
if objectExistsResult.StatusCode() != 404 {
|
||||
ctx.JSON(&UploadResponse{Cid: fileCid})
|
||||
return
|
||||
}
|
||||
|
||||
if internalError(ctx, err) {
|
||||
return
|
||||
}
|
||||
|
||||
ret, err := client.R().SetBody(buf).Put(fmt.Sprintf("/worker/objects/%s", hashHex))
|
||||
if ret.StatusCode() != 200 {
|
||||
err = errors.New(string(ret.Body()))
|
||||
}
|
||||
if internalError(ctx, err) {
|
||||
return
|
||||
}
|
||||
|
||||
ret, err = client.R().SetBody(tree).Put(fmt.Sprintf("/worker/objects/%s.obao", hashHex))
|
||||
if ret.StatusCode() != 200 {
|
||||
err = errors.New(string(ret.Body()))
|
||||
}
|
||||
if internalError(ctx, err) {
|
||||
return
|
||||
}
|
||||
|
||||
upload = model.Upload{
|
||||
Hash: hashHex,
|
||||
}
|
||||
if err := db.Get().Create(&upload).Error; err != nil {
|
||||
if internalError(ctx, err) {
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
ctx.JSON(&UploadResponse{Cid: fileCid})
|
||||
_ = ctx.JSON(&UploadResponse{Cid: cidString})
|
||||
}
|
||||
|
||||
func (f *FilesController) GetDownload() {
|
||||
|
@ -134,38 +49,23 @@ func (f *FilesController) GetDownload() {
|
|||
}
|
||||
|
||||
cidObject, _ := cid.Decode(cidString)
|
||||
hashHex := hex.EncodeToString(cidObject.Hash[:])
|
||||
|
||||
result := db.Get().Table("uploads").Where("hash = ?", hashHex).Row()
|
||||
|
||||
if result.Err() != nil {
|
||||
sendError(ctx, result.Err(), iris.StatusNotFound)
|
||||
return
|
||||
}
|
||||
|
||||
fetch, err := client.R().SetDoNotParseResponse(true).Get(fmt.Sprintf("/worker/objects/%s", hashHex))
|
||||
if err != nil {
|
||||
if fetch.StatusCode() == 404 {
|
||||
sendError(ctx, err, iris.StatusNotFound)
|
||||
return
|
||||
}
|
||||
internalError(ctx, err)
|
||||
return
|
||||
}
|
||||
|
||||
ctx.Header("Transfer-Encoding", "chunked")
|
||||
hashHex := cidObject.StringHash()
|
||||
|
||||
if internalError(ctx, err) {
|
||||
return
|
||||
}
|
||||
|
||||
download, err := files.Download(hashHex)
|
||||
if internalError(ctx, err) {
|
||||
return
|
||||
}
|
||||
|
||||
err = ctx.StreamWriter(func(w io.Writer) error {
|
||||
_, err = io.Copy(w, fetch.RawBody())
|
||||
_ = fetch.RawBody().Close()
|
||||
_, err = io.Copy(w, download)
|
||||
_ = download.(io.Closer).Close()
|
||||
return err
|
||||
})
|
||||
internalError(ctx, err)
|
||||
|
||||
}
|
||||
|
||||
func sendErrorCustom(ctx iris.Context, err error, customError error, irisError int) bool {
|
||||
|
|
Loading…
Reference in New Issue