diff --git a/app/Http/Controllers/MessageController.php b/app/Http/Controllers/MessageController.php new file mode 100644 index 0000000..df1d868 --- /dev/null +++ b/app/Http/Controllers/MessageController.php @@ -0,0 +1,175 @@ +where('deleted', false)->orderBy('id', 'desc')->paginate(10); + + return view('messages.index')->with('messages', $messages); + } + + public function inbox_sent() + { + $messages = Message::where('user_id', Auth::id())->orderBy('id', 'desc')->paginate(10); + + return view('messages.sent')->with('messages', $messages); + } + + public function deleted() + { + $messages = Message::where('sendto_id', Auth::id())->where('deleted', true)->orderBy('id', 'desc')->paginate(10); + + return view('messages.deleted')->with('messages', $messages); + } + + public function compose() + { + return view('messages.create'); + } + + public function delete_all() + { + $messages = Message::where('sendto_id', Auth::id())->where('deleted', false)->get(); + + if ($messages->isEmpty()){ + return redirect()->back()->withErrors(['You have no messages!']); + } + + foreach ($messages as $message) { + $message->deleted = true; + $message->save(); + } + + return redirect('/my/messages')->with('success', 'All your messages have been deleted.'); + } + + public function recover_all() + { + $messages = Message::where('sendto_id', Auth::id())->where('deleted', true)->get(); + + if ($messages->isEmpty()){ + return redirect()->back()->withErrors(['You have no deleted messages!']); + } + + foreach ($messages as $message) { + $message->deleted = false; + $message->save(); + } + + return redirect('/my/messages')->with('success', 'All your messages have been recovered.'); + } + + public function content($id) + { + $message = Message::where('id', $id)->first(); + $valid = false; + + if (!$message) { + abort(404); + } + + if ($message->sendto_id == Auth::id() || $message->user_id == Auth::id()) { + $valid = true; + } + + if ($valid) { + if (!$message->read && $message->sendto_id == Auth::id()) { + $message->read = true; + $message->save(); + } + } + + if ($valid) { + return view('messages.content')->with('message', $message); + } else { + abort(404); + } + } + + public function send_message(Request $request) + { + $request->validate([ + 'name' => ['required', 'string', 'exists:users'], + 'subject' => ['required', 'string', 'min:3', 'max:50'], + 'message' => ['required', 'string', 'min:3', 'max:10000'], + ]); + + $userToFind = User::where('name', $request->name)->first(); + $messageable = true; + $errorMsg = array(); + + if (Auth::id() == $userToFind->id) { + return redirect()->back()->withErrors(['You cannot message yourself!']); + } + + switch ($userToFind->settings->message_preference) { + case 2: + $messageable = true; + break; + case 1: + if (!Auth::user()->isFriendWith($userToFind)) { + $messageable = false; + $errorMsg = ["You must be friends with " . $userToFind->name . " to message them."]; + } + break; + default: + $messageable = false; + $errorMsg = ["This user has disabled messaging."]; + } + + if (!$messageable) { + return redirect()->back()->withErrors($errorMsg); + } + + $msg = new Message; + $msg->user_id = Auth::id(); + $msg->sendto_id = $userToFind->id; + $msg->subject = $request->subject; + $msg->content = $request->message; + $msg->save(); + + return redirect('/my/messages/sent')->with('success', 'Message sent.'); + } + + public function delete_message($id) + { + $message = Message::where('id', $id)->first(); + $valid = false; + + if (!$message) { + abort(404); + } + + if (Auth::id() == $message->sendto_id) { + $valid = true; + } + + if ($valid) { + $successMsg = ""; + $deletedStatus = false; + + if (!$message->deleted) { + $deletedStatus = true; + $successMsg = "Message deleted."; + } else { + $deletedStatus = false; + $successMsg = "Message recovered."; + } + $message->deleted = $deletedStatus; + $message->save(); + + return redirect('/my/messages')->with('success', $successMsg); + } else { + abort(404); + } + } +} diff --git a/app/Http/Controllers/SettingController.php b/app/Http/Controllers/SettingController.php index 2b61128..ae051f3 100644 --- a/app/Http/Controllers/SettingController.php +++ b/app/Http/Controllers/SettingController.php @@ -97,6 +97,16 @@ class SettingController extends Controller $changeMsg = "Your time display preference has been changed."; break; + case 7: + $request->validate([ + 'message_preference' => ['required', 'string', 'in:2,1,0'], + ]); + + $userSetting->message_preference = $request->message_preference; + $userSetting->save(); + + $changeMsg = "Your message privacy preference has been changed."; + break; default: abort(404); } diff --git a/app/Models/Message.php b/app/Models/Message.php new file mode 100644 index 0000000..8d3898f --- /dev/null +++ b/app/Models/Message.php @@ -0,0 +1,33 @@ + + */ + protected $fillable = [ + 'user_id', + 'sendto_id', + 'subject', + 'content', + 'read', + ]; + + public function user() + { + return $this->belongsTo('App\Models\User'); + } +} diff --git a/app/Models/User.php b/app/Models/User.php index a2b4b03..145e3b4 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -66,6 +66,11 @@ class User extends Authenticatable return $this->hasMany('App\Models\FeedPost'); } + public function messages() + { + return $this->hasMany('App\Models\Message'); + } + public function settings() { return $this->hasOne('App\Models\UserSetting'); diff --git a/database/migrations/2022_07_22_120710_create_messages_table.php b/database/migrations/2022_07_22_120710_create_messages_table.php new file mode 100644 index 0000000..217a1f4 --- /dev/null +++ b/database/migrations/2022_07_22_120710_create_messages_table.php @@ -0,0 +1,37 @@ +id(); + $table->integer('user_id'); + $table->integer('sendto_id'); + $table->string('subject'); + $table->string('content', 10000); + $table->boolean('read')->default(false); + $table->boolean('deleted')->default(false); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('messages'); + } +} diff --git a/public/js/settings.js b/public/js/settings.js index b8a75f7..3f57644 100644 --- a/public/js/settings.js +++ b/public/js/settings.js @@ -52,6 +52,14 @@ function openPopup(id) { document.querySelector('.popup .warningtext').innerHTML = null; document.querySelector('.popup #desc').innerHTML = "Choose whether 12 hour or 24 hour time is displayed on the site."; break; + case 7: + active = 7; + setActiveSetting(7); + document.querySelector('.popup .message_change').removeAttribute('id'); + document.querySelector('.popup #heading').innerHTML = "Change Message Privacy"; + document.querySelector('.popup .warningtext').innerHTML = null; + document.querySelector('.popup #desc').innerHTML = "Choose who can send you messages on the website."; + break; default: console.error('Invalid setting.'); } @@ -78,6 +86,9 @@ function closePopup() { case 6: document.querySelector('.popup .time_change').setAttribute("id", "invisible"); break; + case 7: + document.querySelector('.popup .message_change').setAttribute("id", "invisible"); + break; default: console.error('Invalid setting.'); } diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php index ed84844..d2ea203 100644 --- a/resources/views/layouts/app.blade.php +++ b/resources/views/layouts/app.blade.php @@ -59,6 +59,7 @@ Friends @if (!Auth::guest() && count(Auth::user()->getFriendRequests())) ({{ count(Auth::user()->getFriendRequests()) }}) @endif Avatar Users + Messages @if (!Auth::guest() && App\Models\Message::where(['sendto_id' => Auth::id(), 'read' => false])->count()) ({{ App\Models\Message::where(['sendto_id' => Auth::id(), 'read' => false])->count() }}) @endif Blog @if (!Auth::guest() && Auth::user()->isAdmin()) Admin diff --git a/resources/views/messages/content.blade.php b/resources/views/messages/content.blade.php new file mode 100644 index 0000000..c7252cb --- /dev/null +++ b/resources/views/messages/content.blade.php @@ -0,0 +1,33 @@ +@extends('layouts.app') +@section('title') +
{{ $message->created_at->format('F d, Y h:i A') }}
+ @else +{{ $message->created_at->format('F d, Y H:i') }}
+ @endif +{!! nl2br(e($message->content)) !!}
+{{ $message->subject }}
+ @if (!Auth::user()->settings->time_preference_24hr) +{{ $message->created_at->format('F d, Y h:i A') }}
+ @else +{{ $message->created_at->format('F d, Y H:i') }}
+ @endif + @if ($message->read) +Read
+ @else +Unread
+ @endif +You haven't deleted any messages.
+ @endif +{{ $message->subject }}
+ @if (!Auth::user()->settings->time_preference_24hr) +{{ $message->created_at->format('F d, Y h:i A') }}
+ @else +{{ $message->created_at->format('F d, Y H:i') }}
+ @endif + @if ($message->read) +Read
+ @else +Unread
+ @endif +You have no messages.
+ @endif +{{ $message->subject }}
+ @if (!Auth::user()->settings->time_preference_24hr) +{{ $message->created_at->format('F d, Y h:i A') }}
+ @else +{{ $message->created_at->format('F d, Y H:i') }}
+ @endif +You haven't sent any messages.
+ @endif +