Press "Enter" to skip to content

Express Sipariş takip Rest Api

Selahaddin Erdoğan 0

İlk olarak  npm init –y komutu ile package.json oluşturulur. Oluşan dosyada scripts altında test ve start konfigürasyonları yapılır. Bu sayede proje terminalden npm start komutu ile kısayoldan çalıştırabilir.

“start”: “node src/index.js” –scripts altına yazılır.

Sıradaki adımda Express kurulumu yapılır. npm install express terminalden çalıştırılarak kurulum tamamlanır.

Artık geliştirmeye başlanabilir. İlk olarak src dizini altına index.js oluşturabiliriz. Daha sonra endpointe istek atabilmek için .http uzantılı dosya oluşturularak vs code içerisinde REST CLİENT eklentisi kurulur.

//express frameworkprojeye dahil edilir.

const express = require("express");

const { v4: uuidv4 } = require("uuid");//benzersiz id olusturmak icin id:uuidv4()
//app oluşturulur ve uygulama yapılandırmaları bu app üzerindne ilerler.

const app=express();

/**
* JSON formatındaki request body'leri parse etmek için kullanılır
* req.body'nin dolu gelmesini sağlar
*/
app.use(express.json());

const PORT = 3000;
const APIKEY = 'denemekey';

/**
* Başarılı response'lar için standart çıktı üreten yardımcı fonksiyon
* @param {string} message - Client'a dönecek mesaj
* @param {any} data - Response verisi
*/
function successResposne(message, data) {
const response = {
success: true,
error: null,
data: data,
meta: {
message: message,
version: "v1",
size: data ? data.length : 0,
timestamp: new Date().toISOString()
}
};
return response;
}

/**
* Hatalı response'lar için standart çıktı üreten yardımcı fonksiyon
* @param {string} message - Hata mesajı
*/
function errorResposne(message) {
const response = {
success: false,
error: { message },
data: null,
meta: {
version: "v1",
size: 0,
timestamp: new Date().toISOString()
}
};
return response;
}

/**
* API Key doğrulaması yapan global middleware
* Tüm endpoint'ler bu kontrolden geçer
*/
function middlewareConfing(req, res, next) {
const key = req.header('x-api-key');

if (!key) {
return res.status(401).json(errorResposne("Api key not null"));
}

if (key !== APIKEY) {
return res.status(403).json(errorResposne("Invalid Api Key"));
}

next(); // API key geçerli → bir sonraki middleware/route
}

/**
* Global middleware olarak API Key kontrolünü aktif eder
*/
app.use(middlewareConfing);

/**
* Orders endpointleri için router tanımı
*/
const router = express.Router();
app.use("/api/v1/orders", router);

/**
* Root endpoint (kontrol amaçlı)
*/
app.get("/", (req, res) => {
res.status(200).json(
successResposne("App runnig on default path /api/v1/orders", null)
);
});

/**
* Bellek içi sipariş listesi (mock data)
*/
const orders = [];
let id = 1;

/**
* Uygulama başlarken örnek bir sipariş eklenir
*/
orders.push({
id: id++,
orderName: "denem ürün",
customer: "selahaddin",
timestamp: new Date().toISOString()
});

/**
* Tüm siparişleri listeleyen endpoint
*/
router.get("/", (req, res) => {
return res.status(200).json(
successResposne("All orders listed", orders)
);
});

/**
* Yeni sipariş oluşturan endpoint
* validateBody middleware'i ile body doğrulaması yapılır
*/
router.post("/", validateBody, (req, res) => {
const { ordername, customer } = req.body;

const order = {
id: id++,
ordername,
customer,
timestamp: new Date().toISOString()
};

orders.push(order);

return res.status(201).json(
successResposne("order was created", order)
);
});

