{
	"info": {
		"_postman_id": "user-service-auth-api",
		"name": "User Service - Auth API",
		"description": "Complete authentication API endpoints for the User Service",
		"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
	},
	"item": [
		{
			"name": "1. Send Email OTP",
			"event": [
				{
					"listen": "test",
					"script": {
						"exec": [
							"if (pm.response.code === 200) {",
							"    const response = pm.response.json();",
							"    if (response.data && response.data.otpSessionId) {",
							"        pm.environment.set('otpSessionId', response.data.otpSessionId);",
							"        console.log('OTP Session ID saved:', response.data.otpSessionId);",
							"    }",
							"}"
						],
						"type": "text/javascript"
					}
				}
			],
			"request": {
				"method": "POST",
				"header": [
					{
						"key": "Content-Type",
						"value": "application/json"
					}
				],
				"body": {
					"mode": "raw",
					"raw": "{\n  \"email\": \"{{userEmail}}\"\n}"
				},
				"url": {
					"raw": "{{baseUrl}}/auth/send-email-otp",
					"host": ["{{baseUrl}}"],
					"path": ["auth", "send-email-otp"]
				},
				"description": "Send a 4-digit OTP to the user's email address. The OTP is valid for 5 minutes."
			},
			"response": []
		},
		{
			"name": "2. Verify Email OTP",
			"event": [
				{
					"listen": "test",
					"script": {
						"exec": [
							"if (pm.response.code === 200) {",
							"    const response = pm.response.json();",
							"    if (response.data && response.data.verificationToken) {",
							"        pm.environment.set('verificationToken', response.data.verificationToken);",
							"        console.log('Verification Token saved');",
							"    }",
							"}"
						],
						"type": "text/javascript"
					}
				}
			],
			"request": {
				"method": "POST",
				"header": [
					{
						"key": "Content-Type",
						"value": "application/json"
					}
				],
				"body": {
					"mode": "raw",
					"raw": "{\n  \"email\": \"{{userEmail}}\",\n  \"otp\": \"1234\",\n  \"otpSessionId\": \"{{otpSessionId}}\"\n}"
				},
				"url": {
					"raw": "{{baseUrl}}/auth/verify-email-otp",
					"host": ["{{baseUrl}}"],
					"path": ["auth", "verify-email-otp"]
				},
				"description": "Verify the OTP sent to the user's email. Returns a verification token valid for 10 minutes."
			},
			"response": []
		},
		{
			"name": "3. Signup (New User)",
			"event": [
				{
					"listen": "test",
					"script": {
						"exec": [
							"if (pm.response.code === 200) {",
							"    const response = pm.response.json();",
							"    if (response.data) {",
							"        pm.environment.set('accessToken', response.data.accessToken);",
							"        pm.environment.set('refreshToken', response.data.refreshToken);",
							"        if (response.data.user) {",
							"            pm.environment.set('userId', response.data.user.id);",
							"        }",
							"        console.log('User registered successfully');",
							"    }",
							"}"
						],
						"type": "text/javascript"
					}
				}
			],
			"request": {
				"method": "POST",
				"header": [
					{
						"key": "Content-Type",
						"value": "application/json"
					}
				],
				"body": {
					"mode": "raw",
					"raw": "{\n  \"email\": \"{{userEmail}}\",\n  \"fullName\": \"John Doe\"\n}"
				},
				"url": {
					"raw": "{{baseUrl}}/auth/signup",
					"host": ["{{baseUrl}}"],
					"path": ["auth", "signup"]
				},
				"description": "Create a new user account. Returns user details along with access and refresh tokens."
			},
			"response": []
		},
		{
			"name": "4. Signin (Existing User)",
			"event": [
				{
					"listen": "test",
					"script": {
						"exec": [
							"if (pm.response.code === 200) {",
							"    const response = pm.response.json();",
							"    if (response.data) {",
							"        pm.environment.set('accessToken', response.data.accessToken);",
							"        pm.environment.set('refreshToken', response.data.refreshToken);",
							"        if (response.data.user) {",
							"            pm.environment.set('userId', response.data.user.id);",
							"        }",
							"        console.log('User signed in successfully');",
							"    }",
							"}"
						],
						"type": "text/javascript"
					}
				}
			],
			"request": {
				"method": "POST",
				"header": [
					{
						"key": "Content-Type",
						"value": "application/json"
					}
				],
				"body": {
					"mode": "raw",
					"raw": "{\n  \"verificationToken\": \"{{verificationToken}}\"\n}"
				},
				"url": {
					"raw": "{{baseUrl}}/auth/signin",
					"host": ["{{baseUrl}}"],
					"path": ["auth", "signin"]
				},
				"description": "Sign in an existing user using a verification token. Returns user details and tokens."
			},
			"response": []
		},
		{
			"name": "5. Social Auth (Google)",
			"event": [
				{
					"listen": "test",
					"script": {
						"exec": [
							"if (pm.response.code === 200) {",
							"    const response = pm.response.json();",
							"    if (response.data) {",
							"        pm.environment.set('accessToken', response.data.accessToken);",
							"        pm.environment.set('refreshToken', response.data.refreshToken);",
							"        if (response.data.user) {",
							"            pm.environment.set('userId', response.data.user.id);",
							"        }",
							"        console.log('Social auth successful, isNewUser:', response.data.isNewUser);",
							"    }",
							"}"
						],
						"type": "text/javascript"
					}
				}
			],
			"request": {
				"method": "POST",
				"header": [
					{
						"key": "Content-Type",
						"value": "application/json"
					}
				],
				"body": {
					"mode": "raw",
					"raw": "{\n  \"provider\": \"GOOGLE\",\n  \"token\": \"google_access_token_here\"\n}"
				},
				"url": {
					"raw": "{{baseUrl}}/auth/social",
					"host": ["{{baseUrl}}"],
					"path": ["auth", "social"]
				},
				"description": "Authenticate using Google OAuth. Creates a new user if they don't exist."
			},
			"response": []
		},
		{
			"name": "5. Social Auth (Facebook)",
			"event": [
				{
					"listen": "test",
					"script": {
						"exec": [
							"if (pm.response.code === 200) {",
							"    const response = pm.response.json();",
							"    if (response.data) {",
							"        pm.environment.set('accessToken', response.data.accessToken);",
							"        pm.environment.set('refreshToken', response.data.refreshToken);",
							"        if (response.data.user) {",
							"            pm.environment.set('userId', response.data.user.id);",
							"        }",
							"        console.log('Social auth successful, isNewUser:', response.data.isNewUser);",
							"    }",
							"}"
						],
						"type": "text/javascript"
					}
				}
			],
			"request": {
				"method": "POST",
				"header": [
					{
						"key": "Content-Type",
						"value": "application/json"
					}
				],
				"body": {
					"mode": "raw",
					"raw": "{\n  \"provider\": \"FACEBOOK\",\n  \"token\": \"facebook_access_token_here\"\n}"
				},
				"url": {
					"raw": "{{baseUrl}}/auth/social",
					"host": ["{{baseUrl}}"],
					"path": ["auth", "social"]
				},
				"description": "Authenticate using Facebook OAuth. Creates a new user if they don't exist."
			},
			"response": []
		},
		{
			"name": "5. Social Auth (Apple)",
			"event": [
				{
					"listen": "test",
					"script": {
						"exec": [
							"if (pm.response.code === 200) {",
							"    const response = pm.response.json();",
							"    if (response.data) {",
							"        pm.environment.set('accessToken', response.data.accessToken);",
							"        pm.environment.set('refreshToken', response.data.refreshToken);",
							"        if (response.data.user) {",
							"            pm.environment.set('userId', response.data.user.id);",
							"        }",
							"        console.log('Social auth successful, isNewUser:', response.data.isNewUser);",
							"    }",
							"}"
						],
						"type": "text/javascript"
					}
				}
			],
			"request": {
				"method": "POST",
				"header": [
					{
						"key": "Content-Type",
						"value": "application/json"
					}
				],
				"body": {
					"mode": "raw",
					"raw": "{\n  \"provider\": \"APPLE\",\n  \"token\": \"apple_id_token_here\"\n}"
				},
				"url": {
					"raw": "{{baseUrl}}/auth/social",
					"host": ["{{baseUrl}}"],
					"path": ["auth", "social"]
				},
				"description": "Authenticate using Apple Sign In. Creates a new user if they don't exist."
			},
			"response": []
		},
		{
			"name": "6. Get Current User (Me)",
			"request": {
				"auth": {
					"type": "bearer",
					"bearer": [
						{
							"key": "token",
							"value": "{{accessToken}}",
							"type": "string"
						}
					]
				},
				"method": "GET",
				"header": [],
				"url": {
					"raw": "{{baseUrl}}/auth/me",
					"host": ["{{baseUrl}}"],
					"path": ["auth", "me"]
				},
				"description": "Get current authenticated user's profile information. Requires valid access token."
			},
			"response": []
		},
		{
			"name": "7. Update User Profile (JSON)",
			"request": {
				"auth": {
					"type": "bearer",
					"bearer": [
						{
							"key": "token",
							"value": "{{accessToken}}",
							"type": "string"
						}
					]
				},
				"method": "PUT",
				"header": [
					{
						"key": "Content-Type",
						"value": "application/json"
					}
				],
				"body": {
					"mode": "raw",
					"raw": "{\n  \"fullName\": \"John Doe Updated\",\n  \"gender\": \"MALE\",\n  \"dateOfBirth\": \"1990-01-15\",\n  \"nationality\": \"US\",\n  \"maritalStatus\": \"SINGLE\",\n  \"mobileNumber\": \"+1234567890\",\n  \"dialCode\": \"+1\",\n  \"panCardNumber\": \"ABCDE1234F\",\n  \"issuingAuthority\": \"US Government\"\n}"
				},
				"url": {
					"raw": "{{baseUrl}}/auth/me",
					"host": ["{{baseUrl}}"],
					"path": ["auth", "me"]
				},
				"description": "Update user profile with JSON data. All fields are optional."
			},
			"response": []
		},
		{
			"name": "7. Update User Profile (With Image)",
			"request": {
				"auth": {
					"type": "bearer",
					"bearer": [
						{
							"key": "token",
							"value": "{{accessToken}}",
							"type": "string"
						}
					]
				},
				"method": "PUT",
				"header": [],
				"body": {
					"mode": "formdata",
					"formdata": [
						{
							"key": "fullName",
							"value": "John Doe",
							"type": "text"
						},
						{
							"key": "gender",
							"value": "MALE",
							"type": "text",
							"description": "Values: MALE, FEMALE, OTHER"
						},
						{
							"key": "dateOfBirth",
							"value": "1990-01-15",
							"type": "text"
						},
						{
							"key": "nationality",
							"value": "US",
							"type": "text"
						},
						{
							"key": "maritalStatus",
							"value": "SINGLE",
							"type": "text",
							"description": "Values: SINGLE, MARRIED, DIVORCED, WIDOWED"
						},
						{
							"key": "anniversary",
							"value": "2020-06-15",
							"type": "text",
							"description": "Optional - for married users"
						},
						{
							"key": "mobileNumber",
							"value": "1234567890",
							"type": "text"
						},
						{
							"key": "dialCode",
							"value": "+1",
							"type": "text"
						},
						{
							"key": "issuingAuthority",
							"value": "US Government",
							"type": "text"
						},
						{
							"key": "panCardNumber",
							"value": "ABCDE1234F",
							"type": "text"
						},
						{
							"key": "profileImage",
							"type": "file",
							"src": [],
							"description": "Select an image file (JPEG, PNG, GIF)"
						}
					]
				},
				"url": {
					"raw": "{{baseUrl}}/auth/me",
					"host": ["{{baseUrl}}"],
					"path": ["auth", "me"]
				},
				"description": "Update user profile with multipart/form-data to include profile image upload. All fields are optional."
			},
			"response": []
		},
		{
			"name": "8. Logout",
			"request": {
				"auth": {
					"type": "bearer",
					"bearer": [
						{
							"key": "token",
							"value": "{{accessToken}}",
							"type": "string"
						}
					]
				},
				"method": "POST",
				"header": [],
				"url": {
					"raw": "{{baseUrl}}/auth/logout",
					"host": ["{{baseUrl}}"],
					"path": ["auth", "logout"]
				},
				"description": "Logout the current user and invalidate all refresh tokens."
			},
			"response": []
		}
	],
	"event": [
		{
			"listen": "prerequest",
			"script": {
				"type": "text/javascript",
				"exec": [""]
			}
		},
		{
			"listen": "test",
			"script": {
				"type": "text/javascript",
				"exec": [""]
			}
		}
	],
	"variable": [
		{
			"key": "baseUrl",
			"value": "http://localhost:3001",
			"type": "string"
		},
		{
			"key": "userEmail",
			"value": "test@example.com",
			"type": "string"
		},
		{
			"key": "otpSessionId",
			"value": "",
			"type": "string"
		},
		{
			"key": "verificationToken",
			"value": "",
			"type": "string"
		},
		{
			"key": "accessToken",
			"value": "",
			"type": "string"
		},
		{
			"key": "refreshToken",
			"value": "",
			"type": "string"
		},
		{
			"key": "userId",
			"value": "",
			"type": "string"
		}
	]
}
