enums for email delivery

This commit is contained in:
David Bomba 2021-02-26 08:06:43 +11:00
parent 29b4e6d1b7
commit c063aee812
13 changed files with 76 additions and 8 deletions

View File

@ -13,6 +13,7 @@ namespace App\Http\Controllers;
use App\Events\Credit\CreditWasEmailed; use App\Events\Credit\CreditWasEmailed;
use App\Events\Quote\QuoteWasEmailed; use App\Events\Quote\QuoteWasEmailed;
use App\Http\Middleware\UserVerified;
use App\Http\Requests\Email\SendEmailRequest; use App\Http\Requests\Email\SendEmailRequest;
use App\Jobs\Entity\EmailEntity; use App\Jobs\Entity\EmailEntity;
use App\Jobs\Mail\EntitySentMailer; use App\Jobs\Mail\EntitySentMailer;
@ -130,7 +131,8 @@ class EmailController extends BaseController
$entity_obj->service()->markSent()->save(); $entity_obj->service()->markSent()->save();
EmailEntity::dispatch($invitation, $invitation->company, $template, $data)->delay(now()->addSeconds(5)); EmailEntity::dispatch($invitation, $invitation->company, $template, $data)
->delay(now()->addSeconds(5));
} }

View File

@ -78,10 +78,8 @@ class PostMarkController extends BaseController
$this->invitation = $this->discoverInvitation($request->input('MessageID')); $this->invitation = $this->discoverInvitation($request->input('MessageID'));
if($this->invitation){ if($this->invitation)
$this->invitation->email_error = $request->input('Details'); $this->invitation->email_error = $request->input('Details');
$this->invitation->save();
}
else else
return response()->json(['message' => 'Message not found']); return response()->json(['message' => 'Message not found']);
@ -122,6 +120,9 @@ class PostMarkController extends BaseController
// } // }
private function processDelivery($request) private function processDelivery($request)
{ {
$this->invitation->email_status = 'delivered';
$this->invitation->save();
SystemLogger::dispatch($request->all(), SystemLog::CATEGORY_MAIL, SystemLog::EVENT_MAIL_DELIVERY, SystemLog::TYPE_WEBHOOK_RESPONSE, $this->invitation->contact->client); SystemLogger::dispatch($request->all(), SystemLog::CATEGORY_MAIL, SystemLog::EVENT_MAIL_DELIVERY, SystemLog::TYPE_WEBHOOK_RESPONSE, $this->invitation->contact->client);
} }
@ -153,6 +154,9 @@ class PostMarkController extends BaseController
private function processBounce($request) private function processBounce($request)
{ {
$this->invitation->email_status = 'bounced';
$this->invitation->save();
SystemLogger::dispatch($request->all(), SystemLog::CATEGORY_MAIL, SystemLog::EVENT_MAIL_BOUNCED, SystemLog::TYPE_WEBHOOK_RESPONSE, $this->invitation->contact->client); SystemLogger::dispatch($request->all(), SystemLog::CATEGORY_MAIL, SystemLog::EVENT_MAIL_BOUNCED, SystemLog::TYPE_WEBHOOK_RESPONSE, $this->invitation->contact->client);
} }
@ -183,6 +187,10 @@ class PostMarkController extends BaseController
// } // }
private function processSpamComplaint($request) private function processSpamComplaint($request)
{ {
$this->invitation->email_status = 'spam';
$this->invitation->save();
SystemLogger::dispatch($request->all(), SystemLog::CATEGORY_MAIL, SystemLog::EVENT_MAIL_SPAM_COMPLAINT, SystemLog::TYPE_WEBHOOK_RESPONSE, $this->invitation->contact->client); SystemLogger::dispatch($request->all(), SystemLog::CATEGORY_MAIL, SystemLog::EVENT_MAIL_SPAM_COMPLAINT, SystemLog::TYPE_WEBHOOK_RESPONSE, $this->invitation->contact->client);
} }

View File

@ -386,6 +386,7 @@ class UserController extends BaseController
/* When changing email address we store the former email in case we need to rollback */ /* When changing email address we store the former email in case we need to rollback */
if ($old_user_email != $new_email) { if ($old_user_email != $new_email) {
$user->last_confirmed_email_address = $old_user_email; $user->last_confirmed_email_address = $old_user_email;
$user->email_verified_at = null;
$user->save(); $user->save();
UserEmailChanged::dispatch($new_user, json_decode($old_user), auth()->user()->company()); UserEmailChanged::dispatch($new_user, json_decode($old_user), auth()->user()->company());
} }

View File

@ -38,6 +38,7 @@ use App\Http\Middleware\TokenAuth;
use App\Http\Middleware\TrimStrings; use App\Http\Middleware\TrimStrings;
use App\Http\Middleware\TrustProxies; use App\Http\Middleware\TrustProxies;
use App\Http\Middleware\UrlSetDb; use App\Http\Middleware\UrlSetDb;
use App\Http\Middleware\UserVerified;
use App\Http\Middleware\VerifyCsrfToken; use App\Http\Middleware\VerifyCsrfToken;
use Illuminate\Auth\Middleware\AuthenticateWithBasicAuth; use Illuminate\Auth\Middleware\AuthenticateWithBasicAuth;
use Illuminate\Auth\Middleware\Authorize; use Illuminate\Auth\Middleware\Authorize;
@ -157,5 +158,6 @@ class Kernel extends HttpKernel
'phantom_secret' => PhantomSecret::class, 'phantom_secret' => PhantomSecret::class,
'contact_key_login' => ContactKeyLogin::class, 'contact_key_login' => ContactKeyLogin::class,
'check_client_existence' => CheckClientExistence::class, 'check_client_existence' => CheckClientExistence::class,
'user_verified' => UserVerified::class,
]; ];
} }

