2025-08-04 17:45:44 +02:00
|
|
|
package main
|
|
|
|
|
|
|
|
|
|
import (
|
2025-10-27 17:58:42 +01:00
|
|
|
"bytes"
|
|
|
|
|
"encoding/json"
|
2025-08-04 17:45:44 +02:00
|
|
|
"fmt"
|
2025-10-27 17:58:42 +01:00
|
|
|
"io"
|
2025-08-04 17:45:44 +02:00
|
|
|
"mime/multipart"
|
|
|
|
|
"net/http"
|
2025-10-27 17:58:42 +01:00
|
|
|
"net/textproto"
|
2025-08-04 17:45:44 +02:00
|
|
|
"os"
|
|
|
|
|
"path/filepath"
|
|
|
|
|
"time"
|
|
|
|
|
)
|
|
|
|
|
|
2025-10-27 17:58:42 +01:00
|
|
|
var EXAMPLE_STORAGE_URL = "http://localhost:8080"
|
|
|
|
|
var EXAMPLE_STORAGE_TOKEN = "test"
|
2025-08-22 10:11:07 +02:00
|
|
|
|
2025-10-27 17:58:42 +01:00
|
|
|
func DeleteFile(id string) error {
|
|
|
|
|
req, err := http.NewRequest("DELETE", EXAMPLE_STORAGE_URL+"/delete/"+id+"?token="+EXAMPLE_STORAGE_TOKEN, nil)
|
2025-08-04 17:45:44 +02:00
|
|
|
if err != nil {
|
2025-10-27 17:58:42 +01:00
|
|
|
return fmt.Errorf("failed to create delete request: %w", err)
|
2025-08-04 17:45:44 +02:00
|
|
|
}
|
2025-10-27 17:58:42 +01:00
|
|
|
resp, err := http.DefaultClient.Do(req)
|
2025-08-04 17:45:44 +02:00
|
|
|
if err != nil {
|
2025-10-27 17:58:42 +01:00
|
|
|
return fmt.Errorf("delete request failed: %w", err)
|
2025-08-04 17:45:44 +02:00
|
|
|
}
|
2025-10-27 17:58:42 +01:00
|
|
|
defer resp.Body.Close()
|
|
|
|
|
if resp.StatusCode != http.StatusOK {
|
|
|
|
|
return fmt.Errorf("delete failed: %s", resp.Status)
|
2025-08-04 17:45:44 +02:00
|
|
|
}
|
2025-10-27 17:58:42 +01:00
|
|
|
return nil
|
|
|
|
|
}
|
2025-08-04 17:45:44 +02:00
|
|
|
|
2025-10-27 17:58:42 +01:00
|
|
|
func GetFile(path string) ([]byte, error) {
|
|
|
|
|
panic("unimplemented")
|
|
|
|
|
}
|
2025-08-04 17:45:44 +02:00
|
|
|
|
2025-10-27 17:58:42 +01:00
|
|
|
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"`
|
2025-08-04 17:45:44 +02:00
|
|
|
}
|
|
|
|
|
|
2025-10-27 17:58:42 +01:00
|
|
|
// func ListFiles() ([]FileMetadata, error) {
|
|
|
|
|
// //get list of files from api
|
|
|
|
|
// resp, err := http.Get(EXAMPLE_STORAGE_URL + "/files?token=" + EXAMPLE_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(EXAMPLE_STORAGE_URL + "/bucket/" + bucketName + "?token=" + EXAMPLE_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)
|
2025-08-04 17:45:44 +02:00
|
|
|
}
|
2025-10-27 17:58:42 +01:00
|
|
|
//parse response
|
|
|
|
|
body, err := io.ReadAll(resp.Body)
|
2025-08-04 17:45:44 +02:00
|
|
|
if err != nil {
|
2025-10-27 17:58:42 +01:00
|
|
|
fmt.Println("Error reading response body:", err)
|
|
|
|
|
return nil, err
|
2025-08-04 17:45:44 +02:00
|
|
|
}
|
2025-10-27 17:58:42 +01:00
|
|
|
var data []FileMetadata
|
|
|
|
|
err = json.Unmarshal(body, &data)
|
2025-08-04 17:45:44 +02:00
|
|
|
if err != nil {
|
2025-10-27 17:58:42 +01:00
|
|
|
fmt.Println("Error unmarshalling response body:", err)
|
|
|
|
|
return nil, err
|
2025-08-04 17:45:44 +02:00
|
|
|
}
|
2025-10-27 17:58:42 +01:00
|
|
|
return data, nil
|
2025-08-04 17:45:44 +02:00
|
|
|
}
|
|
|
|
|
|
2025-10-27 17:58:42 +01:00
|
|
|
// 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(EXAMPLE_STORAGE_URL+"/files-check?token="+EXAMPLE_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)
|
2025-08-04 17:45:44 +02:00
|
|
|
|
2025-10-27 17:58:42 +01:00
|
|
|
mimeType := "image/webp"
|
2025-08-04 17:45:44 +02:00
|
|
|
|
2025-10-27 17:58:42 +01:00
|
|
|
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)
|
2025-08-04 17:45:44 +02:00
|
|
|
if err != nil {
|
2025-10-27 17:58:42 +01:00
|
|
|
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)
|
2025-08-04 17:45:44 +02:00
|
|
|
}
|
2025-08-22 10:11:07 +02:00
|
|
|
|
2025-10-27 17:58:42 +01:00
|
|
|
err = writer.WriteField("bucket", "images")
|
|
|
|
|
if err != nil {
|
|
|
|
|
return "", fmt.Errorf("failed to write bucket field: %w", err)
|
|
|
|
|
}
|
2025-08-04 17:45:44 +02:00
|
|
|
|
2025-10-27 17:58:42 +01:00
|
|
|
if err := writer.Close(); err != nil {
|
|
|
|
|
return "", fmt.Errorf("failed to close writer: %w", err)
|
2025-08-04 17:45:44 +02:00
|
|
|
}
|
|
|
|
|
|
2025-10-27 17:58:42 +01:00
|
|
|
req, err := http.NewRequest("POST", EXAMPLE_STORAGE_URL+"/upload?token="+EXAMPLE_STORAGE_TOKEN, &body)
|
2025-08-04 17:45:44 +02:00
|
|
|
if err != nil {
|
2025-10-27 17:58:42 +01:00
|
|
|
return "", fmt.Errorf("failed to create upload request: %w", err)
|
2025-08-04 17:45:44 +02:00
|
|
|
}
|
2025-10-27 17:58:42 +01:00
|
|
|
req.Header.Set("Content-Type", writer.FormDataContentType())
|
2025-08-04 17:45:44 +02:00
|
|
|
|
2025-10-27 17:58:42 +01:00
|
|
|
resp, err := http.DefaultClient.Do(req)
|
2025-08-04 17:45:44 +02:00
|
|
|
if err != nil {
|
2025-10-27 17:58:42 +01:00
|
|
|
return "", fmt.Errorf("upload request failed: %w", err)
|
2025-08-04 17:45:44 +02:00
|
|
|
}
|
2025-10-27 17:58:42 +01:00
|
|
|
defer resp.Body.Close()
|
2025-08-04 17:45:44 +02:00
|
|
|
|
2025-10-27 17:58:42 +01:00
|
|
|
if resp.StatusCode != http.StatusOK {
|
|
|
|
|
return "", fmt.Errorf("upload failed: %s", resp.Status)
|
|
|
|
|
}
|
|
|
|
|
//parse response
|
|
|
|
|
respBody, err := io.ReadAll(resp.Body)
|
2025-08-04 17:45:44 +02:00
|
|
|
if err != nil {
|
2025-10-27 17:58:42 +01:00
|
|
|
return "", fmt.Errorf("failed to read upload response: %w", err)
|
2025-08-04 17:45:44 +02:00
|
|
|
}
|
2025-10-27 17:58:42 +01:00
|
|
|
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
|
2025-08-04 17:45:44 +02:00
|
|
|
|
|
|
|
|
}
|