Skip to content

Commit

Permalink
Merge pull request #7 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 1f0c812 + 7bf427f commit 01a9989
Show file tree
Hide file tree
Showing 17 changed files with 437 additions and 5 deletions.
29 changes: 29 additions & 0 deletions apis/v1/handlers/get_seller_orders_handler.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package handlers

import (
"net/http"

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

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

orders, err := h.serviceImpl.GetSellerOrderList(ctx)
if err != nil {
h.log.Errorf("[ERR] Error from service layer := %v", err)
return err
}

resp := dto.OrdersResponse{
Code: http.StatusOK,
Message: "ok",
ResponseTime: datetime.GetDateString(),
Orders: *orders,
}

return ResponseJson(w, resp)

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

import (
"context"
"net/http"
"net/http/httptest"
"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_GetSellerOrdersHandler(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.MethodGet, constants.ListOrderSellerEndpoint, nil,
)
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().GetSellerOrderList(gomock.Any()).Return(
&[]entities.Order{
{
Id: 1,
Buyer: 2,
Seller: 1,
DeliverySource: "Source",
DeliveryDestination: "Destination",
Items: "Items",
Quantity: 4,
Price: "180000",
TotalPrice: "180000",
Status: 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.GetSellerOrdersHandler(tt.args.w, tt.args.r); (err != nil) != tt.wantErr {
t.Errorf("HandlerImpl.GetSellerOrdersHandler() error = %v, wantErr %v", err, tt.wantErr)
}
})
}
}
1 change: 1 addition & 0 deletions apis/v1/handlers/handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ type IHandler interface {
// Seller
CreateProductHandler(w http.ResponseWriter, r *http.Request) error
GetProductListsHandler(w http.ResponseWriter, r *http.Request) error
GetSellerOrdersHandler(w http.ResponseWriter, r *http.Request) error

// Buyer
CreateOrderHandler(w http.ResponseWriter, r *http.Request) error
Expand Down
1 change: 1 addition & 0 deletions apis/v1/repositories/order.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,5 @@ import (
//go:generate mockgen -source order.go -destination order_mock.go -package repositories
type IOrder interface {
CreateOrder(ctx context.Context, entity *entities.CreateOrder) error
SellerViewOrderList(ctx context.Context, id int) (order *[]entities.Order, err error)
}
15 changes: 15 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/services/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ type IService interface {
// Seller
CreateProduct(ctx context.Context, payload *dto.CreateProductRequest) error
GetProductsList(ctx context.Context, id int) (productList *[]entities.ProductListEntity, err error)
GetSellerOrderList(ctx context.Context) (orderList *[]entities.Order, err error)

// Buyer
CreateOrder(ctx context.Context, payload *dto.CreateOrderRequest) (resp *entities.OrderStatus, err error)
Expand Down
14 changes: 14 additions & 0 deletions apis/v1/services/service_impl.go
Original file line number Diff line number Diff line change
Expand Up @@ -148,3 +148,17 @@ func (s *ServiceImpl) CreateOrder(ctx context.Context, payload *dto.CreateOrderR
Status: constants.Pending,
}, nil
}

// GetSellerOrderList implements IService
func (s *ServiceImpl) GetSellerOrderList(ctx context.Context) (orderList *[]entities.Order, err error) {
idStr := ctx.Value("id").(string)
id, _ := strconv.Atoi(idStr)

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

return orders, nil
}
92 changes: 92 additions & 0 deletions apis/v1/services/service_impl_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -338,3 +338,95 @@ func TestServiceImpl_CreateOrder(t *testing.T) {
})
}
}

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

productMock := repositories.NewMockIProduct(ctrl)
buyerMock := repositories.NewMockIBuyer(ctrl)
sellerMock := repositories.NewMockISeller(ctrl)
orderMock := repositories.NewMockIOrder(ctrl)
log := logger.New("", "", "")
cfg := configs.Cfg

ctx := context.Background()
ctx = context.WithValue(ctx, "id", "1")

