]> _ Git - fluidbook-toolbox.git/commitdiff
wait #5517 @1.5
authorVincent Vanwaelscappel <vincent@cubedesigners.com>
Tue, 11 Oct 2022 15:13:51 +0000 (17:13 +0200)
committerVincent Vanwaelscappel <vincent@cubedesigners.com>
Tue, 11 Oct 2022 15:13:51 +0000 (17:13 +0200)
app/Http/Controllers/Admin/Operations/FluidbookQuote/AssignOperation.php
app/Http/Controllers/Admin/Operations/FluidbookQuote/CreateFromWebsite.php
app/Http/Controllers/Admin/Operations/FluidbookQuote/SpamOperation.php [new file with mode: 0644]
app/Http/Controllers/SlackController.php [new file with mode: 0644]
app/Models/FluidbookQuote.php
app/Slack/Slack.php
routes/web.php

index 9de93b77fda268d7d0419391e3c78fc30d770bd0..5e5e6199043774a417128ad09ba7e3fb99ab0601 100644 (file)
@@ -6,6 +6,7 @@ use App\Mail\FluidbookQuoteAssign;
 use App\Mail\FluidbookQuoteReceived;
 use App\Models\FluidbookQuote;
 use App\Models\User;
+use App\Slack\Slack;
 use Illuminate\Support\Facades\Mail;
 use Illuminate\Support\Facades\Redirect;
 use Illuminate\Support\Facades\Route;
@@ -44,6 +45,11 @@ trait AssignOperation
             Mail::send($quoteMail);
         }
         Alert::add('success', __('La demande de devis a été attribuée'))->flash();
+
+        if($quote->slack_ts){
+            Slack::addReaction(Slack::fluidbookQuoteChannel,$quote->slack_ts,'white_check_mark');
+        }
+
         return Redirect::to(session('_previous', ['url' => backpack_url('fluidbook-quote')])['url']);
     }
 }
index a3eb0e5041a5e3d7e9e66d72d4abefb926134520..27daa1269cf4cc95c7aca0a7cb5033d65f7ffdb4 100644 (file)
@@ -85,7 +85,12 @@ trait CreateFromWebsite
             $resp['message'] = __("Votre demande de devis a bien été envoyée. Merci pour l'intérêt que vous portez à Fluidbook.", [], $post['lang']);
 
             if ($post && !$spam) {
-                Slack::send('C045CH0UB47', 'Demande de devis', FluidbookQuoteReceived::getMarkdown($post), ['Je vais voir' => 'https://toolbox.fluidbook.com/fluidbook-quote?status=0', 'Je m\'en charge' => 'https://toolbox.fluidbook.com/fluidbook-quote/' . $quote->id . '/assign/me']);
+                $quote->slack_ts = Slack::send(Slack::fluidbookQuoteChannel, 'Demande de devis', FluidbookQuoteReceived::getMarkdown($post),
+                    ['Je vais voir' => 'https://toolbox.fluidbook.com/fluidbook-quote?status=0',
+                        'Je m\'en charge' => ['url' => 'https://toolbox.fluidbook.com/fluidbook-quote/' . $quote->id . '/assign/me', 'style' => 'primary'],
+                        'C\'est du SPAM' => ['url' => 'https://toolbox.fluidbook.com/fluidbook-quote/' . $quote->id . '/spam', 'style' => 'danger'],
+                    ], false);
+                $quote->saveQuietly();
             }
 
             $quoteMail = new FluidbookQuoteReceived();
diff --git a/app/Http/Controllers/Admin/Operations/FluidbookQuote/SpamOperation.php b/app/Http/Controllers/Admin/Operations/FluidbookQuote/SpamOperation.php
new file mode 100644 (file)
index 0000000..34be026
--- /dev/null
@@ -0,0 +1,39 @@
+<?php
+
+namespace App\Http\Controllers\Admin\Operations\FluidbookQuote;
+
+use App\Mail\FluidbookQuoteAssign;
+use App\Mail\FluidbookQuoteReceived;
+use App\Models\FluidbookQuote;
+use App\Models\User;
+use App\Slack\Slack;
+use Illuminate\Support\Facades\Mail;
+use Illuminate\Support\Facades\Redirect;
+use Illuminate\Support\Facades\Route;
+use Prologue\Alerts\Facades\Alert;
+
+trait SpamOperation
+{
+    protected function setupSpamRoutes($segment, $routeName, $controller)
+    {
+        Route::match(['get'], $segment . '/{id}/spam', $controller . '@spam');
+    }
+
+    protected function spam($id)
+    {
+        if (!can('fluidbook-quote:admin')) {
+            abort(403);
+        }
+        /** @var FluidbookQuote $quote */
+        $quote = FluidbookQuote::where('id', $id)->first();
+        $slack_ts = $quote->slack_ts;
+        $quote->deleteOrFail();
+
+        if ($slack_ts) {
+            Slack::deleteMessage(Slack::fluidbookQuoteChannel, $slack_ts);
+        }
+
+        Alert::add('success', __('La demande de devis a été supprimée'))->flash();
+        return Redirect::to(backpack_url('fluidbook-quote'));
+    }
+}
diff --git a/app/Http/Controllers/SlackController.php b/app/Http/Controllers/SlackController.php
new file mode 100644 (file)
index 0000000..cae406e
--- /dev/null
@@ -0,0 +1,14 @@
+<?php
+
+namespace App\Http\Controllers;
+
+class SlackController extends Controller
+{
+    public function endpoint(){
+        $payload = request()->json();
+
+        if ($payload->get('type') === 'url_verification') {
+            return $payload->get('challenge');
+        }
+    }
+}
index 99019e3335d332fae3ee7274d672bcd974c9b123..d678f22a3d3655a844ac9b341452dcab30bc20f6 100644 (file)
@@ -8,6 +8,7 @@ use App\Fields\FluidbookUser;
 use App\Http\Controllers\Admin\Operations\FluidbookQuote\AssignOperation;
 use App\Http\Controllers\Admin\Operations\FluidbookQuote\ConfirmAssignmentOperation;
 use App\Http\Controllers\Admin\Operations\FluidbookQuote\CreateFromWebsite;
