diff --git a/packages/api-gateway/src/index.ts b/packages/api-gateway/src/index.ts index 5a264f6..8ad2886 100644 --- a/packages/api-gateway/src/index.ts +++ b/packages/api-gateway/src/index.ts @@ -5,6 +5,7 @@ app.use(express.json()); const USER_SERVICE = "http://user-service:3001"; const PRODUCT_SERVICE = "http://product-service:3002"; +const ORDER_SERVICE = "http://order-service:3005"; app.get("/users", async (_req, res) => { const response = await fetch(`${USER_SERVICE}/users`); @@ -44,6 +45,25 @@ app.post("/products", async (req, res) => { res.status(response.status).json(await response.json()); }); +app.get("/orders", async (_req, res) => { + const response = await fetch(`${ORDER_SERVICE}/orders`); + res.json(await response.json()); +}); + +app.get("/orders/:id", async (req, res) => { + const response = await fetch(`${ORDER_SERVICE}/orders/${req.params.id}`); + res.status(response.status).json(await response.json()); +}); + +app.post("/orders", async (req, res) => { + const response = await fetch(`${ORDER_SERVICE}/orders`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(req.body), + }); + res.status(response.status).json(await response.json()); +}); + app.listen(3000, () => { console.log("api-gateway listening on :3000"); }); diff --git a/packages/order-service/package.json b/packages/order-service/package.json new file mode 100644 index 0000000..d14fa2a --- /dev/null +++ b/packages/order-service/package.json @@ -0,0 +1,18 @@ +{ + "name": "@playground/order-service", + "version": "1.0.0", + "private": true, + "main": "dist/index.js", + "types": "dist/index.d.ts", + "scripts": { + "build": "tsc --build", + "start": "node dist/index.js" + }, + "dependencies": { + "@playground/database": "*", + "express": "^4.21.0" + }, + "devDependencies": { + "@types/express": "^5.0.0" + } +} diff --git a/packages/order-service/src/index.ts b/packages/order-service/src/index.ts new file mode 100644 index 0000000..0c15850 --- /dev/null +++ b/packages/order-service/src/index.ts @@ -0,0 +1,42 @@ +import express from "express"; +import { insert, findById, findAll } from "@playground/database"; + +const app = express(); +app.use(express.json()); + +const PRODUCT_SERVICE = "http://product-service:3002"; + +app.get("/orders", (_req, res) => { + res.json(findAll("orders")); +}); + +app.get("/orders/:id", (req, res) => { + const order = findById("orders", req.params.id); + if (!order) { + res.status(404).json({ error: "Order not found" }); + return; + } + res.json(order); +}); + +app.post("/orders", async (req, res) => { + const { productId, userId } = req.body; + + const productResponse = await fetch(`${PRODUCT_SERVICE}/products/${productId}`); + if (!productResponse.ok) { + res.status(400).json({ error: "Invalid product" }); + return; + } + + const order = insert("orders", { + id: crypto.randomUUID(), + productId, + userId, + status: "created", + }); + res.status(201).json(order); +}); + +app.listen(3005, () => { + console.log("order-service listening on :3005"); +}); diff --git a/packages/order-service/tsconfig.json b/packages/order-service/tsconfig.json new file mode 100644 index 0000000..98ab749 --- /dev/null +++ b/packages/order-service/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "rootDir": "src", + "outDir": "dist" + }, + "include": ["src"], + "references": [ + { "path": "../database" } + ] +} diff --git a/packages/product-service/src/index.ts b/packages/product-service/src/index.ts index be15f21..27fa01b 100644 --- a/packages/product-service/src/index.ts +++ b/packages/product-service/src/index.ts @@ -4,6 +4,8 @@ import { insert, findById, findAll } from "@playground/database"; const app = express(); app.use(express.json()); +const USER_SERVICE = "http://user-service:3001"; + app.get("/products", (_req, res) => { res.json(findAll("products")); }); @@ -22,6 +24,17 @@ app.post("/products", (req, res) => { res.status(201).json(product); }); +app.get("/products/:id/creator", async (req, res) => { + const product = findById("products", req.params.id); + if (!product) { + res.status(404).json({ error: "Product not found" }); + return; + } + const response = await fetch(`${USER_SERVICE}/users/${product.createdBy}`); + const creator = await response.json(); + res.json({ product, creator }); +}); + app.listen(3002, () => { console.log("product-service listening on :3002"); }); diff --git a/tsconfig.json b/tsconfig.json index a272970..517fbdf 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -5,6 +5,7 @@ { "path": "packages/user-service" }, { "path": "packages/product-service" }, { "path": "packages/api-gateway" }, - { "path": "packages/frontend" } + { "path": "packages/frontend" }, + { "path": "packages/order-service" } ] }