diff --git a/modules/Api/Config/auth.php b/modules/Api/Config/auth.php deleted file mode 100644 index 1c8bd27..0000000 --- a/modules/Api/Config/auth.php +++ /dev/null @@ -1,22 +0,0 @@ - 'api', - 'service' => Shared\Services\AuthService::class, - 'claims' => [ - 'jti' => uniqid(), - 'iss' => 'issuer', - 'aud' => 'audience', - 'iat' => time(), - 'nbf' => time() + 1, - 'exp' => time() + 3600 // 1 hour - ] -]; diff --git a/modules/Api/Config/cors.php b/modules/Api/Config/cors.php deleted file mode 100644 index 7a3b4da..0000000 --- a/modules/Api/Config/cors.php +++ /dev/null @@ -1,14 +0,0 @@ - '*', - 'Access-Control-Allow-Headers' => 'Origin, X-Requested-With, Content-Type, Accept, Authorization, refresh_token', - 'Access-Control-Allow-Methods' => 'GET, POST, PUT, DELETE, OPTIONS', - 'Access-Control-Allow-Credentials' => true, -]; diff --git a/modules/Api/Config/database.php b/modules/Api/Config/database.php deleted file mode 100644 index acebd89..0000000 --- a/modules/Api/Config/database.php +++ /dev/null @@ -1,52 +0,0 @@ - 'sleekdb', - - /** - * --------------------------------------------------------- - * Database Connections - * --------------------------------------------------------- - * - * You can define as many database configurations as you want. - * - * driver : mysql, pgsql, sqlite - * host : The database server (localhost) - * dbname : The database name - * username : Username of the database server - * password : Password of the database server - * charset : Default charset - */ - 'mysql' => [ - 'driver' => env("DB_DRIVER", "mysql"), - 'host' => env("DB_HOST", "localhost"), - 'dbname' => env("DB_NAME"), - 'username' => env("DB_USERNAME", "root"), - 'password' => env("DB_PASSWORD"), - 'charset' => env("DB_CHARSET", 'utf8'), - 'orm' => \Quantum\Libraries\Database\Idiorm\IdiormDbal::class - ], - 'sleekdb' => [ - 'driver' => 'sleekdb', - 'config' => [ - 'auto_cache' => false, - 'cache_lifetime' => null, - 'timeout' => false, - 'search' => [ - 'min_length' => 2, - 'mode' => 'or', - 'score_key' => 'scoreKey', - 'algorithm' => 1 - ], - ], - 'database_dir' => base_dir() . DS . 'shared' . DS . 'store', - 'orm' => \Quantum\Libraries\Database\Sleekdb\SleekDbal::class - ], -]; diff --git a/modules/Api/Config/routes.php b/modules/Api/Config/routes.php deleted file mode 100644 index db9ef86..0000000 --- a/modules/Api/Config/routes.php +++ /dev/null @@ -1,35 +0,0 @@ -group("openapi", function ($route) { - $route->get("docs", function (Quantum\Http\Response $response) { - $response->html(partial("openApi/openApi")); - }); - - $route->get("spec", function (Quantum\Http\Response $response) { - $fs = Quantum\Di\Di::get(Quantum\Libraries\Storage\FileSystem::class); - $response->json((array) json_decode($fs->get(modules_dir() . "\Api\Resources\openapi\spec.json"))); - }); - }); - - $route->get('[:alpha:2]?/posts', 'PostController', 'getPosts'); - $route->get('[:alpha:2]?/post/[id=:any]', 'PostController', 'getPost')->middlewares(['Post']); - - $route->post('[:alpha:2]?/signin', 'AuthController', 'signin'); - $route->post('[:alpha:2]?/signup', 'AuthController', 'signup')->middlewares(['Signup']); - $route->post('[:alpha:2]?/forget', 'AuthController', 'forget')->middlewares(['Forget']); - $route->get('[:alpha:2]?/activate/[token=:any]', 'AuthController', 'activate')->middlewares(['Activate']); - $route->post('[:alpha:2]?/reset/[token=:any]', 'AuthController', 'reset')->middlewares(['Reset']); - $route->get('[:alpha:2]?/resend/[code=:any]', 'AuthController', 'resend')->middlewares(['Resend']); - $route->post('[:alpha:2]?/verify', 'AuthController', 'verify')->middlewares(['Verify']); - - $route->group('auth', function ($route) { - $route->get('[:alpha:2]?/me', 'AuthController', 'me'); - $route->get('[:alpha:2]?/signout', 'AuthController', 'signout')->middlewares(['Signout']); - $route->get('[:alpha:2]?/my-posts', 'PostController', 'myPosts')->middlewares(['Editor']); - $route->post('[:alpha:2]?/my-posts/create', 'PostController', 'create')->middlewares(['Editor']); - $route->add('[:alpha:2]?/my-posts/amend/[id=:any]', 'PUT', 'PostController', 'amend')->middlewares(['Editor', 'Owner']); - $route->add('[:alpha:2]?/my-posts/delete/[id=:any]', 'DELETE', 'PostController', 'delete')->middlewares(['Editor', 'Owner']); - $route->add('[:alpha:2]?/my-posts/delete-image/[id=:any]', 'DELETE', 'PostController', 'deleteImage')->middlewares(['Editor', 'Owner']); - })->middlewares(['Auth']); -}; diff --git a/modules/Api/Controllers/Abstracts/ApiController.php b/modules/Api/Controllers/Abstracts/ApiController.php deleted file mode 100644 index 9730a59..0000000 --- a/modules/Api/Controllers/Abstracts/ApiController.php +++ /dev/null @@ -1,53 +0,0 @@ - - * @copyright Copyright (c) 2018 Softberg LLC (https://softberg.org) - * @link http://quantum.softberg.org/ - * @since 2.9.0 - */ - -namespace Modules\Api\Controllers\Abstracts; - -use Quantum\Mvc\QtController; - -/** - * Class ApiController - * @package Modules\Api - * @OA\Info( - * title="Quantum API documentation", - * version="2.9.0", - * description=" *Quantum Documentation: https://quantum.softberg.org/en/docs/v1/overview" - * ), - * @OA\SecurityScheme( - * securityScheme="bearer_token", - * type="apiKey", - * name="Authorization", - * in="header" - * ) - */ -abstract class ApiController extends QtController -{ - - /** - * Status error - */ - const STATUS_ERROR = 'error'; - - /** - * Status success - */ - const STATUS_SUCCESS = 'success'; - - /** - * CSRF verification - * @var bool - */ - public $csrfVerification = false; - -} diff --git a/modules/Api/Controllers/Abstracts/OpenApiAuthController.php b/modules/Api/Controllers/Abstracts/OpenApiAuthController.php deleted file mode 100644 index c20b01c..0000000 --- a/modules/Api/Controllers/Abstracts/OpenApiAuthController.php +++ /dev/null @@ -1,398 +0,0 @@ - - * @copyright Copyright (c) 2018 Softberg LLC (https://softberg.org) - * @link http://quantum.softberg.org/ - * @since 2.9.0 - */ - -namespace Modules\Api\Controllers\Abstracts; - -use Quantum\Http\Response; -use Quantum\Http\Request; - -/** - * Class OpenApiAuthController - * @package Modules\Api - */ -abstract class OpenApiAuthController extends ApiController -{ - - /** - * Sign in action - * @OA\Post( - * path="/api/signin", - * tags={"Authentication"}, - * summary="Sign in action", - * operationId="userSignIn", - * @OA\RequestBody( - * @OA\MediaType( - * mediaType="application/json", - * @OA\Schema( - * @OA\Property( - * property="email", - * type="string" - * ), - * @OA\Property( - * property="password", - * type="string" - * ), - * example={"email": "rgaylord@gmail.com", "password": "password"} - * ) - * ) - * ), - * @OA\Response( - * response=200, - * description="Success", - * @OA\MediaType( - * mediaType="application/json", - * ) - * ), - * @OA\Response( - * response=422, - * description="Unprocessable Entity" - * ), - * @OA\Response( - * response=500, - * description="Internal Server Error" - * ) - * ) - * @param Request $request - * @param Response $response - */ - abstract public function signin(Request $request, Response $response); - - /** - * Gets the logged-in user data - * @OA\Get( - * path="/api/me", - * tags={"User"}, - * summary="Gets the logged-in user data", - * operationId="me", - * security={ - * {"bearer_token": {}} - * }, - * @OA\Response( - * response=200, - * description="Success", - * @OA\MediaType( - * mediaType="application/json", - * ) - * ), - * @OA\Response( - * response=401, - * description="Unauthorized Request" - * ), - * @OA\Response( - * response=500, - * description="Internal Server Error" - * ) - * ) - * @param Response $response - */ - abstract public function me(Response $response); - - /** - * Sign out action - * @OA\Get( - * path="/api/signout", - * tags={"Authentication"}, - * summary="Sign out action", - * operationId="signout", - * @OA\Parameter( - * name="refresh_token", - * description="Refresh token", - * required=true, - * in="header", - * @OA\Schema( - * type="string" - * ) - * ), - * @OA\Response( - * response=200, - * description="Success", - * @OA\MediaType( - * mediaType="application/json", - * ) - * ), - * @OA\Response( - * response=422, - * description="Unprocessable Entity" - * ), - * @OA\Response( - * response=401, - * description="Unauthorized Request" - * ), - * @OA\Response( - * response=500, - * description="Internal Server Error" - * ) - * ) - * @param Response $response - */ - abstract public function signout(Response $response); - - /** - * Sign up action - * @OA\Post( - * path="/api/signup", - * tags={"Authentication"}, - * summary="Sign up action", - * operationId="signUpApi", - * @OA\RequestBody( - * @OA\MediaType( - * mediaType="application/json", - * @OA\Schema( - * @OA\Property( - * property="email", - * type="string", - * ), - * @OA\Property( - * property="password", - * type="string" - * ), - * @OA\Property( - * property="firstname", - * type="string", - * ), - * @OA\Property( - * property="lastname", - * type="string", - * ), - * example={"email": "mail@example.com", "password": "password", "firstname": "Jon", "lastname": "Smit"} - * ) - * ) - * ), - * @OA\Response( - * response=200, - * description="Success", - * @OA\MediaType( - * mediaType="application/json", - * ) - * ), - * @OA\Response( - * response=422, - * description="Unprocessable Entity" - * ), - * @OA\Response( - * response=500, - * description="Internal Server Error" - * ) - * ) - * @param Request $request - * @param Response $response - */ - abstract public function signup(Request $request, Response $response); - - /** - * Activate action - * @OA\Get( - * path="/api/activate/{activate_token}", - * tags={"Authentication"}, - * summary="Activate action", - * operationId="activateProfile", - * @OA\Parameter( - * name="activate_token", - * description="Activate token", - * required=true, - * in="path", - * @OA\Schema( - * type="string" - * ) - * ), - * @OA\Response( - * response=200, - * description="Success", - * @OA\MediaType( - * mediaType="application/json", - * ) - * ), - * @OA\Response( - * response=422, - * description="Unprocessable Entity" - * ), - * @OA\Response( - * response=500, - * description="Internal Server Error" - * ) - * ) - * @param Request $request - * @param Response $response - */ - abstract public function activate(Request $request, Response $response); - - /** - * Forget action - * @OA\Post( - * path="/api/forget", - * tags={"Authentication"}, - * summary="Forget action", - * operationId="forgetPassword", - * @OA\RequestBody( - * @OA\MediaType( - * mediaType="application/json", - * @OA\Schema( - * @OA\Property( - * property="username", - * type="string" - * ), - * example={"email": "mail@example.com"} - * ) - * ) - * ), - * @OA\Response( - * response=200, - * description="Success", - * @OA\MediaType( - * mediaType="application/json", - * ) - * ), - * @OA\Response( - * response=422, - * description="Unprocessable Entity" - * ), - * @OA\Response( - * response=500, - * description="Internal Server Error" - * ) - * ) - * @param Request $request - * @param Response $response - */ - abstract public function forget(Request $request, Response $response); - - /** - * Reset action - * @OA\Post( - * path="/api/reset/{reset_token}", - * tags={"Authentication"}, - * summary="Reset action", - * operationId="resetPassword", - * @OA\Parameter( - * name="reset_token", - * description="Reset token", - * required=true, - * in="path", - * @OA\Schema( - * type="string" - * ) - * ), - * @OA\RequestBody( - * @OA\MediaType( - * mediaType="application/json", - * @OA\Schema( - * @OA\Property( - * property="password", - * type="string" - * ), - * @OA\Property( - * property="repeat_password", - * type="string" - * ), - * example={"password": "password", "repeat_password": "password"} - * ) - * ) - * ), - * @OA\Response( - * response=200, - * description="Success", - * @OA\MediaType( - * mediaType="application/json", - * ) - * ), - * @OA\Response( - * response=422, - * description="Unprocessable Entity" - * ), - * @OA\Response( - * response=500, - * description="Internal Server Error" - * ) - * ) - * @param Request $request - * @param Response $response - */ - abstract public function reset(Request $request, Response $response); - - /** - * Verify action - * @OA\Post( - * path="/api/verify", - * tags={"Authentication"}, - * summary="Verify action", - * operationId="accountVerify", - * @OA\RequestBody( - * @OA\MediaType( - * mediaType="application/json", - * @OA\Schema( - * @OA\Property( - * property="otp_code", - * type="string" - * ), - * example={"otp": "123456", "code": "otp_token"} - * ) - * ) - * ), - * @OA\Response( - * response=200, - * description="Success", - * @OA\MediaType( - * mediaType="application/json", - * ) - * ), - * @OA\Response( - * response=422, - * description="Unprocessable Entity" - * ), - * @OA\Response( - * response=500, - * description="Internal Server Error" - * ) - * ) - * @param Request $request - * @param Response $response - */ - abstract public function verify(Request $request, Response $response); - - /** - * Resend action - * @OA\Get( - * path="/api/resend/{otp_token}", - * tags={"Authentication"}, - * summary="Resend action", - * operationId="resendOTP", - * @OA\Parameter( - * name="otp_token", - * description="OTP token", - * required=true, - * in="path", - * @OA\Schema( - * type="string" - * ) - * ), - * @OA\Response( - * response=200, - * description="Success", - * @OA\MediaType( - * mediaType="application/json", - * ) - * ), - * @OA\Response( - * response=422, - * description="Unprocessable Entity" - * ), - * @OA\Response( - * response=500, - * description="Internal Server Error" - * ) - * ) - * @param Response $response - */ - abstract public function resend(Response $response); -} diff --git a/modules/Api/Controllers/Abstracts/OpenApiPostController.php b/modules/Api/Controllers/Abstracts/OpenApiPostController.php deleted file mode 100644 index e130b36..0000000 --- a/modules/Api/Controllers/Abstracts/OpenApiPostController.php +++ /dev/null @@ -1,331 +0,0 @@ - - * @copyright Copyright (c) 2018 Softberg LLC (https://softberg.org) - * @link http://quantum.softberg.org/ - * @since 2.9.0 - */ - -namespace Modules\Api\Controllers\Abstracts; - -use Quantum\Http\Response; -use Quantum\Http\Request; - -/** - * Class OpenApiPostController - * @package Modules\Api - */ -abstract class OpenApiPostController extends ApiController -{ - - /** - * Get posts action - * @OA\Get( - * path="/api/posts", - * tags={"Posts"}, - * summary="Get posts action", - * operationId="posts", - * @OA\Response( - * response=200, - * description="Success", - * @OA\MediaType( - * mediaType="application/json", - * ) - * ), - * @OA\Response( - * response=500, - * description="Internal Server Error" - * ) - * ) - * @param Response $response - */ - abstract public function posts(Response $response); - - /** - * Get post action - * @OA\Get( - * path="/api/post/{id}", - * tags={"Posts"}, - * summary="Get post action", - * operationId="post", - * @OA\Parameter( - * name="id", - * description="Post Id", - * required=true, - * in="path", - * @OA\Schema( - * type="string" - * ) - * ), - * @OA\Response( - * response=200, - * description="Success", - * @OA\MediaType( - * mediaType="application/json", - * ) - * ), - * @OA\Response( - * response=404, - * description="Not Found" - * ), - * @OA\Response( - * response=500, - * description="Internal Server Error" - * ) - * ) - * @param string|null $lang - * @param string $postId - * @param Response $response - */ - abstract public function post(?string $lang, string $postId, Response $response); - - /** - * Get my posts action - * @OA\Get( - * path="/api/my-posts", - * tags={"Posts"}, - * summary="Get my posts action", - * operationId="myPosts", - * security={ - * {"bearer_token": {}} - * }, - * @OA\Response( - * response=200, - * description="Success", - * @OA\MediaType( - * mediaType="application/json", - * ) - * ), - * @OA\Response( - * response=401, - * description="Unauthorized Request" - * ), - * @OA\Response( - * response=500, - * description="Internal Server Error" - * ) - * ) - * @param Response $response - */ - abstract public function myPosts(Response $response); - - /** - * Create post action - * @OA\Post( - * path="/api/my-posts/create", - * tags={"Posts"}, - * summary="Create post action", - * operationId="create", - * security={ - * {"bearer_token": {} - * }}, - * @OA\RequestBody( - * @OA\MediaType( - * mediaType="multipart/form-data", - * @OA\Schema( - * type="object", - * required={"title", "content"}, - * @OA\Property( - * property="title", - * type="string", - * ), - * @OA\Property( - * property="content", - * type="string", - * ), - * @OA\Property( - * property="image", - * type="file", - * ) - * ) - * ) - * ), - * @OA\Response( - * response=200, - * description="Success", - * @OA\MediaType( - * mediaType="application/json", - * ) - * ), - * @OA\Response( - * response=401, - * description="Unauthorized Request" - * ), - * @OA\Response( - * response=422, - * description="Unprocessable Entity" - * ), - * @OA\Response( - * response=500, - * description="Internal Server Error" - * ) - * ) - * @param Request $request - * @param Response $response - */ - abstract public function create(Request $request, Response $response); - - /** - * Amend post action - * @OA\Put( - * path="/api/my-posts/amend/{id}", - * tags={"Posts"}, - * summary="Amend post action", - * operationId="amend", - * security={ - * {"bearer_token": {} - * }}, - * @OA\Parameter( - * name="id", - * description="Post id", - * required=true, - * in="path", - * @OA\Schema( - * type="string" - * ) - * ), - * @OA\RequestBody( - * @OA\MediaType( - * mediaType="multipart/form-data", - * @OA\Schema( - * type="object", - * required={"title", "content"}, - * @OA\Property( - * property="title", - * type="string", - * ), - * @OA\Property( - * property="content", - * type="string", - * ), - * @OA\Property( - * property="image", - * type="file", - * ) - * ) - * ) - * ), - * @OA\Response( - * response=200, - * description="Success", - * @OA\MediaType( - * mediaType="application/json", - * ) - * ), - * @OA\Response( - * response=401, - * description="Unauthorized Request" - * ), - * @OA\Response( - * response=422, - * description="Unprocessable Entity" - * ), - * @OA\Response( - * response=500, - * description="Internal Server Error" - * ) - * ) - * @param Request $request - * @param Response $response - * @param string|null $lang - * @param string $postId - */ - abstract public function amend(Request $request, Response $response, ?string $lang, string $postId); - - /** - * Delete post action - * @OA\Delete( - * path="/api/my-posts/delete/{id}", - * tags={"Posts"}, - * summary="Delete post action", - * operationId="delete", - * security={ - * {"bearer_token": {}} - * }, - * @OA\Parameter( - * name="id", - * description="Post id", - * required=true, - * in="path", - * @OA\Schema( - * type="string" - * ) - * ), - * @OA\Response( - * response=200, - * description="Success", - * @OA\MediaType( - * mediaType="application/json", - * ) - * ), - * @OA\Response( - * response=401, - * description="Unauthorized Request" - * ), - * @OA\Response( - * response=422, - * description="Unprocessable Entity" - * ), - * @OA\Response( - * response=500, - * description="Internal Server Error" - * ) - * ) - * @param Response $response - * @param string|null $lang - * @param string $postId - */ - abstract public function delete(Response $response, ?string $lang, string $postId); - - /** - * Delete post image action - * @OA\Delete( - * path="/api/my-posts/delete-image/{id}", - * tags={"Posts"}, - * summary="Delete post image action", - * operationId="deleteImage", - * security={ - * {"bearer_token": {} - * }}, - * @OA\Parameter( - * name="id", - * description="Post id", - * required=true, - * in="path", - * @OA\Schema( - * type="string" - * ) - * ), - * @OA\Response( - * response=200, - * description="Success", - * @OA\MediaType( - * mediaType="application/json", - * ) - * ), - * @OA\Response( - * response=401, - * description="Unauthorized Request" - * ), - * @OA\Response( - * response=422, - * description="Unprocessable Entity" - * ), - * @OA\Response( - * response=500, - * description="Internal Server Error" - * ) - * ) - * @param Response $response - * @param string|null $lang - * @param string $postId - */ - abstract public function deleteImage(Response $response, ?string $lang, string $postId); - -} diff --git a/modules/Api/Controllers/AuthController.php b/modules/Api/Controllers/AuthController.php deleted file mode 100644 index 3af2401..0000000 --- a/modules/Api/Controllers/AuthController.php +++ /dev/null @@ -1,171 +0,0 @@ - - * @copyright Copyright (c) 2018 Softberg LLC (https://softberg.org) - * @link http://quantum.softberg.org/ - * @since 2.9.0 - */ - -namespace Modules\Api\Controllers; - -use Modules\Api\Controllers\Abstracts\OpenApiAuthController; -use Quantum\Exceptions\AuthException; -use Quantum\Http\Response; -use Quantum\Http\Request; - -/** - * Class AuthController - * @package Modules\Api - */ -class AuthController extends OpenApiAuthController -{ - - /** - * @inheritDoc - */ - public function signin(Request $request, Response $response) - { - try { - $code = auth()->signin($request->get('email'), $request->get('password')); - - if (filter_var(config()->get('2FA'), FILTER_VALIDATE_BOOLEAN)) { - $response->set('code', $code); - } - - $response->json([ - 'status' => self::STATUS_SUCCESS - ]); - } catch (AuthException $e) { - $response->json([ - 'status' => self::STATUS_ERROR, - 'message' => $e->getMessage() - ], 422); - } - } - - /** - * @inheritDoc - */ - public function me(Response $response) - { - $response->json([ - 'status' => self::STATUS_SUCCESS, - 'data' => [ - 'firstname' => auth()->user()->firstname, - 'lastname' => auth()->user()->lastname, - 'email' => auth()->user()->email - ] - ]); - } - - /** - * @inheritDoc - */ - public function signout(Response $response) - { - if (auth()->signout()) { - $response->json([ - 'status' => self::STATUS_SUCCESS - ]); - } else { - $response->json([ - 'status' => self::STATUS_ERROR, - 'message' => t('validation.unauthorizedRequest') - ]); - } - } - - /** - * @inheritDoc - */ - public function signup(Request $request, Response $response) - { - auth()->signup($request->all()); - - $response->json([ - 'status' => self::STATUS_SUCCESS, - 'message' => t('common.successfully_signed_up') - ]); - } - - /** - * @inheritDoc - */ - public function activate(Request $request, Response $response) - { - auth()->activate($request->get('activation_token')); - - $response->json([ - 'status' => self::STATUS_SUCCESS, - 'message' => t('common.account_activated') - ]); - } - - /** - * @inheritDoc - */ - public function forget(Request $request, Response $response) - { - auth()->forget($request->get('email')); - - $response->json([ - 'status' => self::STATUS_SUCCESS, - 'message' => t('common.check_email') - ]); - } - - /** - * @inheritDoc - */ - public function reset(Request $request, Response $response) - { - auth()->reset($request->get('reset_token'), $request->get('password')); - - $response->json([ - 'status' => self::STATUS_SUCCESS - ]); - } - - /** - * @inheritDoc - */ - public function verify(Request $request, Response $response) - { - try { - auth()->verifyOtp((int)$request->get('otp'), $request->get('code')); - - $response->json([ - 'status' => self::STATUS_SUCCESS - ]); - } catch (AuthException $e) { - $response->json([ - 'status' => self::STATUS_ERROR, - 'message' => $e->getMessage() - ]); - } - } - - /** - * @inheritDoc - */ - public function resend(Response $response) - { - try { - $response->json([ - 'status' => self::STATUS_SUCCESS, - 'code' => auth()->resendOtp(route_param('code')) - ]); - } catch (AuthException $e) { - $response->json([ - 'status' => self::STATUS_ERROR, - 'message' => $e->getMessage() - ]); - } - } -} diff --git a/modules/Api/Controllers/PostController.php b/modules/Api/Controllers/PostController.php deleted file mode 100644 index da00650..0000000 --- a/modules/Api/Controllers/PostController.php +++ /dev/null @@ -1,185 +0,0 @@ - - * @copyright Copyright (c) 2018 Softberg LLC (https://softberg.org) - * @link http://quantum.softberg.org/ - * @since 2.9.0 - */ - -namespace Modules\Api\Controllers; - -use Modules\Api\Controllers\Abstracts\OpenApiPostController; -use Quantum\Factory\ServiceFactory; -use Shared\Services\PostService; -use Quantum\Http\Response; -use Quantum\Http\Request; - -/** - * Class PostController - * @package Modules\Api - */ -class PostController extends OpenApiPostController -{ - - /** - * Post service - * @var PostService - */ - public $postService; - - /** - * Works before an action - */ - public function __before() - { - $this->postService = ServiceFactory::get(PostService::class); - } - - /** - * @inheritDoc - */ - public function posts(Response $response) - { - $response->json([ - 'status' => 'success', - 'data' => $this->postService->getPosts() - ]); - } - - /** - * @inheritDoc - */ - public function post(?string $lang, string $postId, Response $response) - { - $response->json([ - 'status' => 'success', - 'data' => $this->postService->getPost($postId) - ]); - } - - /** - * @inheritDoc - */ - public function myPosts(Response $response) - { - $response->json([ - 'status' => 'success', - 'data' => $this->postService->getMyPosts((int)auth()->user()->id) - ]); - } - - /** - * @inheritDoc - */ - public function create(Request $request, Response $response) - { - $postData = [ - 'user_id' => (int)auth()->user()->id, - 'title' => $request->get('title', null, true), - 'content' => $request->get('content', null, true), - 'image' => '', - 'updated_at' => date('Y-m-d H:i:s'), - ]; - - if ($request->hasFile('image')) { - $imageName = $this->postService->saveImage( - $request->getFile('image'), - auth()->user()->uuid, - slugify($request->get('title')) - ); - - $postData['image'] = $imageName; - } - - $this->postService->addPost($postData); - - $response->json([ - 'status' => 'success', - 'message' => t('common.created_successfully') - ]); - } - - /** - * @inheritDoc - */ - public function amend(Request $request, Response $response, ?string $lang, string $postId) - { - $postData = [ - 'title' => $request->get('title', null, true), - 'content' => $request->get('content', null, true), - 'updated_at' => date('Y-m-d H:i:s'), - ]; - - $post = $this->postService->getPost($postId, false); - - if ($request->hasFile('image')) { - if ($post['image']) { - $this->postService->deleteImage(auth()->user()->uuid . DS . $post['image']); - } - - $imageName = $this->postService->saveImage( - $request->getFile('image'), - auth()->user()->uuid, - slugify($request->get('title')) - ); - - $postData['image'] = $imageName; - } - - $this->postService->updatePost($postId, $postData); - - $response->json([ - 'status' => 'success', - 'message' => t('common.updated_successfully') - ]); - } - - /** - * @inheritDoc - */ - public function delete(Response $response, ?string $lang, string $postId) - { - $post = $this->postService->getPost($postId, false); - - if ($post['image']) { - $this->postService->deleteImage(auth()->user()->uuid . DS . $post['image']); - } - - $this->postService->deletePost($postId); - - $response->json([ - 'status' => 'success', - 'message' => t('common.deleted_successfully') - ]); - } - - /** - * @inheritDoc - */ - public function deleteImage(Response $response, ?string $lang, string $postId) - { - $post = $this->postService->getPost($postId, false); - - if ($post['image']) { - $this->postService->deleteImage(auth()->user()->uuid . DS . $post['image']); - } - - $this->postService->updatePost($postId, [ - 'title' => $post['title'], - 'content' => $post['content'], - 'image' => '', - 'updated_at' => date('Y-m-d H:i:s'), - ]); - - $response->json([ - 'status' => 'success', - 'message' => t('common.deleted_successfully') - ]); - } -} diff --git a/modules/Api/Middlewares/Activate.php b/modules/Api/Middlewares/Activate.php deleted file mode 100644 index bd2348e..0000000 --- a/modules/Api/Middlewares/Activate.php +++ /dev/null @@ -1,66 +0,0 @@ - - * @copyright Copyright (c) 2018 Softberg LLC (https://softberg.org) - * @link http://quantum.softberg.org/ - * @since 2.9.0 - */ - -namespace Modules\Api\Middlewares; - -use Quantum\Middleware\QtMiddleware; -use Quantum\Factory\ModelFactory; -use Quantum\Http\Response; -use Quantum\Http\Request; -use Shared\Models\User; -use Closure; - -/** - * Class Activate - * @package Modules\Api - */ -class Activate extends QtMiddleware -{ - - /** - * @param Request $request - * @param Response $response - * @param Closure $next - * @return mixed - */ - public function apply(Request $request, Response $response, Closure $next) - { - $token = route_param('token'); - - if (!$token || !$this->checkToken($token)) { - $response->json([ - 'status' => 'error', - 'message' => [t('validation.nonExistingRecord', 'token')] - ], 422); - - stop(); - } - - $request->set('activation_token', $token); - - return $next($request, $response); - } - - /** - * Check token - * @param string $token - * @return bool - */ - private function checkToken(string $token): bool - { - $userModel = ModelFactory::get(User::class); - return !empty($userModel->findOneBy('activation_token', $token)->asArray()); - } - -} diff --git a/modules/Api/Middlewares/Auth.php b/modules/Api/Middlewares/Auth.php deleted file mode 100644 index 861a482..0000000 --- a/modules/Api/Middlewares/Auth.php +++ /dev/null @@ -1,49 +0,0 @@ - - * @copyright Copyright (c) 2018 Softberg LLC (https://softberg.org) - * @link http://quantum.softberg.org/ - * @since 2.9.0 - */ - -namespace Modules\Api\Middlewares; - -use Quantum\Middleware\QtMiddleware; -use Quantum\Http\Response; -use Quantum\Http\Request; -use Closure; - -/** - * Class Auth - * @package Modules\Api - */ -class Auth extends QtMiddleware -{ - - /** - * @param Request $request - * @param Response $response - * @param Closure $next - * @return mixed - */ - public function apply(Request $request, Response $response, Closure $next) - { - if (!auth()->check()) { - $response->json([ - 'status' => 'error', - 'message' => t('validation.unauthorizedRequest') - ], 401); - - stop(); - } - - return $next($request, $response); - } - -} diff --git a/modules/Api/Middlewares/Editor.php b/modules/Api/Middlewares/Editor.php deleted file mode 100644 index fbc890e..0000000 --- a/modules/Api/Middlewares/Editor.php +++ /dev/null @@ -1,103 +0,0 @@ - - * @copyright Copyright (c) 2018 Softberg LLC (https://softberg.org) - * @link http://quantum.softberg.org/ - * @since 2.9.0 - */ - -namespace Modules\Api\Middlewares; - -use Quantum\Libraries\Validation\Validator; -use Quantum\Libraries\Validation\Rule; -use Quantum\Middleware\QtMiddleware; -use Quantum\Http\Response; -use Quantum\Http\Request; -use Closure; - -/** - * Class Editor - * @package Modules\Api - */ -class Editor extends QtMiddleware -{ - - /** - * Roles - */ - const ROLES = ['admin', 'editor']; - - /** - * @var Validator - */ - private $validator; - - /** - * Class constructor - * @param Request $request - */ - public function __construct(Request $request) - { - $this->validator = new Validator(); - - if ($request->hasFile('image')) { - $this->validator->addRules([ - 'image' => [ - Rule::set('fileSize', 2 * pow(1024, 2)), - Rule::set('fileExtension', ['jpeg', 'jpg', 'png']), - ] - ]); - } - - $this->validator->addRules([ - 'title' => [ - Rule::set('required'), - Rule::set('minLen', 10), - Rule::set('maxLen', 50), - ], - 'content' => [ - Rule::set('required'), - Rule::set('minLen', 10), - Rule::set('maxLen', 1000), - ] - ]); - } - - /** - * @param Request $request - * @param Response $response - * @param Closure $next - * @return mixed - */ - public function apply(Request $request, Response $response, Closure $next) - { - if (!in_array(auth()->user()->role, self::ROLES)) { - $response->json([ - 'status' => 'error', - 'message' => t('validation.unauthorizedRequest') - ], 401); - - stop(); - } - - if ($request->isMethod('post') || $request->isMethod('put')) { - if (!$this->validator->isValid($request->all())) { - $response->json([ - 'status' => 'error', - 'message' => $this->validator->getErrors() - ], 422); - - stop(); - } - } - - return $next($request, $response); - } - -} diff --git a/modules/Api/Middlewares/Forget.php b/modules/Api/Middlewares/Forget.php deleted file mode 100644 index af302cd..0000000 --- a/modules/Api/Middlewares/Forget.php +++ /dev/null @@ -1,93 +0,0 @@ - - * @copyright Copyright (c) 2018 Softberg LLC (https://softberg.org) - * @link http://quantum.softberg.org/ - * @since 2.9.0 - */ - -namespace Modules\Api\Middlewares; - -use Quantum\Libraries\Validation\Validator; -use Quantum\Libraries\Validation\Rule; -use Quantum\Middleware\QtMiddleware; -use Quantum\Factory\ModelFactory; -use Quantum\Http\Response; -use Quantum\Http\Request; -use Shared\Models\User; -use Closure; - -/** - * Class Forget - * @package Modules\Api - */ -class Forget extends QtMiddleware -{ - - /** - * @var Validator - */ - private $validator; - - /** - * Class constructor - */ - public function __construct() - { - $this->validator = new Validator(); - - $this->validator->addRule('email', [ - Rule::set('required'), - Rule::set('email') - ]); - } - - /** - * @param Request $request - * @param Response $response - * @param Closure $next - * @return mixed - */ - public function apply(Request $request, Response $response, Closure $next) - { - if ($request->isMethod('post')) { - if (!$this->validator->isValid($request->all())) { - $response->json([ - 'status' => 'error', - 'message' => $this->validator->getErrors() - ], 422); - - stop(); - } - - if (!$this->emailExists($request->get('email'))) { - $response->json([ - 'status' => 'error', - 'message' => [t('validation.nonExistingRecord', $request->get('email'))] - ], 422); - - stop(); - } - } - - return $next($request, $response); - } - - /** - * Check for email existence - * @param string $email - * @return bool - */ - private function emailExists(string $email): bool - { - $userModel = ModelFactory::get(User::class); - return !empty($userModel->findOneBy('email', $email)->asArray()); - } - -} diff --git a/modules/Api/Middlewares/Owner.php b/modules/Api/Middlewares/Owner.php deleted file mode 100644 index 2bbf1df..0000000 --- a/modules/Api/Middlewares/Owner.php +++ /dev/null @@ -1,55 +0,0 @@ - - * @copyright Copyright (c) 2018 Softberg LLC (https://softberg.org) - * @link http://quantum.softberg.org/ - * @since 2.9.0 - */ - -namespace Modules\Api\Middlewares; - -use Quantum\Middleware\QtMiddleware; -use Quantum\Factory\ServiceFactory; -use Shared\Services\PostService; -use Quantum\Http\Response; -use Quantum\Http\Request; -use Closure; - -/** - * Class Owner - * @package Modules\Api - */ -class Owner extends QtMiddleware -{ - - /** - * @param Request $request - * @param Response $response - * @param Closure $next - * @return mixed - */ - public function apply(Request $request, Response $response, Closure $next) - { - $postId = (string)route_param('id'); - - $post = ServiceFactory::get(PostService::class)->getPost($postId, false); - - if (!$post || $post['user_id'] != auth()->user()->id) { - $response->json([ - 'status' => 'error', - 'message' => t('common.post_not_found') - ], 404); - - stop(); - } - - return $next($request, $response); - } - -} diff --git a/modules/Api/Middlewares/Post.php b/modules/Api/Middlewares/Post.php deleted file mode 100644 index 26087ec..0000000 --- a/modules/Api/Middlewares/Post.php +++ /dev/null @@ -1,55 +0,0 @@ - - * @copyright Copyright (c) 2018 Softberg LLC (https://softberg.org) - * @link http://quantum.softberg.org/ - * @since 2.9.0 - */ - -namespace Modules\Api\Middlewares; - -use Quantum\Middleware\QtMiddleware; -use Quantum\Factory\ServiceFactory; -use Shared\Services\PostService; -use Quantum\Http\Response; -use Quantum\Http\Request; -use Closure; - -/** - * Class Post - * @package Modules\Api - */ -class Post extends QtMiddleware -{ - - /** - * @param Request $request - * @param Response $response - * @param Closure $next - * @return mixed - */ - public function apply(Request $request, Response $response, Closure $next) - { - $postId = (string)route_param('id'); - - $post = ServiceFactory::get(PostService::class)->getPost($postId, false); - - if (!$post) { - $response->json([ - 'status' => 'error', - 'message' => t('common.post_not_found') - ], 404); - - stop(); - } - - return $next($request, $response); - } - -} diff --git a/modules/Api/Middlewares/Resend.php b/modules/Api/Middlewares/Resend.php deleted file mode 100644 index 209e441..0000000 --- a/modules/Api/Middlewares/Resend.php +++ /dev/null @@ -1,49 +0,0 @@ - - * @copyright Copyright (c) 2018 Softberg LLC (https://softberg.org) - * @link http://quantum.softberg.org/ - * @since 2.9.0 - */ - -namespace Modules\Api\Middlewares; - -use Quantum\Middleware\QtMiddleware; -use Quantum\Http\Response; -use Quantum\Http\Request; -use Closure; - -/** - * Class Resend - * @package Modules\Api - */ -class Resend extends QtMiddleware -{ - - /** - * @param Request $request - * @param Response $response - * @param Closure $next - * @return mixed - */ - public function apply(Request $request, Response $response, Closure $next) - { - if (!route_param('code')) { - $response->json([ - 'status' => 'error', - 'message' => t('validation.required', 'code') - ], 422); - - stop(); - } - - return $next($request, $response); - } - -} diff --git a/modules/Api/Middlewares/Reset.php b/modules/Api/Middlewares/Reset.php deleted file mode 100644 index 817dab5..0000000 --- a/modules/Api/Middlewares/Reset.php +++ /dev/null @@ -1,121 +0,0 @@ - - * @copyright Copyright (c) 2018 Softberg LLC (https://softberg.org) - * @link http://quantum.softberg.org/ - * @since 2.9.0 - */ - -namespace Modules\Api\Middlewares; - -use Quantum\Libraries\Validation\Validator; -use Quantum\Libraries\Validation\Rule; -use Quantum\Middleware\QtMiddleware; -use Quantum\Factory\ModelFactory; -use Quantum\Http\Response; -use Quantum\Http\Request; -use Shared\Models\User; -use Closure; - -/** - * Class Reset - * @package Modules\Api - */ -class Reset extends QtMiddleware -{ - - /** - * @var Validator - */ - private $validator; - - /** - * Class constructor - */ - public function __construct() - { - $this->validator = new Validator(); - - $this->validator->addRules([ - 'password' => [ - Rule::set('required'), - Rule::set('minLen', 6) - ], - 'repeat_password' => [ - Rule::set('required'), - Rule::set('minLen', 6) - ] - ]); - } - - /** - * @param Request $request - * @param Response $response - * @param Closure $next - * @return mixed - */ - public function apply(Request $request, Response $response, Closure $next) - { - $token = route_param('token'); - - if (!$token || !$this->checkToken($token)) { - $response->json([ - 'status' => 'error', - 'message' => [t('validation.nonExistingRecord', 'token')] - ], 422); - - stop(); - } - - if (!$this->validator->isValid($request->all())) { - $response->json([ - 'status' => 'error', - 'message' => $this->validator->getErrors() - ], 422); - - stop(); - } - - if (!$this->confirmPassword($request->get('password'), $request->get('repeat_password'))) { - $response->json([ - 'status' => 'error', - 'message' => t('validation.nonEqualValues') - ], 422); - - stop(); - } - - $request->set('reset_token', $token); - - return $next($request, $response); - } - - /** - * Check token - * @param string $token - * @return bool - */ - private function checkToken(string $token): bool - { - $userModel = ModelFactory::get(User::class); - return !empty($userModel->findOneBy('reset_token', $token)->asArray()); - } - - /** - * Checks the password and repeat password - * @param string $newPassword - * @param string $repeatPassword - * @return bool - */ - private function confirmPassword(string $newPassword, string $repeatPassword): bool - { - return $newPassword == $repeatPassword; - } - -} diff --git a/modules/Api/Middlewares/Signout.php b/modules/Api/Middlewares/Signout.php deleted file mode 100644 index 92740a2..0000000 --- a/modules/Api/Middlewares/Signout.php +++ /dev/null @@ -1,48 +0,0 @@ - - * @copyright Copyright (c) 2018 Softberg LLC (https://softberg.org) - * @link http://quantum.softberg.org/ - * @since 2.9.0 - */ -namespace Modules\Api\Middlewares; - -use Quantum\Middleware\QtMiddleware; -use Quantum\Http\Response; -use Quantum\Http\Request; -use Closure; - -/** - * Class Signout - * @package Modules\Api - */ -class Signout extends QtMiddleware -{ - - /** - * @param Request $request - * @param Response $response - * @param Closure $next - * @return mixed - */ - public function apply(Request $request, Response $response, Closure $next) - { - if (!Request::hasHeader('refresh_token')) { - $response->json([ - 'status' => 'error', - 'message' => [t('validation.nonExistingRecord', 'token')] - ], 422); - - stop(); - } - - return $next($request, $response); - } - -} diff --git a/modules/Api/Middlewares/Signup.php b/modules/Api/Middlewares/Signup.php deleted file mode 100644 index dc9649e..0000000 --- a/modules/Api/Middlewares/Signup.php +++ /dev/null @@ -1,89 +0,0 @@ - - * @copyright Copyright (c) 2018 Softberg LLC (https://softberg.org) - * @link http://quantum.softberg.org/ - * @since 2.9.0 - */ - -namespace Modules\Api\Middlewares; - -use Quantum\Libraries\Validation\Validator; -use Quantum\Libraries\Validation\Rule; -use Quantum\Middleware\QtMiddleware; -use Quantum\Factory\ModelFactory; -use Quantum\Http\Response; -use Quantum\Http\Request; -use Shared\Models\User; -use Closure; - -/** - * Class Signup - * @package Modules\Api - */ -class Signup extends QtMiddleware -{ - - /** - * @var Validator - */ - private $validator; - - /** - * Class constructor - */ - public function __construct() - { - $this->validator = new Validator(); - - $this->validator->addValidation('uniqueUser', function ($value) { - $userModel = ModelFactory::get(User::class); - return empty($userModel->findOneBy('email', $value)->asArray()); - }); - - $this->validator->addRules([ - 'email' => [ - Rule::set('required'), - Rule::set('email'), - Rule::set('uniqueUser') - ], - 'password' => [ - Rule::set('required'), - Rule::set('minLen', 6) - ], - 'firstname' => [ - Rule::set('required') - ], - 'lastname' => [ - Rule::set('required') - ], - ]); - } - - /** - * @param Request $request - * @param Response $response - * @param Closure $next - * @return mixed - */ - public function apply(Request $request, Response $response, Closure $next) - { - if (!$this->validator->isValid($request->all())) { - $response->json([ - 'status' => 'error', - 'message' => $this->validator->getErrors() - ], 422); - - stop(); - } - - return $next($request, $response); - } - -} diff --git a/modules/Api/Middlewares/Verify.php b/modules/Api/Middlewares/Verify.php deleted file mode 100644 index ec46b36..0000000 --- a/modules/Api/Middlewares/Verify.php +++ /dev/null @@ -1,76 +0,0 @@ - - * @copyright Copyright (c) 2018 Softberg LLC (https://softberg.org) - * @link http://quantum.softberg.org/ - * @since 2.9.0 - */ - -namespace Modules\Api\Middlewares; - -use Quantum\Libraries\Validation\Validator; -use Quantum\Libraries\Validation\Rule; -use Quantum\Middleware\QtMiddleware; -use Quantum\Http\Response; -use Quantum\Http\Request; -use Closure; - -/** - * Class Verify - * @package Modules\Api - */ - -class Verify extends QtMiddleware -{ - - /** - * @var Validator - */ - private $validator; - - /** - * Class constructor - */ - public function __construct() - { - $this->validator = new Validator(); - - $this->validator->addRules([ - 'otp' => [ - Rule::set('required') - ], - 'code' => [ - Rule::set('required') - ], - ]); - } - - /** - * @param Request $request - * @param Response $response - * @param Closure $next - * @return mixed - */ - public function apply(Request $request, Response $response, Closure $next) - { - if ($request->isMethod('post')) { - if (!$this->validator->isValid($request->all())) { - - $response->json([ - 'status' => 'error', - 'message' => $this->validator->getErrors() - ], 422); - - stop(); - } - } - - return $next($request, $response); - } - -} \ No newline at end of file diff --git a/modules/Api/Models/.gitkeep b/modules/Api/Models/.gitkeep deleted file mode 100644 index 256c7f2..0000000 --- a/modules/Api/Models/.gitkeep +++ /dev/null @@ -1 +0,0 @@ -#qt diff --git a/modules/Api/Resources/.gitkeep b/modules/Api/Resources/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/modules/Api/Services/.gitkeep b/modules/Api/Services/.gitkeep deleted file mode 100644 index 256c7f2..0000000 --- a/modules/Api/Services/.gitkeep +++ /dev/null @@ -1 +0,0 @@ -#qt diff --git a/modules/Web/Config/auth.php b/modules/Web/Config/auth.php deleted file mode 100644 index 9695b64..0000000 --- a/modules/Web/Config/auth.php +++ /dev/null @@ -1,14 +0,0 @@ - 'web', - 'service' => Shared\Services\AuthService::class -]; diff --git a/modules/Web/Config/database.php b/modules/Web/Config/database.php deleted file mode 100644 index 9c47018..0000000 --- a/modules/Web/Config/database.php +++ /dev/null @@ -1,52 +0,0 @@ - 'sleekdb', - - /** - * --------------------------------------------------------- - * Database Connections - * --------------------------------------------------------- - * - * You can define as many database configurations as you want. - * - * driver : mysql, pgsql, sqlite - * host : The database server (localhost) - * dbname : The database name - * username : Username of the database server - * password : Password of the database server - * charset : Default charset - */ - 'mysql' => array( - 'driver' => env("DB_DRIVER", "mysql"), - 'host' => env("DB_HOST", "localhost"), - 'dbname' => env("DB_NAME"), - 'username' => env("DB_USERNAME", "root"), - 'password' => env("DB_PASSWORD"), - 'charset' => env("DB_CHARSET", 'utf8'), - 'orm' => \Quantum\Libraries\Database\Idiorm\IdiormDbal::class - ), - 'sleekdb' => [ - 'driver' => 'sleekdb', - 'config' => [ - 'auto_cache' => false, - 'cache_lifetime' => null, - 'timeout' => false, - 'search' => [ - 'min_length' => 2, - 'mode' => 'or', - 'score_key' => 'scoreKey', - 'algorithm' => 1 - ], - ], - 'database_dir' => base_dir() . DS . 'shared' . DS . 'store', - 'orm' => \Quantum\Libraries\Database\Sleekdb\SleekDbal::class - ], -]; diff --git a/modules/Web/Config/routes.php b/modules/Web/Config/routes.php deleted file mode 100644 index 061feb1..0000000 --- a/modules/Web/Config/routes.php +++ /dev/null @@ -1,59 +0,0 @@ -get('[:alpha:2]?', function (Response $response, ViewFactory $view) { - $view->setLayout('layouts/main'); - - $view->setParams([ - 'title' => config()->get('app_name'), - 'langs' => config()->get('langs') - ]); - - $response->html($view->render('index')); - })->name('home'); - - $route->get('[:alpha:2]?/about', function (Response $response, ViewFactory $view) { - $view->setLayout('layouts/main'); - - $view->setParams([ - 'title' => t('common.about') . ' | ' . config()->get('app_name'), - 'langs' => config()->get('langs') - ]); - - $response->html($view->render('about')); - })->name('about'); - - $route->get('/auth', 'DropboxController', 'auth'); - $route->get('/confirm', 'DropboxController', 'confirm'); - $route->get('/test', 'DropboxController', 'test'); - $route->get('/image/[:any]', 'DropboxController', 'image'); - $route->get('/upload', 'DropboxController', 'upload'); - $route->get('/list', 'DropboxController', 'list'); - - $route->get('[:alpha:2]?/posts', 'PostController', 'posts'); - $route->get('[:alpha:2]?/post/[id=:any]', 'PostController', 'post')->middlewares(['Post']); - - $route->group('guest', function ($route) { - $route->add('[:alpha:2]?/signin', 'GET|POST', 'AuthController', 'signin')->name('signin'); - $route->add('[:alpha:2]?/signup', 'GET|POST', 'AuthController', 'signup')->middlewares(['Signup'])->name('signup'); - $route->get('[:alpha:2]?/activate/[token=:any]', 'AuthController', 'activate')->middlewares(['Activate']); - $route->add('[:alpha:2]?/forget', 'GET|POST', 'AuthController', 'forget')->middlewares(['Forget']); - $route->add('[:alpha:2]?/reset/[token=:any]', 'GET|POST', 'AuthController', 'reset')->middlewares(['Reset']); - $route->get('[:alpha:2]?/resend/[code=:any]', 'AuthController', 'resend')->middlewares(['Resend']); - $route->add('[:alpha:2]?/verify/[code=:any]?', 'GET|POST', 'AuthController', 'verify')->middlewares(['Verify']); - })->middlewares(['Guest']); - - $route->group('auth', function ($route) { - $route->get('[:alpha:2]?/signout', 'AuthController', 'signout'); - $route->get('[:alpha:2]?/my-posts', 'PostController', 'myPosts')->middlewares(['Editor']); - $route->get('[:alpha:2]?/my-posts/create', 'PostController', 'createFrom')->middlewares(['Editor']); - $route->post('[:alpha:2]?/my-posts/create', 'PostController', 'create')->middlewares(['Editor']); - $route->get('[:alpha:2]?/my-posts/amend/[id=:any]', 'PostController', 'amendForm')->middlewares(['Editor', 'Owner']); - $route->post('[:alpha:2]?/my-posts/amend/[id=:any]', 'PostController', 'amend')->middlewares(['Editor', 'Owner']); - $route->get('[:alpha:2]?/my-posts/delete/[id=:any]', 'PostController', 'delete')->middlewares(['Editor', 'Owner']); - $route->get('[:alpha:2]?/my-posts/delete-image/[id=:any]', 'PostController', 'deleteImage')->middlewares(['Editor', 'Owner']); - })->middlewares(['Auth']); -}; diff --git a/modules/Web/Controllers/AuthController.php b/modules/Web/Controllers/AuthController.php deleted file mode 100644 index 1a44d56..0000000 --- a/modules/Web/Controllers/AuthController.php +++ /dev/null @@ -1,224 +0,0 @@ - - * @copyright Copyright (c) 2018 Softberg LLC (https://softberg.org) - * @link http://quantum.softberg.org/ - * @since 2.9.0 - */ - -namespace Modules\Web\Controllers; - -use Quantum\Exceptions\AuthException; -use Quantum\Factory\ViewFactory; -use Quantum\Mvc\QtController; -use Quantum\Http\Response; -use Quantum\Http\Request; - -/** - * Class AuthController - * @package Modules\Web\Controllers - */ -class AuthController extends QtController -{ - - /** - * Auth layout - */ - const LAYOUT = 'layouts/main'; - - /** - * Signin view - */ - const VIEW_SIGNIN = 'auth/signin'; - - /** - * Signup view - */ - const VIEW_SIGNUP = 'auth/signup'; - - /** - * Forget view - */ - const VIEW_FORGET = 'auth/forget'; - - /** - * Reset view - */ - const VIEW_RESET = 'auth/reset'; - - /** - * Reset view - */ - const VIEW_VERIFY = 'auth/verify'; - - /** - * Magic __before - * @param ViewFactory $view - */ - public function __before(ViewFactory $view) - { - $view->setLayout(self::LAYOUT); - } - - /** - * Sign in action - * @param Request $request - * @param Response $response - * @param ViewFactory $view - */ - public function signin(Request $request, Response $response, ViewFactory $view) - { - if ($request->isMethod('post')) { - try { - $code = auth()->signin($request->get('email'), $request->get('password'), !!$request->get('remember')); - - if (filter_var(config()->get('2FA'), FILTER_VALIDATE_BOOLEAN)) { - redirect(base_url(true) . '/' . current_lang() . '/verify/' . $code); - } else { - redirect(base_url(true) . '/' . current_lang()); - } - } catch (AuthException $e) { - session()->setFlash('error', $e->getMessage()); - redirect(base_url(true) . '/' . current_lang() . '/signin'); - } - } else { - $view->setParams([ - 'title' => t('common.signin') . ' | ' . config()->get('app_name'), - 'langs' => config()->get('langs') - ]); - - $response->html($view->render(self::VIEW_SIGNIN)); - } - } - - /** - * Sign out action - */ - public function signout() - { - auth()->signout(); - redirect(base_url(true) . '/' . current_lang()); - } - - /** - * Sign up action - * @param Request $request - * @param Response $response - * @param ViewFactory $view - */ - public function signup(Request $request, Response $response, ViewFactory $view) - { - if ($request->isMethod('post')) { - auth()->signup($request->all()); - session()->setFlash('success', t('common.check_email_signup')); - redirect(base_url(true) . '/' . current_lang() . '/signup'); - } else { - $view->setParams([ - 'title' => t('common.signup') . ' | ' . config()->get('app_name'), - 'langs' => config()->get('langs') - ]); - - $response->html($view->render(self::VIEW_SIGNUP)); - } - } - - /** - * Activate action - * @param Request $request - */ - public function activate(Request $request) - { - auth()->activate($request->get('activation_token')); - redirect(base_url(true) . '/' . current_lang() . '/signin'); - } - - /** - * Forget action - * @param Request $request - * @param Response $response - * @param ViewFactory $view - */ - public function forget(Request $request, Response $response, ViewFactory $view) - { - if ($request->isMethod('post')) { - auth()->forget($request->get('email')); - session()->setFlash('success', t('common.check_email')); - redirect(base_url(true) . '/' . current_lang() . '/forget'); - } else { - $view->setParams([ - 'title' => t('common.forget_password') . ' | ' . config()->get('app_name'), - 'langs' => config()->get('langs'), - ]); - - $response->html($view->render(self::VIEW_FORGET)); - } - } - - /** - * Reset action - * @param Request $request - * @param Response $response - * @param ViewFactory $view - */ - public function reset(Request $request, Response $response, ViewFactory $view) - { - if ($request->isMethod('post')) { - auth()->reset($request->get('reset_token'), $request->get('password')); - redirect(base_url(true) . '/' . current_lang() . '/signin'); - } else { - $view->setParams([ - 'title' => t('common.reset_password') . ' | ' . config()->get('app_name'), - 'langs' => config()->get('langs'), - 'reset_token' => $request->get('reset_token') - ]); - - $response->html($view->render(self::VIEW_RESET)); - } - } - - /** - * Verify OTP action - * @param Request $request - * @param Response $response - * @param ViewFactory $view - */ - public function verify(Request $request, Response $response, ViewFactory $view) - { - if ($request->isMethod('post')) { - try { - auth()->verifyOtp((int)$request->get('otp'), $request->get('code')); - redirect(base_url(true) . '/' . current_lang()); - } catch (AuthException $e) { - session()->setFlash('error', $e->getMessage()); - redirect(base_url(true) . '/' . current_lang() . '/verify/' . $request->get('code')); - } - } else { - $view->setParams([ - 'title' => t('common.2fa') . ' | ' . config()->get('app_name'), - 'langs' => config()->get('langs'), - 'code' => route_param('code') - ]); - - $response->html($view->render(self::VIEW_VERIFY)); - } - } - - /** - * Resend OTP action - */ - public function resend() - { - try { - $otpToken = auth()->resendOtp(route_param('code')); - redirect(base_url(true) . '/' . current_lang() . '/verify/' . $otpToken); - } catch (AuthException $e) { - redirect(base_url(true) . '/' . current_lang() . '/signin'); - } - } -} diff --git a/modules/Web/Controllers/PostController.php b/modules/Web/Controllers/PostController.php deleted file mode 100644 index 6ac9446..0000000 --- a/modules/Web/Controllers/PostController.php +++ /dev/null @@ -1,242 +0,0 @@ - - * @copyright Copyright (c) 2018 Softberg LLC (https://softberg.org) - * @link http://quantum.softberg.org/ - * @since 2.8.0 - */ - -namespace Modules\Web\Controllers; - -use Quantum\Factory\ServiceFactory; -use Quantum\Factory\ViewFactory; -use Shared\Services\AuthService; -use Shared\Services\PostService; -use Quantum\Mvc\QtController; -use Quantum\Http\Response; -use Quantum\Http\Request; - -/** - * Class PostController - * @package Modules\Web\Controllers - */ -class PostController extends QtController -{ - - /** - * Post service - * @var PostService - */ - public $postService; - - /** - * Post service - * @var AuthService - */ - public $userService; - - /** - * Works before an action - * @param ViewFactory $view - */ - public function __before(ViewFactory $view) - { - $this->postService = ServiceFactory::get(PostService::class); - $this->userService = ServiceFactory::get(AuthService::class); - - $view->setLayout('layouts/main'); - } - - /** - * Get posts action - * @param Response $response - * @param ViewFactory $view - */ - public function posts(Response $response, ViewFactory $view) - { - $view->setParams([ - 'title' => t('common.posts') . ' | ' . config()->get('app_name'), - 'langs' => config()->get('langs'), - 'posts' => $this->postService->getPosts() - ]); - - $response->html($view->render('post/post')); - } - - /** - * Get post action - * @param string|null $lang - * @param string $postId - * @param Response $response - * @param ViewFactory $view - */ - public function post(?string $lang, string $postId, Response $response, ViewFactory $view) - { - $post = $this->postService->getPost($postId); - - $view->setParams([ - 'title' => $post['title'] . ' | ' . config()->get('app_name'), - 'langs' => config()->get('langs'), - 'post' => $post - ]); - - $response->html($view->render('post/single')); - } - - /** - * Get my posts action - * @param Request $request - * @param Response $response - * @param ViewFactory $view - */ - public function myPosts(Request $request, Response $response, ViewFactory $view) - { - $view->setParams([ - 'title' => t('common.my_posts') . ' | ' . config()->get('app_name'), - 'langs' => config()->get('langs'), - 'posts' => $this->postService->getMyPosts((int)auth()->user()->id) - ]); - - $response->html($view->render('post/my-posts')); - } - - /** - * Create post form - * @param Response $response - * @param ViewFactory $view - */ - public function createFrom(Response $response, ViewFactory $view) - { - $view->setParams([ - 'title' => t('common.new_post') . ' | ' . config()->get('app_name'), - 'langs' => config()->get('langs') - ]); - - $response->html($view->render('post/form')); - } - - /** - * Create post action - * @param Request $request - */ - public function create(Request $request) - { - $postData = [ - 'user_id' => (int)auth()->user()->id, - 'title' => $request->get('title', null, true), - 'content' => $request->get('content', null, true), - 'image' => '', - 'updated_at' => date('Y-m-d H:i:s'), - ]; - - if ($request->hasFile('image')) { - $imageName = $this->postService->saveImage( - $request->getFile('image'), - auth()->user()->uuid, - slugify($request->get('title')) - ); - - $postData['image'] = $imageName; - } - - $this->postService->addPost($postData); - - redirect(base_url(true) . '/' . current_lang() . '/my-posts'); - } - - public function amendForm(Response $response, ViewFactory $view, ?string $lang, string $postId) - { - $post = $this->postService->getPost($postId); - - $view->setParams([ - 'title' => $post['title'] . ' | ' . config()->get('app_name'), - 'langs' => config()->get('langs'), - 'post' => $post - ]); - - $response->html($view->render('post/form')); - } - - /** - * Amend post action - * @param Request $request - * @param string|null $lang - * @param string $postId - */ - public function amend(Request $request, ?string $lang, string $postId) - { - $postData = [ - 'title' => $request->get('title', null, true), - 'content' => $request->get('content', null, true), - 'updated_at' => date('Y-m-d H:i:s'), - ]; - - $post = $this->postService->getPost($postId, false); - - if ($request->hasFile('image')) { - if ($post['image']) { - $this->postService->deleteImage(auth()->user()->uuid . DS . $post['image']); - } - - $imageName = $this->postService->saveImage( - $request->getFile('image'), - auth()->user()->uuid, - slugify($request->get('title')) - ); - - $postData['image'] = $imageName; - } - - $this->postService->updatePost($postId, $postData); - - redirect(base_url(true) . '/' . current_lang() . '/my-posts'); - } - - /** - * Delete post action - * @param string|null $lang - * @param string $postId - */ - public function delete(?string $lang, string $postId) - { - $post = $this->postService->getPost($postId, false); - - if ($post['image']) { - $this->postService->deleteImage(auth()->user()->uuid . DS . $post['image']); - } - - $this->postService->deletePost($postId); - - redirect(base_url(true) . '/' . current_lang() . '/my-posts'); - } - - /** - * Delete post image action - * @param string|null $lang - * @param string $postId - */ - public function deleteImage(?string $lang, string $postId) - { - $post = $this->postService->getPost($postId, false); - - if ($post['image']) { - $this->postService->deleteImage(auth()->user()->uuid . DS . $post['image']); - } - - $this->postService->updatePost($postId, [ - 'title' => $post['title'], - 'content' => $post['content'], - 'image' => '', - 'updated_at' => date('Y-m-d H:i:s'), - ]); - - redirect(base_url(true) . '/' . current_lang() . '/my-posts'); - } - -} diff --git a/modules/Web/Middlewares/Activate.php b/modules/Web/Middlewares/Activate.php deleted file mode 100644 index 93953d6..0000000 --- a/modules/Web/Middlewares/Activate.php +++ /dev/null @@ -1,63 +0,0 @@ - - * @copyright Copyright (c) 2018 Softberg LLC (https://softberg.org) - * @link http://quantum.softberg.org/ - * @since 2.8.0 - */ - -namespace Modules\Web\Middlewares; - -use Quantum\Middleware\QtMiddleware; -use Quantum\Factory\ModelFactory; -use Quantum\Http\Response; -use Quantum\Http\Request; -use Shared\Models\User; -use Closure; - -/** - * Class Activate - * @package Modules\Web\Middlewares - */ -class Activate extends QtMiddleware -{ - - /** - * @param Request $request - * @param Response $response - * @param Closure $next - * @return mixed - */ - public function apply(Request $request, Response $response, Closure $next) - { - $token = (string) route_param('token'); - - if (!$this->checkToken($token)) { - stop(function () use ($response) { - $response->html(partial('errors/404'), 404); - }); - } - - $request->set('activation_token', $token); - - return $next($request, $response); - } - - /** - * Check token - * @param string $token - * @return bool - */ - private function checkToken(string $token): bool - { - $userModel = ModelFactory::get(User::class); - return !empty($userModel->findOneBy('activation_token', $token)->asArray()); - } - -} diff --git a/modules/Web/Middlewares/Auth.php b/modules/Web/Middlewares/Auth.php deleted file mode 100644 index f6f9ff2..0000000 --- a/modules/Web/Middlewares/Auth.php +++ /dev/null @@ -1,44 +0,0 @@ - - * @copyright Copyright (c) 2018 Softberg LLC (https://softberg.org) - * @link http://quantum.softberg.org/ - * @since 2.8.0 - */ - -namespace Modules\Web\Middlewares; - -use Quantum\Middleware\QtMiddleware; -use Quantum\Http\Response; -use Quantum\Http\Request; -use Closure; - -/** - * Class Auth - * @package Modules\Web\Middlewares - */ -class Auth extends QtMiddleware -{ - - /** - * @param Request $request - * @param Response $response - * @param Closure $next - * @return mixed - */ - public function apply(Request $request, Response $response, Closure $next) - { - if (!auth()->check()) { - redirect(base_url(true) . '/' . current_lang() . '/signin'); - } - - return $next($request, $response); - } - -} diff --git a/modules/Web/Middlewares/Editor.php b/modules/Web/Middlewares/Editor.php deleted file mode 100644 index 3de8def..0000000 --- a/modules/Web/Middlewares/Editor.php +++ /dev/null @@ -1,96 +0,0 @@ - - * @copyright Copyright (c) 2018 Softberg LLC (https://softberg.org) - * @link http://quantum.softberg.org/ - * @since 2.8.0 - */ - -namespace Modules\Web\Middlewares; - -use Quantum\Libraries\Validation\Validator; -use Quantum\Libraries\Validation\Rule; -use Quantum\Middleware\QtMiddleware; -use Quantum\Http\Response; -use Quantum\Http\Request; -use Closure; - -/** - * Class Editor - * @package Modules\Web\Middlewares - */ -class Editor extends QtMiddleware -{ - - /** - * Roles - */ - const ROLES = ['admin', 'editor']; - - /** - * @var Validator - */ - private $validator; - - /** - * Class constructor - * @param Request $request - */ - public function __construct(Request $request) - { - $this->validator = new Validator(); - - if ($request->hasFile('image')) { - $this->validator->addRules([ - 'image' => [ - Rule::set('fileSize', 2 * pow(1024, 2)), - Rule::set('fileExtension', ['jpeg', 'jpg', 'png']), - ] - ]); - } - - $this->validator->addRules([ - 'title' => [ - Rule::set('required'), - Rule::set('minLen', 10), - Rule::set('maxLen', 50) - ], - 'content' => [ - Rule::set('required'), - Rule::set('minLen', 10), - Rule::set('maxLen', 1000), - ], - ]); - } - - /** - * @param Request $request - * @param Response $response - * @param Closure $next - * @return mixed - */ - public function apply(Request $request, Response $response, Closure $next) - { - if (!in_array(auth()->user()->role, self::ROLES)) { - redirect(base_url(true) . '/' . current_lang()); - } - - if ($request->isMethod('post')) { - if (!$this->validator->isValid($request->all())) { - $data = $request->all(); - unset($data['image']); - session()->setFlash('error', $this->validator->getErrors()); - redirectWith(get_referrer(), $data); - } - } - - return $next($request, $response); - } - -} diff --git a/modules/Web/Middlewares/Forget.php b/modules/Web/Middlewares/Forget.php deleted file mode 100644 index 07bceaf..0000000 --- a/modules/Web/Middlewares/Forget.php +++ /dev/null @@ -1,92 +0,0 @@ - - * @copyright Copyright (c) 2018 Softberg LLC (https://softberg.org) - * @link http://quantum.softberg.org/ - * @since 2.8.0 - */ - -namespace Modules\Web\Middlewares; - -use Quantum\Libraries\Validation\Validator; -use Quantum\Libraries\Validation\Rule; -use Quantum\Middleware\QtMiddleware; -use Quantum\Factory\ModelFactory; -use Quantum\Http\Response; -use Quantum\Http\Request; -use Shared\Models\User; -use Exception; -use Closure; - -/** - * Class Forget - * @package Modules\Web\Middlewares - */ -class Forget extends QtMiddleware -{ - - /** - * @var Validator - */ - private $validator; - - /** - * Class constructor - */ - public function __construct() - { - $this->validator = new Validator(); - - $this->validator->addRule('email', [ - Rule::set('required'), - Rule::set('email') - ]); - } - - /** - * @param Request $request - * @param Response $response - * @param Closure $next - * @return mixed - */ - public function apply(Request $request, Response $response, Closure $next) - { - if ($request->isMethod('post')) { - if (!$this->validator->isValid($request->all())) { - session()->setFlash('error', $this->validator->getErrors()); - redirect(base_url(true) . '/' . current_lang() . '/forget'); - } - - if (!$this->emailExists($request->get('email'))) { - session()->setFlash('error', [ - 'email' => [ - t('validation.nonExistingRecord', $request->get('email')) - ] - ]); - - redirect(base_url(true) . '/' . current_lang() . '/forget'); - } - } - - return $next($request, $response); - } - - /** - * Check for email existence - * @param string $email - * @return bool - * @throws Exception - */ - private function emailExists(string $email): bool - { - $userModel = ModelFactory::get(User::class); - return !empty($userModel->findOneBy('email', $email)->asArray()); - } - -} diff --git a/modules/Web/Middlewares/Guest.php b/modules/Web/Middlewares/Guest.php deleted file mode 100644 index 2278d12..0000000 --- a/modules/Web/Middlewares/Guest.php +++ /dev/null @@ -1,44 +0,0 @@ - - * @copyright Copyright (c) 2018 Softberg LLC (https://softberg.org) - * @link http://quantum.softberg.org/ - * @since 2.8.0 - */ - -namespace Modules\Web\Middlewares; - -use Quantum\Middleware\QtMiddleware; -use Quantum\Http\Response; -use Quantum\Http\Request; -use Closure; - -/** - * Class Guest - * @package Modules\Web\Middlewares - */ -class Guest extends QtMiddleware -{ - - /** - * @param Request $request - * @param Response $response - * @param Closure $next - * @return mixed - */ - public function apply(Request $request, Response $response, Closure $next) - { - if (auth()->check()) { - redirect(get_referrer() ?? base_url(true) . '/' . current_lang()); - } - - return $next($request, $response); - } - -} diff --git a/modules/Web/Middlewares/Owner.php b/modules/Web/Middlewares/Owner.php deleted file mode 100644 index 4a4c472..0000000 --- a/modules/Web/Middlewares/Owner.php +++ /dev/null @@ -1,51 +0,0 @@ - - * @copyright Copyright (c) 2018 Softberg LLC (https://softberg.org) - * @link http://quantum.softberg.org/ - * @since 2.8.0 - */ - -namespace Modules\Web\Middlewares; - -use Quantum\Middleware\QtMiddleware; -use Quantum\Factory\ServiceFactory; -use Shared\Services\PostService; -use Quantum\Http\Response; -use Quantum\Http\Request; -use Closure; - -/** - * Class Editor - * @package Modules\Web\Middlewares - */ -class Owner extends QtMiddleware -{ - - /** - * @param Request $request - * @param Response $response - * @param Closure $next - * @return mixed - */ - public function apply(Request $request, Response $response, Closure $next) - { - $postId = (string) route_param('id'); - - $post = ServiceFactory::get(PostService::class)->getPost($postId, false); - - if (!$post || $post['user_id'] != auth()->user()->id) { - $response->html(partial('errors/404'), 404); - stop(); - } - - return $next($request, $response); - } - -} diff --git a/modules/Web/Middlewares/Post.php b/modules/Web/Middlewares/Post.php deleted file mode 100644 index 8dea4ae..0000000 --- a/modules/Web/Middlewares/Post.php +++ /dev/null @@ -1,51 +0,0 @@ - - * @copyright Copyright (c) 2018 Softberg LLC (https://softberg.org) - * @link http://quantum.softberg.org/ - * @since 2.8.0 - */ - -namespace Modules\Web\Middlewares; - -use Quantum\Middleware\QtMiddleware; -use Quantum\Factory\ServiceFactory; -use Shared\Services\PostService; -use Quantum\Http\Response; -use Quantum\Http\Request; -use Closure; - -/** - * Class Editor - * @package Modules\Web\Middlewares - */ -class Post extends QtMiddleware -{ - - /** - * @param Request $request - * @param Response $response - * @param Closure $next - * @return mixed - */ - public function apply(Request $request, Response $response, Closure $next) - { - $postId = (string) route_param('id'); - - $post = ServiceFactory::get(PostService::class)->getPost($postId, false); - - if (!$post) { - $response->html(partial('errors/404'), 404); - stop(); - } - - return $next($request, $response); - } - -} diff --git a/modules/Web/Middlewares/Resend.php b/modules/Web/Middlewares/Resend.php deleted file mode 100644 index bfdb71e..0000000 --- a/modules/Web/Middlewares/Resend.php +++ /dev/null @@ -1,44 +0,0 @@ - - * @copyright Copyright (c) 2018 Softberg LLC (https://softberg.org) - * @link http://quantum.softberg.org/ - * @since 2.8.0 - */ - -namespace Modules\Web\Middlewares; - -use Quantum\Middleware\QtMiddleware; -use Quantum\Http\Response; -use Quantum\Http\Request; -use Closure; - -/** - * Class Resend - * @package Modules\Web\Middlewares - */ -class Resend extends QtMiddleware -{ - - /** - * @param Request $request - * @param Response $response - * @param Closure $next - * @return mixed - */ - public function apply(Request $request, Response $response, Closure $next) - { - if (!route_param('code')) { - redirect(base_url(true) . '/' . current_lang() . '/signin'); - } - - return $next($request, $response); - } - -} diff --git a/modules/Web/Middlewares/Reset.php b/modules/Web/Middlewares/Reset.php deleted file mode 100644 index a47e953..0000000 --- a/modules/Web/Middlewares/Reset.php +++ /dev/null @@ -1,115 +0,0 @@ - - * @copyright Copyright (c) 2018 Softberg LLC (https://softberg.org) - * @link http://quantum.softberg.org/ - * @since 2.8.0 - */ - -namespace Modules\Web\Middlewares; - -use Quantum\Libraries\Validation\Validator; -use Quantum\Libraries\Validation\Rule; -use Quantum\Middleware\QtMiddleware; -use Quantum\Factory\ModelFactory; -use Quantum\Http\Response; -use Quantum\Http\Request; -use Shared\Models\User; -use Closure; - -/** - * Class Reset - * @package Modules\Web\Middlewares - */ -class Reset extends QtMiddleware -{ - - /** - * @var Validator - */ - private $validator; - - /** - * Class constructor - */ - public function __construct() - { - $this->validator = new Validator(); - - $this->validator->addRule('password', [ - Rule::set('required'), - Rule::set('minLen', 6) - ]); - } - - /** - * @param Request $request - * @param Response $response - * @param Closure $next - * @return mixed - */ - public function apply(Request $request, Response $response, Closure $next) - { - $token = route_param('token'); - - if ($token && $request->isMethod('post')) { - if (!$this->checkToken($token)) { - session()->setFlash('error', [ - 'password' => [ - t('validation.nonExistingRecord', 'token') - ] - ]); - - redirect(get_referrer()); - } - - if (!$this->validator->isValid($request->all())) { - session()->setFlash('error', $this->validator->getErrors()); - redirect(get_referrer()); - } - - if (!$this->confirmPassword($request->get('password'), $request->get('repeat_password'))) { - session()->setFlash('error', t('validation.nonEqualValues')); - redirect(get_referrer()); - } - } elseif ($request->isMethod('get')) { - if (!$this->checkToken($token)) { - $response->html(partial('errors/404'), 404); - stop(); - } - } - - $request->set('reset_token', $token); - - return $next($request, $response); - } - - /** - * Check token - * @param string $token - * @return bool - */ - private function checkToken(string $token): bool - { - $userModel = ModelFactory::get(User::class); - return !empty($userModel->findOneBy('reset_token', $token)->asArray()); - } - - /** - * Checks the password and repeat password - * @param string $newPassword - * @param string $repeatPassword - * @return bool - */ - private function confirmPassword(string $newPassword, string $repeatPassword): bool - { - return $newPassword == $repeatPassword; - } - -} diff --git a/modules/Web/Middlewares/Signup.php b/modules/Web/Middlewares/Signup.php deleted file mode 100644 index 9fee700..0000000 --- a/modules/Web/Middlewares/Signup.php +++ /dev/null @@ -1,98 +0,0 @@ - - * @copyright Copyright (c) 2018 Softberg LLC (https://softberg.org) - * @link http://quantum.softberg.org/ - * @since 2.8.0 - */ - -namespace Modules\Web\Middlewares; - -use Quantum\Libraries\Validation\Validator; -use Quantum\Libraries\Validation\Rule; -use Quantum\Middleware\QtMiddleware; -use Quantum\Factory\ModelFactory; -use Quantum\Http\Response; -use Quantum\Http\Request; -use Shared\Models\User; -use Closure; - -/** - * Class Signup - * @package Modules\Web\Middlewares - */ -class Signup extends QtMiddleware -{ - - /** - * @var Validator - */ - private $validator; - - /** - * Class constructor - * @throws \Exception - */ - public function __construct() - { - $this->validator = new Validator(); - - $this->validator->addValidation('uniqueUser', function ($value) { - $userModel = ModelFactory::get(User::class); - return empty($userModel->findOneBy('email', $value)->asArray()); - }); - - $this->validator->addRules([ - 'email' => [ - Rule::set('required'), - Rule::set('email'), - Rule::set('uniqueUser') - ], - 'password' => [ - Rule::set('required'), - Rule::set('minLen', 6) - ], - 'firstname' => [ - Rule::set('required') - ], - 'lastname' => [ - Rule::set('required') - ], - 'recaptcha' => [ - Rule::set('required'), - Rule::set('recaptcha') - ] - ]); - } - - /** - * @param Request $request - * @param Response $response - * @param Closure $next - * @return mixed - */ - public function apply(Request $request, Response $response, Closure $next) - { - if ($request->isMethod('post')) { - - if($request->has('g-recaptcha-response')) { - $request->set('recaptcha', $request->get('g-recaptcha-response')); - $request->delete('g-recaptcha-response'); - } - - if (!$this->validator->isValid($request->all())) { - session()->setFlash('error', $this->validator->getErrors()); - redirectWith(base_url(true) . '/' . current_lang() . '/signup', $request->all()); - } - } - - return $next($request, $response); - } - -} diff --git a/modules/Web/Middlewares/Verify.php b/modules/Web/Middlewares/Verify.php deleted file mode 100644 index 01f3ecf..0000000 --- a/modules/Web/Middlewares/Verify.php +++ /dev/null @@ -1,85 +0,0 @@ - - * @copyright Copyright (c) 2018 Softberg LLC (https://softberg.org) - * @link http://quantum.softberg.org/ - * @since 2.8.0 - */ - -namespace Modules\Web\Middlewares; - -use Quantum\Libraries\Validation\Validator; -use Quantum\Libraries\Validation\Rule; -use Quantum\Middleware\QtMiddleware; -use Quantum\Factory\ModelFactory; -use Quantum\Http\Response; -use Quantum\Http\Request; -use Shared\Models\User; -use Closure; - -/** - * Class Verify - * @package Modules\Web\Middlewares - */ -class Verify extends QtMiddleware -{ - /** - * @var Validator - */ - private $validator; - - /** - * Class constructor - */ - public function __construct() - { - $this->validator = new Validator(); - - $this->validator->addRules([ - 'otp' => [ - Rule::set('required') - ], - 'code' => [ - Rule::set('required') - ] - ]); - } - - /** - * @param Request $request - * @param Response $response - * @param Closure $next - * @return mixed - */ - public function apply(Request $request, Response $response, Closure $next) - { - if ($request->isMethod('post')) { - if (!$this->validator->isValid($request->all())) { - session()->setFlash('error', $this->validator->getErrors()); - redirectWith(base_url(true) . '/' . current_lang() . '/verify', $request->all()); - } - } else { - $token = (string)route_param('code'); - - if (!$this->checkToken($token)) { - stop(function () use ($response) { - $response->html(partial('errors/404'), 404); - }); - } - - } - - return $next($request, $response); - } - - private function checkToken(string $token): bool - { - $userModel = ModelFactory::get(User::class); - return !empty($userModel->findOneBy('otp_token', $token)->asArray()); - } -} \ No newline at end of file diff --git a/modules/Web/Models/.gitkeep b/modules/Web/Models/.gitkeep deleted file mode 100644 index 256c7f2..0000000 --- a/modules/Web/Models/.gitkeep +++ /dev/null @@ -1 +0,0 @@ -#qt diff --git a/modules/Web/Resources/.gitkeep b/modules/Web/Resources/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/modules/Web/Services/.gitkeep b/modules/Web/Services/.gitkeep deleted file mode 100644 index 256c7f2..0000000 --- a/modules/Web/Services/.gitkeep +++ /dev/null @@ -1 +0,0 @@ -#qt diff --git a/modules/Web/Views/about.php b/modules/Web/Views/about.php deleted file mode 100644 index 000b7f5..0000000 --- a/modules/Web/Views/about.php +++ /dev/null @@ -1,28 +0,0 @@ -
-
-

- -
-
-
- -

-
- - -

-
    -
  • -
    - > composer create-project quantum/project [project name] -
  • -
  • -
    - > php qt serve -
  • -
-
-
-
-
- diff --git a/modules/Web/Views/auth/forget.php b/modules/Web/Views/auth/forget.php deleted file mode 100644 index 68a811b..0000000 --- a/modules/Web/Views/auth/forget.php +++ /dev/null @@ -1,40 +0,0 @@ -
-
-
-
-

- - has('error')): ?> - - - - has('success')): ?> - - - -
-
-
-
- - -
-
-
- -
-
-
- - -
-
-
-
-
-
-
-
\ No newline at end of file diff --git a/modules/Web/Views/auth/reset.php b/modules/Web/Views/auth/reset.php deleted file mode 100644 index da1dbe9..0000000 --- a/modules/Web/Views/auth/reset.php +++ /dev/null @@ -1,44 +0,0 @@ -
-
-
-
-

