From 5bac9bfeadb22ec185f466aac9400aca32526ab5 Mon Sep 17 00:00:00 2001 From: xander <63683502+xander113@users.noreply.github.com> Date: Sun, 27 Mar 2022 20:02:44 -1200 Subject: [PATCH 1/2] feed with friends brugh --- web/app/Helpers/AuthHelper.php | 18 +++- web/app/Http/Controllers/AuthController.php | 10 ++- web/app/Http/Controllers/Controller.php | 40 +++++++-- web/app/Http/Controllers/GamesController.php | 3 + web/app/Http/Controllers/GridTest.php | 2 +- web/app/Http/Controllers/HomeController.php | 75 ++++++++++++---- web/app/Http/Controllers/UserController.php | 2 +- web/app/Models/Feed.php | 14 +++ web/app/Models/Friend.php | 14 +++ web/app/Models/RoleSet.php | 15 ++++ web/app/Models/User.php | 8 ++ web/app/Models/User/UserSession.php | 3 + web/config/database.php | 20 ++--- .../2021_12_16_011849_create_users_table.php | 1 + ...22_03_27_092224_create_role_sets_table.php | 33 +++++++ .../2022_03_28_053600_create_feeds_table.php | 33 +++++++ ...2022_03_28_063604_create_friends_table.php | 34 +++++++ web/resources/js/layouts/App.js | 5 +- web/resources/js/pages/CreatePost.js | 4 +- web/resources/js/pages/Dashboard.js | 88 +++++++++++++++++-- web/resources/sass/Graphictoria.scss | 6 ++ web/routes/apis.php | 4 + web/routes/web.php | 2 +- 23 files changed, 383 insertions(+), 51 deletions(-) create mode 100644 web/app/Models/Feed.php create mode 100644 web/app/Models/Friend.php create mode 100644 web/app/Models/RoleSet.php create mode 100644 web/database/migrations/2022_03_27_092224_create_role_sets_table.php create mode 100644 web/database/migrations/2022_03_28_053600_create_feeds_table.php create mode 100644 web/database/migrations/2022_03_28_063604_create_friends_table.php 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..42c9400 100644 --- a/web/app/Http/Controllers/Controller.php +++ b/web/app/Http/Controllers/Controller.php @@ -8,20 +8,24 @@ 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 @@ -30,11 +34,7 @@ class Controller extends BaseController public function fetchCategoriesFP() { - 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."]);} @@ -61,6 +61,34 @@ class Controller extends BaseController } + 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($id) { $category = CatalogCategory::where('id', $id)->first(); diff --git a/web/app/Http/Controllers/GamesController.php b/web/app/Http/Controllers/GamesController.php index 18a8ec6..b257c68 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 9b1ed17..db2628a 100644 --- a/web/app/Http/Controllers/GridTest.php +++ b/web/app/Http/Controllers/GridTest.php @@ -24,7 +24,7 @@ class GridTest extends Controller return game:GetService("ThumbnailGenerator"):Click("PNG", 2048, 2048, true, 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..5b431e1 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,54 @@ 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 createReply($id) { - $data = Request::all(); + $data = $request->all(); $valid = Validator::make($data, [ 'body' => ['required', 'string', 'min:3', 'max:380'], @@ -126,10 +169,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 @@ + 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 e90f5eb..2714d9f 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); @@ -117,6 +119,7 @@ const App = () => { } useEffect(async ()=>{ + if (!getCookie('gtok')) {setCookie('gtok', null);} fetchUser(); updateBanners(); updateOfflineStatus(); diff --git a/web/resources/js/pages/CreatePost.js b/web/resources/js/pages/CreatePost.js index 6d7afad..689e196 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);}); } diff --git a/web/resources/js/pages/Dashboard.js b/web/resources/js/pages/Dashboard.js index b768887..2c13736 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 */}
{validity.message}
+{feed.creatorName}
+
+ "{feed.body}"
+There isn't any posts right now!
: null} + {feedState.posts.posts.length >= 1? +{feed.creatorName}
@@ -140,10 +141,11 @@ const Dashboard = (props) => {
"{feed.body}"
There isn't any posts right now!
: null} {feedState.posts.posts.length >= 1?{validity.message}
+[Avatar.]
+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.