From 8af8098760a139c2e743b3540e08912f41232368 Mon Sep 17 00:00:00 2001 From: Vincent Vanwaelscappel Date: Tue, 11 Oct 2022 17:13:51 +0200 Subject: [PATCH] wait #5517 @1.5 --- .../FluidbookQuote/AssignOperation.php | 6 ++ .../FluidbookQuote/CreateFromWebsite.php | 7 +- .../FluidbookQuote/SpamOperation.php | 39 +++++++++++ app/Http/Controllers/SlackController.php | 14 ++++ app/Models/FluidbookQuote.php | 4 +- app/Slack/Slack.php | 67 ++++++++++++++----- routes/web.php | 8 +++ 7 files changed, 128 insertions(+), 17 deletions(-) create mode 100644 app/Http/Controllers/Admin/Operations/FluidbookQuote/SpamOperation.php create mode 100644 app/Http/Controllers/SlackController.php diff --git a/app/Http/Controllers/Admin/Operations/FluidbookQuote/AssignOperation.php b/app/Http/Controllers/Admin/Operations/FluidbookQuote/AssignOperation.php index 9de93b77f..5e5e61990 100644 --- a/app/Http/Controllers/Admin/Operations/FluidbookQuote/AssignOperation.php +++ b/app/Http/Controllers/Admin/Operations/FluidbookQuote/AssignOperation.php @@ -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']); } } diff --git a/app/Http/Controllers/Admin/Operations/FluidbookQuote/CreateFromWebsite.php b/app/Http/Controllers/Admin/Operations/FluidbookQuote/CreateFromWebsite.php index a3eb0e504..27daa1269 100644 --- a/app/Http/Controllers/Admin/Operations/FluidbookQuote/CreateFromWebsite.php +++ b/app/Http/Controllers/Admin/Operations/FluidbookQuote/CreateFromWebsite.php @@ -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 index 000000000..34be02618 --- /dev/null +++ b/app/Http/Controllers/Admin/Operations/FluidbookQuote/SpamOperation.php @@ -0,0 +1,39 @@ +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 index 000000000..cae406e1e --- /dev/null +++ b/app/Http/Controllers/SlackController.php @@ -0,0 +1,14 @@ +json(); + + if ($payload->get('type') === 'url_verification') { + return $payload->get('challenge'); + } + } +} diff --git a/app/Models/FluidbookQuote.php b/app/Models/FluidbookQuote.php index 99019e333..d678f22a3 100644 --- a/app/Models/FluidbookQuote.php +++ b/app/Models/FluidbookQuote.php @@ -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' => '']); $this->addField('c_revenue', Number::class, __('Chiffre d\'affaire'), ['read_only' => true, 'column' => true, 'column_label' => '']); + $this->addField('slack_ts', Hidden::class); } public function getOriginAttribute() diff --git a/app/Slack/Slack.php b/app/Slack/Slack.php index 358d30c04..a77885e86 100644 --- a/app/Slack/Slack.php +++ b/app/Slack/Slack.php @@ -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]); } } diff --git a/routes/web.php b/routes/web.php index 427b88619..2edd7807a 100644 --- a/routes/web.php +++ b/routes/web.php @@ -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']); +}); + + -- 2.39.5