+use App\Http\Controllers\Admin\Operations\FluidbookQuote\SpamOperation;
 use App\Models\Base\ToolboxModel;
 use App\Widgets;
 use Cubist\Backpack\Magic\Fields\Hidden;
@@ -24,7 +25,7 @@ class FluidbookQuote extends ToolboxModel
         'plural' => 'demandes de devis'];
 
     protected $_operations = [/*ShowOperation::class,*/
-        AssignOperation::class, CreateFromWebsite::class, ConfirmAssignmentOperation::class];
+        AssignOperation::class, CreateFromWebsite::class, ConfirmAssignmentOperation::class, SpamOperation::class];
     protected $_enableClone = false;
     protected $_enableCreation = false;
     protected $_enableBulk = false;
@@ -103,6 +104,7 @@ class FluidbookQuote extends ToolboxModel
         $this->addField('origin_column', FluidbookQuoteOrigin::class, __('Origine'), ['column' => true, 'filter' => true]);
         $this->addField('c_fluidbooks', Integer::class, __('Fluidbooks'), ['read_only' => true, 'column' => true, 'column_label' => '<img width="20" src="/images/icons/icon-fluidbook.svg">']);
         $this->addField('c_revenue', Number::class, __('Chiffre d\'affaire'), ['read_only' => true, 'column' => true, 'column_label' => '<i class="la la-coins"></i>']);
+        $this->addField('slack_ts', Hidden::class);
     }
 
     public function getOriginAttribute()
index 358d30c0466d59194c36d227e9b8a63af38d275c..a77885e86f3759e29af5c3750e907c31560b390d 100644 (file)
@@ -6,9 +6,26 @@ use JoliCode\Slack\ClientFactory;
 
 class Slack
 {
-    public static function send($channel, $subject, $text, $actions = [], $from = 'Fluidbook Toolbox')
+    const fluidbookQuoteChannel = 'C045CH0UB47';
+
+    /**
+     * @var \JoliCode\Slack\Client|null
+     */
+    protected static $_client = null;
+
+    /**
+     * @return \JoliCode\Slack\Client
+     */
+    protected static function _client()
+    {
+        if (null === self::$_client) {
+            self::$_client = ClientFactory::create(env('SLACK_BOT_TOKEN'));
+        }
+        return self::$_client;
+    }
+
+    public static function send($channel, $subject, $text, $actions = [], $repeatActions = true, $from = 'Fluidbook Toolbox')
     {
-        $client = ClientFactory::create(env('SLACK_BOT_TOKEN'));
         $blocks = [
             [
                 'type' => 'section',
@@ -35,34 +52,54 @@ class Slack
             ];
             $text = '';
             $i = 0;
-            foreach ($actions as $label => $url) {
-                $a['elements'][] = [
+            foreach ($actions as $label => $data) {
+                if (is_string($data)) {
+                    $data = ['url' => $data];
+                }
+                $a['elements'][] = array_merge([
                     'type' => 'button',
                     'text' => [
                         'type' => 'plain_text',
                         'text' => $label
                     ],
-                    'url' => $url,
-                ];
+                ], $data);
                 $i++;
-                $text .= '> ' . $label . ' : ' . $url . "\n";
+                if ($repeatActions) {
+                    $text .= '> ' . $label . ' : ' . $data['url'] . "\n";
+                }
+            }
+            if ($text) {
+                $blocks[] = [
+                    'type' => 'section',
+                    'text' => [
+                        'type' => 'mrkdwn',
+                        'text' => $text,
+                    ]
+                ];
             }
-            $blocks[] = [
-                'type' => 'section',
-                'text' => [
-                    'type' => 'mrkdwn',
-                    'text' => $text,
-                ]
-            ];
             $blocks[] = $a;
         }
 
-        $client->chatPostMessage([
+        $response = self::_client()->chatPostMessage([
             'username' => $from,
             'channel' => $channel,
             'blocks' => json_encode($blocks),
             'text' => $subject,
             'unfurl_links' => false,
         ]);
+        if ($response->getOk()) {
+            return $response->getTs();
+        }
+        return false;
+    }
+
+    public static function deleteMessage($channel, $ts)
+    {
+        return self::_client()->chatDelete(['channel' => $channel, 'ts' => $ts])->getOk();
+    }
+
+    public static function addReaction($channel, $ts, $reaction)
+    {
+        return self::_client()->reactionsAdd(['channel' => $channel, 'timestamp' => $ts, 'name' => $reaction]);
     }
 }
index 427b886190814abd1947b2e96c9a9211665665bf..2edd7807a2b0e932777d44273ca1f1369188c190 100644 (file)
@@ -20,3 +20,11 @@ Route::group([
     Route::get('fluidbookthemepreview/{id}-menu.jpg', 'FluidbookThemePreviewController@previewMenu');
     Route::get('fluidbookthemepreview/{id}.jpg', 'FluidbookThemePreviewController@preview');
 });
+
+Route::group([
+    'excluded_middleware' => [\App\Http\Middleware\VerifyCsrfToken::class, \App\Http\Middleware\CheckIfAdmin::class]
+], function () {
+    Route::any('slack/endpoint', [\App\Http\Controllers\SlackController::class, 'endpoint']);
+});
+
+