A comprehensive backend API for managing library operations including book management, member management, and borrowing services. Built with Node.js, Express.js, TypeScript, and Prisma ORM, this system provides a robust solution for libraries to digitize their operations.
- Node.js
- Express.js
- TypeScript
- PostgreSQL
- Prisma ORM
{
"dependencies": {
"@prisma/client": "^5.22.0",
"cors": "^2.8.5",
"express": "^4.21.1"
}
}
{
"devDependencies": {
"@types/cors": "^2.8.17",
"@types/express": "^5.0.0",
"@types/node": "^22.9.0",
"prisma": "^5.22.0",
"tsx": "^4.19.2",
"typescript": "^5.6.3"
}
}
-
Clone the repository
git clone <repository-url> cd <repository>
-
Install dependencies
npm install
-
Environment Setup Create a
.env
file in the root directory and add the following:DATABASE_URL="postgresql://USER:PASSWORD@HOST:PORT/DATABASE" DIRECT_URL="postgresql://USER:PASSWORD@HOST:PORT/DATABASE"
-
Database Setup
npx prisma migrate dev
-
Run the Application
- For development:
npm run dev
- For production:
npm run build npm start
- For development:
- Create, Read, Update, and Delete books
- Track total and available copies
- Manage book metadata (title, genre, published year)
- Register new library members
- Update member information
- Track membership details
- Remove members from the system
- Borrow books with automatic availability tracking
- Return books with date tracking
- View overdue books
- 14-day borrowing period
POST /api/books
Request Body:
{
"title": "To Kill a Mockingbird",
"genre": "Fiction",
"publishedYear": 1960,
"totalCopies": 10,
"availableCopies": 10
}
Response (201):
{
"success": true,
"status": 201,
"message": "Book created successfully",
"data": {
"bookId": "a24df67b-1234-5678-9101-b2a3c5d7f9b1",
"title": "To Kill a Mockingbird",
"genre": "Fiction",
"publishedYear": 1960,
"totalCopies": 10,
"availableCopies": 10
}
}
GET /api/books
Response (200):
{
"success": true,
"status": 200,
"message": "Books retrieved successfully",
"data": [
{
"bookId": "a24df67b-1234-5678-9101-b2a3c5d7f9b1",
"title": "To Kill a Mockingbird",
"genre": "Fiction",
"publishedYear": 1960,
"totalCopies": 10,
"availableCopies": 10
}
]
}
GET /api/books/:bookId
Response (200):
{
"success": true,
"status": 200,
"message": "Book retrieved successfully",
"data": {
"bookId": "a24df67b-1234-5678-9101-b2a3c5d7f9b1",
"title": "To Kill a Mockingbird",
"genre": "Fiction",
"publishedYear": 1960,
"totalCopies": 10,
"availableCopies": 10
}
}
PUT /api/books/:bookId
Request Body:
{
"title": "To Kill a Mockingbird - Revised",
"genre": "Classic Fiction",
"publishedYear": 1961,
"totalCopies": 12,
"availableCopies": 8
}
Response (200):
{
"success": true,
"status": 200,
"message": "Book updated successfully",
"data": {
"bookId": "a24df67b-1234-5678-9101-b2a3c5d7f9b1",
"title": "To Kill a Mockingbird - Revised",
"genre": "Classic Fiction",
"publishedYear": 1961,
"totalCopies": 12,
"availableCopies": 8
}
}
DELETE /api/books/:bookId
Response (200):
{
"success": true,
"status": 200,
"message": "Book successfully deleted"
}
POST /api/members
Request Body:
{
"name": "Alice Johnson",
"email": "alice@example.com",
"phone": "123-456-7890",
"membershipDate": "2024-01-01T00:00:00.000Z"
}
Response (201):
{
"success": true,
"status": 201,
"message": "Member created successfully",
"data": {
"memberId": "8765-4321-1098",
"name": "Alice Johnson",
"email": "alice@example.com",
"phone": "123-456-7890",
"membershipDate": "2024-01-01T00:00:00.000Z"
}
}
GET /api/members
Response (200):
{
"success": true,
"status": 200,
"message": "Members retrieved successfully",
"data": [
{
"memberId": "8765-4321-1098",
"name": "Alice Johnson",
"email": "alice@example.com",
"phone": "123-456-7890",
"membershipDate": "2024-01-01T00:00:00.000Z"
}
]
}
GET /api/members/:memberId
Response (200):
{
"success": true,
"status": 200,
"message": "Member retrieved successfully",
"data": {
"memberId": "8765-4321-1098",
"name": "Alice Johnson",
"email": "alice@example.com",
"phone": "123-456-7890",
"membershipDate": "2024-01-01T00:00:00.000Z"
}
}
PUT /api/members/:memberId
Request Body:
{
"name": "Alice Johnson",
"email": "alice.johnson@example.com",
"phone": "098-765-4321"
}
Response (200):
{
"success": true,
"status": 200,
"message": "Member updated successfully",
"data": {
"memberId": "8765-4321-1098",
"name": "Alice Johnson",
"email": "alice.johnson@example.com",
"phone": "098-765-4321"
}
}
DELETE /api/members/:memberId
Response (200):
{
"success": true,
"status": 200,
"message": "Member successfully deleted"
}
POST /api/borrow
Request Body:
{
"bookId": "a24df67b-1234-5678-9101-b2a3c5d7f9b1",
"memberId": "a24df67b-1234-5678-9101-b2a3c5d7f098"
}
Response (200):
{
"success": true,
"status": 200,
"message": "Book borrowed successfully",
"data": {
"borrowId": "a24df67b-1234-5678-9101-b2a3c5d7f",
"bookId": "a24df67b-1234-5678-9101-b2a3c5d7f9b1",
"memberId": "8765-4321-1098",
"borrowDate": "2024-09-01T10:00:00.000Z"
}
}
POST /api/return
Request Body:
{
"borrowId": "a24df67b-1234-5678-9101-b2a3c5d7f"
}
Response (200):
{
"success": true,
"status": 200,
"message": "Book returned successfully"
}
GET /api/borrow/overdue
Response (200):
{
"success": true,
"status": 200,
"message": "Overdue borrow list fetched",
"data": [
{
"borrowId": "b1234",
"bookTitle": "To Kill a Mockingbird",
"borrowerName": "John Doe",
"overdueDays": 5
}
]
}
All endpoints may return error responses in the following format:
{
"success": false,
"status": 400,
"message": "Error message description"
}
Common status codes:
- 400: Bad Request
- 404: Not Found
- 500: Internal Server Error
-
Email Validation
- The system currently lacks email validation for member registration
- Future updates will implement proper email format validation
-
Book Availability Tracking
- The
availableCopies
count is not automatically decremented when books are borrowed - Manual update of available copies is required
- The