{
	"info": {
		"_postman_id": "gym-khana-api-2024",
		"name": "Gym Khana Management System API",
		"description": "Complete API collection for Club Gym Khana Management System\n\n## How to Use:\n1. Import this collection into Postman\n2. Create an environment with variables:\n   - base_url: http://localhost:3000/api/v1\n   - token: (will be auto-set after login)\n3. Start with 'Auth > Staff Login' to get your token\n4. All subsequent requests will use the token automatically\n\n## Tech Stack:\n- Node.js v24.11.1\n- Express.js v5.1.0\n- PostgreSQL 18",
		"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
	},
	"item": [
		{
			"name": "Authentication",
			"item": [
				{
					"name": "Staff Login",
					"event": [
						{
							"listen": "test",
							"script": {
								"exec": [
									"if (pm.response.code === 200) {",
									"    const response = pm.response.json();",
									"    pm.environment.set(\"token\", response.data.accessToken);",
									"    pm.environment.set(\"refreshToken\", response.data.refreshToken);",
									"    console.log(\"✅ Token saved to environment\");",
									"}"
								],
								"type": "text/javascript"
							}
						}
					],
					"request": {
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n  \"username\": \"admin\",\n  \"password\": \"Admin@123\"\n}"
						},
						"url": {
							"raw": "{{base_url}}/auth/login",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"auth",
								"login"
							]
						},
						"description": "Login for staff users (Admin, Front Desk, Restaurant Staff, etc.)\n\n**Required Fields:**\n- username: Staff username\n- password: Staff password\n\n**Response:**\n- User details\n- Access token (saved to environment)\n- Refresh token"
					},
					"response": []
				},
				{
					"name": "Member Login",
					"event": [
						{
							"listen": "test",
							"script": {
								"exec": [
									"if (pm.response.code === 200) {",
									"    const response = pm.response.json();",
									"    pm.environment.set(\"token\", response.data.accessToken);",
									"    pm.environment.set(\"refreshToken\", response.data.refreshToken);",
									"    console.log(\"✅ Member token saved to environment\");",
									"}"
								],
								"type": "text/javascript"
							}
						}
					],
					"request": {
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n  \"memberId\": \"1001\",\n  \"password\": \"Member@123\"\n}"
						},
						"url": {
							"raw": "{{base_url}}/auth/member/login",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"auth",
								"member",
								"login"
							]
						},
						"description": "Login for members to access self-service portal\n\n**Required Fields:**\n- memberId: Member ID (e.g., 1001, 1001-w, 1001-s1)\n- password: Member password\n\n**Response:**\n- Member details\n- Current balance\n- Access token"
					},
					"response": []
				},
				{
					"name": "Get Current User",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "{{token}}",
									"type": "string"
								}
							]
						},
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{base_url}}/auth/me",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"auth",
								"me"
							]
						},
						"description": "Get current logged-in user details\n\n**Authentication Required:** Yes\n\n**Response:**\n- User profile information\n- Role details\n- Last login time"
					},
					"response": []
				},
				{
					"name": "Change Password",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "{{token}}",
									"type": "string"
								}
							]
						},
						"method": "PUT",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n  \"currentPassword\": \"OldPassword@123\",\n  \"newPassword\": \"NewPassword@123\"\n}"
						},
						"url": {
							"raw": "{{base_url}}/auth/change-password",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"auth",
								"change-password"
							]
						},
						"description": "Change password for currently logged-in user\n\n**Required Fields:**\n- currentPassword: Current password\n- newPassword: New password (min 8 chars, must contain uppercase, lowercase, and number)"
					},
					"response": []
				}
			],
			"description": "Authentication endpoints for staff and member login"
		},
		{
			"name": "User Management",
			"item": [
				{
					"name": "Create User",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "{{token}}",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n  \"username\": \"frontdesk1\",\n  \"email\": \"frontdesk@gymkhana.pk\",\n  \"password\": \"FrontDesk@123\",\n  \"firstName\": \"Front\",\n  \"lastName\": \"Desk\",\n  \"phone\": \"03001234567\",\n  \"role\": \"front_desk\"\n}"
						},
						"url": {
							"raw": "{{base_url}}/users",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"users"
							]
						},
						"description": "Create a new staff user\n\n**Access:** Admin only\n\n**Available Roles:**\n- admin\n- front_desk\n- restaurant_staff\n- warehouse_manager\n- accountant\n- sports_manager\n\n**Required Fields:**\n- username (min 3 chars, alphanumeric + underscore)\n- email (valid email)\n- password (min 8 chars, uppercase, lowercase, number)\n- firstName\n- lastName\n- role"
					},
					"response": []
				},
				{
					"name": "Get All Users",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "{{token}}",
									"type": "string"
								}
							]
						},
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{base_url}}/users?page=1&limit=20",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"users"
							],
							"query": [
								{
									"key": "page",
									"value": "1"
								},
								{
									"key": "limit",
									"value": "20"
								},
								{
									"key": "role",
									"value": "front_desk",
									"disabled": true
								},
								{
									"key": "search",
									"value": "john",
									"disabled": true
								},
								{
									"key": "isActive",
									"value": "true",
									"disabled": true
								}
							]
						},
						"description": "Get all staff users with pagination and filtering\n\n**Access:** Admin only\n\n**Query Parameters:**\n- page (optional, default: 1)\n- limit (optional, default: 20, max: 100)\n- role (optional, filter by role)\n- search (optional, search by username, email, name)\n- isActive (optional, filter active/inactive users)"
					},
					"response": []
				},
				{
					"name": "Get User by ID",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "{{token}}",
									"type": "string"
								}
							]
						},
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{base_url}}/users/1",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"users",
								"1"
							]
						},
						"description": "Get a specific user by ID\n\n**Access:** Admin only"
					},
					"response": []
				},
				{
					"name": "Update User",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "{{token}}",
									"type": "string"
								}
							]
						},
						"method": "PUT",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n  \"email\": \"newemail@gymkhana.pk\",\n  \"firstName\": \"Updated\",\n  \"lastName\": \"Name\",\n  \"phone\": \"03009876543\",\n  \"isActive\": true\n}"
						},
						"url": {
							"raw": "{{base_url}}/users/2",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"users",
								"2"
							]
						},
						"description": "Update user details\n\n**Access:** Admin only\n\n**Note:** All fields are optional. Only provided fields will be updated."
					},
					"response": []
				},
				{
					"name": "Delete User",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "{{token}}",
									"type": "string"
								}
							]
						},
						"method": "DELETE",
						"header": [],
						"url": {
							"raw": "{{base_url}}/users/2",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"users",
								"2"
							]
						},
						"description": "Delete (deactivate) a user\n\n**Access:** Admin only\n\n**Note:** This is a soft delete. User is deactivated, not removed from database."
					},
					"response": []
				},
				{
					"name": "Reset User Password",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "{{token}}",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n  \"newPassword\": \"NewPassword@123\"\n}"
						},
						"url": {
							"raw": "{{base_url}}/users/2/reset-password",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"users",
								"2",
								"reset-password"
							]
						},
						"description": "Reset user password (Admin function)\n\n**Access:** Admin only"
					},
					"response": []
				},
				{
					"name": "Get All Roles",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "{{token}}",
									"type": "string"
								}
							]
						},
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{base_url}}/users/roles",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"users",
								"roles"
							]
						},
						"description": "Get all available user roles\n\n**Access:** Admin only"
					},
					"response": []
				}
			],
			"description": "Staff user management endpoints (Admin only)"
		},
		{
			"name": "Membership Management",
			"item": [
				{
					"name": "Register Member",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "{{token}}",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n  \"memberId\": \"1001\",\n  \"membershipTypeId\": 1,\n  \"firstName\": \"Ahmed\",\n  \"lastName\": \"Khan\",\n  \"fatherName\": \"Muhammad Khan\",\n  \"cnic\": \"4210112345678\",\n  \"dateOfBirth\": \"1980-05-15\",\n  \"gender\": \"Male\",\n  \"phonePrimary\": \"03001234567\",\n  \"phoneSecondary\": \"03219876543\",\n  \"email\": \"ahmed@example.com\",\n  \"address\": \"House 123, Street 45, Hyderabad\",\n  \"emergencyContactName\": \"Ali Khan\",\n  \"emergencyContactPhone\": \"03331234567\",\n  \"membershipStartDate\": \"2024-01-01\",\n  \"membershipExpiryDate\": \"2024-12-31\",\n  \"password\": \"Member@123\"\n}"
						},
						"url": {
							"raw": "{{base_url}}/members/register",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"members",
								"register"
							]
						},
						"description": "Register a new primary member\n\n**Access:** Admin, Front Desk\n\n**Required Fields:**\n- memberId: 4-digit number (e.g., 1001)\n- membershipTypeId: 1-6 (see membership types)\n- firstName, lastName, fatherName\n- cnic: 13 digits\n- dateOfBirth: YYYY-MM-DD\n- gender: Male/Female/Other\n- phonePrimary: 03XXXXXXXXX format\n- address\n- emergencyContactName, emergencyContactPhone\n- membershipStartDate: YYYY-MM-DD\n\n**Membership Types:**\n1. Permanent Member (50,000 PKR)\n2. Temporary Member (25,000 PKR)\n3. Associate Member (15,000 PKR)\n4. Corporate Member (40,000 PKR)\n5. Youth Member (12,000 PKR)\n6. Senior Citizen (18,000 PKR)"
					},
					"response": []
				},
				{
					"name": "Add Family Member",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "{{token}}",
									"type": "string"
								}
							]
						},
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n  \"firstName\": \"Fatima\",\n  \"lastName\": \"Ahmed\",\n  \"relationToPrimary\": \"Spouse\",\n  \"dateOfBirth\": \"1985-03-20\",\n  \"gender\": \"Female\",\n  \"cnic\": \"4210198765432\",\n  \"password\": \"Spouse@123\"\n}"
						},
						"url": {
							"raw": "{{base_url}}/members/1001/family",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"members",
								"1001",
								"family"
							]
						},
						"description": "Add a family member to primary member\n\n**Access:** Admin, Front Desk\n\n**Required Fields:**\n- firstName, lastName\n- relationToPrimary: Spouse/Son/Daughter\n- dateOfBirth: YYYY-MM-DD\n- gender: Male/Female/Other\n\n**Member ID Generation:**\n- Spouse: 1001-w (second wife: 1001-w2)\n- Son: 1001-s1, 1001-s2, etc.\n- Daughter: 1001-d1, 1001-d2, etc."
					},
					"response": []
				},
				{
					"name": "Get All Members",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "{{token}}",
									"type": "string"
								}
							]
						},
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{base_url}}/members?page=1&limit=20",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"members"
							],
							"query": [
								{
									"key": "page",
									"value": "1"
								},
								{
									"key": "limit",
									"value": "20"
								},
								{
									"key": "search",
									"value": "ahmed",
									"disabled": true
								},
								{
									"key": "status",
									"value": "Active",
									"disabled": true
								},
								{
									"key": "membershipType",
									"value": "PERM",
									"disabled": true
								}
							]
						},
						"description": "Get all primary members with pagination\n\n**Access:** Admin, Front Desk, Accountant\n\n**Query Parameters:**\n- page (default: 1)\n- limit (default: 20, max: 100)\n- search (search by ID, name, phone, CNIC)\n- status (Active/Suspended/Inactive/Expired)\n- membershipType (PERM/TEMP/ASSOC/CORP/YOUTH/SENIOR)"
					},
					"response": []
				},
				{
					"name": "Search Members",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "{{token}}",
									"type": "string"
								}
							]
						},
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{base_url}}/members/search?q=Ahmed",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"members",
								"search"
							],
							"query": [
								{
									"key": "q",
									"value": "Ahmed"
								}
							]
						},
						"description": "Quick search for members\n\n**Access:** All staff\n\n**Searches in:**\n- Member ID\n- First name\n- Last name\n- Phone number\n- CNIC\n- Full name\n\n**Returns:** Maximum 20 results"
					},
					"response": []
				},
				{
					"name": "Get Member by ID",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "{{token}}",
									"type": "string"
								}
							]
						},
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{base_url}}/members/1001",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"members",
								"1001"
							]
						},
						"description": "Get member details including family members\n\n**Access:** All staff\n\n**Returns:**\n- Member profile\n- Membership details\n- Account balance\n- Family members list"
					},
					"response": []
				},
				{
					"name": "Update Member Profile",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "{{token}}",
									"type": "string"
								}
							]
						},
						"method": "PUT",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n  \"phonePrimary\": \"03001234567\",\n  \"phoneSecondary\": \"03219876543\",\n  \"email\": \"newemail@example.com\",\n  \"address\": \"New Address, Hyderabad\",\n  \"emergencyContactName\": \"New Contact\",\n  \"emergencyContactPhone\": \"03331234567\"\n}"
						},
						"url": {
							"raw": "{{base_url}}/members/1001/profile",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"members",
								"1001",
								"profile"
							]
						},
						"description": "Update member contact and emergency information\n\n**Access:** Admin, Front Desk\n\n**Note:** All fields are optional"
					},
					"response": []
				},
				{
					"name": "Update Member Status",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "{{token}}",
									"type": "string"
								}
							]
						},
						"method": "PUT",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n  \"status\": \"Active\"\n}"
						},
						"url": {
							"raw": "{{base_url}}/members/1001/status",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"members",
								"1001",
								"status"
							]
						},
						"description": "Update member status\n\n**Access:** Admin, Front Desk\n\n**Valid Status Values:**\n- Active\n- Suspended\n- Inactive\n- Expired"
					},
					"response": []
				},
				{
					"name": "Get Family Members",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "{{token}}",
									"type": "string"
								}
							]
						},
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{base_url}}/members/1001/family",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"members",
								"1001",
								"family"
							]
						},
						"description": "Get all family members of a primary member\n\n**Access:** All staff"
					},
					"response": []
				},
				{
					"name": "Remove Family Member",
					"request": {
						"auth": {
							"type": "bearer",
							"bearer": [
								{
									"key": "token",
									"value": "{{token}}",
									"type": "string"
								}
							]
						},
						"method": "DELETE",
						"header": [],
						"url": {
							"raw": "{{base_url}}/members/1001/family/1001-w",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"members",
								"1001",
								"family",
								"1001-w"
							]
						},
						"description": "Remove a family member\n\n**Access:** Admin, Front Desk\n\n**Note:** This permanently deletes the family member record"
					},
					"response": []
				}
			],
			"description": "Member registration and management"
		},
		{
			"name": "Utility",
			"item": [
				{
					"name": "Health Check",
					"request": {
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{base_url}}/health",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"health"
							]
						},
						"description": "Check if API is running\n\n**No authentication required**"
					},
					"response": []
				},
				{
					"name": "API Documentation",
					"request": {
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{base_url}}/docs",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"docs"
							]
						},
						"description": "Get API documentation with all available endpoints\n\n**No authentication required**"
					},
					"response": []
				}
			],
			"description": "Utility endpoints for health check and documentation"
		}
	],
	"auth": {
		"type": "bearer",
		"bearer": [
			{
				"key": "token",
				"value": "{{token}}",
				"type": "string"
			}
		]
	},
	"event": [
		{
			"listen": "prerequest",
			"script": {
				"type": "text/javascript",
				"exec": [
					""
				]
			}
		},
		{
			"listen": "test",
			"script": {
				"type": "text/javascript",
				"exec": [
					""
				]
			}
		}
	],
	"variable": [
		{
			"key": "base_url",
			"value": "http://localhost:3000/api/v1",
			"type": "string"
		},
		{
			"key": "token",
			"value": "",
			"type": "string"
		},
		{
			"key": "refreshToken",
			"value": "",
			"type": "string"
		}
	]
}
