diff --git a/src/config/app.php b/src/config/app.php --- a/src/config/app.php +++ b/src/config/app.php @@ -85,10 +85,20 @@ 'website_domain' => env('APP_WEBSITE_DOMAIN', env('APP_DOMAIN', 'domain.tld')), - 'services_domain' => env( - 'APP_SERVICES_DOMAIN', - "services." . env('APP_WEBSITE_DOMAIN', env('APP_DOMAIN', 'domain.tld')) - ), + 'services_domains' => explode(',', env( + 'APP_SERVICES_DOMAINS', + env('APP_SERVICES_DOMAIN', "services." . env('APP_WEBSITE_DOMAIN', env('APP_DOMAIN', 'domain.tld'))), + )), + + 'admin_domains' => explode(',', env( + 'APP_ADMIN_DOMAINS', + "admin." . env('APP_WEBSITE_DOMAIN', env('APP_DOMAIN', 'domain.tld')), + )), + + 'reseller_domains' => explode(',', env( + 'APP_RESELLER_DOMAINS', + "reseller." . env('APP_WEBSITE_DOMAIN', env('APP_DOMAIN', 'domain.tld')), + )), /* |-------------------------------------------------------------------------- diff --git a/src/routes/api.php b/src/routes/api.php --- a/src/routes/api.php +++ b/src/routes/api.php @@ -1,7 +1,6 @@ $servicesDomain, + 'prefix' => 'webhooks' + ], + function () { + Route::get('nginx', [API\V4\NGINXController::class, 'authenticate']); + Route::get('nginx-roundcube', [API\V4\NGINXController::class, 'authenticateRoundcube']); + Route::get('nginx-httpauth', [API\V4\NGINXController::class, 'httpauth']); + Route::post('cyrus-sasl', [API\V4\NGINXController::class, 'cyrussasl']); + Route::post('policy/greylist', [API\V4\PolicyController::class, 'greylist']); + Route::post('policy/ratelimit', [API\V4\PolicyController::class, 'ratelimit']); + Route::post('policy/spf', [API\V4\PolicyController::class, 'senderPolicyFramework']); + Route::get('health/status', [API\V4\HealthController::class, 'status']); + Route::get('metrics', [API\V4\MetricsController::class, 'metrics']); + } + ); + } +} + +if (\config('app.with_admin')) { + foreach (\config('app.admin_domains') as $adminDomain) { + Route::group( + [ + 'domain' => $adminDomain, + 'middleware' => ['auth:api', 'admin'], + 'prefix' => 'v4', + ], + function () { + Route::apiResource('domains', API\V4\Admin\DomainsController::class); + Route::get('domains/{id}/skus', [API\V4\Admin\DomainsController::class, 'skus']); + Route::post('domains/{id}/suspend', [API\V4\Admin\DomainsController::class, 'suspend']); + Route::post('domains/{id}/unsuspend', [API\V4\Admin\DomainsController::class, 'unsuspend']); + + Route::get('eventlog/{type}/{id}', [API\V4\Admin\EventLogController::class, 'index']); + + Route::apiResource('groups', API\V4\Admin\GroupsController::class); + Route::post('groups/{id}/suspend', [API\V4\Admin\GroupsController::class, 'suspend']); + Route::post('groups/{id}/unsuspend', [API\V4\Admin\GroupsController::class, 'unsuspend']); + + Route::apiResource('resources', API\V4\Admin\ResourcesController::class); + Route::apiResource('shared-folders', API\V4\Admin\SharedFoldersController::class); + Route::apiResource('skus', API\V4\Admin\SkusController::class); + + Route::apiResource('users', API\V4\Admin\UsersController::class); + Route::get('users/{id}/discounts', [API\V4\Admin\DiscountsController::class, 'userDiscounts']); + Route::post('users/{id}/reset2FA', [API\V4\Admin\UsersController::class, 'reset2FA']); + Route::post('users/{id}/resetGeoLock', [API\V4\Admin\UsersController::class, 'resetGeoLock']); + Route::post('users/{id}/resync', [API\V4\Admin\UsersController::class, 'resync']); + Route::get('users/{id}/skus', [API\V4\Admin\UsersController::class, 'skus']); + Route::post('users/{id}/skus/{sku}', [API\V4\Admin\UsersController::class, 'setSku']); + Route::post('users/{id}/suspend', [API\V4\Admin\UsersController::class, 'suspend']); + Route::post('users/{id}/unsuspend', [API\V4\Admin\UsersController::class, 'unsuspend']); + + Route::apiResource('wallets', API\V4\Admin\WalletsController::class); + Route::post('wallets/{id}/one-off', [API\V4\Admin\WalletsController::class, 'oneOff']); + Route::get('wallets/{id}/transactions', [API\V4\Admin\WalletsController::class, 'transactions']); + + Route::get('stats/chart/{chart}', [API\V4\Admin\StatsController::class, 'chart']); + } + ); + + Route::group( + [ + 'domain' => $adminDomain, + 'prefix' => 'v4', + ], + function () { + Route::get('inspect-request', [API\V4\Admin\UsersController::class, 'inspectRequest']); + } + ); + } +} + +if (\config('app.with_reseller')) { + foreach (\config('app.reseller_domains') as $resellerDomain) { + Route::group( + [ + 'domain' => $resellerDomain, + 'middleware' => ['auth:api', 'reseller'], + 'prefix' => 'v4', + ], + function () { + Route::apiResource('domains', API\V4\Reseller\DomainsController::class); + Route::get('domains/{id}/skus', [API\V4\Reseller\DomainsController::class, 'skus']); + Route::post('domains/{id}/suspend', [API\V4\Reseller\DomainsController::class, 'suspend']); + Route::post('domains/{id}/unsuspend', [API\V4\Reseller\DomainsController::class, 'unsuspend']); + + Route::get('eventlog/{type}/{id}', [API\V4\Reseller\EventLogController::class, 'index']); + + Route::apiResource('groups', API\V4\Reseller\GroupsController::class); + Route::post('groups/{id}/suspend', [API\V4\Reseller\GroupsController::class, 'suspend']); + Route::post('groups/{id}/unsuspend', [API\V4\Reseller\GroupsController::class, 'unsuspend']); + + Route::apiResource('invitations', API\V4\Reseller\InvitationsController::class); + Route::post('invitations/{id}/resend', [API\V4\Reseller\InvitationsController::class, 'resend']); + + Route::post('payments', [API\V4\Reseller\PaymentsController::class, 'store']); + Route::get('payments/mandate', [API\V4\Reseller\PaymentsController::class, 'mandate']); + Route::post('payments/mandate', [API\V4\Reseller\PaymentsController::class, 'mandateCreate']); + Route::put('payments/mandate', [API\V4\Reseller\PaymentsController::class, 'mandateUpdate']); + Route::delete('payments/mandate', [API\V4\Reseller\PaymentsController::class, 'mandateDelete']); + Route::get('payments/methods', [API\V4\Reseller\PaymentsController::class, 'paymentMethods']); + Route::get('payments/pending', [API\V4\Reseller\PaymentsController::class, 'payments']); + Route::get('payments/has-pending', [API\V4\Reseller\PaymentsController::class, 'hasPayments']); + + Route::apiResource('resources', API\V4\Reseller\ResourcesController::class); + Route::apiResource('shared-folders', API\V4\Reseller\SharedFoldersController::class); + Route::apiResource('skus', API\V4\Reseller\SkusController::class); + + Route::apiResource('users', API\V4\Reseller\UsersController::class); + Route::get('users/{id}/discounts', [API\V4\Reseller\DiscountsController::class, 'userDiscounts']); + Route::post('users/{id}/reset2FA', [API\V4\Reseller\UsersController::class, 'reset2FA']); + Route::post('users/{id}/resetGeoLock', [API\V4\Reseller\UsersController::class, 'resetGeoLock']); + Route::post('users/{id}/resync', [API\V4\Reseller\UsersController::class, 'resync']); + Route::get('users/{id}/skus', [API\V4\Reseller\UsersController::class, 'skus']); + Route::post('users/{id}/skus/{sku}', [API\V4\Reseller\UsersController::class, 'setSku']); + Route::post('users/{id}/suspend', [API\V4\Reseller\UsersController::class, 'suspend']); + Route::post('users/{id}/unsuspend', [API\V4\Reseller\UsersController::class, 'unsuspend']); + + Route::apiResource('wallets', API\V4\Reseller\WalletsController::class); + Route::post('wallets/{id}/one-off', [API\V4\Reseller\WalletsController::class, 'oneOff']); + Route::get('wallets/{id}/receipts', [API\V4\Reseller\WalletsController::class, 'receipts']); + Route::get('wallets/{id}/receipts/{receipt}', [API\V4\Reseller\WalletsController::class, 'receiptDownload']); + Route::get('wallets/{id}/transactions', [API\V4\Reseller\WalletsController::class, 'transactions']); + + Route::get('stats/chart/{chart}', [API\V4\Reseller\StatsController::class, 'chart']); + } + ); + } +} + Route::group( [ 'middleware' => 'api', @@ -38,7 +171,6 @@ Route::group( [ - 'domain' => \config('app.website_domain'), 'middleware' => 'api', 'prefix' => 'auth' ], @@ -54,7 +186,6 @@ if (\config('app.with_signup')) { Route::group( [ - 'domain' => \config('app.website_domain'), 'middleware' => 'api', 'prefix' => 'auth' ], @@ -72,7 +203,6 @@ Route::group( [ - 'domain' => \config('app.website_domain'), 'middleware' => ['auth:api', 'scope:mfa,api'], 'prefix' => 'v4' ], @@ -89,7 +219,6 @@ if (\config('app.with_files')) { Route::group( [ - 'domain' => \config('app.website_domain'), 'middleware' => ['auth:api', 'scope:fs,api'], 'prefix' => 'v4' ], @@ -103,7 +232,6 @@ ); Route::group( [ - 'domain' => \config('app.website_domain'), 'middleware' => [], 'prefix' => 'v4' ], @@ -117,7 +245,6 @@ Route::group( [ - 'domain' => \config('app.website_domain'), 'middleware' => ['auth:api', 'scope:api'], 'prefix' => 'v4' ], @@ -195,7 +322,6 @@ Route::group( [ - 'domain' => \config('app.website_domain'), 'prefix' => 'webhooks' ], function () { @@ -203,131 +329,3 @@ Route::post('meet', [API\V4\MeetController::class, 'webhook']); } ); - -if (\config('app.with_services')) { - Route::group( - [ - 'domain' => \config('app.services_domain'), - 'prefix' => 'webhooks' - ], - function () { - Route::get('nginx', [API\V4\NGINXController::class, 'authenticate']); - Route::get('nginx-roundcube', [API\V4\NGINXController::class, 'authenticateRoundcube']); - Route::get('nginx-httpauth', [API\V4\NGINXController::class, 'httpauth']); - Route::post('cyrus-sasl', [API\V4\NGINXController::class, 'cyrussasl']); - Route::post('policy/greylist', [API\V4\PolicyController::class, 'greylist']); - Route::post('policy/ratelimit', [API\V4\PolicyController::class, 'ratelimit']); - Route::post('policy/spf', [API\V4\PolicyController::class, 'senderPolicyFramework']); - Route::get('health/status', [API\V4\HealthController::class, 'status']); - Route::get('metrics', [API\V4\MetricsController::class, 'metrics']); - } - ); -} - -if (\config('app.with_admin')) { - Route::group( - [ - 'domain' => 'admin.' . \config('app.website_domain'), - 'middleware' => ['auth:api', 'admin'], - 'prefix' => 'v4', - ], - function () { - Route::apiResource('domains', API\V4\Admin\DomainsController::class); - Route::get('domains/{id}/skus', [API\V4\Admin\DomainsController::class, 'skus']); - Route::post('domains/{id}/suspend', [API\V4\Admin\DomainsController::class, 'suspend']); - Route::post('domains/{id}/unsuspend', [API\V4\Admin\DomainsController::class, 'unsuspend']); - - Route::get('eventlog/{type}/{id}', [API\V4\Admin\EventLogController::class, 'index']); - - Route::apiResource('groups', API\V4\Admin\GroupsController::class); - Route::post('groups/{id}/suspend', [API\V4\Admin\GroupsController::class, 'suspend']); - Route::post('groups/{id}/unsuspend', [API\V4\Admin\GroupsController::class, 'unsuspend']); - - Route::apiResource('resources', API\V4\Admin\ResourcesController::class); - Route::apiResource('shared-folders', API\V4\Admin\SharedFoldersController::class); - Route::apiResource('skus', API\V4\Admin\SkusController::class); - - Route::apiResource('users', API\V4\Admin\UsersController::class); - Route::get('users/{id}/discounts', [API\V4\Admin\DiscountsController::class, 'userDiscounts']); - Route::post('users/{id}/reset2FA', [API\V4\Admin\UsersController::class, 'reset2FA']); - Route::post('users/{id}/resetGeoLock', [API\V4\Admin\UsersController::class, 'resetGeoLock']); - Route::post('users/{id}/resync', [API\V4\Admin\UsersController::class, 'resync']); - Route::get('users/{id}/skus', [API\V4\Admin\UsersController::class, 'skus']); - Route::post('users/{id}/skus/{sku}', [API\V4\Admin\UsersController::class, 'setSku']); - Route::post('users/{id}/suspend', [API\V4\Admin\UsersController::class, 'suspend']); - Route::post('users/{id}/unsuspend', [API\V4\Admin\UsersController::class, 'unsuspend']); - - Route::apiResource('wallets', API\V4\Admin\WalletsController::class); - Route::post('wallets/{id}/one-off', [API\V4\Admin\WalletsController::class, 'oneOff']); - Route::get('wallets/{id}/transactions', [API\V4\Admin\WalletsController::class, 'transactions']); - - Route::get('stats/chart/{chart}', [API\V4\Admin\StatsController::class, 'chart']); - } - ); - - Route::group( - [ - 'domain' => 'admin.' . \config('app.website_domain'), - 'prefix' => 'v4', - ], - function () { - Route::get('inspect-request', [API\V4\Admin\UsersController::class, 'inspectRequest']); - } - ); -} - -if (\config('app.with_reseller')) { - Route::group( - [ - 'domain' => 'reseller.' . \config('app.website_domain'), - 'middleware' => ['auth:api', 'reseller'], - 'prefix' => 'v4', - ], - function () { - Route::apiResource('domains', API\V4\Reseller\DomainsController::class); - Route::get('domains/{id}/skus', [API\V4\Reseller\DomainsController::class, 'skus']); - Route::post('domains/{id}/suspend', [API\V4\Reseller\DomainsController::class, 'suspend']); - Route::post('domains/{id}/unsuspend', [API\V4\Reseller\DomainsController::class, 'unsuspend']); - - Route::get('eventlog/{type}/{id}', [API\V4\Reseller\EventLogController::class, 'index']); - - Route::apiResource('groups', API\V4\Reseller\GroupsController::class); - Route::post('groups/{id}/suspend', [API\V4\Reseller\GroupsController::class, 'suspend']); - Route::post('groups/{id}/unsuspend', [API\V4\Reseller\GroupsController::class, 'unsuspend']); - - Route::apiResource('invitations', API\V4\Reseller\InvitationsController::class); - Route::post('invitations/{id}/resend', [API\V4\Reseller\InvitationsController::class, 'resend']); - - Route::post('payments', [API\V4\Reseller\PaymentsController::class, 'store']); - Route::get('payments/mandate', [API\V4\Reseller\PaymentsController::class, 'mandate']); - Route::post('payments/mandate', [API\V4\Reseller\PaymentsController::class, 'mandateCreate']); - Route::put('payments/mandate', [API\V4\Reseller\PaymentsController::class, 'mandateUpdate']); - Route::delete('payments/mandate', [API\V4\Reseller\PaymentsController::class, 'mandateDelete']); - Route::get('payments/methods', [API\V4\Reseller\PaymentsController::class, 'paymentMethods']); - Route::get('payments/pending', [API\V4\Reseller\PaymentsController::class, 'payments']); - Route::get('payments/has-pending', [API\V4\Reseller\PaymentsController::class, 'hasPayments']); - - Route::apiResource('resources', API\V4\Reseller\ResourcesController::class); - Route::apiResource('shared-folders', API\V4\Reseller\SharedFoldersController::class); - Route::apiResource('skus', API\V4\Reseller\SkusController::class); - - Route::apiResource('users', API\V4\Reseller\UsersController::class); - Route::get('users/{id}/discounts', [API\V4\Reseller\DiscountsController::class, 'userDiscounts']); - Route::post('users/{id}/reset2FA', [API\V4\Reseller\UsersController::class, 'reset2FA']); - Route::post('users/{id}/resetGeoLock', [API\V4\Reseller\UsersController::class, 'resetGeoLock']); - Route::post('users/{id}/resync', [API\V4\Reseller\UsersController::class, 'resync']); - Route::get('users/{id}/skus', [API\V4\Reseller\UsersController::class, 'skus']); - Route::post('users/{id}/skus/{sku}', [API\V4\Reseller\UsersController::class, 'setSku']); - Route::post('users/{id}/suspend', [API\V4\Reseller\UsersController::class, 'suspend']); - Route::post('users/{id}/unsuspend', [API\V4\Reseller\UsersController::class, 'unsuspend']); - - Route::apiResource('wallets', API\V4\Reseller\WalletsController::class); - Route::post('wallets/{id}/one-off', [API\V4\Reseller\WalletsController::class, 'oneOff']); - Route::get('wallets/{id}/receipts', [API\V4\Reseller\WalletsController::class, 'receipts']); - Route::get('wallets/{id}/receipts/{receipt}', [API\V4\Reseller\WalletsController::class, 'receiptDownload']); - Route::get('wallets/{id}/transactions', [API\V4\Reseller\WalletsController::class, 'transactions']); - - Route::get('stats/chart/{chart}', [API\V4\Reseller\StatsController::class, 'chart']); - } - ); -}