Finished main features of site except following

main
Vinayak Ambigapathy ago%!(EXTRA string=8 months)
parent 6e6f86323e
commit 3b530fb385
  1. 11
      .env.example
  2. 12
      app/Http/Controllers/BlogController.php
  3. 61
      app/Http/Controllers/SocialiteController.php
  4. 12
      app/Http/Controllers/UserController.php
  5. 1
      app/Models/User.php
  6. 1
      app/Providers/AppServiceProvider.php
  7. 1
      app/Providers/EventServiceProvider.php
  8. 58
      app/Providers/SocialiteKainooSSOProvider.php
  9. 21
      app/Providers/SocialiteKainooSSOServiceProvider.php
  10. 1
      composer.json
  11. 440
      composer.lock
  12. 2
      config/app.php
  13. 11
      config/services.php
  14. 6
      resources/css/app.css
  15. 8
      resources/js/app.js
  16. 32
      resources/js/blog.js
  17. 14
      resources/js/commun.js
  18. 21
      resources/js/user.js
  19. 4
      resources/views/auth/login.blade.php
  20. 13
      resources/views/auth/register.blade.php
  21. 8
      resources/views/base/errors.blade.php
  22. 1
      resources/views/base/layout.blade.php
  23. 6
      resources/views/base/menu.blade.php
  24. 10
      resources/views/blog/create.blade.php
  25. 10
      resources/views/blog/modal_update.blade.php
  26. 2
      resources/views/blog/single.blade.php
  27. 8
      resources/views/user/modal_update.blade.php
  28. 26
      resources/views/user/profile.blade.php
  29. 9
      routes/web.php

@ -10,6 +10,10 @@ LOG_LEVEL=debug
DB_CONNECTION=sqlite DB_CONNECTION=sqlite
GITHUB_CLIENT_ID=
GITHUB_CLIENT_SECRET=
GITHUB_CLIENT_CALLBACK=http://localhost:8000/callback/github
BROADCAST_DRIVER=log BROADCAST_DRIVER=log
CACHE_DRIVER=file CACHE_DRIVER=file
FILESYSTEM_DISK=local FILESYSTEM_DISK=local
@ -23,8 +27,11 @@ REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null REDIS_PASSWORD=null
REDIS_PORT=6379 REDIS_PORT=6379
MAIL_MAILER=log MAIL_MAILER=smtp
MAIL_FROM_NAME="${APP_NAME}" MAIL_HOST=sandbox.smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=
MAIL_PASSWORD=
AWS_ACCESS_KEY_ID= AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY= AWS_SECRET_ACCESS_KEY=

