feed with friends

brugh
This commit is contained in:
xander 2022-03-27 20:02:44 -12:00
parent 55acc9010e
commit 5bac9bfead
23 changed files with 383 additions and 51 deletions

View File

@ -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;
}
}

View File

@ -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('/');

View File

@ -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();

View File

@ -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');
}

View File

@ -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))

View File

@ -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']]);}

View File

@ -18,7 +18,7 @@ class UserController extends Controller
if($currentUser) {
return Response()->json([
'data' => []
'data' => $currentUser
]);
} else {
return Response()->json([

14
web/app/Models/Feed.php Normal file
View File

@ -0,0 +1,14 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Feed extends Model
{
use HasFactory;
protected $table = 'feeds';
}

14
web/app/Models/Friend.php Normal file
View File

@ -0,0 +1,14 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Friend extends Model
{
use HasFactory;
protected $table = 'friends';
}

View File

@ -0,0 +1,15 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class RoleSet extends Model
{
use HasFactory;
protected $table = 'role_sets';
}

View File

@ -15,4 +15,12 @@ class User extends Model
* @var string
*/
protected $connection = 'mysql-membership';
protected $hidden = [
'password',
'remember_token',
'email',
'email_verified_at',
];
}

View File

@ -15,4 +15,7 @@ class UserSession extends Model
* @var string
*/
protected $connection = 'mysql-membership';
protected $table = 'user_sessions';
}

View File

@ -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' => '',

View File

@ -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();
});
}

View File

@ -0,0 +1,33 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateRoleSetsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('role_sets', function (Blueprint $table) {
$table->id();
$table->string('title');
//may require more idk yet.
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('role_sets');
}
}

View File

@ -0,0 +1,33 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateFeedsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('feeds', function (Blueprint $table) {
$table->id();
$table->integer('user_id');
$table->string('body');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('feeds');
}
}

View File

@ -0,0 +1,34 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateFriendsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('friends', function (Blueprint $table) {
$table->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');
}
}

View File

@ -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();

View File

@ -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);});
}

View File

@ -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 */}
<div className='col-md-7 mt-3 mt-md-0'>
<h4>My Feed</h4>
{validity.error?
<div className={`px-5 mb-10`}>
<div className={`error-dialog`}>
<p className={`mb-0`}>{validity.message}</p>
</div>
</div>
: null}
<div className='card mb-2'>
<div className='input-group p-2'>
<input type='text' className='form-control' placeholder='What are you up to?' area-label='What are you up to?' />
<button className='btn btn-secondary' type='button'>Share</button>
</div>
<form className='input-group p-2' onSubmit={(e)=>{e.preventDefault();createFeed();}} id={`form`}>
<input type='text' className='form-control' placeholder='What are you up to?' area-label='What are you up to?' name={`body`} id={`input`}/>
<button className='btn btn-secondary' type='submit'>Share</button>
</form>
</div>
{
feedState.loading
@ -76,9 +129,28 @@ const Dashboard = (props) => {
<Loader />
</div>
:
<div className='card'>
</div>
<>
{feedState.posts.posts.map(feed=>(
<>
<div className='card flex-row pt-3 px-3 align-content-center'>
<div className={`flex flex-column justify-content-center text-center w-fit-content`}>
<p className='mr-10'>{feed.creatorName}</p>
<img src='/images/testing/headshot.png' className='img-fluid graphic-thumb' />
</div>
<div className={`flex align-items-center col`}>
<p className='mr-10'><i>"{feed.body}"</i></p>
</div>
</div>
<div className="graphictoria-nav-splitter"></div>
</>
))}
{feedState.posts.posts.length <= 0? <p>There isn't any posts right now!</p> : null}
{feedState.posts.posts.length >= 1?
<div className={`w-100 jcc alc row mt-15`}>
{feedState.posts.currentPage >= 2? <button className={`w-fit-content btn btn-primary mr-15`} onClick={(e)=>{paginatePosts(true);}}>Previous Page</button> : null}
{feedState.posts.currentPage < feedState.posts.meta.last_page? <button className={`w-fit-content btn btn-primary`} onClick={(e)=>{paginatePosts(false);}}>Next Page</button> : null}
</div> : null}
</>
}
</div>

View File

@ -1011,6 +1011,12 @@ p {
display: none !important;
}
.graphic-thumb {
height: 60px;
width: 60px;
object-fit: cover;
}
.graphic-post {
padding: 1rem 1rem;
text-align: start;

View File

@ -38,6 +38,10 @@ 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');

View File

@ -62,6 +62,6 @@ Route::get('/games', function(){
return view('main');
});
Route::get('/account/logout', 'Controller@logout');
Route::get('/account/logout', 'AuthController@logout');
Route::get('/test123', 'GridTest@generateThumbnail');