Zapier integration (#491)

* create zapier app

* install sanctum

* move OAuthProviderController

* make `api-external` middleware

* add zapier endpoints

* add tests

* token management

* zapier event handler

* add policy

* use `slug` instead of `id`

* wip

* check policies

* change api prefix to `external`

* ui tweaks

* validate token abilities

* open zapier URL

* zapier ui tweaks

* update zap

* Fix linting

* Added sample endpoints + minor UI changes

* Run PHP code linter

---------

Co-authored-by: Julien Nahum <julien@nahum.net>
This commit is contained in:
Boris Lepikhin
2024-08-12 02:14:02 -07:00
committed by GitHub
parent 7ad62fb3ea
commit 517bccc695
61 changed files with 5799 additions and 51 deletions

38
routes/api-external.php Normal file
View File

@@ -0,0 +1,38 @@
<?php
/**
* External API calls
*/
use App\Http\Controllers\Integrations\Zapier;
use App\Http\Controllers\Integrations\Zapier\ListFormsController;
use App\Http\Controllers\Integrations\Zapier\ListWorkspacesController;
Route::prefix('external')
->middleware('auth:sanctum')
->group(function () {
Route::prefix('zapier')->name('zapier.')->group(function () {
Route::get('validate', Zapier\ValidateAuthController::class)
->name('validate');
// Set and delete webhooks / manage integrations
Route::middleware('ability:manage-integrations')
->name('webhooks.')
->group(function () {
Route::post('webhook', [Zapier\IntegrationController::class, 'store'])
->name('store');
Route::delete('webhook', [Zapier\IntegrationController::class, 'destroy'])
->name('destroy');
Route::get('submissions/recent', [Zapier\IntegrationController::class, 'poll'])->name('poll');
});
Route::get('workspaces', ListWorkspacesController::class)
->middleware('ability:list-workspaces')
->name('workspaces');
Route::get('forms', ListFormsController::class)
->middleware('ability:list-forms')
->name('forms');
});
});

View File

@@ -15,9 +15,10 @@ use App\Http\Controllers\Forms\Integration\FormIntegrationsEventController;
use App\Http\Controllers\Forms\Integration\FormZapierWebhookController;
use App\Http\Controllers\Forms\PublicFormController;
use App\Http\Controllers\Forms\RecordController;
use App\Http\Controllers\OAuth\OAuthProviderController;
use App\Http\Controllers\Settings\OAuthProviderController;
use App\Http\Controllers\Settings\PasswordController;
use App\Http\Controllers\Settings\ProfileController;
use App\Http\Controllers\Settings\TokenController;
use App\Http\Controllers\SubscriptionController;
use App\Http\Controllers\TemplateController;
use App\Http\Controllers\UserInviteController;
@@ -51,6 +52,12 @@ Route::group(['middleware' => 'auth:api'], function () {
Route::patch('/profile', [ProfileController::class, 'update']);
Route::patch('/password', [PasswordController::class, 'update']);
Route::prefix('/tokens')->name('tokens.')->group(function () {
Route::get('/', [TokenController::class, 'index'])->name('index');
Route::post('/', [TokenController::class, 'store'])->name('store');
Route::delete('{token}', [TokenController::class, 'destroy'])->name('destroy');
});
Route::prefix('/providers')->name('providers.')->group(function () {
Route::post('/connect/{service}', [OAuthProviderController::class, 'connect'])->name('connect');
Route::post('/callback/{service}', [OAuthProviderController::class, 'handleRedirect'])->name('callback');