@ -56,7 +56,7 @@ public function create()
return view('blog.create'); return view('blog.create');
} }
public function insert() public function store()
{ {
request()->validate([ request()->validate([
'title' => 'required', 'title' => 'required',
@ -65,9 +65,7 @@ public function insert()
$id = request()->user()->id; $id = request()->user()->id;
$image = BlogController::getRequestImage(); $image = BlogController::getRequestImage();
dd($image);
Log::info($image);
Log::info("Helllo");
$blog = Blog::create([ $blog = Blog::create([
'title' => request('title'), 'title' => request('title'),
'containt' => request('containt'), 'containt' => request('containt'),
@ -97,7 +95,7 @@ public function delete($id)
if (!$blog) return response('', 404); if (!$blog) return response('', 404);
if (request()->user()->id != $blog->user->id) return response('', 401); if (request()->user()->id != $blog->user->id) return response('', 401);
$blog->delete(); $blog->delete();
return response('', 200); return redirect('/');
} }
public function update($id) public function update($id)
@ -112,13 +110,13 @@ public function update($id)
if (request()->user()->id != $blog->user->id) return response('', 401); if (request()->user()->id != $blog->user->id) return response('', 401);
$image = BlogController::getRequestImage(); $image = BlogController::getRequestImage();
dd($image);
$blog->title = request('title'); $blog->title = request('title');
$blog->containt = request('containt'); $blog->containt = request('containt');
$blog->epilog = request('epilog'); $blog->epilog = request('epilog');
if($image) $blog->image = $image; if($image) $blog->image = $image;
$blog->save(); $blog->save();
return response('', 200); return redirect('/blog/' . $id);
} }
} }

@ -0,0 +1,61 @@
<?php
namespace App\Http\Controllers;
use Barryvdh\Debugbar\Facade;
use Illuminate\Http\Request;
use Laravel\Socialite\Facades\Socialite;
use App\Models\User;
use Illuminate\Support\Str;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\Auth;
use Exception;
class SocialiteController extends Controller
{
protected $providers = [ "github", "kainoo-sso" ];
public function redirect($provider)
{
if(in_array($provider, $this->providers))
{
return Socialite::driver($provider)->redirect();
}
return response("", 404);
}
public function callback($provider)
{
if(in_array($provider, $this->providers))
{
$user = null;
try {
$user = Socialite::driver($provider)->user();
} catch(Exception $e) {
return redirect('/register')->withErrors([
"message" => "Failed to login with " . $provider
]);
}
$email = $user->getEmail();
$name = $user->getName();
$username = $user->getNickname();
$user = User::where("email", $email)->first();
if(!$user)
{
$user = User::create([
'name' => $name,
'email' => $email,
'username' => $username,
'password' => bcrypt(Str::Random(15)),
'email_verified_at' => Carbon::now()
]);
}
Auth::login($user);
if (Auth::check()) return redirect('/');
}
return response("", 404);
}
}

@ -42,10 +42,22 @@ public function update($id)
$user->username = request('username'); $user->username = request('username');
$user->name = request('name'); $user->name = request('name');
$user->description = request('description'); $user->description = request('description');
$user->image = UserController::getRequestImage();
$user->save(); $user->save();
return response('', 200); return response('', 200);
} }
private static function getRequestImage()
{
if(request()->hasFile('image'))
{
$hash = request()->file('image')->hashName();
request()->file('image')->store('public/images/profile');
return $hash;
}
else return "";
}
public function follow($id) public function follow($id)
{ {
$user = User::find($id); $user = User::find($id);

@ -27,6 +27,7 @@ class User extends Authenticatable implements MustVerifyEmail
'image', 'image',
'email', 'email',
'password', 'password',
'email_verified_at'
]; ];
/** /**

@ -5,6 +5,7 @@
use Illuminate\Support\ServiceProvider; use Illuminate\Support\ServiceProvider;
use Illuminate\Auth\Notifications\VerifyEmail; use Illuminate\Auth\Notifications\VerifyEmail;
use Illuminate\Notifications\Messages\MailMessage; use Illuminate\Notifications\Messages\MailMessage;
use Laravel\Socialite\Contracts\Factory;
class AppServiceProvider extends ServiceProvider class AppServiceProvider extends ServiceProvider
{ {

@ -6,6 +6,7 @@
use Illuminate\Auth\Listeners\SendEmailVerificationNotification; use Illuminate\Auth\Listeners\SendEmailVerificationNotification;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider; use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Event; use Illuminate\Support\Facades\Event;
use App\Providers\SocialiteKainooSSOServiceProvider;
class EventServiceProvider extends ServiceProvider class EventServiceProvider extends ServiceProvider
{ {

@ -0,0 +1,58 @@
<?php
namespace App\Providers;
use Laravel\Socialite\Two\AbstractProvider;
use Laravel\Socialite\Two\ProviderInterface;
use Laravel\Socialite\Two\User as SocialiteUser;
use App\Models\User;
use Illuminate\Support\Arr;
use Laravel\Socialite\Facades\Socialite;
class SocialiteKainooSSOProvider extends AbstractProvider implements ProviderInterface
{
protected $scopes = [
'openid',
// 'profile',
// 'email'
];
private function getSiteUrl()
{
return 'https://dev.sso.kainoo.ch/realms/dev/protocol/openid-connect';
}
protected function getAuthUrl($state)
{
return $this->buildAuthUrlFromBase($this->getSiteUrl() . '/auth', $state);
}
protected function getTokenUrl()
{
return $this->getSiteUrl() . '/token';
}
protected function getUserByToken($token)
{
$response = $this->getHttpClient()->post($this->getSiteUrl() . '/userinfo', [
'headers' => [
'cache-control' => 'no-cache',
'Authorization' => 'Bearer ' . $token,
'Content-Type' => 'application/x-www-form-urlencoded',
]
]);
return json_decode($response->getBody()->getContents(), true);
}
protected function mapUserToObject(array $user)
{
return (new SocialiteUser())->setRaw($user)->map([
'id' => $user['sub'],
'name' => $user['name'],
'email' => $user['email'],
'nickname' => $user['given_name'],
'name' => $user['family_name'],
]);
}
}

@ -0,0 +1,21 @@
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Laravel\Socialite\Contracts\Factory;
class SocialiteKainooSSOServiceProvider extends ServiceProvider
{
public function boot()
{
$socialite = $this->app->make('Laravel\Socialite\Contracts\Factory');
$socialite->extend(
'kainoo-sso',
function ($app) use ($socialite) {
$config = config('services.kainoo-sso');
return $socialite->buildProvider(SocialiteKainooSSOProvider::class, $config);
}
);
}
}

@ -9,6 +9,7 @@
"guzzlehttp/guzzle": "^7.2", "guzzlehttp/guzzle": "^7.2",
"laravel/framework": "^10.10", "laravel/framework": "^10.10",
"laravel/sanctum": "^3.3", "laravel/sanctum": "^3.3",
"laravel/socialite": "^5.15",
"laravel/tinker": "^2.8", "laravel/tinker": "^2.8",
"nyholm/psr7": "^1.8", "nyholm/psr7": "^1.8",
"railsware/mailtrap-php": "^2.0", "railsware/mailtrap-php": "^2.0",

440
composer.lock generated

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "0d06ab3ef1d3439c90037cd4c2c3a39e", "content-hash": "7224b1e6a744d5216e58d67ddddb21d7",
"packages": [ "packages": [
{ {
"name": "brick/math", "name": "brick/math",
@ -572,6 +572,69 @@
], ],
"time": "2023-10-06T06:47:41+00:00" "time": "2023-10-06T06:47:41+00:00"
}, },
{
"name": "firebase/php-jwt",
"version": "v6.10.1",
"source": {
"type": "git",
"url": "https://github.com/firebase/php-jwt.git",
"reference": "500501c2ce893c824c801da135d02661199f60c5"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/firebase/php-jwt/zipball/500501c2ce893c824c801da135d02661199f60c5",
"reference": "500501c2ce893c824c801da135d02661199f60c5",
"shasum": ""
},
"require": {
"php": "^8.0"
},
"require-dev": {
"guzzlehttp/guzzle": "^7.4",
"phpspec/prophecy-phpunit": "^2.0",
"phpunit/phpunit": "^9.5",
"psr/cache": "^2.0||^3.0",
"psr/http-client": "^1.0",
"psr/http-factory": "^1.0"
},
"suggest": {
"ext-sodium": "Support EdDSA (Ed25519) signatures",
"paragonie/sodium_compat": "Support EdDSA (Ed25519) signatures when libsodium is not present"
},
"type": "library",
"autoload": {
"psr-4": {
"Firebase\\JWT\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Neuman Vong",
"email": "neuman+pear@twilio.com",
"role": "Developer"
},
{
"name": "Anant Narayanan",
"email": "anant@php.net",
"role": "Developer"
}
],
"description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.",
"homepage": "https://github.com/firebase/php-jwt",
"keywords": [
"jwt",
"php"
],
"support": {
"issues": "https://github.com/firebase/php-jwt/issues",
"source": "https://github.com/firebase/php-jwt/tree/v6.10.1"
},
"time": "2024-05-18T18:05:11+00:00"
},
{ {
"name": "fruitcake/php-cors", "name": "fruitcake/php-cors",
"version": "v1.3.0", "version": "v1.3.0",
@ -1508,6 +1571,78 @@
}, },
"time": "2024-08-02T07:48:17+00:00" "time": "2024-08-02T07:48:17+00:00"
}, },
{
"name": "laravel/socialite",
"version": "v5.15.1",
"source": {
"type": "git",
"url": "https://github.com/laravel/socialite.git",
"reference": "cc02625f0bd1f95dc3688eb041cce0f1e709d029"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laravel/socialite/zipball/cc02625f0bd1f95dc3688eb041cce0f1e709d029",
"reference": "cc02625f0bd1f95dc3688eb041cce0f1e709d029",
"shasum": ""
},
"require": {
"ext-json": "*",
"firebase/php-jwt": "^6.4",
"guzzlehttp/guzzle": "^6.0|^7.0",
"illuminate/contracts": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0",
"illuminate/http": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0",
"illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0",
"league/oauth1-client": "^1.10.1",
"php": "^7.2|^8.0",
"phpseclib/phpseclib": "^3.0"
},
"require-dev": {
"mockery/mockery": "^1.0",
"orchestra/testbench": "^4.0|^5.0|^6.0|^7.0|^8.0|^9.0",
"phpstan/phpstan": "^1.10",
"phpunit/phpunit": "^8.0|^9.3|^10.4"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "5.x-dev"
},
"laravel": {
"providers": [
"Laravel\\Socialite\\SocialiteServiceProvider"
],
"aliases": {
"Socialite": "Laravel\\Socialite\\Facades\\Socialite"
}
}
},
"autoload": {
"psr-4": {
"Laravel\\Socialite\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Taylor Otwell",
"email": "taylor@laravel.com"
}
],
"description": "Laravel wrapper around OAuth 1 & OAuth 2 libraries.",
"homepage": "https://laravel.com",
"keywords": [
"laravel",
"oauth"
],
"support": {
"issues": "https://github.com/laravel/socialite/issues",
"source": "https://github.com/laravel/socialite"
},
"time": "2024-06-28T20:09:34+00:00"
},
{ {
"name": "laravel/tinker", "name": "laravel/tinker",
"version": "v2.9.0", "version": "v2.9.0",
@ -1950,6 +2085,82 @@
], ],
"time": "2024-01-28T23:22:08+00:00" "time": "2024-01-28T23:22:08+00:00"
}, },
{
"name": "league/oauth1-client",
"version": "v1.10.1",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/oauth1-client.git",
"reference": "d6365b901b5c287dd41f143033315e2f777e1167"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/thephpleague/oauth1-client/zipball/d6365b901b5c287dd41f143033315e2f777e1167",
"reference": "d6365b901b5c287dd41f143033315e2f777e1167",
"shasum": ""
},
"require": {
"ext-json": "*",
"ext-openssl": "*",
"guzzlehttp/guzzle": "^6.0|^7.0",
"guzzlehttp/psr7": "^1.7|^2.0",
"php": ">=7.1||>=8.0"
},
"require-dev": {
"ext-simplexml": "*",
"friendsofphp/php-cs-fixer": "^2.17",
"mockery/mockery": "^1.3.3",
"phpstan/phpstan": "^0.12.42",
"phpunit/phpunit": "^7.5||9.5"
},
"suggest": {
"ext-simplexml": "For decoding XML-based responses."
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.0-dev",
"dev-develop": "2.0-dev"
}
},
"autoload": {
"psr-4": {
"League\\OAuth1\\Client\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Ben Corlett",
"email": "bencorlett@me.com",
"homepage": "http://www.webcomm.com.au",
"role": "Developer"
}
],
"description": "OAuth 1.0 Client Library",
"keywords": [
"Authentication",
"SSO",
"authorization",
"bitbucket",
"identity",
"idp",
"oauth",
"oauth1",
"single sign on",
"trello",
"tumblr",
"twitter"
],
"support": {
"issues": "https://github.com/thephpleague/oauth1-client/issues",
"source": "https://github.com/thephpleague/oauth1-client/tree/v1.10.1"
},
"time": "2022-04-15T14:02:14+00:00"
},
{ {
"name": "monolog/monolog", "name": "monolog/monolog",
"version": "3.7.0", "version": "3.7.0",
@ -2528,6 +2739,123 @@
], ],
"time": "2023-11-13T09:31:12+00:00" "time": "2023-11-13T09:31:12+00:00"
}, },
{
"name": "paragonie/constant_time_encoding",
"version": "v3.0.0",
"source": {
"type": "git",
"url": "https://github.com/paragonie/constant_time_encoding.git",
"reference": "df1e7fde177501eee2037dd159cf04f5f301a512"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/df1e7fde177501eee2037dd159cf04f5f301a512",
"reference": "df1e7fde177501eee2037dd159cf04f5f301a512",
"shasum": ""
},
"require": {
"php": "^8"
},
"require-dev": {
"phpunit/phpunit": "^9",
"vimeo/psalm": "^4|^5"
},
"type": "library",
"autoload": {
"psr-4": {
"ParagonIE\\ConstantTime\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Paragon Initiative Enterprises",
"email": "security@paragonie.com",
"homepage": "https://paragonie.com",
"role": "Maintainer"
},
{
"name": "Steve 'Sc00bz' Thomas",
"email": "steve@tobtu.com",
"homepage": "https://www.tobtu.com",
"role": "Original Developer"
}
],
"description": "Constant-time Implementations of RFC 4648 Encoding (Base-64, Base-32, Base-16)",
"keywords": [
"base16",
"base32",
"base32_decode",
"base32_encode",
"base64",
"base64_decode",
"base64_encode",
"bin2hex",
"encoding",
"hex",
"hex2bin",
"rfc4648"
],
"support": {
"email": "info@paragonie.com",
"issues": "https://github.com/paragonie/constant_time_encoding/issues",
"source": "https://github.com/paragonie/constant_time_encoding"
},
"time": "2024-05-08T12:36:18+00:00"
},
{
"name": "paragonie/random_compat",
"version": "v9.99.100",
"source": {
"type": "git",
"url": "https://github.com/paragonie/random_compat.git",
"reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/paragonie/random_compat/zipball/996434e5492cb4c3edcb9168db6fbb1359ef965a",
"reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a",
"shasum": ""
},
"require": {
"php": ">= 7"
},
"require-dev": {
"phpunit/phpunit": "4.*|5.*",
"vimeo/psalm": "^1"
},
"suggest": {
"ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes."
},
"type": "library",
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Paragon Initiative Enterprises",
"email": "security@paragonie.com",
"homepage": "https://paragonie.com"
}
],
"description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7",
"keywords": [
"csprng",
"polyfill",
"pseudorandom",
"random"
],
"support": {
"email": "info@paragonie.com",
"issues": "https://github.com/paragonie/random_compat/issues",
"source": "https://github.com/paragonie/random_compat"
},
"time": "2020-10-15T08:29:30+00:00"
},
{ {
"name": "php-http/client-common", "name": "php-http/client-common",
"version": "2.7.1", "version": "2.7.1",
@ -2984,6 +3312,116 @@
], ],
"time": "2024-07-20T21:41:07+00:00" "time": "2024-07-20T21:41:07+00:00"
}, },
{
"name": "phpseclib/phpseclib",
"version": "3.0.41",
"source": {
"type": "git",
"url": "https://github.com/phpseclib/phpseclib.git",
"reference": "621c73f7dcb310b61de34d1da4c4204e8ace6ceb"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/621c73f7dcb310b61de34d1da4c4204e8ace6ceb",
"reference": "621c73f7dcb310b61de34d1da4c4204e8ace6ceb",
"shasum": ""
},
"require": {
"paragonie/constant_time_encoding": "^1|^2|^3",
"paragonie/random_compat": "^1.4|^2.0|^9.99.99",
"php": ">=5.6.1"
},
"require-dev": {
"phpunit/phpunit": "*"
},
"suggest": {
"ext-dom": "Install the DOM extension to load XML formatted public keys.",
"ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.",
"ext-libsodium": "SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.",
"ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.",
"ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations."
},
"type": "library",
"autoload": {
"files": [
"phpseclib/bootstrap.php"
],
"psr-4": {
"phpseclib3\\": "phpseclib/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Jim Wigginton",
"email": "terrafrost@php.net",
"role": "Lead Developer"
},
{
"name": "Patrick Monnerat",
"email": "pm@datasphere.ch",
"role": "Developer"
},
{
"name": "Andreas Fischer",
"email": "bantu@phpbb.com",
"role": "Developer"
},
{
"name": "Hans-Jürgen Petrich",
"email": "petrich@tronic-media.com",
"role": "Developer"
},
{
"name": "Graham Campbell",
"email": "graham@alt-three.com",
"role": "Developer"
}
],
"description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.",
"homepage": "http://phpseclib.sourceforge.net",
"keywords": [
"BigInteger",
"aes",
"asn.1",
"asn1",
"blowfish",
"crypto",
"cryptography",
"encryption",
"rsa",
"security",
"sftp",
"signature",
"signing",
"ssh",
"twofish",
"x.509",
"x509"
],
"support": {
"issues": "https://github.com/phpseclib/phpseclib/issues",
"source": "https://github.com/phpseclib/phpseclib/tree/3.0.41"
},
"funding": [
{
"url": "https://github.com/terrafrost",
"type": "github"
},
{
"url": "https://www.patreon.com/phpseclib",
"type": "patreon"
},
{
"url": "https://tidelift.com/funding/github/packagist/phpseclib/phpseclib",
"type": "tidelift"
}
],
"time": "2024-08-12T00:13:54+00:00"
},
{ {
"name": "psr/clock", "name": "psr/clock",
"version": "1.0.0", "version": "1.0.0",

@ -167,7 +167,9 @@
App\Providers\AuthServiceProvider::class, App\Providers\AuthServiceProvider::class,
// App\Providers\BroadcastServiceProvider::class, // App\Providers\BroadcastServiceProvider::class,
App\Providers\EventServiceProvider::class, App\Providers\EventServiceProvider::class,
Laravel\Socialite\SocialiteServiceProvider::class,
App\Providers\RouteServiceProvider::class, App\Providers\RouteServiceProvider::class,
App\Providers\SocialiteKainooSSOServiceProvider::class
])->toArray(), ])->toArray(),
/* /*

@ -13,6 +13,17 @@
| a conventional file to locate the various service credentials. | a conventional file to locate the various service credentials.
| |
*/ */
'kainoo-sso' => [
'client_id' => env('KAINOO_SSO_CLIENT_ID'),
'client_secret' => env('KAINOO_SSO_CLIENT_SECRET'),
'redirect' => env('KAINOO_SSO_CLIENT_CALLBACK')
],
'github' => [
'client_id' => env('GITHUB_CLIENT_ID'),
'client_secret' => env('GITHUB_CLIENT_SECRET'),
'redirect' => env('GITHUB_CLIENT_CALLBACK')
],
'mailgun' => [ 'mailgun' => [
'domain' => env('MAILGUN_DOMAIN'), 'domain' => env('MAILGUN_DOMAIN'),

@ -15,6 +15,10 @@ @layer utilities {
.modal::backdrop { .modal::backdrop {
background-color: rgba(0, 0, 0, 0.63); background-color: rgba(0, 0, 0, 0.63);
} }
.rond-img {
clip-path:circle(40%);
}
} }
:root { :root {
@ -26,7 +30,7 @@ body {
} }
.md-content { .md-content {
font-family: "Courier Prime"; /*font-family: "Courier Prime";*/
} }
.md-content h1 { .md-content h1 {

@ -0,0 +1,8 @@
import { darkMode } from "./commun"
if (localStorage.getItem("darkMode") && localStorage.getItem("darkMode") === "yes") {
darkMode(true);
} else {
darkMode(false);
}

@ -1,8 +1,5 @@
import './bootstrap'; import './bootstrap';
import { addEvent } from "./commun"
function addEvent(btn, func) {
if(btn) func(btn);
}
window.addEventListener("DOMContentLoaded", () => { window.addEventListener("DOMContentLoaded", () => {
let modal = document.querySelector('#modal-update'); let modal = document.querySelector('#modal-update');
@ -22,10 +19,12 @@ window.addEventListener("DOMContentLoaded", () => {
method: "POST", method: "POST",
headers: { headers: {
"X-CSRF-Token": token "X-CSRF-Token": token
},
}).then(response => {
if (response.redirected) {
window.location.href = response.url;
return;
} }
}).then((res) => {
if (res.status === 400) alert("Couldn't follow this user");
//else window.location.href = "/profile/" + id;
}); });
}); });
}); });
@ -39,10 +38,11 @@ window.addEventListener("DOMContentLoaded", () => {
method: "POST", method: "POST",
headers: { headers: {
"X-CSRF-Token": token "X-CSRF-Token": token
},
}).then(response => {
if (response.redirected) {
window.location.href = response.url;
} }
}).then((res) => {
if (res.status === 400) alert(res.value);
else window.location.href = "/blog/" + id;
}); });
}); });
}); });
@ -71,7 +71,11 @@ window.addEventListener("DOMContentLoaded", () => {
headers: { headers: {
"X-CSRF-Token": token "X-CSRF-Token": token
}, },
body: formData body: formData,
}).then(response => {
if (response.redirected) {
window.location.href = response.url;
}
}); });
}); });
}); });
@ -85,9 +89,11 @@ window.addEventListener("DOMContentLoaded", () => {
method: "DELETE", method: "DELETE",
headers: { headers: {
"X-CSRF-Token": token "X-CSRF-Token": token
},
}).then(response => {
if (response.redirected) {
window.location.href = response.url;
} }
}).then((res) => {
window.location.href = "/blogs"
}); });
}); });
}); });

