infoalloggi-monorepo/apps/backend/storage.go

203 lines
5.3 KiB
Go

package main
import (
"backend/config"
"bytes"
"encoding/json"
"fmt"
"io"
"mime/multipart"
"net/http"
"net/textproto"
"os"
"path/filepath"
"time"
)
func DeleteFile(id string) error {
req, err := http.NewRequest("DELETE", config.Cfg.Storage.Endpoint+"/delete/"+id+"?token="+config.Cfg.Storage.Token, nil)
if err != nil {
return fmt.Errorf("failed to create delete request: %w", err)
}
resp, err := http.DefaultClient.Do(req)
if err != nil {
return fmt.Errorf("delete request failed: %w", err)
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
return fmt.Errorf("delete failed: %s", resp.Status)
}
return nil
}
func GetFile(path string) ([]byte, error) {
panic("unimplemented")
}
type FileMetadata struct {
ID string `json:"id"`
OriginalName string `json:"originalName"`
Size int64 `json:"size"`
MIMEType string `json:"mimeType"`
BlockCount int `json:"blockCount"`
UploadedAt time.Time `json:"uploadedAt"`
ExpiresAt *time.Time `json:"expiresAt"`
Bucket string `json:"bucket,omitempty"`
}
// func ListFiles() ([]FileMetadata, error) {
// //get list of files from api
// resp, err := http.Get(config.Cfg.Storage.Endpoint + "/files?token=" + config.Cfg.Storage.Token)
// if err != nil {
// return nil, err
// }
// defer resp.Body.Close()
// if resp.StatusCode != http.StatusOK {
// return nil, fmt.Errorf("failed to list files: %s", resp.Status)
// }
// //parse response
// body, err := io.ReadAll(resp.Body)
// if err != nil {
// fmt.Println("Error reading response body:", err)
// return nil, err
// }
// var data []FileMetadata
// err = json.Unmarshal(body, &data)
// if err != nil {
// fmt.Println("Error unmarshalling response body:", err)
// return nil, err
// }
// return data, nil
// }
func ListBucket(bucketName string) ([]FileMetadata, error) {
//get list of files from api
resp, err := http.Get(config.Cfg.Storage.Endpoint + "/bucket/" + bucketName + "?token=" + config.Cfg.Storage.Token)
if err != nil {
return nil, err
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
return nil, fmt.Errorf("failed to list files: %s", resp.Status)
}
//parse response
body, err := io.ReadAll(resp.Body)
if err != nil {
fmt.Println("Error reading response body:", err)
return nil, err
}
var data []FileMetadata
err = json.Unmarshal(body, &data)
if err != nil {
fmt.Println("Error unmarshalling response body:", err)
return nil, err
}
return data, nil
}
// type CheckFileResponse struct {
// Available []FileMetadata `json:"available"`
// Unavailable []string `json:"unavailable"`
// }
// func CheckFiles(ids []string) ([]FileMetadata, []string, error) {
// //application/json with array of ids as body of post request to /files-check
// jsonData, err := json.Marshal(ids)
// if err != nil {
// return nil, nil, err
// }
// resp, err := http.Post(config.Cfg.Storage.Endpoint+"/files-check?token="+config.Cfg.Storage.Token,
// "application/json", bytes.NewBuffer(jsonData))
// if err != nil {
// return nil, nil, err
// }
// defer resp.Body.Close()
// if resp.StatusCode != http.StatusOK {
// return nil, nil, fmt.Errorf("failed to check files: %s", resp.Status)
// }
// //parse response
// body, err := io.ReadAll(resp.Body)
// if err != nil {
// fmt.Println("Error reading response body:", err)
// return nil, nil, err
// }
// var data CheckFileResponse
// err = json.Unmarshal(body, &data)
// if err != nil {
// fmt.Println("Error unmarshalling response body:", err)
// return nil, nil, err
// }
// return data.Available, data.Unavailable, nil
// }
func UploadFile(path string) (string, error) {
file, err := os.Open(path)
if err != nil {
return "", fmt.Errorf("failed to open file: %w", err)
}
defer file.Close()
var body bytes.Buffer
writer := multipart.NewWriter(&body)
mimeType := "image/webp"
h := make(textproto.MIMEHeader)
h.Set("Content-Disposition", fmt.Sprintf(`form-data; name="file"; filename="%s"`, filepath.Base(path)))
h.Set("Content-Type", mimeType)
part, err := writer.CreatePart(h)
if err != nil {
return "", fmt.Errorf("failed to create form file: %w", err)
}
if _, err := io.Copy(part, file); err != nil {
return "", fmt.Errorf("failed to copy file data: %w", err)
}
err = writer.WriteField("bucket", "images")
if err != nil {
return "", fmt.Errorf("failed to write bucket field: %w", err)
}
if err := writer.Close(); err != nil {
return "", fmt.Errorf("failed to close writer: %w", err)
}
req, err := http.NewRequest("POST", config.Cfg.Storage.Endpoint+"/upload?token="+config.Cfg.Storage.Token, &body)
if err != nil {
return "", fmt.Errorf("failed to create upload request: %w", err)
}
req.Header.Set("Content-Type", writer.FormDataContentType())
resp, err := http.DefaultClient.Do(req)
if err != nil {
return "", fmt.Errorf("upload request failed: %w", err)
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
return "", fmt.Errorf("upload failed: %s", resp.Status)
}
//parse response
respBody, err := io.ReadAll(resp.Body)
if err != nil {
return "", fmt.Errorf("failed to read upload response: %w", err)
}
var data map[string]string
err = json.Unmarshal(respBody, &data)
if err != nil {
return "", fmt.Errorf("failed to parse upload response: %w", err)
}
if id, ok := data["id"]; ok {
return id, nil
}
return "", nil
}