1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import (
"bytes"
"encoding/json"
"fmt"
"io"
"net/http"
"os"
)
func main() {
urlFileUpload := "https://api.pingen.com/file-upload"
urlLetters := "https://api.pingen.com/organisations/YOUR_ORGANISATION_UUID/letters"
accessToken := "INSERT_YOUR_ACCESS_TOKEN_HERE"
// Step 1: GET file upload endpoint
req, err := http.NewRequest("GET", urlFileUpload, nil)
if err != nil {
fmt.Println("Error creating GET request:", err)
return
}
req.Header.Set("Authorization", "Bearer "+accessToken)
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
fmt.Println("Error sending GET request:", err)
return
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
fmt.Printf("Failed to fetch file upload data, status: %d\n", resp.StatusCode)
return
}
// Parse the response
var fileUploadData struct {
Data struct {
Attributes struct {
URL string `json:"url"`
URLSignature string `json:"url_signature"`
} `json:"attributes"`
} `json:"data"`
}
if err := json.NewDecoder(resp.Body).Decode(&fileUploadData); err != nil {
fmt.Println("Error decoding file upload response:", err)
return
}
fileURL := fileUploadData.Data.Attributes.URL
fileURLSignature := fileUploadData.Data.Attributes.URLSignature
// Step 2: PUT file to the signed URL
file, err := os.Open("path_to_your_file.pdf")
if err != nil {
fmt.Println("Error opening file:", err)
return
}
defer file.Close()
req, err = http.NewRequest("PUT", fileURL, file)
if err != nil {
fmt.Println("Error creating PUT request:", err)
return
}
resp, err = client.Do(req)
if err != nil {
fmt.Println("Error sending PUT request:", err)
return
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
fmt.Printf("Failed to upload the file, status: %d\n", resp.StatusCode)
return
}
// Step 3: POST letter details to the API
payload := map[string]interface{}{
"data": map[string]interface{}{
"type": "letters",
"attributes": map[string]interface{}{
"file_original_name": "your_filename.pdf",
"file_url": fileURL,
"file_url_signature": fileURLSignature,
"address_position": "left",
"auto_send": false,
},
},
}
payloadBytes, err := json.Marshal(payload)
if err != nil {
fmt.Println("Error marshalling payload:", err)
return
}
req, err = http.NewRequest("POST", urlLetters, bytes.NewBuffer(payloadBytes))
if err != nil {
fmt.Println("Error creating POST request:", err)
return
}
req.Header.Set("Content-Type", "application/vnd.api+json")
req.Header.Set("Authorization", "Bearer "+accessToken)
resp, err = client.Do(req)
if err != nil {
fmt.Println("Error sending POST request:", err)
return
}
defer resp.Body.Close()
if resp.StatusCode == http.StatusCreated {
fmt.Println("Letter successfully created!")
} else {
fmt.Printf("Failed to create the letter, status: %d\n", resp.StatusCode)
}
}