diff --git a/cmd/api/handlers-api.go b/cmd/api/handlers-api.go index ed304d1..80d4e10 100644 --- a/cmd/api/handlers-api.go +++ b/cmd/api/handlers-api.go @@ -1,6 +1,7 @@ package main import ( + "bytes" "encoding/json" "errors" "fmt" @@ -103,6 +104,17 @@ func (app *application) GetWidgetByID(w http.ResponseWriter, r *http.Request) { w.Write(out) } +type Invoice struct { + ID int `json:"id"` + Quantity int `json:"quantity"` + Amount int `json:"amount"` + Product string `json:"product"` + FirstName string `json:"first_name"` + LastName string `json:"last_name"` + Email string `json:"email"` + CreatedAt time.Time `json:"created_at"` +} + func (app *application) CreateCustomerAndSubscribeToPlan(w http.ResponseWriter, r *http.Request) { var data stripePayload @@ -183,11 +195,27 @@ func (app *application) CreateCustomerAndSubscribeToPlan(w http.ResponseWriter, Amount: amount, } - _, err = app.SaveOrder(order) + orderID, err := app.SaveOrder(order) if err != nil { app.errorLog.Println(err) return } + + inv := Invoice{ + ID: orderID, + Quantity: order.Quantity, + Amount: order.Amount, + Product: "Bronze Plan", + FirstName: data.FirstName, + LastName: data.LastName, + Email: data.Email, + CreatedAt: time.Now(), + } + err = app.callInvoiceMicro(inv) + if err != nil { + app.errorLog.Println(err) + // Don't stop the program + } } resp := JSONResponse{ @@ -205,6 +233,30 @@ func (app *application) CreateCustomerAndSubscribeToPlan(w http.ResponseWriter, w.Write(out) } +func (app *application) callInvoiceMicro(inv Invoice) error { + // TODO: Do not hard code this. + url := "http://localhost:5000/invoice/create-and-send" + out, err := json.MarshalIndent(inv, "", "\t") + if err != err { + return err + } + + req, err := http.NewRequest("POST", url, bytes.NewBuffer(out)) + if err != nil { + return nil + } + req.Header.Set("Content-Type", "application/json") + client := &http.Client{} + resp, err := client.Do(req) + if err != nil { + return err + } + defer resp.Body.Close() + app.infoLog.Println(resp.Body) + + return nil +} + func (app *application) SaveCustomer(firstName, lastName, email string) (int, error) { customer := models.Customer{ FirstName: firstName, diff --git a/cmd/micro/invoice/invoice-handlers.go b/cmd/micro/invoice/invoice-handlers.go index 88baf2d..6b6f068 100644 --- a/cmd/micro/invoice/invoice-handlers.go +++ b/cmd/micro/invoice/invoice-handlers.go @@ -17,7 +17,7 @@ type Order struct { FirstName string `json:"first_name"` LastName string `json:"last_name"` Email string `json:"email"` - CreatedAt time.Time `json:"-"` + CreatedAt time.Time `json:"created_at"` } func (app *application) CreateAndSendInvoice(w http.ResponseWriter, r *http.Request) { @@ -29,6 +29,7 @@ func (app *application) CreateAndSendInvoice(w http.ResponseWriter, r *http.Requ app.badRequest(w, r, err) return } + app.infoLog.Println(order) // generate a pdf invoice err = app.createInvoicePDF(order) diff --git a/cmd/web/handlers.go b/cmd/web/handlers.go index eac3487..56d6b9b 100644 --- a/cmd/web/handlers.go +++ b/cmd/web/handlers.go @@ -1,6 +1,8 @@ package main import ( + "bytes" + "encoding/json" "fmt" "myapp/internal/cards" "myapp/internal/cards/encryption" @@ -8,6 +10,7 @@ import ( "myapp/internal/urlsigner" "net/http" "strconv" + "time" "github.com/go-chi/chi/v5" ) @@ -95,6 +98,17 @@ func (app *application) GetTransactionData(r *http.Request) (TransactionData, er return txnData, nil } +type Invoice struct { + ID int `json:"id"` + Quantity int `json:"quantity"` + Amount int `json:"amount"` + Product string `json:"product"` + FirstName string `json:"first_name"` + LastName string `json:"last_name"` + Email string `json:"email"` + CreatedAt time.Time `json:"created_at"` +} + func (app *application) PaymentSucceeded(w http.ResponseWriter, r *http.Request) { // read posted data err := r.ParseForm() @@ -150,6 +164,24 @@ func (app *application) PaymentSucceeded(w http.ResponseWriter, r *http.Request) app.errorLog.Println(err) return } + // call microservice + inv := Invoice{ + ID: orderID, + Quantity: order.Quantity, + Amount: order.Amount, + Product: "Widget", + FirstName: txnData.FirstName, + LastName: txnData.LastName, + Email: txnData.Email, + CreatedAt: time.Now(), + } + + err = app.callInvoiceMicro(inv) + if err != nil { + app.errorLog.Println(err) + // Don't stop the program + } + app.infoLog.Printf("order id: %d", orderID) app.Session.Put(r.Context(), "txn", txnData) @@ -157,6 +189,30 @@ func (app *application) PaymentSucceeded(w http.ResponseWriter, r *http.Request) http.Redirect(w, r, "/receipt", http.StatusSeeOther) } +func (app *application) callInvoiceMicro(inv Invoice) error { + // TODO: Do not hard code this. + url := "http://localhost:5000/invoice/create-and-send" + out, err := json.MarshalIndent(inv, "", "\t") + if err != err { + return err + } + + req, err := http.NewRequest("POST", url, bytes.NewBuffer(out)) + if err != nil { + return nil + } + req.Header.Set("Content-Type", "application/json") + client := &http.Client{} + resp, err := client.Do(req) + if err != nil { + return err + } + defer resp.Body.Close() + app.infoLog.Println(resp.Body) + + return nil +} + func (app *application) VirtualTerminalPaymentSucceeded(w http.ResponseWriter, r *http.Request) { txnData, err := app.GetTransactionData(r) if err != nil {