Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 1 addition & 4 deletions actions/actions.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,7 @@ package actions

import "orders/entity"

type OrderCreator interface {
Create() *entity.Order
}

// Action interfaces to be implemented.
type ProductAdder interface {
AddProduct(order *entity.Order, product *entity.Product)
}
Expand Down
38 changes: 38 additions & 0 deletions actions/createOrder.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package actions

import (
"github.com/google/uuid"
"orders/entity"
"orders/repository"
"time"
)

// NewOrderRequest.
type NewOrderRequest struct{}

// CreateOrder action.
type CreateOrder struct {
repo repository.OrderRepository
}

// Constructor.
func NewCreateOrder(repo repository.OrderRepository) *CreateOrder {
return &CreateOrder{
repo: repo,
}
}

func (action *CreateOrder) Create(r NewOrderRequest) (*entity.Order, error) {
order := &entity.Order{
Uuid: uuid.New().String(),
CreatedAt: time.Now(),
}

err := action.repo.Save(order)

if err != nil {
return nil, err
}

return order, nil
}
9 changes: 5 additions & 4 deletions entity/order.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,9 @@ package entity
import "time"

type Order struct {
customerId string
products []Product
paymentId string
createdAt time.Time
Uuid string
CustomerId string
Products []Product
PaymentId string
CreatedAt time.Time
}
5 changes: 5 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
module orders

go 1.20

require (
github.com/google/uuid v1.3.0
github.com/gorilla/mux v1.8.0
)
4 changes: 4 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI=
github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
37 changes: 37 additions & 0 deletions main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package main

import (
"log"
"net/http"
"orders/actions"
"orders/repository"
"orders/rest"
"time"

"github.com/gorilla/mux"
)

func main() {
// Entity repository.
repo := repository.NewInMemoryOrderRepo()

// Rest json responder.
respndr:=rest.NewResponder("2006-01-02 15:04:05")

// New order controller.
cntrlr := rest.NewCreateOrder(actions.NewCreateOrder(repo), respndr)

// Router and server.
r := mux.NewRouter()
r.HandleFunc("/create", cntrlr.Create)

srv := &http.Server{
Handler: r,
Addr: "127.0.0.1:8081",
WriteTimeout: 15 * time.Second,
ReadTimeout: 15 * time.Second,
}

log.Fatal(srv.ListenAndServe())

}
30 changes: 28 additions & 2 deletions repository/order.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,33 @@ package repository
import "orders/entity"

// Persists Order to db, filesystem, etc.
type orderRepository interface {
Save(order entity.Order)
type OrderRepository interface {
Save(order *entity.Order) error
FindById(orderId string) *entity.Order
}

// InMemoryOrderRepo.
type InMemoryOrderRepo struct {
orders map[string]*entity.Order
}

// Constructor.
func NewInMemoryOrderRepo() *InMemoryOrderRepo {
return &InMemoryOrderRepo{
orders: make(map[string]*entity.Order),
}
}

func (repo *InMemoryOrderRepo) Save(order *entity.Order) error {
repo.orders[order.Uuid] = order
return nil
}

func (repo *InMemoryOrderRepo) FindById(orderId string) *entity.Order {
for _, order := range repo.orders {
if order.Uuid == orderId {
return order
}
}
return nil
}
30 changes: 30 additions & 0 deletions rest/createOrder.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package rest

import (
"net/http"
"orders/actions"
)

// Create order controller.
type CreateOrder struct {
action *actions.CreateOrder
rspndr *Responder
}

// Constructor.
func NewCreateOrder(action *actions.CreateOrder, rspndr *Responder) *CreateOrder {
return &CreateOrder{
action: action,
rspndr: rspndr,
}
}

func (c *CreateOrder) Create(w http.ResponseWriter, r *http.Request) {
order, err := c.action.Create(actions.NewOrderRequest{})

if err != nil {
c.rspndr.Error(w, http.StatusInternalServerError, err.Error())
}

c.rspndr.Success(w, order)
}
52 changes: 52 additions & 0 deletions rest/responder.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package rest

import (
"encoding/json"
"net/http"
"time"
)

// JSON response object.
type Response struct {
Date string `json:"date"`
Message string `json:"message"`
Payload interface{} `json:"payload"`
}

func NewResponse() *Response {
return &Response{}
}

// Responder.
type Responder struct {
dateFormat string
}

func NewResponder(dateFormat string) *Responder {
return &Responder{dateFormat: dateFormat}
}

func (rspndr *Responder) Error(w http.ResponseWriter, statusCode int, message string) {
// Build json response.
r := NewResponse()
r.Date = time.Now().Format(rspndr.dateFormat)
r.Message = message

// Send response.
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(statusCode)
json.NewEncoder(w).Encode(r)
}

func (rspndr *Responder) Success(w http.ResponseWriter, payload interface{}) {
// Build json response.
r := NewResponse()
r.Date = time.Now().Format(rspndr.dateFormat)
r.Message = "ok"
r.Payload = payload

// Send response.
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusOK)
json.NewEncoder(w).Encode(r)
}