package utils import ( "context" "fmt" "mime/multipart" "os" "github.com/cloudinary/cloudinary-go/v2" "github.com/cloudinary/cloudinary-go/v2/api" "github.com/cloudinary/cloudinary-go/v2/api/uploader" ) type CloudinaryClient struct { cld *cloudinary.Cloudinary } func NewCloudinaryClient() (*CloudinaryClient, error) { cloudName := os.Getenv("CLOUDINARY_CLOUD_NAME") apiKey := os.Getenv("CLOUDINARY_API_KEY") apiSecret := os.Getenv("CLOUDINARY_API_SECRET") cld, err := cloudinary.NewFromParams(cloudName, apiKey, apiSecret) if err != nil { return nil, err } return &CloudinaryClient{cld: cld}, nil } func (c *CloudinaryClient) UploadImage(file multipart.File, reportID string, longitude, latitude float64, description string) (string, error) { ctx := context.Background() contextData := api.CldAPIMap{ "Id": reportID, "description": description, "latitude": fmt.Sprintf("%.6f", latitude), "longitude": fmt.Sprintf("%.6f", longitude), } uploadParams := uploader.UploadParams{ PublicID: reportID, Folder: "reports", Context: contextData, } result, err := c.cld.Upload.Upload(ctx, file, uploadParams) if err != nil { return "", err } return result.SecureURL, nil }