portal/storage/storage.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
}