Skip to content

Commit

Permalink
Merge pull request #8 from zylcom/controller
Browse files Browse the repository at this point in the history
feat: add get order api
  • Loading branch information
zylcom committed Aug 2, 2023
2 parents 23722f4 + a67dc8c commit 889fdbb
Show file tree
Hide file tree
Showing 16 changed files with 86 additions and 109 deletions.
11 changes: 0 additions & 11 deletions __test__/cart-item.test.js
Original file line number Diff line number Diff line change
@@ -1,17 +1,6 @@
import supertest from "supertest";
import { web } from "../src/app/web";
import { createTestUser, removeTestUser, token } from "./test-util";
import { logger } from "../src/app/logging";

jest.setTimeout(60000);

beforeAll(async () => {
logger.silent = true;
});

afterAll(async () => {
logger.silent = false;
});

describe("GET /api/users/current/carts/items/:productSlug", function () {
beforeEach(async () => {
Expand Down
11 changes: 0 additions & 11 deletions __test__/cart.test.js
Original file line number Diff line number Diff line change
@@ -1,19 +1,8 @@
import supertest from "supertest";
import { web } from "../src/app/web";
import { createTestUser, removeTestUser, token } from "./test-util";
import { logger } from "../src/app/logging";
import { calculateTotalPrice } from "../src/utils";

jest.setTimeout(60000);

beforeAll(() => {
logger.silent = true;
});

afterAll(() => {
logger.silent = false;
});

describe("GET /api/users/current/carts", function () {
beforeEach(async () => {
await createTestUser();
Expand Down
11 changes: 0 additions & 11 deletions __test__/category.test.js
Original file line number Diff line number Diff line change
@@ -1,17 +1,6 @@
import supertest from "supertest";
import { web } from "../src/app/web";
import { createTestCategory, removeTestCategory } from "./test-util";
import { logger } from "../src/app/logging";

jest.setTimeout(60000);

beforeAll(() => {
logger.silent = true;
});

afterAll(() => {
logger.silent = false;
});

describe("GET /api/categories", function () {
beforeEach(async () => {
Expand Down
7 changes: 0 additions & 7 deletions __test__/like-product.test.js
Original file line number Diff line number Diff line change
@@ -1,20 +1,13 @@
import supertest from "supertest";
import { web } from "../src/app/web";
import { createTestUser, removeTestUser, token } from "./test-util";
import { logger } from "../src/app/logging";

jest.setTimeout(60000);

beforeAll(async () => {
logger.silent = true;

await createTestUser();
});

afterAll(async () => {
await removeTestUser();

logger.silent = false;
});

describe("POST /api/products/:productSlug/like", function () {
Expand Down
54 changes: 30 additions & 24 deletions __test__/order.test.js
Original file line number Diff line number Diff line change
@@ -1,18 +1,6 @@
import supertest from "supertest";
import { createTestUser, removeManyCartItems, removeTestUser, token, username } from "./test-util";
import { web } from "../src/app/web";
import { logger } from "../src/app/logging";
import { calculateTotalPrice } from "../src/utils";

jest.setTimeout(60000);

beforeAll(async () => {
logger.silent = true;
});

afterAll(async () => {
logger.silent = false;
});
import { request } from "./setup";

describe("POST /api/orders", function () {
beforeEach(async () => {
Expand All @@ -24,8 +12,8 @@ describe("POST /api/orders", function () {
});

it("should can create new order", async () => {
const cart = await supertest(web).get("/api/users/current/carts").set("Authorization", token);
const result = await supertest(web).post("/api/orders").set("Authorization", token);
const cart = await request.get("/api/users/current/carts").set("Authorization", token);
const result = await request.post("/api/orders").set("Authorization", token);

expect(result.status).toBe(200);
expect(result.body.data.username).toBe(username);
Expand All @@ -35,7 +23,7 @@ describe("POST /api/orders", function () {
});

it("should reject if token is invalid", async () => {
const result = await supertest(web).post("/api/orders").set("Authorization", "invalid-token");
const result = await request.post("/api/orders").set("Authorization", "invalid-token");

expect(result.status).toBe(401);
expect(result.body.errors).toBeDefined();
Expand All @@ -45,7 +33,7 @@ describe("POST /api/orders", function () {
it("should reject if item is empty", async () => {
await removeManyCartItems();

const result = await supertest(web).post("/api/orders").set("Authorization", token);
const result = await request.post("/api/orders").set("Authorization", token);

expect(result.status).toBe(400);
expect(result.body.errors).toBeDefined();
Expand All @@ -63,31 +51,49 @@ describe("POST /api/orders/checkout", function () {
});

it("should can checkout order", async () => {
const order = await supertest(web).post("/api/orders").set("Authorization", token);
const result = await supertest(web).post("/api/orders/checkout").query({ orderId: order.body.data.id }).set("Authorization", token);
const order = await request.post("/api/orders").set("Authorization", token);
const result = await request.post("/api/orders/checkout").query({ id: order.body.data.id }).set("Authorization", token);

expect(result.status).toBe(200);
expect(result.body.data).toBeDefined();
expect(result.body.data).toHaveProperty("url");
});

it("should reject if token is invalid", async () => {
const order = await supertest(web).post("/api/orders").set("Authorization", token);
const result = await supertest(web).post("/api/orders/checkout").query({ orderId: order.body.data.id }).set("Authorization", "invalid-token");
const order = await request.post("/api/orders").set("Authorization", token);
const result = await request.post("/api/orders/checkout").query({ id: order.body.data.id }).set("Authorization", "invalid-token");

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

it("should return old session if not expired", async () => {
const order = await supertest(web).post("/api/orders").set("Authorization", token);
const oldSession = await supertest(web).post("/api/orders/checkout").query({ orderId: order.body.data.id }).set("Authorization", token);
const result = await supertest(web).post("/api/orders/checkout").query({ orderId: order.body.data.id }).set("Authorization", token);
const order = await request.post("/api/orders").set("Authorization", token);
const oldSession = await request.post("/api/orders/checkout").query({ id: order.body.data.id }).set("Authorization", token);
const result = await request.post("/api/orders/checkout").query({ id: order.body.data.id }).set("Authorization", token);

expect(result.status).toBe(200);
expect(result.body.data.sessionId).toBe(oldSession.body.data.sessionId);
expect(result.body.data.url).toBe(oldSession.body.data.url);
expect(result.body.data.createdAt).toBe(oldSession.body.data.createdAt);
});
});

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

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

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

expect(result.status).toBe(200);
expect(result.body.data.id).toBe(order.body.data.id);
});
});
11 changes: 0 additions & 11 deletions __test__/product.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,17 +11,6 @@ import {
removeTestProduct,
removeTestUser,
} from "./test-util";
import { logger } from "../src/app/logging";

jest.setTimeout(60000);

beforeAll(() => {
logger.silent = true;
});

afterAll(() => {
logger.silent = false;
});

describe("GET /api/products/:slug", function () {
beforeEach(async () => {
Expand Down
7 changes: 0 additions & 7 deletions __test__/review.test.js
Original file line number Diff line number Diff line change
@@ -1,20 +1,13 @@
import supertest from "supertest";
import { web } from "../src/app/web";
import { createTestUser, name, phonenumberForm, removeTestReview, removeTestUser, token, username } from "./test-util";
import { logger } from "../src/app/logging";

jest.setTimeout(60000);

beforeAll(async () => {
logger.silent = true;

await createTestUser();
});

afterAll(async () => {
await removeTestUser();

logger.silent = false;
});

describe("POST /api/products/reviews", function () {
Expand Down
13 changes: 13 additions & 0 deletions __test__/setup.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import supertest from "supertest";
import { logger } from "../src/app/logging.js";
import { web } from "../src/app/web.js";

beforeAll(async () => {
logger.silent = true;
});

afterAll(async () => {
logger.silent = false;
});

export const request = supertest(web);
7 changes: 0 additions & 7 deletions __test__/tag.test.js
Original file line number Diff line number Diff line change
@@ -1,20 +1,13 @@
import supertest from "supertest";
import { web } from "../src/app/web";
import { createTestUser, removeTestUser } from "./test-util";
import { logger } from "../src/app/logging";

jest.setTimeout(60000);

beforeAll(async () => {
logger.silent = true;

await createTestUser();
});

afterAll(async () => {
await removeTestUser();

logger.silent = false;
});

describe("/api/tags", function () {
Expand Down
11 changes: 0 additions & 11 deletions __test__/user.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,6 @@ import bcrypt from "bcrypt";
import supertest from "supertest";
import { web } from "../src/app/web.js";
import { name, password, phonenumberForm, username, createTestUser, removeTestUser, token, getTestUser } from "./test-util.js";
import { logger } from "../src/app/logging.js";

jest.setTimeout(60000);

beforeAll(() => {
logger.silent = true;
});

afterAll(() => {
logger.silent = false;
});

describe("POST /api/users", function () {
afterEach(async () => {
Expand Down
10 changes: 10 additions & 0 deletions jest.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
const config = {
setupFilesAfterEnv: ["./__test__/setup.js"],
verbose: true,
testTimeout: 60000,
transform: {
"^.+\\.[t|j]sx?$": "babel-jest",
},
};

export default config;
5 changes: 0 additions & 5 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,6 @@
"test": "jest -i",
"postinstall": "prisma generate"
},
"jest": {
"transform": {
"^.+\\.[t|j]sx?$": "babel-jest"
}
},
"prisma": {
"seed": "node prisma/seed.js"
},
Expand Down
14 changes: 13 additions & 1 deletion src/controllers/order-controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,4 +28,16 @@ const checkout = async (req, res, next) => {
}
};

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

const result = await orderService.get(orderId);

res.status(200).set("Cache-Control", "public, max-age=0, s-maxage=1, stale-while-revalidate=30").send({ data: result });
} catch (error) {
next(error);
}
};

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

userRouter.post("/api/orders", orderController.create);
userRouter.get("/api/orders/:orderId", orderController.get);
userRouter.post("/api/orders/checkout", orderController.checkout);

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 } from "../validation/order-validation.js";
import { checkoutValidation, createOrderValidation, 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 @@ -125,4 +125,16 @@ const checkout = async (request) => {
});
};

export default { create, checkout };
const get = async (orderId) => {
orderId = validate(getOrderValidation, orderId);

const order = await prismaClient.order.findUnique({ where: { id: orderId } });

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

return order;
};

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

export { createOrderValidation, checkoutValidation };
const getOrderValidation = z.coerce
.number({ invalid_type_error: "Order id must be number!", required_error: "Order id is required!" })
.positive({ message: "Order id must be positive number!" });

export { createOrderValidation, checkoutValidation, getOrderValidation };

0 comments on commit 889fdbb

Please sign in to comment.