<excludeFolder url="file://$MODULE_DIR$/vendor/markbaker/matrix" />
<excludeFolder url="file://$MODULE_DIR$/vendor/masterminds/html5" />
<excludeFolder url="file://$MODULE_DIR$/vendor/maximebf/debugbar" />
+ <excludeFolder url="file://$MODULE_DIR$/vendor/metrixinfo/nova-iframe" />
<excludeFolder url="file://$MODULE_DIR$/vendor/moneyphp/money" />
<excludeFolder url="file://$MODULE_DIR$/vendor/numaxlab/nova-ckeditor5-classic" />
<excludeFolder url="file://$MODULE_DIR$/vendor/nyholm/psr7" />
<path value="$PROJECT_DIR$/vendor/html2text/html2text" />
<path value="$PROJECT_DIR$/vendor/psq/psq-theme" />
<path value="$PROJECT_DIR$/vendor/numaxlab/nova-ckeditor5-classic" />
+ <path value="$PROJECT_DIR$/vendor/metrixinfo/nova-iframe" />
</include_path>
</component>
<component name="PhpInterpreters">
use App\EmailBatch;
use App\MailgunEvent;
+use App\SentEmail;
use App\User;
use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
*/
public function __construct($webhookData)
{
+ /** @todo check webhook key */
$tags = Arr::get($webhookData, 'event-data.tags');
-
-
-
- /** @todo check webhook key */
+ $this->updateSentEmailStatus($webhookData);
$this->batch_id = Str::after(Arr::first($tags, function($tag) {
return Str::startsWith($tag, 'batch_id_');
+ }
+
+
+ /**
+ * @param $webhookData
+ */
+ protected function updateSentEmailStatus($webhookData)
+ {
+ $id = Arr::get($webhookData, 'event-data.message.headers.message-id');
+ if($message = SentEmail::query()->where('message_id', $id)->first()) {
+ $message->update(['status' => Arr::get($webhookData, 'event-data.event')]);
+ }
+
}
/**
--- /dev/null
+<?php
+
+namespace App\Listeners;
+
+use App\SentEmail;
+use Illuminate\Contracts\Queue\ShouldQueue;
+use Illuminate\Mail\Events\MessageSending;
+use Illuminate\Queue\InteractsWithQueue;
+
+class LogSentMessage
+{
+ /**
+ * Create the event listener.
+ *
+ * @return void
+ */
+ public function __construct()
+ {
+ //
+ }
+
+ /**
+ * Handle the event.
+ *
+ * @param MessageSending $event
+ * @return void
+ */
+ public function handle(MessageSending $event)
+ {
+ try {
+ SentEmail::createFromMessage($event->message);
+ } catch(\Exception $exception) {
+ report($exception);
+ }
+ }
+}
--- /dev/null
+<?php
+
+namespace App\Nova;
+
+use Illuminate\Http\Request;
+use Laravel\Nova\Fields\BelongsTo;
+use Laravel\Nova\Fields\DateTime;
+use Laravel\Nova\Fields\ID;
+use Laravel\Nova\Fields\Text;
+use Laravel\Nova\Http\Requests\NovaRequest;
+use Metrixinfo\Nova\Fields\Iframe;
+
+class SentEmail extends Resource
+{
+ /**
+ * The model the resource corresponds to.
+ *
+ * @var string
+ */
+ public static $model = \App\SentEmail::class;
+
+
+ /**
+ * @var string
+ */
+ public static $group = 'Emails';
+
+ /**
+ * @return string
+ */
+ public static function singularLabel()
+ {
+ return "Email Envoyé";
+ }
+
+
+ /**
+ * @return string
+ */
+ public static function label()
+ {
+ return "Email envoyés";
+ }
+
+
+ /**
+ * @param Request $request
+ * @return bool
+ */
+ public static function authorizedToCreate(Request $request)
+ {
+ return false;
+ }
+
+ public function authorizedToDelete(Request $request)
+ {
+ return false;
+ }
+
+ public function authorizedToUpdate(Request $request)
+ {
+ return false;
+ }
+
+ /**
+ * @return string
+ */
+ public function title()
+ {
+ return $this->subject . ' à ' . $this->email;
+ }
+
+ /**
+ * Get the fields displayed by the resource.
+ *
+ * @param \Illuminate\Http\Request $request
+ * @return array
+ */
+ public function fields(Request $request)
+ {
+ return [
+ BelongsTo::make('Destinataire', 'user', User::class),
+ Text::make('Objet', 'subject'),
+ Iframe::make('Contenu', 'content'),
+ Text::make('Etat', 'status'),
+ DateTime::make('Envoyé le', 'created_at'),
+ DateTime::make('Dernier événement', 'updated_at')->onlyOnDetail()
+ ];
+ }
+
+ /**
+ * Get the cards available for the request.
+ *
+ * @param \Illuminate\Http\Request $request
+ * @return array
+ */
+ public function cards(Request $request)
+ {
+ return [];
+ }
+
+ /**
+ * Get the filters available for the resource.
+ *
+ * @param \Illuminate\Http\Request $request
+ * @return array
+ */
+ public function filters(Request $request)
+ {
+ return [];
+ }
+
+ /**
+ * Get the lenses available for the resource.
+ *
+ * @param \Illuminate\Http\Request $request
+ * @return array
+ */
+ public function lenses(Request $request)
+ {
+ return [];
+ }
+
+ /**
+ * Get the actions available for the resource.
+ *
+ * @param \Illuminate\Http\Request $request
+ * @return array
+ */
+ public function actions(Request $request)
+ {
+ return [];
+ }
+}
use Laravel\Nova\Fields\BelongsTo;
use Laravel\Nova\Fields\Boolean;
use Laravel\Nova\Fields\Country;
+use Laravel\Nova\Fields\HasMany;
use Laravel\Nova\Fields\ID;
use Laravel\Nova\Fields\Place;
use Laravel\Nova\Fields\Select;
new Panel('Affiliation', [
BelongsTo::make('Organisation', 'organization', Organization::class)->searchable()->nullable(),
]),
+
+ HasMany::make('Emails envoyés', 'sentEmails', SentEmail::class),
], $this->extraFields(), [
Badge::make('Etat dernier mail', fn() => MailgunEvent::STATUSES[$this->lastMailgunEvent->event ?? 'unknown']['label'])
->map(Arr::pluck(MailgunEvent::STATUSES, 'badge', 'label')),
ProcessBatch::class => [],
PasswordReset::class => [
'App\Listeners\PasswordResetListener'
- ]
+ ],
+ \Illuminate\Mail\Events\MessageSending::class => [
+ 'App\Listeners\LogSentMessage',
+ ],
];
/**
--- /dev/null
+<?php
+
+namespace App;
+
+use Illuminate\Database\Eloquent\Model;
+use Illuminate\Support\Arr;
+
+/**
+ * Class SentEmail
+ * @package App
+ * @property string $message_id
+ * @property string $subject
+ * @property string $content
+ * @property string $recipient
+ * @property string $status
+ */
+class SentEmail extends Model
+{
+
+ protected $guarded = [];
+
+
+ public static function createFromMessage(\Swift_Message $message)
+ {
+ return self::query()->create([
+ 'message_id' => $message->getId(),
+ 'subject' => $message->getSubject(),
+ 'content' => $message->getBody(),
+ 'recipient' => array_key_first($message->getTo()),
+ 'status' => 'sent'
+ ]);
+ }
+
+
+ /**
+ * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
+ */
+ public function user()
+ {
+ return $this->belongsTo(User::class, 'recipient', 'email');
+ }
+}
}
-
/**
* @return HasOne
*/
}
+ /**
+ * @return HasMany
+ */
+ public function sentEmails()
+ {
+ return $this->hasMany(SentEmail::class, 'recipient', 'email');
+ }
+
/**
"league/html-to-markdown": "^4.9",
"mailgun/mailgun-php": "^3.0",
"masterminds/html5": "^2.7",
+ "metrixinfo/nova-iframe": "^1.0",
"numaxlab/nova-ckeditor5-classic": "^1.1",
"nyholm/psr7": "^1.2",
"psq/psq-theme": "*",
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "ca6ddddface6393f6a339cd2a7233c9b",
+ "content-hash": "170a4b87161eb1a26074692e0e8292bd",
"packages": [
{
"name": "algolia/algoliasearch-client-php",
],
"time": "2020-03-09T20:17:30+00:00"
},
+ {
+ "name": "metrixinfo/nova-iframe",
+ "version": "v1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/metrixinfo/nova-iframe.git",
+ "reference": "3bbb0a1c4c43af6c5572dc861ad124d8a61e0ddb"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/metrixinfo/nova-iframe/zipball/3bbb0a1c4c43af6c5572dc861ad124d8a61e0ddb",
+ "reference": "3bbb0a1c4c43af6c5572dc861ad124d8a61e0ddb",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1.0"
+ },
+ "type": "library",
+ "extra": {
+ "laravel": {
+ "providers": [
+ "Metrixinfo\\Nova\\Fields\\Iframe\\FieldServiceProvider"
+ ]
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Metrixinfo\\Nova\\Fields\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "A Laravel Nova field.",
+ "keywords": [
+ "field",
+ "iframe",
+ "laravel",
+ "nova"
+ ],
+ "time": "2019-01-19T20:24:59+00:00"
+ },
{
"name": "microsoft/azure-storage-blob",
"version": "1.5.1",
--- /dev/null
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class CreateSentEmailsTable extends Migration
+{
+ /**
+ * Run the migrations.
+ *
+ * @return void
+ */
+ public function up()
+ {
+ Schema::create('sent_emails', function (Blueprint $table) {
+ $table->id();
+ $table->text('message_id');
+ $table->string('subject');
+ $table->text('content');
+ $table->string('recipient');
+ $table->string('status')->nullable();
+ $table->timestamps();
+ $table->foreign('recipient')->references('email')->on('users');
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::dropIfExists('sent_emails');
+ }
+}
--- /dev/null
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class AddForeignKeys extends Migration
+{
+ /**
+ * Run the migrations.
+ *
+ * @return void
+ */
+ public function up()
+ {
+ Schema::table('unlocked_articles_table', function(Blueprint $table) {
+ $table->foreign('user_id')->references('id')->on('users');
+ });
+
+
+ }
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::table('unlocked_articles_table', function(Blueprint $table) {
+ $table->dropForeign('user_id');
+ });
+ }
+}