- - has('error')): ?> - - - - has('success')): ?> - - - -
-
-
-
-
- - - visibility - visibility_off -
-
- - - visibility - visibility_off -
-
- - -
-
-
-
-
-
-
-
-
\ No newline at end of file diff --git a/modules/Web/Views/auth/signin.php b/modules/Web/Views/auth/signin.php deleted file mode 100644 index 47482e3..0000000 --- a/modules/Web/Views/auth/signin.php +++ /dev/null @@ -1,63 +0,0 @@ -
-
-
-
-

- - has('error')): ?> - - - -
-
- -
-
-
-
-
-
diff --git a/modules/Web/Views/auth/signup.php b/modules/Web/Views/auth/signup.php deleted file mode 100644 index 3e829fc..0000000 --- a/modules/Web/Views/auth/signup.php +++ /dev/null @@ -1,62 +0,0 @@ -
-
-
-
-

- - has('error')) : ?> - - - - has('success')): ?> - - - -
-
-
-
-
- - -
-
-
-
- - - visibility - visibility_off -
-
-
-
- - -
-
-
-
- - -
-
- -
-
- -
-
-
- - -
-
-
-
-
-
-
-
\ No newline at end of file diff --git a/modules/Web/Views/auth/verify.php b/modules/Web/Views/auth/verify.php deleted file mode 100644 index 7187328..0000000 --- a/modules/Web/Views/auth/verify.php +++ /dev/null @@ -1,46 +0,0 @@ -
-
-
-
-

