Mail api for sending order confirmation to planetposen customers

This commit is contained in:
2022-12-02 18:26:07 +01:00
commit 2812f6bcbf
13 changed files with 782 additions and 0 deletions

View File

@@ -0,0 +1,55 @@
// Package handler contains handlers for events.
package handler
import (
"encoding/json"
"fmt"
"github.com/kevinmidboe/planetposen-mail/client/sendgrid"
"github.com/kevinmidboe/planetposen-mail/mail"
"net/http"
)
func SendOrderConfirmation(s *sendgrid.Client) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
payload, err := getOrderConfirmationPayload(r)
if err != nil {
handleError(w, err, "unable to parse order payload", http.StatusBadRequest, true)
return
}
mailData, err := mail.OrderConfirmation(*payload)
err = s.SendOrderConfirmation(ctx, *mailData)
if err != nil {
fmt.Println(err)
handleError(w, err, "error from sendgrid ", http.StatusInternalServerError, true)
return
}
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusOK)
responseJSON, _ := json.Marshal(struct {
Message string `json:"message"`
OrderId string `json:"orderId"`
Recipient string `json:"recipient"`
}{
Message: "Successfully sent email",
OrderId: payload.OrderId,
Recipient: payload.Email,
})
w.Write(responseJSON)
}
}
func getOrderConfirmationPayload(r *http.Request) (*mail.OrderConfirmationData, error) {
decoder := json.NewDecoder(r.Body)
var payload mail.OrderConfirmationData
err := decoder.Decode(&payload)
if err != nil {
return nil, fmt.Errorf("decode: %w", err)
}
return &payload, nil
}

24
server/handler/error.go Normal file
View File

@@ -0,0 +1,24 @@
package handler
import (
"encoding/json"
"net/http"
log "github.com/sirupsen/logrus"
)
// handleError - Logs the error (if shouldLog is true), and outputs the error message (msg)
func handleError(w http.ResponseWriter, err error, msg string, statusCode int, shouldLog bool) {
if shouldLog {
log.WithField("err", err).Error(msg)
}
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(statusCode)
errorJSON, _ := json.Marshal(struct {
Error string `json:"error"`
}{
Error: msg,
})
w.Write(errorJSON)
}

11
server/handler/healthz.go Normal file
View File

@@ -0,0 +1,11 @@
package handler
import "net/http"
// Healthz is used for our readiness and liveness probes.
// GET /_healthz
// Responds: 200
func Healthz(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
w.Write([]byte(http.StatusText(http.StatusOK)))
}