@ -0,0 +1,14 @@
export function addEvent(btn, func) {
if(btn) func(btn);
}
export function darkMode(state) {
let page = document.querySelector("html");
if (state && !page.classList.contains("dark")) {
page.classList.add("dark");
localStorage.setItem("darkMode", "yes");
} else {
localStorage.setItem("darkMode", "no");
page.classList.remove("dark");
}
}

@ -1,8 +1,5 @@
import './bootstrap'; import './bootstrap';
import { darkMode, addEvent } from "./commun"
function addEvent(btn, func) {
if(btn) func(btn);
}
window.addEventListener("DOMContentLoaded", () => { window.addEventListener("DOMContentLoaded", () => {
let modal = document.querySelector('#modal-update'); let modal = document.querySelector('#modal-update');
@ -11,6 +8,22 @@ window.addEventListener("DOMContentLoaded", () => {
let deleteUserBtn = document.querySelector("#btn-user-delete"); let deleteUserBtn = document.querySelector("#btn-user-delete");
let updateUserBtn = document.querySelector("#btn-user-update"); let updateUserBtn = document.querySelector("#btn-user-update");
let followBtn = document.querySelector("#btn-follow"); let followBtn = document.querySelector("#btn-follow");
let darkModeToggle = document.querySelector("#dark-mode-toggle");
if (localStorage.getItem("darkMode") && localStorage.getItem("darkMode") === "yes") {
darkModeToggle.checked = true
} else {
darkModeToggle.checked = false
}
addEvent(darkModeToggle, (btn) => btn.addEventListener("change", function() {
console.log("coucou")
if (this.checked){
darkMode(true);
} else {
darkMode(false);
}
}));
addEvent(followBtn, (btn) => { addEvent(followBtn, (btn) => {
btn.addEventListener("click", (e) => { btn.addEventListener("click", (e) => {

@ -6,9 +6,9 @@
<h1 class="text-6xl font-bold pb-3 mb-5 border-b border-black dark:border-white">Login</h1> <h1 class="text-6xl font-bold pb-3 mb-5 border-b border-black dark:border-white">Login</h1>
<form action="/login" method="post" class="flex flex-col items-center"> <form action="/login" method="post" class="flex flex-col items-center">
<div class="grid grid-cols-4 w-full"> <div class="grid grid-cols-4 w-full">
<p>Email :</p><input class="border border-gray-300 rounded-lg col-span-3 mb-5 p-2 dark:bg-black" <p>Email :</p><input class="border border-gray-300 rounded-lg col-span-3 mb-5 p-2 dark:bg-black focus:animate-pulse"
name="email" type="email" value="{{ old('email') }}"> name="email" type="email" value="{{ old('email') }}">
<p>Password :</p><input class="border border-gray-300 rounded-lg col-span-3 mb-5 p-2 dark:bg-black" <p>Password :</p><input class="border border-gray-300 rounded-lg col-span-3 mb-5 p-2 dark:bg-black focus:animate-pulse"
name="password" type="password"> name="password" type="password">
</div> </div>
@csrf @csrf

@ -6,13 +6,13 @@
<h1 class="text-6xl font-bold pb-3 mb-5 border-b border-black dark:border-white">Register</h1> <h1 class="text-6xl font-bold pb-3 mb-5 border-b border-black dark:border-white">Register</h1>
<form action="/register" method="post" class="flex flex-col items-center"> <form action="/register" method="post" class="flex flex-col items-center">
<div class="grid grid-cols-4 w-full"> <div class="grid grid-cols-4 w-full">
<p>Username :</p><input class="border border-gray-300 rounded-lg col-span-3 mb-5 p-2 dark:bg-black" <p>Username :</p><input class="border border-gray-300 rounded-lg col-span-3 mb-5 p-2 dark:bg-black focus:animate-pulse"
name="username" type="text" value="{{ old('username') }}"> name="username" type="text" value="{{ old('username') }}">
<p>Name (Optional):</p><input class="border border-gray-300 rounded-lg col-span-3 mb-5 p-2 dark:bg-black" <p>Name (Optional):</p><input class="border border-gray-300 rounded-lg col-span-3 mb-5 p-2 dark:bg-black focus:animate-pulse"
name="name" type="text" value="{{ old('name') }}"> name="name" type="text" value="{{ old('name') }}">
<p>Email :</p><input class="border border-gray-300 rounded-lg col-span-3 mb-5 p-2 dark:bg-black" <p>Email :</p><input class="border border-gray-300 rounded-lg col-span-3 mb-5 p-2 dark:bg-black focus:animate-pulse"
name="email" type="email" value="{{ old('email') }}"> name="email" type="email" value="{{ old('email') }}">
<p>Description (Optional):</p><textarea class="border border-gray-300 rounded-lg col-span-3 mb-5 p-2 dark:bg-black" <p>Description (Optional):</p><textarea class="border border-gray-300 rounded-lg col-span-3 mb-5 p-2 dark:bg-black focus:animate-pulse"
name="description" type="text">{{ old('description') }}</textarea> name="description" type="text">{{ old('description') }}</textarea>
<p>Password :</p><input class="border border-gray-300 rounded-lg col-span-3 mb-5 p-2 dark:bg-black" <p>Password :</p><input class="border border-gray-300 rounded-lg col-span-3 mb-5 p-2 dark:bg-black"
name="password" type="password" > name="password" type="password" >
@ -20,6 +20,11 @@
@csrf @csrf
<button type="submit" class="rounded-lg bg-blue-500 text-white p-2 w-fit">Send</button> <button type="submit" class="rounded-lg bg-blue-500 text-white p-2 w-fit">Send</button>
</form> </form>
<div class=" w-full flex justify-center mt-10">
<p class="mr-5">Other Connection methods :</p>
<a class="mr-5" href="/redirect/github">Github</a>
<a class="mr-5" href="/redirect/kainoo-sso">Kainoo SSO</a>
</div>
</div> </div>
</div> </div>
@endsection @endsection

@ -1,3 +1,5 @@
@foreach($errors->all() as $key => $error) <div class="w-full flex flex-col items-center fixed mt-5">
<p>{{ $error }}</p> @foreach($errors->all() as $key => $error)
@endforeach <p class="w-1/4 text-center bg-red-600 rounded-lg border-[7px] border-red-300 py-2 px-1 text-2xl mb-3">{{ $error }}</p>
@endforeach
</div>

@ -6,6 +6,7 @@
<link href="https://fonts.googleapis.com/css2?family=Courier+Prime:ital,wght@0,400;0,700;1,400;1,700&family=Ubuntu+Mono:ital,wght@0,400;0,700;1,400;1,700&display=swap" rel="stylesheet"> <link href="https://fonts.googleapis.com/css2?family=Courier+Prime:ital,wght@0,400;0,700;1,400;1,700&family=Ubuntu+Mono:ital,wght@0,400;0,700;1,400;1,700&display=swap" rel="stylesheet">
<title>BlogBuntu</title> <title>BlogBuntu</title>
@vite('resources/css/app.css') @vite('resources/css/app.css')
@vite('resources/js/app.js')
</head> </head>
<body class="w-full flex h-screen overflow-y-hidden bg-white dark:bg-black text-black dark:text-white"> <body class="w-full flex h-screen overflow-y-hidden bg-white dark:bg-black text-black dark:text-white">
@include('base.menu') @include('base.menu')

@ -1,9 +1,10 @@
<nav class="flex flex-col justify-between w-fit h-full bg-white border-black pb-5 px-3 <nav class="flex flex-col justify-between w-fit h-full bg-white border-black pb-10 px-3
dark:bg-black border-r dark:border-white"> dark:bg-black border-r dark:border-white">
<a href="/" class="w-full flex justify-center mb-12"> <a href="/" class="w-full flex justify-center mb-12">
<img class="size-[6rem] mx-auto" src="/img/blog_logo.webp"> <img class="size-[6rem] mx-auto" src="/img/blog_logo.webp">
</a> </a>
<ul class="flex flex-col w-full"> <div class="w-full flex flex-col justify-between">
<ul class="flex flex-col w-full mb-10">
@if(request()->user()) @if(request()->user())
@include('base.icon', [ @include('base.icon', [
"icon" => "create_icon.svg", "icon" => "create_icon.svg",
@ -30,4 +31,5 @@
]) ])
@endif @endif
</ul> </ul>
</div>
</nav> </nav>

@ -4,15 +4,15 @@
<div class="w-full flex justify-center items-center"> <div class="w-full flex justify-center items-center">
<div class="w-2/3 p-10 border border-black dark:border-white rounded-lg"> <div class="w-2/3 p-10 border border-black dark:border-white rounded-lg">
<h1 class="text-6xl font-bold pb-3 mb-5 border-b border-black dark:border-white">Create a blog</h1> <h1 class="text-6xl font-bold pb-3 mb-5 border-b border-black dark:border-white">Create a blog</h1>
<form action="/blog" method="post" class="flex flex-col items-center"> <form action="/blog" method="post" enctype="multipart/form-data" class="flex flex-col items-center">
<div class="grid grid-cols-4 w-full"> <div class="grid grid-cols-4 w-full">
<p>Title :</p><input class="border border-gray-300 rounded-lg col-span-3 mb-5 p-2 dark:bg-black" <p>Title :</p><input class="border border-gray-300 rounded-lg col-span-3 mb-5 p-2 dark:bg-black focus:animate-pulse"
name="title" type="text" value="{{ old('title') }}"> name="title" type="text" value="{{ old('title') }}">
<p>Image (Optional):</p><input class="border border-gray-300 rounded-lg col-span-3 mb-5 p-2 dark:bg-black" <p>Image (Optional):</p><input class="border border-gray-300 rounded-lg col-span-3 mb-5 p-2 dark:bg-black focus:animate-pulse"
name="image" type="file" value="{{ old('image') }}"> name="image" type="file" value="{{ old('image') }}">
<p>Epilog (Optional):</p><textarea class="border border-gray-300 rounded-lg col-span-3 mb-5 p-2 dark:bg-black" <p>Epilog (Optional):</p><textarea class="border border-gray-300 rounded-lg col-span-3 mb-5 p-2 dark:bg-black focus:animate-pulse"
name="epilog" type="text">{{ old('epilog') }}</textarea> name="epilog" type="text">{{ old('epilog') }}</textarea>
<p>Content (Optional):</p><textarea class="border border-gray-300 rounded-lg col-span-3 mb-5 p-2 dark:bg-black" <p>Content (Optional):</p><textarea class="border border-gray-300 rounded-lg col-span-3 mb-5 p-2 dark:bg-black focus:animate-pulse"
name="containt" type="text">{{ old('containt') }}</textarea> name="containt" type="text">{{ old('containt') }}</textarea>
</div> </div>
<button type="submit" class="rounded-lg bg-blue-500 text-white p-2 w-fit">Send</button> <button type="submit" class="rounded-lg bg-blue-500 text-white p-2 w-fit">Send</button>

@ -6,16 +6,16 @@ class="modal w-2/3 p-10 border rounded-lg border-black dark:border-white dark:bg
<h1 class="text-6xl font-bold pb-3 mb-5 border-b border-black dark:border-white">Update blog</h1> <h1 class="text-6xl font-bold pb-3 mb-5 border-b border-black dark:border-white">Update blog</h1>
<form id="update-form" class="flex flex-col items-center"> <form id="update-form" class="flex flex-col items-center">
<div class="grid grid-cols-4 w-full"> <div class="grid grid-cols-4 w-full">
<p>Title</p><input class="border border-gray-300 rounded-lg col-span-3 mb-5 p-2 dark:bg-black" <p>Title</p><input class="border border-gray-300 rounded-lg col-span-3 mb-5 p-2 dark:bg-black focus:animate-pulse"
name="title" type="text" value="{{ old('title') ? old('title') : $blog->title }}"> name="title" type="text" value="{{ old('title') ? old('title') : $blog->title }}">
<p>Image</p><input class="border border-gray-300 rounded-lg col-span-3 mb-5 p-2 dark:bg-black" <p>Image</p><input class="border border-gray-300 rounded-lg col-span-3 mb-5 p-2 dark:bg-black focus:animate-pulse"
name="image" type="file" value="{{ old('image') ? old('image') : $blog->image }}"> name="image" type="file" value="{{ old('image') ? old('image') : $blog->image }}">
<p>Epilog</p><textarea class="border border-gray-300 rounded-lg col-span-3 mb-5 p-2 dark:bg-black" <p>Epilog</p><textarea class="border border-gray-300 rounded-lg col-span-3 mb-5 p-2 dark:bg-black focus:animate-pulse"
name="epilog" type="text">{{ old('epilog') ? old('epilog') : $blog->epilog }}</textarea> name="epilog" type="text">{{ old('epilog') ? old('epilog') : $blog->epilog }}</textarea>
<p>Content</p><textarea class="border border-gray-300 rounded-lg col-span-3 mb-5 p-2 dark:bg-black" <p>Content</p><textarea class="border border-gray-300 rounded-lg col-span-3 mb-5 p-2 dark:bg-black focus:animate-pulse"
name="containt" type="text">{{ old('containt') ? old('containt') : $blog->containt }}</textarea> name="containt" type="text">{{ old('containt') ? old('containt') : $blog->containt }}</textarea>
</div> </div>
<button id="btn-blog-update" data-id="{{$blog->id}}" <button id="btn-blog-update" data-id="{{ $blog->id }}"
class="rounded-lg bg-blue-500 text-white p-2 w-fit">Update</button> class="rounded-lg bg-blue-500 text-white p-2 w-fit">Update</button>
@csrf @csrf
</form> </form>

@ -5,8 +5,8 @@
<div class="w-full h-screen overflow-y-auto"> <div class="w-full h-screen overflow-y-auto">
<div class="w-full flex flex-col pt-10 items-center px-[200px]"> <div class="w-full flex flex-col pt-10 items-center px-[200px]">
<div class="w-full flex justify-between mb-8"> <div class="w-full flex justify-between mb-8">
@csrf
<div> <div>
@csrf
@if(request()->user() && $blog->user->id == request()->user()->id) @if(request()->user() && $blog->user->id == request()->user()->id)
<button id="open-modal" class="rounded-lg bg-blue-500 text-white p-2 w-fit">Update</button> <button id="open-modal" class="rounded-lg bg-blue-500 text-white p-2 w-fit">Update</button>
<button id="btn-blog-delete" class="rounded-lg bg-red-500 text-white p-2 w-fit" <button id="btn-blog-delete" class="rounded-lg bg-red-500 text-white p-2 w-fit"

@ -6,11 +6,13 @@
<h1 class="text-6xl font-bold pb-3 mb-5 border-b border-black dark:border-white">Update user info</h1> <h1 class="text-6xl font-bold pb-3 mb-5 border-b border-black dark:border-white">Update user info</h1>
<form id="update-form" class="flex flex-col items-center" > <form id="update-form" class="flex flex-col items-center" >
<div class="grid grid-cols-4 w-full"> <div class="grid grid-cols-4 w-full">
<p>Username :</p><input class="border border-gray-300 rounded-lg col-span-3 mb-5 p-2 dark:bg-black" <p>Username :</p><input class="border border-gray-300 rounded-lg col-span-3 mb-5 p-2 dark:bg-black focus:animate-pulse"
name="username" type="text" value="{{ old('username') ? old('username') : $user->username }}"> name="username" type="text" value="{{ old('username') ? old('username') : $user->username }}">
<p>Name (Optional):</p><input class="border border-gray-300 rounded-lg col-span-3 mb-5 p-2 dark:bg-black" <p>Name (Optional):</p><input class="border border-gray-300 rounded-lg col-span-3 mb-5 p-2 dark:bg-black focus:animate-pulse"
name="name" type="text" value="{{ old('name') ? old('name') : $user->name }}"> name="name" type="text" value="{{ old('name') ? old('name') : $user->name }}">
<p>Description (Optional):</p><textarea class="border border-gray-300 rounded-lg col-span-3 mb-5 p-2 dark:bg-black" <p>Image</p><input class="border border-gray-300 rounded-lg col-span-3 mb-5 p-2 dark:bg-black focus:animate-pulse"
name="image" type="file" value="{{ old('image') ? old('image') : $user->image }}">
<p>Description (Optional):</p><textarea class="border border-gray-300 rounded-lg col-span-3 mb-5 p-2 dark:bg-black focus:animate-pulse"
name="description" type="text">{{ old('description') ? old('description') : $user->description }}</textarea> name="description" type="text">{{ old('description') ? old('description') : $user->description }}</textarea>
</div> </div>
@csrf @csrf

@ -4,10 +4,14 @@
@vite('resources/js/user.js') @vite('resources/js/user.js')
<div class="w-full flex flex-col h-full items-center px-[140px] mt-[20px]"> <div class="w-full flex flex-col h-full items-center px-[140px] mt-[20px]">
<div class="w-full h-max flex h-pb-5 border-b border-black dark:border-white"> <div class="w-full h-max flex h-pb-5 border-b border-black dark:border-white">
<div class="w-max overflow-hidden rounded-[150px]"> <div class="w-1/5 flex items-center justify-center h-[300px] overflow-hidden rond-img bg-black dark:bg-white">
<img src="/img/profile_icon.svg" class="w-[300px]"> @if(!$user->image)
<img src="/img/profile_icon.svg" class="h-max brightness-0 invert dark:brightness-100 dark:invert-0">
@else
<img src="{{ asset('storage/images/profile/' . $user->image) }}" class="h-max">
@endif
</div> </div>
<div class="w-full grid grid-rows-3 items-center"> <div class="w-4/5 grid grid-rows-3 items-center">
<p class="w-full text-right">{{ $user->followed->count() }} followers</p> <p class="w-full text-right">{{ $user->followed->count() }} followers</p>
<h1 class="text-6xl font-bold pb-3">{{ $user->name }}</h1> <h1 class="text-6xl font-bold pb-3">{{ $user->name }}</h1>
<div class="flex"> <div class="flex">
@ -18,13 +22,27 @@
</div> </div>
</div> </div>
@csrf @csrf
<div class="w-full flex justify-end my-2"> <div class="w-full flex justify-between items-center my-2">
@if(request()->user() && $user->id == request()->user()->id) @if(request()->user() && $user->id == request()->user()->id)
<div class="flex items-center w-1/5">
<p class="text-sm mr-3">Dark Theme</p>
<label class="inline-flex items-center justify-center cursor-pointer mr-[10%]">
<input id="dark-mode-toggle" type="checkbox" class="sr-only peer">
<div class="relative w-11 h-6 bg-gray-200 peer-focus:outline-none peer-focus:ring-4
peer-focus:ring-blue-300 dark:peer-focus:ring-blue-800 rounded-full peer
dark:bg-gray-700 peer-checked:after:translate-x-full rtl:peer-checked:after:-translate-x-full
peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:start-[2px]
after:bg-white after:border-gray-300 after:border after:rounded-full after:h-5 after:w-5 after:transition-all
dark:border-gray-600 peer-checked:bg-blue-600"></div>
</label>
</div>
<div>
<button class="rounded-lg bg-blue-500 text-white p-2 w-fit mr-2" <button class="rounded-lg bg-blue-500 text-white p-2 w-fit mr-2"
id="open-modal">Update</button> id="open-modal">Update</button>
<button class="rounded-lg bg-red-500 text-white p-2 w-fit" <button class="rounded-lg bg-red-500 text-white p-2 w-fit"
id="btn-user-delete" data-id="{{$user->id}}">Delete</button> id="btn-user-delete" data-id="{{$user->id}}">Delete</button>
@include('user.modal_update') @include('user.modal_update')
</div>
@else @else
<button class="rounded-lg bg-blue-500 text-white p-2 w-fit mr-2" <button class="rounded-lg bg-blue-500 text-white p-2 w-fit mr-2"
id="btn-follow" data-id="{{$user->id}}">Follow</button> id="btn-follow" data-id="{{$user->id}}">Follow</button>

@ -5,6 +5,7 @@
use App\Http\Controllers\LoginController; use App\Http\Controllers\LoginController;
use App\Http\Controllers\BlogController; use App\Http\Controllers\BlogController;
use App\Http\Controllers\UserController; use App\Http\Controllers\UserController;
use App\Http\Controllers\SocialiteController;
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
@ -28,7 +29,10 @@
Route::get('/login', [ LoginController::class, 'index' ]); Route::get('/login', [ LoginController::class, 'index' ]);
Route::post('/login', [ LoginController::class, 'login' ]); Route::post('/login', [ LoginController::class, 'login' ]);
Route::get('/logout', [ LoginController::class, 'logout' ])->middleware([ 'App\Http\Middleware\UserAuthMiddleware', 'verified' ]); Route::get('/logout', [ LoginController::class, 'logout' ])->middleware([ 'App\Http\Middleware\UserAuthMiddleware' ]);
Route::get('/redirect/{provider}', [ SocialiteController::class, 'redirect' ]);
Route::get('/callback/{provider}', [ SocialiteController::class, 'callback' ]);
Route::get('/profile/{id}', [ UserController::class, 'profile' ]); Route::get('/profile/{id}', [ UserController::class, 'profile' ]);
Route::get('/myprofile', [ UserController::class, 'myProfile' ])->middleware([ 'App\Http\Middleware\UserAuthMiddleware', 'verified' ]); Route::get('/myprofile', [ UserController::class, 'myProfile' ])->middleware([ 'App\Http\Middleware\UserAuthMiddleware', 'verified' ]);
@ -37,10 +41,9 @@
Route::post('/user/{id}', [ UserController::class, 'update' ])->middleware([ 'App\Http\Middleware\UserAuthMiddleware', 'verified' ]); Route::post('/user/{id}', [ UserController::class, 'update' ])->middleware([ 'App\Http\Middleware\UserAuthMiddleware', 'verified' ]);
Route::delete('/user/{id}', [ UserController::class, 'delete' ])->middleware([ 'App\Http\Middleware\UserAuthMiddleware', 'verified' ]); Route::delete('/user/{id}', [ UserController::class, 'delete' ])->middleware([ 'App\Http\Middleware\UserAuthMiddleware', 'verified' ]);
Route::get('/blogs', [ BlogController::class, 'list' ]);
Route::get('/blog/create', [ BlogController::class, 'create' ])->middleware([ 'App\Http\Middleware\UserAuthMiddleware', 'verified' ]); Route::get('/blog/create', [ BlogController::class, 'create' ])->middleware([ 'App\Http\Middleware\UserAuthMiddleware', 'verified' ]);
Route::get('/blog/{id}', [ BlogController::class, 'single' ]); Route::get('/blog/{id}', [ BlogController::class, 'single' ]);
Route::post('/blog', [ BlogController::class, 'insert' ])->middleware([ 'App\Http\Middleware\UserAuthMiddleware', 'verified' ]);
Route::post('/blog/like/{id}', [ BlogController::class, 'like' ])->middleware([ 'App\Http\Middleware\UserAuthMiddleware', 'verified' ]); Route::post('/blog/like/{id}', [ BlogController::class, 'like' ])->middleware([ 'App\Http\Middleware\UserAuthMiddleware', 'verified' ]);
Route::post('/blog', [ BlogController::class, 'store' ])->middleware([ 'App\Http\Middleware\UserAuthMiddleware', 'verified' ]);
Route::post('/blog/{id}', [ BlogController::class, 'update' ])->middleware([ 'App\Http\Middleware\UserAuthMiddleware', 'verified' ]); Route::post('/blog/{id}', [ BlogController::class, 'update' ])->middleware([ 'App\Http\Middleware\UserAuthMiddleware', 'verified' ]);
Route::delete('/blog/{id}', [ BlogController::class, 'delete' ])->middleware([ 'App\Http\Middleware\UserAuthMiddleware', 'verified' ]); Route::delete('/blog/{id}', [ BlogController::class, 'delete' ])->middleware([ 'App\Http\Middleware\UserAuthMiddleware', 'verified' ]);

Loading…
Cancel
Save