diff --git a/web/app/Helpers/AuthHelper.php b/web/app/Helpers/AuthHelper.php index 205e1f7..8cc0dc7 100644 --- a/web/app/Helpers/AuthHelper.php +++ b/web/app/Helpers/AuthHelper.php @@ -36,7 +36,7 @@ class AuthHelper public static function GetCurrentUser(Request $request) { if($request->session()->exists('authentication')) { $session = UserSession::where('token', $request->session()->get('authentication'))->first(); - + if($session) return User::where('id', $session->user)->first(); @@ -45,6 +45,21 @@ class AuthHelper return; } + + /** + * Remove a session. + * + * @return User? + */ + public static function RemoveSession(Request $request) { + if($request->session()->exists('authentication')) { + $session = UserSession::where('token', $request->session()->get('authentication'))->first(); + $session->delete(); + return; + } + + return; + } /** * Grants a session. @@ -62,4 +77,5 @@ class AuthHelper return $session; } + } diff --git a/web/app/Http/Controllers/AuthController.php b/web/app/Http/Controllers/AuthController.php index 3c25b1a..0dd9d3e 100644 --- a/web/app/Http/Controllers/AuthController.php +++ b/web/app/Http/Controllers/AuthController.php @@ -5,7 +5,6 @@ namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Validator; - use App\Helpers\AuthHelper; use App\Models\User; @@ -97,13 +96,14 @@ class AuthController extends Controller if (!$user) return Response()->json(['message'=>'That user doesn\'t exist.', 'badInputs'=>['username']]); - if (!$user->password != Hash::make($data['password'])) + if (Hash::check($request->input('password'), $user->password)) return Response()->json(['message'=>'The password you tried is incorrect.', 'badInputs'=>['password']]); $request->session()->regenerate(); $newSession = AuthHelper::GrantSession($request, $user->id); - $request->session()->put('authentication', $newSession); + + $request->session()->put('authentication', $newSession->token); return Response()->json(['message'=>'Success!', 'badInputs'=>[]]); } @@ -114,6 +114,10 @@ class AuthController extends Controller * @return Response */ public function Logout(Request $request) { + if(!AuthHelper::Guard($request)) + return Response(null, 400); + + AuthHelper::RemoveSession($request); $request->session()->invalidate(); $request->session()->regenerateToken(); return redirect('/'); diff --git a/web/app/Http/Controllers/Controller.php b/web/app/Http/Controllers/Controller.php index ab5f720..8cc84c6 100644 --- a/web/app/Http/Controllers/Controller.php +++ b/web/app/Http/Controllers/Controller.php @@ -8,33 +8,33 @@ use Illuminate\Foundation\Validation\ValidatesRequests; use App\Http\Controllers\Controller; use App\Providers\RouteServiceProvider; use App\Models\User; +use App\Models\User\UserSession; use App\Models\Category; use App\Models\Post; use App\Models\Reply; use App\Models\Staff; use App\Models\CatalogCategory; +use App\Models\Friend; +use App\Models\Feed; use App\Models\Item; use App\Models\Inventory; use Illuminate\Foundation\Auth\RegistersUsers; use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Validator; +use App\Helpers\AuthHelper; use Illuminate\Routing\Controller as BaseController; use Carbon; use Auth; -use Request; +use Illuminate\Http\Request; use DateTime; class Controller extends BaseController { use AuthorizesRequests, DispatchesJobs, ValidatesRequests; - public function fetchCategoriesFP() { + public function fetchCategoriesFP(Request $request) { - if (!isset($_POST['token'])) {return Response()->json(["error"=>"No user."]);} - - $POST = $_POST['token']; - - $user = User::where('token', $POST)->first(); + $user = AuthHelper::GetCurrentUser($request); if (!$user) {return Response()->json(["error"=>"No user."]);} @@ -53,7 +53,7 @@ class Controller extends BaseController } - public function fetchCategoriesCatalog() { + public function fetchCategoriesCatalog(Request $request) { $categories = CatalogCategory::get(); @@ -61,7 +61,35 @@ class Controller extends BaseController } - public function fetchCategoryCatalog($id) { + public function fetchFeed(Request $request) { + + $user = AuthHelper::GetCurrentUser($request); + + if (!$user) {return Response()->json(["error"=>"No user."]);} + + $friends = Friend::where('status', 1)->where('recieved_id', $user->id)->orWhere('sent_id', $user->id)->get()->toArray(); + $actualFriends = []; + + foreach ($friends as $friend) { + if ($friend['recieved_id'] == $user->id) { + array_push($actualFriends, $friend['sent_id']); + }else{ + array_push($actualFriends, $friend['recieved_id']); + } + } + + $feed = Feed::whereIn('user_id', $actualFriends)->orWhere('user_id', $user->id)->orderBy('created_at', 'desc')->paginate(15); + + foreach ($feed as &$singleFeed) { + $creator = User::where('id', $singleFeed['user_id'])->first(); + $singleFeed['creatorName'] = $creator->username; + } + + return Response()->json(["data"=>$feed]); + + } + + public function fetchCategoryCatalog(Request $request, $id) { $category = CatalogCategory::where('id', $id)->first(); @@ -76,7 +104,7 @@ class Controller extends BaseController return Response()->json(["data"=>$category, "items"=>$items]); } - public function fetchCategory($id) { + public function fetchCategory(Request $request, $id) { $category = Category::where('id', $id)->first(); @@ -91,7 +119,24 @@ class Controller extends BaseController return Response()->json(["data"=>$category, "posts"=>$posts]); } - public function fetchPost($id) { + public function fetchUser(Request $request, $id) { + + $meta = AuthHelper::GetCurrentUser($request); + + $user = User::where('id', $id)->first(); + + if (!$user) {return Response()->json('Error');} + + $array = $user->toArray(); + + if ($meta && $meta->id == $array['id']) $array['isMeta'] = true; else $array['isMeta'] = false; + + if ($meta && $meta->getFriends('pending', 'checkSent', $array['id'])) $array['isFriend'] = 'needToAccept'; elseif ($meta && array_intersect($meta->getFriends('pending', 'id', null), [$array['id']])) $array['isFriend'] = 'pending'; elseif ($meta && array_intersect($meta->getFriends('id', null, null), [$array['id']])) $array['isFriend'] = true; else $array['isFriend'] = false; + + return Response()->json(["data"=>$array]); + } + + public function fetchPost(Request $request, $id) { $post = Post::where('id', $id)->first(); diff --git a/web/app/Http/Controllers/GamesController.php b/web/app/Http/Controllers/GamesController.php index 42385a8..1197a49 100644 --- a/web/app/Http/Controllers/GamesController.php +++ b/web/app/Http/Controllers/GamesController.php @@ -19,6 +19,9 @@ class GamesController extends Controller $status = WebStatus::where('name', 'GamesArbiter') ->first(); + if (!$status) return response()->json(['error' => false]) + ->header('Content-Type', 'application/json'); + return response()->json(['available' => $status->operational]) ->header('Content-Type', 'application/json'); } diff --git a/web/app/Http/Controllers/GridTest.php b/web/app/Http/Controllers/GridTest.php index efddb2d..629e7e5 100644 --- a/web/app/Http/Controllers/GridTest.php +++ b/web/app/Http/Controllers/GridTest.php @@ -23,7 +23,7 @@ class GridTest extends Controller return game:GetService("ThumbnailGenerator"):Click("PNG", 1920, 1080, false, false) TestScript; - $test = new SoapService('http://192.168.0.3:64989'); + $test = new SoapService('http://127.0.0.1:64989'); $result = $test->OpenJob(SoapService::MakeJobJSON('test', 10, 0, 0, 'test render', $testScript)); return response(base64_decode($result->OpenJobExResult->LuaValue[0]->value)) diff --git a/web/app/Http/Controllers/HomeController.php b/web/app/Http/Controllers/HomeController.php index 1b484f9..738ad45 100644 --- a/web/app/Http/Controllers/HomeController.php +++ b/web/app/Http/Controllers/HomeController.php @@ -5,14 +5,18 @@ namespace App\Http\Controllers; use App\Http\Controllers\Controller; use App\Providers\RouteServiceProvider; use App\Models\User; +use App\Models\User\UserSession; use App\Models\Post; use App\Models\Reply; use App\Models\Category; +use App\Models\Friend; +use App\Models\Feed; use App\Models\Staff; use Illuminate\Foundation\Auth\RegistersUsers; use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Validator; -use Request; +use App\Helpers\AuthHelper; +use Illuminate\Http\Request; use Auth; class HomeController extends Controller @@ -37,9 +41,9 @@ class HomeController extends Controller return view('home'); } - public function settingsAbout() { + public function settingsAbout(Request $request) { - $data = Request::all(); + $data = $request->all(); $valid = Validator::make($data, [ 'body' => ['required', 'string', 'min:2', 'max:180'], @@ -51,11 +55,7 @@ class HomeController extends Controller return Response()->json(['message'=>$error, 'badInputs'=>[array_keys($messages)]]); } - if (!isset($_POST['token'])) {return Response()->json(['message'=>'System error', 'badInputs'=>['title']]);} - - $user = User::where('token', $_POST['token'])->first(); - - if (!$user) {return Response()->json(['message'=>'System error', 'badInputs'=>['title']]);} + $user = AuthHelper::GetCurrentUser($request); $user->about = $_POST['body']; $user->save(); @@ -64,9 +64,9 @@ class HomeController extends Controller } - public function createPost() { + public function createPost(Request $request) { - $data = Request::all(); + $data = $request->all(); $valid = Validator::make($data, [ 'title' => ['required', 'string', 'min:3', 'max:38'], @@ -80,10 +80,8 @@ class HomeController extends Controller return Response()->json(['message'=>$error, 'badInputs'=>[array_keys($messages)]]); } - if (!isset($_POST['token'])) {return Response()->json(['message'=>'System error', 'badInputs'=>['title']]);} + $meta = AuthHelper::GetCurrentUser($request); - $meta = User::where('token', $_POST['token'])->first(); - if (!$meta) {return Response()->json(['message'=>'System error', 'badInputs'=>['title']]);} if (!isset($_POST['creator_id'])) {return Response()->json(['message'=>'System error', 'badInputs'=>['title']]);} @@ -112,9 +110,105 @@ class HomeController extends Controller } + public function createFeed(Request $request) { + + $data = $request->all(); + + $valid = Validator::make($data, [ + 'body' => ['required', 'string', 'min:3', 'max:245'], + ]); + + if ($valid->stopOnFirstFailure()->fails()) { + $error = $valid->errors()->first(); + $messages = $valid->messages()->get('*'); + return Response()->json(['message'=>$error, 'badInputs'=>[array_keys($messages)]]); + } + + $user = AuthHelper::GetCurrentUser($request); + + if (!$user) {return Response()->json(['message'=>'System error', 'badInputs'=>['title']]);} + + $feed = new Feed; + $feed->user_id = $user->id; + $feed->body = $request->input('body'); + $feed->save(); + + $friends = Friend::where('status', 1)->where('recieved_id', $user->id)->orWhere('sent_id', $user->id)->get()->toArray(); + $actualFriends = []; + + foreach ($friends as $friend) { + if ($friend['recieved_id'] == $user->id) { + array_push($actualFriends, $friend['sent_id']); + }else{ + array_push($actualFriends, $friend['recieved_id']); + } + } + + $newFeed = Feed::whereIn('user_id', $actualFriends)->orWhere('user_id', $user->id)->orderBy('created_at', 'desc')->paginate(15); + + foreach ($newFeed as &$singleFeed) { + $creator = User::where('id', $singleFeed['user_id'])->first(); + $singleFeed['creatorName'] = $creator->username; + } + + return Response()->json(['message'=>'Success!', 'badInputs'=>[], "data"=>$newFeed]); + + } + + public function addFriend(Request $request, $id) { + + $user = User::where('id', $id)->first(); + + if (!$user) {return Response()->json(['message'=>'No user.', 'badInputs'=>['title']]);} + + $meta = AuthHelper::GetCurrentUser($request); + + if (!$meta) {return Response()->json(['message'=>'System error.', 'badInputs'=>['title']]);} + + if (!isset($_POST['decision'])) {return Response()->json(['message'=>'System error.', 'badInputs'=>['title']]);} + + switch($_POST['decision']) { + case 'remove': + if ($meta && !array_intersect($meta->getFriends('id', null, null), [$user->id])) + return Response()->json(['message'=>'Not Friends.', 'badInputs'=>['title']]); + elseif ($meta && array_intersect($meta->getFriends('pending', 'id', null), [$user->id])) + return Response()->json(['message'=>'Already Pending.', 'badInputs'=>['title']]); + + $friend = $meta->getFriends('remove', null, $user->id); + + return Response()->json(['message'=>'Success!', 'badInputs'=>[], "data"=>false]); + break; + case 'accept': + if ($meta && array_intersect($meta->getFriends('id', null, null), [$user->id])) + return Response()->json(['message'=>'Already Friends.', 'badInputs'=>['title']]); + + $friend = $meta->getFriends('accept', null, $user->id); + + return Response()->json(['message'=>'Success!', 'badInputs'=>[], "data"=>true]); + break; + case 'add': + if ($meta && array_intersect($meta->getFriends('id', null, null), [$user->id])) + return Response()->json(['message'=>'Already Friends.', 'badInputs'=>['title']]); + elseif ($meta && array_intersect($meta->getFriends('pending', 'id', null), [$user->id])) + return Response()->json(['message'=>'Already Pending.', 'badInputs'=>['title']]); + + $friend = new Friend; + $friend->sent_id = $meta->id; + $friend->recieved_id = $user->id; + $friend->status = 0; + $friend->save(); + + return Response()->json(['message'=>'Success!', 'badInputs'=>[], "data"=>'pending']); + break; + default: + break; + } + + } + public function createReply($id) { - $data = Request::all(); + $data = $request->all(); $valid = Validator::make($data, [ 'body' => ['required', 'string', 'min:3', 'max:380'], @@ -126,10 +220,8 @@ class HomeController extends Controller return Response()->json(['message'=>$error, 'badInputs'=>[array_keys($messages)]]); } - if (!isset($_POST['token'])) {return Response()->json(['message'=>'System error', 'badInputs'=>['title']]);} + $meta = AuthHelper::GetCurrentUser($request); - $meta = User::where('token', $_POST['token'])->first(); - if (!$meta) {return Response()->json(['message'=>'System error', 'badInputs'=>['title']]);} if (!isset($_POST['creator_id'])) {return Response()->json(['message'=>'System error', 'badInputs'=>['title']]);} diff --git a/web/app/Http/Controllers/UserController.php b/web/app/Http/Controllers/UserController.php index 727fbd1..e52fdf2 100644 --- a/web/app/Http/Controllers/UserController.php +++ b/web/app/Http/Controllers/UserController.php @@ -18,7 +18,7 @@ class UserController extends Controller if($currentUser) { return Response()->json([ - 'data' => [] + 'data' => $currentUser ]); } else { return Response()->json([ diff --git a/web/app/Models/Feed.php b/web/app/Models/Feed.php new file mode 100644 index 0000000..1a09b9c --- /dev/null +++ b/web/app/Models/Feed.php @@ -0,0 +1,14 @@ +where('recieved_id', $this->id)->orWhere('sent_id', $this->id)->get()->toArray(); + $actualFriends = []; + + foreach ($friends as $friend) { + if ($friend['recieved_id'] == $this->id) { + array_push($actualFriends, $friend['sent_id']); + }else{ + array_push($actualFriends, $friend['recieved_id']); + } + } + + return $actualFriends; + + break; + case 'account': + $friends = Friend::where('status', 1)->where('recieved_id', $this->id)->orWhere('sent_id', $this->id)->get()->toArray(); + $actualFriends = []; + + foreach ($friends as $friend) { + if ($friend['recieved_id'] == $this->id) { + $friendUser = User::where('id', $friend['sent_id'])->first(); + array_push($actualFriends, $friendUser); + }else{ + $friendUser = User::where('id', $friend['recieved_id'])->first(); + array_push($actualFriends, $friendUser); + } + } + + return $actualFriends; + + break; + case 'remove': + $friends = Friend::where('status', 1)->where('recieved_id', $this->id)->orWhere('sent_id', $this->id)->get()->toArray(); + $actualFriends = []; + + foreach ($friends as $friend) { + if ($friend['recieved_id'] == $this->id) { + $friendUserMeta = Friend::where('sent_id', $id)->delete(); + }else{ + $friendUserMeta = Friend::where('recieved_id', $id)->delete(); + } + } + + return; + + break; + case 'accept': + $friends = Friend::where('status', 0)->where('recieved_id', $this->id)->orWhere('sent_id', $this->id)->get()->toArray(); + $actualFriends = []; + + foreach ($friends as $friend) { + if ($friend['recieved_id'] == $this->id) { + $friendUserMeta = Friend::where('sent_id', $id)->first(); + $friendUserMeta->status = 1; + $friendUserMeta->save(); + }else{ + $friendUserMeta = Friend::where('recieved_id', $id)->first(); + $friendUserMeta->status = 1; + $friendUserMeta->save(); + } + } + + return; + + break; + case 'pending': + switch($pending) { + case 'id': + $friends = Friend::where('status', 0)->where('recieved_id', $this->id)->orWhere('sent_id', $this->id)->get()->toArray(); + $actualFriends = []; + + foreach ($friends as $friend) { + if ($friend['recieved_id'] == $this->id) { + array_push($actualFriends, $friend['sent_id']); + }else{ + array_push($actualFriends, $friend['recieved_id']); + } + } + + return $actualFriends; + + break; + case 'account': + $friends = Friend::where('status', 0)->where('recieved_id', $this->id)->orWhere('sent_id', $this->id)->get()->toArray(); + $actualFriends = []; + + foreach ($friends as $friend) { + if ($friend['recieved_id'] == $this->id) { + $friendUser = User::where('id', $friend['sent_id'])->first(); + array_push($actualFriends, $friendUser); + }else{ + $friendUser = User::where('id', $friend['recieved_id'])->first(); + array_push($actualFriends, $friendUser); + } + } + + return $actualFriends; + + break; + + case 'checkSent': + $friends = Friend::where('status', 0)->where('recieved_id', $this->id)->orWhere('sent_id', $this->id)->get()->toArray(); + $actualFriends = []; + + foreach ($friends as $friend) { + if ($friend['recieved_id'] == $this->id && $friend['sent_id'] == $id) { + return true; + }else{ + return false; + } + } + + break; + default: + break; + } + default: + break; + } + + } + } diff --git a/web/app/Models/User/UserSession.php b/web/app/Models/User/UserSession.php index 105de3d..bc0f7c4 100644 --- a/web/app/Models/User/UserSession.php +++ b/web/app/Models/User/UserSession.php @@ -15,4 +15,7 @@ class UserSession extends Model * @var string */ protected $connection = 'mysql-membership'; + + protected $table = 'user_sessions'; + } diff --git a/web/config/database.php b/web/config/database.php index d537161..de2db38 100644 --- a/web/config/database.php +++ b/web/config/database.php @@ -48,8 +48,8 @@ return [ 'url' => env('DATABASE_URL'), 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', '3306'), - 'database' => env('DB_PRIMARY_DATABASE', 'forge'), - 'username' => env('DB_USERNAME', 'forge'), + 'database' => env('DB_PRIMARY_DATABASE', 'gtoriadev_primary'), + 'username' => env('DB_USERNAME', 'gtoriadev_primary'), 'password' => env('DB_PASSWORD', ''), 'unix_socket' => env('DB_SOCKET', ''), 'charset' => 'utf8mb4', @@ -68,8 +68,8 @@ return [ 'url' => env('DATABASE_URL'), 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', '3306'), - 'database' => env('DB_FFLAG_DATABASE', 'forge'), - 'username' => env('DB_USERNAME', 'forge'), + 'database' => env('DB_FFLAG_DATABASE', 'gtoriadev_primary'), + 'username' => env('DB_USERNAME', 'gtoriadev_primary'), 'password' => env('DB_PASSWORD', ''), 'unix_socket' => env('DB_SOCKET', ''), 'charset' => 'utf8mb4', @@ -88,8 +88,8 @@ return [ 'url' => env('DATABASE_URL'), 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', '3306'), - 'database' => env('DB_MEMBERSHIP_DATABASE', 'forge'), - 'username' => env('DB_USERNAME', 'forge'), + 'database' => env('DB_MEMBERSHIP_DATABASE', 'gtoriadev_primary'), + 'username' => env('DB_USERNAME', 'gtoriadev_primary'), 'password' => env('DB_PASSWORD', ''), 'unix_socket' => env('DB_SOCKET', ''), 'charset' => 'utf8mb4', @@ -108,8 +108,8 @@ return [ 'url' => env('DATABASE_URL'), 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', '5432'), - 'database' => env('DB_PRIMARY_DATABASE', 'forge'), - 'username' => env('DB_USERNAME', 'forge'), + 'database' => env('DB_PRIMARY_DATABASE', 'gtoriadev_primary'), + 'username' => env('DB_USERNAME', 'gtoriadev_primary'), 'password' => env('DB_PASSWORD', ''), 'charset' => 'utf8', 'prefix' => '', @@ -123,8 +123,8 @@ return [ 'url' => env('DATABASE_URL'), 'host' => env('DB_HOST', 'localhost'), 'port' => env('DB_PORT', '1433'), - 'database' => env('DB_PRIMARY_DATABASE', 'forge'), - 'username' => env('DB_USERNAME', 'forge'), + 'database' => env('DB_PRIMARY_DATABASE', 'gtoriadev_primary'), + 'username' => env('DB_USERNAME', 'gtoriadev_primary'), 'password' => env('DB_PASSWORD', ''), 'charset' => 'utf8', 'prefix' => '', diff --git a/web/database/migrations/2021_12_16_011849_create_users_table.php b/web/database/migrations/2021_12_16_011849_create_users_table.php index ac4985a..27dc277 100644 --- a/web/database/migrations/2021_12_16_011849_create_users_table.php +++ b/web/database/migrations/2021_12_16_011849_create_users_table.php @@ -28,6 +28,7 @@ class CreateUsersTable extends Migration $table->string('password'); $table->integer('bank')->default(15); $table->string('about')->nullable(); + $table->json('rolesets')->default('[1]'); $table->timestamps(); }); } diff --git a/web/database/migrations/2022_03_27_092224_create_role_sets_table.php b/web/database/migrations/2022_03_27_092224_create_role_sets_table.php new file mode 100644 index 0000000..1995439 --- /dev/null +++ b/web/database/migrations/2022_03_27_092224_create_role_sets_table.php @@ -0,0 +1,33 @@ +id(); + $table->string('title'); + //may require more idk yet. + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('role_sets'); + } +} diff --git a/web/database/migrations/2022_03_28_053600_create_feeds_table.php b/web/database/migrations/2022_03_28_053600_create_feeds_table.php new file mode 100644 index 0000000..b969879 --- /dev/null +++ b/web/database/migrations/2022_03_28_053600_create_feeds_table.php @@ -0,0 +1,33 @@ +id(); + $table->integer('user_id'); + $table->string('body'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('feeds'); + } +} diff --git a/web/database/migrations/2022_03_28_063604_create_friends_table.php b/web/database/migrations/2022_03_28_063604_create_friends_table.php new file mode 100644 index 0000000..8fffe09 --- /dev/null +++ b/web/database/migrations/2022_03_28_063604_create_friends_table.php @@ -0,0 +1,34 @@ +id(); + $table->integer('recieved_id'); + $table->integer('sent_id'); + $table->boolean('status')->default(0); //0 = pending, 1 = accepted, 2 = rejected & row is deleted. + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('friends'); + } +} diff --git a/web/resources/js/layouts/App.js b/web/resources/js/layouts/App.js index dc5c206..b2e34b3 100644 --- a/web/resources/js/layouts/App.js +++ b/web/resources/js/layouts/App.js @@ -65,7 +65,9 @@ const App = () => { } function fetchUser() { - axios.get(`${protocol}apis.${url}/v1/user/settings`) + const body = new FormData(); + body.append('token', encodeURIComponent(getCookie(`gtok`))); + axios.get(`${protocol}apis.${url}/v1/user/settings`, body) .then((response) => { if(!response.data.error) setUser(response.data.data); @@ -116,7 +118,7 @@ const App = () => { } useEffect(async ()=>{ - fetchUser(); + await fetchUser(); updateBanners(); updateOfflineStatus(); setInterval(updateBanners, 2*60*1000 /* 2 mins */); diff --git a/web/resources/js/pages/CreatePost.js b/web/resources/js/pages/CreatePost.js index 6d7afad..b8caaa1 100644 --- a/web/resources/js/pages/CreatePost.js +++ b/web/resources/js/pages/CreatePost.js @@ -29,9 +29,9 @@ const CreatePost = (props) => { const fetchCategories = async () => { const body = new FormData(); body.append('token', encodeURIComponent(getCookie(`gtok`))); - await axios.post(`${protocol}apis.${url}/fetch/categories/post`, body, {headers: {'X-CSRF-TOKEN': document.querySelector(`meta[name="csrf-token"]`).content, "X-Requested-With":"XMLHttpRequest"}}).then(async data=>{ + axios.post(`${protocol}apis.${url}/fetch/categories/post`, body, {headers: {'X-CSRF-TOKEN': document.querySelector(`meta[name="csrf-token"]`).content, "X-Requested-With":"XMLHttpRequest"}}).then(async data=>{ const res = data.data; - await setCategories({categories: res.categories}); + setCategories({categories: res.categories}); }).catch(error=>{console.log(error);}); } @@ -58,7 +58,7 @@ const CreatePost = (props) => { } return ( - waitingForSubmission || !categories.categories? : + waitingForSubmission || categories.categories.length <= 0 ? : Create a new Post
diff --git a/web/resources/js/pages/Dashboard.js b/web/resources/js/pages/Dashboard.js index b768887..9c5c54f 100644 --- a/web/resources/js/pages/Dashboard.js +++ b/web/resources/js/pages/Dashboard.js @@ -13,6 +13,7 @@ import Loader from '../Components/Loader.js'; import { GenericErrorModal } from './Errors.js'; import { MiniCard, MiniCardTitle } from '../Components/Card.js'; +import { paginate } from '../helpers/utils.js'; var url = Config.BaseUrl.replace('http://', ''); var protocol = Config.Protocol; @@ -20,13 +21,58 @@ var protocol = Config.Protocol; const Dashboard = (props) => { const [state, setState] = useState({loading: true}); - const [feedState, setFeedState] = useState({loading: true}); + const [validity, setValidity] = useState({error: false, message: ``, inputs: []}); + const [feedState, setFeedState] = useState({loading: true, posts: {posts: [], meta: [], currentPage: 1}}); const user = props.user; + const createFeed = async () => { + setFeedState({...feedState.posts, loading: true}); + await axios.post(`${protocol}apis.${url}/api/create/feed`, new FormData(document.getElementById(`form`)), {headers: {"X-Requested-With":"XMLHttpRequest"}}).then(data=>{ + const res = data.data; + if (res.badInputs.length >= 1) { + setValidity({error: true, message:res.message, inputs: res.badInputs}); + setTimeout(()=>{setValidity({...validity, error: false, inputs: res.badInputs});}, 4000); + setFeedState({...feedState, loading: false}); + }else{ + document.getElementById('input').value = ""; + setFeedState({loading: false, posts: {...feedState.posts, posts: res.data.data, meta: res.data}}); + } + }).catch(error=>{console.log(error);}); + } + + const fetchFeed = async () => { + await axios.get(`${protocol}apis.${url}/fetch/feed?page=${feedState.posts.currentPage}`, {headers: {"X-Requested-With":"XMLHttpRequest"}}).then(data=>{ + const res = data.data; + setFeedState({loading: false, posts: {...feedState.posts,posts: res.data.data, meta: res.data}}); + }).catch(error=>{console.log(error);}); + } + + const paginatePosts = async (decision) => { + paginate(decision, feedState.posts.currentPage, feedState.posts.meta).then(res=>{ + switch(res){ + case "increase": + setFeedState({...feedState, posts: {...feedState.posts, currentPage: feedState.posts.currentPage+1}}); + break; + case "decrease": + setFeedState({...feedState, posts: {...feedState.posts, currentPage: feedState.posts.currentPage-1}}); + break; + default: + break; + } + }).catch(error=>console.log(error)); + } + useEffect(()=>{ SetTitle(`Dashboard`); + fetchFeed(); setState({loading: false}); }, []); + + useEffect(async()=>{ + setState({loading: true}); + await fetchFeed(); + setState({loading: false}); + }, [feedState.posts.currentPage]); return ( state.loading @@ -63,11 +109,18 @@ const Dashboard = (props) => { {/* Feed */}

My Feed

+ {validity.error? +
+
+

{validity.message}

+
+
+ : null}
-
- - -
+
{e.preventDefault();createFeed();}} id={`form`}> + + +
{ feedState.loading @@ -76,9 +129,30 @@ const Dashboard = (props) => {
: -
- + <> +
+ {feedState.posts.posts.map(feed=>( + <> + +
+

{feed.creatorName}

+ +
+
+

"{feed.body}"

+
+ +
+ + ))}
+ {feedState.posts.posts.length <= 0?

There isn't any posts right now!

: null} + {feedState.posts.posts.length >= 1? +
+ {feedState.posts.currentPage >= 2? : null} + {feedState.posts.currentPage < feedState.posts.meta.last_page? : null} +
: null} + }
diff --git a/web/resources/js/pages/User.js b/web/resources/js/pages/User.js index 1c1ec35..91f8897 100644 --- a/web/resources/js/pages/User.js +++ b/web/resources/js/pages/User.js @@ -19,8 +19,10 @@ var protocol = Config.Protocol; const User = (props) => { + const [validity, setValidity] = useState({error: false, message: ``, inputs: []}); const [state, setState] = useState(true); const [user, setUser] = useState(); + const [isFriend, setFriend] = useState(false); const metaUser = props.user; const userId = useParams().id; const history = useHistory(); @@ -29,34 +31,78 @@ const User = (props) => { const body = new FormData(); body.append('userId', userId); body.append('decision', `fetchedUser`); - axios.post(`${protocol}apis.${url}/fetch/user`, body).then(async(data)=>{ + axios.get(`${protocol}apis.${url}/fetch/user/${userId}`, body).then(async(data)=>{ const res = data.data; if (!res) {history.push(`/`);} SetTitle(`${res.data.username}`); + setFriend(res.data.isFriend); await setUser(res.data); return; }); } + const addFriend = async (decision) => { + const body = new FormData(); + body.append('decision', decision); + setState(true); + axios.post(`${protocol}apis.${url}/api/add/user/${userId}`, body).then(async(data)=>{ + const res = data.data; + if (res.badInputs.length >= 1) { + setValidity({error: true, message:res.message, inputs: res.badInputs}); + setTimeout(()=>{setValidity({...validity, error: false, inputs: res.badInputs});}, 4000); + setFeedState({...feedState, loading: false}); + setState(false); + return; + } + await setFriend(res.data); + setState(false); + return; + }); + } + useEffect(async()=>{ await fetchUser(); setState(false); }, []); return ( - !user + !user || state ? :
+ {validity.error? +
+
+

{validity.message}

+
+
+ : null}
{user.username} -

[Avatar.]

+ +
+
+ { + !metaUser? null : + userId == metaUser.id?

This is you!

: + isFriend && isFriend == `pending`? + + : isFriend && isFriend == `needToAccept`? + + : isFriend? + + : + + } +
+
+

"{user.about? user.about : `${user.username} doesn't have an about section!`}" - {user.username}

-

"{user.about? user.about : `${user.username} doesn't have an about section!`}" - {user.username}

+

Something else idk.

); diff --git a/web/resources/sass/Graphictoria.scss b/web/resources/sass/Graphictoria.scss index b472473..e53dc2d 100644 --- a/web/resources/sass/Graphictoria.scss +++ b/web/resources/sass/Graphictoria.scss @@ -45,6 +45,16 @@ $web-font-path: "https://fonts.googleapis.com/css2?family=Source+Sans+Pro:ital,w background-repeat: no-repeat; } +.a { + color: inherit !important; + text-decoration: none !important; +} + +.a:hover { + color: inherit !important; + text-decoration: none !important; +} + // Loader .gtoria-loader-center { @@ -1011,6 +1021,12 @@ p { display: none !important; } +.graphic-thumb { + height: 60px; + width: 60px; + object-fit: cover; +} + .graphic-post { padding: 1rem 1rem; text-align: start; diff --git a/web/routes/apis.php b/web/routes/apis.php index 1c3ae77..cd8e6ce 100644 --- a/web/routes/apis.php +++ b/web/routes/apis.php @@ -34,10 +34,16 @@ Route::post('/v1/user/login', 'AuthController@Login'); Route::post('/v1/user/logout', 'AuthController@Logout'); Route::get('/v1/user/settings', 'UserController@GetSettings'); +Route::get('/fetch/user/{id}', 'Controller@fetchUser'); + Route::get('/banners/data', 'BannerController@getBanners'); Route::get('/games/metadata', 'GamesController@isAvailable'); +Route::get('/fetch/feed', 'Controller@fetchFeed'); + +Route::post('/api/create/feed', 'HomeController@createFeed'); + Route::get('/fetch/categories', 'Controller@fetchCategories'); Route::post('/fetch/categories/post', 'Controller@fetchCategoriesFP'); @@ -52,6 +58,8 @@ Route::get('/fetch/posts/{id}', 'Controller@fetchPosts'); Route::get('/fetch/post/{id}', 'Controller@fetchPost'); +Route::post('/api/add/user/{id}', 'HomeController@addFriend'); + Route::post('/api/create/forum', 'HomeController@createPost'); Route::post('/api/create/reply/{id}', 'HomeController@createReply'); diff --git a/web/routes/web.php b/web/routes/web.php index 696b045..852bacd 100644 --- a/web/routes/web.php +++ b/web/routes/web.php @@ -67,4 +67,6 @@ Route::get('/games', function(){ return view('main'); }); +Route::get('/account/logout', 'AuthController@logout'); + Route::get('/test123', 'GridTest@generateThumbnail');