diff --git a/src/.env.example b/src/.env.example index 7a2ab8c6..37557836 100644 --- a/src/.env.example +++ b/src/.env.example @@ -1,152 +1,156 @@ APP_NAME=Kolab APP_ENV=local APP_KEY= APP_DEBUG=true APP_URL=http://127.0.0.1:8000 #APP_PASSPHRASE= APP_PUBLIC_URL= APP_DOMAIN=kolabnow.com APP_THEME=default APP_TENANT_ID=5 APP_LOCALE=en APP_LOCALES=en,de +APP_WITH_ADMIN=1 +APP_WITH_RESELLER=1 +APP_WITH_SERVICES=1 + ASSET_URL=http://127.0.0.1:8000 WEBMAIL_URL=/apps SUPPORT_URL=/support SUPPORT_EMAIL= LOG_CHANNEL=stack LOG_SLOW_REQUESTS=5 DB_CONNECTION=mysql DB_DATABASE=kolabdev DB_HOST=127.0.0.1 DB_PASSWORD=kolab DB_PORT=3306 DB_USERNAME=kolabdev BROADCAST_DRIVER=redis CACHE_DRIVER=redis QUEUE_CONNECTION=redis SESSION_DRIVER=file SESSION_LIFETIME=120 OPENEXCHANGERATES_API_KEY="from openexchangerates.org" MFA_DSN=mysql://roundcube:Welcome2KolabSystems@127.0.0.1/roundcube MFA_TOTP_DIGITS=6 MFA_TOTP_INTERVAL=30 MFA_TOTP_DIGEST=sha1 IMAP_URI=ssl://127.0.0.1:993 IMAP_ADMIN_LOGIN=cyrus-admin IMAP_ADMIN_PASSWORD=Welcome2KolabSystems IMAP_VERIFY_HOST=false IMAP_VERIFY_PEER=false LDAP_BASE_DN="dc=mgmt,dc=com" LDAP_DOMAIN_BASE_DN="ou=Domains,dc=mgmt,dc=com" LDAP_HOSTS=127.0.0.1 LDAP_PORT=389 LDAP_SERVICE_BIND_DN="uid=kolab-service,ou=Special Users,dc=mgmt,dc=com" LDAP_SERVICE_BIND_PW="Welcome2KolabSystems" LDAP_USE_SSL=false LDAP_USE_TLS=false # Administrative LDAP_ADMIN_BIND_DN="cn=Directory Manager" LDAP_ADMIN_BIND_PW="Welcome2KolabSystems" LDAP_ADMIN_ROOT_DN="dc=mgmt,dc=com" # Hosted (public registration) LDAP_HOSTED_BIND_DN="uid=hosted-kolab-service,ou=Special Users,dc=mgmt,dc=com" LDAP_HOSTED_BIND_PW="Welcome2KolabSystems" LDAP_HOSTED_ROOT_DN="dc=hosted,dc=com" OPENVIDU_API_PASSWORD=MY_SECRET OPENVIDU_API_URL=http://localhost:8080/api/ OPENVIDU_API_USERNAME=OPENVIDUAPP OPENVIDU_API_VERIFY_TLS=true OPENVIDU_COTURN_IP=127.0.0.1 OPENVIDU_COTURN_REDIS_DATABASE=2 OPENVIDU_COTURN_REDIS_IP=127.0.0.1 OPENVIDU_COTURN_REDIS_PASSWORD=turn # Used as COTURN_IP, TURN_PUBLIC_IP, for KMS_TURN_URL OPENVIDU_PUBLIC_IP=127.0.0.1 OPENVIDU_PUBLIC_PORT=3478 OPENVIDU_SERVER_PORT=8080 OPENVIDU_WEBHOOK=true OPENVIDU_WEBHOOK_ENDPOINT=http://127.0.0.1:8000/webhooks/meet/openvidu # "CDR" events, see https://docs.openvidu.io/en/2.13.0/reference-docs/openvidu-server-cdr/ #OPENVIDU_WEBHOOK_EVENTS=[sessionCreated,sessionDestroyed,participantJoined,participantLeft,webrtcConnectionCreated,webrtcConnectionDestroyed,recordingStatusChanged,filterEventDispatched,mediaNodeStatusChanged] #OPENVIDU_WEBHOOK_HEADERS=[\"Authorization:\ Basic\ SOMETHING\"] REDIS_HOST=127.0.0.1 REDIS_PASSWORD=null REDIS_PORT=6379 SWOOLE_HOT_RELOAD_ENABLE=true SWOOLE_HTTP_ACCESS_LOG=true SWOOLE_HTTP_HOST=127.0.0.1 SWOOLE_HTTP_PORT=8000 SWOOLE_HTTP_REACTOR_NUM=1 SWOOLE_HTTP_WEBSOCKET=true SWOOLE_HTTP_WORKER_NUM=1 SWOOLE_OB_OUTPUT=true PAYMENT_PROVIDER= MOLLIE_KEY= STRIPE_KEY= STRIPE_PUBLIC_KEY= STRIPE_WEBHOOK_SECRET= MAIL_DRIVER=smtp MAIL_HOST=smtp.mailtrap.io MAIL_PORT=2525 MAIL_USERNAME=null MAIL_PASSWORD=null MAIL_ENCRYPTION=null MAIL_FROM_ADDRESS="noreply@example.com" MAIL_FROM_NAME="Example.com" MAIL_REPLYTO_ADDRESS="replyto@example.com" MAIL_REPLYTO_NAME=null DNS_TTL=3600 DNS_SPF="v=spf1 mx -all" DNS_STATIC="%s. MX 10 ext-mx01.mykolab.com." DNS_COPY_FROM=null AWS_ACCESS_KEY_ID= AWS_SECRET_ACCESS_KEY= AWS_DEFAULT_REGION=us-east-1 AWS_BUCKET= PUSHER_APP_ID= PUSHER_APP_KEY= PUSHER_APP_SECRET= PUSHER_APP_CLUSTER=mt1 MIX_ASSET_PATH='/' MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}" MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}" JWT_SECRET= JWT_TTL=60 COMPANY_NAME= COMPANY_ADDRESS= COMPANY_DETAILS= COMPANY_EMAIL= COMPANY_LOGO= COMPANY_FOOTER= VAT_COUNTRIES=CH,LI VAT_RATE=7.7 KB_ACCOUNT_DELETE= KB_ACCOUNT_SUSPENDED= diff --git a/src/config/app.php b/src/config/app.php index a62ef771..e4125ac6 100644 --- a/src/config/app.php +++ b/src/config/app.php @@ -1,278 +1,284 @@ env('APP_NAME', 'Laravel'), /* |-------------------------------------------------------------------------- | Application Environment |-------------------------------------------------------------------------- | | This value determines the "environment" your application is currently | running in. This may determine how you prefer to configure various | services the application utilizes. Set this in your ".env" file. | */ 'env' => env('APP_ENV', 'production'), /* |-------------------------------------------------------------------------- | Application Debug Mode |-------------------------------------------------------------------------- | | When your application is in debug mode, detailed error messages with | stack traces will be shown on every error that occurs within your | application. If disabled, a simple generic error page is shown. | */ 'debug' => env('APP_DEBUG', false), /* |-------------------------------------------------------------------------- | Application URL |-------------------------------------------------------------------------- | | This URL is used by the console to properly generate URLs when using | the Artisan command line tool. You should set this to the root of | your application so that it is used when running Artisan tasks. */ 'url' => env('APP_URL', 'http://localhost'), 'passphrase' => env('APP_PASSPHRASE', null), 'public_url' => env('APP_PUBLIC_URL', env('APP_URL', 'http://localhost')), 'asset_url' => env('ASSET_URL', null), 'support_url' => env('SUPPORT_URL', null), 'support_email' => env('SUPPORT_EMAIL', null), 'webmail_url' => env('WEBMAIL_URL', null), 'theme' => env('APP_THEME', 'default'), 'tenant_id' => env('APP_TENANT_ID', null), /* |-------------------------------------------------------------------------- | Application Domain |-------------------------------------------------------------------------- | | System domain used for user signup (kolab identity) */ 'domain' => env('APP_DOMAIN', 'domain.tld'), + 'website_domain' => env('APP_WEBSITE_DOMAIN', env('APP_DOMAIN', 'domain.tld')), + /* |-------------------------------------------------------------------------- | Application Timezone |-------------------------------------------------------------------------- | | Here you may specify the default timezone for your application, which | will be used by the PHP date and date-time functions. We have gone | ahead and set this to a sensible default for you out of the box. | */ 'timezone' => 'UTC', /* |-------------------------------------------------------------------------- | Application Locale Configuration |-------------------------------------------------------------------------- | | The application locale determines the default locale that will be used | by the translation service provider. You are free to set this value | to any of the locales which will be supported by the application. | */ 'locale' => env('APP_LOCALE', 'en'), /* |-------------------------------------------------------------------------- | Application Fallback Locale |-------------------------------------------------------------------------- | | The fallback locale determines the locale to use when the current one | is not available. You may change the value to correspond to any of | the language folders that are provided through your application. | */ 'fallback_locale' => 'en', /* |-------------------------------------------------------------------------- | Faker Locale |-------------------------------------------------------------------------- | | This locale will be used by the Faker PHP library when generating fake | data for your database seeds. For example, this will be used to get | localized telephone numbers, street address information and more. | */ 'faker_locale' => 'en_US', /* |-------------------------------------------------------------------------- | Encryption Key |-------------------------------------------------------------------------- | | This key is used by the Illuminate encrypter service and should be set | to a random, 32 character string, otherwise these encrypted strings | will not be safe. Please do this before deploying an application! | */ 'key' => env('APP_KEY'), 'cipher' => 'AES-256-CBC', /* |-------------------------------------------------------------------------- | Autoloaded Service Providers |-------------------------------------------------------------------------- | | The service providers listed here will be automatically loaded on the | request to your application. Feel free to add your own services to | this array to grant expanded functionality to your applications. | */ 'providers' => [ /* * Laravel Framework Service Providers... */ Illuminate\Auth\AuthServiceProvider::class, Illuminate\Broadcasting\BroadcastServiceProvider::class, Illuminate\Bus\BusServiceProvider::class, Illuminate\Cache\CacheServiceProvider::class, Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class, Illuminate\Cookie\CookieServiceProvider::class, Illuminate\Database\DatabaseServiceProvider::class, Illuminate\Encryption\EncryptionServiceProvider::class, Illuminate\Filesystem\FilesystemServiceProvider::class, Illuminate\Foundation\Providers\FoundationServiceProvider::class, Illuminate\Hashing\HashServiceProvider::class, Illuminate\Mail\MailServiceProvider::class, Illuminate\Notifications\NotificationServiceProvider::class, Illuminate\Pagination\PaginationServiceProvider::class, Illuminate\Pipeline\PipelineServiceProvider::class, Illuminate\Queue\QueueServiceProvider::class, Illuminate\Redis\RedisServiceProvider::class, Illuminate\Auth\Passwords\PasswordResetServiceProvider::class, Illuminate\Session\SessionServiceProvider::class, Illuminate\Translation\TranslationServiceProvider::class, Illuminate\Validation\ValidationServiceProvider::class, Illuminate\View\ViewServiceProvider::class, /* * Package Service Providers... */ Barryvdh\DomPDF\ServiceProvider::class, /* * Application Service Providers... */ App\Providers\AppServiceProvider::class, App\Providers\AuthServiceProvider::class, // App\Providers\BroadcastServiceProvider::class, App\Providers\EventServiceProvider::class, App\Providers\HorizonServiceProvider::class, App\Providers\RouteServiceProvider::class, ], /* |-------------------------------------------------------------------------- | Class Aliases |-------------------------------------------------------------------------- | | This array of class aliases will be registered when this application | is started. However, feel free to register as many as you wish as | the aliases are "lazy" loaded so they don't hinder performance. | */ 'aliases' => [ 'App' => Illuminate\Support\Facades\App::class, 'Arr' => Illuminate\Support\Arr::class, 'Artisan' => Illuminate\Support\Facades\Artisan::class, 'Auth' => Illuminate\Support\Facades\Auth::class, 'Blade' => Illuminate\Support\Facades\Blade::class, 'Broadcast' => Illuminate\Support\Facades\Broadcast::class, 'Bus' => Illuminate\Support\Facades\Bus::class, 'Cache' => Illuminate\Support\Facades\Cache::class, 'Config' => Illuminate\Support\Facades\Config::class, 'Cookie' => Illuminate\Support\Facades\Cookie::class, 'Crypt' => Illuminate\Support\Facades\Crypt::class, 'DB' => Illuminate\Support\Facades\DB::class, 'Eloquent' => Illuminate\Database\Eloquent\Model::class, 'Event' => Illuminate\Support\Facades\Event::class, 'File' => Illuminate\Support\Facades\File::class, 'Gate' => Illuminate\Support\Facades\Gate::class, 'Hash' => Illuminate\Support\Facades\Hash::class, 'Lang' => Illuminate\Support\Facades\Lang::class, 'Log' => Illuminate\Support\Facades\Log::class, 'Mail' => Illuminate\Support\Facades\Mail::class, 'Notification' => Illuminate\Support\Facades\Notification::class, 'Password' => Illuminate\Support\Facades\Password::class, 'PDF' => Barryvdh\DomPDF\Facade::class, 'Queue' => Illuminate\Support\Facades\Queue::class, 'Redirect' => Illuminate\Support\Facades\Redirect::class, 'Redis' => Illuminate\Support\Facades\Redis::class, 'Request' => Illuminate\Support\Facades\Request::class, 'Response' => Illuminate\Support\Facades\Response::class, 'Route' => Illuminate\Support\Facades\Route::class, 'Schema' => Illuminate\Support\Facades\Schema::class, 'Session' => Illuminate\Support\Facades\Session::class, 'Storage' => Illuminate\Support\Facades\Storage::class, 'Str' => Illuminate\Support\Str::class, 'URL' => Illuminate\Support\Facades\URL::class, 'Validator' => Illuminate\Support\Facades\Validator::class, 'View' => Illuminate\Support\Facades\View::class, ], // Locations of knowledge base articles 'kb' => [ // An article about suspended accounts 'account_suspended' => env('KB_ACCOUNT_SUSPENDED'), // An article about a way to delete an owned account 'account_delete' => env('KB_ACCOUNT_DELETE'), ], 'company' => [ 'name' => env('COMPANY_NAME'), 'address' => env('COMPANY_ADDRESS'), 'details' => env('COMPANY_DETAILS'), 'email' => env('COMPANY_EMAIL'), 'logo' => env('COMPANY_LOGO'), 'footer' => env('COMPANY_FOOTER', env('COMPANY_DETAILS')), ], 'vat' => [ 'countries' => env('VAT_COUNTRIES'), 'rate' => (float) env('VAT_RATE'), ], 'payment' => [ 'methods_oneoff' => env('PAYMENT_METHODS_ONEOFF', "creditcard,paypal,banktransfer"), 'methods_recurring' => env('PAYMENT_METHODS_RECURRING', "creditcard"), ], + + 'with_admin' => (bool) env('APP_WITH_ADMIN', false), + 'with_reseller' => (bool) env('APP_WITH_RESELLER', false), + 'with_services' => (bool) env('APP_WITH_SERVICES', false), ]; diff --git a/src/routes/api.php b/src/routes/api.php index 7e204194..735ac625 100644 --- a/src/routes/api.php +++ b/src/routes/api.php @@ -1,229 +1,235 @@ 'api', 'prefix' => $prefix . 'api/auth' ], function ($router) { Route::post('login', 'API\AuthController@login'); Route::group( ['middleware' => 'auth:api'], function ($router) { Route::get('info', 'API\AuthController@info'); Route::post('logout', 'API\AuthController@logout'); Route::post('refresh', 'API\AuthController@refresh'); } ); } ); Route::group( [ - 'domain' => \config('app.domain'), + 'domain' => \config('app.website_domain'), 'middleware' => 'api', 'prefix' => $prefix . 'api/auth' ], function ($router) { Route::post('password-reset/init', 'API\PasswordResetController@init'); Route::post('password-reset/verify', 'API\PasswordResetController@verify'); Route::post('password-reset', 'API\PasswordResetController@reset'); Route::post('signup/init', 'API\SignupController@init'); Route::get('signup/invitations/{id}', 'API\SignupController@invitation'); Route::get('signup/plans', 'API\SignupController@plans'); Route::post('signup/verify', 'API\SignupController@verify'); Route::post('signup', 'API\SignupController@signup'); } ); Route::group( [ - 'domain' => \config('app.domain'), + 'domain' => \config('app.website_domain'), 'middleware' => 'auth:api', 'prefix' => $prefix . 'api/v4' ], function () { Route::apiResource('domains', API\V4\DomainsController::class); Route::get('domains/{id}/confirm', 'API\V4\DomainsController@confirm'); Route::get('domains/{id}/status', 'API\V4\DomainsController@status'); Route::post('domains/{id}/config', 'API\V4\DomainsController@setConfig'); Route::apiResource('groups', API\V4\GroupsController::class); Route::get('groups/{id}/status', 'API\V4\GroupsController@status'); Route::apiResource('packages', API\V4\PackagesController::class); Route::apiResource('skus', API\V4\SkusController::class); Route::apiResource('users', API\V4\UsersController::class); Route::post('users/{id}/config', 'API\V4\UsersController@setConfig'); Route::get('users/{id}/skus', 'API\V4\SkusController@userSkus'); Route::get('users/{id}/status', 'API\V4\UsersController@status'); Route::apiResource('wallets', API\V4\WalletsController::class); Route::get('wallets/{id}/transactions', 'API\V4\WalletsController@transactions'); Route::get('wallets/{id}/receipts', 'API\V4\WalletsController@receipts'); Route::get('wallets/{id}/receipts/{receipt}', 'API\V4\WalletsController@receiptDownload'); Route::post('payments', 'API\V4\PaymentsController@store'); //Route::delete('payments', 'API\V4\PaymentsController@cancel'); Route::get('payments/mandate', 'API\V4\PaymentsController@mandate'); Route::post('payments/mandate', 'API\V4\PaymentsController@mandateCreate'); Route::put('payments/mandate', 'API\V4\PaymentsController@mandateUpdate'); Route::delete('payments/mandate', 'API\V4\PaymentsController@mandateDelete'); Route::get('payments/methods', 'API\V4\PaymentsController@paymentMethods'); Route::get('payments/pending', 'API\V4\PaymentsController@payments'); Route::get('payments/has-pending', 'API\V4\PaymentsController@hasPayments'); Route::get('openvidu/rooms', 'API\V4\OpenViduController@index'); Route::post('openvidu/rooms/{id}/close', 'API\V4\OpenViduController@closeRoom'); Route::post('openvidu/rooms/{id}/config', 'API\V4\OpenViduController@setRoomConfig'); // FIXME: I'm not sure about this one, should we use DELETE request maybe? Route::post('openvidu/rooms/{id}/connections/{conn}/dismiss', 'API\V4\OpenViduController@dismissConnection'); Route::put('openvidu/rooms/{id}/connections/{conn}', 'API\V4\OpenViduController@updateConnection'); Route::post('openvidu/rooms/{id}/request/{reqid}/accept', 'API\V4\OpenViduController@acceptJoinRequest'); Route::post('openvidu/rooms/{id}/request/{reqid}/deny', 'API\V4\OpenViduController@denyJoinRequest'); } ); // Note: In Laravel 7.x we could just use withoutMiddleware() instead of a separate group Route::group( [ - 'domain' => \config('app.domain'), + 'domain' => \config('app.website_domain'), 'prefix' => $prefix . 'api/v4' ], function () { Route::post('openvidu/rooms/{id}', 'API\V4\OpenViduController@joinRoom'); Route::post('openvidu/rooms/{id}/connections', 'API\V4\OpenViduController@createConnection'); // FIXME: I'm not sure about this one, should we use DELETE request maybe? Route::post('openvidu/rooms/{id}/connections/{conn}/dismiss', 'API\V4\OpenViduController@dismissConnection'); Route::put('openvidu/rooms/{id}/connections/{conn}', 'API\V4\OpenViduController@updateConnection'); Route::post('openvidu/rooms/{id}/request/{reqid}/accept', 'API\V4\OpenViduController@acceptJoinRequest'); Route::post('openvidu/rooms/{id}/request/{reqid}/deny', 'API\V4\OpenViduController@denyJoinRequest'); } ); Route::group( [ - 'domain' => \config('app.domain'), + 'domain' => \config('app.website_domain'), 'middleware' => 'api', 'prefix' => $prefix . 'api/v4' ], function ($router) { Route::post('support/request', 'API\V4\SupportController@request'); } ); Route::group( [ - 'domain' => \config('app.domain'), + 'domain' => \config('app.website_domain'), 'prefix' => $prefix . 'api/webhooks' ], function () { Route::post('payment/{provider}', 'API\V4\PaymentsController@webhook'); Route::post('meet/openvidu', 'API\V4\OpenViduController@webhook'); } ); -Route::group( - [ - 'domain' => 'services.' . \config('app.domain'), - 'prefix' => $prefix . 'api/webhooks/policy' - ], - function () { - Route::post('greylist', 'API\V4\PolicyController@greylist'); - Route::post('ratelimit', 'API\V4\PolicyController@ratelimit'); - Route::post('spf', 'API\V4\PolicyController@senderPolicyFramework'); - } -); - -Route::group( - [ - 'domain' => 'admin.' . \config('app.domain'), - 'middleware' => ['auth:api', 'admin'], - 'prefix' => $prefix . 'api/v4', - ], - function () { - Route::apiResource('domains', API\V4\Admin\DomainsController::class); - Route::post('domains/{id}/suspend', 'API\V4\Admin\DomainsController@suspend'); - Route::post('domains/{id}/unsuspend', 'API\V4\Admin\DomainsController@unsuspend'); - - Route::apiResource('groups', API\V4\Admin\GroupsController::class); - Route::post('groups/{id}/suspend', 'API\V4\Admin\GroupsController@suspend'); - Route::post('groups/{id}/unsuspend', 'API\V4\Admin\GroupsController@unsuspend'); - - Route::apiResource('skus', API\V4\Admin\SkusController::class); - Route::apiResource('users', API\V4\Admin\UsersController::class); - Route::get('users/{id}/discounts', 'API\V4\Reseller\DiscountsController@userDiscounts'); - Route::post('users/{id}/reset2FA', 'API\V4\Admin\UsersController@reset2FA'); - Route::get('users/{id}/skus', 'API\V4\Admin\SkusController@userSkus'); - Route::post('users/{id}/suspend', 'API\V4\Admin\UsersController@suspend'); - Route::post('users/{id}/unsuspend', 'API\V4\Admin\UsersController@unsuspend'); - Route::apiResource('wallets', API\V4\Admin\WalletsController::class); - Route::post('wallets/{id}/one-off', 'API\V4\Admin\WalletsController@oneOff'); - Route::get('wallets/{id}/transactions', 'API\V4\Admin\WalletsController@transactions'); - - Route::get('stats/chart/{chart}', 'API\V4\Admin\StatsController@chart'); - } -); - -Route::group( - [ - 'domain' => 'reseller.' . \config('app.domain'), - 'middleware' => ['auth:api', 'reseller'], - 'prefix' => $prefix . 'api/v4', - ], - function () { - Route::apiResource('domains', API\V4\Reseller\DomainsController::class); - Route::post('domains/{id}/suspend', 'API\V4\Reseller\DomainsController@suspend'); - Route::post('domains/{id}/unsuspend', 'API\V4\Reseller\DomainsController@unsuspend'); - - Route::apiResource('groups', API\V4\Reseller\GroupsController::class); - Route::post('groups/{id}/suspend', 'API\V4\Reseller\GroupsController@suspend'); - Route::post('groups/{id}/unsuspend', 'API\V4\Reseller\GroupsController@unsuspend'); - - Route::apiResource('invitations', API\V4\Reseller\InvitationsController::class); - Route::post('invitations/{id}/resend', 'API\V4\Reseller\InvitationsController@resend'); - - Route::post('payments', 'API\V4\Reseller\PaymentsController@store'); - Route::get('payments/mandate', 'API\V4\Reseller\PaymentsController@mandate'); - Route::post('payments/mandate', 'API\V4\Reseller\PaymentsController@mandateCreate'); - Route::put('payments/mandate', 'API\V4\Reseller\PaymentsController@mandateUpdate'); - Route::delete('payments/mandate', 'API\V4\Reseller\PaymentsController@mandateDelete'); - Route::get('payments/methods', 'API\V4\Reseller\PaymentsController@paymentMethods'); - Route::get('payments/pending', 'API\V4\Reseller\PaymentsController@payments'); - Route::get('payments/has-pending', 'API\V4\Reseller\PaymentsController@hasPayments'); - - 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@userDiscounts'); - Route::post('users/{id}/reset2FA', 'API\V4\Reseller\UsersController@reset2FA'); - Route::get('users/{id}/skus', 'API\V4\Reseller\SkusController@userSkus'); - Route::post('users/{id}/suspend', 'API\V4\Reseller\UsersController@suspend'); - Route::post('users/{id}/unsuspend', 'API\V4\Reseller\UsersController@unsuspend'); - Route::apiResource('wallets', API\V4\Reseller\WalletsController::class); - Route::post('wallets/{id}/one-off', 'API\V4\Reseller\WalletsController@oneOff'); - Route::get('wallets/{id}/receipts', 'API\V4\Reseller\WalletsController@receipts'); - Route::get('wallets/{id}/receipts/{receipt}', 'API\V4\Reseller\WalletsController@receiptDownload'); - Route::get('wallets/{id}/transactions', 'API\V4\Reseller\WalletsController@transactions'); - - Route::get('stats/chart/{chart}', 'API\V4\Reseller\StatsController@chart'); - } -); +if (\config('app.with_services')) { + Route::group( + [ + 'domain' => 'services.' . \config('app.domain'), + 'prefix' => $prefix . 'api/webhooks/policy' + ], + function () { + Route::post('greylist', 'API\V4\PolicyController@greylist'); + Route::post('ratelimit', 'API\V4\PolicyController@ratelimit'); + Route::post('spf', 'API\V4\PolicyController@senderPolicyFramework'); + } + ); +} + +if (\config('app.with_admin')) { + Route::group( + [ + 'domain' => 'admin.' . \config('app.domain'), + 'middleware' => ['auth:api', 'admin'], + 'prefix' => $prefix . 'api/v4', + ], + function () { + Route::apiResource('domains', API\V4\Admin\DomainsController::class); + Route::post('domains/{id}/suspend', 'API\V4\Admin\DomainsController@suspend'); + Route::post('domains/{id}/unsuspend', 'API\V4\Admin\DomainsController@unsuspend'); + + Route::apiResource('groups', API\V4\Admin\GroupsController::class); + Route::post('groups/{id}/suspend', 'API\V4\Admin\GroupsController@suspend'); + Route::post('groups/{id}/unsuspend', 'API\V4\Admin\GroupsController@unsuspend'); + + Route::apiResource('skus', API\V4\Admin\SkusController::class); + Route::apiResource('users', API\V4\Admin\UsersController::class); + Route::get('users/{id}/discounts', 'API\V4\Reseller\DiscountsController@userDiscounts'); + Route::post('users/{id}/reset2FA', 'API\V4\Admin\UsersController@reset2FA'); + Route::get('users/{id}/skus', 'API\V4\Admin\SkusController@userSkus'); + Route::post('users/{id}/suspend', 'API\V4\Admin\UsersController@suspend'); + Route::post('users/{id}/unsuspend', 'API\V4\Admin\UsersController@unsuspend'); + Route::apiResource('wallets', API\V4\Admin\WalletsController::class); + Route::post('wallets/{id}/one-off', 'API\V4\Admin\WalletsController@oneOff'); + Route::get('wallets/{id}/transactions', 'API\V4\Admin\WalletsController@transactions'); + + Route::get('stats/chart/{chart}', 'API\V4\Admin\StatsController@chart'); + } + ); +} + +if (\config('app.with_reseller')) { + Route::group( + [ + 'domain' => 'reseller.' . \config('app.domain'), + 'middleware' => ['auth:api', 'reseller'], + 'prefix' => $prefix . 'api/v4', + ], + function () { + Route::apiResource('domains', API\V4\Reseller\DomainsController::class); + Route::post('domains/{id}/suspend', 'API\V4\Reseller\DomainsController@suspend'); + Route::post('domains/{id}/unsuspend', 'API\V4\Reseller\DomainsController@unsuspend'); + + Route::apiResource('groups', API\V4\Reseller\GroupsController::class); + Route::post('groups/{id}/suspend', 'API\V4\Reseller\GroupsController@suspend'); + Route::post('groups/{id}/unsuspend', 'API\V4\Reseller\GroupsController@unsuspend'); + + Route::apiResource('invitations', API\V4\Reseller\InvitationsController::class); + Route::post('invitations/{id}/resend', 'API\V4\Reseller\InvitationsController@resend'); + + Route::post('payments', 'API\V4\Reseller\PaymentsController@store'); + Route::get('payments/mandate', 'API\V4\Reseller\PaymentsController@mandate'); + Route::post('payments/mandate', 'API\V4\Reseller\PaymentsController@mandateCreate'); + Route::put('payments/mandate', 'API\V4\Reseller\PaymentsController@mandateUpdate'); + Route::delete('payments/mandate', 'API\V4\Reseller\PaymentsController@mandateDelete'); + Route::get('payments/methods', 'API\V4\Reseller\PaymentsController@paymentMethods'); + Route::get('payments/pending', 'API\V4\Reseller\PaymentsController@payments'); + Route::get('payments/has-pending', 'API\V4\Reseller\PaymentsController@hasPayments'); + + 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@userDiscounts'); + Route::post('users/{id}/reset2FA', 'API\V4\Reseller\UsersController@reset2FA'); + Route::get('users/{id}/skus', 'API\V4\Reseller\SkusController@userSkus'); + Route::post('users/{id}/suspend', 'API\V4\Reseller\UsersController@suspend'); + Route::post('users/{id}/unsuspend', 'API\V4\Reseller\UsersController@unsuspend'); + Route::apiResource('wallets', API\V4\Reseller\WalletsController::class); + Route::post('wallets/{id}/one-off', 'API\V4\Reseller\WalletsController@oneOff'); + Route::get('wallets/{id}/receipts', 'API\V4\Reseller\WalletsController@receipts'); + Route::get('wallets/{id}/receipts/{receipt}', 'API\V4\Reseller\WalletsController@receiptDownload'); + Route::get('wallets/{id}/transactions', 'API\V4\Reseller\WalletsController@transactions'); + + Route::get('stats/chart/{chart}', 'API\V4\Reseller\StatsController@chart'); + } + ); +} diff --git a/src/routes/web.php b/src/routes/web.php index b51fc1cc..a8ce199a 100644 --- a/src/routes/web.php +++ b/src/routes/web.php @@ -1,28 +1,28 @@ \config('app.domain'), + //'domain' => \config('app.website_domain'), ], function () { Route::get('content/page/{page}', 'ContentController@pageContent') ->where('page', '(.*)'); Route::get('content/faq/{page}', 'ContentController@faqContent') ->where('page', '(.*)'); Route::fallback( function () { // Return 404 for requests to the API end-points that do not exist if (strpos(request()->path(), 'api/') === 0) { return \App\Http\Controllers\Controller::errorResponse(404); } $env = \App\Utils::uiEnv(); return view($env['view'])->with('env', $env); } ); } );