type args struct {
ctx context.Context
}
tests := []struct {
name string
args args
wantMock func()
wantOrderList *[]entities.Order
wantErr bool
}{
{
name: "Success",
args: args{
ctx: ctx,
},
wantMock: func() {
orderMock.EXPECT().SellerViewOrderList(gomock.Any(), gomock.Any()).
Return(
&[]entities.Order{
{
Id: 1,
Buyer: 2,
Seller: 1,
DeliverySource: "Source",
DeliveryDestination: "Destination",
Items: "Items",
Quantity: 4,
Price: "180000",
TotalPrice: "180000",
Status: entities.OrderStatus{
Message: constants.PendingMessage,
Status: constants.Pending,
},
},
}, nil)
},
wantOrderList: &[]entities.Order{
{
Id: 1,
Buyer: 2,
Seller: 1,
DeliverySource: "Source",
DeliveryDestination: "Destination",
Items: "Items",
Quantity: 4,
Price: "180000",
TotalPrice: "180000",
Status: entities.OrderStatus{
Message: constants.PendingMessage,
Status: constants.Pending,
},
},
},
wantErr: false,
},
}
for _, tt := range tests {
tt.wantMock()
t.Run(tt.name, func(t *testing.T) {
s := NewServiceImpl().
WithBuyer(buyerMock).
WithSeller(sellerMock).
WithProduct(productMock).
WithOrder(orderMock).
WithLog(log).
WithConfig(*cfg)
gotOrderList, err := s.GetSellerOrderList(tt.args.ctx)
if (err != nil) != tt.wantErr {
t.Errorf("ServiceImpl.GetSellerOrderList() error = %v, wantErr %v", err, tt.wantErr)
return
}
if !reflect.DeepEqual(gotOrderList, tt.wantOrderList) {
t.Errorf("ServiceImpl.GetSellerOrderList() = %v, want %v", gotOrderList, tt.wantOrderList)
}
})
}
}
15 changes: 15 additions & 0 deletions apis/v1/services/service_mock.go

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

5 changes: 3 additions & 2 deletions constants/constants.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,9 @@ const (
LoginEndpoint = "/api/v1/login"

// Seller
CreateProductEndpoint = "/api/v1/seller/create"
ListProductEndpoint = "/api/v1/seller/products"
CreateProductEndpoint = "/api/v1/seller/create"
ListProductEndpoint = "/api/v1/seller/products"
ListOrderSellerEndpoint = "/api/v1/seller/orders"

// Buyer
CreateOrderEndpoint = "/api/v1/order"
Expand Down
6 changes: 3 additions & 3 deletions dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,10 @@ RUN apk --no-cache add ca-certificates
WORKDIR /app

# Copy the executable from the build stage
COPY --from=build /app .
COPY --from=build /app/configs .
COPY configs/config.yaml /app/configs/config.yaml
COPY --from=build /app/app .

# Expose port 8080 for the container
# Expose port 9000 for the container
EXPOSE 9000

# Run the executable
Expand Down
50 changes: 50 additions & 0 deletions domain/order/order_impl.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"context"
"time"

"github.com/RyaWcksn/ecommerce/constants"
"github.com/RyaWcksn/ecommerce/entities"
"github.com/RyaWcksn/ecommerce/pkgs/errors"
)
Expand Down Expand Up @@ -54,3 +55,52 @@ func (o *OrderImpl) CreateOrder(ctx context.Context, entity *entities.CreateOrde

return nil
}

// SellerViewOrderList implements repositories.IOrder
func (o *OrderImpl) SellerViewOrderList(ctx context.Context, id int) (order *[]entities.Order, err error) {
ctxDb, cancel := context.WithTimeout(ctx, 3*time.Second)
defer cancel()

msg := constants.PendingMessage
stts := constants.Pending

var orderList []entities.Order

rows, err := o.DB.QueryContext(ctxDb, GetBySellerId, id)
if err != nil {
o.log.Errorf("[ERR] While query the data := %v", err)
return nil, errors.GetError(errors.InternalServer, err)
}
defer rows.Close()

for rows.Next() {
var order entities.Order
var status int64

if err := rows.Scan(
&order.Id,
&order.Buyer,
&order.Seller,
&order.DeliverySource,
&order.DeliveryDestination,
&order.Items,
&order.Quantity,
&order.Price,
&order.TotalPrice,
&status,
); err != nil {
o.log.Errorf("[ERR] While query the data := %v", err)
return nil, errors.GetError(errors.InternalServer, err)
}
order.Status.Message = msg
order.Status.Status = stts
if status > 0 {
order.Status.Message = constants.AcceptedMessage
order.Status.Status = constants.Accepted
}

orderList = append(orderList, order)

}
return &orderList, nil
}
Loading

0 comments on commit 01a9989

Please sign in to comment.