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