]> _ Git - psq.git/commitdiff
Email history
authorLouis Jeckel <louis.jeckel@outlook.com>
Thu, 29 Oct 2020 13:05:47 +0000 (14:05 +0100)
committerLouis Jeckel <louis.jeckel@outlook.com>
Thu, 29 Oct 2020 13:05:47 +0000 (14:05 +0100)
13 files changed:
.idea/lettre-pharma.iml
.idea/php.xml
app/Events/DispatchMailgunEvent.php
app/Listeners/LogSentMessage.php [new file with mode: 0644]
app/Nova/SentEmail.php [new file with mode: 0644]
app/Nova/User.php
app/Providers/EventServiceProvider.php
app/SentEmail.php [new file with mode: 0644]
app/User.php
composer.json
composer.lock
database/migrations/2020_10_29_122838_create_sent_emails_table.php [new file with mode: 0644]
database/migrations/2020_10_29_123449_add_foreign_keys.php [new file with mode: 0644]

index db0d22d9b1773527a2e239380065b799c9ed9d04..d83234051024d565076b063c70bf98557ce90cf2 100644 (file)
@@ -38,6 +38,7 @@
       <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" />
index c3e55ffea6fb163d41203a9adf59b0e58f291d8e..8922dea2d530e245b16df7cfa2648dffedbedf3e 100644 (file)
       <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">
index 3ef943155625f0650a20afcd9484e9f2d8056b4c..1694eaa8a753a662b58cf0dce021a1c6b3bb7cd0 100644 (file)
@@ -4,6 +4,7 @@ namespace App\Events;
 
 use App\EmailBatch;
 use App\MailgunEvent;
+use App\SentEmail;
 use App\User;
 use Illuminate\Broadcasting\Channel;
 use Illuminate\Broadcasting\InteractsWithSockets;
@@ -37,12 +38,10 @@ class DispatchMailgunEvent implements ShouldBroadcast
      */
     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_');
@@ -83,6 +82,19 @@ class DispatchMailgunEvent implements ShouldBroadcast
 
 
 
+    }
+
+
+    /**
+     * @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')]);
+        }
+
     }
 
     /**
diff --git a/app/Listeners/LogSentMessage.php b/app/Listeners/LogSentMessage.php
new file mode 100644 (file)
index 0000000..7206a11
--- /dev/null
@@ -0,0 +1,36 @@
+<?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);
+        }
+    }
+}
diff --git a/app/Nova/SentEmail.php b/app/Nova/SentEmail.php
new file mode 100644 (file)
index 0000000..00fba0f
--- /dev/null
@@ -0,0 +1,134 @@
+<?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 [];
+    }
+}
index 829c2be56b4f863cf005f63993d66a3e548f5311..87d1fe6975a939b43c68e45a22f24aa57a1d7ed3 100644 (file)
@@ -28,6 +28,7 @@ use Laravel\Nova\Fields\Badge;
 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;
@@ -98,6 +99,8 @@ class User extends Resource
             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')),
index cc03a34f945946c48661fb29d700dbdb3da3d32b..5c2d25344041516136ff67489d6216e93469dd80 100644 (file)
@@ -27,7 +27,10 @@ class EventServiceProvider extends ServiceProvider
         ProcessBatch::class => [],
         PasswordReset::class => [
             'App\Listeners\PasswordResetListener'
-        ]
+        ],
+        \Illuminate\Mail\Events\MessageSending::class => [
+            'App\Listeners\LogSentMessage',
+        ],
     ];
 
     /**
diff --git a/app/SentEmail.php b/app/SentEmail.php
new file mode 100644 (file)
index 0000000..e41673d
--- /dev/null
@@ -0,0 +1,42 @@
+<?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');
+    }
+}
index 8458b83c1e16dc29db32d8ce901180b94abcaa63..93d0b82f0461171db9ce39a84897b65b6d5911e7 100644 (file)
@@ -233,7 +233,6 @@ class User extends Authenticatable implements MustVerifyEmail, SendsEmails
     }
 
 
-
     /**
      * @return HasOne
      */
@@ -243,6 +242,14 @@ class User extends Authenticatable implements MustVerifyEmail, SendsEmails
     }
 
 
+    /**
+     * @return HasMany
+     */
+    public function sentEmails()
+    {
+        return $this->hasMany(SentEmail::class, 'recipient', 'email');
+    }
+
 
 
     /**
index 3e4e85c3987b70472c09a79e4d5fcd0858202b2f..10546970f8894231716ac339e5ad12be912489d2 100644 (file)
@@ -36,6 +36,7 @@
         "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": "*",
index c3ddfae9fcc5d0fbd447f1eda755695d9a48ad71..5873fbf3b53b2e93844c60aa5fbdf72ce0491a0a 100644 (file)
@@ -4,7 +4,7 @@
         "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",
diff --git a/database/migrations/2020_10_29_122838_create_sent_emails_table.php b/database/migrations/2020_10_29_122838_create_sent_emails_table.php
new file mode 100644 (file)
index 0000000..d34d0bf
--- /dev/null
@@ -0,0 +1,37 @@
+<?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');
+    }
+}
diff --git a/database/migrations/2020_10_29_123449_add_foreign_keys.php b/database/migrations/2020_10_29_123449_add_foreign_keys.php
new file mode 100644 (file)
index 0000000..5154472
--- /dev/null
@@ -0,0 +1,34 @@
+<?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');
+        });
+    }
+}