Skip to content

Commit

Permalink
Merge pull request #6 from RyaWcksn/DEV-0001
Browse files Browse the repository at this point in the history
Dev 0001
  • Loading branch information
RyaWcksn authored Apr 7, 2023
2 parents 1a44fcc + 16a8168 commit 1f0c812
Show file tree
Hide file tree
Showing 34 changed files with 807 additions and 36 deletions.
49 changes: 49 additions & 0 deletions apis/v1/handlers/create_order_handler.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package handlers

import (
"encoding/json"
"io"
"net/http"

"github.com/RyaWcksn/ecommerce/dto"
"github.com/RyaWcksn/ecommerce/pkgs/datetime"
"github.com/RyaWcksn/ecommerce/pkgs/errors"
"github.com/RyaWcksn/ecommerce/pkgs/validations"
)

// CreateOrderHandler implements IHandler
func (h *HandlerImpl) CreateOrderHandler(w http.ResponseWriter, r *http.Request) error {
ctx := r.Context()

payload := dto.CreateOrderRequest{}
body, err := io.ReadAll(r.Body)
if err != nil {
h.log.Errorf("[ERR] While read body := %v", err)
return errors.GetError(errors.InternalServer, err)
}
if err = json.Unmarshal(body, &payload); err != nil {
h.log.Errorf("[ERR] While unmarshal body := %v", err)
return errors.GetError(errors.InternalServer, err)
}

if err = validations.Validate(payload); err != nil {
h.log.Errorf("[ERR] While validating body := %v", err)
return errors.GetError(errors.InvalidRequest, err)
}

status, err := h.serviceImpl.CreateOrder(ctx, &payload)
if err != nil {
h.log.Errorf("[ERR] From service layer := %v", err)
return err
}

resp := dto.CreateOrderResponse{
Code: http.StatusOK,
Message: "ok",
ResponseTime: datetime.GetDateString(),
Order: *status,
}

return ResponseJson(w, resp)

}
72 changes: 72 additions & 0 deletions apis/v1/handlers/create_order_handler_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
package handlers

import (
"context"
"net/http"
"net/http/httptest"
"strings"
"testing"

"github.com/RyaWcksn/ecommerce/apis/v1/services"
"github.com/RyaWcksn/ecommerce/constants"
"github.com/RyaWcksn/ecommerce/entities"
"github.com/RyaWcksn/ecommerce/pkgs/logger"
"github.com/golang/mock/gomock"
)

func TestHandlerImpl_CreateOrderHandler(t *testing.T) {
ctrl := gomock.NewController(t)
defer ctrl.Finish()

s := services.NewMockIService(ctrl)
l := logger.New("", "", "")
r := httptest.NewRecorder()
type args struct {
w http.ResponseWriter
r *http.Request
}
tests := []struct {
name string
args args
wantMock func()
wantErr bool
}{
{
name: "Success",
args: args{
w: r,
r: func() *http.Request {
req := httptest.NewRequest(
http.MethodPost, constants.CreateOrderEndpoint, strings.NewReader(
`{
"productId": [1],
"sellerId": 1
}`,
),
)
ctx := context.Background()
req.Header.Add("Authorization", "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdXRob3JpemVkIjp0cnVlLCJlbWFpbCI6InVzZXJAbWFpbC5jb20iLCJleHAiOjE2ODA4NDA2MTAsImlkIjoxLCJyb2xlIjoic2VsbGVyIn0.BqlpOmIFBGlWZYKvoRqPhD8_q4Smwob0QV47vIVz0QU")
ctx = context.WithValue(ctx, "id", "1")
return req.WithContext(ctx)
}(),
},
wantMock: func() {
s.EXPECT().CreateOrder(gomock.Any(), gomock.Any()).Return(
&entities.OrderStatus{
Message: constants.PendingMessage,
Status: constants.Pending,
}, nil,
)
},
},
}
for _, tt := range tests {
tt.wantMock()
t.Run(tt.name, func(t *testing.T) {
h := NewHandlerImpl(s, l)
if err := h.CreateOrderHandler(tt.args.w, tt.args.r); (err != nil) != tt.wantErr {
t.Errorf("HandlerImpl.CreateOrderHandler() error = %v, wantErr %v", err, tt.wantErr)
}
})
}
}
3 changes: 3 additions & 0 deletions apis/v1/handlers/handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@ type IHandler interface {
// Seller
CreateProductHandler(w http.ResponseWriter, r *http.Request) error
GetProductListsHandler(w http.ResponseWriter, r *http.Request) error

// Buyer
CreateOrderHandler(w http.ResponseWriter, r *http.Request) error
}

