diff --git a/.env.example b/.env.example index 9f0e8bb..238539b 100644 --- a/.env.example +++ b/.env.example @@ -4,7 +4,16 @@ APP_KEY= APP_DEBUG=true APP_URL=http://dotenv.test +APP_TIMEZONE=UTC +APP_LOCALE=en +APP_FALLBACK_LOCALE=en +APP_FAKER_LOCALE=en_US +APP_MAINTENANCE_DRIVER=file +APP_MAINTENANCE_STORE=database +BCRYPT_ROUNDS=12 + LOG_CHANNEL=stack +LOG_STACK=single LOG_DEPRECATIONS_CHANNEL=null LOG_LEVEL=debug @@ -15,12 +24,15 @@ DB_DATABASE=envmanager DB_USERNAME=root DB_PASSWORD= -BROADCAST_DRIVER=log -CACHE_DRIVER=file +BROADCAST_CONNECTION=log +CACHE_STORE=file FILESYSTEM_DISK=local QUEUE_CONNECTION=sync SESSION_DRIVER=database SESSION_LIFETIME=120 +SESSION_ENCRYPT=false +SESSION_PATH=/ +SESSION_DOMAIN=null MEMCACHED_HOST=127.0.0.1 diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php deleted file mode 100644 index 004e6a5..0000000 --- a/app/Console/Kernel.php +++ /dev/null @@ -1,28 +0,0 @@ -<?php - -namespace App\Console; - -use Illuminate\Console\Scheduling\Schedule; -use Illuminate\Foundation\Console\Kernel as ConsoleKernel; - -class Kernel extends ConsoleKernel -{ - /** - * Define the application's command schedule. - */ - protected function schedule(Schedule $schedule): void - { - $schedule->command('media-library:delete-old-temporary-uploads')->daily(); - $schedule->command('livewire:configure-s3-upload-cleanup')->daily(); - } - - /** - * Register the commands for the application. - */ - protected function commands(): void - { - $this->load(__DIR__ . '/Commands'); - - require base_path('routes/console.php'); - } -} diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php index ce1176d..345847e 100644 --- a/app/Http/Controllers/Controller.php +++ b/app/Http/Controllers/Controller.php @@ -7,7 +7,7 @@ use Illuminate\Foundation\Validation\ValidatesRequests; use Illuminate\Routing\Controller as BaseController; -class Controller extends BaseController +abstract class Controller extends BaseController { use AuthorizesRequests; use DispatchesJobs; diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php deleted file mode 100644 index 03c9098..0000000 --- a/app/Http/Kernel.php +++ /dev/null @@ -1,49 +0,0 @@ -<?php - -namespace App\Http; - -use Illuminate\Foundation\Http\Kernel as HttpKernel; - -class Kernel extends HttpKernel -{ - protected $middleware = [ - // \App\Http\Middleware\TrustHosts::class, - \App\Http\Middleware\TrustProxies::class, - \Fruitcake\Cors\HandleCors::class, - \App\Http\Middleware\PreventRequestsDuringMaintenance::class, - \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class, - \App\Http\Middleware\TrimStrings::class, - \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class, - ]; - - protected $middlewareGroups = [ - 'web' => [ - \App\Http\Middleware\EncryptCookies::class, - \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, - \Illuminate\Session\Middleware\StartSession::class, - \Laravel\Jetstream\Http\Middleware\AuthenticateSession::class, - \Illuminate\View\Middleware\ShareErrorsFromSession::class, - \App\Http\Middleware\VerifyCsrfToken::class, - \Illuminate\Routing\Middleware\SubstituteBindings::class, - ], - - 'api' => [ - // \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class, - 'throttle:api', - \Illuminate\Routing\Middleware\SubstituteBindings::class, - ], - ]; - - protected $routeMiddleware = [ - 'auth' => \App\Http\Middleware\Authenticate::class, - 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, - 'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class, - 'can' => \Illuminate\Auth\Middleware\Authorize::class, - 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, - 'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class, - 'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class, - 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, - 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class, - 'store-marketing-query-params' => \App\Http\Middleware\StoreMarketingQueryParamsMiddleware::class, - ]; -} diff --git a/app/Http/Middleware/Authenticate.php b/app/Http/Middleware/Authenticate.php deleted file mode 100644 index 704089a..0000000 --- a/app/Http/Middleware/Authenticate.php +++ /dev/null @@ -1,21 +0,0 @@ -<?php - -namespace App\Http\Middleware; - -use Illuminate\Auth\Middleware\Authenticate as Middleware; - -class Authenticate extends Middleware -{ - /** - * Get the path the user should be redirected to when they are not authenticated. - * - * @param \Illuminate\Http\Request $request - * @return string|null - */ - protected function redirectTo($request) - { - if (! $request->expectsJson()) { - return route('login'); - } - } -} diff --git a/app/Http/Middleware/EncryptCookies.php b/app/Http/Middleware/EncryptCookies.php deleted file mode 100644 index 867695b..0000000 --- a/app/Http/Middleware/EncryptCookies.php +++ /dev/null @@ -1,17 +0,0 @@ -<?php - -namespace App\Http\Middleware; - -use Illuminate\Cookie\Middleware\EncryptCookies as Middleware; - -class EncryptCookies extends Middleware -{ - /** - * The names of the cookies that should not be encrypted. - * - * @var array<int, string> - */ - protected $except = [ - // - ]; -} diff --git a/app/Http/Middleware/PreventRequestsDuringMaintenance.php b/app/Http/Middleware/PreventRequestsDuringMaintenance.php deleted file mode 100644 index 74cbd9a..0000000 --- a/app/Http/Middleware/PreventRequestsDuringMaintenance.php +++ /dev/null @@ -1,17 +0,0 @@ -<?php - -namespace App\Http\Middleware; - -use Illuminate\Foundation\Http\Middleware\PreventRequestsDuringMaintenance as Middleware; - -class PreventRequestsDuringMaintenance extends Middleware -{ - /** - * The URIs that should be reachable while maintenance mode is enabled. - * - * @var array<int, string> - */ - protected $except = [ - // - ]; -} diff --git a/app/Http/Middleware/RedirectIfAuthenticated.php b/app/Http/Middleware/RedirectIfAuthenticated.php deleted file mode 100644 index 9fd6e99..0000000 --- a/app/Http/Middleware/RedirectIfAuthenticated.php +++ /dev/null @@ -1,24 +0,0 @@ -<?php - -namespace App\Http\Middleware; - -use App\Providers\RouteServiceProvider; -use Closure; -use Illuminate\Http\Request; -use Illuminate\Support\Facades\Auth; - -class RedirectIfAuthenticated -{ - public function handle(Request $request, Closure $next, ...$guards): \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|\Illuminate\Http\Response - { - $guards = empty($guards) ? [null] : $guards; - - foreach ($guards as $guard) { - if (Auth::guard($guard)->check()) { - return redirect(RouteServiceProvider::HOME); - } - } - - return $next($request); - } -} diff --git a/app/Http/Middleware/StoreMarketingQueryParamsMiddleware.php b/app/Http/Middleware/StoreMarketingQueryParamsMiddleware.php index 0571d05..ed9fa7e 100644 --- a/app/Http/Middleware/StoreMarketingQueryParamsMiddleware.php +++ b/app/Http/Middleware/StoreMarketingQueryParamsMiddleware.php @@ -3,10 +3,11 @@ namespace App\Http\Middleware; use Closure; +use Illuminate\Http\Request; class StoreMarketingQueryParamsMiddleware { - public function handle($request, Closure $next): mixed + public function handle(Request $request, Closure $next): mixed { $utmQueryParams = [ 'utm_source', diff --git a/app/Http/Middleware/TrimStrings.php b/app/Http/Middleware/TrimStrings.php deleted file mode 100644 index 88cadca..0000000 --- a/app/Http/Middleware/TrimStrings.php +++ /dev/null @@ -1,19 +0,0 @@ -<?php - -namespace App\Http\Middleware; - -use Illuminate\Foundation\Http\Middleware\TrimStrings as Middleware; - -class TrimStrings extends Middleware -{ - /** - * The names of the attributes that should not be trimmed. - * - * @var array<int, string> - */ - protected $except = [ - 'current_password', - 'password', - 'password_confirmation', - ]; -} diff --git a/app/Http/Middleware/TrustHosts.php b/app/Http/Middleware/TrustHosts.php deleted file mode 100644 index c9c58bd..0000000 --- a/app/Http/Middleware/TrustHosts.php +++ /dev/null @@ -1,20 +0,0 @@ -<?php - -namespace App\Http\Middleware; - -use Illuminate\Http\Middleware\TrustHosts as Middleware; - -class TrustHosts extends Middleware -{ - /** - * Get the host patterns that should be trusted. - * - * @return array<int, string|null> - */ - public function hosts(): array - { - return [ - $this->allSubdomainsOfApplicationUrl(), - ]; - } -} diff --git a/app/Http/Middleware/TrustProxies.php b/app/Http/Middleware/TrustProxies.php deleted file mode 100644 index 3391630..0000000 --- a/app/Http/Middleware/TrustProxies.php +++ /dev/null @@ -1,28 +0,0 @@ -<?php - -namespace App\Http\Middleware; - -use Illuminate\Http\Middleware\TrustProxies as Middleware; -use Illuminate\Http\Request; - -class TrustProxies extends Middleware -{ - /** - * The trusted proxies for this application. - * - * @var array<int, string>|string|null - */ - protected $proxies; - - /** - * The headers that should be used to detect proxies. - * - * @var int - */ - protected $headers = - Request::HEADER_X_FORWARDED_FOR | - Request::HEADER_X_FORWARDED_HOST | - Request::HEADER_X_FORWARDED_PORT | - Request::HEADER_X_FORWARDED_PROTO | - Request::HEADER_X_FORWARDED_AWS_ELB; -} diff --git a/app/Http/Middleware/VerifyCsrfToken.php b/app/Http/Middleware/VerifyCsrfToken.php deleted file mode 100644 index 9e86521..0000000 --- a/app/Http/Middleware/VerifyCsrfToken.php +++ /dev/null @@ -1,17 +0,0 @@ -<?php - -namespace App\Http\Middleware; - -use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware; - -class VerifyCsrfToken extends Middleware -{ - /** - * The URIs that should be excluded from CSRF verification. - * - * @var array<int, string> - */ - protected $except = [ - // - ]; -} diff --git a/app/Models/Environment.php b/app/Models/Environment.php index 6cd061e..d9901c7 100644 --- a/app/Models/Environment.php +++ b/app/Models/Environment.php @@ -16,12 +16,15 @@ class Environment extends MediaModel use HasSlug; use InteractsWithMedia; - protected $casts = [ - 'id' => 'integer', - ]; - protected $guarded = ['id']; + protected function casts(): array + { + return [ + 'id' => 'integer', + ]; + } + public function routeKey(): Attribute { return new Attribute( diff --git a/app/Models/Project.php b/app/Models/Project.php index ea63180..11e6e57 100644 --- a/app/Models/Project.php +++ b/app/Models/Project.php @@ -17,16 +17,19 @@ class Project extends MediaModel use HasSlug; use InteractsWithMedia; - protected $casts = [ - 'id' => 'integer', - ]; - protected $with = [ 'targets', ]; protected $guarded = ['id']; + protected function casts(): array + { + return [ + 'id' => 'integer', + ]; + } + protected static function booted(): void { static::addGlobalScope('currentTeam', function (Builder $builder) { diff --git a/app/Models/Target.php b/app/Models/Target.php index ae7b9af..375abdc 100644 --- a/app/Models/Target.php +++ b/app/Models/Target.php @@ -17,16 +17,19 @@ class Target extends MediaModel use HasSlug; use InteractsWithMedia; - protected $casts = [ - 'id' => 'integer', - ]; - protected $with = [ 'environments', ]; protected $guarded = ['id']; + protected function casts(): array + { + return [ + 'id' => 'integer', + ]; + } + public function routeKey(): Attribute { return new Attribute( diff --git a/app/Models/Team.php b/app/Models/Team.php index 7a2920a..3454477 100644 --- a/app/Models/Team.php +++ b/app/Models/Team.php @@ -12,10 +12,6 @@ class Team extends JetstreamTeam { use HasFactory; - protected $casts = [ - 'personal_team' => 'boolean', - ]; - protected $guarded = []; protected $dispatchesEvents = [ @@ -24,6 +20,13 @@ class Team extends JetstreamTeam 'deleted' => TeamDeleted::class, ]; + protected function casts(): array + { + return [ + 'personal_team' => 'boolean', + ]; + } + public function projects(): \Illuminate\Database\Eloquent\Relations\HasMany { return $this->hasMany(Project::class); diff --git a/app/Models/User.php b/app/Models/User.php index f89aeff..8d1ac57 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -29,11 +29,14 @@ class User extends Authenticatable implements MustVerifyEmail 'two_factor_secret', ]; - protected $casts = [ - 'email_verified_at' => 'datetime', - ]; - protected $appends = [ 'profile_photo_url', ]; + + protected function casts(): array + { + return [ + 'email_verified_at' => 'datetime', + ]; + } } diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 7a66798..62e7212 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -2,10 +2,17 @@ namespace App\Providers; +use App\Models\Target; +use App\Observers\TargetObserver; +use Illuminate\Cache\RateLimiting\Limit; +use Illuminate\Http\Request; +use Illuminate\Support\Facades\RateLimiter; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider { + public const HOME = '/dashboard'; + /** * Register any application services. */ @@ -20,5 +27,20 @@ public function register(): void public function boot(): void { // Model::preventLazyLoading(! app()->isProduction()); + + $this->bootEvent(); + $this->bootRoute(); + } + + public function bootEvent(): void + { + Target::observe(TargetObserver::class); + } + + public function bootRoute(): void + { + RateLimiter::for('api', function (Request $request) { + return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip()); + }); } } diff --git a/app/Providers/AuthServiceProvider.php b/app/Providers/AuthServiceProvider.php deleted file mode 100644 index 743ea39..0000000 --- a/app/Providers/AuthServiceProvider.php +++ /dev/null @@ -1,24 +0,0 @@ -<?php - -namespace App\Providers; - -use App\Models\Project; -use App\Models\Team; -use App\Policies\ProjectPolicy; -use App\Policies\TeamPolicy; -use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider; - -class AuthServiceProvider extends ServiceProvider -{ - protected $policies = [ - Team::class => TeamPolicy::class, - Project::class => ProjectPolicy::class, - ]; - - public function boot(): void - { - $this->registerPolicies(); - - // - } -} diff --git a/app/Providers/BroadcastServiceProvider.php b/app/Providers/BroadcastServiceProvider.php deleted file mode 100644 index 2be04f5..0000000 --- a/app/Providers/BroadcastServiceProvider.php +++ /dev/null @@ -1,19 +0,0 @@ -<?php - -namespace App\Providers; - -use Illuminate\Support\Facades\Broadcast; -use Illuminate\Support\ServiceProvider; - -class BroadcastServiceProvider extends ServiceProvider -{ - /** - * Bootstrap any application services. - */ - public function boot(): void - { - Broadcast::routes(); - - require base_path('routes/channels.php'); - } -} diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php deleted file mode 100644 index b51a83f..0000000 --- a/app/Providers/EventServiceProvider.php +++ /dev/null @@ -1,31 +0,0 @@ -<?php - -namespace App\Providers; - -use App\Models\Target; -use App\Observers\TargetObserver; -use Illuminate\Auth\Events\Registered; -use Illuminate\Auth\Listeners\SendEmailVerificationNotification; -use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider; - -class EventServiceProvider extends ServiceProvider -{ - /** - * The event listener mappings for the application. - * - * @var array<class-string, array<int, class-string>> - */ - protected $listen = [ - Registered::class => [ - SendEmailVerificationNotification::class, - ], - ]; - - /** - * Register any events for your application. - */ - public function boot(): void - { - Target::observe(TargetObserver::class); - } -} diff --git a/app/Providers/RouteServiceProvider.php b/app/Providers/RouteServiceProvider.php deleted file mode 100644 index cedbde5..0000000 --- a/app/Providers/RouteServiceProvider.php +++ /dev/null @@ -1,35 +0,0 @@ -<?php - -namespace App\Providers; - -use Illuminate\Cache\RateLimiting\Limit; -use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider; -use Illuminate\Http\Request; -use Illuminate\Support\Facades\RateLimiter; -use Illuminate\Support\Facades\Route; - -class RouteServiceProvider extends ServiceProvider -{ - public const HOME = '/dashboard'; - - public function boot(): void - { - $this->configureRateLimiting(); - - $this->routes(function () { - Route::prefix('api') - ->middleware('api') - ->group(base_path('routes/api.php')); - - Route::middleware('web') - ->group(base_path('routes/web.php')); - }); - } - - protected function configureRateLimiting(): void - { - RateLimiter::for('api', function (Request $request) { - return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip()); - }); - } -} diff --git a/artisan b/artisan index 67a3329..8e04b42 100755 --- a/artisan +++ b/artisan @@ -1,53 +1,15 @@ #!/usr/bin/env php <?php -define('LARAVEL_START', microtime(true)); +use Symfony\Component\Console\Input\ArgvInput; -/* -|-------------------------------------------------------------------------- -| Register The Auto Loader -|-------------------------------------------------------------------------- -| -| Composer provides a convenient, automatically generated class loader -| for our application. We just need to utilize it! We'll require it -| into the script here so that we do not have to worry about the -| loading of any of our classes manually. It's great to relax. -| -*/ +define('LARAVEL_START', microtime(true)); +// Register the Composer autoloader... require __DIR__.'/vendor/autoload.php'; -$app = require_once __DIR__.'/bootstrap/app.php'; - -/* -|-------------------------------------------------------------------------- -| Run The Artisan Application -|-------------------------------------------------------------------------- -| -| When we run the console application, the current CLI command will be -| executed in this console and the response sent back to a terminal -| or another output device for the developers. Here goes nothing! -| -*/ - -$kernel = $app->make(Illuminate\Contracts\Console\Kernel::class); - -$status = $kernel->handle( - $input = new Symfony\Component\Console\Input\ArgvInput, - new Symfony\Component\Console\Output\ConsoleOutput -); - -/* -|-------------------------------------------------------------------------- -| Shutdown The Application -|-------------------------------------------------------------------------- -| -| Once Artisan has finished running, we will fire off the shutdown events -| so that any final work may be done by the application before we shut -| down the process. This is the last thing to happen to the request. -| -*/ - -$kernel->terminate($input, $status); +// Bootstrap Laravel and handle the command... +$status = (require_once __DIR__.'/bootstrap/app.php') + ->handleCommand(new ArgvInput); exit($status); diff --git a/bootstrap/app.php b/bootstrap/app.php index 037e17d..94c6072 100644 --- a/bootstrap/app.php +++ b/bootstrap/app.php @@ -1,55 +1,33 @@ <?php -/* -|-------------------------------------------------------------------------- -| Create The Application -|-------------------------------------------------------------------------- -| -| The first thing we will do is create a new Laravel application instance -| which serves as the "glue" for all the components of Laravel, and is -| the IoC container for the system binding all of the various parts. -| -*/ - -$app = new Illuminate\Foundation\Application( - $_ENV['APP_BASE_PATH'] ?? dirname(__DIR__) -); - -/* -|-------------------------------------------------------------------------- -| Bind Important Interfaces -|-------------------------------------------------------------------------- -| -| Next, we need to bind some important interfaces into the container so -| we will be able to resolve them when needed. The kernels serve the -| incoming requests to this application from both the web and CLI. -| -*/ - -$app->singleton( - Illuminate\Contracts\Http\Kernel::class, - App\Http\Kernel::class -); - -$app->singleton( - Illuminate\Contracts\Console\Kernel::class, - App\Console\Kernel::class -); - -$app->singleton( - Illuminate\Contracts\Debug\ExceptionHandler::class, - App\Exceptions\Handler::class -); - -/* -|-------------------------------------------------------------------------- -| Return The Application -|-------------------------------------------------------------------------- -| -| This script returns the application instance. The instance is given to -| the calling script so we can separate the building of the instances -| from the actual running of the application and sending responses. -| -*/ - -return $app; +use App\Providers\AppServiceProvider; +use Illuminate\Foundation\Application; +use Illuminate\Foundation\Configuration\Exceptions; +use Illuminate\Foundation\Configuration\Middleware; + +return Application::configure(basePath: dirname(__DIR__)) + ->withProviders() + ->withRouting( + web: __DIR__.'/../routes/web.php', + api: __DIR__.'/../routes/api.php', + commands: __DIR__.'/../routes/console.php', + // channels: __DIR__.'/../routes/channels.php', + health: '/up', + ) + ->withMiddleware(function (Middleware $middleware) { + $middleware->redirectGuestsTo(fn () => route('login')); + $middleware->redirectUsersTo(AppServiceProvider::HOME); + + $middleware->append(\Fruitcake\Cors\HandleCors::class); + + $middleware->web(\Laravel\Jetstream\Http\Middleware\AuthenticateSession::class); + + $middleware->throttleApi(); + + $middleware->alias([ + 'store-marketing-query-params' => \App\Http\Middleware\StoreMarketingQueryParamsMiddleware::class, + ]); + }) + ->withExceptions(function (Exceptions $exceptions) { + // + })->create(); diff --git a/bootstrap/providers.php b/bootstrap/providers.php new file mode 100644 index 0000000..69bc076 --- /dev/null +++ b/bootstrap/providers.php @@ -0,0 +1,8 @@ +<?php + +return [ + App\Providers\AppServiceProvider::class, + App\Providers\MetaTagsServiceProvider::class, + App\Providers\FortifyServiceProvider::class, + App\Providers\JetstreamServiceProvider::class, +]; diff --git a/composer.json b/composer.json index b012f5f..f555824 100644 --- a/composer.json +++ b/composer.json @@ -8,65 +8,64 @@ ], "license": "MIT", "require": { - "php": "^8.1", - "asantibanez/livewire-charts": "^2.3.0", - "blade-ui-kit/blade-heroicons": "^1.3.0", - "blade-ui-kit/blade-icons": "^1.2.0", - "blade-ui-kit/blade-ui-kit": "^0.3.3", - "butschster/meta-tags": "^2.1", + "php": "^8.2", + "asantibanez/livewire-charts": "^3.1", + "blade-ui-kit/blade-heroicons": "^2.3", + "blade-ui-kit/blade-icons": "^1.6", + "blade-ui-kit/blade-ui-kit": "^0.5", + "butschster/meta-tags": "^3.0", "calebporzio/sushi": "^v2.4.0", "fruitcake/laravel-cors": "^v2.0.5", - "guzzlehttp/guzzle": "^7.4.1", - "hammerstone/sidecar": "^v0.3.8", - "jantinnerezo/livewire-alert": "^2.2.3", - "laravel/framework": "^9.0", - "laravel/jetstream": "^2.6.3", - "laravel/octane": "^1.2.0", - "laravel/sanctum": "^v2.14.0", - "laravel/tinker": "^v2.7.0", - "laravel/vapor-core": "^v2.19.1", + "guzzlehttp/guzzle": "^7.8", + "hammerstone/sidecar": "^0.5", + "jantinnerezo/livewire-alert": "^3.0", + "laravel/framework": "^11.21", + "laravel/jetstream": "^5.0", + "laravel/octane": "^2.3", + "laravel/sanctum": "^4.0", + "laravel/tinker": "^2.9", + "laravel/vapor-core": "^2.36", "league/flysystem-aws-s3-v3": "^3.0", - "livewire/livewire": "^v2.10.1", + "livewire/livewire": "^3.3", "lostlink/laravel-robots": "^4.0.0", "pestphp/pest": "^v1.21.1", - "pestphp/pest-plugin-laravel": "^v1.2.0", - "power-components/livewire-powergrid": "^v1.5.1", - "romanzipp/laravel-seo": "^2.3.0", - "sentry/sentry-laravel": "^2.11.0", + "pestphp/pest-plugin-laravel": "^2.2", + "power-components/livewire-powergrid": "^5.0", + "romanzipp/laravel-seo": "^2.7", + "sentry/sentry-laravel": "^4.3", "spatie/browsershot": "^3.52.3", "spatie/crypto": "^2.0.0", - "spatie/laravel-activitylog": "^4.4.0", - "spatie/laravel-medialibrary": "^10.0", + "spatie/laravel-activitylog": "^4.8", + "spatie/laravel-medialibrary": "^11.3", "spatie/laravel-medialibrary-pro": "^2.1.0", - "spatie/laravel-ray": "^1.29.0", - "spatie/laravel-sitemap": "^6.1.0", - "spatie/laravel-sluggable": "^3.3.0", - "staudenmeir/eloquent-has-many-deep": "^1.15", + "spatie/laravel-ray": "^1.35", + "spatie/laravel-sitemap": "^7.2", + "spatie/laravel-sluggable": "^3.6", + "staudenmeir/eloquent-has-many-deep": "^1.20", "wire-elements/modal": "^1.0.4", "wnx/sidecar-browsershot": "dev-main" }, "require-dev": { - "barryvdh/laravel-debugbar": "^v3.6.5", - "barryvdh/laravel-ide-helper": "^2.12", + "barryvdh/laravel-debugbar": "^3.10", + "barryvdh/laravel-ide-helper": "^3.0", "brainmaestro/composer-git-hooks": "dev-master", - "fakerphp/faker": "^v1.17.0", + "fakerphp/faker": "^1.23", "friendsofphp/php-cs-fixer": "^3.6", - "laravel-json-api/testing": "^v1.0.0", - "laravel/sail": "^v1.13.1", - "laravel/vapor-cli": "^v1.36.0", - "mockery/mockery": "^1.5.0", - "nunomaduro/collision": "^6.1", - "nunomaduro/larastan": "^2.0", + "laravel-json-api/testing": "^3.0", + "laravel/sail": "^1.26", + "laravel/vapor-cli": "^1.63", + "mockery/mockery": "^1.6", + "nunomaduro/collision": "^8.0", + "nunomaduro/larastan": "^2.8", "pestphp/pest-plugin-livewire": "^v1.0.0", "phpmd/phpmd": "dev-master", "phpstan/phpstan": "^1.4.2", - "phpunit/phpunit": "^9.5.12", + "phpunit/phpunit": "^10.5", "roave/security-advisories": "dev-latest", "squizlabs/php_codesniffer": "^3.6.2", - "tightenco/duster": "^v0.3.2", + "tightenco/duster": "^1.0", "tightenco/tighten-coding-standard": "^v1.0.2", - "tightenco/tlint": "^v6.2.1", - "spatie/laravel-ignition": "^1.0" + "tightenco/tlint": "^v6.2.1" }, "autoload": { "files": [ @@ -156,7 +155,7 @@ "pestphp/pest-plugin": true } }, - "minimum-stability": "dev", + "minimum-stability": "stable", "prefer-stable": true, "repositories": { "packagist.org": false, diff --git a/config/.gitkeep b/config/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/config/app.php b/config/app.php deleted file mode 100644 index a309820..0000000 --- a/config/app.php +++ /dev/null @@ -1,238 +0,0 @@ -<?php - -return [ - - /* - |-------------------------------------------------------------------------- - | Application Name - |-------------------------------------------------------------------------- - | - | This value is the name of your application. This value is used when the - | framework needs to place the application's name in a notification or - | any other location as required by the application or its packages. - | - */ - - 'name' => env('APP_NAME', 'Laravel'), - - /* - |-------------------------------------------------------------------------- - | Application Environment - |-------------------------------------------------------------------------- - | - | This value determines the "environment" your application is currently - | running in. This may determine how you prefer to configure various - | services the application utilizes. Set this in your ".env" file. - | - */ - - 'env' => env('APP_ENV', 'production'), - - /* - |-------------------------------------------------------------------------- - | Application Debug Mode - |-------------------------------------------------------------------------- - | - | When your application is in debug mode, detailed error messages with - | stack traces will be shown on every error that occurs within your - | application. If disabled, a simple generic error page is shown. - | - */ - - 'debug' => (bool) env('APP_DEBUG', false), - - /* - |-------------------------------------------------------------------------- - | Application URL - |-------------------------------------------------------------------------- - | - | This URL is used by the console to properly generate URLs when using - | the Artisan command line tool. You should set this to the root of - | your application so that it is used when running Artisan tasks. - | - */ - - 'url' => env('APP_URL', 'http://localhost'), - - 'asset_url' => env('ASSET_URL', null), - - /* - |-------------------------------------------------------------------------- - | Application Timezone - |-------------------------------------------------------------------------- - | - | Here you may specify the default timezone for your application, which - | will be used by the PHP date and date-time functions. We have gone - | ahead and set this to a sensible default for you out of the box. - | - */ - - 'timezone' => 'UTC', - - /* - |-------------------------------------------------------------------------- - | Application Locale Configuration - |-------------------------------------------------------------------------- - | - | The application locale determines the default locale that will be used - | by the translation service provider. You are free to set this value - | to any of the locales which will be supported by the application. - | - */ - - 'locale' => 'en', - - /* - |-------------------------------------------------------------------------- - | Application Fallback Locale - |-------------------------------------------------------------------------- - | - | The fallback locale determines the locale to use when the current one - | is not available. You may change the value to correspond to any of - | the language folders that are provided through your application. - | - */ - - 'fallback_locale' => 'en', - - /* - |-------------------------------------------------------------------------- - | Faker Locale - |-------------------------------------------------------------------------- - | - | This locale will be used by the Faker PHP library when generating fake - | data for your database seeds. For example, this will be used to get - | localized telephone numbers, street address information and more. - | - */ - - 'faker_locale' => 'en_US', - - /* - |-------------------------------------------------------------------------- - | Encryption Key - |-------------------------------------------------------------------------- - | - | This key is used by the Illuminate encrypter service and should be set - | to a random, 32 character string, otherwise these encrypted strings - | will not be safe. Please do this before deploying an application! - | - */ - - 'key' => env('APP_KEY'), - - 'cipher' => 'AES-256-CBC', - - /* - |-------------------------------------------------------------------------- - | Autoloaded Service Providers - |-------------------------------------------------------------------------- - | - | The service providers listed here will be automatically loaded on the - | request to your application. Feel free to add your own services to - | this array to grant expanded functionality to your applications. - | - */ - - 'providers' => [ - - /* - * Laravel Framework Service Providers... - */ - Illuminate\Auth\AuthServiceProvider::class, - Illuminate\Broadcasting\BroadcastServiceProvider::class, - Illuminate\Bus\BusServiceProvider::class, - Illuminate\Cache\CacheServiceProvider::class, - Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class, - Illuminate\Cookie\CookieServiceProvider::class, - Illuminate\Database\DatabaseServiceProvider::class, - Illuminate\Encryption\EncryptionServiceProvider::class, - Illuminate\Filesystem\FilesystemServiceProvider::class, - Illuminate\Foundation\Providers\FoundationServiceProvider::class, - Illuminate\Hashing\HashServiceProvider::class, - Illuminate\Mail\MailServiceProvider::class, - Illuminate\Notifications\NotificationServiceProvider::class, - Illuminate\Pagination\PaginationServiceProvider::class, - Illuminate\Pipeline\PipelineServiceProvider::class, - Illuminate\Queue\QueueServiceProvider::class, - Illuminate\Redis\RedisServiceProvider::class, - Illuminate\Auth\Passwords\PasswordResetServiceProvider::class, - Illuminate\Session\SessionServiceProvider::class, - Illuminate\Translation\TranslationServiceProvider::class, - Illuminate\Validation\ValidationServiceProvider::class, - Illuminate\View\ViewServiceProvider::class, - - /* - * Package Service Providers... - */ - - /* - * Application Service Providers... - */ - App\Providers\AppServiceProvider::class, - App\Providers\AuthServiceProvider::class, - // App\Providers\BroadcastServiceProvider::class, - App\Providers\EventServiceProvider::class, - App\Providers\MetaTagsServiceProvider::class, - App\Providers\RouteServiceProvider::class, - App\Providers\FortifyServiceProvider::class, - App\Providers\JetstreamServiceProvider::class, - - ], - - /* - |-------------------------------------------------------------------------- - | Class Aliases - |-------------------------------------------------------------------------- - | - | This array of class aliases will be registered when this application - | is started. However, feel free to register as many as you wish as - | the aliases are "lazy" loaded so they don't hinder performance. - | - */ - - 'aliases' => [ - - 'App' => Illuminate\Support\Facades\App::class, - 'Arr' => Illuminate\Support\Arr::class, - 'Artisan' => Illuminate\Support\Facades\Artisan::class, - 'Auth' => Illuminate\Support\Facades\Auth::class, - 'Blade' => Illuminate\Support\Facades\Blade::class, - 'Broadcast' => Illuminate\Support\Facades\Broadcast::class, - 'Bus' => Illuminate\Support\Facades\Bus::class, - 'Cache' => Illuminate\Support\Facades\Cache::class, - 'Config' => Illuminate\Support\Facades\Config::class, - 'Cookie' => Illuminate\Support\Facades\Cookie::class, - 'Crypt' => Illuminate\Support\Facades\Crypt::class, - 'Date' => Illuminate\Support\Facades\Date::class, - 'DB' => Illuminate\Support\Facades\DB::class, - 'Eloquent' => Illuminate\Database\Eloquent\Model::class, - 'Event' => Illuminate\Support\Facades\Event::class, - 'File' => Illuminate\Support\Facades\File::class, - 'Gate' => Illuminate\Support\Facades\Gate::class, - 'Hash' => Illuminate\Support\Facades\Hash::class, - 'Http' => Illuminate\Support\Facades\Http::class, - 'Js' => Illuminate\Support\Js::class, - 'Lang' => Illuminate\Support\Facades\Lang::class, - 'Log' => Illuminate\Support\Facades\Log::class, - 'Mail' => Illuminate\Support\Facades\Mail::class, - 'Notification' => Illuminate\Support\Facades\Notification::class, - 'Password' => Illuminate\Support\Facades\Password::class, - 'Queue' => Illuminate\Support\Facades\Queue::class, - 'RateLimiter' => Illuminate\Support\Facades\RateLimiter::class, - 'Redirect' => Illuminate\Support\Facades\Redirect::class, - // 'Redis' => Illuminate\Support\Facades\Redis::class, - 'Request' => Illuminate\Support\Facades\Request::class, - 'Response' => Illuminate\Support\Facades\Response::class, - 'Route' => Illuminate\Support\Facades\Route::class, - 'Schema' => Illuminate\Support\Facades\Schema::class, - 'Session' => Illuminate\Support\Facades\Session::class, - 'Storage' => Illuminate\Support\Facades\Storage::class, - 'Str' => Illuminate\Support\Str::class, - 'URL' => Illuminate\Support\Facades\URL::class, - 'Validator' => Illuminate\Support\Facades\Validator::class, - 'View' => Illuminate\Support\Facades\View::class, - - ], - -]; diff --git a/config/auth.php b/config/auth.php deleted file mode 100644 index d8c6cee..0000000 --- a/config/auth.php +++ /dev/null @@ -1,111 +0,0 @@ -<?php - -return [ - - /* - |-------------------------------------------------------------------------- - | Authentication Defaults - |-------------------------------------------------------------------------- - | - | This option controls the default authentication "guard" and password - | reset options for your application. You may change these defaults - | as required, but they're a perfect start for most applications. - | - */ - - 'defaults' => [ - 'guard' => 'web', - 'passwords' => 'users', - ], - - /* - |-------------------------------------------------------------------------- - | Authentication Guards - |-------------------------------------------------------------------------- - | - | Next, you may define every authentication guard for your application. - | Of course, a great default configuration has been defined for you - | here which uses session storage and the Eloquent user provider. - | - | All authentication drivers have a user provider. This defines how the - | users are actually retrieved out of your database or other storage - | mechanisms used by this application to persist your user's data. - | - | Supported: "session" - | - */ - - 'guards' => [ - 'web' => [ - 'driver' => 'session', - 'provider' => 'users', - ], - ], - - /* - |-------------------------------------------------------------------------- - | User Providers - |-------------------------------------------------------------------------- - | - | All authentication drivers have a user provider. This defines how the - | users are actually retrieved out of your database or other storage - | mechanisms used by this application to persist your user's data. - | - | If you have multiple user tables or models you may configure multiple - | sources which represent each model / table. These sources may then - | be assigned to any extra authentication guards you have defined. - | - | Supported: "database", "eloquent" - | - */ - - 'providers' => [ - 'users' => [ - 'driver' => 'eloquent', - 'model' => App\Models\User::class, - ], - - // 'users' => [ - // 'driver' => 'database', - // 'table' => 'users', - // ], - ], - - /* - |-------------------------------------------------------------------------- - | Resetting Passwords - |-------------------------------------------------------------------------- - | - | You may specify multiple password reset configurations if you have more - | than one user table or model in the application and you want to have - | separate password reset settings based on the specific user types. - | - | The expire time is the number of minutes that each reset token will be - | considered valid. This security feature keeps tokens short-lived so - | they have less time to be guessed. You may change this as needed. - | - */ - - 'passwords' => [ - 'users' => [ - 'provider' => 'users', - 'table' => 'password_resets', - 'expire' => 60, - 'throttle' => 60, - ], - ], - - /* - |-------------------------------------------------------------------------- - | Password Confirmation Timeout - |-------------------------------------------------------------------------- - | - | Here you may define the amount of seconds before a password confirmation - | times out and the user is prompted to re-enter their password via the - | confirmation screen. By default, the timeout lasts for three hours. - | - */ - - 'password_timeout' => 10800, - -]; diff --git a/config/broadcasting.php b/config/broadcasting.php deleted file mode 100644 index 67fcbbd..0000000 --- a/config/broadcasting.php +++ /dev/null @@ -1,67 +0,0 @@ -<?php - -return [ - - /* - |-------------------------------------------------------------------------- - | Default Broadcaster - |-------------------------------------------------------------------------- - | - | This option controls the default broadcaster that will be used by the - | framework when an event needs to be broadcast. You may set this to - | any of the connections defined in the "connections" array below. - | - | Supported: "pusher", "ably", "redis", "log", "null" - | - */ - - 'default' => env('BROADCAST_DRIVER', 'null'), - - /* - |-------------------------------------------------------------------------- - | Broadcast Connections - |-------------------------------------------------------------------------- - | - | Here you may define all of the broadcast connections that will be used - | to broadcast events to other systems or over websockets. Samples of - | each available type of connection are provided inside this array. - | - */ - - 'connections' => [ - - 'pusher' => [ - 'driver' => 'pusher', - 'key' => env('PUSHER_APP_KEY'), - 'secret' => env('PUSHER_APP_SECRET'), - 'app_id' => env('PUSHER_APP_ID'), - 'options' => [ - 'cluster' => env('PUSHER_APP_CLUSTER'), - 'useTLS' => true, - ], - 'client_options' => [ - // Guzzle client options: https://docs.guzzlephp.org/en/stable/request-options.html - ], - ], - - 'ably' => [ - 'driver' => 'ably', - 'key' => env('ABLY_KEY'), - ], - - 'redis' => [ - 'driver' => 'redis', - 'connection' => 'default', - ], - - 'log' => [ - 'driver' => 'log', - ], - - 'null' => [ - 'driver' => 'null', - ], - - ], - -]; diff --git a/config/cache.php b/config/cache.php deleted file mode 100644 index e9eb649..0000000 --- a/config/cache.php +++ /dev/null @@ -1,110 +0,0 @@ -<?php - -use Illuminate\Support\Str; - -return [ - - /* - |-------------------------------------------------------------------------- - | Default Cache Store - |-------------------------------------------------------------------------- - | - | This option controls the default cache connection that gets used while - | using this caching library. This connection is used when another is - | not explicitly specified when executing a given caching function. - | - */ - - 'default' => env('CACHE_DRIVER', 'file'), - - /* - |-------------------------------------------------------------------------- - | Cache Stores - |-------------------------------------------------------------------------- - | - | Here you may define all of the cache "stores" for your application as - | well as their drivers. You may even define multiple stores for the - | same cache driver to group types of items stored in your caches. - | - | Supported drivers: "apc", "array", "database", "file", - | "memcached", "redis", "dynamodb", "octane", "null" - | - */ - - 'stores' => [ - - 'apc' => [ - 'driver' => 'apc', - ], - - 'array' => [ - 'driver' => 'array', - 'serialize' => false, - ], - - 'database' => [ - 'driver' => 'database', - 'table' => 'cache', - 'connection' => null, - 'lock_connection' => null, - ], - - 'file' => [ - 'driver' => 'file', - 'path' => storage_path('framework/cache/data'), - ], - - 'memcached' => [ - 'driver' => 'memcached', - 'persistent_id' => env('MEMCACHED_PERSISTENT_ID'), - 'sasl' => [ - env('MEMCACHED_USERNAME'), - env('MEMCACHED_PASSWORD'), - ], - 'options' => [ - // Memcached::OPT_CONNECT_TIMEOUT => 2000, - ], - 'servers' => [ - [ - 'host' => env('MEMCACHED_HOST', '127.0.0.1'), - 'port' => env('MEMCACHED_PORT', 11211), - 'weight' => 100, - ], - ], - ], - - 'redis' => [ - 'driver' => 'redis', - 'connection' => 'cache', - 'lock_connection' => 'default', - ], - - 'dynamodb' => [ - 'driver' => 'dynamodb', - 'key' => env('AWS_ACCESS_KEY_ID'), - 'secret' => env('AWS_SECRET_ACCESS_KEY'), - 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), - 'table' => env('DYNAMODB_CACHE_TABLE', 'cache'), - 'endpoint' => env('DYNAMODB_ENDPOINT'), - ], - - 'octane' => [ - 'driver' => 'octane', - ], - - ], - - /* - |-------------------------------------------------------------------------- - | Cache Key Prefix - |-------------------------------------------------------------------------- - | - | When utilizing a RAM based store such as APC or Memcached, there might - | be other applications utilizing the same cache. So, we'll specify a - | value to get prefixed to all our keys so we can avoid collisions. - | - */ - - 'prefix' => env('CACHE_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_') . '_cache'), - -]; diff --git a/config/cors.php b/config/cors.php deleted file mode 100644 index 8a39e6d..0000000 --- a/config/cors.php +++ /dev/null @@ -1,34 +0,0 @@ -<?php - -return [ - - /* - |-------------------------------------------------------------------------- - | Cross-Origin Resource Sharing (CORS) Configuration - |-------------------------------------------------------------------------- - | - | Here you may configure your settings for cross-origin resource sharing - | or "CORS". This determines what cross-origin operations may execute - | in web browsers. You are free to adjust these settings as needed. - | - | To learn more: https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS - | - */ - - 'paths' => ['api/*', 'sanctum/csrf-cookie'], - - 'allowed_methods' => ['*'], - - 'allowed_origins' => ['*'], - - 'allowed_origins_patterns' => [], - - 'allowed_headers' => ['*'], - - 'exposed_headers' => [], - - 'max_age' => 0, - - 'supports_credentials' => false, - -]; diff --git a/config/database.php b/config/database.php index e0cfa16..1fc8066 100644 --- a/config/database.php +++ b/config/database.php @@ -1,147 +1,10 @@ <?php -use Illuminate\Support\Str; - return [ - /* - |-------------------------------------------------------------------------- - | Default Database Connection Name - |-------------------------------------------------------------------------- - | - | Here you may specify which of the database connections below you wish - | to use as your default connection for all database work. Of course - | you may use many connections at once using the Database library. - | - */ - - 'default' => env('DB_CONNECTION', 'mysql'), - - /* - |-------------------------------------------------------------------------- - | Database Connections - |-------------------------------------------------------------------------- - | - | Here are each of the database connections setup for your application. - | Of course, examples of configuring each database platform that is - | supported by Laravel is shown below to make development simple. - | - | - | All database work in Laravel is done through the PHP PDO facilities - | so make sure you have the driver for your particular database of - | choice installed on your machine before you begin development. - | - */ - - 'connections' => [ - - 'sqlite' => [ - 'driver' => 'sqlite', - 'url' => env('DATABASE_URL'), - 'database' => env('DB_DATABASE', database_path('database.sqlite')), - 'prefix' => '', - 'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true), - ], - - 'mysql' => [ - 'driver' => 'mysql', - 'url' => env('DATABASE_URL'), - 'host' => env('DB_HOST', '127.0.0.1'), - 'port' => env('DB_PORT', '3306'), - 'database' => env('DB_DATABASE', 'forge'), - 'username' => env('DB_USERNAME', 'forge'), - 'password' => env('DB_PASSWORD', ''), - 'unix_socket' => env('DB_SOCKET', ''), - 'charset' => 'utf8mb4', - 'collation' => 'utf8mb4_unicode_ci', - 'prefix' => '', - 'prefix_indexes' => true, - 'strict' => true, - 'engine' => null, - 'options' => extension_loaded('pdo_mysql') ? array_filter([ - PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), - ]) : [], - ], - - 'pgsql' => [ - 'driver' => 'pgsql', - 'url' => env('DATABASE_URL'), - 'host' => env('DB_HOST', '127.0.0.1'), - 'port' => env('DB_PORT', '5432'), - 'database' => env('DB_DATABASE', 'forge'), - 'username' => env('DB_USERNAME', 'forge'), - 'password' => env('DB_PASSWORD', ''), - 'charset' => 'utf8', - 'prefix' => '', - 'prefix_indexes' => true, - 'search_path' => 'public', - 'sslmode' => 'prefer', - ], - - 'sqlsrv' => [ - 'driver' => 'sqlsrv', - 'url' => env('DATABASE_URL'), - 'host' => env('DB_HOST', 'localhost'), - 'port' => env('DB_PORT', '1433'), - 'database' => env('DB_DATABASE', 'forge'), - 'username' => env('DB_USERNAME', 'forge'), - 'password' => env('DB_PASSWORD', ''), - 'charset' => 'utf8', - 'prefix' => '', - 'prefix_indexes' => true, - ], - - ], - - /* - |-------------------------------------------------------------------------- - | Migration Repository Table - |-------------------------------------------------------------------------- - | - | This table keeps track of all the migrations that have already run for - | your application. Using this information, we can determine which of - | the migrations on disk haven't actually been run in the database. - | - */ - - 'migrations' => 'migrations', - - /* - |-------------------------------------------------------------------------- - | Redis Databases - |-------------------------------------------------------------------------- - | - | Redis is an open source, fast, and advanced key-value store that also - | provides a richer body of commands than a typical key-value system - | such as APC or Memcached. Laravel makes it easy to dig right in. - | - */ - - 'redis' => [ - - 'client' => env('REDIS_CLIENT', 'phpredis'), - - 'options' => [ - 'cluster' => env('REDIS_CLUSTER', 'redis'), - 'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_') . '_database_'), - ], - - 'default' => [ - 'url' => env('REDIS_URL'), - 'host' => env('REDIS_HOST', '127.0.0.1'), - 'password' => env('REDIS_PASSWORD', null), - 'port' => env('REDIS_PORT', '6379'), - 'database' => env('REDIS_DB', '0'), - ], - - 'cache' => [ - 'url' => env('REDIS_URL'), - 'host' => env('REDIS_HOST', '127.0.0.1'), - 'password' => env('REDIS_PASSWORD', null), - 'port' => env('REDIS_PORT', '6379'), - 'database' => env('REDIS_CACHE_DB', '1'), - ], - + 'migrations' => [ + 'table' => 'migrations', + 'update_date_on_publish' => false, // disable to preserve original behavior for existing applications ], ]; diff --git a/config/filesystems.php b/config/filesystems.php deleted file mode 100644 index 1364356..0000000 --- a/config/filesystems.php +++ /dev/null @@ -1,73 +0,0 @@ -<?php - -return [ - - /* - |-------------------------------------------------------------------------- - | Default Filesystem Disk - |-------------------------------------------------------------------------- - | - | Here you may specify the default filesystem disk that should be used - | by the framework. The "local" disk, as well as a variety of cloud - | based disks are available to your application. Just store away! - | - */ - - 'default' => env('FILESYSTEM_DISK', 'local'), - - /* - |-------------------------------------------------------------------------- - | Filesystem Disks - |-------------------------------------------------------------------------- - | - | Here you may configure as many filesystem "disks" as you wish, and you - | may even configure multiple disks of the same driver. Defaults have - | been setup for each driver as an example of the required options. - | - | Supported Drivers: "local", "ftp", "sftp", "s3" - | - */ - - 'disks' => [ - - 'local' => [ - 'driver' => 'local', - 'root' => storage_path('app'), - ], - - 'public' => [ - 'driver' => 'local', - 'root' => storage_path('app/public'), - 'url' => env('APP_URL') . '/storage', - 'visibility' => 'public', - ], - - 's3' => [ - 'driver' => 's3', - 'key' => env('AWS_ACCESS_KEY_ID'), - 'secret' => env('AWS_SECRET_ACCESS_KEY'), - 'region' => env('AWS_DEFAULT_REGION'), - 'bucket' => env('AWS_BUCKET'), - 'url' => env('AWS_URL'), - 'endpoint' => env('AWS_ENDPOINT'), - 'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false), - ], - - ], - - /* - |-------------------------------------------------------------------------- - | Symbolic Links - |-------------------------------------------------------------------------- - | - | Here you may configure the symbolic links that will be created when the - | `storage:link` Artisan command is executed. The array keys should be - | the locations of the links and the values should be their targets. - | - */ - - 'links' => [ - public_path('storage') => storage_path('app/public'), - ], - -]; diff --git a/config/fortify.php b/config/fortify.php index 0226449..99dd84c 100644 --- a/config/fortify.php +++ b/config/fortify.php @@ -1,5 +1,6 @@ <?php +use App\Providers\AppServiceProvider; use App\Providers\RouteServiceProvider; use Laravel\Fortify\Features; @@ -61,7 +62,7 @@ | */ - 'home' => RouteServiceProvider::HOME, + 'home' => AppServiceProvider::HOME, /* |-------------------------------------------------------------------------- diff --git a/config/hashing.php b/config/hashing.php deleted file mode 100644 index 8425770..0000000 --- a/config/hashing.php +++ /dev/null @@ -1,52 +0,0 @@ -<?php - -return [ - - /* - |-------------------------------------------------------------------------- - | Default Hash Driver - |-------------------------------------------------------------------------- - | - | This option controls the default hash driver that will be used to hash - | passwords for your application. By default, the bcrypt algorithm is - | used; however, you remain free to modify this option if you wish. - | - | Supported: "bcrypt", "argon", "argon2id" - | - */ - - 'driver' => 'bcrypt', - - /* - |-------------------------------------------------------------------------- - | Bcrypt Options - |-------------------------------------------------------------------------- - | - | Here you may specify the configuration options that should be used when - | passwords are hashed using the Bcrypt algorithm. This will allow you - | to control the amount of time it takes to hash the given password. - | - */ - - 'bcrypt' => [ - 'rounds' => env('BCRYPT_ROUNDS', 10), - ], - - /* - |-------------------------------------------------------------------------- - | Argon Options - |-------------------------------------------------------------------------- - | - | Here you may specify the configuration options that should be used when - | passwords are hashed using the Argon algorithm. These will allow you - | to control the amount of time it takes to hash the given password. - | - */ - - 'argon' => [ - 'memory' => 1024, - 'threads' => 2, - 'time' => 2, - ], - -]; diff --git a/config/jsonapi.php b/config/jsonapi.php index 9a2b4c7..29a43aa 100644 --- a/config/jsonapi.php +++ b/config/jsonapi.php @@ -27,6 +27,6 @@ | class name of the server class. */ 'servers' => [ - 'v20220101' => \App\JsonApi\V20220101\Server::class, + 'v20220101' => App\JsonApi\V20220101\Server::class, ], ]; diff --git a/config/livewire-powergrid.php b/config/livewire-powergrid.php index 911ea41..be4c0c7 100644 --- a/config/livewire-powergrid.php +++ b/config/livewire-powergrid.php @@ -11,7 +11,7 @@ | Configure here the theme of your choice. */ - 'theme' => \PowerComponents\LivewirePowerGrid\Themes\Tailwind::class, + 'theme' => PowerComponents\LivewirePowerGrid\Themes\Tailwind::class, //'theme' => \PowerComponents\LivewirePowerGrid\Themes\Bootstrap5::class, /* @@ -37,7 +37,7 @@ 'flat_piker' => [ 'js' => 'https://cdn.jsdelivr.net/npm/flatpickr', 'css' => 'https://cdn.jsdelivr.net/npm/flatpickr/dist/flatpickr.min.css', - 'translate' => (app()->getLocale() != 'en') ? 'https://npmcdn.com/flatpickr/dist/l10n/' . \Illuminate\Support\Str::substr(app()->getLocale(), 0, 2) . '.js' : '', + 'translate' => (app()->getLocale() != 'en') ? 'https://npmcdn.com/flatpickr/dist/l10n/' . Illuminate\Support\Str::substr(app()->getLocale(), 0, 2) . '.js' : '', 'locales' => [ 'pt_BR' => [ 'locale' => 'pt', diff --git a/config/logging.php b/config/logging.php index cc79032..74bfe36 100644 --- a/config/logging.php +++ b/config/logging.php @@ -6,114 +6,6 @@ return [ - /* - |-------------------------------------------------------------------------- - | Default Log Channel - |-------------------------------------------------------------------------- - | - | This option defines the default log channel that gets used when writing - | messages to the logs. The name specified in this option should match - | one of the channels defined in the "channels" configuration array. - | - */ - - 'default' => env('LOG_CHANNEL', 'stack'), - - /* - |-------------------------------------------------------------------------- - | Deprecations Log Channel - |-------------------------------------------------------------------------- - | - | This option controls the log channel that should be used to log warnings - | regarding deprecated PHP and library features. This allows you to get - | your application ready for upcoming major versions of dependencies. - | - */ - 'deprecations' => env('LOG_DEPRECATIONS_CHANNEL', 'null'), - /* - |-------------------------------------------------------------------------- - | Log Channels - |-------------------------------------------------------------------------- - | - | Here you may configure the log channels for your application. Out of - | the box, Laravel uses the Monolog PHP logging library. This gives - | you a variety of powerful log handlers / formatters to utilize. - | - | Available Drivers: "single", "daily", "slack", "syslog", - | "errorlog", "monolog", - | "custom", "stack" - | - */ - - 'channels' => [ - 'stack' => [ - 'driver' => 'stack', - 'channels' => ['single'], - 'ignore_exceptions' => false, - ], - - 'single' => [ - 'driver' => 'single', - 'path' => storage_path('logs/laravel.log'), - 'level' => env('LOG_LEVEL', 'debug'), - ], - - 'daily' => [ - 'driver' => 'daily', - 'path' => storage_path('logs/laravel.log'), - 'level' => env('LOG_LEVEL', 'debug'), - 'days' => 14, - ], - - 'slack' => [ - 'driver' => 'slack', - 'url' => env('LOG_SLACK_WEBHOOK_URL'), - 'username' => 'Laravel Log', - 'emoji' => ':boom:', - 'level' => env('LOG_LEVEL', 'critical'), - ], - - 'papertrail' => [ - 'driver' => 'monolog', - 'level' => env('LOG_LEVEL', 'debug'), - 'handler' => env('LOG_PAPERTRAIL_HANDLER', SyslogUdpHandler::class), - 'handler_with' => [ - 'host' => env('PAPERTRAIL_URL'), - 'port' => env('PAPERTRAIL_PORT'), - 'connectionString' => 'tls://' . env('PAPERTRAIL_URL') . ':' . env('PAPERTRAIL_PORT'), - ], - ], - - 'stderr' => [ - 'driver' => 'monolog', - 'level' => env('LOG_LEVEL', 'debug'), - 'handler' => StreamHandler::class, - 'formatter' => env('LOG_STDERR_FORMATTER'), - 'with' => [ - 'stream' => 'php://stderr', - ], - ], - - 'syslog' => [ - 'driver' => 'syslog', - 'level' => env('LOG_LEVEL', 'debug'), - ], - - 'errorlog' => [ - 'driver' => 'errorlog', - 'level' => env('LOG_LEVEL', 'debug'), - ], - - 'null' => [ - 'driver' => 'monolog', - 'handler' => NullHandler::class, - ], - - 'emergency' => [ - 'path' => storage_path('logs/laravel.log'), - ], - ], - ]; diff --git a/config/mail.php b/config/mail.php index 87b6fe3..c6a0657 100644 --- a/config/mail.php +++ b/config/mail.php @@ -2,116 +2,10 @@ return [ - /* - |-------------------------------------------------------------------------- - | Default Mailer - |-------------------------------------------------------------------------- - | - | This option controls the default mailer that is used to send any email - | messages sent by your application. Alternative mailers may be setup - | and used as needed; however, this mailer will be used by default. - | - */ - - 'default' => env('MAIL_MAILER', 'smtp'), - - /* - |-------------------------------------------------------------------------- - | Mailer Configurations - |-------------------------------------------------------------------------- - | - | Here you may configure all of the mailers used by your application plus - | their respective settings. Several examples have been configured for - | you and you are free to add your own as your application requires. - | - | Laravel supports a variety of mail "transport" drivers to be used while - | sending an e-mail. You will specify which one you are using for your - | mailers below. You are free to add additional mailers as required. - | - | Supported: "smtp", "sendmail", "mailgun", "ses", - | "postmark", "log", "array", "failover" - | - */ - 'mailers' => [ - 'smtp' => [ - 'transport' => 'smtp', - 'host' => env('MAIL_HOST', 'smtp.mailgun.org'), - 'port' => env('MAIL_PORT', 587), - 'encryption' => env('MAIL_ENCRYPTION', 'tls'), - 'username' => env('MAIL_USERNAME'), - 'password' => env('MAIL_PASSWORD'), - 'timeout' => null, - ], - - 'ses' => [ - 'transport' => 'ses', - ], - 'mailgun' => [ 'transport' => 'mailgun', ], - - 'postmark' => [ - 'transport' => 'postmark', - ], - - 'sendmail' => [ - 'transport' => 'sendmail', - 'path' => env('MAIL_SENDMAIL_PATH', '/usr/sbin/sendmail -t -i'), - ], - - 'log' => [ - 'transport' => 'log', - 'channel' => env('MAIL_LOG_CHANNEL'), - ], - - 'array' => [ - 'transport' => 'array', - ], - - 'failover' => [ - 'transport' => 'failover', - 'mailers' => [ - 'smtp', - 'log', - ], - ], - ], - - /* - |-------------------------------------------------------------------------- - | Global "From" Address - |-------------------------------------------------------------------------- - | - | You may wish for all e-mails sent by your application to be sent from - | the same address. Here, you may specify a name and address that is - | used globally for all e-mails that are sent by your application. - | - */ - - 'from' => [ - 'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'), - 'name' => env('MAIL_FROM_NAME', 'Example'), - ], - - /* - |-------------------------------------------------------------------------- - | Markdown Mail Settings - |-------------------------------------------------------------------------- - | - | If you are using Markdown based email rendering, you may configure your - | theme and component paths here, allowing you to customize the design - | of the emails. Or, you may simply stick with the Laravel defaults! - | - */ - - 'markdown' => [ - 'theme' => 'default', - - 'paths' => [ - resource_path('views/vendor/mail'), - ], ], ]; diff --git a/config/queue.php b/config/queue.php deleted file mode 100644 index 25ea5a8..0000000 --- a/config/queue.php +++ /dev/null @@ -1,93 +0,0 @@ -<?php - -return [ - - /* - |-------------------------------------------------------------------------- - | Default Queue Connection Name - |-------------------------------------------------------------------------- - | - | Laravel's queue API supports an assortment of back-ends via a single - | API, giving you convenient access to each back-end using the same - | syntax for every one. Here you may define a default connection. - | - */ - - 'default' => env('QUEUE_CONNECTION', 'sync'), - - /* - |-------------------------------------------------------------------------- - | Queue Connections - |-------------------------------------------------------------------------- - | - | Here you may configure the connection information for each server that - | is used by your application. A default configuration has been added - | for each back-end shipped with Laravel. You are free to add more. - | - | Drivers: "sync", "database", "beanstalkd", "sqs", "redis", "null" - | - */ - - 'connections' => [ - - 'sync' => [ - 'driver' => 'sync', - ], - - 'database' => [ - 'driver' => 'database', - 'table' => 'jobs', - 'queue' => 'default', - 'retry_after' => 90, - 'after_commit' => false, - ], - - 'beanstalkd' => [ - 'driver' => 'beanstalkd', - 'host' => 'localhost', - 'queue' => 'default', - 'retry_after' => 90, - 'block_for' => 0, - 'after_commit' => false, - ], - - 'sqs' => [ - 'driver' => 'sqs', - 'key' => env('AWS_ACCESS_KEY_ID'), - 'secret' => env('AWS_SECRET_ACCESS_KEY'), - 'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'), - 'queue' => env('SQS_QUEUE', 'default'), - 'suffix' => env('SQS_SUFFIX'), - 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), - 'after_commit' => false, - ], - - 'redis' => [ - 'driver' => 'redis', - 'connection' => 'default', - 'queue' => env('REDIS_QUEUE', 'default'), - 'retry_after' => 90, - 'block_for' => null, - 'after_commit' => false, - ], - - ], - - /* - |-------------------------------------------------------------------------- - | Failed Queue Jobs - |-------------------------------------------------------------------------- - | - | These options configure the behavior of failed queue job logging so you - | can control which database and table are used to store the jobs that - | have failed. You may change them to any database / table you wish. - | - */ - - 'failed' => [ - 'driver' => env('QUEUE_FAILED_DRIVER', 'database-uuids'), - 'database' => env('DB_CONNECTION', 'mysql'), - 'table' => 'failed_jobs', - ], - -]; diff --git a/config/sanctum.php b/config/sanctum.php index 693c6de..764a82f 100644 --- a/config/sanctum.php +++ b/config/sanctum.php @@ -1,5 +1,7 @@ <?php +use Laravel\Sanctum\Sanctum; + return [ /* @@ -16,7 +18,7 @@ 'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', sprintf( '%s%s', 'localhost,localhost:3000,127.0.0.1,127.0.0.1:8000,::1', - env('APP_URL') ? ',' . parse_url(env('APP_URL'), PHP_URL_HOST) : '' + Sanctum::currentApplicationUrlWithPort() ))), /* @@ -39,13 +41,28 @@ |-------------------------------------------------------------------------- | | This value controls the number of minutes until an issued token will be - | considered expired. If this value is null, personal access tokens do - | not expire. This won't tweak the lifetime of first-party sessions. + | considered expired. This will override any values set in the token's + | "expires_at" attribute, but first-party sessions are not affected. | */ 'expiration' => null, + /* + |-------------------------------------------------------------------------- + | Token Prefix + |-------------------------------------------------------------------------- + | + | Sanctum can prefix new tokens in order to take advantage of numerous + | security scanning initiatives maintained by open source platforms + | that notify developers if they commit tokens into repositories. + | + | See: https://docs.github.com/en/code-security/secret-scanning/about-secret-scanning + | + */ + + 'token_prefix' => env('SANCTUM_TOKEN_PREFIX', ''), + /* |-------------------------------------------------------------------------- | Sanctum Middleware @@ -58,8 +75,9 @@ */ 'middleware' => [ - 'verify_csrf_token' => App\Http\Middleware\VerifyCsrfToken::class, - 'encrypt_cookies' => App\Http\Middleware\EncryptCookies::class, + 'authenticate_session' => Laravel\Sanctum\Http\Middleware\AuthenticateSession::class, + 'encrypt_cookies' => Illuminate\Cookie\Middleware\EncryptCookies::class, + 'validate_csrf_token' => Illuminate\Foundation\Http\Middleware\ValidateCsrfToken::class, ], ]; diff --git a/config/services.php b/config/services.php index 2a1d616..2639e01 100644 --- a/config/services.php +++ b/config/services.php @@ -2,32 +2,10 @@ return [ - /* - |-------------------------------------------------------------------------- - | Third Party Services - |-------------------------------------------------------------------------- - | - | This file is for storing the credentials for third party services such - | as Mailgun, Postmark, AWS and more. This file provides the de facto - | location for this type of information, allowing packages to have - | a conventional file to locate the various service credentials. - | - */ - 'mailgun' => [ 'domain' => env('MAILGUN_DOMAIN'), 'secret' => env('MAILGUN_SECRET'), 'endpoint' => env('MAILGUN_ENDPOINT', 'api.mailgun.net'), ], - 'postmark' => [ - 'token' => env('POSTMARK_TOKEN'), - ], - - 'ses' => [ - 'key' => env('AWS_ACCESS_KEY_ID'), - 'secret' => env('AWS_SECRET_ACCESS_KEY'), - 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), - ], - ]; diff --git a/config/session.php b/config/session.php deleted file mode 100644 index 1b99f22..0000000 --- a/config/session.php +++ /dev/null @@ -1,201 +0,0 @@ -<?php - -use Illuminate\Support\Str; - -return [ - - /* - |-------------------------------------------------------------------------- - | Default Session Driver - |-------------------------------------------------------------------------- - | - | This option controls the default session "driver" that will be used on - | requests. By default, we will use the lightweight native driver but - | you may specify any of the other wonderful drivers provided here. - | - | Supported: "file", "cookie", "database", "apc", - | "memcached", "redis", "dynamodb", "array" - | - */ - - 'driver' => env('SESSION_DRIVER', 'file'), - - /* - |-------------------------------------------------------------------------- - | Session Lifetime - |-------------------------------------------------------------------------- - | - | Here you may specify the number of minutes that you wish the session - | to be allowed to remain idle before it expires. If you want them - | to immediately expire on the browser closing, set that option. - | - */ - - 'lifetime' => env('SESSION_LIFETIME', 120), - - 'expire_on_close' => false, - - /* - |-------------------------------------------------------------------------- - | Session Encryption - |-------------------------------------------------------------------------- - | - | This option allows you to easily specify that all of your session data - | should be encrypted before it is stored. All encryption will be run - | automatically by Laravel and you can use the Session like normal. - | - */ - - 'encrypt' => false, - - /* - |-------------------------------------------------------------------------- - | Session File Location - |-------------------------------------------------------------------------- - | - | When using the native session driver, we need a location where session - | files may be stored. A default has been set for you but a different - | location may be specified. This is only needed for file sessions. - | - */ - - 'files' => storage_path('framework/sessions'), - - /* - |-------------------------------------------------------------------------- - | Session Database Connection - |-------------------------------------------------------------------------- - | - | When using the "database" or "redis" session drivers, you may specify a - | connection that should be used to manage these sessions. This should - | correspond to a connection in your database configuration options. - | - */ - - 'connection' => env('SESSION_CONNECTION'), - - /* - |-------------------------------------------------------------------------- - | Session Database Table - |-------------------------------------------------------------------------- - | - | When using the "database" session driver, you may specify the table we - | should use to manage the sessions. Of course, a sensible default is - | provided for you; however, you are free to change this as needed. - | - */ - - 'table' => 'sessions', - - /* - |-------------------------------------------------------------------------- - | Session Cache Store - |-------------------------------------------------------------------------- - | - | While using one of the framework's cache driven session backends you may - | list a cache store that should be used for these sessions. This value - | must match with one of the application's configured cache "stores". - | - | Affects: "apc", "dynamodb", "memcached", "redis" - | - */ - - 'store' => env('SESSION_STORE'), - - /* - |-------------------------------------------------------------------------- - | Session Sweeping Lottery - |-------------------------------------------------------------------------- - | - | Some session drivers must manually sweep their storage location to get - | rid of old sessions from storage. Here are the chances that it will - | happen on a given request. By default, the odds are 2 out of 100. - | - */ - - 'lottery' => [2, 100], - - /* - |-------------------------------------------------------------------------- - | Session Cookie Name - |-------------------------------------------------------------------------- - | - | Here you may change the name of the cookie used to identify a session - | instance by ID. The name specified here will get used every time a - | new session cookie is created by the framework for every driver. - | - */ - - 'cookie' => env( - 'SESSION_COOKIE', - Str::slug(env('APP_NAME', 'laravel'), '_') . '_session' - ), - - /* - |-------------------------------------------------------------------------- - | Session Cookie Path - |-------------------------------------------------------------------------- - | - | The session cookie path determines the path for which the cookie will - | be regarded as available. Typically, this will be the root path of - | your application but you are free to change this when necessary. - | - */ - - 'path' => '/', - - /* - |-------------------------------------------------------------------------- - | Session Cookie Domain - |-------------------------------------------------------------------------- - | - | Here you may change the domain of the cookie used to identify a session - | in your application. This will determine which domains the cookie is - | available to in your application. A sensible default has been set. - | - */ - - 'domain' => env('SESSION_DOMAIN'), - - /* - |-------------------------------------------------------------------------- - | HTTPS Only Cookies - |-------------------------------------------------------------------------- - | - | By setting this option to true, session cookies will only be sent back - | to the server if the browser has a HTTPS connection. This will keep - | the cookie from being sent to you when it can't be done securely. - | - */ - - 'secure' => env('SESSION_SECURE_COOKIE'), - - /* - |-------------------------------------------------------------------------- - | HTTP Access Only - |-------------------------------------------------------------------------- - | - | Setting this value to true will prevent JavaScript from accessing the - | value of the cookie and the cookie will only be accessible through - | the HTTP protocol. You are free to modify this option if needed. - | - */ - - 'http_only' => true, - - /* - |-------------------------------------------------------------------------- - | Same-Site Cookies - |-------------------------------------------------------------------------- - | - | This option determines how your cookies behave when cross-site requests - | take place, and can be used to mitigate CSRF attacks. By default, we - | will set this value to "lax" since this is a secure default value. - | - | Supported: "lax", "strict", "none", null - | - */ - - 'same_site' => 'lax', - -]; diff --git a/config/view.php b/config/view.php deleted file mode 100644 index 22b8a18..0000000 --- a/config/view.php +++ /dev/null @@ -1,36 +0,0 @@ -<?php - -return [ - - /* - |-------------------------------------------------------------------------- - | View Storage Paths - |-------------------------------------------------------------------------- - | - | Most templating systems load templates from disk. Here you may specify - | an array of paths that should be checked for your views. Of course - | the usual Laravel view path has already been registered for you. - | - */ - - 'paths' => [ - resource_path('views'), - ], - - /* - |-------------------------------------------------------------------------- - | Compiled View Path - |-------------------------------------------------------------------------- - | - | This option determines where all the compiled Blade templates will be - | stored for your application. Typically, this is within the storage - | directory. However, as usual, you are free to change this value. - | - */ - - 'compiled' => env( - 'VIEW_COMPILED_PATH', - realpath(storage_path('framework/views')) - ), - -]; diff --git a/database/factories/UserFactory.php b/database/factories/UserFactory.php index 93b6923..b0685ab 100644 --- a/database/factories/UserFactory.php +++ b/database/factories/UserFactory.php @@ -24,7 +24,7 @@ public function definition(): array /** * Indicate that the model's email address should be unverified. * - * @return \Illuminate\Database\Eloquent\Factories\Factory + * @return Factory */ public function unverified() { diff --git a/database/migrations/2021_12_26_144900_create_projects_table.php b/database/migrations/2021_12_26_144900_create_projects_table.php index f57bc05..0841231 100644 --- a/database/migrations/2021_12_26_144900_create_projects_table.php +++ b/database/migrations/2021_12_26_144900_create_projects_table.php @@ -9,7 +9,7 @@ public function up(): void { Schema::create('projects', function (Blueprint $table) { $table->id(); - $table->foreignIdFor(\App\Models\Team::class)->index()->constrained()->cascadeOnDelete(); + $table->foreignIdFor(App\Models\Team::class)->index()->constrained()->cascadeOnDelete(); $table->string('slug'); $table->string('name'); $table->text('variables')->nullable(); diff --git a/database/migrations/2021_12_26_144922_create_targets_table.php b/database/migrations/2021_12_26_144922_create_targets_table.php index 5cb70c2..d5dffb2 100644 --- a/database/migrations/2021_12_26_144922_create_targets_table.php +++ b/database/migrations/2021_12_26_144922_create_targets_table.php @@ -9,7 +9,7 @@ public function up(): void { Schema::create('targets', function (Blueprint $table) { $table->id(); - $table->foreignIdFor(\App\Models\Project::class)->index()->constrained()->cascadeOnDelete(); + $table->foreignIdFor(App\Models\Project::class)->index()->constrained()->cascadeOnDelete(); $table->string('slug'); $table->string('name'); $table->string('color')->nullable(); diff --git a/database/migrations/2021_12_26_145033_create_environments_table.php b/database/migrations/2021_12_26_145033_create_environments_table.php index 4334fde..8805eea 100644 --- a/database/migrations/2021_12_26_145033_create_environments_table.php +++ b/database/migrations/2021_12_26_145033_create_environments_table.php @@ -9,7 +9,7 @@ public function up(): void { Schema::create('environments', function (Blueprint $table) { $table->id(); - $table->foreignIdFor(\App\Models\Target::class)->index()->constrained()->cascadeOnDelete(); + $table->foreignIdFor(App\Models\Target::class)->index()->constrained()->cascadeOnDelete(); $table->integer('parent_id')->index()->nullable(); $table->string('slug'); $table->string('name'); diff --git a/database/migrations/2021_12_28_210730_create_activities_table.php b/database/migrations/2021_12_28_210730_create_activities_table.php index f3220d5..4ce639a 100644 --- a/database/migrations/2021_12_28_210730_create_activities_table.php +++ b/database/migrations/2021_12_28_210730_create_activities_table.php @@ -9,11 +9,11 @@ public function up(): void { Schema::create('activities', function (Blueprint $table) { $table->id(); - $table->foreignIdFor(\App\Models\Team::class)->index()->constrained()->cascadeOnDelete(); - $table->foreignIdFor(\App\Models\User::class)->index()->constrained()->cascadeOnDelete(); - $table->foreignIdFor(\App\Models\Project::class)->index()->nullable()->constrained()->cascadeOnDelete(); - $table->foreignIdFor(\App\Models\Target::class)->index()->nullable()->constrained()->cascadeOnDelete(); - $table->foreignIdFor(\App\Models\Environment::class)->index()->nullable()->constrained()->cascadeOnDelete(); + $table->foreignIdFor(App\Models\Team::class)->index()->constrained()->cascadeOnDelete(); + $table->foreignIdFor(App\Models\User::class)->index()->constrained()->cascadeOnDelete(); + $table->foreignIdFor(App\Models\Project::class)->index()->nullable()->constrained()->cascadeOnDelete(); + $table->foreignIdFor(App\Models\Target::class)->index()->nullable()->constrained()->cascadeOnDelete(); + $table->foreignIdFor(App\Models\Environment::class)->index()->nullable()->constrained()->cascadeOnDelete(); $table->string('transaction'); $table->string('status'); $table->string('reason')->nullable(); diff --git a/database/migrations/2022_01_08_001204_create_activity_log_table.php b/database/migrations/2022_01_08_001204_create_activity_log_table.php index 3af1142..de5edcb 100644 --- a/database/migrations/2022_01_08_001204_create_activity_log_table.php +++ b/database/migrations/2022_01_08_001204_create_activity_log_table.php @@ -9,7 +9,7 @@ public function up(): void { Schema::connection(config('activitylog.database_connection'))->create(config('activitylog.table_name'), function (Blueprint $table) { $table->bigIncrements('id'); - $table->foreignIdFor(\App\Models\Team::class)->index()->constrained()->cascadeOnDelete(); + $table->foreignIdFor(App\Models\Team::class)->index()->constrained()->cascadeOnDelete(); $table->string('log_name')->nullable(); $table->text('description'); $table->nullableMorphs('subject', 'subject'); diff --git a/database/migrations/2024_08_23_000000_rename_password_resets_table.php b/database/migrations/2024_08_23_000000_rename_password_resets_table.php new file mode 100644 index 0000000..d2f7e43 --- /dev/null +++ b/database/migrations/2024_08_23_000000_rename_password_resets_table.php @@ -0,0 +1,27 @@ +<?php + +use Illuminate\Database\Migrations\Migration; +use Illuminate\Database\Schema\Blueprint; +use Illuminate\Support\Facades\Schema; + +return new class extends Migration { + /** + * Run the migrations. + * + * @return void + */ + public function up(): void + { + Schema::rename('password_resets', 'password_reset_tokens'); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down(): void + { + Schema::rename('password_reset_tokens', 'password_resets'); + } +}; diff --git a/lang/en.json b/lang/en.json deleted file mode 100644 index 577680d..0000000 --- a/lang/en.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "The :attribute must contain at least one letter.": "The :attribute must contain at least one letter.", - "The :attribute must contain at least one number.": "The :attribute must contain at least one number.", - "The :attribute must contain at least one symbol.": "The :attribute must contain at least one symbol.", - "The :attribute must contain at least one uppercase and one lowercase letter.": "The :attribute must contain at least one uppercase and one lowercase letter.", - "The given :attribute has appeared in a data leak. Please choose a different :attribute.": "The given :attribute has appeared in a data leak. Please choose a different :attribute." -} diff --git a/lang/en/auth.php b/lang/en/auth.php deleted file mode 100644 index 6598e2c..0000000 --- a/lang/en/auth.php +++ /dev/null @@ -1,20 +0,0 @@ -<?php - -return [ - - /* - |-------------------------------------------------------------------------- - | Authentication Language Lines - |-------------------------------------------------------------------------- - | - | The following language lines are used during authentication for various - | messages that we need to display to the user. You are free to modify - | these language lines according to your application's requirements. - | - */ - - 'failed' => 'These credentials do not match our records.', - 'password' => 'The provided password is incorrect.', - 'throttle' => 'Too many login attempts. Please try again in :seconds seconds.', - -]; diff --git a/lang/en/pagination.php b/lang/en/pagination.php deleted file mode 100644 index d481411..0000000 --- a/lang/en/pagination.php +++ /dev/null @@ -1,19 +0,0 @@ -<?php - -return [ - - /* - |-------------------------------------------------------------------------- - | Pagination Language Lines - |-------------------------------------------------------------------------- - | - | The following language lines are used by the paginator library to build - | the simple pagination links. You are free to change them to anything - | you want to customize your views to better match your application. - | - */ - - 'previous' => '« Previous', - 'next' => 'Next »', - -]; diff --git a/lang/en/passwords.php b/lang/en/passwords.php deleted file mode 100644 index 2345a56..0000000 --- a/lang/en/passwords.php +++ /dev/null @@ -1,22 +0,0 @@ -<?php - -return [ - - /* - |-------------------------------------------------------------------------- - | Password Reset Language Lines - |-------------------------------------------------------------------------- - | - | The following language lines are the default lines which match reasons - | that are given by the password broker for a password update attempt - | has failed, such as for an invalid token or invalid new password. - | - */ - - 'reset' => 'Your password has been reset!', - 'sent' => 'We have emailed your password reset link!', - 'throttled' => 'Please wait before retrying.', - 'token' => 'This password reset token is invalid.', - 'user' => "We can't find a user with that email address.", - -]; diff --git a/lang/en/validation.php b/lang/en/validation.php deleted file mode 100644 index 4707f1a..0000000 --- a/lang/en/validation.php +++ /dev/null @@ -1,163 +0,0 @@ -<?php - -return [ - - /* - |-------------------------------------------------------------------------- - | Validation Language Lines - |-------------------------------------------------------------------------- - | - | The following language lines contain the default error messages used by - | the validator class. Some of these rules have multiple versions such - | as the size rules. Feel free to tweak each of these messages here. - | - */ - - 'accepted' => 'The :attribute must be accepted.', - 'accepted_if' => 'The :attribute must be accepted when :other is :value.', - 'active_url' => 'The :attribute is not a valid URL.', - 'after' => 'The :attribute must be a date after :date.', - 'after_or_equal' => 'The :attribute must be a date after or equal to :date.', - 'alpha' => 'The :attribute must only contain letters.', - 'alpha_dash' => 'The :attribute must only contain letters, numbers, dashes and underscores.', - 'alpha_num' => 'The :attribute must only contain letters and numbers.', - 'array' => 'The :attribute must be an array.', - 'before' => 'The :attribute must be a date before :date.', - 'before_or_equal' => 'The :attribute must be a date before or equal to :date.', - 'between' => [ - 'array' => 'The :attribute must have between :min and :max items.', - 'file' => 'The :attribute must be between :min and :max kilobytes.', - 'numeric' => 'The :attribute must be between :min and :max.', - 'string' => 'The :attribute must be between :min and :max characters.', - ], - 'boolean' => 'The :attribute field must be true or false.', - 'confirmed' => 'The :attribute confirmation does not match.', - 'current_password' => 'The password is incorrect.', - 'date' => 'The :attribute is not a valid date.', - 'date_equals' => 'The :attribute must be a date equal to :date.', - 'date_format' => 'The :attribute does not match the format :format.', - 'declined' => 'The :attribute must be declined.', - 'declined_if' => 'The :attribute must be declined when :other is :value.', - 'different' => 'The :attribute and :other must be different.', - 'digits' => 'The :attribute must be :digits digits.', - 'digits_between' => 'The :attribute must be between :min and :max digits.', - 'dimensions' => 'The :attribute has invalid image dimensions.', - 'distinct' => 'The :attribute field has a duplicate value.', - 'email' => 'The :attribute must be a valid email address.', - 'ends_with' => 'The :attribute must end with one of the following: :values.', - 'enum' => 'The selected :attribute is invalid.', - 'exists' => 'The selected :attribute is invalid.', - 'file' => 'The :attribute must be a file.', - 'filled' => 'The :attribute field must have a value.', - 'gt' => [ - 'array' => 'The :attribute must have more than :value items.', - 'file' => 'The :attribute must be greater than :value kilobytes.', - 'numeric' => 'The :attribute must be greater than :value.', - 'string' => 'The :attribute must be greater than :value characters.', - ], - 'gte' => [ - 'array' => 'The :attribute must have :value items or more.', - 'file' => 'The :attribute must be greater than or equal to :value kilobytes.', - 'numeric' => 'The :attribute must be greater than or equal to :value.', - 'string' => 'The :attribute must be greater than or equal to :value characters.', - ], - 'image' => 'The :attribute must be an image.', - 'in' => 'The selected :attribute is invalid.', - 'in_array' => 'The :attribute field does not exist in :other.', - 'integer' => 'The :attribute must be an integer.', - 'ip' => 'The :attribute must be a valid IP address.', - 'ipv4' => 'The :attribute must be a valid IPv4 address.', - 'ipv6' => 'The :attribute must be a valid IPv6 address.', - 'json' => 'The :attribute must be a valid JSON string.', - 'lt' => [ - 'array' => 'The :attribute must have less than :value items.', - 'file' => 'The :attribute must be less than :value kilobytes.', - 'numeric' => 'The :attribute must be less than :value.', - 'string' => 'The :attribute must be less than :value characters.', - ], - 'lte' => [ - 'array' => 'The :attribute must not have more than :value items.', - 'file' => 'The :attribute must be less than or equal to :value kilobytes.', - 'numeric' => 'The :attribute must be less than or equal to :value.', - 'string' => 'The :attribute must be less than or equal to :value characters.', - ], - 'mac_address' => 'The :attribute must be a valid MAC address.', - 'max' => [ - 'array' => 'The :attribute must not have more than :max items.', - 'file' => 'The :attribute must not be greater than :max kilobytes.', - 'numeric' => 'The :attribute must not be greater than :max.', - 'string' => 'The :attribute must not be greater than :max characters.', - ], - 'mimes' => 'The :attribute must be a file of type: :values.', - 'mimetypes' => 'The :attribute must be a file of type: :values.', - 'min' => [ - 'array' => 'The :attribute must have at least :min items.', - 'file' => 'The :attribute must be at least :min kilobytes.', - 'numeric' => 'The :attribute must be at least :min.', - 'string' => 'The :attribute must be at least :min characters.', - ], - 'multiple_of' => 'The :attribute must be a multiple of :value.', - 'not_in' => 'The selected :attribute is invalid.', - 'not_regex' => 'The :attribute format is invalid.', - 'numeric' => 'The :attribute must be a number.', - 'password' => 'The password is incorrect.', - 'present' => 'The :attribute field must be present.', - 'prohibited' => 'The :attribute field is prohibited.', - 'prohibited_if' => 'The :attribute field is prohibited when :other is :value.', - 'prohibited_unless' => 'The :attribute field is prohibited unless :other is in :values.', - 'prohibits' => 'The :attribute field prohibits :other from being present.', - 'regex' => 'The :attribute format is invalid.', - 'required' => 'The :attribute field is required.', - 'required_array_keys' => 'The :attribute field must contain entries for: :values.', - 'required_if' => 'The :attribute field is required when :other is :value.', - 'required_unless' => 'The :attribute field is required unless :other is in :values.', - 'required_with' => 'The :attribute field is required when :values is present.', - 'required_with_all' => 'The :attribute field is required when :values are present.', - 'required_without' => 'The :attribute field is required when :values is not present.', - 'required_without_all' => 'The :attribute field is required when none of :values are present.', - 'same' => 'The :attribute and :other must match.', - 'size' => [ - 'array' => 'The :attribute must contain :size items.', - 'file' => 'The :attribute must be :size kilobytes.', - 'numeric' => 'The :attribute must be :size.', - 'string' => 'The :attribute must be :size characters.', - ], - 'starts_with' => 'The :attribute must start with one of the following: :values.', - 'string' => 'The :attribute must be a string.', - 'timezone' => 'The :attribute must be a valid timezone.', - 'unique' => 'The :attribute has already been taken.', - 'uploaded' => 'The :attribute failed to upload.', - 'url' => 'The :attribute must be a valid URL.', - 'uuid' => 'The :attribute must be a valid UUID.', - - /* - |-------------------------------------------------------------------------- - | Custom Validation Language Lines - |-------------------------------------------------------------------------- - | - | Here you may specify custom validation messages for attributes using the - | convention "attribute.rule" to name the lines. This makes it quick to - | specify a specific custom language line for a given attribute rule. - | - */ - - 'custom' => [ - 'attribute-name' => [ - 'rule-name' => 'custom-message', - ], - ], - - /* - |-------------------------------------------------------------------------- - | Custom Validation Attributes - |-------------------------------------------------------------------------- - | - | The following language lines are used to swap our attribute placeholder - | with something more reader friendly such as "E-Mail Address" instead - | of "email". This simply helps us make our message more expressive. - | - */ - - 'attributes' => [], - -]; diff --git a/phpunit.xml b/phpunit.xml index 69168d3..9756ef2 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -20,7 +20,7 @@ <php> <env name="APP_ENV" value="testing"/> <env name="BCRYPT_ROUNDS" value="4"/> - <env name="CACHE_DRIVER" value="array"/> + <env name="CACHE_STORE" value="array"/> <env name="DB_CONNECTION" value="sqlite"/> <env name="DB_DATABASE" value=":memory:"/> <env name="MAIL_MAILER" value="array"/> diff --git a/public/index.php b/public/index.php index 1d69f3a..947d989 100644 --- a/public/index.php +++ b/public/index.php @@ -1,55 +1,17 @@ <?php -use Illuminate\Contracts\Http\Kernel; use Illuminate\Http\Request; define('LARAVEL_START', microtime(true)); -/* -|-------------------------------------------------------------------------- -| Check If The Application Is Under Maintenance -|-------------------------------------------------------------------------- -| -| If the application is in maintenance / demo mode via the "down" command -| we will load this file so that any pre-rendered content can be shown -| instead of starting the framework, which could cause an exception. -| -*/ - +// Determine if the application is in maintenance mode... if (file_exists($maintenance = __DIR__.'/../storage/framework/maintenance.php')) { require $maintenance; } -/* -|-------------------------------------------------------------------------- -| Register The Auto Loader -|-------------------------------------------------------------------------- -| -| Composer provides a convenient, automatically generated class loader for -| this application. We just need to utilize it! We'll simply require it -| into the script here so we don't need to manually load our classes. -| -*/ - +// Register the Composer autoloader... require __DIR__.'/../vendor/autoload.php'; -/* -|-------------------------------------------------------------------------- -| Run The Application -|-------------------------------------------------------------------------- -| -| Once we have the application, we can handle the incoming request using -| the application's HTTP kernel. Then, we will send the response back -| to this client's browser, allowing them to enjoy our application. -| -*/ - -$app = require_once __DIR__.'/../bootstrap/app.php'; - -$kernel = $app->make(Kernel::class); - -$response = $kernel->handle( - $request = Request::capture() -)->send(); - -$kernel->terminate($request, $response); +// Bootstrap Laravel and handle the request... +(require_once __DIR__.'/../bootstrap/app.php') + ->handleRequest(Request::capture()); diff --git a/routes/api.php b/routes/api.php index 15a77cd..6603570 100644 --- a/routes/api.php +++ b/routes/api.php @@ -8,7 +8,7 @@ }); Route::middleware('auth:sanctum')->group(function () { - Route::get('{project:slug}/{target:slug}/{environment:slug}', \App\Http\Controllers\Api\EnvController::class) + Route::get('{project:slug}/{target:slug}/{environment:slug}', App\Http\Controllers\Api\EnvController::class) ->name('project.target.environment') ->scopeBindings(); }); diff --git a/routes/channels.php b/routes/channels.php deleted file mode 100644 index df2ad28..0000000 --- a/routes/channels.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -use Illuminate\Support\Facades\Broadcast; - -Broadcast::channel('App.Models.User.{id}', function ($user, $id) { - return (int) $user->id === (int) $id; -}); diff --git a/routes/console.php b/routes/console.php index 3c9adf1..071bb36 100644 --- a/routes/console.php +++ b/routes/console.php @@ -2,7 +2,11 @@ use Illuminate\Foundation\Inspiring; use Illuminate\Support\Facades\Artisan; +use Illuminate\Support\Facades\Schedule; Artisan::command('inspire', function () { $this->comment(Inspiring::quote()); })->purpose('Display an inspiring quote'); + +Schedule::command('media-library:delete-old-temporary-uploads')->daily(); +Schedule::command('livewire:configure-s3-upload-cleanup')->daily(); diff --git a/routes/web.php b/routes/web.php index 35697f2..82d09df 100644 --- a/routes/web.php +++ b/routes/web.php @@ -6,7 +6,7 @@ return view('welcome'); })->name('home'); -Route::post('free-trial-registration', [\App\Http\Controllers\RegisterByEmailOnly::class, 'store']) +Route::post('free-trial-registration', [App\Http\Controllers\RegisterByEmailOnly::class, 'store']) ->name('register.by_email_only'); Route::middleware('auth:sanctum')->group(function () { @@ -26,14 +26,14 @@ }); Route::middleware('auth:sanctum', 'verified')->group(function () { - Route::get('dashboard', [\App\Http\Controllers\DashboardController::class, 'index'])->name('dashboard'); + Route::get('dashboard', [App\Http\Controllers\DashboardController::class, 'index'])->name('dashboard'); Route::name('project.')->group(function () { - Route::get('project', [\App\Http\Controllers\ProjectController::class, 'index'])->name('index'); - Route::get('project/{project:slug}', [\App\Http\Controllers\ProjectController::class, 'show'])->name('show'); + Route::get('project', [App\Http\Controllers\ProjectController::class, 'index'])->name('index'); + Route::get('project/{project:slug}', [App\Http\Controllers\ProjectController::class, 'show'])->name('show'); }); - Route::get('project/{project:slug}/target/{target:slug}', [\App\Http\Controllers\TargetController::class, 'show']) + Route::get('project/{project:slug}/target/{target:slug}', [App\Http\Controllers\TargetController::class, 'show']) ->name('project.target.show') ->scopeBindings(); }); diff --git a/tests/CreatesApplication.php b/tests/CreatesApplication.php deleted file mode 100644 index ab92402..0000000 --- a/tests/CreatesApplication.php +++ /dev/null @@ -1,22 +0,0 @@ -<?php - -namespace Tests; - -use Illuminate\Contracts\Console\Kernel; - -trait CreatesApplication -{ - /** - * Creates the application. - * - * @return \Illuminate\Foundation\Application - */ - public function createApplication() - { - $app = require __DIR__ . '/../bootstrap/app.php'; - - $app->make(Kernel::class)->bootstrap(); - - return $app; - } -} diff --git a/tests/Feature/AuthenticationTest.php b/tests/Feature/AuthenticationTest.php index 9dd64e1..c3ad65f 100644 --- a/tests/Feature/AuthenticationTest.php +++ b/tests/Feature/AuthenticationTest.php @@ -1,6 +1,7 @@ <?php use App\Models\User; +use App\Providers\AppServiceProvider; use App\Providers\RouteServiceProvider; test('login screen can be rendered', function () { @@ -18,7 +19,7 @@ ]); $this->assertAuthenticated(); - $response->assertRedirect(RouteServiceProvider::HOME); + $response->assertRedirect(AppServiceProvider::HOME); }); test('users can not authenticate with invalid_password', function () { diff --git a/tests/Feature/EmailVerificationTest.php b/tests/Feature/EmailVerificationTest.php index 1aec936..95a3981 100644 --- a/tests/Feature/EmailVerificationTest.php +++ b/tests/Feature/EmailVerificationTest.php @@ -1,6 +1,7 @@ <?php use App\Models\User; +use App\Providers\AppServiceProvider; use App\Providers\RouteServiceProvider; use Illuminate\Auth\Events\Verified; use Illuminate\Support\Facades\Event; @@ -37,7 +38,7 @@ Event::assertDispatched(Verified::class); expect($user->fresh()->hasVerifiedEmail())->toBeTrue(); - $response->assertRedirect(RouteServiceProvider::HOME . '?verified=1'); + $response->assertRedirect(AppServiceProvider::HOME . '?verified=1'); })->skip(function () { return ! Features::enabled(Features::emailVerification()); }, 'Email verification not enabled.'); diff --git a/tests/Feature/RegistrationTest.php b/tests/Feature/RegistrationTest.php index 856a305..7366762 100644 --- a/tests/Feature/RegistrationTest.php +++ b/tests/Feature/RegistrationTest.php @@ -1,5 +1,6 @@ <?php +use App\Providers\AppServiceProvider; use App\Providers\RouteServiceProvider; use Laravel\Fortify\Features; use Laravel\Jetstream\Jetstream; @@ -30,7 +31,7 @@ ]); $this->assertAuthenticated(); - $response->assertRedirect(RouteServiceProvider::HOME); + $response->assertRedirect(AppServiceProvider::HOME); })->skip(function () { return ! Features::enabled(Features::registration()); }, 'Registration support is not enabled.'); diff --git a/tests/TestCase.php b/tests/TestCase.php index e39e90f..a6c0ed2 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -7,6 +7,5 @@ abstract class TestCase extends BaseTestCase { - use CreatesApplication; use LazilyRefreshDatabase; }