65 lines
1.3 KiB
Go
65 lines
1.3 KiB
Go
|
package storage
|
||
|
|
||
|
import (
|
||
|
"bytes"
|
||
|
"git.lumeweb.com/LumeWeb/libs5-go/encoding"
|
||
|
"git.lumeweb.com/LumeWeb/portal/interfaces"
|
||
|
"github.com/go-resty/resty/v2"
|
||
|
"io"
|
||
|
"lukechampine.com/blake3"
|
||
|
)
|
||
|
|
||
|
var (
|
||
|
_ interfaces.StorageService = (*StorageServiceImpl)(nil)
|
||
|
)
|
||
|
|
||
|
type StorageServiceImpl struct {
|
||
|
portal interfaces.Portal
|
||
|
httpApi *resty.Client
|
||
|
}
|
||
|
|
||
|
func NewStorageService(portal interfaces.Portal) interfaces.StorageService {
|
||
|
client := resty.New()
|
||
|
|
||
|
client.SetBaseURL(portal.Config().GetString("core.sia.url"))
|
||
|
client.SetBasicAuth("", portal.Config().GetString("core.sia.key"))
|
||
|
|
||
|
return &StorageServiceImpl{
|
||
|
portal: portal,
|
||
|
httpApi: client,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (s StorageServiceImpl) PutFile(file io.ReadSeeker, bucket string, generateProof bool) ([]byte, error) {
|
||
|
buf := bytes.NewBuffer(nil)
|
||
|
|
||
|
_, err := io.Copy(buf, file)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
hash := blake3.Sum512(buf.Bytes())
|
||
|
hashStr, err := encoding.NewMultihash(hash[:]).ToBase64Url()
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
buf.Reset()
|
||
|
|
||
|
resp, err := s.httpApi.R().
|
||
|
SetPathParam("path", hashStr).
|
||
|
SetFormData(map[string]string{
|
||
|
"bucket": bucket,
|
||
|
}).
|
||
|
SetBody(buf).Put("/api/worker/{path}")
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
if resp.IsError() {
|
||
|
return nil, resp.Error().(error)
|
||
|
}
|
||
|
|
||
|
return hash[:], nil
|
||
|
}
|