infoalloggi-monorepo/apps/backend/storage_handlers/go_fs.go
2025-10-23 15:16:42 +02:00

93 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")
}