94 lines
1.9 KiB
Go
94 lines
1.9 KiB
Go
|
|
package storagehandlers
|
||
|
|
|
||
|
|
import (
|
||
|
|
"backend/config"
|
||
|
|
"bytes"
|
||
|
|
"fmt"
|
||
|
|
"io"
|
||
|
|
"mime/multipart"
|
||
|
|
"net/http"
|
||
|
|
)
|
||
|
|
|
||
|
|
var _ StorageHandler = (*GOFS_Handler)(nil)
|
||
|
|
|
||
|
|
type GOFS_Handler struct {
|
||
|
|
Endpoint string
|
||
|
|
}
|
||
|
|
|
||
|
|
func NewGoFsHandler() *GOFS_Handler {
|
||
|
|
|
||
|
|
return &GOFS_Handler{
|
||
|
|
Endpoint: config.Cfg.Storage.GOFS.Endpoint,
|
||
|
|
}
|
||
|
|
}
|
||
|
|
func (g *GOFS_Handler) Init() error {
|
||
|
|
resp, err := http.Get(g.Endpoint + "/health")
|
||
|
|
if err != nil {
|
||
|
|
return fmt.Errorf("storage server unreachable: %w", err)
|
||
|
|
}
|
||
|
|
defer resp.Body.Close()
|
||
|
|
if resp.StatusCode != http.StatusOK {
|
||
|
|
return fmt.Errorf("storage server unhealthy: %s", resp.Status)
|
||
|
|
}
|
||
|
|
return nil
|
||
|
|
}
|
||
|
|
func (g *GOFS_Handler) Add(file *multipart.FileHeader, fileId string) error {
|
||
|
|
f, err := file.Open()
|
||
|
|
if err != nil {
|
||
|
|
return err
|
||
|
|
}
|
||
|
|
defer f.Close()
|
||
|
|
|
||
|
|
body := &bytes.Buffer{}
|
||
|
|
writer := multipart.NewWriter(body)
|
||
|
|
part, err := writer.CreateFormFile("file", file.Filename)
|
||
|
|
if err != nil {
|
||
|
|
return err
|
||
|
|
}
|
||
|
|
if _, err := io.Copy(part, f); err != nil {
|
||
|
|
return err
|
||
|
|
}
|
||
|
|
_ = writer.WriteField("fileId", fileId)
|
||
|
|
writer.Close()
|
||
|
|
|
||
|
|
req, err := http.NewRequest("POST", g.Endpoint+"/upload", body)
|
||
|
|
if err != nil {
|
||
|
|
return err
|
||
|
|
}
|
||
|
|
req.Header.Set("Content-Type", writer.FormDataContentType())
|
||
|
|
|
||
|
|
resp, err := http.DefaultClient.Do(req)
|
||
|
|
if err != nil {
|
||
|
|
return err
|
||
|
|
}
|
||
|
|
defer resp.Body.Close()
|
||
|
|
if resp.StatusCode != http.StatusOK {
|
||
|
|
return fmt.Errorf("upload failed: %s", resp.Status)
|
||
|
|
}
|
||
|
|
return nil
|
||
|
|
}
|
||
|
|
|
||
|
|
func (g *GOFS_Handler) Delete(fileId string) error {
|
||
|
|
req, err := http.NewRequest("DELETE", g.Endpoint+"/delete/"+fileId, nil)
|
||
|
|
if err != nil {
|
||
|
|
return err
|
||
|
|
}
|
||
|
|
resp, err := http.DefaultClient.Do(req)
|
||
|
|
if err != nil {
|
||
|
|
return err
|
||
|
|
}
|
||
|
|
defer resp.Body.Close()
|
||
|
|
if resp.StatusCode != http.StatusNoContent {
|
||
|
|
return fmt.Errorf("delete failed: %s", resp.Status)
|
||
|
|
}
|
||
|
|
return nil
|
||
|
|
}
|
||
|
|
|
||
|
|
func (g *GOFS_Handler) Get(filename string) (string, error) {
|
||
|
|
panic("unimplemented")
|
||
|
|
}
|
||
|
|
|
||
|
|
func (g *GOFS_Handler) List() ([]string, error) {
|
||
|
|
panic("unimplemented")
|
||
|
|
}
|