diff --git a/app/Enums/AppModeEnum.php b/app/Enums/AppModeEnum.php index 9a75881..f92857f 100644 --- a/app/Enums/AppModeEnum.php +++ b/app/Enums/AppModeEnum.php @@ -6,6 +6,7 @@ enum AppModeEnum: string { case APP = 'app'; case SAAS = 'saas'; + case DEMO = 'demo'; public static function current(): self { @@ -21,4 +22,19 @@ public function isSaas(): bool { return $this === self::SAAS; } + + public function isDemo(): bool + { + return $this === self::DEMO; + } + + public function requiresSubscription(): bool + { + return $this === self::SAAS; + } + + public function allowsLogout(): bool + { + return $this !== self::DEMO; + } } \ No newline at end of file diff --git a/app/Http/Controllers/Auth/LoginController.php b/app/Http/Controllers/Auth/LoginController.php index 80375a9..12667ce 100644 --- a/app/Http/Controllers/Auth/LoginController.php +++ b/app/Http/Controllers/Auth/LoginController.php @@ -34,6 +34,10 @@ public function login(Request $request) public function logout(Request $request) { + if (is_mode_demo()) { + return redirect()->route('dashboard'); + } + Auth::logout(); $request->session()->invalidate(); diff --git a/app/Http/Middleware/DemoMiddleware.php b/app/Http/Middleware/DemoMiddleware.php new file mode 100644 index 0000000..1c115ee --- /dev/null +++ b/app/Http/Middleware/DemoMiddleware.php @@ -0,0 +1,35 @@ + 'Demo User', + 'email' => 'demo-' . Str::uuid() . '@demo.local', + 'password' => Hash::make(Str::random(32)), + ]); + + Auth::login($planner); + + return $next($request); + } +} diff --git a/app/Http/Middleware/RequireSubscription.php b/app/Http/Middleware/RequireSubscription.php index c07b1d8..9ce8631 100644 --- a/app/Http/Middleware/RequireSubscription.php +++ b/app/Http/Middleware/RequireSubscription.php @@ -2,6 +2,7 @@ namespace App\Http\Middleware; +use App\Enums\AppModeEnum; use Closure; use Illuminate\Http\Request; use Symfony\Component\HttpFoundation\Response; @@ -10,7 +11,7 @@ class RequireSubscription { public function handle(Request $request, Closure $next): Response { - if (is_mode_app()) { + if (! AppModeEnum::current()->requiresSubscription()) { return $next($request); } diff --git a/app/Models/Planner.php b/app/Models/Planner.php index f8307fd..42d9b22 100644 --- a/app/Models/Planner.php +++ b/app/Models/Planner.php @@ -13,6 +13,7 @@ * @property int $id * @property static PlannerFactory factory($count = null, $state = []) * @method static first() + * @method static create(array $array) */ class Planner extends Authenticatable { diff --git a/app/helpers.php b/app/helpers.php index 59bc43a..55f6f40 100644 --- a/app/helpers.php +++ b/app/helpers.php @@ -14,4 +14,18 @@ function is_mode_saas(): bool { return AppModeEnum::current()->isSaas(); } +} + +if (! function_exists('is_mode_demo')) { + function is_mode_demo(): bool + { + return AppModeEnum::current()->isDemo(); + } +} + +if (! function_exists('allows_logout')) { + function allows_logout(): bool + { + return AppModeEnum::current()->allowsLogout(); + } } \ No newline at end of file diff --git a/bootstrap/app.php b/bootstrap/app.php index 7fb61b3..578208e 100644 --- a/bootstrap/app.php +++ b/bootstrap/app.php @@ -1,5 +1,6 @@ withMiddleware(function (Middleware $middleware) { // Apply ForceJsonResponse only to API routes $middleware->api(ForceJsonResponse::class); - + $middleware->web(DemoMiddleware::class); $middleware->alias([ 'subscription' => RequireSubscription::class, 'saas' => RequireSaasMode::class, diff --git a/config/app.php b/config/app.php index 09dd952..58954c9 100644 --- a/config/app.php +++ b/config/app.php @@ -39,6 +39,7 @@ */ 'mode' => env('APP_MODE', 'app'), + 'demo_subscribe_url' => env('APP_DEMO_SUBSCRIBE_URL', 'https://dishplanner.app'), /* |-------------------------------------------------------------------------- diff --git a/resources/views/components/layouts/app.blade.php b/resources/views/components/layouts/app.blade.php index d893086..fd3cd3a 100644 --- a/resources/views/components/layouts/app.blade.php +++ b/resources/views/components/layouts/app.blade.php @@ -13,6 +13,16 @@