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->subject }} - {{ env('APP_NAME') }} +@endsection + +@section('content') + + @if (Auth::id() != $message->user_id) +
+ @csrf + @if ($message->deleted) + + @else + + @endif +
+ @endif +
+ @if ($message->sendto_id != Auth::id()) +

To: {{ App\Models\User::where('id', $message->sendto_id)->first()->name }}

+ @else +

From: {{ $message->user->name }}

+ @endif + @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 +
+

{{ $message->subject }}

+

{!! nl2br(e($message->content)) !!}

+
+@endsection diff --git a/resources/views/messages/create.blade.php b/resources/views/messages/create.blade.php new file mode 100644 index 0000000..d992ae1 --- /dev/null +++ b/resources/views/messages/create.blade.php @@ -0,0 +1,26 @@ +@extends('layouts.app') +@section('title') + Create Message - {{ env('APP_NAME') }} +@endsection + +@section('alert') + @if ($errors->any()) +
{{ $errors->first() }}
+ @endif +@endsection + +@section('content') +

Create Message

+
+
+ @csrf +

To: has('to')) value="{{ request()->to }}" @else value="{{ old('name') }}" @endif>

+

Subject:

+ + + +
+@endsection diff --git a/resources/views/messages/deleted.blade.php b/resources/views/messages/deleted.blade.php new file mode 100644 index 0000000..cfa07fb --- /dev/null +++ b/resources/views/messages/deleted.blade.php @@ -0,0 +1,67 @@ +@extends('layouts.app') +@section('title') + Deleted Messages - {{ env('APP_NAME') }} +@endsection + +@section('alert') + @if (session()->has('success')) +
+ {{ session()->get('success') }} +
+ @endif + @if ($errors->any()) +
{{ $errors->first() }}
+ @endif +@endsection + +@section('content') +

My Messages

+ +
+ @csrf + +
+
+
+ Inbox + ({{ App\Models\Message::where('sendto_id', Auth::id())->where('deleted', false)->count() }}) + Sent + ({{ App\Models\Message::where('user_id', Auth::id())->count() }}) + Deleted + ({{ App\Models\Message::where('sendto_id', Auth::id())->where('deleted', true)->count() }}) +
+
+ @foreach ($messages as $message) +
+
+
+ Profile Image +
+
+ {{ $message->user->name }} +

{{ $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 +
+
+
+ @endforeach + {{ $messages->links() }} + @if ($messages->isEmpty()) +

You haven't deleted any messages.

+ @endif +
+@endsection diff --git a/resources/views/messages/index.blade.php b/resources/views/messages/index.blade.php new file mode 100644 index 0000000..c8a8c14 --- /dev/null +++ b/resources/views/messages/index.blade.php @@ -0,0 +1,66 @@ +@extends('layouts.app') +@section('title') + Messages - {{ env('APP_NAME') }} +@endsection + +@section('alert') + @if (session()->has('success')) +
+ {{ session()->get('success') }}
+ @endif + @if ($errors->any()) +
{{ $errors->first() }}
+ @endif +@endsection + +@section('content') +

My Messages

+ +
+ @csrf + +
+
+
+ Inbox + ({{ App\Models\Message::where('sendto_id', Auth::id())->where('deleted', false)->count() }}) + Sent + ({{ App\Models\Message::where('user_id', Auth::id())->count() }}) + Deleted + ({{ App\Models\Message::where('sendto_id', Auth::id())->where('deleted', true)->count() }}) +
+
+ @foreach ($messages as $message) +
+
+
+ Profile Image +
+
+ {{ $message->user->name }} +

{{ $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 +
+
+
+ @endforeach + {{ $messages->links() }} + @if ($messages->isEmpty()) +

You have no messages.

+ @endif +
+@endsection diff --git a/resources/views/messages/sent.blade.php b/resources/views/messages/sent.blade.php new file mode 100644 index 0000000..583bdf2 --- /dev/null +++ b/resources/views/messages/sent.blade.php @@ -0,0 +1,52 @@ +@extends('layouts.app') +@section('title') + Sent Messages - {{ env('APP_NAME') }} +@endsection + +@section('alert') + @if (session()->has('success')) +
{{ session()->get('success') }} +
+ @endif +@endsection + +@section('content') +

My Messages

+ +
+
+ Inbox + ({{ App\Models\Message::where('sendto_id', Auth::id())->where('deleted', false)->count() }}) + Sent ({{ App\Models\Message::where('user_id', Auth::id())->count() }}) + Deleted + ({{ App\Models\Message::where('sendto_id', Auth::id())->where('deleted', true)->count() }}) +
+
+ @foreach ($messages as $message) +
+
+
+ Profile Image +
+
+ {{ App\Models\User::where('id', $message->sendto_id)->first()->name }} +

{{ $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 +
+
+
+ @endforeach + {{ $messages->links() }} + @if ($messages->isEmpty()) +

You haven't sent any messages.

+ @endif +
+@endsection diff --git a/resources/views/misc/settings.blade.php b/resources/views/misc/settings.blade.php index f25a638..58d4c08 100644 --- a/resources/views/misc/settings.blade.php +++ b/resources/views/misc/settings.blade.php @@ -1,7 +1,7 @@ @extends('layouts.app') @section('title') Settings - {{ env('APP_NAME') }} - +