- - has('error')): ?> - - - - has('success')): ?> - - - -
-
-
-
-
- - - - - - -
- -
- -
-
- - - -
-
-
-
-
-
-
-
-
\ No newline at end of file diff --git a/modules/Web/Views/index.php b/modules/Web/Views/index.php deleted file mode 100644 index 771b587..0000000 --- a/modules/Web/Views/index.php +++ /dev/null @@ -1,20 +0,0 @@ -
-
-
-
- -
-

-
-
-
-
-
- -
-
-
- \ No newline at end of file diff --git a/modules/Web/Views/layouts/main.php b/modules/Web/Views/layouts/main.php deleted file mode 100644 index a88e7b3..0000000 --- a/modules/Web/Views/layouts/main.php +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - <?php echo $title ?> - - - - ' type='text/css' media='screen,projection' /> - ' type='text/css' /> - - -
- -
- - - - - - - - - - \ No newline at end of file diff --git a/modules/Web/Views/partials/bubbles.php b/modules/Web/Views/partials/bubbles.php deleted file mode 100644 index 0d9f886..0000000 --- a/modules/Web/Views/partials/bubbles.php +++ /dev/null @@ -1,12 +0,0 @@ - \ No newline at end of file diff --git a/modules/Web/Views/partials/footer.php b/modules/Web/Views/partials/footer.php deleted file mode 100644 index 917af98..0000000 --- a/modules/Web/Views/partials/footer.php +++ /dev/null @@ -1,12 +0,0 @@ - \ No newline at end of file diff --git a/modules/Web/Views/partials/language.php b/modules/Web/Views/partials/language.php deleted file mode 100644 index a96ed85..0000000 --- a/modules/Web/Views/partials/language.php +++ /dev/null @@ -1,15 +0,0 @@ -
  • - - language - - - -
  • \ No newline at end of file diff --git a/modules/Web/Views/partials/logo.php b/modules/Web/Views/partials/logo.php deleted file mode 100644 index 31e9ff1..0000000 --- a/modules/Web/Views/partials/logo.php +++ /dev/null @@ -1,3 +0,0 @@ - - <?php echo env('APP_NAME') ?> - \ No newline at end of file diff --git a/modules/Web/Views/partials/messages/error.php b/modules/Web/Views/partials/messages/error.php deleted file mode 100644 index 3fdfac4..0000000 --- a/modules/Web/Views/partials/messages/error.php +++ /dev/null @@ -1,16 +0,0 @@ -
    - getFlash('error') ?> - - - - - - - -
    \ No newline at end of file diff --git a/modules/Web/Views/partials/messages/success.php b/modules/Web/Views/partials/messages/success.php deleted file mode 100644 index b091e00..0000000 --- a/modules/Web/Views/partials/messages/success.php +++ /dev/null @@ -1,4 +0,0 @@ - \ No newline at end of file diff --git a/modules/Web/Views/partials/navbar.php b/modules/Web/Views/partials/navbar.php deleted file mode 100644 index 63f5993..0000000 --- a/modules/Web/Views/partials/navbar.php +++ /dev/null @@ -1,56 +0,0 @@ - - \ No newline at end of file diff --git a/modules/Web/Views/partials/sidebar.php b/modules/Web/Views/partials/sidebar.php deleted file mode 100644 index c663938..0000000 --- a/modules/Web/Views/partials/sidebar.php +++ /dev/null @@ -1,52 +0,0 @@ - \ No newline at end of file diff --git a/modules/Web/Views/post/form.php b/modules/Web/Views/post/form.php deleted file mode 100644 index 6529d95..0000000 --- a/modules/Web/Views/post/form.php +++ /dev/null @@ -1,66 +0,0 @@ -
    -
    - -
    -
    -

    - - has('error')) : ?> - - - - t('common.the_image')]) ?> - -
    -
    -
    -
    -
    - - -
    -
    -
    -
    - - -
    -
    -
    -
    - Image - -
    -
    - -
    -
    - -
    - - - close - - - -
    - -
    - - - - - -
    -
    -
    -
    -
    -
    -
    -
    \ No newline at end of file diff --git a/modules/Web/Views/post/my-posts.php b/modules/Web/Views/post/my-posts.php deleted file mode 100644 index af63a72..0000000 --- a/modules/Web/Views/post/my-posts.php +++ /dev/null @@ -1,23 +0,0 @@ -
    -

    -
    - - -
    - -

    ...

    - - - t('common.the_post')]) ?> - - check()): ?> -
    - add -
    - -
    \ No newline at end of file diff --git a/modules/Web/Views/post/partials/back.php b/modules/Web/Views/post/partials/back.php deleted file mode 100644 index 33e4c45..0000000 --- a/modules/Web/Views/post/partials/back.php +++ /dev/null @@ -1,3 +0,0 @@ - - arrow_back - \ No newline at end of file diff --git a/modules/Web/Views/post/partials/modal.php b/modules/Web/Views/post/partials/modal.php deleted file mode 100644 index 9f6af9c..0000000 --- a/modules/Web/Views/post/partials/modal.php +++ /dev/null @@ -1,9 +0,0 @@ - diff --git a/modules/Web/Views/post/partials/my-post-item.php b/modules/Web/Views/post/partials/my-post-item.php deleted file mode 100644 index 9d657a4..0000000 --- a/modules/Web/Views/post/partials/my-post-item.php +++ /dev/null @@ -1,21 +0,0 @@ -
  • - - - - - - - - - - -

    -
    -

    - - edit - - - delete - -
  • diff --git a/modules/Web/Views/post/partials/post-item.php b/modules/Web/Views/post/partials/post-item.php deleted file mode 100644 index 4f56483..0000000 --- a/modules/Web/Views/post/partials/post-item.php +++ /dev/null @@ -1,29 +0,0 @@ -
    -
    - -
    - - - - - -
    -
    -
    - - - - - -

    -
    -
    -
    -
    - - -
    -
    -
    -
    -
    \ No newline at end of file diff --git a/modules/Web/Views/post/post.php b/modules/Web/Views/post/post.php deleted file mode 100644 index bfdccf4..0000000 --- a/modules/Web/Views/post/post.php +++ /dev/null @@ -1,15 +0,0 @@ -
    -

    -
    - - - $post]) ?> - - -
    - -

    ...

    - - - t('common.the_post')]) ?> -
    diff --git a/modules/Web/Views/post/single.php b/modules/Web/Views/post/single.php deleted file mode 100644 index f3d84c7..0000000 --- a/modules/Web/Views/post/single.php +++ /dev/null @@ -1,15 +0,0 @@ -
    -
    - -

    -
    - - -
    - - - - -

    -
    -
    diff --git a/shared/Commands/DemoCommand.php b/shared/Commands/DemoCommand.php index a55cc89..9cffe84 100644 --- a/shared/Commands/DemoCommand.php +++ b/shared/Commands/DemoCommand.php @@ -109,6 +109,7 @@ class DemoCommand extends QtCommand * Command name of create post */ const COMMAND_POST_CREATE = 'post:create'; + const COMMAND_CREATE_MODULE = 'module:generate'; /** * Command constructor @@ -153,6 +154,21 @@ public function exec() } } + $this->runExternalCommand(self::COMMAND_CREATE_MODULE, [ + "module" => "Web", + "--yes" => true, + "--template" => "web", + "--demo" => "yes" + ]); + + $this->runExternalCommand(self::COMMAND_CREATE_MODULE, [ + "module" => "Api", + "--yes" => true, + "--template" => "api", + "--demo" => "yes" + ]); + + $this->info('Demo project created successfully'); } diff --git a/shared/config/modules.php b/shared/config/modules.php index 189d1fd..ef3829c 100644 --- a/shared/config/modules.php +++ b/shared/config/modules.php @@ -9,13 +9,5 @@ * Project modules which will be loaded by framework if enabled */ 'modules' => [ - 'Web' => [ - 'prefix' => '', - 'enabled' => true, - ], - 'Api' => [ - 'prefix' => 'api', - 'enabled' => true, - ], ] ];