{
  "info": {
    "_postman_id": "course-purchase-collection-001",
    "name": "BuddyMentor - Course Purchase APIs",
    "description": "Collection for Course Purchase APIs - Initiate purchases, check status, payment processing, and refunds",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "item": [
    {
      "name": "Purchase Management",
      "item": [
        {
          "name": "Initiate Purchase",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{token}}"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"courseId\": \"COURSE-001\",\n  \"purchasedBy\": \"SELF\",\n  \"notes\": \"Purchased for learning purposes\"\n}"
            },
            "url": {
              "raw": "{{baseUrl}}/api/v1/coursePurchase/initiate",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "coursePurchase",
                "initiate"
              ]
            },
            "description": "Initiate a course purchase before payment\n\nValidations:\n- User profile must be complete (disciplineId, streamId)\n- User account must not be suspended\n- User must not have already purchased this course\n\nRequest Body:\n- courseId: Course ID (required) - String\n- purchasedBy: \"SELF\" or \"ADMIN\" (optional, default: \"SELF\")\n- notes: Purchase notes (optional)\n\nResponse:\n- purchase: Purchase object with purchaseId, orderId, invoiceNumber, courseName, totalAmount, etc.\n\nAccess: Protected (Authenticated users only)"
          },
          "response": []
        },
        {
          "name": "Check Purchase Status",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{token}}"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/coursePurchase/check-status/COURSE-001",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "coursePurchase",
                "check-status",
                "COURSE-001"
              ]
            },
            "description": "Check if authenticated user has already purchased a specific course\n\nPath Parameters:\n- courseId: Course ID (required) - String - e.g., COURSE-001\n\nResponse:\n- alreadyPurchased: boolean - True if user already purchased this course\n- courseId: Course ID that was checked\n- purchaseId: (optional) Purchase ID if already purchased\n- purchaseStatus: (optional) Current purchase status if already purchased (PENDING, SUCCESS, FAILED, etc.)\n- purchaseDate: (optional) Date when course was purchased\n\nUse Case:\n- Check if user can purchase a course or if already purchased\n- Prevent duplicate purchases\n- Show purchase status before checkout\n\nAccess: Protected (Authenticated users only)"
          },
          "response": []
        },
        {
          "name": "Get My Purchases",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{token}}"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/coursePurchase/my-purchases?page=1&limit=10",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "coursePurchase",
                "my-purchases"
              ],
              "query": [
                {
                  "key": "page",
                  "value": "1",
                  "description": "Page number (default: 1)"
                },
                {
                  "key": "limit",
                  "value": "10",
                  "description": "Records per page (default: 10)"
                }
              ]
            },
            "description": "Get all purchases made by authenticated user with pagination\n\nQuery Parameters:\n- page: Page number (optional, default: 1)\n- limit: Records per page (optional, default: 10)\n\nResponse:\n- pagination: { currentPage, totalPages, totalRecords, limit }\n- purchases: Array of purchase objects\n  - purchaseId, courseId, courseName, amount\n  - purchaseStatus, paymentStatus, purchasedAt\n  - enrollmentStartDate, enrollmentEndDate, etc.\n\nAccess: Protected (Authenticated users only)"
          },
          "response": []
        },
        {
          "name": "Get Purchase Details",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{token}}"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/v1/coursePurchase/PURCHASE-001",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "coursePurchase",
                "PURCHASE-001"
              ]
            },
            "description": "Get detailed information for a specific purchase\n\nPath Parameters:\n- purchaseId: Purchase ID (required) - String\n\nResponse:\n- purchaseId: Purchase unique identifier\n- courseDetails: { courseId, courseName, courseCode, totalAmount }\n- courseEnrollment: Enrollment details if purchased\n- amount: Total purchase amount\n- purchaseStatus: Current status (INITIATED, PAID, COMPLETED, CANCELLED, REFUNDED)\n- paymentStatus: Payment status (PENDING, SUCCESS, FAILED)\n- paymentDetails: Razorpay payment information\n- purchasedBy: \"SELF\" or \"ADMIN\"\n- notes: Purchase notes\n- purchasedAt, updatedAt: Timestamps\n\nAccess: Protected (Authenticated users only, can only view own purchases)"
          },
          "response": []
        }
      ],
      "description": "Purchase management endpoints - Create and view purchases"
    },
    {
      "name": "Payment Processing",
      "item": [
        {
          "name": "Initialize Payment",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{token}}"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{}"
            },
            "url": {
              "raw": "{{baseUrl}}/api/v1/coursePurchase/PURCHASE-001/initialize-payment",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "coursePurchase",
                "PURCHASE-001",
                "initialize-payment"
              ]
            },
            "description": "Initialize Razorpay payment for a purchase\n\nCreates a Razorpay order and returns order ID for frontend payment processing\n\nPath Parameters:\n- purchaseId: Purchase ID (required) - String\n\nResponse:\n- payment: {\n    purchaseId: Purchase ID,\n    razorpayOrderId: Razorpay order ID,\n    amount: Total amount in paise (multiply by 100),\n    keyId: Razorpay Key ID,\n    currency: \"INR\",\n    receiptId: Invoice number,\n    description: Course name,\n    customerEmail: User email,\n    customerPhone: User phone\n  }\n\nAccess: Protected (Authenticated users only)"
          },
          "response": []
        },
        {
          "name": "Verify Payment",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{token}}"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"purchaseId\": \"PURCHASE-001\",\n  \"paymentId\": \"pay_XXXXXXXXXXXXX\",\n  \"orderId\": \"order_XXXXXXXXXXXXX\",\n  \"signature\": \"9ef4dffbfd84f1318f6739a3ce19f9d85851857ae648f114332d8401e0949a3d\"\n}"
            },
            "url": {
              "raw": "{{baseUrl}}/api/v1/coursePurchase/verify-payment",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "coursePurchase",
                "verify-payment"
              ]
            },
            "description": "Verify and process Razorpay payment\n\nMust be called AFTER successful payment on frontend.\nVerifies Razorpay payment signature and updates purchase status.\nTriggers payment success email notification.\n\nRequest Body:\n- purchaseId: Purchase ID (required) - String\n- paymentId: Razorpay payment ID (required) - String (from payment response)\n- orderId: Razorpay order ID (required) - String (from initialize-payment)\n- signature: Razorpay signature (required) - String (from payment response)\n\nResponse:\n- purchase: {\n    purchaseId: Purchase ID,\n    paymentId: Payment ID,\n    paymentStatus: \"SUCCESS\",\n    purchaseStatus: \"PAID\",\n    amount: Total amount,\n    courseEnrollment: { enrollmentId, startDate, endDate },\n    purchasedAt: Timestamp\n  }\n\nAccess: Protected (Authenticated users only)"
          },
          "response": []
        }
      ],
      "description": "Payment initialization and verification endpoints"
    },
    {
      "name": "Refunds",
      "item": [
        {
          "name": "Request Refund",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Authorization",
                "value": "Bearer {{token}}"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"amount\": 499.00,\n  \"reason\": \"Course not as expected\"\n}"
            },
            "url": {
              "raw": "{{baseUrl}}/api/v1/coursePurchase/PURCHASE-001/refund",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "coursePurchase",
                "PURCHASE-001",
                "refund"
              ]
            },
            "description": "Request refund for a purchased course\n\nPath Parameters:\n- purchaseId: Purchase ID (required) - String\n\nRequest Body:\n- amount: Refund amount (optional) - Number\n  If not provided, full purchase amount is refunded\n- reason: Reason for refund (optional) - String\n  User-provided refund reason\n\nResponse:\n- refund: {\n    refundId: Unique refund identifier,\n    purchaseId: Related purchase ID,\n    amount: Refunded amount,\n    reason: Refund reason,\n    status: \"PENDING\" | \"SUCCESS\" | \"FAILED\",\n    razorpayRefundId: Razorpay refund ID,\n    requestedAt: Request timestamp,\n    processedAt: (optional) Processing timestamp\n  }\n\nAccess: Protected (Authenticated users only, can only refund own purchases)"
          },
          "response": []
        }
      ],
      "description": "Refund request endpoints"
    },
    {
      "name": "Webhooks",
      "item": [
        {
          "name": "Razorpay Webhook",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "X-Razorpay-Signature",
                "value": "9ef4dffbfd84f1318f6739a3ce19f9d85851857ae648f114332d8401e0949a3d"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"event\": \"payment.authorized\",\n  \"created_at\": 1677583200,\n  \"payload\": {\n    \"payment\": {\n      \"entity\": \"payment\",\n      \"id\": \"pay_XXXXXXXXXXXXX\",\n      \"amount\": 50000,\n      \"currency\": \"INR\",\n      \"status\": \"authorized\",\n      \"method\": \"card\",\n      \"order_id\": \"order_XXXXXXXXXXXXX\",\n      \"receipt\": \"INVOICE-001\"\n    }\n  }\n}"
            },
            "url": {
              "raw": "{{baseUrl}}/api/v1/coursePurchase/webhook",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "v1",
                "coursePurchase",
                "webhook"
              ]
            },
            "description": "Razorpay webhook endpoint for payment events\n\nPublic endpoint that receives payment events from Razorpay.\nNo authentication required (Webhook signature verification done internally).\n\nHeader:\n- X-Razorpay-Signature: Razorpay webhook signature (required)\n\nSupported Events:\n- payment.authorized: Payment authorized\n- payment.failed: Payment failed\n- payment.captured: Payment captured\n- refund.created: Refund initiated\n- refund.failed: Refund failed\n\nResponse:\n- { event, purchaseId, status, message }\n\nAccess: Public (Webhook signature verification required)"
          },
          "response": []
        }
      ],
      "description": "Webhook endpoints for Razorpay payment events"
    }
  ],
  "variable": [
    {
      "key": "baseUrl",
      "value": "http://localhost:5005",
      "type": "string"
    },
    {
      "key": "token",
      "value": "your_jwt_token_here",
      "type": "string"
    }
  ]
}
