A Flask based API that allows users to register, login & book train tickets along with API key-based authentication for admins.
- Admin privileges - Add, Update, Delete train/s
- User privileges - Register, Login, Check Seat Availability, Book Seat/s, Check Booking info
- Optimized for handling race conditions by holding a lock for ongoing transaction
- Admin API endpoints are secured by API Key which are known to Admin and Host
- JWT-based authentication token system for user login with 1 hour expiration window
- Python3 (Prerequisite)
- Flask
- Flask-SQLAlchemy
- Flask-JWT-Extended
- MySQL (Prerequisite)
- dotenv for environment variable management
git clone https://github.com/BelieveInTheLimitless/IRCTC-API
cd IRCTC-API
#Login to the database
mysql -u root -p
#Create database
CREATE DATABASE railway_db;
#Create user
CREATE USER 'user'@'localhost' IDENTIFIED BY 'password';
#Grant privileges
GRANT ALL PRIVILEGES ON railway_db.* TO 'user'@'localhost';
#Update privileges
FLUSH PRIVILEGES;
#Exit
EXIT;
# Common
python3 -m venv .venv
# For Linux
source .venv/bin/activate
# For Windows
.venv\Scripts\activate
pip3 install -r requirements.txt
python3 app.py
-
Add Train
POST /admin/add_train
- Request Headers
ADMIN-API-KEY: <API_KEY>
- Request Body
{ "name": "Express Train", "source": "Pune", "destination": "Thane", "total_seats": 100 }
- Response
{ "message": "Train added successfully" "train_id": 1 }
- Request Headers
-
Update Train
PUT /admin/update_train/<train_id>
- Request Headers
ADMIN-API-KEY: <API_KEY>
- Request Body
{ "name": "New Express Train", "source": "Mumbai", "destination": "Delhi", "total_seats": 200 }
- Response
{ "message": "Train updated successfully" }
- Request Headers
-
Delete Train
DELETE /admin/delete_train/<train_id>
- Request Headers
ADMIN-API-KEY: <API_KEY>
- Response
{ "message": "Train deleted successfully" }
- Error Response (if train not found)
{ "message": "Train not found" }
- Request Headers
-
Register User
POST /register
- Request Body
{ "username": "john_doe", "password": "securepassword" }
- Response
{ "message": "User registered successfully" }
- Request Body
-
Login User
POST /login
- Request Body
{ "username": "john_doe", "password": "securepassword" }
- Response
{ "access_token": "<JWT_TOKEN>" }
- Request Body
-
Check Seat Availability
GET /trains/availability
- Request Headers
Authorization: Bearer <JWT_TOKEN>
- Request Params
source
: "Pune"destination
: "Thane"
- Response
[ { "train_id": 1, "train_name": "Express Train", "available_seats": 50 } ]
- Request Headers
-
Book Seat
POST /user/bookings
- Request Headers
Authorization: Bearer <JWT_TOKEN>
- Request Body
{ "train_id": 1 }
- Response
{ "message": "Seat booked successfully", "booking_id": 101 }
- Request Headers
-
Get User Bookings
GET /user/bookings/info
- Request Headers
Authorization: Bearer <JWT_TOKEN>
- Response
[ { "booking_id": 101, "train_name": "Express Train", "source": "Pune", "destination": "Thane", "seat_number": 50 } ]
- Request Headers