/**
* Request body validation middleware
* customer ve ordername alanlarının boş olup olmadığını kontrol eder
*/
function validateBody(req, res, next) {
const body = req.body;

if (!body) {
return res.status(400).json(
errorResposne("Request must not empty")
);
}

const { customer, ordername } = body;

if (!customer?.trim()) {
return res.status(400).json(
errorResposne("customer must not empty")
);
}

if (!ordername?.trim()) {
return res.status(400).json(
errorResposne("ordername must not empty")
);
}

next(); // Body geçerli → devam et
}

/**
* ID'ye göre sipariş getiren endpoint
* validateId ve checkOrder middleware'leri çalışır
*/
router.get("/:id", validateId, checkOrder, (req, res) => {
const order = orders[req.orderIndex];
return res.status(200).json(
successResposne("order listed", order)
);
});

/**
* ID'ye göre sipariş silen endpoint
*/
router.delete("/:id", validateId, checkOrder, (req, res) => {
orders.splice(req.orderIndex, 1);

return res.status(201).json(
successResposne("order was deleted", null)
);
});

/**
* Siparişin var olup olmadığını kontrol eden middleware
* Bulursa sipariş index'ini req.orderIndex içine yazar
*/
function checkOrder(req, res, next) {
const id = Number(req.params.id);
const orderIndex = orders.findIndex(a => a.id === id);

if (orderIndex === -1) {
return res.status(404).json(
errorResposne("order not found")
);
}

req.orderIndex = orderIndex;
next();
}

/**
* ID parametresinin geçerli bir sayı olup olmadığını kontrol eden middleware
*/
function validateId(req, res, next) {
const id = Number(req.params.id);

if (isNaN(id)) {
return res.status(404).json(
errorResposne("invalid id format")
);
}

next();
}

/**
* Var olan siparişi güncelleyen endpoint
*/
router.put("/:id", validateId, validateBody, checkOrder, (req, res) => {
const id = Number(req.params.id);
const { ordername, customer } = req.body;

const order = {
id,
customer,
ordername,
timestamp: new Date().toISOString()
};

orders[req.orderIndex] = order;

return res.status(201).json(
successResposne("order was updated", order)
);
});

/**
* Express server'ı belirtilen portta ayağa kaldırır
*/
app.listen(PORT, () => {
console.log("server is runnig on " + PORT + " port");
});

 

 

 

.http uzantılı test requestlerini barındıran dosya

 

 

 

### ROOT (API çalışıyor mu?)

GET http://localhost:3000/

x-api-key: denemekey




### GET ALL orderS

GET http://localhost:3000/api/v1/orders

x-api-key: denemekey



### GET order BY ID (başarılı)

GET http://localhost:3000/api/v1/orders/1

x-api-key: denemekey

### GET order BY ID (geçersiz id)

GET http://localhost:3000/api/v1/orders/abc

x-api-key: denemekey

### CREATE order

POST http://localhost:3000/api/v1/orders

Content-Type: application/json

x-api-key: denemekey

{

"orderName": "orderfield",

"customer": "testcustomer"

}


### UPDATE order

PUT http://localhost:3000/api/v1/orders/1

Content-Type: application/json

x-api-key: denemekey

{

"orderName": "OrderNameupdate",

"customer": "José Mauro"

}

### UPDATE order (bulunamaz)

PUT http://localhost:3000/api/v1/orders/999

Content-Type: application/json

x-api-key: denemekey

{

"orderName": "Test",

"customer": "Test"

}


### UPDATE order (bulunamaz)

DELETE  http://localhost:3000/api/v1/orders/3

Content-Type: application/json

x-api-key: denemekey


### DELETE order (bulunamaz)

DELETE http://localhost:3000/api/v1/orders/999

x-api-key: denemekey


### API KEY YOK (401)

GET http://localhost:3000/api/v1/orders

### API KEY HATALI (401)

GET http://localhost:3000/api/v1/orders

x-api-key: yanlışkey



### CREATE order (Eksik Alan - 400)

POST http://localhost:3000/api/v1/orders

Content-Type: application/json

x-api-key: denemekey


{

"orderName": "Eksik Alan"

}

Comments are closed.