From 42eddd00408c3248ff2deb531c211a4c615ecd44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Munsch?= Date: Mon, 28 Mar 2022 15:52:42 +0200 Subject: [PATCH] Ticket 682 : - Add Vue debug mode - Show club.messages in reverse order + fix nice date formatter to using server timezone when json cast + fix get last message date for left column --- app/Casts/NiceDate.php | 22 ++++++++++- app/Http/Controllers/ClubController.php | 37 ++++++++++++++++++ app/Models/Customers.php | 26 ++++--------- app/Models/Message.php | 52 ++++++++++++++++++++++++- resources/js/app.js | 4 ++ resources/js/main.js | 5 +++ resources/views/layouts/app.blade.php | 3 ++ resources/views/layouts/bo.blade.php | 3 ++ 8 files changed, 130 insertions(+), 22 deletions(-) diff --git a/app/Casts/NiceDate.php b/app/Casts/NiceDate.php index ea81ebe6..c9531b54 100644 --- a/app/Casts/NiceDate.php +++ b/app/Casts/NiceDate.php @@ -5,10 +5,19 @@ namespace App\Casts; use Illuminate\Contracts\Database\Eloquent\CastsAttributes; use Illuminate\Support\Carbon; -//phpcs:disable Generic.CodeAnalysis.UnusedFunctionParameter.FoundInImplementedInterfaceAfterLastUsed -//phpcs:disable Generic.CodeAnalysis.UnusedFunctionParameter.FoundInImplementedInterfaceBeforeLastUsed class NiceDate implements CastsAttributes { + /** + * Accessor + * + * @param mixed $model + * @param mixed $key + * @param mixed $value + * @param mixed $attributes + * @return mixed + * @phpcs:disable Generic.CodeAnalysis.UnusedFunctionParameter.FoundInImplementedInterfaceBeforeLastUsed + * @phpcs:disable Generic.CodeAnalysis.UnusedFunctionParameter.FoundInImplementedInterfaceAfterLastUsed + */ public function get($model, $key, $value, $attributes) { $value = Carbon::parse($value); @@ -16,6 +25,15 @@ class NiceDate implements CastsAttributes trans('Aujourd\'hui à :time', ['time' => $value->format('H:i')]) : $value->format('Y/m/d H:i'); } + /** + * Mutator + * + * @param mixed $model + * @param mixed $key + * @param mixed $value + * @param mixed $attributes + * @return mixed + */ public function set($model, $key, $value, $attributes) { return Carbon::parse($value)->format('Y-m-d H:i:s'); diff --git a/app/Http/Controllers/ClubController.php b/app/Http/Controllers/ClubController.php index c2163708..38cc39ea 100644 --- a/app/Http/Controllers/ClubController.php +++ b/app/Http/Controllers/ClubController.php @@ -19,6 +19,7 @@ use App\Models\Message; use App\Models\Reduction; use Exception; use Illuminate\Database\QueryException; +use Illuminate\Support\Carbon; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Response; @@ -358,6 +359,11 @@ class ClubController extends Controller return back(); } + /** + * Show messagerie + * + * @return \Illuminate\Contracts\View\View|\Illuminate\Contracts\View\Factory + */ public function messages() { self::getNotifications(); @@ -367,9 +373,27 @@ class ClubController extends Controller $ids = collect($conversations)->pluck('to_id'); $blockList = BlockList::where('customer_id', $customer->id) ->whereIn('blocked_id', $ids)->get(); + + // * Sort In reverse order messages + $conversations = collect($conversations)->map(function (array $conversation) { + $conversation['messages'] = collect($conversation['messages']) + ->sort(function ($a, $b) { + return Carbon::parse( + $a->getRawOriginal('created_at') + )->timestamp < Carbon::parse($b->getRawOriginal('created_at'))->timestamp; + })->values()->all(); + return $conversation; + })->all(); + return view('front.club.messages', compact('conversations', 'blockList')); } + /** + * Send a message to a user + * + * @param SendMessageRequest $request + * @return \Illuminate\Http\JsonResponse + */ public function sendMessage(SendMessageRequest $request) { $customer = Customers::where('username', $request->to)->firstOrFail(); @@ -413,6 +437,12 @@ class ClubController extends Controller }])); } + /** + * Destroy a message + * + * @param DeleteMessagesRequest $request + * @return \Illuminate\Http\JsonResponse + */ public function deleteMessage(DeleteMessagesRequest $request) { /** @var \App\Models\Customers */ @@ -442,6 +472,13 @@ class ClubController extends Controller return response()->json(); } + /** + * Block a customer to prevent him sending messages + * + * @param BlockCustomerRequest $request + * @param boolean $status + * @return \Illuminate\Http\JsonResponse + */ public function blockCustomer(BlockCustomerRequest $request, bool $status) { /** @var \App\Models\Customers */ diff --git a/app/Models/Customers.php b/app/Models/Customers.php index d3ee6cb0..2f6b224b 100644 --- a/app/Models/Customers.php +++ b/app/Models/Customers.php @@ -83,7 +83,7 @@ class Customers extends Authenticatable $output = $receivedM->mapWithKeys(function ($messagesArray, $fromUsername) use (&$sentM, $dateSort) { $responses = collect(\array_merge($sentM->pull($fromUsername) ?? [], $messagesArray))->sort($dateSort); - $last = $responses->first(); + $last = $responses->last(); return [$fromUsername => collect([ 'to' => $fromUsername, 'to_id' => collect($messagesArray)->first()->fromCustomer->id, @@ -94,10 +94,10 @@ class Customers extends Authenticatable 'messages' => $responses->values()->all() ])]; })->toBase(); - // map sur les message envoyés (qui n'ont pas encore eu de réponses) + // * Map sur les message envoyés (qui n'ont pas encore eu de réponses) $outputSentM = $sentM->mapWithKeys(function ($messagesArray) { $sent = collect($messagesArray); - $last = $sent->first(); + $last = $sent->last(); $toCustomer = $last->toCustomer; $toUserName = $toCustomer->username; return [$toUserName => collect([ @@ -110,21 +110,11 @@ class Customers extends Authenticatable 'messages' => $sent->values()->all() ])]; })->toBase(); - // TODO revert this debug test - try { - return $output->merge($outputSentM)->sort(function ($a, $b) { - return Carbon::parse( - $a['dateRaw'] - )->timestamp < Carbon::parse($b['dateRaw'])->timestamp; - })->toArray(); - } catch (\Exception $e) { - Utils::sendEmailErrorManually($e); - Utils::sendEmailErrorManually(new \Exception(sprintf( - 'debug club.messages form user %s', - auth()->user()->email - ))); - throw $e; - } + return $output->merge($outputSentM)->sort(function ($a, $b) { + return Carbon::parse( + $a['dateRaw'] + )->timestamp < Carbon::parse($b['dateRaw'])->timestamp; + })->toArray(); } public function notifications() diff --git a/app/Models/Message.php b/app/Models/Message.php index 60d67ab0..caa06f51 100644 --- a/app/Models/Message.php +++ b/app/Models/Message.php @@ -8,32 +8,80 @@ use Illuminate\Support\Carbon; class Message extends Model { + /** + * The attributes that should be cast. + * + * @var array + */ protected $casts = [ 'created_at' => NiceDate::class, ]; + /** + * The attributes that are mass assignable. + * + * @var array + */ protected $fillable = [ 'message', 'to' ]; + // * RELATIONSHIPS + + /** + * BelongsTo customer relation + * + * @return \Illuminate\Database\Eloquent\Relations\BelongsTo + */ public function toCustomer() { return $this->belongsTo(Customers::class, 'to'); } + /** + * BelongsTo customer relation + * + * @return \Illuminate\Database\Eloquent\Relations\BelongsTo + */ public function fromCustomer() { return $this->belongsTo(Customers::class, 'from'); } + /** + * MorphOne notification relation + * + * @return \Illuminate\Database\Eloquent\Relations\MorphOne + */ + public function notifiable() + { + return $this->morphOne(Notifications::class, 'notifiable'); + } + + // * METHODS + + /** + * Get MessagesOlderThan attribute + * + * @param integer $days + * @return \Illuminate\Database\Query\Builder + */ public static function getMessagesOlderThan(int $days) { return Message::where('updated_at', '<', Carbon::now()->subDays($days)); } - public function notifiable() + /** + * Convert the model instance to an array. + * ! Make sure we use correct nicedate formater + * + * @return array + */ + public function toArray() { - return $this->morphOne(Notifications::class, 'notifiable'); + return array_merge(parent::toArray(), [ + 'created_at' => $this->created_at + ]); } } diff --git a/resources/js/app.js b/resources/js/app.js index b81beb79..29bdce07 100644 --- a/resources/js/app.js +++ b/resources/js/app.js @@ -20,6 +20,10 @@ tooltipTriggerList.map(function (tooltipTriggerEl) { return new bootstrap.Tooltip(tooltipTriggerEl) }) +if (window.vueDebug) { + Vue.config.devtools = true; + Vue.config.debug = true; +} window.Vue = require('vue/dist/vue.min.js'); import VueSelectImage from 'vue-select-image'; diff --git a/resources/js/main.js b/resources/js/main.js index 08591d05..f1444a86 100644 --- a/resources/js/main.js +++ b/resources/js/main.js @@ -16,6 +16,11 @@ window.axios.defaults.headers.common = { 'X-CSRF-TOKEN' : document.querySelector('meta[name="csrf-token"]').getAttribute('content') }; +if (window.vueDebug) { + Vue.config.devtools = true; + Vue.config.debug = true; +} + // cookie notice import { LdcwebCn } from "./front/ldcweb-cn.js"; window.LdcwebCn = LdcwebCn; diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php index b81479be..41b64d64 100644 --- a/resources/views/layouts/app.blade.php +++ b/resources/views/layouts/app.blade.php @@ -4,6 +4,9 @@ @include('layouts.app-head') @include('front.breadcrumb.breadcrumb-head') @yield('microdata') +@if(config('app.env') === 'local') + +@endif
diff --git a/resources/views/layouts/bo.blade.php b/resources/views/layouts/bo.blade.php index 9cdde8f8..6a01d690 100644 --- a/resources/views/layouts/bo.blade.php +++ b/resources/views/layouts/bo.blade.php @@ -26,6 +26,9 @@ @yield('styles') + @if(config('app.env') === 'local') + + @endif