diff --git a/app/Http/Requests/Templates/FormTemplateRequest.php b/app/Http/Requests/Templates/FormTemplateRequest.php
index 052f92dd..9d3f5b67 100644
--- a/app/Http/Requests/Templates/FormTemplateRequest.php
+++ b/app/Http/Requests/Templates/FormTemplateRequest.php
@@ -20,14 +20,6 @@ class FormTemplateRequest extends FormRequest
'is_password_protected',
'last_edited_human',
'max_number_of_submissions_reached',
- 'notifies',
- 'notification_body',
- 'notification_emails',
- 'notification_sender',
- 'notification_subject',
- 'notifications_include_submission',
- 'notifies_slack',
- 'slack_webhook_url',
'removed_properties',
'creator_id',
'extra',
@@ -50,14 +42,14 @@ class FormTemplateRequest extends FormRequest
{
$slugRule = '';
if ($this->id) {
- $slugRule = ','.$this->id;
+ $slugRule = ',' . $this->id;
}
return [
'form' => 'required|array',
'publicly_listed' => 'boolean',
'name' => 'required|string|max:60',
- 'slug' => 'required|string|alpha_dash|unique:templates,slug'.$slugRule,
+ 'slug' => 'required|string|alpha_dash|unique:templates,slug' . $slugRule,
'short_description' => 'required|string|max:1000',
'description' => 'required|string',
'image_url' => 'required|string',
diff --git a/app/Http/Requests/UserFormRequest.php b/app/Http/Requests/UserFormRequest.php
index e75796a9..ee2bcac1 100644
--- a/app/Http/Requests/UserFormRequest.php
+++ b/app/Http/Requests/UserFormRequest.php
@@ -5,7 +5,6 @@ namespace App\Http\Requests;
use App\Http\Requests\Workspace\CustomDomainRequest;
use App\Models\Forms\Form;
use App\Rules\FormPropertyLogicRule;
-use App\Rules\OneEmailPerLine;
use Illuminate\Validation\Rule;
/**
@@ -29,20 +28,6 @@ abstract class UserFormRequest extends \Illuminate\Foundation\Http\FormRequest
'tags' => 'nullable|array',
'visibility' => ['required', Rule::in(Form::VISIBILITY)],
- // Notifications
- 'notifies' => 'boolean',
- 'notification_emails' => ['required_if:notifies,1', new OneEmailPerLine()],
- 'send_submission_confirmation' => 'boolean',
- 'notification_sender' => 'string|max:64',
- 'notification_subject' => 'string|max:200',
- 'notification_body' => 'string|nullable',
- 'notifications_include_submission' => 'boolean',
- 'webhook_url' => 'url|nullable',
- 'use_captcha' => 'boolean',
- 'slack_webhook_url' => 'url|nullable',
- 'discord_webhook_url' => 'url|nullable',
- 'notification_settings' => 'nullable',
-
// Customization
'theme' => ['required', Rule::in(Form::THEMES)],
'width' => ['required', Rule::in(Form::WIDTHS)],
@@ -125,10 +110,11 @@ abstract class UserFormRequest extends \Illuminate\Foundation\Http\FormRequest
// Security & Privacy
'can_be_indexed' => 'boolean',
'password' => 'sometimes|nullable',
+ 'use_captcha' => 'boolean',
// Custom SEO
'seo_meta' => 'nullable|array',
- 'custom_domain' => 'sometimes|nullable|regex:'.CustomDomainRequest::CUSTOM_DOMAINS_REGEX,
+ 'custom_domain' => 'sometimes|nullable|regex:' . CustomDomainRequest::CUSTOM_DOMAINS_REGEX,
];
}
diff --git a/app/Http/Resources/FormResource.php b/app/Http/Resources/FormResource.php
index bec5b2ba..5c453af6 100644
--- a/app/Http/Resources/FormResource.php
+++ b/app/Http/Resources/FormResource.php
@@ -18,34 +18,21 @@ class FormResource extends JsonResource
*/
public function toArray($request)
{
- if (! $this->userIsFormOwner() && ProtectedForm::isProtected($request, $this->resource)) {
+ if (!$this->userIsFormOwner() && ProtectedForm::isProtected($request, $this->resource)) {
return $this->getProtectedForm();
}
$ownerData = $this->userIsFormOwner() ? [
'views_count' => $this->views_count,
'submissions_count' => $this->submissions_count,
- 'notifies' => $this->notifies,
- 'notifies_webhook' => $this->notifies_webhook,
- 'notifies_slack' => $this->notifies_slack,
- 'notifies_discord' => $this->notifies_discord,
'send_submission_confirmation' => $this->send_submission_confirmation,
- 'webhook_url' => $this->webhook_url,
'redirect_url' => $this->redirect_url,
'database_fields_update' => $this->database_fields_update,
'cleanings' => $this->getCleanigns(),
- 'notification_sender' => $this->notification_sender,
- 'notification_subject' => $this->notification_subject,
- 'notification_body' => $this->notification_body,
- 'notifications_include_submission' => $this->notifications_include_submission,
'can_be_indexed' => $this->can_be_indexed,
'password' => $this->password,
'tags' => $this->tags,
'visibility' => $this->visibility,
- 'notification_emails' => $this->notification_emails,
- 'slack_webhook_url' => $this->slack_webhook_url,
- 'discord_webhook_url' => $this->discord_webhook_url,
- 'notification_settings' => $this->notification_settings,
'removed_properties' => $this->removed_properties,
'last_edited_human' => $this->updated_at?->diffForHumans(),
'seo_meta' => $this->seo_meta,
diff --git a/app/Listeners/Forms/NotifyFormSubmission.php b/app/Listeners/Forms/NotifyFormSubmission.php
index ca362a3a..a88fb859 100644
--- a/app/Listeners/Forms/NotifyFormSubmission.php
+++ b/app/Listeners/Forms/NotifyFormSubmission.php
@@ -15,34 +15,28 @@ class NotifyFormSubmission implements ShouldQueue
/**
* Sends notification to pre-defined emails on form submissions
*
- * @param object $event
+ * @param object $event
* @return void
*/
public function handle(FormSubmitted $event)
{
- $formIntegrations = FormIntegration::where([['form_id', $event->form->id], ['status', FormIntegration::STATUS_ACTIVE]])->get();
+ $formIntegrations = $event->form->integrations()->where('status', FormIntegration::STATUS_ACTIVE)->get();
foreach ($formIntegrations as $formIntegration) {
- ray($formIntegration, $formIntegration->integration_id);
$this->getIntegrationHandler(
$event,
$formIntegration
)->run();
}
-
- /* $this->sendEmailNotifications($event);
- $this->sendWebhookNotification($event, WebhookHandlerProvider::SIMPLE_WEBHOOK_PROVIDER);
- $this->sendWebhookNotification($event, WebhookHandlerProvider::SLACK_PROVIDER);
- $this->sendWebhookNotification($event, WebhookHandlerProvider::DISCORD_PROVIDER);
- foreach ($event->form->zappierHooks as $hook) {
- $hook->triggerHook($event->data);
- }
- */
}
- public static function getIntegrationHandler(FormSubmitted $event, FormIntegration $formIntegration): AbstractIntegrationHandler
- {
+ public static function getIntegrationHandler(
+ FormSubmitted $event,
+ FormIntegration $formIntegration
+ ): AbstractIntegrationHandler {
$integration = FormIntegration::getIntegration($formIntegration->integration_id);
- if ($integration && isset($integration['file_name']) && class_exists('App\Service\Forms\Integrations\\' . $integration['file_name'])) {
+ if ($integration && isset($integration['file_name']) && class_exists(
+ 'App\Service\Forms\Integrations\\' . $integration['file_name']
+ )) {
$className = 'App\Service\Forms\Integrations\\' . $integration['file_name'];
return new $className($event, $formIntegration, $integration);
}
diff --git a/app/Models/Forms/Form.php b/app/Models/Forms/Form.php
index a1fcc22f..9b773d75 100644
--- a/app/Models/Forms/Form.php
+++ b/app/Models/Forms/Form.php
@@ -3,6 +3,7 @@
namespace App\Models\Forms;
use App\Events\Models\FormCreated;
+use App\Models\Integration\FormIntegration;
use App\Models\Integration\FormZapierWebhook;
use App\Models\Traits\CachableAttributes;
use App\Models\Traits\CachesAttributes;
@@ -41,21 +42,6 @@ class Form extends Model implements CachableAttributes
'properties',
'removed_properties',
- // Notifications
- 'notifies',
- 'notification_emails',
- 'send_submission_confirmation',
- 'notification_sender',
- 'notification_subject',
- 'notification_body',
- 'notifications_include_submission',
- 'slack_webhook_url',
- 'discord_webhook_url',
- 'notification_settings',
-
- // integrations
- 'webhook_url',
-
'title',
'description',
'tags',
@@ -109,8 +95,7 @@ class Form extends Model implements CachableAttributes
'closes_at' => 'datetime',
'tags' => 'array',
'removed_properties' => 'array',
- 'seo_meta' => 'object',
- 'notification_settings' => 'object',
+ 'seo_meta' => 'object'
];
protected $appends = [
@@ -119,20 +104,10 @@ class Form extends Model implements CachableAttributes
protected $hidden = [
'workspace_id',
- 'notifies',
- 'slack_webhook_url',
- 'discord_webhook_url',
- 'webhook_url',
- 'send_submission_confirmation',
'redirect_url',
'database_fields_update',
- 'notification_sender',
- 'notification_subject',
- 'notification_body',
- 'notifications_include_submission',
'password',
'tags',
- 'notification_emails',
'removed_properties',
];
@@ -161,15 +136,15 @@ class Form extends Model implements CachableAttributes
public function getShareUrlAttribute()
{
if ($this->custom_domain) {
- return 'https://'.$this->custom_domain.'/forms/'.$this->slug;
+ return 'https://' . $this->custom_domain . '/forms/' . $this->slug;
}
- return front_url('/forms/'.$this->slug);
+ return front_url('/forms/' . $this->slug);
}
public function getEditUrlAttribute()
{
- return front_url('/forms/'.$this->slug.'/show');
+ return front_url('/forms/' . $this->slug . '/show');
}
public function getSubmissionsCountAttribute()
@@ -218,7 +193,7 @@ class Form extends Model implements CachableAttributes
public function getFormPendingSubmissionKeyAttribute()
{
if ($this->updated_at?->timestamp) {
- return 'openform-'.$this->id.'-pending-submission-'.substr($this->updated_at?->timestamp, -6);
+ return 'openform-' . $this->id . '-pending-submission-' . substr($this->updated_at?->timestamp, -6);
}
return null;
@@ -241,7 +216,7 @@ class Form extends Model implements CachableAttributes
public function getHasPasswordAttribute()
{
- return ! empty($this->password);
+ return !empty($this->password);
}
public function getMaxFileSizeAttribute()
@@ -293,6 +268,11 @@ class Form extends Model implements CachableAttributes
return $this->hasMany(FormZapierWebhook::class);
}
+ public function integrations()
+ {
+ return $this->hasMany(FormIntegration::class);
+ }
+
/**
* Config/options
*/
@@ -301,7 +281,7 @@ class Form extends Model implements CachableAttributes
return SlugOptions::create()
->doNotGenerateSlugsOnUpdate()
->generateSlugsFrom(function (Form $form) {
- return $form->title.' '.Str::random(6);
+ return $form->title . ' ' . Str::random(6);
})
->saveSlugsTo('slug');
}
@@ -310,19 +290,4 @@ class Form extends Model implements CachableAttributes
{
return FormFactory::new();
}
-
- public function getNotifiesWebhookAttribute()
- {
- return ! empty($this->webhook_url);
- }
-
- public function getNotifiesDiscordAttribute()
- {
- return ! empty($this->discord_webhook_url);
- }
-
- public function getNotifiesSlackAttribute()
- {
- return ! empty($this->slack_webhook_url);
- }
}
diff --git a/app/Models/Integration/FormZapierWebhook.php b/app/Models/Integration/FormZapierWebhook.php
index ec84a8c8..77c57906 100644
--- a/app/Models/Integration/FormZapierWebhook.php
+++ b/app/Models/Integration/FormZapierWebhook.php
@@ -3,7 +3,7 @@
namespace App\Models\Integration;
use App\Models\Forms\Form;
-use App\Service\Forms\Integrations\WebhookHandlerProvider;
+use App\Service\Forms\Webhooks\WebhookHandlerProvider;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
diff --git a/app/Service/Forms/Integrations/AbstractWebhookHandler.php b/app/Service/Forms/Integrations/AbstractWebhookHandler.php
deleted file mode 100644
index bee7f1fd..00000000
--- a/app/Service/Forms/Integrations/AbstractWebhookHandler.php
+++ /dev/null
@@ -1,67 +0,0 @@
-form, $this->data))
- ->useSignedUrlForFiles()
- ->showHiddenFields();
-
- $formattedData = [];
- foreach ($formatter->getFieldsWithValue() as $field) {
- $formattedData[$field['name']] = $field['value'];
- }
-
- $data = [
- 'form_title' => $this->form->title,
- 'form_slug' => $this->form->slug,
- 'submission' => $formattedData,
- ];
- if ($this->form->is_pro && $this->form->editable_submissions) {
- $data['edit_link'] = $this->form->share_url.'?submission_id='.Hashids::encode($this->data['submission_id']);
- }
-
- return $data;
- }
-
- abstract protected function shouldRun(): bool;
-
- public function handle()
- {
- if (! $this->shouldRun()) {
- return;
- }
-
- WebhookCall::create()
- // Add context on error, used to notify form owner
- ->meta([
- 'type' => 'form_submission',
- 'data' => $this->data,
- 'form' => $this->form,
- 'provider' => $this->getProviderName(),
- ])
- ->url($this->getWebhookUrl())
- ->doNotSign()
- ->payload($this->getWebhookData())
- ->dispatchSync();
- }
-}
diff --git a/app/Service/Forms/Integrations/DiscordHandler.php b/app/Service/Forms/Integrations/DiscordHandler.php
deleted file mode 100644
index 30bbbabb..00000000
--- a/app/Service/Forms/Integrations/DiscordHandler.php
+++ /dev/null
@@ -1,86 +0,0 @@
-form->discord_webhook_url;
- }
-
- protected function getWebhookData(): array
- {
- $settings = (array) Arr::get((array) $this->form->notification_settings, 'discord', []);
- $externalLinks = [];
- if (Arr::get($settings, 'link_open_form', true)) {
- $externalLinks[] = '[**🔗 Open Form**]('.$this->form->share_url.')';
- }
- if (Arr::get($settings, 'link_edit_form', true)) {
- $editFormURL = front_url('forms/'.$this->form->slug.'/show');
- $externalLinks[] = '[**✍️ Edit Form**]('.$editFormURL.')';
- }
- if (Arr::get($settings, 'link_edit_submission', true) && $this->form->editable_submissions) {
- $submissionId = Hashids::encode($this->data['submission_id']);
- $externalLinks[] = '[**✍️ '.$this->form->editable_submissions_button_text.'**]('.$this->form->share_url.'?submission_id='.$submissionId.')';
- }
-
- $color = hexdec(str_replace('#', '', $this->form->color));
- $blocks = [];
- if (Arr::get($settings, 'include_submission_data', true)) {
- $submissionString = '';
- $formatter = (new FormSubmissionFormatter($this->form, $this->data))->outputStringsOnly();
- foreach ($formatter->getFieldsWithValue() as $field) {
- $tmpVal = is_array($field['value']) ? implode(',', $field['value']) : $field['value'];
- $submissionString .= '**'.ucfirst($field['name']).'**: '.$tmpVal."\n";
- }
- $blocks[] = [
- 'type' => 'rich',
- 'color' => $color,
- 'description' => $submissionString,
- ];
- }
-
- if (Arr::get($settings, 'views_submissions_count', true)) {
- $countString = '**👀 Views**: '.(string) $this->form->views_count." \n";
- $countString .= '**🖊️ Submissions**: '.(string) $this->form->submissions_count;
- $blocks[] = [
- 'type' => 'rich',
- 'color' => $color,
- 'description' => $countString,
- ];
- }
-
- if (count($externalLinks) > 0) {
- $blocks[] = [
- 'type' => 'rich',
- 'color' => $color,
- 'description' => implode(' - ', $externalLinks),
- ];
- }
-
- return [
- 'content' => 'New submission for your form **'.$this->form->title.'**',
- 'tts' => false,
- 'username' => config('app.name'),
- 'avatar_url' => asset('img/logo.png'),
- 'embeds' => $blocks,
- ];
- }
-
- protected function shouldRun(): bool
- {
- return ! is_null($this->getWebhookUrl())
- && str_contains($this->getWebhookUrl(), 'https://discord.com/api/webhooks')
- && $this->form->is_pro;
- }
-}
diff --git a/app/Service/Forms/Integrations/SimpleWebhookHandler.php b/app/Service/Forms/Integrations/SimpleWebhookHandler.php
deleted file mode 100644
index 1d2b9cea..00000000
--- a/app/Service/Forms/Integrations/SimpleWebhookHandler.php
+++ /dev/null
@@ -1,21 +0,0 @@
-form->webhook_url;
- }
-
- protected function shouldRun(): bool
- {
- return ! is_null($this->getWebhookUrl()) && $this->form->is_pro;
- }
-}
diff --git a/app/Service/Forms/Integrations/SlackHandler.php b/app/Service/Forms/Integrations/SlackHandler.php
deleted file mode 100644
index 97d5dce7..00000000
--- a/app/Service/Forms/Integrations/SlackHandler.php
+++ /dev/null
@@ -1,96 +0,0 @@
-form->slack_webhook_url;
- }
-
- protected function getWebhookData(): array
- {
- $settings = (array) Arr::get((array) $this->form->notification_settings, 'slack', []);
- $externalLinks = [];
- if (Arr::get($settings, 'link_open_form', true)) {
- $externalLinks[] = '*<'.$this->form->share_url.'|🔗 Open Form>*';
- }
- if (Arr::get($settings, 'link_edit_form', true)) {
- $editFormURL = front_url('forms/'.$this->form->slug.'/show');
- $externalLinks[] = '*<'.$editFormURL.'|✍️ Edit Form>*';
- }
- if (Arr::get($settings, 'link_edit_submission', true) && $this->form->editable_submissions) {
- $submissionId = Hashids::encode($this->data['submission_id']);
- $externalLinks[] = '*<'.$this->form->share_url.'?submission_id='.$submissionId.'|✍️ '.$this->form->editable_submissions_button_text.'>*';
- }
-
- $blocks = [
- [
- 'type' => 'section',
- 'text' => [
- 'type' => 'mrkdwn',
- 'text' => 'New submission for your form *'.$this->form->title.'*',
- ],
- ],
- ];
-
- if (Arr::get($settings, 'include_submission_data', true)) {
- $submissionString = '';
- $formatter = (new FormSubmissionFormatter($this->form, $this->data))->outputStringsOnly();
- foreach ($formatter->getFieldsWithValue() as $field) {
- $tmpVal = is_array($field['value']) ? implode(',', $field['value']) : $field['value'];
- $submissionString .= '>*'.ucfirst($field['name']).'*: '.$tmpVal." \n";
- }
- $blocks[] = [
- 'type' => 'section',
- 'text' => [
- 'type' => 'mrkdwn',
- 'text' => $submissionString,
- ],
- ];
- }
-
- if (Arr::get($settings, 'views_submissions_count', true)) {
- $countString = '*👀 Views*: '.(string) $this->form->views_count." \n";
- $countString .= '*🖊️ Submissions*: '.(string) $this->form->submissions_count;
- $blocks[] = [
- 'type' => 'section',
- 'text' => [
- 'type' => 'mrkdwn',
- 'text' => $countString,
- ],
- ];
- }
-
- if (count($externalLinks) > 0) {
- $blocks[] = [
- 'type' => 'section',
- 'text' => [
- 'type' => 'mrkdwn',
- 'text' => implode(' ', $externalLinks),
- ],
- ];
- }
-
- return [
- 'blocks' => $blocks,
- ];
- }
-
- protected function shouldRun(): bool
- {
- return ! is_null($this->getWebhookUrl())
- && str_contains($this->getWebhookUrl(), 'https://hooks.slack.com/')
- && $this->form->is_pro;
- }
-}
diff --git a/app/Service/Forms/Integrations/WebhookHandlerProvider.php b/app/Service/Forms/Integrations/WebhookHandlerProvider.php
deleted file mode 100644
index 1c2efd9c..00000000
--- a/app/Service/Forms/Integrations/WebhookHandlerProvider.php
+++ /dev/null
@@ -1,36 +0,0 @@
-webhookUrl;
- }
-
- protected function shouldRun(): bool
- {
- return ! is_null($this->getWebhookUrl());
- }
-}
diff --git a/client/components/open/forms/components/FormEditor.vue b/client/components/open/forms/components/FormEditor.vue
index 1500074a..61de0796 100644
--- a/client/components/open/forms/components/FormEditor.vue
+++ b/client/components/open/forms/components/FormEditor.vue
@@ -58,7 +58,6 @@
- Zapier Integration
-
- Discord Notifications
-
- Discord message actions
-
- Form Notifications
-
-
- Slack Notifications
-
- Slack message actions
-
- Submission confirmation
-
-
- Webhook Notifications
-
-