View File

@ -110,8 +110,7 @@ class CreateAccount
NinjaMailerJob::dispatch($nmo); NinjaMailerJob::dispatch($nmo);
// NinjaMailerJob::dispatchNow($nmo);
NinjaMailerJob::dispatchNow($nmo);
VersionCheck::dispatchNow(); VersionCheck::dispatchNow();

View File

@ -339,6 +339,11 @@ class User extends Authenticatable implements MustVerifyEmail
return $this->morphMany(Document::class, 'documentable'); return $this->morphMany(Document::class, 'documentable');
} }
public function isVerified()
{
return is_null($this->email_verified_at) ? false : true;
}
public function getEmailVerifiedAt() public function getEmailVerifiedAt()
{ {
if ($this->email_verified_at) { if ($this->email_verified_at) {

View File

@ -31,6 +31,8 @@ class CreditInvitationTransformer extends EntityTransformer
'updated_at' => (int) $invitation->updated_at, 'updated_at' => (int) $invitation->updated_at,
'archived_at' => (int) $invitation->deleted_at, 'archived_at' => (int) $invitation->deleted_at,
'created_at' => (int) $invitation->created_at, 'created_at' => (int) $invitation->created_at,
'email_status' => $invitation->email_status,
'email_error' => (string)$invitation->email_error,
]; ];
} }
} }

View File

@ -30,7 +30,9 @@ class InvoiceInvitationTransformer extends EntityTransformer
'opened_date' => $invitation->opened_date ?: '', 'opened_date' => $invitation->opened_date ?: '',
'updated_at' => (int) $invitation->updated_at, 'updated_at' => (int) $invitation->updated_at,
'archived_at' => (int) $invitation->deleted_at, 'archived_at' => (int) $invitation->deleted_at,
'created_at' => (int) $invitation->created_at, 'created_at' => (int) $invitation->created_at,
'email_status' => $invitation->email_status,
'email_error' => (string)$invitation->email_error,
]; ];
} }
} }

View File

@ -31,6 +31,8 @@ class QuoteInvitationTransformer extends EntityTransformer
'updated_at' => (int) $invitation->updated_at, 'updated_at' => (int) $invitation->updated_at,
'archived_at' => (int) $invitation->deleted_at, 'archived_at' => (int) $invitation->deleted_at,
'created_at' => (int) $invitation->created_at, 'created_at' => (int) $invitation->created_at,
'email_status' => $invitation->email_status,
'email_error' => (string)$invitation->email_error,
]; ];
} }
} }

View File

@ -31,6 +31,8 @@ class RecurringInvoiceInvitationTransformer extends EntityTransformer
'updated_at' => (int) $invitation->updated_at, 'updated_at' => (int) $invitation->updated_at,
'archived_at' => (int) $invitation->deleted_at, 'archived_at' => (int) $invitation->deleted_at,
'created_at' => (int) $invitation->created_at, 'created_at' => (int) $invitation->created_at,
'email_status' => $invitation->email_status,
'email_error' => (string)$invitation->email_error,
]; ];
} }
} }

View File

@ -59,6 +59,7 @@ class UserTransformer extends EntityTransformer
'custom_value4' => $user->custom_value4 ?: '', 'custom_value4' => $user->custom_value4 ?: '',
'oauth_provider_id' => (string) $user->oauth_provider_id, 'oauth_provider_id' => (string) $user->oauth_provider_id,
'last_confirmed_email_address' => (string) $user->last_confirmed_email_address ?: '', 'last_confirmed_email_address' => (string) $user->last_confirmed_email_address ?: '',
'google_2fa_secret' => (bool) $user->google_2fa_secret,
]; ];
} }

View File

@ -0,0 +1,42 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class EnumInvitationsEmailStatus extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('invoice_invitations', function(Blueprint $table){
$table->enum('email_status', ['delivered', 'bounced', 'spam'])->nullable();
});
Schema::table('quote_invitations', function(Blueprint $table){
$table->enum('email_status', ['delivered', 'bounced', 'spam'])->nullable();
});
Schema::table('credit_invitations', function(Blueprint $table){
$table->enum('email_status', ['delivered', 'bounced', 'spam'])->nullable();
});
Schema::table('recurring_invoice_invitations', function(Blueprint $table){
$table->enum('email_status', ['delivered', 'bounced', 'spam'])->nullable();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
//
}
}

View File

@ -65,7 +65,7 @@ Route::group(['middleware' => ['api_db', 'token_auth', 'locale'], 'prefix' => 'a
Route::get('documents/{document}/download', 'DocumentController@download')->name('documents.download'); Route::get('documents/{document}/download', 'DocumentController@download')->name('documents.download');
Route::post('documents/bulk', 'DocumentController@bulk')->name('documents.bulk'); Route::post('documents/bulk', 'DocumentController@bulk')->name('documents.bulk');
Route::post('emails', 'EmailController@send')->name('email.send'); Route::post('emails', 'EmailController@send')->name('email.send')->middleware('user_verified');
Route::resource('expenses', 'ExpenseController'); // name = (expenses. index / create / show / update / destroy / edit Route::resource('expenses', 'ExpenseController'); // name = (expenses. index / create / show / update / destroy / edit
Route::put('expenses/{expense}/upload', 'ExpenseController@upload'); Route::put('expenses/{expense}/upload', 'ExpenseController@upload');