Skip to content

Commit

Permalink
Merge pull request #11 from zylcom/order
Browse files Browse the repository at this point in the history
feat: add cancel order api
  • Loading branch information
zylcom committed Aug 5, 2023
2 parents ebfe2da + 641d672 commit 87cc029
Show file tree
Hide file tree
Showing 5 changed files with 77 additions and 4 deletions.
43 changes: 43 additions & 0 deletions __test__/order.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -131,3 +131,46 @@ describe("GET /api/orders/:orderId", function () {
expect(result.body.data).toBeUndefined();
});
});

describe("POST /api/orders/:orderId/cancel", function () {
beforeEach(async () => {
await createTestUser();
});

afterEach(async () => {
await removeTestUser();
});

it("should can cancel order", async () => {
const order = await request.post("/api/orders").set("Authorization", token);
const result = await request.post(`/api/orders/${order.body.data.id}/cancel`).set("Authorization", token);

expect(result.status).toBe(200);
expect(result.body.data.id).toBe(order.body.data.id);
expect(result.body.data.status).toBe("canceled");
});

it("should reject if token is invalid", async () => {
const order = await request.post("/api/orders").set("Authorization", token);
const result = await request.post(`/api/orders/${order.body.data.id}/cancel`).set("Authorization", "invalid=token");

expect(result.status).toBe(401);
expect(result.body.data).toBeUndefined();
expect(result.body.errors).toBeDefined();
});

it("should reject if cancel other user order", async () => {
const user = await request
.post("/api/users")
.send({ username: "test-order", name: "Test Order", password: "rahasia123", phonenumberForm: { number: "+6288293106563", countryId: "ID" } });
const authUser = await request.post("/api/users/login").send({ username: user.body.data.username, password: "rahasia123" });
const product = await request.get("/api/products/pizza-0");
await request.put("/api/users/current/carts/items").set("Authorization", authUser.body.data.token).send({ productSlug: product.body.data.slug, quantity: 5 });
const order = await request.post("/api/orders").set("Authorization", authUser.body.data.token);
const result = await request.post(`/api/orders/${order.body.data.id}/cancel`).set("Authorization", token);

expect(result.status).toBe(404);
expect(result.body.data).toBeUndefined();
expect(result.body.errors).toBeDefined();
});
});
17 changes: 16 additions & 1 deletion src/controllers/order-controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -43,4 +43,19 @@ const get = async (req, res, next) => {
}
};

export default { create, checkout, get };
const cancel = async (req, res, next) => {
try {
const request = {
username: req.user.username,
orderId: req.params.orderId,
};

const result = await orderService.cancel(request);

res.status(200).send({ data: result });
} catch (error) {
next(error);
}
};

export default { create, checkout, get, cancel };
1 change: 1 addition & 0 deletions src/routes/api.js
Original file line number Diff line number Diff line change
Expand Up @@ -30,5 +30,6 @@ userRouter.delete("/api/products/:productSlug/like", likeProductController.neutr
userRouter.post("/api/orders", orderController.create);
userRouter.get("/api/orders/:orderId", orderController.get);
userRouter.post("/api/orders/checkout", orderController.checkout);
userRouter.post("/api/orders/:orderId/cancel", orderController.cancel);

export { userRouter };
16 changes: 14 additions & 2 deletions src/services/order-service.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import validate from "../validation/validation.js";
import { checkoutValidation, createOrderValidation, deleteOrderValidation, getOrderValidation } from "../validation/order-validation.js";
import { cancelOrderValidation, checkoutValidation, createOrderValidation, deleteOrderValidation, getOrderValidation } from "../validation/order-validation.js";
import { prismaClient } from "../app/database.js";
import { ResponseError } from "../errors/response-error.js";
import { stripe } from "../plugin/stripe.js";
Expand Down Expand Up @@ -140,4 +140,16 @@ const get = async (request) => {
return order.orders[0];
};

export default { create, checkout, get };
const cancel = async (request) => {
request = validate(cancelOrderValidation, request);

const order = await get(request);

if (!order) {
throw new ResponseError(404, "Order not found");
}

return prismaClient.order.update({ where: { id: order.id }, data: { status: "canceled" } });
};

export default { create, checkout, get, cancel };
4 changes: 3 additions & 1 deletion src/validation/order-validation.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,6 @@ const checkoutValidation = z

const getOrderValidation = z.object({ username: usernameValidation, orderId: orderIdValidation }).strict();

export { createOrderValidation, checkoutValidation, getOrderValidation };
const cancelOrderValidation = z.object({ username: usernameValidation, orderId: orderIdValidation }).strict();

export { createOrderValidation, checkoutValidation, getOrderValidation, cancelOrderValidation };

0 comments on commit 87cc029

Please sign in to comment.