{ "openapi": "3.0.0", "paths": { "/api/orders": { "post": { "operationId": "OrdersController_create", "parameters": [], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CreateOrderDto" } } } }, "responses": { "201": { "description": "Order created successfully" }, "400": { "description": "Invalid request data" } }, "security": [ { "bearer": [] } ], "summary": "Create Salesforce Order", "tags": [ "orders" ] } }, "/api/orders/user": { "get": { "operationId": "OrdersController_getUserOrders", "parameters": [], "responses": { "200": { "description": "" } }, "security": [ { "bearer": [] } ], "summary": "Get user's orders", "tags": [ "orders" ] } }, "/api/orders/{sfOrderId}": { "get": { "operationId": "OrdersController_get", "parameters": [ { "name": "sfOrderId", "required": true, "in": "path", "schema": { "type": "string" } } ], "responses": { "200": { "description": "" } }, "security": [ { "bearer": [] } ], "summary": "Get order summary/status", "tags": [ "orders" ] } }, "/api/me": { "get": { "operationId": "UsersController_getProfile", "parameters": [], "responses": { "200": { "description": "User profile retrieved successfully" }, "401": { "description": "Unauthorized" } }, "security": [ { "bearer": [] } ], "summary": "Get current user profile", "tags": [ "users" ] }, "patch": { "operationId": "UsersController_updateProfile", "parameters": [], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UpdateUserDto" } } } }, "responses": { "200": { "description": "Profile updated successfully" }, "400": { "description": "Invalid input data" }, "401": { "description": "Unauthorized" } }, "security": [ { "bearer": [] } ], "summary": "Update user profile", "tags": [ "users" ] } }, "/api/me/summary": { "get": { "operationId": "UsersController_getSummary", "parameters": [], "responses": { "200": { "description": "User summary retrieved successfully" }, "401": { "description": "Unauthorized" } }, "security": [ { "bearer": [] } ], "summary": "Get user dashboard summary", "tags": [ "users" ] } }, "/api/me/address": { "get": { "operationId": "UsersController_getAddress", "parameters": [], "responses": { "200": { "description": "Address retrieved successfully" }, "401": { "description": "Unauthorized" } }, "security": [ { "bearer": [] } ], "summary": "Get mailing address", "tags": [ "users" ] }, "patch": { "operationId": "UsersController_updateAddress", "parameters": [], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UpdateAddressDto" } } } }, "responses": { "200": { "description": "Address updated successfully" }, "400": { "description": "Invalid input data" }, "401": { "description": "Unauthorized" } }, "security": [ { "bearer": [] } ], "summary": "Update mailing address", "tags": [ "users" ] } }, "/api/auth/validate-signup": { "post": { "operationId": "AuthController_validateSignup", "parameters": [], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ValidateSignupDto" } } } }, "responses": { "200": { "description": "Validation successful" }, "400": { "description": "Customer number not found" }, "409": { "description": "Customer already has account" }, "429": { "description": "Too many validation attempts" } }, "summary": "Validate customer number for signup", "tags": [ "auth" ] } }, "/api/auth/health-check": { "get": { "operationId": "AuthController_healthCheck", "parameters": [], "responses": { "200": { "description": "Health check results" } }, "summary": "Check auth service health and integrations", "tags": [ "auth" ] } }, "/api/auth/signup-preflight": { "post": { "operationId": "AuthController_signupPreflight", "parameters": [], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SignupDto" } } } }, "responses": { "200": { "description": "Preflight results with next action guidance" } }, "summary": "Validate full signup data without creating anything", "tags": [ "auth" ] } }, "/api/auth/account-status": { "post": { "operationId": "AuthController_accountStatus", "parameters": [], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AccountStatusRequestDto" } } } }, "responses": { "200": { "description": "Account status" } }, "summary": "Get account status by email", "tags": [ "auth" ] } }, "/api/auth/signup": { "post": { "operationId": "AuthController_signup", "parameters": [], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SignupDto" } } } }, "responses": { "201": { "description": "User created successfully" }, "409": { "description": "User already exists" }, "429": { "description": "Too many signup attempts" } }, "summary": "Create new user account", "tags": [ "auth" ] } }, "/api/auth/login": { "post": { "operationId": "AuthController_login", "parameters": [], "responses": { "200": { "description": "Login successful" }, "401": { "description": "Invalid credentials" } }, "summary": "Authenticate user", "tags": [ "auth" ] } }, "/api/auth/logout": { "post": { "operationId": "AuthController_logout", "parameters": [], "responses": { "200": { "description": "Logout successful" } }, "summary": "Logout user", "tags": [ "auth" ] } }, "/api/auth/link-whmcs": { "post": { "operationId": "AuthController_linkWhmcs", "parameters": [], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/LinkWhmcsDto" } } } }, "responses": { "200": { "description": "WHMCS account linked successfully" }, "401": { "description": "Invalid WHMCS credentials" }, "429": { "description": "Too many link attempts" } }, "summary": "Link existing WHMCS user", "tags": [ "auth" ] } }, "/api/auth/set-password": { "post": { "operationId": "AuthController_setPassword", "parameters": [], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SetPasswordDto" } } } }, "responses": { "200": { "description": "Password set successfully" }, "401": { "description": "User not found" }, "429": { "description": "Too many password attempts" } }, "summary": "Set password for linked user", "tags": [ "auth" ] } }, "/api/auth/check-password-needed": { "post": { "operationId": "AuthController_checkPasswordNeeded", "parameters": [], "responses": { "200": { "description": "Password status checked" } }, "summary": "Check if user needs to set password", "tags": [ "auth" ] } }, "/api/auth/request-password-reset": { "post": { "operationId": "AuthController_requestPasswordReset", "parameters": [], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RequestPasswordResetDto" } } } }, "responses": { "200": { "description": "Reset email sent if account exists" } }, "summary": "Request password reset email", "tags": [ "auth" ] } }, "/api/auth/reset-password": { "post": { "operationId": "AuthController_resetPassword", "parameters": [], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ResetPasswordDto" } } } }, "responses": { "200": { "description": "Password reset successful" } }, "summary": "Reset password with token", "tags": [ "auth" ] } }, "/api/auth/change-password": { "post": { "operationId": "AuthController_changePassword", "parameters": [], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ChangePasswordDto" } } } }, "responses": { "200": { "description": "Password changed successfully" } }, "summary": "Change password (authenticated)", "tags": [ "auth" ] } }, "/api/auth/me": { "get": { "operationId": "AuthController_getAuthStatus", "parameters": [], "responses": { "200": { "description": "" } }, "summary": "Get current authentication status", "tags": [ "auth" ] } }, "/api/auth/sso-link": { "post": { "operationId": "AuthController_createSsoLink", "parameters": [], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SsoLinkDto" } } } }, "responses": { "200": { "description": "SSO link created successfully" }, "404": { "description": "User not found or not linked to WHMCS" } }, "summary": "Create SSO link to WHMCS", "tags": [ "auth" ] } }, "/api/auth/admin/audit-logs": { "get": { "operationId": "AuthAdminController_getAuditLogs", "parameters": [ { "name": "page", "required": true, "in": "query", "schema": { "type": "string" } }, { "name": "limit", "required": true, "in": "query", "schema": { "type": "string" } }, { "name": "userId", "required": true, "in": "query", "schema": { "type": "string" } } ], "responses": { "200": { "description": "Audit logs retrieved" } }, "security": [ { "bearer": [] } ], "summary": "Get audit logs (admin only)", "tags": [ "auth-admin" ] } }, "/api/auth/admin/unlock-account/{userId}": { "post": { "operationId": "AuthAdminController_unlockAccount", "parameters": [ { "name": "userId", "required": true, "in": "path", "schema": { "type": "string" } } ], "responses": { "200": { "description": "Account unlocked" } }, "security": [ { "bearer": [] } ], "summary": "Unlock user account (admin only)", "tags": [ "auth-admin" ] } }, "/api/auth/admin/security-stats": { "get": { "operationId": "AuthAdminController_getSecurityStats", "parameters": [], "responses": { "200": { "description": "Security stats retrieved" } }, "security": [ { "bearer": [] } ], "summary": "Get security statistics (admin only)", "tags": [ "auth-admin" ] } }, "/api/catalog/internet/plans": { "get": { "operationId": "CatalogController_getInternetPlans", "parameters": [], "responses": { "200": { "description": "" } }, "security": [ { "bearer": [] } ], "summary": "Get Internet plans filtered by customer eligibility", "tags": [ "catalog" ] } }, "/api/catalog/internet/addons": { "get": { "operationId": "CatalogController_getInternetAddons", "parameters": [], "responses": { "200": { "description": "" } }, "security": [ { "bearer": [] } ], "summary": "Get Internet add-ons", "tags": [ "catalog" ] } }, "/api/catalog/internet/installations": { "get": { "operationId": "CatalogController_getInternetInstallations", "parameters": [], "responses": { "200": { "description": "" } }, "security": [ { "bearer": [] } ], "summary": "Get Internet installations", "tags": [ "catalog" ] } }, "/api/catalog/sim/plans": { "get": { "operationId": "CatalogController_getSimPlans", "parameters": [], "responses": { "200": { "description": "" } }, "security": [ { "bearer": [] } ], "summary": "Get SIM plans filtered by user's existing services", "tags": [ "catalog" ] } }, "/api/catalog/sim/activation-fees": { "get": { "operationId": "CatalogController_getSimActivationFees", "parameters": [], "responses": { "200": { "description": "" } }, "security": [ { "bearer": [] } ], "summary": "Get SIM activation fees", "tags": [ "catalog" ] } }, "/api/catalog/sim/addons": { "get": { "operationId": "CatalogController_getSimAddons", "parameters": [], "responses": { "200": { "description": "" } }, "security": [ { "bearer": [] } ], "summary": "Get SIM add-ons", "tags": [ "catalog" ] } }, "/api/catalog/vpn/plans": { "get": { "operationId": "CatalogController_getVpnPlans", "parameters": [], "responses": { "200": { "description": "" } }, "security": [ { "bearer": [] } ], "summary": "Get VPN plans", "tags": [ "catalog" ] } }, "/api/catalog/vpn/activation-fees": { "get": { "operationId": "CatalogController_getVpnActivationFees", "parameters": [], "responses": { "200": { "description": "" } }, "security": [ { "bearer": [] } ], "summary": "Get VPN activation fees", "tags": [ "catalog" ] } }, "/api/invoices": { "get": { "description": "Retrieves invoices for the authenticated user with pagination and optional status filtering", "operationId": "InvoicesController_getInvoices", "parameters": [ { "name": "page", "required": false, "in": "query", "description": "Page number (default: 1)", "schema": { "type": "number" } }, { "name": "limit", "required": false, "in": "query", "description": "Items per page (default: 10)", "schema": { "type": "number" } }, { "name": "status", "required": false, "in": "query", "description": "Filter by invoice status", "schema": { "type": "string" } } ], "responses": { "200": { "description": "List of invoices with pagination", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/InvoiceListDto" } } } } }, "security": [ { "bearer": [] } ], "summary": "Get paginated list of user invoices", "tags": [ "invoices" ] } }, "/api/invoices/payment-methods": { "get": { "description": "Retrieves all saved payment methods for the authenticated user", "operationId": "InvoicesController_getPaymentMethods", "parameters": [], "responses": { "200": { "description": "List of payment methods" } }, "security": [ { "bearer": [] } ], "summary": "Get user payment methods", "tags": [ "invoices" ] } }, "/api/invoices/payment-gateways": { "get": { "description": "Retrieves all active payment gateways available for payments", "operationId": "InvoicesController_getPaymentGateways", "parameters": [], "responses": { "200": { "description": "List of payment gateways" } }, "security": [ { "bearer": [] } ], "summary": "Get available payment gateways", "tags": [ "invoices" ] } }, "/api/invoices/test-payment-methods/{clientId}": { "get": { "description": "Direct test of WHMCS GetPayMethods API - TEMPORARY DEBUG ENDPOINT", "operationId": "InvoicesController_testPaymentMethods", "parameters": [ { "name": "clientId", "required": true, "in": "path", "description": "WHMCS Client ID to test", "schema": { "type": "number" } } ], "responses": { "200": { "description": "" } }, "security": [ { "bearer": [] } ], "summary": "Test WHMCS payment methods API for specific client ID", "tags": [ "invoices" ] } }, "/api/invoices/payment-methods/refresh": { "post": { "description": "Invalidates and refreshes payment methods cache for the current user", "operationId": "InvoicesController_refreshPaymentMethods", "parameters": [], "responses": { "200": { "description": "Payment methods cache refreshed" } }, "security": [ { "bearer": [] } ], "summary": "Refresh payment methods cache", "tags": [ "invoices" ] } }, "/api/invoices/{id}": { "get": { "description": "Retrieves detailed information for a specific invoice", "operationId": "InvoicesController_getInvoiceById", "parameters": [ { "name": "id", "required": true, "in": "path", "description": "Invoice ID", "schema": { "type": "number" } } ], "responses": { "200": { "description": "Invoice details", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/InvoiceDto" } } } }, "404": { "description": "Invoice not found" } }, "security": [ { "bearer": [] } ], "summary": "Get invoice details by ID", "tags": [ "invoices" ] } }, "/api/invoices/{id}/subscriptions": { "get": { "description": "Retrieves all subscriptions that are referenced in the invoice items", "operationId": "InvoicesController_getInvoiceSubscriptions", "parameters": [ { "name": "id", "required": true, "in": "path", "description": "Invoice ID", "schema": { "type": "number" } } ], "responses": { "200": { "description": "List of related subscriptions" }, "404": { "description": "Invoice not found" } }, "security": [ { "bearer": [] } ], "summary": "Get subscriptions related to an invoice", "tags": [ "invoices" ] } }, "/api/invoices/{id}/sso-link": { "post": { "description": "Generates a single sign-on link to view/pay the invoice or download PDF in WHMCS", "operationId": "InvoicesController_createSsoLink", "parameters": [ { "name": "id", "required": true, "in": "path", "description": "Invoice ID", "schema": { "type": "number" } }, { "name": "target", "required": false, "in": "query", "description": "Link target: view invoice, download PDF, or go to payment page (default: view)", "schema": { "enum": [ "view", "download", "pay" ], "type": "string" } } ], "responses": { "200": { "description": "SSO link created successfully" }, "404": { "description": "Invoice not found" } }, "security": [ { "bearer": [] } ], "summary": "Create SSO link for invoice", "tags": [ "invoices" ] } }, "/api/invoices/{id}/payment-link": { "post": { "description": "Generates a payment link for the invoice with a specific payment method or gateway", "operationId": "InvoicesController_createPaymentLink", "parameters": [ { "name": "id", "required": true, "in": "path", "description": "Invoice ID", "schema": { "type": "number" } }, { "name": "paymentMethodId", "required": false, "in": "query", "description": "Payment method ID", "schema": { "type": "number" } }, { "name": "gatewayName", "required": false, "in": "query", "description": "Payment gateway name", "schema": { "type": "string" } } ], "responses": { "200": { "description": "Payment link created successfully" }, "404": { "description": "Invoice not found" } }, "security": [ { "bearer": [] } ], "summary": "Create payment link for invoice with payment method", "tags": [ "invoices" ] } }, "/api/subscriptions": { "get": { "description": "Retrieves all subscriptions/services for the authenticated user", "operationId": "SubscriptionsController_getSubscriptions", "parameters": [ { "name": "status", "required": false, "in": "query", "description": "Filter by subscription status", "schema": { "type": "string" } } ], "responses": { "200": { "description": "List of user subscriptions" } }, "security": [ { "bearer": [] } ], "summary": "Get all user subscriptions", "tags": [ "subscriptions" ] } }, "/api/subscriptions/active": { "get": { "description": "Retrieves only active subscriptions for the authenticated user", "operationId": "SubscriptionsController_getActiveSubscriptions", "parameters": [], "responses": { "200": { "description": "List of active subscriptions" } }, "security": [ { "bearer": [] } ], "summary": "Get active subscriptions only", "tags": [ "subscriptions" ] } }, "/api/subscriptions/stats": { "get": { "description": "Retrieves subscription count statistics by status", "operationId": "SubscriptionsController_getSubscriptionStats", "parameters": [], "responses": { "200": { "description": "Subscription statistics" } }, "security": [ { "bearer": [] } ], "summary": "Get subscription statistics", "tags": [ "subscriptions" ] } }, "/api/subscriptions/{id}": { "get": { "description": "Retrieves detailed information for a specific subscription", "operationId": "SubscriptionsController_getSubscriptionById", "parameters": [ { "name": "id", "required": true, "in": "path", "description": "Subscription ID", "schema": { "type": "number" } } ], "responses": { "200": { "description": "Subscription details" }, "404": { "description": "Subscription not found" } }, "security": [ { "bearer": [] } ], "summary": "Get subscription details by ID", "tags": [ "subscriptions" ] } }, "/api/subscriptions/{id}/invoices": { "get": { "description": "Retrieves all invoices related to a specific subscription", "operationId": "SubscriptionsController_getSubscriptionInvoices", "parameters": [ { "name": "id", "required": true, "in": "path", "description": "Subscription ID", "schema": { "type": "number" } }, { "name": "page", "required": false, "in": "query", "description": "Page number (default: 1)", "schema": { "type": "number" } }, { "name": "limit", "required": false, "in": "query", "description": "Items per page (default: 10)", "schema": { "type": "number" } } ], "responses": { "200": { "description": "List of invoices for the subscription" }, "404": { "description": "Subscription not found" } }, "security": [ { "bearer": [] } ], "summary": "Get invoices for a specific subscription", "tags": [ "subscriptions" ] } }, "/api/subscriptions/{id}/sim/debug": { "get": { "description": "Retrieves subscription data to help debug SIM management issues", "operationId": "SubscriptionsController_debugSimSubscription", "parameters": [ { "name": "id", "required": true, "in": "path", "description": "Subscription ID", "schema": { "type": "number" } } ], "responses": { "200": { "description": "Subscription debug data" } }, "security": [ { "bearer": [] } ], "summary": "Debug SIM subscription data", "tags": [ "subscriptions" ] } }, "/api/subscriptions/{id}/sim": { "get": { "description": "Retrieves comprehensive SIM information including details and current usage", "operationId": "SubscriptionsController_getSimInfo", "parameters": [ { "name": "id", "required": true, "in": "path", "description": "Subscription ID", "schema": { "type": "number" } } ], "responses": { "200": { "description": "SIM information" }, "400": { "description": "Not a SIM subscription" }, "404": { "description": "Subscription not found" } }, "security": [ { "bearer": [] } ], "summary": "Get SIM details and usage", "tags": [ "subscriptions" ] } }, "/api/subscriptions/{id}/sim/details": { "get": { "description": "Retrieves detailed SIM information including ICCID, plan, status, etc.", "operationId": "SubscriptionsController_getSimDetails", "parameters": [ { "name": "id", "required": true, "in": "path", "description": "Subscription ID", "schema": { "type": "number" } } ], "responses": { "200": { "description": "SIM details" } }, "security": [ { "bearer": [] } ], "summary": "Get SIM details", "tags": [ "subscriptions" ] } }, "/api/subscriptions/{id}/sim/usage": { "get": { "description": "Retrieves current data usage and recent usage history", "operationId": "SubscriptionsController_getSimUsage", "parameters": [ { "name": "id", "required": true, "in": "path", "description": "Subscription ID", "schema": { "type": "number" } } ], "responses": { "200": { "description": "SIM usage data" } }, "security": [ { "bearer": [] } ], "summary": "Get SIM data usage", "tags": [ "subscriptions" ] } }, "/api/subscriptions/{id}/sim/top-up-history": { "get": { "description": "Retrieves data top-up history for the specified date range", "operationId": "SubscriptionsController_getSimTopUpHistory", "parameters": [ { "name": "id", "required": true, "in": "path", "description": "Subscription ID", "schema": { "type": "number" } }, { "name": "fromDate", "required": true, "in": "query", "description": "Start date (YYYYMMDD)", "schema": { "example": "20240101", "type": "string" } }, { "name": "toDate", "required": true, "in": "query", "description": "End date (YYYYMMDD)", "schema": { "example": "20241231", "type": "string" } } ], "responses": { "200": { "description": "Top-up history" } }, "security": [ { "bearer": [] } ], "summary": "Get SIM top-up history", "tags": [ "subscriptions" ] } }, "/api/subscriptions/{id}/sim/top-up": { "post": { "description": "Add data quota to the SIM service", "operationId": "SubscriptionsController_topUpSim", "parameters": [ { "name": "id", "required": true, "in": "path", "description": "Subscription ID", "schema": { "type": "number" } } ], "requestBody": { "required": true, "description": "Top-up request", "content": { "application/json": { "schema": { "type": "object", "properties": { "quotaMb": { "type": "number", "description": "Quota in MB", "example": 1000 } }, "required": [ "quotaMb" ] } } } }, "responses": { "200": { "description": "Top-up successful" } }, "security": [ { "bearer": [] } ], "summary": "Top up SIM data quota", "tags": [ "subscriptions" ] } }, "/api/subscriptions/{id}/sim/change-plan": { "post": { "description": "Change the SIM service plan. The change will be automatically scheduled for the 1st of the next month.", "operationId": "SubscriptionsController_changeSimPlan", "parameters": [ { "name": "id", "required": true, "in": "path", "description": "Subscription ID", "schema": { "type": "number" } } ], "requestBody": { "required": true, "description": "Plan change request", "content": { "application/json": { "schema": { "type": "object", "properties": { "newPlanCode": { "type": "string", "description": "New plan code", "example": "LTE3G_P01" } }, "required": [ "newPlanCode" ] } } } }, "responses": { "200": { "description": "Plan change successful" } }, "security": [ { "bearer": [] } ], "summary": "Change SIM plan", "tags": [ "subscriptions" ] } }, "/api/subscriptions/{id}/sim/cancel": { "post": { "description": "Cancel the SIM service (immediate or scheduled)", "operationId": "SubscriptionsController_cancelSim", "parameters": [ { "name": "id", "required": true, "in": "path", "description": "Subscription ID", "schema": { "type": "number" } } ], "requestBody": { "required": false, "description": "Cancellation request", "content": { "application/json": { "schema": { "type": "object", "properties": { "scheduledAt": { "type": "string", "description": "Schedule cancellation (YYYYMMDD)", "example": "20241231" } } } } } }, "responses": { "200": { "description": "Cancellation successful" } }, "security": [ { "bearer": [] } ], "summary": "Cancel SIM service", "tags": [ "subscriptions" ] } }, "/api/subscriptions/{id}/sim/reissue-esim": { "post": { "description": "Reissue a downloadable eSIM profile (eSIM only). Optionally provide a new EID to transfer to.", "operationId": "SubscriptionsController_reissueEsimProfile", "parameters": [ { "name": "id", "required": true, "in": "path", "description": "Subscription ID", "schema": { "type": "number" } } ], "requestBody": { "required": true, "description": "Optional new EID to transfer the eSIM to", "content": { "application/json": { "schema": { "type": "object", "properties": { "newEid": { "type": "string", "description": "32-digit EID", "example": "89049032000001000000043598005455" } }, "required": [] } } } }, "responses": { "200": { "description": "eSIM reissue successful" }, "400": { "description": "Not an eSIM subscription" } }, "security": [ { "bearer": [] } ], "summary": "Reissue eSIM profile", "tags": [ "subscriptions" ] } }, "/api/subscriptions/{id}/sim/features": { "post": { "description": "Enable/disable voicemail, call waiting, international roaming, and switch network type (4G/5G)", "operationId": "SubscriptionsController_updateSimFeatures", "parameters": [ { "name": "id", "required": true, "in": "path", "description": "Subscription ID", "schema": { "type": "number" } } ], "requestBody": { "required": true, "description": "Features update request", "content": { "application/json": { "schema": { "type": "object", "properties": { "voiceMailEnabled": { "type": "boolean" }, "callWaitingEnabled": { "type": "boolean" }, "internationalRoamingEnabled": { "type": "boolean" }, "networkType": { "type": "string", "enum": [ "4G", "5G" ] } } } } } }, "responses": { "200": { "description": "Features update successful" } }, "security": [ { "bearer": [] } ], "summary": "Update SIM features", "tags": [ "subscriptions" ] } }, "/api/subscriptions/sim/orders/activate": { "post": { "operationId": "SimOrdersController_activate", "parameters": [], "requestBody": { "required": true, "description": "SIM activation order payload", "content": { "application/json": { "schema": { "type": "string" } } } }, "responses": { "200": { "description": "Activation processed" } }, "security": [ { "bearer": [] } ], "summary": "Create invoice, capture payment, and activate SIM in Freebit", "tags": [ "sim-orders" ] } }, "/health": { "get": { "operationId": "HealthController_getHealth", "parameters": [], "responses": { "200": { "description": "" } }, "tags": [ "Health" ] } } }, "info": { "title": "Customer Portal API", "description": "Backend for Frontend API for customer portal", "version": "1.0", "contact": {} }, "tags": [], "servers": [], "components": { "securitySchemes": { "bearer": { "scheme": "bearer", "bearerFormat": "JWT", "type": "http" } }, "schemas": { "CreateOrderDto": { "type": "object", "properties": {} }, "UpdateUserDto": { "type": "object", "properties": { "firstName": { "type": "string", "description": "User's first name" }, "lastName": { "type": "string", "description": "User's last name" }, "company": { "type": "string", "description": "User's company name" }, "phone": { "type": "string", "description": "User's phone number" }, "email": { "type": "string", "description": "User's email address" } } }, "UpdateAddressDto": { "type": "object", "properties": { "street": { "type": "string", "description": "Street address" }, "streetLine2": { "type": "string", "description": "Street address line 2" }, "city": { "type": "string", "description": "City" }, "state": { "type": "string", "description": "State/Prefecture" }, "postalCode": { "type": "string", "description": "Postal code" }, "country": { "type": "string", "description": "Country (ISO alpha-2)" } } }, "ValidateSignupDto": { "type": "object", "properties": { "sfNumber": { "type": "string", "description": "Customer Number (SF Number) to validate", "example": "12345" } }, "required": [ "sfNumber" ] }, "AddressDto": { "type": "object", "properties": { "street": { "type": "string", "example": "123 Main Street" }, "streetLine2": { "type": "string", "example": "Apt 4B" }, "city": { "type": "string", "example": "Tokyo" }, "state": { "type": "string", "example": "Tokyo" }, "postalCode": { "type": "string", "example": "100-0001" }, "country": { "type": "string", "example": "JP", "description": "ISO 2-letter country code" } }, "required": [ "street", "city", "state", "postalCode", "country" ] }, "SignupDto": { "type": "object", "properties": { "email": { "type": "string", "example": "user@example.com" }, "password": { "type": "string", "example": "SecurePassword123!", "description": "Password must be at least 8 characters and contain uppercase, lowercase, number, and special character" }, "firstName": { "type": "string", "example": "John" }, "lastName": { "type": "string", "example": "Doe" }, "company": { "type": "string", "example": "Acme Corp" }, "phone": { "type": "string", "example": "+81-90-1234-5678", "description": "Contact phone number" }, "sfNumber": { "type": "string", "example": "CN-0012345", "description": "Customer Number (SF Number)" }, "address": { "description": "Address for WHMCS client (required)", "allOf": [ { "$ref": "#/components/schemas/AddressDto" } ] }, "nationality": { "type": "string" }, "dateOfBirth": { "type": "string", "example": "1990-01-01" }, "gender": { "type": "string", "enum": [ "male", "female", "other" ] } }, "required": [ "email", "password", "firstName", "lastName", "phone", "sfNumber", "address" ] }, "AccountStatusRequestDto": { "type": "object", "properties": { "email": { "type": "string", "example": "user@example.com" } }, "required": [ "email" ] }, "LinkWhmcsDto": { "type": "object", "properties": { "email": { "type": "string", "example": "user@example.com" }, "password": { "type": "string", "example": "existing-whmcs-password" } }, "required": [ "email", "password" ] }, "SetPasswordDto": { "type": "object", "properties": { "email": { "type": "string", "example": "user@example.com" }, "password": { "type": "string", "example": "NewSecurePassword123!", "description": "Password must be at least 8 characters and contain uppercase, lowercase, number, and special character" } }, "required": [ "email", "password" ] }, "RequestPasswordResetDto": { "type": "object", "properties": { "email": { "type": "string", "example": "user@example.com" } }, "required": [ "email" ] }, "ResetPasswordDto": { "type": "object", "properties": { "token": { "type": "string", "description": "Password reset token" }, "password": { "type": "string", "example": "SecurePassword123!" } }, "required": [ "token", "password" ] }, "ChangePasswordDto": { "type": "object", "properties": { "currentPassword": { "type": "string", "example": "CurrentPassword123!" }, "newPassword": { "type": "string", "example": "NewSecurePassword123!" } }, "required": [ "currentPassword", "newPassword" ] }, "SsoLinkDto": { "type": "object", "properties": { "destination": { "type": "string", "description": "WHMCS destination path", "example": "index.php?rp=/account/paymentmethods" } } }, "InvoiceItemDto": { "type": "object", "properties": { "id": { "type": "number", "example": 101 }, "description": { "type": "string", "example": "Monthly hosting" }, "amount": { "type": "number", "example": 19.99 }, "quantity": { "type": "number", "example": 1 }, "type": { "type": "string", "example": "Hosting" }, "serviceId": { "type": "number", "example": 555 } }, "required": [ "id", "description", "amount", "type" ] }, "InvoiceDto": { "type": "object", "properties": { "id": { "type": "number", "example": 1234 }, "number": { "type": "string", "example": "INV-2025-0001" }, "status": { "type": "string", "example": "Unpaid" }, "currency": { "type": "string", "example": "USD" }, "currencySymbol": { "type": "string", "example": "¥" }, "total": { "type": "number", "example": 19.99 }, "subtotal": { "type": "number", "example": 18.17 }, "tax": { "type": "number", "example": 1.82 }, "issuedAt": { "type": "string", "example": "2025-01-01T00:00:00.000Z" }, "dueDate": { "type": "string", "example": "2025-01-15T00:00:00.000Z" }, "paidDate": { "type": "string", "example": "2025-01-10T00:00:00.000Z" }, "pdfUrl": { "type": "string" }, "paymentUrl": { "type": "string" }, "description": { "type": "string" }, "items": { "type": "array", "items": { "$ref": "#/components/schemas/InvoiceItemDto" } } }, "required": [ "id", "number", "status", "currency", "total", "subtotal", "tax" ] }, "PaginationDto": { "type": "object", "properties": { "page": { "type": "number", "example": 1 }, "totalPages": { "type": "number", "example": 5 }, "totalItems": { "type": "number", "example": 42 }, "nextCursor": { "type": "string" } }, "required": [ "page", "totalPages", "totalItems" ] }, "InvoiceListDto": { "type": "object", "properties": { "invoices": { "type": "array", "items": { "$ref": "#/components/schemas/InvoiceDto" } }, "pagination": { "$ref": "#/components/schemas/PaginationDto" } }, "required": [ "invoices", "pagination" ] } } } }