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;
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']);
}
}
$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();
--- /dev/null
+<?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'));
+ }
+}
--- /dev/null
+<?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');
+ }
+ }
+}
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;
'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;
$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()
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',
];
$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]);
}
}
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']);
+});
+
+