main.go (provided.al2023 runtime)
package main
import (
"bytes"
"context"
"encoding/json"
"fmt"
"log"
"net/http"
"os"
"time"
"github.com/aws/aws-lambda-go/lambda"
)
type order struct {
ID string `json:"id"`
Email string `json:"email"`
}
var client = &http.Client{Timeout: 10 * time.Second}
func handler(ctx context.Context, o order) (string, error) {
body, _ := json.Marshal(map[string]any{
"from": "receipts@acme.com",
"to": o.Email,
"subject": fmt.Sprintf("Your receipt for order %s", o.ID),
"html": fmt.Sprintf("<p>Thanks for your order %s.</p>", o.ID),
"text": fmt.Sprintf("Thanks for your order %s.", o.ID),
})
req, err := http.NewRequestWithContext(ctx, http.MethodPost,
"https://app.usenotix.dev/api/v1/emails", bytes.NewReader(body))
if err != nil {
return "", err
}
req.Header.Set("Authorization", "Bearer "+os.Getenv("NOTIX_API_KEY"))
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Idempotency-Key", "order-"+o.ID+"-receipt")
res, err := client.Do(req)
if err != nil {
return "", err
}
defer res.Body.Close()
if res.StatusCode == http.StatusTooManyRequests || res.StatusCode >= 500 {
return "", fmt.Errorf("notix answered %d", res.StatusCode)
}
if res.StatusCode >= 400 {
log.Printf("send refused with status %d", res.StatusCode)
return "", nil
}
var out struct {
EmailID string `json:"emailId"`
}
if err := json.NewDecoder(res.Body).Decode(&out); err != nil {
return "", err
}
return out.EmailID, nil
}
func main() {
lambda.Start(handler)
}