type HandlerImpl struct {
Expand Down
1 change: 1 addition & 0 deletions apis/v1/repositories/buyer.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,5 @@ import (
//go:generate mockgen -source buyer.go -destination buyer_mock.go -package repositories
type IBuyer interface {
GetEmail(ctx context.Context, email string) (resp *entities.LoginEntity, err error)
GetData(ctx context.Context, id int) (resp *entities.BuyerEntity, err error)
}
15 changes: 15 additions & 0 deletions apis/v1/repositories/buyer_mock.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 9 additions & 1 deletion apis/v1/repositories/order.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,12 @@
package repositories

import (
"context"

"github.com/RyaWcksn/ecommerce/entities"
)

//go:generate mockgen -source order.go -destination order_mock.go -package repositories
type IOrder interface{}
type IOrder interface {
CreateOrder(ctx context.Context, entity *entities.CreateOrder) error
}
18 changes: 18 additions & 0 deletions apis/v1/repositories/order_mock.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions apis/v1/repositories/product.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,5 @@ type IProduct interface {
// Seller
CreateProduct(ctx context.Context, entity *entities.CreateProductEntity) error
ListProduct(ctx context.Context, id int) (products *[]entities.ProductListEntity, err error)
GetProductById(ctx context.Context, id int) (product *entities.ProductListEntity, err error)
}
15 changes: 15 additions & 0 deletions apis/v1/repositories/product_mock.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions apis/v1/repositories/seller.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,5 @@ import (
//go:generate mockgen -source seller.go -destination seller_mock.go -package repositories
type ISeller interface {
GetEmail(ctx context.Context, email string) (resp *entities.LoginEntity, err error)
GetData(ctx context.Context, id int) (resp *entities.SellerEntity, err error)
}
15 changes: 15 additions & 0 deletions apis/v1/repositories/seller_mock.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions apis/v1/services/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@ type IService interface {
// Seller
CreateProduct(ctx context.Context, payload *dto.CreateProductRequest) error
GetProductsList(ctx context.Context, id int) (productList *[]entities.ProductListEntity, err error)

// Buyer
CreateOrder(ctx context.Context, payload *dto.CreateOrderRequest) (resp *entities.OrderStatus, err error)
}

type ServiceImpl struct {
Expand Down
59 changes: 59 additions & 0 deletions apis/v1/services/service_impl.go
Original file line number Diff line number Diff line change
Expand Up @@ -89,3 +89,62 @@ func (s *ServiceImpl) GetProductsList(ctx context.Context, id int) (productList
return products, nil

}

// CreateOrder implements IService
func (s *ServiceImpl) CreateOrder(ctx context.Context, payload *dto.CreateOrderRequest) (resp *entities.OrderStatus, err error) {
idStr := ctx.Value("id").(string)
id, _ := strconv.Atoi(idStr)
fmt.Println("ID", id)

buyerData, err := s.buyerImpl.GetData(ctx, id)
if err != nil {
s.log.Errorf("[ERR] Error while getting buyer data := %v", err)
return nil, err
}

sellerData, err := s.sellerImpl.GetData(ctx, payload.SellerId)
if err != nil {
s.log.Errorf("[ERR] Error while getting seller data := %v", err)
return nil, err
}

var items string
var total int
var grandTotal string
var quantity int
for _, productId := range payload.ProductId {
product, err := s.productImpl.GetProductById(ctx, productId)
if err != nil {
s.log.Errorf("[ERR] Error while getting product data := %v", err)
return nil, err
}
price, _ := strconv.Atoi(product.Price)
total += price
items += ", " + product.ProductName
grandTotal = strconv.Itoa(total)
quantity++
}

createOrderEntity := entities.CreateOrder{
Buyer: id,
Seller: payload.SellerId,
DeliverySource: buyerData.AlamatPengiriman,
DeliveryDestination: sellerData.AlamatPickup,
Items: items,
Quantity: quantity,
Price: strconv.Itoa(total),
TotalPrice: grandTotal,
Status: 0,
}

err = s.orderImpl.CreateOrder(ctx, &createOrderEntity)
if err != nil {
s.log.Errorf("[ERR] Error while create order := %v", err)
return nil, err
}

return &entities.OrderStatus{
Message: constants.PendingMessage,
Status: constants.Pending,
}, nil
}
Loading

0 comments on commit 1f0c812

Please sign in to comment.