diff --git a/.env.example b/.env.example index c604d587e..0581c42f0 100644 --- a/.env.example +++ b/.env.example @@ -2,9 +2,20 @@ APP_NAME="Laravel.io" APP_ENV=local APP_KEY= APP_DEBUG=true +APP_TIMEZONE=UTC APP_HOST=laravel.io.test APP_URL=http://${APP_HOST} +APP_MAINTENANCE_DRIVER=file +APP_MAINTENANCE_STORE=database + +CACHE_STORE=file +SESSION_DRIVER=file + +AUTH_PASSWORD_RESET_TOKEN_TABLE=password_resets + +BCRYPT_ROUNDS=12 + DB_DATABASE=laravel DB_USERNAME=root DB_PASSWORD=password @@ -38,3 +49,7 @@ TELEGRAM_CHANNEL= FATHOM_SITE_ID= FATHOM_TOKEN= +LOG_STACK=single +SESSION_ENCRYPT=false +SESSION_PATH=/ +SESSION_DOMAIN=null diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 2315b0692..33190038d 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -6,9 +6,19 @@ jobs: tests: runs-on: ubuntu-latest + services: + mysql: + image: mysql:5.7 + env: + MYSQL_ALLOW_EMPTY_PASSWORD: yes + MYSQL_DATABASE: laravel + ports: + - 3306:3306 + options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3 + steps: - name: Checkout code - uses: actions/checkout@v2 + uses: actions/checkout@v4 - name: Setup PHP uses: shivammathur/setup-php@v2 @@ -28,6 +38,10 @@ jobs: - name: Execute tests run: vendor/bin/pest + env: + DB_CONNECTION: mysql + DB_COLLATION: utf8mb4_unicode_ci + DB_DATABASE: laravel - name: Deploy if: github.repository == 'laravelio/laravel.io' && github.ref_name == 'main' diff --git a/.gitignore b/.gitignore index 531a3d1fe..0f4c6998b 100755 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,4 @@ /.vscode .env .phpunit.result.cache +!database/schema/*.sql diff --git a/README.md b/README.md index 27af646bf..44efc6f44 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,8 @@ The following tools are required in order to start the installation. 4. Run `composer setup` to setup the application 5. Set up a working e-mail driver like [Mailtrap](https://mailtrap.io/) 6. Run `valet link` to link the site to a testing web address -7. Configure the (optional) features from below +7. Create a `testing` database in MySQL so you can run the test suite +8. Configure the (optional) features from below You can now visit the app in your browser by visiting [http://laravel.io.test](http://laravel.io.test). If you seeded the database you can login into a test account with **`testing`** & **`password`**. diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php deleted file mode 100644 index 6c1cb067d..000000000 --- a/app/Console/Kernel.php +++ /dev/null @@ -1,31 +0,0 @@ -command('schedule-monitor:sync')->dailyAt('04:56'); - $schedule->command('model:prune', ['--model' => MonitoredScheduledTaskLogItem::class])->daily(); - $schedule->command('horizon:snapshot')->everyFiveMinutes(); - $schedule->command('lio:post-article-to-twitter')->twiceDaily(14, 18); - $schedule->command('lio:generate-sitemap')->daily()->graceTimeInMinutes(25); - $schedule->command('lio:update-article-view-counts')->twiceDaily(); - } - - /** - * Register the Closure based commands for the application. - */ - protected function commands(): void - { - $this->load(__DIR__.'/Commands'); - } -} diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php deleted file mode 100644 index 25b3d29c9..000000000 --- a/app/Exceptions/Handler.php +++ /dev/null @@ -1,51 +0,0 @@ -reportable(function (Throwable $e) { - Integration::captureUnhandledException($e); - }); - } -} diff --git a/app/Http/Controllers/Articles/ArticlesController.php b/app/Http/Controllers/Articles/ArticlesController.php index f6c14ed4d..c5ea9d005 100644 --- a/app/Http/Controllers/Articles/ArticlesController.php +++ b/app/Http/Controllers/Articles/ArticlesController.php @@ -4,7 +4,6 @@ use App\Concerns\UsesFilters; use App\Http\Controllers\Controller; -use App\Http\Middleware\Authenticate; use App\Http\Requests\ArticleRequest; use App\Http\Resources\ArticleResource; use App\Jobs\CreateArticle; @@ -14,6 +13,7 @@ use App\Models\Tag; use App\Models\User; use App\Policies\ArticlePolicy; +use Illuminate\Auth\Middleware\Authenticate; use Illuminate\Auth\Middleware\EnsureEmailIsVerified; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; diff --git a/app/Http/Controllers/Articles/AuthoredArticles.php b/app/Http/Controllers/Articles/AuthoredArticles.php index d3779851a..963c45f3a 100644 --- a/app/Http/Controllers/Articles/AuthoredArticles.php +++ b/app/Http/Controllers/Articles/AuthoredArticles.php @@ -3,7 +3,7 @@ namespace App\Http\Controllers\Articles; use App\Http\Controllers\Controller; -use App\Http\Middleware\Authenticate; +use Illuminate\Auth\Middleware\Authenticate; use Illuminate\Auth\Middleware\EnsureEmailIsVerified; use Illuminate\Http\Request; use Illuminate\View\View; diff --git a/app/Http/Controllers/Auth/ForgotPasswordController.php b/app/Http/Controllers/Auth/ForgotPasswordController.php index 7e93ba3a9..c4bc11cd4 100644 --- a/app/Http/Controllers/Auth/ForgotPasswordController.php +++ b/app/Http/Controllers/Auth/ForgotPasswordController.php @@ -3,7 +3,7 @@ namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; -use App\Http\Middleware\RedirectIfAuthenticated; +use Illuminate\Auth\Middleware\RedirectIfAuthenticated; use Illuminate\Foundation\Auth\SendsPasswordResetEmails; class ForgotPasswordController extends Controller diff --git a/app/Http/Controllers/Auth/LoginController.php b/app/Http/Controllers/Auth/LoginController.php index a4692480c..ec99620ae 100644 --- a/app/Http/Controllers/Auth/LoginController.php +++ b/app/Http/Controllers/Auth/LoginController.php @@ -3,8 +3,8 @@ namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; -use App\Http\Middleware\RedirectIfAuthenticated; -use App\Providers\RouteServiceProvider; +use App\Providers\AppServiceProvider; +use Illuminate\Auth\Middleware\RedirectIfAuthenticated; use Illuminate\Foundation\Auth\AuthenticatesUsers; use Illuminate\Http\Request; @@ -28,7 +28,7 @@ class LoginController extends Controller * * @var string */ - protected $redirectTo = RouteServiceProvider::HOME; + protected $redirectTo = AppServiceProvider::HOME; /** * Create a new controller instance. diff --git a/app/Http/Controllers/Auth/RegisterController.php b/app/Http/Controllers/Auth/RegisterController.php index 87ce00683..6627f6889 100644 --- a/app/Http/Controllers/Auth/RegisterController.php +++ b/app/Http/Controllers/Auth/RegisterController.php @@ -3,12 +3,12 @@ namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; -use App\Http\Middleware\RedirectIfAuthenticated; use App\Http\Requests\RegisterRequest; use App\Jobs\RegisterUser; use App\Models\User; -use App\Providers\RouteServiceProvider; +use App\Providers\AppServiceProvider; use Illuminate\Auth\Events\Registered; +use Illuminate\Auth\Middleware\RedirectIfAuthenticated; use Illuminate\Foundation\Auth\RegistersUsers; use Illuminate\Http\JsonResponse; @@ -32,7 +32,7 @@ class RegisterController extends Controller * * @var string */ - protected $redirectTo = RouteServiceProvider::HOME; + protected $redirectTo = AppServiceProvider::HOME; /** * Create a new controller instance. diff --git a/app/Http/Controllers/Auth/ResetPasswordController.php b/app/Http/Controllers/Auth/ResetPasswordController.php index be846cbbe..602144e7b 100644 --- a/app/Http/Controllers/Auth/ResetPasswordController.php +++ b/app/Http/Controllers/Auth/ResetPasswordController.php @@ -3,8 +3,8 @@ namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; -use App\Http\Middleware\RedirectIfAuthenticated; -use App\Providers\RouteServiceProvider; +use App\Providers\AppServiceProvider; +use Illuminate\Auth\Middleware\RedirectIfAuthenticated; use Illuminate\Foundation\Auth\ResetsPasswords; use Illuminate\Validation\Rules\Password; @@ -28,7 +28,7 @@ class ResetPasswordController extends Controller * * @var string */ - protected $redirectTo = RouteServiceProvider::HOME; + protected $redirectTo = AppServiceProvider::HOME; /** * Create a new controller instance. diff --git a/app/Http/Controllers/Auth/VerificationController.php b/app/Http/Controllers/Auth/VerificationController.php index 7c17cf1b9..794d69071 100644 --- a/app/Http/Controllers/Auth/VerificationController.php +++ b/app/Http/Controllers/Auth/VerificationController.php @@ -3,7 +3,7 @@ namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; -use App\Providers\RouteServiceProvider; +use App\Providers\AppServiceProvider; use Illuminate\Foundation\Auth\VerifiesEmails; use Illuminate\Http\Request; @@ -30,7 +30,7 @@ class VerificationController extends Controller * * @var string */ - protected $redirectTo = RouteServiceProvider::HOME; + protected $redirectTo = AppServiceProvider::HOME; /** * Create a new controller instance. diff --git a/app/Http/Controllers/MarkNotificationsController.php b/app/Http/Controllers/MarkNotificationsController.php index 03b68a73b..8ae983772 100644 --- a/app/Http/Controllers/MarkNotificationsController.php +++ b/app/Http/Controllers/MarkNotificationsController.php @@ -2,7 +2,7 @@ namespace App\Http\Controllers; -use App\Http\Middleware\Authenticate; +use Illuminate\Auth\Middleware\Authenticate; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php deleted file mode 100755 index d10bbfa98..000000000 --- a/app/Http/Kernel.php +++ /dev/null @@ -1,67 +0,0 @@ - [ - \App\Http\Middleware\DisableFloc::class, - \App\Http\Middleware\EncryptCookies::class, - \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, - \Illuminate\Session\Middleware\StartSession::class, - // \Illuminate\Session\Middleware\AuthenticateSession::class, - \Illuminate\View\Middleware\ShareErrorsFromSession::class, - \App\Http\Middleware\VerifyCsrfToken::class, - \Illuminate\Routing\Middleware\SubstituteBindings::class, - \App\Http\Middleware\RedirectIfBanned::class, - ], - - 'api' => [ - 'throttle:api', - \Illuminate\Routing\Middleware\SubstituteBindings::class, - ], - ]; - - /** - * The application's route middleware. - * - * These middleware may be assigned to groups or used individually. - * - * @var array - */ - protected $middlewareAliases = [ - '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, - ]; -} diff --git a/app/Http/Middleware/Authenticate.php b/app/Http/Middleware/Authenticate.php deleted file mode 100644 index d4ef6447a..000000000 --- a/app/Http/Middleware/Authenticate.php +++ /dev/null @@ -1,17 +0,0 @@ -expectsJson() ? null : route('login'); - } -} diff --git a/app/Http/Middleware/EncryptCookies.php b/app/Http/Middleware/EncryptCookies.php deleted file mode 100644 index 033136ad1..000000000 --- a/app/Http/Middleware/EncryptCookies.php +++ /dev/null @@ -1,17 +0,0 @@ -check()) { - return redirect(RouteServiceProvider::HOME); - } - } - - return $next($request); - } -} diff --git a/app/Http/Middleware/SiteIndexing.php b/app/Http/Middleware/SiteIndexing.php deleted file mode 100644 index c1f48108d..000000000 --- a/app/Http/Middleware/SiteIndexing.php +++ /dev/null @@ -1,17 +0,0 @@ -environment('production'); - } -} diff --git a/app/Http/Middleware/TrimStrings.php b/app/Http/Middleware/TrimStrings.php deleted file mode 100644 index 88cadcaaf..000000000 --- a/app/Http/Middleware/TrimStrings.php +++ /dev/null @@ -1,19 +0,0 @@ - - */ - 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 c9c58bddc..000000000 --- a/app/Http/Middleware/TrustHosts.php +++ /dev/null @@ -1,20 +0,0 @@ - - */ - 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 3391630ec..000000000 --- a/app/Http/Middleware/TrustProxies.php +++ /dev/null @@ -1,28 +0,0 @@ -|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/ValidateSignature.php b/app/Http/Middleware/ValidateSignature.php deleted file mode 100644 index 093bf64af..000000000 --- a/app/Http/Middleware/ValidateSignature.php +++ /dev/null @@ -1,22 +0,0 @@ - - */ - protected $except = [ - // 'fbclid', - // 'utm_campaign', - // 'utm_content', - // 'utm_medium', - // 'utm_source', - // 'utm_term', - ]; -} diff --git a/app/Http/Middleware/VerifyCsrfToken.php b/app/Http/Middleware/VerifyCsrfToken.php deleted file mode 100644 index 163ab8e9d..000000000 --- a/app/Http/Middleware/VerifyCsrfToken.php +++ /dev/null @@ -1,36 +0,0 @@ -session()->token(), - $this->availableAt(60 * $config['lifetime']), - $config['path'], - $config['domain'], - $config['secure'], - true, - false, - $config['same_site'] ?? null, - $config['partitioned'] ?? false - ); - } -} diff --git a/app/Http/Requests/ArticleRequest.php b/app/Http/Requests/ArticleRequest.php index 9465f3fba..db953e8c9 100644 --- a/app/Http/Requests/ArticleRequest.php +++ b/app/Http/Requests/ArticleRequest.php @@ -22,6 +22,13 @@ public function rules(): array ]; } + public function messages(): array + { + return [ + 'title.max' => 'The :attribute must not be greater than :max characters.', + ]; + } + public function author(): User { return $this->user(); diff --git a/app/Http/Requests/RegisterRequest.php b/app/Http/Requests/RegisterRequest.php index 62136b53b..93d6910bc 100644 --- a/app/Http/Requests/RegisterRequest.php +++ b/app/Http/Requests/RegisterRequest.php @@ -32,6 +32,15 @@ public function rules(): array ]; } + public function messages(): array + { + return [ + 'username.alpha_dash' => 'The :attribute must only contain letters, numbers, dashes and underscores.', + 'rules.accepted' => 'The rules must be accepted.', + 'terms.accepted' => 'The terms must be accepted.', + ]; + } + public function name(): string { return $this->get('name'); diff --git a/app/Http/Requests/ThreadRequest.php b/app/Http/Requests/ThreadRequest.php index 8ce9eb409..864f6368a 100644 --- a/app/Http/Requests/ThreadRequest.php +++ b/app/Http/Requests/ThreadRequest.php @@ -18,6 +18,13 @@ public function rules(): array ]; } + public function messages(): array + { + return [ + 'subject.max' => 'The :attribute must not be greater than :max characters.', + ]; + } + public function subject(): string { return $this->get('subject'); diff --git a/app/Jobs/GenerateSocialShareImage.php b/app/Jobs/GenerateSocialShareImage.php index 7dfa557f8..0fb88ea75 100644 --- a/app/Jobs/GenerateSocialShareImage.php +++ b/app/Jobs/GenerateSocialShareImage.php @@ -21,21 +21,18 @@ final class GenerateSocialShareImage const TEMPLATE = 'social-share-template.png'; - const CACHE_LIFETIME = 43200; - public function __construct(private Article $article) {} public function handle(ImageManager $image): mixed { $text = wordwrap($this->article->title(), self::CHARACTERS_PER_LINE); - return $image->cache(function ($image) use ($text) { - $image->make(resource_path('images/'.self::TEMPLATE)) - ->text($text, self::TEXT_X_POSITION, self::TEXT_Y_POSITION, function ($font) { - $font->file(resource_path('fonts/'.self::FONT)); - $font->size(self::FONT_SIZE); - $font->color(self::TEXT_COLOUR); - }); - }, self::CACHE_LIFETIME, true)->response('png'); + return $image->make(resource_path('images/'.self::TEMPLATE)) + ->text($text, self::TEXT_X_POSITION, self::TEXT_Y_POSITION, function ($font) { + $font->file(resource_path('fonts/'.self::FONT)); + $font->size(self::FONT_SIZE); + $font->color(self::TEXT_COLOUR); + }) + ->response('png'); } } diff --git a/app/Livewire/NotificationIndicator.php b/app/Livewire/NotificationIndicator.php index 205acf119..e66f705a7 100644 --- a/app/Livewire/NotificationIndicator.php +++ b/app/Livewire/NotificationIndicator.php @@ -4,16 +4,13 @@ use Illuminate\Support\Facades\Auth; use Illuminate\View\View; +use Livewire\Attributes\On; use Livewire\Component; final class NotificationIndicator extends Component { public $hasNotification; - protected $listeners = [ - 'NotificationMarkedAsRead' => 'setHasNotification', - ]; - public function render(): View { $this->hasNotification = $this->setHasNotification( @@ -25,6 +22,7 @@ public function render(): View ]); } + #[On('NotificationMarkedAsRead')] public function setHasNotification(int $count): bool { return $count > 0; diff --git a/app/Models/Article.php b/app/Models/Article.php index 290244b89..9fa33d422 100644 --- a/app/Models/Article.php +++ b/app/Models/Article.php @@ -54,15 +54,6 @@ final class Article extends Model implements Feedable 'shared_at', ]; - /** - * {@inheritdoc} - */ - protected $casts = [ - 'submitted_at' => 'datetime', - 'approved_at' => 'datetime', - 'shared_at' => 'datetime', - ]; - /** * {@inheritdoc} */ @@ -73,6 +64,20 @@ final class Article extends Model implements Feedable 'tagsRelation', ]; + /** + * Get the attributes that should be cast. + * + * @return array + */ + protected function casts(): array + { + return [ + 'submitted_at' => 'datetime', + 'approved_at' => 'datetime', + 'shared_at' => 'datetime', + ]; + } + public function id(): int { return $this->id; diff --git a/app/Models/Thread.php b/app/Models/Thread.php index 7a737f552..1d19a39bb 100644 --- a/app/Models/Thread.php +++ b/app/Models/Thread.php @@ -82,12 +82,17 @@ final class Thread extends Model implements Feedable, MentionAble, ReplyAble, Sp ]; /** - * {@inheritdoc} + * Get the attributes that should be cast. + * + * @return array */ - protected $casts = [ - 'last_activity_at' => 'datetime', - 'locked_at' => 'datetime', - ]; + protected function casts(): array + { + return [ + 'last_activity_at' => 'datetime', + 'locked_at' => 'datetime', + ]; + } public function id(): int { diff --git a/app/Models/User.php b/app/Models/User.php index 78a8ef6a5..69aba8f99 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -60,14 +60,19 @@ final class User extends Authenticatable implements MustVerifyEmail /** * {@inheritdoc} */ - protected $casts = [ - 'allowed_notifications' => 'array', - ]; + protected $hidden = ['password', 'remember_token']; /** - * {@inheritdoc} + * Get the attributes that should be cast. + * + * @return array */ - protected $hidden = ['password', 'remember_token']; + protected function casts(): array + { + return [ + 'allowed_notifications' => 'array', + ]; + } public function id(): int { diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 9e387a741..036dfcca4 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -7,24 +7,44 @@ use App\Models\Thread; use App\Models\User; use App\Notifications\SlowQueryLogged; +use App\Observers\UserObserver; +use App\Policies\NotificationPolicy; +use Illuminate\Cache\RateLimiting\Limit; use Illuminate\Database\Connection; use Illuminate\Database\Eloquent\Relations\Relation; use Illuminate\Database\Events\QueryExecuted; +use Illuminate\Http\Request; use Illuminate\Notifications\AnonymousNotifiable; +use Illuminate\Notifications\DatabaseNotification; use Illuminate\Support\Facades\DB; +use Illuminate\Support\Facades\Gate; use Illuminate\Support\Facades\Notification; -use Illuminate\Support\Facades\Request; +use Illuminate\Support\Facades\RateLimiter; +use Illuminate\Support\Facades\Request as RequestFacade; use Illuminate\Support\ServiceProvider; use Laravel\Horizon\Horizon; class AppServiceProvider extends ServiceProvider { + /** + * The path to your application's "home" route. + * + * This is used by Laravel authentication to redirect users after login. + * + * @var string + */ + public const HOME = '/user'; + public function boot(): void { $this->bootEloquentMorphs(); $this->bootMacros(); $this->bootHorizon(); $this->bootSlowQueryLogging(); + + $this->bootEvent(); + $this->bootRoute(); + $this->bootPolicies(); } private function bootEloquentMorphs() @@ -60,9 +80,36 @@ private function bootSlowQueryLogging() new SlowQueryLogged( $event->sql, $event->time, - Request::url(), + RequestFacade::url(), ), ); }); } + + public function bootEvent(): void + { + User::observe(UserObserver::class); + } + + public function bootRoute(): void + { + RateLimiter::for('api', function (Request $request) { + return Limit::perMinute(6); + }); + + require base_path('routes/bindings.php'); + } + + public function bootPolicies(): void + { + Gate::policy(DatabaseNotification::class, NotificationPolicy::class); + } + + /** + * Register any application services. + */ + public function register(): void + { + // + } } diff --git a/app/Providers/AuthServiceProvider.php b/app/Providers/AuthServiceProvider.php deleted file mode 100644 index 9d0370e49..000000000 --- a/app/Providers/AuthServiceProvider.php +++ /dev/null @@ -1,28 +0,0 @@ - NotificationPolicy::class, - Reply::class => ReplyPolicy::class, - Thread::class => ThreadPolicy::class, - User::class => UserPolicy::class, - Article::class => ArticlePolicy::class, - ]; - - public function boot(): void {} -} diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php deleted file mode 100644 index e9565ea68..000000000 --- a/app/Providers/EventServiceProvider.php +++ /dev/null @@ -1,76 +0,0 @@ - [ - SendNewArticleNotification::class, - ], - ArticleWasApproved::class => [ - SendArticleApprovedNotification::class, - ], - EmailAddressWasChanged::class => [ - RenewEmailVerificationNotification::class, - ], - Registered::class => [ - ResolveDuplicateGitHubUsername::class, - SendEmailVerificationNotification::class, - ], - ReplyWasCreated::class => [ - MarkLastActivity::class, - SendNewReplyNotification::class, - SubscribeUsersMentionedInReply::class, - NotifyUsersMentionedInReply::class, - ], - ThreadWasCreated::class => [ - SubscribeUsersMentionedInThread::class, - NotifyUsersMentionedInThread::class, - ], - SpamWasReported::class => [ - SendNewSpamNotification::class, - ], - ]; - - public function boot(): void - { - User::observe(UserObserver::class); - } - - /** - * Determine if events and listeners should be automatically discovered. - */ - public function shouldDiscoverEvents(): bool - { - return false; - } -} diff --git a/app/Providers/RouteServiceProvider.php b/app/Providers/RouteServiceProvider.php deleted file mode 100644 index 8faa98c1a..000000000 --- a/app/Providers/RouteServiceProvider.php +++ /dev/null @@ -1,42 +0,0 @@ -routes(function () { - Route::prefix('api') - ->middleware('api') - ->group(base_path('routes/api.php')); - - Route::middleware('web') - ->group(base_path('routes/web.php')); - }); - } -} diff --git a/app/Rules/DoesNotContainUrlRule.php b/app/Rules/DoesNotContainUrlRule.php index 9b860cad4..81a61265f 100644 --- a/app/Rules/DoesNotContainUrlRule.php +++ b/app/Rules/DoesNotContainUrlRule.php @@ -2,22 +2,22 @@ namespace App\Rules; -use Illuminate\Contracts\Validation\Rule; +use Closure; +use Illuminate\Contracts\Validation\ValidationRule; use Illuminate\Validation\Concerns\ValidatesAttributes; -final class DoesNotContainUrlRule implements Rule +final class DoesNotContainUrlRule implements ValidationRule { use ValidatesAttributes; - public function passes($attribute, $value): bool + public function validate(string $attribute, mixed $value, Closure $fail): void { - return ! collect(explode(' ', $value))->contains(function ($word) { + $fails = collect(explode(' ', $value))->contains(function ($word) { return $this->validateRequired('word', $word) && $this->validateUrl('word', $word); }); - } - public function message(): string - { - return 'The :attribute field cannot contain an url.'; + if ($fails) { + $fail('The :attribute field cannot contain an url.'); + } } } diff --git a/app/Rules/HttpImageRule.php b/app/Rules/HttpImageRule.php index 9928664e0..c2b9c61fb 100644 --- a/app/Rules/HttpImageRule.php +++ b/app/Rules/HttpImageRule.php @@ -2,20 +2,18 @@ namespace App\Rules; -use Illuminate\Contracts\Validation\Rule; +use Closure; +use Illuminate\Contracts\Validation\ValidationRule; /** * This rule validates Markdown for non-HTTPS image links. */ -final class HttpImageRule implements Rule +final class HttpImageRule implements ValidationRule { - public function passes($attribute, $value): bool + public function validate(string $attribute, mixed $value, Closure $fail): void { - return ! preg_match('/!\[.*\]\(http:\/\/.*\)/', $value); - } - - public function message(): string - { - return 'The :attribute field contains at least one image with an HTTP link.'; + if (preg_match('/!\[.*\]\(http:\/\/.*\)/', $value)) { + $fail('The :attribute field contains at least one image with an HTTP link.'); + } } } diff --git a/app/Rules/InvalidMentionRule.php b/app/Rules/InvalidMentionRule.php index 6f4f52578..893e2055d 100644 --- a/app/Rules/InvalidMentionRule.php +++ b/app/Rules/InvalidMentionRule.php @@ -2,20 +2,18 @@ namespace App\Rules; -use Illuminate\Contracts\Validation\Rule; +use Closure; +use Illuminate\Contracts\Validation\ValidationRule; /** * This rule validates links are not diguised as mentions. */ -final class InvalidMentionRule implements Rule +final class InvalidMentionRule implements ValidationRule { - public function passes($attribute, $value): bool + public function validate(string $attribute, mixed $value, Closure $fail): void { - return ! preg_match('/\[@.*\]\(http.*\)/', $value); - } - - public function message(): string - { - return 'The :attribute field contains an invalid mention.'; + if (preg_match('/\[@.*\]\(http.*\)/', $value)) { + $fail('The :attribute field contains an invalid mention.'); + } } } diff --git a/app/Rules/PasscheckRule.php b/app/Rules/PasscheckRule.php index d059e4a0c..a66b5b1d5 100644 --- a/app/Rules/PasscheckRule.php +++ b/app/Rules/PasscheckRule.php @@ -2,19 +2,17 @@ namespace App\Rules; -use Illuminate\Contracts\Validation\Rule; +use Closure; +use Illuminate\Contracts\Validation\ValidationRule; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Hash; -final class PasscheckRule implements Rule +final class PasscheckRule implements ValidationRule { - public function passes($attribute, $value): bool + public function validate(string $attribute, mixed $value, Closure $fail): void { - return Hash::check($value, Auth::user()->getAuthPassword()); - } - - public function message(): string - { - return 'Your current password is incorrect.'; + if (! Hash::check($value, Auth::user()->getAuthPassword())) { + $fail('Your current password is incorrect.'); + } } } diff --git a/app/Rules/UniqueGitHubUser.php b/app/Rules/UniqueGitHubUser.php index 2dfd033a5..d142c6ef7 100644 --- a/app/Rules/UniqueGitHubUser.php +++ b/app/Rules/UniqueGitHubUser.php @@ -4,30 +4,33 @@ use App\Concerns\SendsAlerts; use App\Models\User; -use Illuminate\Contracts\Validation\Rule; +use Closure; +use Illuminate\Contracts\Validation\ValidationRule; use Illuminate\Database\Eloquent\ModelNotFoundException; -final class UniqueGitHubUser implements Rule +final class UniqueGitHubUser implements ValidationRule { use SendsAlerts; - private User $user; - - public function passes($attribute, $value): bool + public function validate(string $attribute, mixed $value, Closure $fail): void { try { - $this->user = User::findByGitHubId($value); + $user = User::findByGitHubId($value); } catch (ModelNotFoundException) { - return true; + return; } - return false; + $message = $this->message($user); + + $this->error($message); + + $fail($message); } - public function message() + public function message(User $user): string { - $this->error('We already found a user with the given GitHub account (:username). Would you like to login instead?', [ - 'username' => '@'.$this->user->githubUsername(), + return __('We already found a user with the given GitHub account (:username). Would you like to login instead?', [ + 'username' => '@'.$user->githubUsername(), 'login' => route('login'), ]); } diff --git a/artisan b/artisan index 5c23e2e24..8e04b4224 100755 --- a/artisan +++ b/artisan @@ -1,53 +1,15 @@ #!/usr/bin/env php 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 9573ee83a..cba2b9522 100644 --- a/bootstrap/app.php +++ b/bootstrap/app.php @@ -1,55 +1,47 @@ 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\Auth\Access\AuthorizationException; +use Illuminate\Auth\AuthenticationException; +use Illuminate\Database\Eloquent\ModelNotFoundException; +use Illuminate\Foundation\Application; +use Illuminate\Foundation\Configuration\Exceptions; +use Illuminate\Foundation\Configuration\Middleware; +use Illuminate\Session\TokenMismatchException; +use Illuminate\Validation\ValidationException; +use Sentry\Laravel\Integration; +use Symfony\Component\HttpKernel\Exception\HttpException; + +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->web([ + \App\Http\Middleware\RedirectIfBanned::class, + ], [ + \App\Http\Middleware\DisableFloc::class, + ]); + + $middleware->throttleApi(); + }) + ->withExceptions(function (Exceptions $exceptions) { + $exceptions->dontReport([ + AuthenticationException::class, + AuthorizationException::class, + HttpException::class, + ModelNotFoundException::class, + TokenMismatchException::class, + ValidationException::class, + ]); + + Integration::handles($exceptions); + })->create(); diff --git a/bootstrap/providers.php b/bootstrap/providers.php new file mode 100644 index 000000000..7ad1b7b6b --- /dev/null +++ b/bootstrap/providers.php @@ -0,0 +1,6 @@ +=4.0.0" + "doctrine/dbal": "<4.0.0 || >=5.0.0" }, "require-dev": { - "doctrine/dbal": "^3.7.0", + "doctrine/dbal": "^4.0.0", "nesbot/carbon": "^2.71.0 || ^3.0.0", "phpunit/phpunit": "^10.3" }, @@ -776,7 +779,7 @@ ], "support": { "issues": "https://github.com/CarbonPHP/carbon-doctrine-types/issues", - "source": "https://github.com/CarbonPHP/carbon-doctrine-types/tree/2.1.0" + "source": "https://github.com/CarbonPHP/carbon-doctrine-types/tree/3.2.0" }, "funding": [ { @@ -792,7 +795,7 @@ "type": "tidelift" } ], - "time": "2023-12-11T17:09:12+00:00" + "time": "2024-02-09T16:56:22+00:00" }, { "name": "codeat3/blade-simple-icons", @@ -867,16 +870,16 @@ }, { "name": "composer/ca-bundle", - "version": "1.5.0", + "version": "1.5.1", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "0c5ccfcfea312b5c5a190a21ac5cef93f74baf99" + "reference": "063d9aa8696582f5a41dffbbaf3c81024f0a604a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/0c5ccfcfea312b5c5a190a21ac5cef93f74baf99", - "reference": "0c5ccfcfea312b5c5a190a21ac5cef93f74baf99", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/063d9aa8696582f5a41dffbbaf3c81024f0a604a", + "reference": "063d9aa8696582f5a41dffbbaf3c81024f0a604a", "shasum": "" }, "require": { @@ -886,7 +889,7 @@ }, "require-dev": { "phpstan/phpstan": "^1.10", - "psr/log": "^1.0", + "psr/log": "^1.0 || ^2.0 || ^3.0", "symfony/phpunit-bridge": "^4.2 || ^5", "symfony/process": "^4.0 || ^5.0 || ^6.0 || ^7.0" }, @@ -923,7 +926,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/ca-bundle/issues", - "source": "https://github.com/composer/ca-bundle/tree/1.5.0" + "source": "https://github.com/composer/ca-bundle/tree/1.5.1" }, "funding": [ { @@ -939,7 +942,7 @@ "type": "tidelift" } ], - "time": "2024-03-15T14:00:32+00:00" + "time": "2024-07-08T15:28:20+00:00" }, { "name": "dflydev/dot-access-data", @@ -1016,350 +1019,6 @@ }, "time": "2024-07-08T12:26:09+00:00" }, - { - "name": "doctrine/cache", - "version": "2.2.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/cache.git", - "reference": "1ca8f21980e770095a31456042471a57bc4c68fb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/cache/zipball/1ca8f21980e770095a31456042471a57bc4c68fb", - "reference": "1ca8f21980e770095a31456042471a57bc4c68fb", - "shasum": "" - }, - "require": { - "php": "~7.1 || ^8.0" - }, - "conflict": { - "doctrine/common": ">2.2,<2.4" - }, - "require-dev": { - "cache/integration-tests": "dev-master", - "doctrine/coding-standard": "^9", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "psr/cache": "^1.0 || ^2.0 || ^3.0", - "symfony/cache": "^4.4 || ^5.4 || ^6", - "symfony/var-exporter": "^4.4 || ^5.4 || ^6" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "PHP Doctrine Cache library is a popular cache implementation that supports many different drivers such as redis, memcache, apc, mongodb and others.", - "homepage": "https://www.doctrine-project.org/projects/cache.html", - "keywords": [ - "abstraction", - "apcu", - "cache", - "caching", - "couchdb", - "memcached", - "php", - "redis", - "xcache" - ], - "support": { - "issues": "https://github.com/doctrine/cache/issues", - "source": "https://github.com/doctrine/cache/tree/2.2.0" - }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcache", - "type": "tidelift" - } - ], - "time": "2022-05-20T20:07:39+00:00" - }, - { - "name": "doctrine/dbal", - "version": "3.8.6", - "source": { - "type": "git", - "url": "https://github.com/doctrine/dbal.git", - "reference": "b7411825cf7efb7e51f9791dea19d86e43b399a1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/b7411825cf7efb7e51f9791dea19d86e43b399a1", - "reference": "b7411825cf7efb7e51f9791dea19d86e43b399a1", - "shasum": "" - }, - "require": { - "composer-runtime-api": "^2", - "doctrine/cache": "^1.11|^2.0", - "doctrine/deprecations": "^0.5.3|^1", - "doctrine/event-manager": "^1|^2", - "php": "^7.4 || ^8.0", - "psr/cache": "^1|^2|^3", - "psr/log": "^1|^2|^3" - }, - "require-dev": { - "doctrine/coding-standard": "12.0.0", - "fig/log-test": "^1", - "jetbrains/phpstorm-stubs": "2023.1", - "phpstan/phpstan": "1.11.5", - "phpstan/phpstan-strict-rules": "^1.6", - "phpunit/phpunit": "9.6.19", - "psalm/plugin-phpunit": "0.18.4", - "slevomat/coding-standard": "8.13.1", - "squizlabs/php_codesniffer": "3.10.1", - "symfony/cache": "^5.4|^6.0|^7.0", - "symfony/console": "^4.4|^5.4|^6.0|^7.0", - "vimeo/psalm": "4.30.0" - }, - "suggest": { - "symfony/console": "For helpful console commands such as SQL execution and import of files." - }, - "bin": [ - "bin/doctrine-dbal" - ], - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\DBAL\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - } - ], - "description": "Powerful PHP database abstraction layer (DBAL) with many features for database schema introspection and management.", - "homepage": "https://www.doctrine-project.org/projects/dbal.html", - "keywords": [ - "abstraction", - "database", - "db2", - "dbal", - "mariadb", - "mssql", - "mysql", - "oci8", - "oracle", - "pdo", - "pgsql", - "postgresql", - "queryobject", - "sasql", - "sql", - "sqlite", - "sqlserver", - "sqlsrv" - ], - "support": { - "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/3.8.6" - }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdbal", - "type": "tidelift" - } - ], - "time": "2024-06-19T10:38:17+00:00" - }, - { - "name": "doctrine/deprecations", - "version": "1.1.3", - "source": { - "type": "git", - "url": "https://github.com/doctrine/deprecations.git", - "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/deprecations/zipball/dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", - "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^9", - "phpstan/phpstan": "1.4.10 || 1.10.15", - "phpstan/phpstan-phpunit": "^1.0", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "psalm/plugin-phpunit": "0.18.4", - "psr/log": "^1 || ^2 || ^3", - "vimeo/psalm": "4.30.0 || 5.12.0" - }, - "suggest": { - "psr/log": "Allows logging deprecations via PSR-3 logger implementation" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", - "homepage": "https://www.doctrine-project.org/", - "support": { - "issues": "https://github.com/doctrine/deprecations/issues", - "source": "https://github.com/doctrine/deprecations/tree/1.1.3" - }, - "time": "2024-01-30T19:34:25+00:00" - }, - { - "name": "doctrine/event-manager", - "version": "2.0.1", - "source": { - "type": "git", - "url": "https://github.com/doctrine/event-manager.git", - "reference": "b680156fa328f1dfd874fd48c7026c41570b9c6e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/event-manager/zipball/b680156fa328f1dfd874fd48c7026c41570b9c6e", - "reference": "b680156fa328f1dfd874fd48c7026c41570b9c6e", - "shasum": "" - }, - "require": { - "php": "^8.1" - }, - "conflict": { - "doctrine/common": "<2.9" - }, - "require-dev": { - "doctrine/coding-standard": "^12", - "phpstan/phpstan": "^1.8.8", - "phpunit/phpunit": "^10.5", - "vimeo/psalm": "^5.24" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Common\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - }, - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" - } - ], - "description": "The Doctrine Event Manager is a simple PHP event system that was built to be used with the various Doctrine projects.", - "homepage": "https://www.doctrine-project.org/projects/event-manager.html", - "keywords": [ - "event", - "event dispatcher", - "event manager", - "event system", - "events" - ], - "support": { - "issues": "https://github.com/doctrine/event-manager/issues", - "source": "https://github.com/doctrine/event-manager/tree/2.0.1" - }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fevent-manager", - "type": "tidelift" - } - ], - "time": "2024-05-22T20:47:39+00:00" - }, { "name": "doctrine/inflector", "version": "2.0.10", @@ -2347,74 +2006,6 @@ ], "time": "2022-05-21T17:30:32+00:00" }, - { - "name": "intervention/imagecache", - "version": "2.6.0", - "source": { - "type": "git", - "url": "https://github.com/Intervention/imagecache.git", - "reference": "86136575a62d3634b51f196a998fce4a583b49bb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Intervention/imagecache/zipball/86136575a62d3634b51f196a998fce4a583b49bb", - "reference": "86136575a62d3634b51f196a998fce4a583b49bb", - "shasum": "" - }, - "require": { - "illuminate/cache": "^5.5|~6|~7|~8|~9|~10", - "illuminate/filesystem": "^5.5|~6|~7|~8|~9|~10", - "intervention/image": "~2.2", - "nesbot/carbon": "^2.39", - "opis/closure": "^3.5", - "php": "~7.2|~8" - }, - "require-dev": { - "phpunit/phpunit": "^8.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Intervention\\Image\\": "src/Intervention/Image" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Oliver Vogel", - "email": "oliver@intervention.io", - "homepage": "http://intervention.io/" - } - ], - "description": "Caching extension for the Intervention Image Class", - "homepage": "https://image.intervention.io", - "keywords": [ - "cache", - "gd", - "image", - "imagick", - "laravel" - ], - "support": { - "issues": "https://github.com/Intervention/imagecache/issues", - "source": "https://github.com/Intervention/imagecache/tree/2.6.0" - }, - "funding": [ - { - "url": "https://paypal.me/interventionio", - "type": "custom" - }, - { - "url": "https://github.com/Intervention", - "type": "github" - } - ], - "abandoned": true, - "time": "2023-02-25T19:40:47+00:00" - }, { "name": "jean85/pretty-package-versions", "version": "2.0.6", @@ -2589,16 +2180,16 @@ }, { "name": "laravel-notification-channels/twitter", - "version": "v8.1.1", + "version": "V8.1.2", "source": { "type": "git", "url": "https://github.com/laravel-notification-channels/twitter.git", - "reference": "30375f873c90d8e31c349e1b1860963cdae27cb5" + "reference": "afa080e24a1dc1ebcd70af0b53483e738e138328" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel-notification-channels/twitter/zipball/30375f873c90d8e31c349e1b1860963cdae27cb5", - "reference": "30375f873c90d8e31c349e1b1860963cdae27cb5", + "url": "https://api.github.com/repos/laravel-notification-channels/twitter/zipball/afa080e24a1dc1ebcd70af0b53483e738e138328", + "reference": "afa080e24a1dc1ebcd70af0b53483e738e138328", "shasum": "" }, "require": { @@ -2644,22 +2235,22 @@ "homepage": "https://github.com/laravel-notification-channels/twitter", "support": { "issues": "https://github.com/laravel-notification-channels/twitter/issues", - "source": "https://github.com/laravel-notification-channels/twitter/tree/v8.1.1" + "source": "https://github.com/laravel-notification-channels/twitter/tree/V8.1.2" }, - "time": "2024-04-03T12:39:24+00:00" + "time": "2024-04-05T17:35:08+00:00" }, { "name": "laravel/framework", - "version": "v10.48.20", + "version": "v11.21.0", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "be2be342d4c74db6a8d2bd18469cd6d488ab9c98" + "reference": "9d9d36708d56665b12185493f684abce38ad2d30" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/be2be342d4c74db6a8d2bd18469cd6d488ab9c98", - "reference": "be2be342d4c74db6a8d2bd18469cd6d488ab9c98", + "url": "https://api.github.com/repos/laravel/framework/zipball/9d9d36708d56665b12185493f684abce38ad2d30", + "reference": "9d9d36708d56665b12185493f684abce38ad2d30", "shasum": "" }, "require": { @@ -2675,44 +2266,44 @@ "ext-openssl": "*", "ext-session": "*", "ext-tokenizer": "*", - "fruitcake/php-cors": "^1.2", + "fruitcake/php-cors": "^1.3", + "guzzlehttp/guzzle": "^7.8", "guzzlehttp/uri-template": "^1.0", - "laravel/prompts": "^0.1.9", + "laravel/prompts": "^0.1.18", "laravel/serializable-closure": "^1.3", "league/commonmark": "^2.2.1", "league/flysystem": "^3.8.0", "monolog/monolog": "^3.0", - "nesbot/carbon": "^2.67", - "nunomaduro/termwind": "^1.13", - "php": "^8.1", + "nesbot/carbon": "^2.72.2|^3.0", + "nunomaduro/termwind": "^2.0", + "php": "^8.2", "psr/container": "^1.1.1|^2.0.1", "psr/log": "^1.0|^2.0|^3.0", "psr/simple-cache": "^1.0|^2.0|^3.0", "ramsey/uuid": "^4.7", - "symfony/console": "^6.2", - "symfony/error-handler": "^6.2", - "symfony/finder": "^6.2", - "symfony/http-foundation": "^6.4", - "symfony/http-kernel": "^6.2", - "symfony/mailer": "^6.2", - "symfony/mime": "^6.2", - "symfony/process": "^6.2", - "symfony/routing": "^6.2", - "symfony/uid": "^6.2", - "symfony/var-dumper": "^6.2", + "symfony/console": "^7.0", + "symfony/error-handler": "^7.0", + "symfony/finder": "^7.0", + "symfony/http-foundation": "^7.0", + "symfony/http-kernel": "^7.0", + "symfony/mailer": "^7.0", + "symfony/mime": "^7.0", + "symfony/polyfill-php83": "^1.28", + "symfony/process": "^7.0", + "symfony/routing": "^7.0", + "symfony/uid": "^7.0", + "symfony/var-dumper": "^7.0", "tijsverkoyen/css-to-inline-styles": "^2.2.5", "vlucas/phpdotenv": "^5.4.1", "voku/portable-ascii": "^2.0" }, "conflict": { - "carbonphp/carbon-doctrine-types": ">=3.0", - "doctrine/dbal": ">=4.0", "mockery/mockery": "1.6.8", - "phpunit/phpunit": ">=11.0.0", "tightenco/collect": "<5.5.33" }, "provide": { "psr/container-implementation": "1.1|2.0", + "psr/log-implementation": "1.0|2.0|3.0", "psr/simple-cache-implementation": "1.0|2.0|3.0" }, "replace": { @@ -2748,36 +2339,35 @@ "illuminate/testing": "self.version", "illuminate/translation": "self.version", "illuminate/validation": "self.version", - "illuminate/view": "self.version" + "illuminate/view": "self.version", + "spatie/once": "*" }, "require-dev": { "ably/ably-php": "^1.0", "aws/aws-sdk-php": "^3.235.5", - "doctrine/dbal": "^3.5.1", "ext-gmp": "*", - "fakerphp/faker": "^1.21", - "guzzlehttp/guzzle": "^7.5", + "fakerphp/faker": "^1.23", "league/flysystem-aws-s3-v3": "^3.0", "league/flysystem-ftp": "^3.0", "league/flysystem-path-prefixing": "^3.3", "league/flysystem-read-only": "^3.3", "league/flysystem-sftp-v3": "^3.0", - "mockery/mockery": "^1.5.1", + "mockery/mockery": "^1.6", "nyholm/psr7": "^1.2", - "orchestra/testbench-core": "^8.23.4", - "pda/pheanstalk": "^4.0", - "phpstan/phpstan": "^1.4.7", - "phpunit/phpunit": "^10.0.7", + "orchestra/testbench-core": "^9.1.5", + "pda/pheanstalk": "^5.0", + "phpstan/phpstan": "^1.11.5", + "phpunit/phpunit": "^10.5|^11.0", "predis/predis": "^2.0.2", - "symfony/cache": "^6.2", - "symfony/http-client": "^6.2.4", - "symfony/psr-http-message-bridge": "^2.0" + "resend/resend-php": "^0.10.0", + "symfony/cache": "^7.0", + "symfony/http-client": "^7.0", + "symfony/psr-http-message-bridge": "^7.0" }, "suggest": { "ably/ably-php": "Required to use the Ably broadcast driver (^1.0).", "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage, and SES mail driver (^3.235.5).", - "brianium/paratest": "Required to run tests in parallel (^6.0).", - "doctrine/dbal": "Required to rename columns and drop SQLite columns (^3.5.1).", + "brianium/paratest": "Required to run tests in parallel (^7.0|^8.0).", "ext-apcu": "Required to use the APC cache driver.", "ext-fileinfo": "Required to use the Filesystem class.", "ext-ftp": "Required to use the Flysystem FTP driver.", @@ -2786,34 +2376,34 @@ "ext-pcntl": "Required to use all features of the queue worker and console signal trapping.", "ext-pdo": "Required to use all database features.", "ext-posix": "Required to use all features of the queue worker.", - "ext-redis": "Required to use the Redis cache and queue drivers (^4.0|^5.0).", + "ext-redis": "Required to use the Redis cache and queue drivers (^4.0|^5.0|^6.0).", "fakerphp/faker": "Required to use the eloquent factory builder (^1.9.1).", "filp/whoops": "Required for friendly error pages in development (^2.14.3).", - "guzzlehttp/guzzle": "Required to use the HTTP Client and the ping methods on schedules (^7.5).", "laravel/tinker": "Required to use the tinker console command (^2.0).", "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^3.0).", "league/flysystem-ftp": "Required to use the Flysystem FTP driver (^3.0).", "league/flysystem-path-prefixing": "Required to use the scoped driver (^3.3).", "league/flysystem-read-only": "Required to use read-only disks (^3.3)", "league/flysystem-sftp-v3": "Required to use the Flysystem SFTP driver (^3.0).", - "mockery/mockery": "Required to use mocking (^1.5.1).", + "mockery/mockery": "Required to use mocking (^1.6).", "nyholm/psr7": "Required to use PSR-7 bridging features (^1.2).", - "pda/pheanstalk": "Required to use the beanstalk queue driver (^4.0).", - "phpunit/phpunit": "Required to use assertions and run tests (^9.5.8|^10.0.7).", + "pda/pheanstalk": "Required to use the beanstalk queue driver (^5.0).", + "phpunit/phpunit": "Required to use assertions and run tests (^10.5|^11.0).", "predis/predis": "Required to use the predis connector (^2.0.2).", "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).", "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^6.0|^7.0).", - "symfony/cache": "Required to PSR-6 cache bridge (^6.2).", - "symfony/filesystem": "Required to enable support for relative symbolic links (^6.2).", - "symfony/http-client": "Required to enable support for the Symfony API mail transports (^6.2).", - "symfony/mailgun-mailer": "Required to enable support for the Mailgun mail transport (^6.2).", - "symfony/postmark-mailer": "Required to enable support for the Postmark mail transport (^6.2).", - "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^2.0)." + "resend/resend-php": "Required to enable support for the Resend mail transport (^0.10.0).", + "symfony/cache": "Required to PSR-6 cache bridge (^7.0).", + "symfony/filesystem": "Required to enable support for relative symbolic links (^7.0).", + "symfony/http-client": "Required to enable support for the Symfony API mail transports (^7.0).", + "symfony/mailgun-mailer": "Required to enable support for the Mailgun mail transport (^7.0).", + "symfony/postmark-mailer": "Required to enable support for the Postmark mail transport (^7.0).", + "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^7.0)." }, "type": "library", "extra": { "branch-alias": { - "dev-master": "10.x-dev" + "dev-master": "11.x-dev" } }, "autoload": { @@ -2853,7 +2443,7 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2024-08-09T07:55:45+00:00" + "time": "2024-08-20T15:00:52+00:00" }, { "name": "laravel/horizon", @@ -2994,37 +2584,35 @@ }, { "name": "laravel/sanctum", - "version": "v3.3.3", + "version": "v4.0.2", "source": { "type": "git", "url": "https://github.com/laravel/sanctum.git", - "reference": "8c104366459739f3ada0e994bcd3e6fd681ce3d5" + "reference": "9cfc0ce80cabad5334efff73ec856339e8ec1ac1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/sanctum/zipball/8c104366459739f3ada0e994bcd3e6fd681ce3d5", - "reference": "8c104366459739f3ada0e994bcd3e6fd681ce3d5", + "url": "https://api.github.com/repos/laravel/sanctum/zipball/9cfc0ce80cabad5334efff73ec856339e8ec1ac1", + "reference": "9cfc0ce80cabad5334efff73ec856339e8ec1ac1", "shasum": "" }, "require": { "ext-json": "*", - "illuminate/console": "^9.21|^10.0", - "illuminate/contracts": "^9.21|^10.0", - "illuminate/database": "^9.21|^10.0", - "illuminate/support": "^9.21|^10.0", - "php": "^8.0.2" + "illuminate/console": "^11.0", + "illuminate/contracts": "^11.0", + "illuminate/database": "^11.0", + "illuminate/support": "^11.0", + "php": "^8.2", + "symfony/console": "^7.0" }, "require-dev": { - "mockery/mockery": "^1.0", - "orchestra/testbench": "^7.28.2|^8.8.3", + "mockery/mockery": "^1.6", + "orchestra/testbench": "^9.0", "phpstan/phpstan": "^1.10", - "phpunit/phpunit": "^9.6" + "phpunit/phpunit": "^10.5" }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "3.x-dev" - }, "laravel": { "providers": [ "Laravel\\Sanctum\\SanctumServiceProvider" @@ -3056,20 +2644,20 @@ "issues": "https://github.com/laravel/sanctum/issues", "source": "https://github.com/laravel/sanctum" }, - "time": "2023-12-19T18:44:48+00:00" + "time": "2024-04-10T19:39:58+00:00" }, { "name": "laravel/scout", - "version": "v10.8.5", + "version": "v10.11.1", "source": { "type": "git", "url": "https://github.com/laravel/scout.git", - "reference": "db26233becb979d5e2104fa2a931440252a73200" + "reference": "b31056d49ae0540a475947391d7ea8617d779aee" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/scout/zipball/db26233becb979d5e2104fa2a931440252a73200", - "reference": "db26233becb979d5e2104fa2a931440252a73200", + "url": "https://api.github.com/repos/laravel/scout/zipball/b31056d49ae0540a475947391d7ea8617d779aee", + "reference": "b31056d49ae0540a475947391d7ea8617d779aee", "shasum": "" }, "require": { @@ -3091,7 +2679,7 @@ "php-http/guzzle7-adapter": "^1.0", "phpstan/phpstan": "^1.10", "phpunit/phpunit": "^9.3|^10.4", - "typesense/typesense-php": "^4.9" + "typesense/typesense-php": "^4.9.3" }, "suggest": { "algolia/algoliasearch-client-php": "Required to use the Algolia engine (^3.2).", @@ -3134,7 +2722,7 @@ "issues": "https://github.com/laravel/scout/issues", "source": "https://github.com/laravel/scout" }, - "time": "2024-04-02T14:33:18+00:00" + "time": "2024-08-06T15:13:57+00:00" }, { "name": "laravel/serializable-closure", @@ -4273,42 +3861,41 @@ }, { "name": "nesbot/carbon", - "version": "2.72.5", + "version": "3.8.0", "source": { "type": "git", "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "afd46589c216118ecd48ff2b95d77596af1e57ed" + "reference": "bbd3eef89af8ba66a3aa7952b5439168fbcc529f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/afd46589c216118ecd48ff2b95d77596af1e57ed", - "reference": "afd46589c216118ecd48ff2b95d77596af1e57ed", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/bbd3eef89af8ba66a3aa7952b5439168fbcc529f", + "reference": "bbd3eef89af8ba66a3aa7952b5439168fbcc529f", "shasum": "" }, "require": { "carbonphp/carbon-doctrine-types": "*", "ext-json": "*", - "php": "^7.1.8 || ^8.0", + "php": "^8.1", "psr/clock": "^1.0", + "symfony/clock": "^6.3 || ^7.0", "symfony/polyfill-mbstring": "^1.0", - "symfony/polyfill-php80": "^1.16", - "symfony/translation": "^3.4 || ^4.0 || ^5.0 || ^6.0" + "symfony/translation": "^4.4.18 || ^5.2.1|| ^6.0 || ^7.0" }, "provide": { "psr/clock-implementation": "1.0" }, "require-dev": { - "doctrine/dbal": "^2.0 || ^3.1.4 || ^4.0", - "doctrine/orm": "^2.7 || ^3.0", - "friendsofphp/php-cs-fixer": "^3.0", - "kylekatarnls/multi-tester": "^2.0", - "ondrejmirtes/better-reflection": "*", - "phpmd/phpmd": "^2.9", - "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "^0.12.99 || ^1.7.14", - "phpunit/php-file-iterator": "^2.0.5 || ^3.0.6", - "phpunit/phpunit": "^7.5.20 || ^8.5.26 || ^9.5.20", - "squizlabs/php_codesniffer": "^3.4" + "doctrine/dbal": "^3.6.3 || ^4.0", + "doctrine/orm": "^2.15.2 || ^3.0", + "friendsofphp/php-cs-fixer": "^3.57.2", + "kylekatarnls/multi-tester": "^2.5.3", + "ondrejmirtes/better-reflection": "^6.25.0.4", + "phpmd/phpmd": "^2.15.0", + "phpstan/extension-installer": "^1.3.1", + "phpstan/phpstan": "^1.11.2", + "phpunit/phpunit": "^10.5.20", + "squizlabs/php_codesniffer": "^3.9.0" }, "bin": [ "bin/carbon" @@ -4376,7 +3963,7 @@ "type": "tidelift" } ], - "time": "2024-06-03T19:18:41+00:00" + "time": "2024-08-19T06:22:39+00:00" }, { "name": "nette/schema", @@ -4640,33 +4227,32 @@ }, { "name": "nunomaduro/termwind", - "version": "v1.15.1", + "version": "v2.0.1", "source": { "type": "git", "url": "https://github.com/nunomaduro/termwind.git", - "reference": "8ab0b32c8caa4a2e09700ea32925441385e4a5dc" + "reference": "58c4c58cf23df7f498daeb97092e34f5259feb6a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/8ab0b32c8caa4a2e09700ea32925441385e4a5dc", - "reference": "8ab0b32c8caa4a2e09700ea32925441385e4a5dc", + "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/58c4c58cf23df7f498daeb97092e34f5259feb6a", + "reference": "58c4c58cf23df7f498daeb97092e34f5259feb6a", "shasum": "" }, "require": { "ext-mbstring": "*", - "php": "^8.0", - "symfony/console": "^5.3.0|^6.0.0" - }, - "require-dev": { - "ergebnis/phpstan-rules": "^1.0.", - "illuminate/console": "^8.0|^9.0", - "illuminate/support": "^8.0|^9.0", - "laravel/pint": "^1.0.0", - "pestphp/pest": "^1.21.0", - "pestphp/pest-plugin-mock": "^1.0", - "phpstan/phpstan": "^1.4.6", - "phpstan/phpstan-strict-rules": "^1.1.0", - "symfony/var-dumper": "^5.2.7|^6.0.0", + "php": "^8.2", + "symfony/console": "^7.0.4" + }, + "require-dev": { + "ergebnis/phpstan-rules": "^2.2.0", + "illuminate/console": "^11.0.0", + "laravel/pint": "^1.14.0", + "mockery/mockery": "^1.6.7", + "pestphp/pest": "^2.34.1", + "phpstan/phpstan": "^1.10.59", + "phpstan/phpstan-strict-rules": "^1.5.2", + "symfony/var-dumper": "^7.0.4", "thecodingmachine/phpstan-strict-rules": "^1.0.0" }, "type": "library", @@ -4675,6 +4261,9 @@ "providers": [ "Termwind\\Laravel\\TermwindServiceProvider" ] + }, + "branch-alias": { + "dev-2.x": "2.x-dev" } }, "autoload": { @@ -4706,7 +4295,7 @@ ], "support": { "issues": "https://github.com/nunomaduro/termwind/issues", - "source": "https://github.com/nunomaduro/termwind/tree/v1.15.1" + "source": "https://github.com/nunomaduro/termwind/tree/v2.0.1" }, "funding": [ { @@ -4722,7 +4311,7 @@ "type": "github" } ], - "time": "2023-02-08T01:06:31+00:00" + "time": "2024-03-06T16:17:14+00:00" }, { "name": "nyholm/psr7", @@ -4858,71 +4447,6 @@ }, "time": "2024-04-08T08:09:34+00:00" }, - { - "name": "opis/closure", - "version": "3.6.3", - "source": { - "type": "git", - "url": "https://github.com/opis/closure.git", - "reference": "3d81e4309d2a927abbe66df935f4bb60082805ad" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/opis/closure/zipball/3d81e4309d2a927abbe66df935f4bb60082805ad", - "reference": "3d81e4309d2a927abbe66df935f4bb60082805ad", - "shasum": "" - }, - "require": { - "php": "^5.4 || ^7.0 || ^8.0" - }, - "require-dev": { - "jeremeamia/superclosure": "^2.0", - "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.6.x-dev" - } - }, - "autoload": { - "files": [ - "functions.php" - ], - "psr-4": { - "Opis\\Closure\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marius Sarca", - "email": "marius.sarca@gmail.com" - }, - { - "name": "Sorin Sarca", - "email": "sarca_sorin@hotmail.com" - } - ], - "description": "A library that can be used to serialize closures (anonymous functions) and arbitrary objects.", - "homepage": "https://opis.io/closure", - "keywords": [ - "anonymous functions", - "closure", - "function", - "serializable", - "serialization", - "serialize" - ], - "support": { - "issues": "https://github.com/opis/closure/issues", - "source": "https://github.com/opis/closure/tree/3.6.3" - }, - "time": "2022-01-27T09:35:39+00:00" - }, { "name": "paragonie/constant_time_encoding", "version": "v3.0.0", @@ -5117,16 +4641,16 @@ }, { "name": "phpseclib/phpseclib", - "version": "3.0.39", + "version": "3.0.41", "source": { "type": "git", "url": "https://github.com/phpseclib/phpseclib.git", - "reference": "211ebc399c6e73c225a018435fe5ae209d1d1485" + "reference": "621c73f7dcb310b61de34d1da4c4204e8ace6ceb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/211ebc399c6e73c225a018435fe5ae209d1d1485", - "reference": "211ebc399c6e73c225a018435fe5ae209d1d1485", + "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/621c73f7dcb310b61de34d1da4c4204e8ace6ceb", + "reference": "621c73f7dcb310b61de34d1da4c4204e8ace6ceb", "shasum": "" }, "require": { @@ -5207,7 +4731,7 @@ ], "support": { "issues": "https://github.com/phpseclib/phpseclib/issues", - "source": "https://github.com/phpseclib/phpseclib/tree/3.0.39" + "source": "https://github.com/phpseclib/phpseclib/tree/3.0.41" }, "funding": [ { @@ -5223,7 +4747,7 @@ "type": "tidelift" } ], - "time": "2024-06-24T06:27:33+00:00" + "time": "2024-08-12T00:13:54+00:00" }, { "name": "predis/predis", @@ -5271,69 +4795,20 @@ "homepage": "http://github.com/predis/predis", "keywords": [ "nosql", - "predis", - "redis" - ], - "support": { - "issues": "https://github.com/predis/predis/issues", - "source": "https://github.com/predis/predis/tree/v2.2.2" - }, - "funding": [ - { - "url": "https://github.com/sponsors/tillkruss", - "type": "github" - } - ], - "time": "2023-09-13T16:42:03+00:00" - }, - { - "name": "psr/cache", - "version": "3.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/cache.git", - "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", - "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", - "shasum": "" - }, - "require": { - "php": ">=8.0.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Cache\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for caching libraries", - "keywords": [ - "cache", - "psr", - "psr-6" + "predis", + "redis" ], "support": { - "source": "https://github.com/php-fig/cache/tree/3.0.0" + "issues": "https://github.com/predis/predis/issues", + "source": "https://github.com/predis/predis/tree/v2.2.2" }, - "time": "2021-02-03T23:26:27+00:00" + "funding": [ + { + "url": "https://github.com/sponsors/tillkruss", + "type": "github" + } + ], + "time": "2023-09-13T16:42:03+00:00" }, { "name": "psr/clock", @@ -5648,16 +5123,16 @@ }, { "name": "psr/log", - "version": "3.0.0", + "version": "3.0.1", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001" + "reference": "79dff0b268932c640297f5208d6298f71855c03e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001", - "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001", + "url": "https://api.github.com/repos/php-fig/log/zipball/79dff0b268932c640297f5208d6298f71855c03e", + "reference": "79dff0b268932c640297f5208d6298f71855c03e", "shasum": "" }, "require": { @@ -5692,9 +5167,9 @@ "psr-3" ], "support": { - "source": "https://github.com/php-fig/log/tree/3.0.0" + "source": "https://github.com/php-fig/log/tree/3.0.1" }, - "time": "2021-07-14T16:46:02+00:00" + "time": "2024-08-21T13:31:24+00:00" }, { "name": "psr/simple-cache", @@ -5749,16 +5224,16 @@ }, { "name": "psy/psysh", - "version": "v0.12.3", + "version": "v0.12.4", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "b6b6cce7d3ee8fbf31843edce5e8f5a72eff4a73" + "reference": "2fd717afa05341b4f8152547f142cd2f130f6818" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/b6b6cce7d3ee8fbf31843edce5e8f5a72eff4a73", - "reference": "b6b6cce7d3ee8fbf31843edce5e8f5a72eff4a73", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/2fd717afa05341b4f8152547f142cd2f130f6818", + "reference": "2fd717afa05341b4f8152547f142cd2f130f6818", "shasum": "" }, "require": { @@ -5822,9 +5297,9 @@ ], "support": { "issues": "https://github.com/bobthecow/psysh/issues", - "source": "https://github.com/bobthecow/psysh/tree/v0.12.3" + "source": "https://github.com/bobthecow/psysh/tree/v0.12.4" }, - "time": "2024-04-02T15:57:53+00:00" + "time": "2024-06-10T01:18:23+00:00" }, { "name": "ralouphie/getallheaders", @@ -6280,16 +5755,16 @@ }, { "name": "spatie/backtrace", - "version": "1.6.1", + "version": "1.6.2", "source": { "type": "git", "url": "https://github.com/spatie/backtrace.git", - "reference": "8373b9d51638292e3bfd736a9c19a654111b4a23" + "reference": "1a9a145b044677ae3424693f7b06479fc8c137a9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/backtrace/zipball/8373b9d51638292e3bfd736a9c19a654111b4a23", - "reference": "8373b9d51638292e3bfd736a9c19a654111b4a23", + "url": "https://api.github.com/repos/spatie/backtrace/zipball/1a9a145b044677ae3424693f7b06479fc8c137a9", + "reference": "1a9a145b044677ae3424693f7b06479fc8c137a9", "shasum": "" }, "require": { @@ -6327,7 +5802,7 @@ "spatie" ], "support": { - "source": "https://github.com/spatie/backtrace/tree/1.6.1" + "source": "https://github.com/spatie/backtrace/tree/1.6.2" }, "funding": [ { @@ -6339,20 +5814,20 @@ "type": "other" } ], - "time": "2024-04-24T13:22:11+00:00" + "time": "2024-07-22T08:21:24+00:00" }, { "name": "spatie/browsershot", - "version": "4.0.5", + "version": "4.3.0", "source": { "type": "git", "url": "https://github.com/spatie/browsershot.git", - "reference": "a080a60b6fc8dc359aaebd761eb107985e08e340" + "reference": "601f2758191d8c46b2ea587eea935a87da4f39e8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/browsershot/zipball/a080a60b6fc8dc359aaebd761eb107985e08e340", - "reference": "a080a60b6fc8dc359aaebd761eb107985e08e340", + "url": "https://api.github.com/repos/spatie/browsershot/zipball/601f2758191d8c46b2ea587eea935a87da4f39e8", + "reference": "601f2758191d8c46b2ea587eea935a87da4f39e8", "shasum": "" }, "require": { @@ -6365,6 +5840,7 @@ "require-dev": { "pestphp/pest": "^1.20", "spatie/image": "^3.6", + "spatie/pdf-to-text": "^1.52", "spatie/phpunit-snapshot-assertions": "^4.2.3" }, "type": "library", @@ -6398,7 +5874,7 @@ "webpage" ], "support": { - "source": "https://github.com/spatie/browsershot/tree/4.0.5" + "source": "https://github.com/spatie/browsershot/tree/4.3.0" }, "funding": [ { @@ -6406,20 +5882,20 @@ "type": "github" } ], - "time": "2024-06-04T11:11:30+00:00" + "time": "2024-08-22T09:14:07+00:00" }, { "name": "spatie/crawler", - "version": "8.2.0", + "version": "8.2.3", "source": { "type": "git", "url": "https://github.com/spatie/crawler.git", - "reference": "807d145a3c071dc0e69bb7e6783611e2591f9773" + "reference": "c659f2fe4954249755990e42394a14d6d847a0a7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/crawler/zipball/807d145a3c071dc0e69bb7e6783611e2591f9773", - "reference": "807d145a3c071dc0e69bb7e6783611e2591f9773", + "url": "https://api.github.com/repos/spatie/crawler/zipball/c659f2fe4954249755990e42394a14d6d847a0a7", + "reference": "c659f2fe4954249755990e42394a14d6d847a0a7", "shasum": "" }, "require": { @@ -6462,7 +5938,7 @@ ], "support": { "issues": "https://github.com/spatie/crawler/issues", - "source": "https://github.com/spatie/crawler/tree/8.2.0" + "source": "https://github.com/spatie/crawler/tree/8.2.3" }, "funding": [ { @@ -6474,20 +5950,20 @@ "type": "github" } ], - "time": "2024-02-15T10:40:48+00:00" + "time": "2024-07-31T10:46:19+00:00" }, { "name": "spatie/error-solutions", - "version": "1.0.0", + "version": "1.1.1", "source": { "type": "git", "url": "https://github.com/spatie/error-solutions.git", - "reference": "202108314a6988ede156fba1b3ea80a784c1734a" + "reference": "ae7393122eda72eed7cc4f176d1e96ea444f2d67" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/error-solutions/zipball/202108314a6988ede156fba1b3ea80a784c1734a", - "reference": "202108314a6988ede156fba1b3ea80a784c1734a", + "url": "https://api.github.com/repos/spatie/error-solutions/zipball/ae7393122eda72eed7cc4f176d1e96ea444f2d67", + "reference": "ae7393122eda72eed7cc4f176d1e96ea444f2d67", "shasum": "" }, "require": { @@ -6540,7 +6016,7 @@ ], "support": { "issues": "https://github.com/spatie/error-solutions/issues", - "source": "https://github.com/spatie/error-solutions/tree/1.0.0" + "source": "https://github.com/spatie/error-solutions/tree/1.1.1" }, "funding": [ { @@ -6548,20 +6024,20 @@ "type": "github" } ], - "time": "2024-06-12T14:49:54+00:00" + "time": "2024-07-25T11:06:04+00:00" }, { "name": "spatie/flare-client-php", - "version": "1.7.0", + "version": "1.8.0", "source": { "type": "git", "url": "https://github.com/spatie/flare-client-php.git", - "reference": "097040ff51e660e0f6fc863684ac4b02c93fa234" + "reference": "180f8ca4c0d0d6fc51477bd8c53ce37ab5a96122" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/flare-client-php/zipball/097040ff51e660e0f6fc863684ac4b02c93fa234", - "reference": "097040ff51e660e0f6fc863684ac4b02c93fa234", + "url": "https://api.github.com/repos/spatie/flare-client-php/zipball/180f8ca4c0d0d6fc51477bd8c53ce37ab5a96122", + "reference": "180f8ca4c0d0d6fc51477bd8c53ce37ab5a96122", "shasum": "" }, "require": { @@ -6579,7 +6055,7 @@ "phpstan/extension-installer": "^1.1", "phpstan/phpstan-deprecation-rules": "^1.0", "phpstan/phpstan-phpunit": "^1.0", - "spatie/phpunit-snapshot-assertions": "^4.0|^5.0" + "spatie/pest-plugin-snapshots": "^1.0|^2.0" }, "type": "library", "extra": { @@ -6609,7 +6085,7 @@ ], "support": { "issues": "https://github.com/spatie/flare-client-php/issues", - "source": "https://github.com/spatie/flare-client-php/tree/1.7.0" + "source": "https://github.com/spatie/flare-client-php/tree/1.8.0" }, "funding": [ { @@ -6617,7 +6093,7 @@ "type": "github" } ], - "time": "2024-06-12T14:39:14+00:00" + "time": "2024-08-01T08:27:26+00:00" }, { "name": "spatie/ignition", @@ -6887,16 +6363,16 @@ }, { "name": "spatie/laravel-package-tools", - "version": "1.16.4", + "version": "1.16.5", "source": { "type": "git", "url": "https://github.com/spatie/laravel-package-tools.git", - "reference": "ddf678e78d7f8b17e5cdd99c0c3413a4a6592e53" + "reference": "c7413972cf22ffdff97b68499c22baa04eddb6a2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/ddf678e78d7f8b17e5cdd99c0c3413a4a6592e53", - "reference": "ddf678e78d7f8b17e5cdd99c0c3413a4a6592e53", + "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/c7413972cf22ffdff97b68499c22baa04eddb6a2", + "reference": "c7413972cf22ffdff97b68499c22baa04eddb6a2", "shasum": "" }, "require": { @@ -6935,7 +6411,7 @@ ], "support": { "issues": "https://github.com/spatie/laravel-package-tools/issues", - "source": "https://github.com/spatie/laravel-package-tools/tree/1.16.4" + "source": "https://github.com/spatie/laravel-package-tools/tree/1.16.5" }, "funding": [ { @@ -6943,67 +6419,7 @@ "type": "github" } ], - "time": "2024-03-20T07:29:11+00:00" - }, - { - "name": "spatie/laravel-robots-middleware", - "version": "1.4.0", - "source": { - "type": "git", - "url": "https://github.com/spatie/laravel-robots-middleware.git", - "reference": "a2dfecbede3acaf7d47d13de456932b7aaa6950c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-robots-middleware/zipball/a2dfecbede3acaf7d47d13de456932b7aaa6950c", - "reference": "a2dfecbede3acaf7d47d13de456932b7aaa6950c", - "shasum": "" - }, - "require": { - "illuminate/http": "^10|^11.0", - "php": "^8.2" - }, - "require-dev": { - "orchestra/testbench": "^8.0|^9.0", - "phpunit/phpunit": "^9.4|^10.5" - }, - "type": "library", - "autoload": { - "psr-4": { - "Spatie\\RobotsMiddleware\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Sebastian De Deyne", - "email": "sebastian@spatie.be", - "homepage": "https://spatie.be", - "role": "Developer" - } - ], - "description": "Add an `all` or `none` robots header to your requests via a middleware in Laravel", - "homepage": "https://github.com/spatie/laravel-robots-middleware", - "keywords": [ - "index", - "robots", - "seo", - "spatie" - ], - "support": { - "issues": "https://github.com/spatie/laravel-robots-middleware/issues", - "source": "https://github.com/spatie/laravel-robots-middleware/tree/1.4.0" - }, - "funding": [ - { - "url": "https://spatie.be/open-source/support-us", - "type": "custom" - } - ], - "time": "2024-03-11T16:05:11+00:00" + "time": "2024-08-27T18:56:10+00:00" }, { "name": "spatie/laravel-schedule-monitor", @@ -7159,16 +6575,16 @@ }, { "name": "spatie/robots-txt", - "version": "2.2.0", + "version": "2.2.1", "source": { "type": "git", "url": "https://github.com/spatie/robots-txt.git", - "reference": "02722a0256731e7996bb9d0e544238a408e78bf5" + "reference": "db55c5f4aef0bd8576b03b80dc3ede3d176b9cdf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/robots-txt/zipball/02722a0256731e7996bb9d0e544238a408e78bf5", - "reference": "02722a0256731e7996bb9d0e544238a408e78bf5", + "url": "https://api.github.com/repos/spatie/robots-txt/zipball/db55c5f4aef0bd8576b03b80dc3ede3d176b9cdf", + "reference": "db55c5f4aef0bd8576b03b80dc3ede3d176b9cdf", "shasum": "" }, "require": { @@ -7203,7 +6619,7 @@ ], "support": { "issues": "https://github.com/spatie/robots-txt/issues", - "source": "https://github.com/spatie/robots-txt/tree/2.2.0" + "source": "https://github.com/spatie/robots-txt/tree/2.2.1" }, "funding": [ { @@ -7215,7 +6631,7 @@ "type": "github" } ], - "time": "2024-04-22T14:28:40+00:00" + "time": "2024-08-09T09:07:48+00:00" }, { "name": "spatie/temporary-directory", @@ -7278,49 +6694,122 @@ ], "time": "2023-12-25T11:46:58+00:00" }, + { + "name": "symfony/clock", + "version": "v7.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/clock.git", + "reference": "3dfc8b084853586de51dd1441c6242c76a28cbe7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/clock/zipball/3dfc8b084853586de51dd1441c6242c76a28cbe7", + "reference": "3dfc8b084853586de51dd1441c6242c76a28cbe7", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/clock": "^1.0", + "symfony/polyfill-php83": "^1.28" + }, + "provide": { + "psr/clock-implementation": "1.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/now.php" + ], + "psr-4": { + "Symfony\\Component\\Clock\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Decouples applications from the system clock", + "homepage": "https://symfony.com", + "keywords": [ + "clock", + "psr20", + "time" + ], + "support": { + "source": "https://github.com/symfony/clock/tree/v7.1.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-05-31T14:57:53+00:00" + }, { "name": "symfony/console", - "version": "v6.4.10", + "version": "v7.1.3", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "504974cbe43d05f83b201d6498c206f16fc0cdbc" + "reference": "cb1dcb30ebc7005c29864ee78adb47b5fb7c3cd9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/504974cbe43d05f83b201d6498c206f16fc0cdbc", - "reference": "504974cbe43d05f83b201d6498c206f16fc0cdbc", + "url": "https://api.github.com/repos/symfony/console/zipball/cb1dcb30ebc7005c29864ee78adb47b5fb7c3cd9", + "reference": "cb1dcb30ebc7005c29864ee78adb47b5fb7c3cd9", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3", + "php": ">=8.2", "symfony/polyfill-mbstring": "~1.0", "symfony/service-contracts": "^2.5|^3", - "symfony/string": "^5.4|^6.0|^7.0" + "symfony/string": "^6.4|^7.0" }, "conflict": { - "symfony/dependency-injection": "<5.4", - "symfony/dotenv": "<5.4", - "symfony/event-dispatcher": "<5.4", - "symfony/lock": "<5.4", - "symfony/process": "<5.4" + "symfony/dependency-injection": "<6.4", + "symfony/dotenv": "<6.4", + "symfony/event-dispatcher": "<6.4", + "symfony/lock": "<6.4", + "symfony/process": "<6.4" }, "provide": { "psr/log-implementation": "1.0|2.0|3.0" }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/config": "^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/event-dispatcher": "^6.4|^7.0", "symfony/http-foundation": "^6.4|^7.0", "symfony/http-kernel": "^6.4|^7.0", - "symfony/lock": "^5.4|^6.0|^7.0", - "symfony/messenger": "^5.4|^6.0|^7.0", - "symfony/process": "^5.4|^6.0|^7.0", - "symfony/stopwatch": "^5.4|^6.0|^7.0", - "symfony/var-dumper": "^5.4|^6.0|^7.0" + "symfony/lock": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/stopwatch": "^6.4|^7.0", + "symfony/var-dumper": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -7354,7 +6843,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.4.10" + "source": "https://github.com/symfony/console/tree/v7.1.3" }, "funding": [ { @@ -7370,7 +6859,7 @@ "type": "tidelift" } ], - "time": "2024-07-26T12:30:32+00:00" + "time": "2024-07-26T12:41:01+00:00" }, { "name": "symfony/css-selector", @@ -7573,22 +7062,22 @@ }, { "name": "symfony/error-handler", - "version": "v6.4.10", + "version": "v7.1.3", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "231f1b2ee80f72daa1972f7340297d67439224f0" + "reference": "432bb369952795c61ca1def65e078c4a80dad13c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/231f1b2ee80f72daa1972f7340297d67439224f0", - "reference": "231f1b2ee80f72daa1972f7340297d67439224f0", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/432bb369952795c61ca1def65e078c4a80dad13c", + "reference": "432bb369952795c61ca1def65e078c4a80dad13c", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "psr/log": "^1|^2|^3", - "symfony/var-dumper": "^5.4|^6.0|^7.0" + "symfony/var-dumper": "^6.4|^7.0" }, "conflict": { "symfony/deprecation-contracts": "<2.5", @@ -7597,7 +7086,7 @@ "require-dev": { "symfony/deprecation-contracts": "^2.5|^3", "symfony/http-kernel": "^6.4|^7.0", - "symfony/serializer": "^5.4|^6.0|^7.0" + "symfony/serializer": "^6.4|^7.0" }, "bin": [ "Resources/bin/patch-type-declarations" @@ -7628,7 +7117,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v6.4.10" + "source": "https://github.com/symfony/error-handler/tree/v7.1.3" }, "funding": [ { @@ -7644,7 +7133,7 @@ "type": "tidelift" } ], - "time": "2024-07-26T12:30:32+00:00" + "time": "2024-07-26T13:02:51+00:00" }, { "name": "symfony/event-dispatcher", @@ -7804,23 +7293,23 @@ }, { "name": "symfony/finder", - "version": "v6.4.10", + "version": "v7.1.3", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "af29198d87112bebdd397bd7735fbd115997824c" + "reference": "717c6329886f32dc65e27461f80f2a465412fdca" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/af29198d87112bebdd397bd7735fbd115997824c", - "reference": "af29198d87112bebdd397bd7735fbd115997824c", + "url": "https://api.github.com/repos/symfony/finder/zipball/717c6329886f32dc65e27461f80f2a465412fdca", + "reference": "717c6329886f32dc65e27461f80f2a465412fdca", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "require-dev": { - "symfony/filesystem": "^6.0|^7.0" + "symfony/filesystem": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -7848,7 +7337,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v6.4.10" + "source": "https://github.com/symfony/finder/tree/v7.1.3" }, "funding": [ { @@ -7864,7 +7353,7 @@ "type": "tidelift" } ], - "time": "2024-07-24T07:06:38+00:00" + "time": "2024-07-24T07:08:44+00:00" }, { "name": "symfony/http-client", @@ -8040,36 +7529,36 @@ }, { "name": "symfony/http-foundation", - "version": "v6.4.10", + "version": "v7.1.3", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "117f1f20a7ade7bcea28b861fb79160a21a1e37b" + "reference": "f602d5c17d1fa02f8019ace2687d9d136b7f4a1a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/117f1f20a7ade7bcea28b861fb79160a21a1e37b", - "reference": "117f1f20a7ade7bcea28b861fb79160a21a1e37b", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/f602d5c17d1fa02f8019ace2687d9d136b7f4a1a", + "reference": "f602d5c17d1fa02f8019ace2687d9d136b7f4a1a", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3", + "php": ">=8.2", "symfony/polyfill-mbstring": "~1.1", "symfony/polyfill-php83": "^1.27" }, "conflict": { - "symfony/cache": "<6.3" + "doctrine/dbal": "<3.6", + "symfony/cache": "<6.4" }, "require-dev": { - "doctrine/dbal": "^2.13.1|^3|^4", + "doctrine/dbal": "^3.6|^4", "predis/predis": "^1.1|^2.0", - "symfony/cache": "^6.3|^7.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4|^7.0", - "symfony/mime": "^5.4|^6.0|^7.0", - "symfony/rate-limiter": "^5.4|^6.0|^7.0" + "symfony/cache": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/mime": "^6.4|^7.0", + "symfony/rate-limiter": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -8097,7 +7586,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v6.4.10" + "source": "https://github.com/symfony/http-foundation/tree/v7.1.3" }, "funding": [ { @@ -8113,77 +7602,77 @@ "type": "tidelift" } ], - "time": "2024-07-26T12:36:27+00:00" + "time": "2024-07-26T12:41:01+00:00" }, { "name": "symfony/http-kernel", - "version": "v6.4.10", + "version": "v7.1.3", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "147e0daf618d7575b5007055340d09aece5cf068" + "reference": "db9702f3a04cc471ec8c70e881825db26ac5f186" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/147e0daf618d7575b5007055340d09aece5cf068", - "reference": "147e0daf618d7575b5007055340d09aece5cf068", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/db9702f3a04cc471ec8c70e881825db26ac5f186", + "reference": "db9702f3a04cc471ec8c70e881825db26ac5f186", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "psr/log": "^1|^2|^3", "symfony/deprecation-contracts": "^2.5|^3", "symfony/error-handler": "^6.4|^7.0", - "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/event-dispatcher": "^6.4|^7.0", "symfony/http-foundation": "^6.4|^7.0", "symfony/polyfill-ctype": "^1.8" }, "conflict": { - "symfony/browser-kit": "<5.4", - "symfony/cache": "<5.4", - "symfony/config": "<6.1", - "symfony/console": "<5.4", + "symfony/browser-kit": "<6.4", + "symfony/cache": "<6.4", + "symfony/config": "<6.4", + "symfony/console": "<6.4", "symfony/dependency-injection": "<6.4", - "symfony/doctrine-bridge": "<5.4", - "symfony/form": "<5.4", - "symfony/http-client": "<5.4", + "symfony/doctrine-bridge": "<6.4", + "symfony/form": "<6.4", + "symfony/http-client": "<6.4", "symfony/http-client-contracts": "<2.5", - "symfony/mailer": "<5.4", - "symfony/messenger": "<5.4", - "symfony/translation": "<5.4", + "symfony/mailer": "<6.4", + "symfony/messenger": "<6.4", + "symfony/translation": "<6.4", "symfony/translation-contracts": "<2.5", - "symfony/twig-bridge": "<5.4", + "symfony/twig-bridge": "<6.4", "symfony/validator": "<6.4", - "symfony/var-dumper": "<6.3", - "twig/twig": "<2.13" + "symfony/var-dumper": "<6.4", + "twig/twig": "<3.0.4" }, "provide": { "psr/log-implementation": "1.0|2.0|3.0" }, "require-dev": { "psr/cache": "^1.0|^2.0|^3.0", - "symfony/browser-kit": "^5.4|^6.0|^7.0", - "symfony/clock": "^6.2|^7.0", - "symfony/config": "^6.1|^7.0", - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/css-selector": "^5.4|^6.0|^7.0", + "symfony/browser-kit": "^6.4|^7.0", + "symfony/clock": "^6.4|^7.0", + "symfony/config": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0", + "symfony/css-selector": "^6.4|^7.0", "symfony/dependency-injection": "^6.4|^7.0", - "symfony/dom-crawler": "^5.4|^6.0|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/finder": "^5.4|^6.0|^7.0", + "symfony/dom-crawler": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/finder": "^6.4|^7.0", "symfony/http-client-contracts": "^2.5|^3", - "symfony/process": "^5.4|^6.0|^7.0", - "symfony/property-access": "^5.4.5|^6.0.5|^7.0", - "symfony/routing": "^5.4|^6.0|^7.0", - "symfony/serializer": "^6.4.4|^7.0.4", - "symfony/stopwatch": "^5.4|^6.0|^7.0", - "symfony/translation": "^5.4|^6.0|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/property-access": "^7.1", + "symfony/routing": "^6.4|^7.0", + "symfony/serializer": "^7.1", + "symfony/stopwatch": "^6.4|^7.0", + "symfony/translation": "^6.4|^7.0", "symfony/translation-contracts": "^2.5|^3", - "symfony/uid": "^5.4|^6.0|^7.0", + "symfony/uid": "^6.4|^7.0", "symfony/validator": "^6.4|^7.0", - "symfony/var-dumper": "^5.4|^6.4|^7.0", - "symfony/var-exporter": "^6.2|^7.0", - "twig/twig": "^2.13|^3.0.4" + "symfony/var-dumper": "^6.4|^7.0", + "symfony/var-exporter": "^6.4|^7.0", + "twig/twig": "^3.0.4" }, "type": "library", "autoload": { @@ -8211,7 +7700,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v6.4.10" + "source": "https://github.com/symfony/http-kernel/tree/v7.1.3" }, "funding": [ { @@ -8227,43 +7716,43 @@ "type": "tidelift" } ], - "time": "2024-07-26T14:52:04+00:00" + "time": "2024-07-26T14:58:15+00:00" }, { "name": "symfony/mailer", - "version": "v6.4.9", + "version": "v7.1.2", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "e2d56f180f5b8c5e7c0fbea872bb1f529b6d6d45" + "reference": "8fcff0af9043c8f8a8e229437cea363e282f9aee" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/e2d56f180f5b8c5e7c0fbea872bb1f529b6d6d45", - "reference": "e2d56f180f5b8c5e7c0fbea872bb1f529b6d6d45", + "url": "https://api.github.com/repos/symfony/mailer/zipball/8fcff0af9043c8f8a8e229437cea363e282f9aee", + "reference": "8fcff0af9043c8f8a8e229437cea363e282f9aee", "shasum": "" }, "require": { "egulias/email-validator": "^2.1.10|^3|^4", - "php": ">=8.1", + "php": ">=8.2", "psr/event-dispatcher": "^1", "psr/log": "^1|^2|^3", - "symfony/event-dispatcher": "^5.4|^6.0|^7.0", - "symfony/mime": "^6.2|^7.0", + "symfony/event-dispatcher": "^6.4|^7.0", + "symfony/mime": "^6.4|^7.0", "symfony/service-contracts": "^2.5|^3" }, "conflict": { "symfony/http-client-contracts": "<2.5", - "symfony/http-kernel": "<5.4", - "symfony/messenger": "<6.2", - "symfony/mime": "<6.2", - "symfony/twig-bridge": "<6.2.1" + "symfony/http-kernel": "<6.4", + "symfony/messenger": "<6.4", + "symfony/mime": "<6.4", + "symfony/twig-bridge": "<6.4" }, "require-dev": { - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/http-client": "^5.4|^6.0|^7.0", - "symfony/messenger": "^6.2|^7.0", - "symfony/twig-bridge": "^6.2|^7.0" + "symfony/console": "^6.4|^7.0", + "symfony/http-client": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/twig-bridge": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -8291,7 +7780,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v6.4.9" + "source": "https://github.com/symfony/mailer/tree/v7.1.2" }, "funding": [ { @@ -8307,7 +7796,7 @@ "type": "tidelift" } ], - "time": "2024-06-28T07:59:05+00:00" + "time": "2024-06-28T08:00:31+00:00" }, { "name": "symfony/mailgun-mailer", @@ -8380,21 +7869,20 @@ }, { "name": "symfony/mime", - "version": "v6.4.9", + "version": "v7.1.2", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "7d048964877324debdcb4e0549becfa064a20d43" + "reference": "26a00b85477e69a4bab63b66c5dce64f18b0cbfc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/7d048964877324debdcb4e0549becfa064a20d43", - "reference": "7d048964877324debdcb4e0549becfa064a20d43", + "url": "https://api.github.com/repos/symfony/mime/zipball/26a00b85477e69a4bab63b66c5dce64f18b0cbfc", + "reference": "26a00b85477e69a4bab63b66c5dce64f18b0cbfc", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3", + "php": ">=8.2", "symfony/polyfill-intl-idn": "^1.10", "symfony/polyfill-mbstring": "^1.0" }, @@ -8402,17 +7890,17 @@ "egulias/email-validator": "~3.0.0", "phpdocumentor/reflection-docblock": "<3.2.2", "phpdocumentor/type-resolver": "<1.4.0", - "symfony/mailer": "<5.4", + "symfony/mailer": "<6.4", "symfony/serializer": "<6.4.3|>7.0,<7.0.3" }, "require-dev": { "egulias/email-validator": "^2.1.10|^3.1|^4", "league/html-to-markdown": "^5.0", "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/process": "^5.4|^6.4|^7.0", - "symfony/property-access": "^5.4|^6.0|^7.0", - "symfony/property-info": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/property-access": "^6.4|^7.0", + "symfony/property-info": "^6.4|^7.0", "symfony/serializer": "^6.4.3|^7.0.3" }, "type": "library", @@ -8445,7 +7933,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v6.4.9" + "source": "https://github.com/symfony/mime/tree/v7.1.2" }, "funding": [ { @@ -8461,7 +7949,7 @@ "type": "tidelift" } ], - "time": "2024-06-28T09:49:33+00:00" + "time": "2024-06-28T10:03:55+00:00" }, { "name": "symfony/options-resolver", @@ -9242,20 +8730,20 @@ }, { "name": "symfony/process", - "version": "v6.4.8", + "version": "v7.1.3", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "8d92dd79149f29e89ee0f480254db595f6a6a2c5" + "reference": "7f2f542c668ad6c313dc4a5e9c3321f733197eca" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/8d92dd79149f29e89ee0f480254db595f6a6a2c5", - "reference": "8d92dd79149f29e89ee0f480254db595f6a6a2c5", + "url": "https://api.github.com/repos/symfony/process/zipball/7f2f542c668ad6c313dc4a5e9c3321f733197eca", + "reference": "7f2f542c668ad6c313dc4a5e9c3321f733197eca", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "type": "library", "autoload": { @@ -9283,7 +8771,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v6.4.8" + "source": "https://github.com/symfony/process/tree/v7.1.3" }, "funding": [ { @@ -9299,7 +8787,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-07-26T12:44:47+00:00" }, { "name": "symfony/psr-http-message-bridge", @@ -9386,36 +8874,34 @@ }, { "name": "symfony/routing", - "version": "v6.4.10", + "version": "v7.1.3", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "aad19fe10753ba842f0d653a8db819c4b3affa87" + "reference": "8a908a3f22d5a1b5d297578c2ceb41b02fa916d0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/aad19fe10753ba842f0d653a8db819c4b3affa87", - "reference": "aad19fe10753ba842f0d653a8db819c4b3affa87", + "url": "https://api.github.com/repos/symfony/routing/zipball/8a908a3f22d5a1b5d297578c2ceb41b02fa916d0", + "reference": "8a908a3f22d5a1b5d297578c2ceb41b02fa916d0", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3" }, "conflict": { - "doctrine/annotations": "<1.12", - "symfony/config": "<6.2", - "symfony/dependency-injection": "<5.4", - "symfony/yaml": "<5.4" + "symfony/config": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/yaml": "<6.4" }, "require-dev": { - "doctrine/annotations": "^1.12|^2", "psr/log": "^1|^2|^3", - "symfony/config": "^6.2|^7.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/http-foundation": "^5.4|^6.0|^7.0", - "symfony/yaml": "^5.4|^6.0|^7.0" + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/yaml": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -9449,7 +8935,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v6.4.10" + "source": "https://github.com/symfony/routing/tree/v7.1.3" }, "funding": [ { @@ -9465,7 +8951,7 @@ "type": "tidelift" } ], - "time": "2024-07-15T09:26:24+00:00" + "time": "2024-07-17T06:10:24+00:00" }, { "name": "symfony/service-contracts", @@ -9639,33 +9125,32 @@ }, { "name": "symfony/translation", - "version": "v6.4.10", + "version": "v7.1.3", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "94041203f8ac200ae9e7c6a18fa6137814ccecc9" + "reference": "8d5e50c813ba2859a6dfc99a0765c550507934a1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/94041203f8ac200ae9e7c6a18fa6137814ccecc9", - "reference": "94041203f8ac200ae9e7c6a18fa6137814ccecc9", + "url": "https://api.github.com/repos/symfony/translation/zipball/8d5e50c813ba2859a6dfc99a0765c550507934a1", + "reference": "8d5e50c813ba2859a6dfc99a0765c550507934a1", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3", + "php": ">=8.2", "symfony/polyfill-mbstring": "~1.0", "symfony/translation-contracts": "^2.5|^3.0" }, "conflict": { - "symfony/config": "<5.4", - "symfony/console": "<5.4", - "symfony/dependency-injection": "<5.4", + "symfony/config": "<6.4", + "symfony/console": "<6.4", + "symfony/dependency-injection": "<6.4", "symfony/http-client-contracts": "<2.5", - "symfony/http-kernel": "<5.4", + "symfony/http-kernel": "<6.4", "symfony/service-contracts": "<2.5", - "symfony/twig-bundle": "<5.4", - "symfony/yaml": "<5.4" + "symfony/twig-bundle": "<6.4", + "symfony/yaml": "<6.4" }, "provide": { "symfony/translation-implementation": "2.3|3.0" @@ -9673,17 +9158,17 @@ "require-dev": { "nikic/php-parser": "^4.18|^5.0", "psr/log": "^1|^2|^3", - "symfony/config": "^5.4|^6.0|^7.0", - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/finder": "^5.4|^6.0|^7.0", + "symfony/config": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/finder": "^6.4|^7.0", "symfony/http-client-contracts": "^2.5|^3.0", - "symfony/http-kernel": "^5.4|^6.0|^7.0", - "symfony/intl": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/intl": "^6.4|^7.0", "symfony/polyfill-intl-icu": "^1.21", - "symfony/routing": "^5.4|^6.0|^7.0", + "symfony/routing": "^6.4|^7.0", "symfony/service-contracts": "^2.5|^3", - "symfony/yaml": "^5.4|^6.0|^7.0" + "symfony/yaml": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -9714,7 +9199,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v6.4.10" + "source": "https://github.com/symfony/translation/tree/v7.1.3" }, "funding": [ { @@ -9730,7 +9215,7 @@ "type": "tidelift" } ], - "time": "2024-07-26T12:30:32+00:00" + "time": "2024-07-26T12:41:01+00:00" }, { "name": "symfony/translation-contracts", @@ -9812,24 +9297,24 @@ }, { "name": "symfony/uid", - "version": "v6.4.8", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/uid.git", - "reference": "35904eca37a84bb764c560cbfcac9f0ac2bcdbdf" + "reference": "bb59febeecc81528ff672fad5dab7f06db8c8277" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/uid/zipball/35904eca37a84bb764c560cbfcac9f0ac2bcdbdf", - "reference": "35904eca37a84bb764c560cbfcac9f0ac2bcdbdf", + "url": "https://api.github.com/repos/symfony/uid/zipball/bb59febeecc81528ff672fad5dab7f06db8c8277", + "reference": "bb59febeecc81528ff672fad5dab7f06db8c8277", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/polyfill-uuid": "^1.15" }, "require-dev": { - "symfony/console": "^5.4|^6.0|^7.0" + "symfony/console": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -9866,7 +9351,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/uid/tree/v6.4.8" + "source": "https://github.com/symfony/uid/tree/v7.1.1" }, "funding": [ { @@ -9882,38 +9367,36 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { "name": "symfony/var-dumper", - "version": "v6.4.10", + "version": "v7.1.3", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "a71cc3374f5fb9759da1961d28c452373b343dd4" + "reference": "86af4617cca75a6e28598f49ae0690f3b9d4591f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/a71cc3374f5fb9759da1961d28c452373b343dd4", - "reference": "a71cc3374f5fb9759da1961d28c452373b343dd4", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/86af4617cca75a6e28598f49ae0690f3b9d4591f", + "reference": "86af4617cca75a6e28598f49ae0690f3b9d4591f", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3", + "php": ">=8.2", "symfony/polyfill-mbstring": "~1.0" }, "conflict": { - "symfony/console": "<5.4" + "symfony/console": "<6.4" }, "require-dev": { "ext-iconv": "*", - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/error-handler": "^6.3|^7.0", - "symfony/http-kernel": "^5.4|^6.0|^7.0", - "symfony/process": "^5.4|^6.0|^7.0", - "symfony/uid": "^5.4|^6.0|^7.0", - "twig/twig": "^2.13|^3.0.4" + "symfony/console": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/uid": "^6.4|^7.0", + "twig/twig": "^3.0.4" }, "bin": [ "Resources/bin/var-dump-server" @@ -9951,7 +9434,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v6.4.10" + "source": "https://github.com/symfony/var-dumper/tree/v7.1.3" }, "funding": [ { @@ -9967,7 +9450,7 @@ "type": "tidelift" } ], - "time": "2024-07-26T12:30:32+00:00" + "time": "2024-07-26T12:41:01+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", @@ -10334,6 +9817,53 @@ ], "time": "2024-02-20T07:24:02+00:00" }, + { + "name": "doctrine/deprecations", + "version": "1.1.3", + "source": { + "type": "git", + "url": "https://github.com/doctrine/deprecations.git", + "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", + "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9", + "phpstan/phpstan": "1.4.10 || 1.10.15", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psalm/plugin-phpunit": "0.18.4", + "psr/log": "^1 || ^2 || ^3", + "vimeo/psalm": "4.30.0 || 5.12.0" + }, + "suggest": { + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", + "homepage": "https://www.doctrine-project.org/", + "support": { + "issues": "https://github.com/doctrine/deprecations/issues", + "source": "https://github.com/doctrine/deprecations/tree/1.1.3" + }, + "time": "2024-01-30T19:34:25+00:00" + }, { "name": "fakerphp/faker", "version": "v1.23.1", @@ -10725,40 +10255,38 @@ }, { "name": "nunomaduro/collision", - "version": "v7.10.0", + "version": "v8.4.0", "source": { "type": "git", "url": "https://github.com/nunomaduro/collision.git", - "reference": "49ec67fa7b002712da8526678abd651c09f375b2" + "reference": "e7d1aa8ed753f63fa816932bbc89678238843b4a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/collision/zipball/49ec67fa7b002712da8526678abd651c09f375b2", - "reference": "49ec67fa7b002712da8526678abd651c09f375b2", + "url": "https://api.github.com/repos/nunomaduro/collision/zipball/e7d1aa8ed753f63fa816932bbc89678238843b4a", + "reference": "e7d1aa8ed753f63fa816932bbc89678238843b4a", "shasum": "" }, "require": { - "filp/whoops": "^2.15.3", - "nunomaduro/termwind": "^1.15.1", - "php": "^8.1.0", - "symfony/console": "^6.3.4" + "filp/whoops": "^2.15.4", + "nunomaduro/termwind": "^2.0.1", + "php": "^8.2.0", + "symfony/console": "^7.1.3" }, "conflict": { - "laravel/framework": ">=11.0.0" + "laravel/framework": "<11.0.0 || >=12.0.0", + "phpunit/phpunit": "<10.5.1 || >=12.0.0" }, "require-dev": { - "brianium/paratest": "^7.3.0", - "laravel/framework": "^10.28.0", - "laravel/pint": "^1.13.3", - "laravel/sail": "^1.25.0", - "laravel/sanctum": "^3.3.1", - "laravel/tinker": "^2.8.2", - "nunomaduro/larastan": "^2.6.4", - "orchestra/testbench-core": "^8.13.0", - "pestphp/pest": "^2.23.2", - "phpunit/phpunit": "^10.4.1", - "sebastian/environment": "^6.0.1", - "spatie/laravel-ignition": "^2.3.1" + "larastan/larastan": "^2.9.8", + "laravel/framework": "^11.19.0", + "laravel/pint": "^1.17.1", + "laravel/sail": "^1.31.0", + "laravel/sanctum": "^4.0.2", + "laravel/tinker": "^2.9.0", + "orchestra/testbench-core": "^9.2.3", + "pestphp/pest": "^2.35.0 || ^3.0.0", + "sebastian/environment": "^6.1.0 || ^7.0.0" }, "type": "library", "extra": { @@ -10766,6 +10294,9 @@ "providers": [ "NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider" ] + }, + "branch-alias": { + "dev-8.x": "8.x-dev" } }, "autoload": { @@ -10817,7 +10348,7 @@ "type": "patreon" } ], - "time": "2023-10-11T15:45:01+00:00" + "time": "2024-08-03T15:32:23+00:00" }, { "name": "pestphp/pest", @@ -11484,32 +11015,32 @@ }, { "name": "phpunit/php-code-coverage", - "version": "10.1.15", + "version": "10.1.16", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "5da8b1728acd1e6ffdf2ff32ffbdfd04307f26ae" + "reference": "7e308268858ed6baedc8704a304727d20bc07c77" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/5da8b1728acd1e6ffdf2ff32ffbdfd04307f26ae", - "reference": "5da8b1728acd1e6ffdf2ff32ffbdfd04307f26ae", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/7e308268858ed6baedc8704a304727d20bc07c77", + "reference": "7e308268858ed6baedc8704a304727d20bc07c77", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^4.18 || ^5.0", + "nikic/php-parser": "^4.19.1 || ^5.1.0", "php": ">=8.1", - "phpunit/php-file-iterator": "^4.0", - "phpunit/php-text-template": "^3.0", - "sebastian/code-unit-reverse-lookup": "^3.0", - "sebastian/complexity": "^3.0", - "sebastian/environment": "^6.0", - "sebastian/lines-of-code": "^2.0", - "sebastian/version": "^4.0", - "theseer/tokenizer": "^1.2.0" + "phpunit/php-file-iterator": "^4.1.0", + "phpunit/php-text-template": "^3.0.1", + "sebastian/code-unit-reverse-lookup": "^3.0.0", + "sebastian/complexity": "^3.2.0", + "sebastian/environment": "^6.1.0", + "sebastian/lines-of-code": "^2.0.2", + "sebastian/version": "^4.0.1", + "theseer/tokenizer": "^1.2.3" }, "require-dev": { "phpunit/phpunit": "^10.1" @@ -11521,7 +11052,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "10.1-dev" + "dev-main": "10.1.x-dev" } }, "autoload": { @@ -11550,7 +11081,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.15" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.16" }, "funding": [ { @@ -11558,7 +11089,7 @@ "type": "github" } ], - "time": "2024-06-29T08:25:15+00:00" + "time": "2024-08-22T04:31:57+00:00" }, { "name": "phpunit/php-file-iterator", @@ -12931,7 +12462,7 @@ } ], "aliases": [], - "minimum-stability": "stable", + "minimum-stability": "dev", "stability-flags": [], "prefer-stable": true, "prefer-lowest": false, diff --git a/config/.gitkeep b/config/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/config/app.php b/config/app.php index 8d0b30367..94a067157 100644 --- a/config/app.php +++ b/config/app.php @@ -1,8 +1,5 @@ env('APP_DEBUG', false), + 'debug' => (bool) env('APP_DEBUG', false), /* |-------------------------------------------------------------------------- @@ -51,7 +48,7 @@ | | 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. + | the application so that it's available within Artisan commands. | */ @@ -59,20 +56,18 @@ '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. + | will be used by the PHP date and date-time functions. The timezone + | is set to "UTC" by default as it is suitable for most use cases. | */ - 'timezone' => 'UTC', + 'timezone' => env('APP_TIMEZONE', 'UTC'), /* |-------------------------------------------------------------------------- @@ -80,53 +75,37 @@ |-------------------------------------------------------------------------- | | 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. + | by Laravel's translation / localization methods. This option can be + | set to any locale for which you plan to have translation strings. | */ - 'fallback_locale' => 'en', + 'locale' => env('APP_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. - | - */ + 'fallback_locale' => env('APP_FALLBACK_LOCALE', 'en'), - 'faker_locale' => 'en_US', + 'faker_locale' => env('APP_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! + | This key is utilized by Laravel's encryption services and should be set + | to a random, 32 character string to ensure that all encrypted values + | are secure. You should do this prior to deploying the application. | */ + 'cipher' => 'AES-256-CBC', + 'key' => env('APP_KEY'), - 'cipher' => 'AES-256-CBC', + 'previous_keys' => [ + ...array_filter( + explode(',', env('APP_PREVIOUS_KEYS', '')) + ), + ], /* |-------------------------------------------------------------------------- @@ -142,45 +121,8 @@ */ 'maintenance' => [ - 'driver' => 'file', - // 'store' => 'redis', + 'driver' => env('APP_MAINTENANCE_DRIVER', 'file'), + 'store' => env('APP_MAINTENANCE_STORE', 'database'), ], - /* - |-------------------------------------------------------------------------- - | 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' => ServiceProvider::defaultProviders()->merge([ - /* - * Application Service Providers... - */ - App\Providers\AppServiceProvider::class, - App\Providers\AuthServiceProvider::class, - App\Providers\EventServiceProvider::class, - App\Providers\RouteServiceProvider::class, - App\Markdown\MarkdownServiceProvider::class, - ])->toArray(), - - /* - |-------------------------------------------------------------------------- - | 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' => Facade::defaultAliases()->merge([ - // ... - ])->toArray(), - ]; diff --git a/config/auth.php b/config/auth.php index f0bdd42c1..1642fb24f 100644 --- a/config/auth.php +++ b/config/auth.php @@ -2,45 +2,7 @@ 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', - ], - 'api' => [ 'driver' => 'token', 'provider' => 'users', @@ -48,70 +10,4 @@ ], ], - /* - |-------------------------------------------------------------------------- - | 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 expiry 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 241048538..000000000 --- a/config/broadcasting.php +++ /dev/null @@ -1,71 +0,0 @@ - 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'), - 'host' => env('PUSHER_HOST') ?: 'api-'.env('PUSHER_APP_CLUSTER', 'mt1').'.pusher.com', - 'port' => env('PUSHER_PORT', 443), - 'scheme' => env('PUSHER_SCHEME', 'https'), - 'encrypted' => true, - 'useTLS' => env('PUSHER_SCHEME', 'https') === 'https', - ], - '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 d4171e221..000000000 --- a/config/cache.php +++ /dev/null @@ -1,111 +0,0 @@ - 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'), - 'lock_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 the APC, database, memcached, Redis, or DynamoDB cache - | stores there might be other applications using the same cache. For - | that reason, you may prefix every cache key to 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 8a39e6daa..000000000 --- a/config/cors.php +++ /dev/null @@ -1,34 +0,0 @@ - ['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 137ad18ce..f8e8dcb8a 100644 --- a/config/database.php +++ b/config/database.php @@ -10,26 +10,22 @@ |-------------------------------------------------------------------------- | | 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. + | to use as your default connection for database operations. This is + | the connection which will be utilized unless another connection + | is explicitly specified when you execute a query / statement. | */ - 'default' => env('DB_CONNECTION', 'mysql'), + 'default' => env('DB_CONNECTION', 'sqlite'), /* |-------------------------------------------------------------------------- | 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. + | Below are all of the database connections defined for your application. + | An example configuration is provided for each database system which + | is supported by Laravel. You're free to add / remove connections. | */ @@ -37,7 +33,7 @@ 'sqlite' => [ 'driver' => 'sqlite', - 'url' => env('DATABASE_URL'), + 'url' => env('DB_URL'), 'database' => env('DB_DATABASE', database_path('database.sqlite')), 'prefix' => '', 'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true), @@ -45,15 +41,35 @@ 'mysql' => [ 'driver' => 'mysql', - 'url' => env('DATABASE_URL'), + 'url' => env('DB_URL'), + 'host' => env('DB_HOST', '127.0.0.1'), + 'port' => env('DB_PORT', '3306'), + 'database' => env('DB_DATABASE', 'laravel'), + 'username' => env('DB_USERNAME', 'root'), + 'password' => env('DB_PASSWORD', ''), + 'unix_socket' => env('DB_SOCKET', ''), + 'charset' => env('DB_CHARSET', 'utf8mb4'), + 'collation' => env('DB_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'), + ]) : [], + ], + + 'mariadb' => [ + 'driver' => 'mariadb', + 'url' => env('DB_URL'), 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', '3306'), - 'database' => env('DB_DATABASE', 'forge'), - 'username' => env('DB_USERNAME', 'forge'), + 'database' => env('DB_DATABASE', 'laravel'), + 'username' => env('DB_USERNAME', 'root'), 'password' => env('DB_PASSWORD', ''), 'unix_socket' => env('DB_SOCKET', ''), - 'charset' => 'utf8mb4', - 'collation' => 'utf8mb4_unicode_ci', + 'charset' => env('DB_CHARSET', 'utf8mb4'), + 'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'), 'prefix' => '', 'prefix_indexes' => true, 'strict' => true, @@ -65,13 +81,13 @@ 'pgsql' => [ 'driver' => 'pgsql', - 'url' => env('DATABASE_URL'), + 'url' => env('DB_URL'), 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', '5432'), - 'database' => env('DB_DATABASE', 'forge'), - 'username' => env('DB_USERNAME', 'forge'), + 'database' => env('DB_DATABASE', 'laravel'), + 'username' => env('DB_USERNAME', 'root'), 'password' => env('DB_PASSWORD', ''), - 'charset' => 'utf8', + 'charset' => env('DB_CHARSET', 'utf8'), 'prefix' => '', 'prefix_indexes' => true, 'search_path' => 'public', @@ -80,13 +96,13 @@ 'sqlsrv' => [ 'driver' => 'sqlsrv', - 'url' => env('DATABASE_URL'), + 'url' => env('DB_URL'), 'host' => env('DB_HOST', 'localhost'), 'port' => env('DB_PORT', '1433'), - 'database' => env('DB_DATABASE', 'forge'), - 'username' => env('DB_USERNAME', 'forge'), + 'database' => env('DB_DATABASE', 'laravel'), + 'username' => env('DB_USERNAME', 'root'), 'password' => env('DB_PASSWORD', ''), - 'charset' => 'utf8', + 'charset' => env('DB_CHARSET', 'utf8'), 'prefix' => '', 'prefix_indexes' => true, // 'encrypt' => env('DB_ENCRYPT', 'yes'), @@ -102,11 +118,14 @@ | | 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. + | the migrations on disk haven't actually been run on the database. | */ - 'migrations' => 'migrations', + 'migrations' => [ + 'table' => 'migrations', + 'update_date_on_publish' => true, + ], /* |-------------------------------------------------------------------------- @@ -115,7 +134,7 @@ | | 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. + | such as Memcached. You may define your connection settings here. | */ diff --git a/config/filesystems.php b/config/filesystems.php deleted file mode 100644 index e9d9dbdbe..000000000 --- a/config/filesystems.php +++ /dev/null @@ -1,76 +0,0 @@ - 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 set up for each driver as an example of the required values. - | - | Supported Drivers: "local", "ftp", "sftp", "s3" - | - */ - - 'disks' => [ - - 'local' => [ - 'driver' => 'local', - 'root' => storage_path('app'), - 'throw' => false, - ], - - 'public' => [ - 'driver' => 'local', - 'root' => storage_path('app/public'), - 'url' => env('APP_URL').'/storage', - 'visibility' => 'public', - 'throw' => false, - ], - - '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), - 'throw' => 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/hashing.php b/config/hashing.php deleted file mode 100644 index bcd3be4c2..000000000 --- a/config/hashing.php +++ /dev/null @@ -1,52 +0,0 @@ - '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' => 65536, - 'threads' => 1, - 'time' => 4, - ], - -]; diff --git a/config/logging.php b/config/logging.php index aa0d00075..7d36ae7fe 100644 --- a/config/logging.php +++ b/config/logging.php @@ -1,60 +1,10 @@ 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'), @@ -62,68 +12,6 @@ 'days' => 14, 'replace_placeholders' => true, ], - - 'daily' => [ - 'driver' => 'daily', - 'path' => storage_path('logs/laravel.log'), - 'level' => env('LOG_LEVEL', 'debug'), - 'days' => 14, - 'replace_placeholders' => true, - ], - - 'slack' => [ - 'driver' => 'slack', - 'url' => env('LOG_SLACK_WEBHOOK_URL'), - 'username' => 'Laravel Log', - 'emoji' => ':boom:', - 'level' => env('LOG_LEVEL', 'critical'), - 'replace_placeholders' => true, - ], - - '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'), - ], - 'processors' => [PsrLogMessageProcessor::class], - ], - - 'stderr' => [ - 'driver' => 'monolog', - 'level' => env('LOG_LEVEL', 'debug'), - 'handler' => StreamHandler::class, - 'formatter' => env('LOG_STDERR_FORMATTER'), - 'with' => [ - 'stream' => 'php://stderr', - ], - 'processors' => [PsrLogMessageProcessor::class], - ], - - 'syslog' => [ - 'driver' => 'syslog', - 'level' => env('LOG_LEVEL', 'debug'), - 'facility' => LOG_USER, - 'replace_placeholders' => true, - ], - - 'errorlog' => [ - 'driver' => 'errorlog', - 'level' => env('LOG_LEVEL', 'debug'), - 'replace_placeholders' => true, - ], - - 'null' => [ - 'driver' => 'monolog', - 'handler' => NullHandler::class, - ], - - 'emergency' => [ - 'path' => storage_path('logs/laravel.log'), - ], ], ]; diff --git a/config/mail.php b/config/mail.php index d7416b152..77815a619 100644 --- a/config/mail.php +++ b/config/mail.php @@ -2,125 +2,13 @@ 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", "ses-v2", - | "postmark", "log", "array", "failover" - | - */ - 'mailers' => [ - 'smtp' => [ - 'transport' => 'smtp', - 'url' => env('MAIL_URL'), - '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, - 'local_domain' => env('MAIL_EHLO_DOMAIN'), - ], - - 'ses' => [ - 'transport' => 'ses', - ], - 'mailgun' => [ 'transport' => 'mailgun', // 'client' => [ // 'timeout' => 5, // ], ], - - 'postmark' => [ - 'transport' => 'postmark', - // 'message_stream_id' => null, - // 'client' => [ - // 'timeout' => 5, - // ], - ], - - 'sendmail' => [ - 'transport' => 'sendmail', - 'path' => env('MAIL_SENDMAIL_PATH', '/usr/sbin/sendmail -bs -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 01c6b054d..000000000 --- a/config/queue.php +++ /dev/null @@ -1,109 +0,0 @@ - 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, - ], - - ], - - /* - |-------------------------------------------------------------------------- - | Job Batching - |-------------------------------------------------------------------------- - | - | The following options configure the database and table that store job - | batching information. These options can be updated to any database - | connection and table which has been defined by your application. - | - */ - - 'batching' => [ - 'database' => env('DB_CONNECTION', 'mysql'), - 'table' => 'job_batches', - ], - - /* - |-------------------------------------------------------------------------- - | 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 529cfdc99..764a82fac 100644 --- a/config/sanctum.php +++ b/config/sanctum.php @@ -41,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 @@ -60,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 b343f6757..1105eb382 100644 --- a/config/services.php +++ b/config/services.php @@ -2,18 +2,6 @@ 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'), @@ -21,16 +9,6 @@ 'scheme' => 'https', ], - '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'), - ], - 'github' => [ 'client_id' => env('GITHUB_ID'), 'client_secret' => env('GITHUB_SECRET'), diff --git a/config/session.php b/config/session.php deleted file mode 100644 index 733b561dc..000000000 --- a/config/session.php +++ /dev/null @@ -1,201 +0,0 @@ - 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 40cbf7743..000000000 --- a/config/view.php +++ /dev/null @@ -1,36 +0,0 @@ - [ - 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/migrations/2013_09_17_113019_create_users_table.php b/database/migrations/2013_09_17_113019_create_users_table.php deleted file mode 100644 index 212962e7c..000000000 --- a/database/migrations/2013_09_17_113019_create_users_table.php +++ /dev/null @@ -1,21 +0,0 @@ -increments('id'); - $table->string('github_id')->default(''); - $table->string('github_url')->default(''); - $table->string('email'); - $table->string('name'); - - $table->timestamps(); - }); - } -}; diff --git a/database/migrations/2013_09_17_121043_create_session_table.php b/database/migrations/2013_09_17_121043_create_session_table.php deleted file mode 100644 index 198a734da..000000000 --- a/database/migrations/2013_09_17_121043_create_session_table.php +++ /dev/null @@ -1,17 +0,0 @@ -string('id')->unique(); - $table->text('payload'); - $table->integer('last_activity'); - }); - } -}; diff --git a/database/migrations/2013_09_17_160916_create_roles_table.php b/database/migrations/2013_09_17_160916_create_roles_table.php deleted file mode 100644 index 0b1dc77b9..000000000 --- a/database/migrations/2013_09_17_160916_create_roles_table.php +++ /dev/null @@ -1,18 +0,0 @@ -increments('id'); - $table->string('name'); - $table->string('description'); - $table->timestamps(); - }); - } -}; diff --git a/database/migrations/2013_09_17_164244_create_role_user_table.php b/database/migrations/2013_09_17_164244_create_role_user_table.php deleted file mode 100644 index 85b990054..000000000 --- a/database/migrations/2013_09_17_164244_create_role_user_table.php +++ /dev/null @@ -1,18 +0,0 @@ -increments('id'); - $table->integer('user_id'); - $table->integer('role_id'); - $table->index('user_id'); - }); - } -}; diff --git a/database/migrations/2013_09_17_170055_add_is_banned_field_to_users.php b/database/migrations/2013_09_17_170055_add_is_banned_field_to_users.php deleted file mode 100644 index 74b88ce6c..000000000 --- a/database/migrations/2013_09_17_170055_add_is_banned_field_to_users.php +++ /dev/null @@ -1,15 +0,0 @@ -integer('is_banned')->default(0); - }); - } -}; diff --git a/database/migrations/2013_09_18_115103_create_pastes_table.php b/database/migrations/2013_09_18_115103_create_pastes_table.php deleted file mode 100644 index 30d937a54..000000000 --- a/database/migrations/2013_09_18_115103_create_pastes_table.php +++ /dev/null @@ -1,23 +0,0 @@ -increments('id'); - $table->integer('author_id')->nullable(); - $table->integer('parent_id')->nullable(); - $table->text('description')->nullable(); - $table->text('code'); - $table->integer('comment_count'); - $table->integer('child_count'); - - $table->timestamps(); - }); - } -}; diff --git a/database/migrations/2013_09_19_101701_create_comments_table.php b/database/migrations/2013_09_19_101701_create_comments_table.php deleted file mode 100644 index 3c950f3c7..000000000 --- a/database/migrations/2013_09_19_101701_create_comments_table.php +++ /dev/null @@ -1,29 +0,0 @@ -increments('id'); - - $table->string('title')->nullable(); - $table->text('body'); - - $table->string('owner_type'); - $table->integer('owner_id'); - - $table->integer('author_id'); - $table->integer('parent_id')->nullable(); - - $table->integer('child_count')->default(0); - $table->integer('most_recent_child_id')->nullable(); - - $table->timestamps(); - }); - } -}; diff --git a/database/migrations/2013_09_19_104855_create_activity_table.php b/database/migrations/2013_09_19_104855_create_activity_table.php deleted file mode 100644 index fcc956f9a..000000000 --- a/database/migrations/2013_09_19_104855_create_activity_table.php +++ /dev/null @@ -1,21 +0,0 @@ -increments('id'); - $table->integer('user_id'); - $table->integer('activity_type'); - $table->integer('activity_id'); - $table->text('description'); - - $table->timestamps(); - }); - } -}; diff --git a/database/migrations/2013_09_22_130010_add_image_url_field_to_users.php b/database/migrations/2013_09_22_130010_add_image_url_field_to_users.php deleted file mode 100644 index daa7116ec..000000000 --- a/database/migrations/2013_09_22_130010_add_image_url_field_to_users.php +++ /dev/null @@ -1,15 +0,0 @@ -string('image_url')->nullable(); - }); - } -}; diff --git a/database/migrations/2013_09_22_130711_add_type_field_to_comments.php b/database/migrations/2013_09_22_130711_add_type_field_to_comments.php deleted file mode 100644 index f0296edc5..000000000 --- a/database/migrations/2013_09_22_130711_add_type_field_to_comments.php +++ /dev/null @@ -1,15 +0,0 @@ -integer('type')->default(0); - }); - } -}; diff --git a/database/migrations/2013_09_22_163103_create_articles_table.php b/database/migrations/2013_09_22_163103_create_articles_table.php deleted file mode 100644 index 02b412d71..000000000 --- a/database/migrations/2013_09_22_163103_create_articles_table.php +++ /dev/null @@ -1,21 +0,0 @@ -increments('id'); - $table->integer('author_id'); - $table->string('title'); - $table->text('content'); - $table->boolean('featured')->default(0); - - $table->timestamps(); - }); - } -}; diff --git a/database/migrations/2013_09_22_163347_create_tags_table.php b/database/migrations/2013_09_22_163347_create_tags_table.php deleted file mode 100644 index 330aebc83..000000000 --- a/database/migrations/2013_09_22_163347_create_tags_table.php +++ /dev/null @@ -1,17 +0,0 @@ -increments('id'); - $table->string('name'); - $table->string('slug'); - }); - } -}; diff --git a/database/migrations/2013_09_22_163816_create_article_tag_table.php b/database/migrations/2013_09_22_163816_create_article_tag_table.php deleted file mode 100644 index 80a01517c..000000000 --- a/database/migrations/2013_09_22_163816_create_article_tag_table.php +++ /dev/null @@ -1,19 +0,0 @@ -increments('id'); - $table->integer('article_id')->index(); - $table->integer('tag_id')->index(); - - $table->timestamps(); - }); - } -}; diff --git a/database/migrations/2013_09_23_111349_add_description_field_to_tags.php b/database/migrations/2013_09_23_111349_add_description_field_to_tags.php deleted file mode 100644 index 8838b02ae..000000000 --- a/database/migrations/2013_09_23_111349_add_description_field_to_tags.php +++ /dev/null @@ -1,15 +0,0 @@ -text('description')->nullable(); - }); - } -}; diff --git a/database/migrations/2013_09_23_121454_add_published_at_field_to_articles.php b/database/migrations/2013_09_23_121454_add_published_at_field_to_articles.php deleted file mode 100644 index 7f0c03378..000000000 --- a/database/migrations/2013_09_23_121454_add_published_at_field_to_articles.php +++ /dev/null @@ -1,16 +0,0 @@ -integer('status')->default(0); - $table->dateTime('published_at')->nullable(); - }); - } -}; diff --git a/database/migrations/2013_09_23_160937_add_comment_counter_cache_to_articles.php b/database/migrations/2013_09_23_160937_add_comment_counter_cache_to_articles.php deleted file mode 100644 index a638bbba6..000000000 --- a/database/migrations/2013_09_23_160937_add_comment_counter_cache_to_articles.php +++ /dev/null @@ -1,15 +0,0 @@ -integer('comment_count')->default(0); - }); - } -}; diff --git a/database/migrations/2013_09_24_145833_create_contributors_table.php b/database/migrations/2013_09_24_145833_create_contributors_table.php deleted file mode 100644 index 46b73472b..000000000 --- a/database/migrations/2013_09_24_145833_create_contributors_table.php +++ /dev/null @@ -1,23 +0,0 @@ -increments('id'); - $table->integer('user_id')->nullable(); - $table->string('github_id'); - $table->string('name'); - $table->string('avatar_url'); - $table->string('github_url'); - $table->integer('contribution_count')->default(0); - - $table->timestamps(); - }); - } -}; diff --git a/database/migrations/2013_09_27_014229_add_soft_delete_to_articles.php b/database/migrations/2013_09_27_014229_add_soft_delete_to_articles.php deleted file mode 100644 index fcada4bcf..000000000 --- a/database/migrations/2013_09_27_014229_add_soft_delete_to_articles.php +++ /dev/null @@ -1,15 +0,0 @@ -softDeletes(); - }); - } -}; diff --git a/database/migrations/2013_09_27_015000_add_soft_delete_to_users.php b/database/migrations/2013_09_27_015000_add_soft_delete_to_users.php deleted file mode 100644 index ab5558c78..000000000 --- a/database/migrations/2013_09_27_015000_add_soft_delete_to_users.php +++ /dev/null @@ -1,15 +0,0 @@ -softDeletes(); - }); - } -}; diff --git a/database/migrations/2013_09_27_015109_add_soft_delete_to_comments.php b/database/migrations/2013_09_27_015109_add_soft_delete_to_comments.php deleted file mode 100644 index 489c6bdde..000000000 --- a/database/migrations/2013_09_27_015109_add_soft_delete_to_comments.php +++ /dev/null @@ -1,15 +0,0 @@ -softDeletes(); - }); - } -}; diff --git a/database/migrations/2013_09_27_021650_add_soft_delete_to_pastes.php b/database/migrations/2013_09_27_021650_add_soft_delete_to_pastes.php deleted file mode 100644 index fcdf0cd65..000000000 --- a/database/migrations/2013_09_27_021650_add_soft_delete_to_pastes.php +++ /dev/null @@ -1,15 +0,0 @@ -softDeletes(); - }); - } -}; diff --git a/database/migrations/2013_10_24_131412_create_comment_tag_table.php b/database/migrations/2013_10_24_131412_create_comment_tag_table.php deleted file mode 100644 index 6525694b6..000000000 --- a/database/migrations/2013_10_24_131412_create_comment_tag_table.php +++ /dev/null @@ -1,19 +0,0 @@ -increments('id'); - $table->integer('comment_id')->index(); - $table->integer('tag_id')->index(); - - $table->timestamps(); - }); - } -}; diff --git a/database/migrations/2013_10_30_104107_add_tag_section_fields.php b/database/migrations/2013_10_30_104107_add_tag_section_fields.php deleted file mode 100644 index a515b959e..000000000 --- a/database/migrations/2013_10_30_104107_add_tag_section_fields.php +++ /dev/null @@ -1,16 +0,0 @@ -smallInteger('forum')->default(0); - $table->smallInteger('articles')->default(0); - }); - } -}; diff --git a/database/migrations/2013_12_08_161643_comments_add_laravel_version.php b/database/migrations/2013_12_08_161643_comments_add_laravel_version.php deleted file mode 100644 index 935c46de8..000000000 --- a/database/migrations/2013_12_08_161643_comments_add_laravel_version.php +++ /dev/null @@ -1,15 +0,0 @@ -integer('laravel_version')->default(0); - }); - } -}; diff --git a/database/migrations/2013_12_14_151829_articles_add_laravel_verion_field.php b/database/migrations/2013_12_14_151829_articles_add_laravel_verion_field.php deleted file mode 100644 index d96027a4d..000000000 --- a/database/migrations/2013_12_14_151829_articles_add_laravel_verion_field.php +++ /dev/null @@ -1,15 +0,0 @@ -integer('laravel_version')->default(0); - }); - } -}; diff --git a/database/migrations/2014_01_27_135001_forum_threads_create_table.php b/database/migrations/2014_01_27_135001_forum_threads_create_table.php deleted file mode 100644 index a6a6bc52e..000000000 --- a/database/migrations/2014_01_27_135001_forum_threads_create_table.php +++ /dev/null @@ -1,25 +0,0 @@ -increments('id'); - $table->integer('author_id'); - $table->string('subject'); - $table->text('body'); - $table->string('slug'); - $table->string('category_slug'); - $table->integer('laravel_version'); - $table->integer('most_recent_reply_id'); - $table->integer('reply_count'); - $table->timestamps(); - $table->softDeletes(); - }); - } -}; diff --git a/database/migrations/2014_01_27_141317_forum_replies_create_table.php b/database/migrations/2014_01_27_141317_forum_replies_create_table.php deleted file mode 100644 index 33e4c4d0e..000000000 --- a/database/migrations/2014_01_27_141317_forum_replies_create_table.php +++ /dev/null @@ -1,20 +0,0 @@ -increments('id'); - $table->text('body'); - $table->integer('author_id'); - $table->integer('thread_id'); - $table->timestamps(); - $table->softDeletes(); - }); - } -}; diff --git a/database/migrations/2014_01_31_140118_tagged_items_create_table.php b/database/migrations/2014_01_31_140118_tagged_items_create_table.php deleted file mode 100644 index cb580638f..000000000 --- a/database/migrations/2014_01_31_140118_tagged_items_create_table.php +++ /dev/null @@ -1,19 +0,0 @@ -increments('id'); - $table->integer('thread_id'); - $table->integer('tag_id'); - - $table->timestamps(); - }); - } -}; diff --git a/database/migrations/2014_02_01_022633_pastes_add_hash_field.php b/database/migrations/2014_02_01_022633_pastes_add_hash_field.php deleted file mode 100644 index 3155ff0e1..000000000 --- a/database/migrations/2014_02_01_022633_pastes_add_hash_field.php +++ /dev/null @@ -1,15 +0,0 @@ -string('hash')->nullable(); - }); - } -}; diff --git a/database/migrations/2014_02_07_125035_forum_threads_add_question_fields.php b/database/migrations/2014_02_07_125035_forum_threads_add_question_fields.php deleted file mode 100644 index 972384c02..000000000 --- a/database/migrations/2014_02_07_125035_forum_threads_add_question_fields.php +++ /dev/null @@ -1,15 +0,0 @@ -boolean('is_question')->default(true); - }); - } -}; diff --git a/database/migrations/2014_02_07_144708_forum_threads_add_solution_reply_id.php b/database/migrations/2014_02_07_144708_forum_threads_add_solution_reply_id.php deleted file mode 100644 index 4d486cf05..000000000 --- a/database/migrations/2014_02_07_144708_forum_threads_add_solution_reply_id.php +++ /dev/null @@ -1,15 +0,0 @@ -integer('solution_reply_id')->nullable()->default(null); - }); - } -}; diff --git a/database/migrations/2014_02_07_155103_forum_thread_visitation_timestamps_create_table.php b/database/migrations/2014_02_07_155103_forum_thread_visitation_timestamps_create_table.php deleted file mode 100644 index 763f81ebf..000000000 --- a/database/migrations/2014_02_07_155103_forum_thread_visitation_timestamps_create_table.php +++ /dev/null @@ -1,20 +0,0 @@ -create(); - $table->increments('id'); - $table->integer('user_id'); - $table->integer('thread_id'); - $table->timestamp('visited_at'); - $table->timestamps(); - }); - } -}; diff --git a/database/migrations/2014_05_30_115728_users_add_remember_me_token.php b/database/migrations/2014_05_30_115728_users_add_remember_me_token.php deleted file mode 100644 index f8a5e4c3c..000000000 --- a/database/migrations/2014_05_30_115728_users_add_remember_me_token.php +++ /dev/null @@ -1,15 +0,0 @@ -string('remember_token')->default(''); - }); - } -}; diff --git a/database/migrations/2014_09_10_112330_add_ip_to_pastes_table.php b/database/migrations/2014_09_10_112330_add_ip_to_pastes_table.php deleted file mode 100644 index 1bd877914..000000000 --- a/database/migrations/2014_09_10_112330_add_ip_to_pastes_table.php +++ /dev/null @@ -1,15 +0,0 @@ -string('ip')->nullable(); - }); - } -}; diff --git a/database/migrations/2014_11_09_185116_pinned_threads.php b/database/migrations/2014_11_09_185116_pinned_threads.php deleted file mode 100644 index 022716311..000000000 --- a/database/migrations/2014_11_09_185116_pinned_threads.php +++ /dev/null @@ -1,15 +0,0 @@ -boolean('pinned')->default(false); - }); - } -}; diff --git a/database/migrations/2014_12_07_143131_add_user_confirmation_columns.php b/database/migrations/2014_12_07_143131_add_user_confirmation_columns.php deleted file mode 100644 index d8f0eeb03..000000000 --- a/database/migrations/2014_12_07_143131_add_user_confirmation_columns.php +++ /dev/null @@ -1,16 +0,0 @@ -boolean('confirmed')->default(0); - $table->string('confirmation_code')->nullable(); - }); - } -}; diff --git a/database/migrations/2014_12_13_164931_create_ip_columns.php b/database/migrations/2014_12_13_164931_create_ip_columns.php deleted file mode 100644 index 5257d6712..000000000 --- a/database/migrations/2014_12_13_164931_create_ip_columns.php +++ /dev/null @@ -1,23 +0,0 @@ -string('ip', 100)->default(''); - }); - - Schema::table('forum_threads', function (Blueprint $table) { - $table->string('ip', 100)->default(''); - }); - - Schema::table('forum_replies', function (Blueprint $table) { - $table->string('ip', 100)->default(''); - }); - } -}; diff --git a/database/migrations/2014_12_13_210738_add_spam_counter_to_users_table.php b/database/migrations/2014_12_13_210738_add_spam_counter_to_users_table.php deleted file mode 100644 index 28fa1f26f..000000000 --- a/database/migrations/2014_12_13_210738_add_spam_counter_to_users_table.php +++ /dev/null @@ -1,15 +0,0 @@ -tinyInteger('spam_count')->default(0); - }); - } -}; diff --git a/database/migrations/2014_12_21_212154_remove_contributors_table.php b/database/migrations/2014_12_21_212154_remove_contributors_table.php deleted file mode 100644 index 9c549dbc9..000000000 --- a/database/migrations/2014_12_21_212154_remove_contributors_table.php +++ /dev/null @@ -1,12 +0,0 @@ -index('author_id'); - $table->index('most_recent_reply_id'); - $table->index('solution_reply_id'); - }); - - Schema::table('forum_replies', function (Blueprint $table) { - $table->index('author_id'); - $table->index('thread_id'); - }); - - Schema::table('comments', function (Blueprint $table) { - $table->index('author_id'); - }); - } -}; diff --git a/database/migrations/2015_04_12_172949_add_indexes_to_tagged_items.php b/database/migrations/2015_04_12_172949_add_indexes_to_tagged_items.php deleted file mode 100644 index af36bda1b..000000000 --- a/database/migrations/2015_04_12_172949_add_indexes_to_tagged_items.php +++ /dev/null @@ -1,16 +0,0 @@ -index('thread_id'); - $table->index('tag_id'); - }); - } -}; diff --git a/database/migrations/2015_07_26_160128_l5_cleanup.php b/database/migrations/2015_07_26_160128_l5_cleanup.php deleted file mode 100644 index 34a21f163..000000000 --- a/database/migrations/2015_07_26_160128_l5_cleanup.php +++ /dev/null @@ -1,18 +0,0 @@ -dropColumn('articles'); - }); - } -}; diff --git a/database/migrations/2015_08_26_191523_drop_unused_tables.php b/database/migrations/2015_08_26_191523_drop_unused_tables.php deleted file mode 100644 index 785b2cac5..000000000 --- a/database/migrations/2015_08_26_191523_drop_unused_tables.php +++ /dev/null @@ -1,14 +0,0 @@ -runningUnitTests()) { - DB::table('forum_replies') - ->join('forum_threads', 'forum_replies.thread_id', '=', 'forum_threads.id') - ->whereNotNull('forum_threads.deleted_at') - ->delete(); - DB::table('tagged_items') - ->join('forum_threads', 'tagged_items.thread_id', '=', 'forum_threads.id') - ->whereNotNull('forum_threads.deleted_at') - ->delete(); - DB::table('forum_threads')->whereNotNull('deleted_at')->delete(); - DB::table('forum_replies')->whereNotNull('deleted_at')->delete(); - DB::table('users')->whereNotNull('deleted_at')->delete(); - DB::table('tagged_items')->whereRaw('thread_id NOT IN (SELECT id FROM forum_threads)')->delete(); - DB::table('forum_threads') - ->whereRaw('solution_reply_id NOT IN (SELECT id FROM forum_replies)') - ->update(['solution_reply_id' => null]); - } - - // Create password_resets table - Schema::create('password_resets', function (Blueprint $table) { - $table->string('email')->index(); - $table->string('token'); - $table->timestamp('created_at')->nullable(); - }); - - // Clean up users - Schema::table('users', function (Blueprint $table) { - $table->string('email')->unique()->change(); - $table->string('username', 40)->default(''); - $table->string('password')->default(''); - $table->smallInteger('type', false, true)->default(1); - $table->dateTime('created_at')->nullable()->default(null)->change(); - $table->dateTime('updated_at')->nullable()->default(null)->change(); - }); - Schema::table('users', function (Blueprint $table) { - $table->dropSoftDeletes(); - }); - Schema::table('users', function (Blueprint $table) { - $table->dropColumn('image_url', 'spam_count'); - }); - Schema::table('users', function (Blueprint $table) { - $table->renameColumn('github_url', 'github_username'); - }); - - if (! app()->runningUnitTests()) { - DB::statement('UPDATE users SET username = LOWER(name), github_username = name'); - } - - Schema::table('users', function (Blueprint $table) { - $table->unique('username'); - $table->index('email'); - $table->index('username'); - }); - - if (! app()->runningUnitTests()) { - // Migrate moderators - DB::statement('UPDATE users SET type = 2 WHERE id IN ( - SELECT user_id FROM role_user WHERE role_id = 2 - )'); - - // Migrate admins - DB::statement('UPDATE users SET type = 3 WHERE id IN ( - SELECT user_id FROM role_user WHERE role_id = 3 - )'); - } - - // Refactor replies - Schema::rename('forum_replies', 'replies'); - Schema::table('replies', function (Blueprint $table) { - $table->string('replyable_type')->default(''); - $table->dateTime('created_at')->nullable()->default(null)->change(); - $table->dateTime('updated_at')->nullable()->default(null)->change(); - }); - - if (! app()->runningUnitTests()) { - DB::table('replies')->update(['replyable_type' => 'threads']); - } - - Schema::table('replies', function (Blueprint $table) { - $table->dropIndex('forum_replies_author_id_index'); - $table->dropIndex('forum_replies_thread_id_index'); - }); - Schema::table('replies', function (Blueprint $table) { - $table->renameColumn('thread_id', 'replyable_id'); - }); - Schema::table('replies', function (Blueprint $table) { - $table->dropSoftDeletes(); - }); - Schema::table('replies', function (Blueprint $table) { - $table->index('author_id'); - $table->index('replyable_id'); - $table->integer('author_id')->unsigned()->change(); - $table->foreign('author_id') - ->references('id')->on('users') - ->onDelete('CASCADE'); - }); - - // Clean up forum threads - Schema::rename('forum_threads', 'threads'); - Schema::table('threads', function (Blueprint $table) { - $table->unique('slug'); - $table->dateTime('created_at')->nullable()->default(null)->change(); - $table->dateTime('updated_at')->nullable()->default(null)->change(); - }); - Schema::table('threads', function (Blueprint $table) { - $table->dropIndex('forum_threads_author_id_index'); - $table->dropIndex('forum_threads_most_recent_reply_id_index'); - $table->dropIndex('forum_threads_solution_reply_id_index'); - }); - Schema::table('threads', function (Blueprint $table) { - $table->integer('solution_reply_id')->unsigned()->change(); - $table->foreign('solution_reply_id') - ->references('id')->on('replies') - ->onDelete('SET NULL'); - $table->integer('author_id')->unsigned()->change(); - $table->foreign('author_id') - ->references('id')->on('users') - ->onDelete('CASCADE'); - }); - Schema::table('threads', function (Blueprint $table) { - $table->dropColumn( - 'category_slug', - 'most_recent_reply_id', - 'reply_count', - 'is_question', - 'pinned', - 'laravel_version', - ); - }); - Schema::table('threads', function (Blueprint $table) { - $table->dropSoftDeletes(); - }); - Schema::table('threads', function (Blueprint $table) { - $table->index('author_id'); - $table->index('slug'); - $table->index('solution_reply_id'); - }); - - // Refactor tags - Schema::rename('tagged_items', 'taggables'); - - // Fix timestamps on taggables - if (! app()->runningUnitTests()) { - DB::statement('UPDATE taggables, threads SET taggables.created_at = threads.created_at, taggables.updated_at = threads.updated_at WHERE taggables.thread_id = threads.id'); - } - - // Make slugs lowercase - if (! app()->runningUnitTests()) { - DB::statement('UPDATE tags SET slug = LOWER(slug)'); - } - - Schema::table('taggables', function (Blueprint $table) { - $table->string('taggable_type')->default(''); - $table->dateTime('created_at')->nullable()->default(null)->change(); - $table->dateTime('updated_at')->nullable()->default(null)->change(); - }); - Schema::table('taggables', function (Blueprint $table) { - $table->dropIndex('tagged_items_thread_id_index'); - $table->dropIndex('tagged_items_tag_id_index'); - }); - Schema::table('taggables', function (Blueprint $table) { - $table->renameColumn('thread_id', 'taggable_id'); - }); - - if (! app()->runningUnitTests()) { - DB::table('taggables')->update(['taggable_type' => 'threads']); - } - - Schema::table('taggables', function (Blueprint $table) { - $table->index('taggable_id'); - $table->index('tag_id'); - $table->integer('tag_id')->unsigned()->change(); - $table->foreign('tag_id') - ->references('id')->on('tags') - ->onDelete('CASCADE'); - }); - Schema::table('tags', function (Blueprint $table) { - $table->dropColumn('forum', 'description'); - $table->unique('name'); - $table->unique('slug'); - $table->index('slug'); - }); - - // Remove unused tables - Schema::drop('comments'); - Schema::drop('comment_tag'); - Schema::drop('pastes'); - Schema::drop('role_user'); - Schema::drop('roles'); - } -}; diff --git a/database/migrations/2017_07_08_202506_add_user_bio_column.php b/database/migrations/2017_07_08_202506_add_user_bio_column.php deleted file mode 100644 index 081cd9521..000000000 --- a/database/migrations/2017_07_08_202506_add_user_bio_column.php +++ /dev/null @@ -1,14 +0,0 @@ -string('bio', 160)->default(''); - }); - } -}; diff --git a/database/migrations/2017_08_29_123258_add_banned_at_column.php b/database/migrations/2017_08_29_123258_add_banned_at_column.php deleted file mode 100644 index 8ef99334d..000000000 --- a/database/migrations/2017_08_29_123258_add_banned_at_column.php +++ /dev/null @@ -1,25 +0,0 @@ -dateTime('banned_at')->nullable(); - }); - - User::where('is_banned', 1)->each(function ($user) { - $user->banned_at = $user->updated_at; - $user->save(); - }); - - Schema::table('users', function (Blueprint $table) { - $table->dropColumn('is_banned'); - }); - } -}; diff --git a/database/migrations/2017_10_18_193001_create_subscriptions_table.php b/database/migrations/2017_10_18_193001_create_subscriptions_table.php deleted file mode 100644 index 8e564ac65..000000000 --- a/database/migrations/2017_10_18_193001_create_subscriptions_table.php +++ /dev/null @@ -1,27 +0,0 @@ -uuid('uuid'); - $table->primary('uuid'); - $table->integer('user_id')->unsigned(); - $table->integer('subscriptionable_id'); - $table->string('subscriptionable_type')->default(''); - $table->timestamps(); - }); - - Schema::table('subscriptions', function (Blueprint $table) { - $table->index(['user_id', 'uuid']); - $table->foreign('user_id') - ->references('id')->on('users') - ->onDelete('CASCADE'); - }); - } -}; diff --git a/database/migrations/2017_12_03_111900_create_likes_table.php b/database/migrations/2017_12_03_111900_create_likes_table.php deleted file mode 100644 index 6464802e1..000000000 --- a/database/migrations/2017_12_03_111900_create_likes_table.php +++ /dev/null @@ -1,19 +0,0 @@ -increments('id'); - $table->unsignedInteger('user_id'); - $table->unsignedInteger('likeable_id'); - $table->string('likeable_type'); - $table->timestamps(); - }); - } -}; diff --git a/database/migrations/2018_01_27_111437_fix_subscription_indexes.php b/database/migrations/2018_01_27_111437_fix_subscription_indexes.php deleted file mode 100644 index 6535d9a9f..000000000 --- a/database/migrations/2018_01_27_111437_fix_subscription_indexes.php +++ /dev/null @@ -1,26 +0,0 @@ -dropForeign('subscriptions_user_id_foreign'); - } - $table->dropIndex(['user_id', 'uuid']); - $table->index('uuid'); - $table->index('user_id'); - $table->unique('uuid'); - $table->unique(['user_id', 'subscriptionable_id', 'subscriptionable_type'], 'subscriptions_are_unique'); - $table->foreign('user_id') - ->references('id')->on('users') - ->onDelete('CASCADE'); - }); - } -}; diff --git a/database/migrations/2018_02_20_215439_create_failed_jobs_table.php b/database/migrations/2018_02_20_215439_create_failed_jobs_table.php deleted file mode 100644 index 065ed9525..000000000 --- a/database/migrations/2018_02_20_215439_create_failed_jobs_table.php +++ /dev/null @@ -1,20 +0,0 @@ -bigIncrements('id'); - $table->text('connection'); - $table->text('queue'); - $table->longText('payload'); - $table->longText('exception'); - $table->timestamp('failed_at')->useCurrent(); - }); - } -}; diff --git a/database/migrations/2018_05_22_191538_cleanup_tables.php b/database/migrations/2018_05_22_191538_cleanup_tables.php deleted file mode 100644 index 10a7132d2..000000000 --- a/database/migrations/2018_05_22_191538_cleanup_tables.php +++ /dev/null @@ -1,21 +0,0 @@ -dropColumn('ip'); - }); - Schema::table('replies', function (Blueprint $table) { - $table->dropColumn('ip'); - }); - Schema::table('users', function (Blueprint $table) { - $table->dropColumn('ip'); - }); - } -}; diff --git a/database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php b/database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php deleted file mode 100644 index bbea0b460..000000000 --- a/database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php +++ /dev/null @@ -1,21 +0,0 @@ -bigIncrements('id'); - $table->morphs('tokenable'); - $table->string('name'); - $table->string('token', 64)->unique(); - $table->text('abilities')->nullable(); - $table->timestamp('last_used_at')->nullable(); - $table->timestamps(); - }); - } -}; diff --git a/database/migrations/2020_01_09_193921_create_notifications_table.php b/database/migrations/2020_01_09_193921_create_notifications_table.php deleted file mode 100644 index 1a13c8ec9..000000000 --- a/database/migrations/2020_01_09_193921_create_notifications_table.php +++ /dev/null @@ -1,20 +0,0 @@ -uuid('id')->primary(); - $table->string('type'); - $table->morphs('notifiable'); - $table->text('data'); - $table->timestamp('read_at')->nullable(); - $table->timestamps(); - }); - } -}; diff --git a/database/migrations/2020_04_07_181731_create_series_table.php b/database/migrations/2020_04_07_181731_create_series_table.php deleted file mode 100644 index cc280021f..000000000 --- a/database/migrations/2020_04_07_181731_create_series_table.php +++ /dev/null @@ -1,23 +0,0 @@ -increments('id'); - $table->unsignedInteger('author_id'); - $table->string('title'); - $table->string('slug')->unique(); - $table->timestamps(); - - $table->foreign('author_id') - ->references('id')->on('users') - ->onDelete('CASCADE'); - }); - } -}; diff --git a/database/migrations/2020_04_07_185543_create_community_articles_table.php b/database/migrations/2020_04_07_185543_create_community_articles_table.php deleted file mode 100644 index 98cddfb36..000000000 --- a/database/migrations/2020_04_07_185543_create_community_articles_table.php +++ /dev/null @@ -1,33 +0,0 @@ -increments('id'); - $table->unsignedInteger('series_id')->nullable(); - $table->unsignedInteger('author_id'); - $table->string('title'); - $table->text('body'); - $table->string('original_url')->nullable(); - $table->string('slug')->unique(); - $table->boolean('is_pinned')->default(false); - $table->timestamp('submitted_at')->nullable(); - $table->timestamp('approved_at')->nullable(); - $table->timestamps(); - - $table->foreign('series_id') - ->references('id')->on('series') - ->onDelete('SET NULL'); - - $table->foreign('author_id') - ->references('id')->on('users') - ->onDelete('CASCADE'); - }); - } -}; diff --git a/database/migrations/2020_07_16_185353_add_twitter_columns.php b/database/migrations/2020_07_16_185353_add_twitter_columns.php deleted file mode 100644 index d0c3a5f37..000000000 --- a/database/migrations/2020_07_16_185353_add_twitter_columns.php +++ /dev/null @@ -1,20 +0,0 @@ -unsignedBigInteger('tweet_id')->after('is_pinned')->nullable(); - $table->dateTime('shared_at')->after('approved_at')->nullable(); - }); - - Schema::table('users', function (Blueprint $table) { - $table->string('twitter')->after('email')->nullable(); - }); - } -}; diff --git a/database/migrations/2020_10_01_093001_add_email_verified_at_column_to_users.php b/database/migrations/2020_10_01_093001_add_email_verified_at_column_to_users.php deleted file mode 100644 index ef16d74ca..000000000 --- a/database/migrations/2020_10_01_093001_add_email_verified_at_column_to_users.php +++ /dev/null @@ -1,18 +0,0 @@ -timestamp('email_verified_at')->nullable(); - }); - Schema::table('users', function (Blueprint $table) { - $table->dropColumn(['confirmed', 'confirmation_code']); - }); - } -}; diff --git a/database/migrations/2020_11_03_205735_add_uuid_to_failed_jobs_table.php b/database/migrations/2020_11_03_205735_add_uuid_to_failed_jobs_table.php deleted file mode 100644 index 39b338e72..000000000 --- a/database/migrations/2020_11_03_205735_add_uuid_to_failed_jobs_table.php +++ /dev/null @@ -1,15 +0,0 @@ -string('uuid')->after('id')->nullable()->unique(); - }); - } -}; diff --git a/database/migrations/2020_11_22_194212_create_schedule_monitor_tables.php b/database/migrations/2020_11_22_194212_create_schedule_monitor_tables.php deleted file mode 100644 index 9a19a1110..000000000 --- a/database/migrations/2020_11_22_194212_create_schedule_monitor_tables.php +++ /dev/null @@ -1,49 +0,0 @@ -bigIncrements('id'); - - $table->string('name'); - $table->string('type')->nullable(); - $table->string('cron_expression'); - $table->string('timezone')->nullable(); - $table->string('ping_url')->nullable(); - - $table->dateTime('last_started_at')->nullable(); - $table->dateTime('last_finished_at')->nullable(); - $table->dateTime('last_failed_at')->nullable(); - $table->dateTime('last_skipped_at')->nullable(); - - $table->dateTime('registered_on_oh_dear_at')->nullable(); - $table->dateTime('last_pinged_at')->nullable(); - $table->integer('grace_time_in_minutes'); - - $table->timestamps(); - }); - - Schema::create('monitored_scheduled_task_log_items', function (Blueprint $table) { - $table->bigIncrements('id'); - - $table->unsignedBigInteger('monitored_scheduled_task_id'); - $table - ->foreign('monitored_scheduled_task_id', 'fk_scheduled_task_id') - ->references('id') - ->on('monitored_scheduled_tasks') - ->cascadeOnDelete(); - - $table->string('type'); - - $table->json('meta')->nullable(); - - $table->timestamps(); - }); - } -}; diff --git a/database/migrations/2021_03_10_161050_add_index_to_replyable_type.php b/database/migrations/2021_03_10_161050_add_index_to_replyable_type.php deleted file mode 100644 index 1f2f9a847..000000000 --- a/database/migrations/2021_03_10_161050_add_index_to_replyable_type.php +++ /dev/null @@ -1,15 +0,0 @@ -index('replyable_type'); - }); - } -}; diff --git a/database/migrations/2021_07_05_205125_remove_series.php b/database/migrations/2021_07_05_205125_remove_series.php deleted file mode 100644 index d88b35f70..000000000 --- a/database/migrations/2021_07_05_205125_remove_series.php +++ /dev/null @@ -1,24 +0,0 @@ -dropForeign(['series_id']); - }); - } - - Schema::table('articles', function (Blueprint $table) { - $table->dropColumn('series_id'); - }); - - Schema::dropIfExists('series'); - } -}; diff --git a/database/migrations/2021_07_23_110409_update_articles_table_add_hero_image_field.php b/database/migrations/2021_07_23_110409_update_articles_table_add_hero_image_field.php deleted file mode 100644 index f36dcae7f..000000000 --- a/database/migrations/2021_07_23_110409_update_articles_table_add_hero_image_field.php +++ /dev/null @@ -1,15 +0,0 @@ -string('hero_image')->after('slug')->nullable(); - }); - } -}; diff --git a/database/migrations/2021_07_31_183222_unique_github_ids.php b/database/migrations/2021_07_31_183222_unique_github_ids.php deleted file mode 100644 index af8273c7b..000000000 --- a/database/migrations/2021_07_31_183222_unique_github_ids.php +++ /dev/null @@ -1,28 +0,0 @@ -string('github_id')->nullable()->change(); - }); - Schema::table('users', function (Blueprint $table) { - $table->string('github_username')->nullable()->change(); - }); - - if (! app()->runningUnitTests()) { - DB::table('users')->where('github_id', '')->update(['github_id' => null]); - DB::table('users')->where('github_username', '')->update(['github_username' => null]); - } - - Schema::table('users', function (Blueprint $table) { - $table->unique('github_id'); - }); - } -}; diff --git a/database/migrations/2021_09_12_220452_add_resolved_by_to_threads_table.php b/database/migrations/2021_09_12_220452_add_resolved_by_to_threads_table.php deleted file mode 100644 index c55c8fbfa..000000000 --- a/database/migrations/2021_09_12_220452_add_resolved_by_to_threads_table.php +++ /dev/null @@ -1,16 +0,0 @@ -integer('resolved_by')->unsigned()->nullable()->default(null); - $table->foreign('resolved_by')->references('id')->on('users')->onDelete('SET NULL'); - }); - } -}; diff --git a/database/migrations/2021_10_12_170118_add_locked_by_column_to_threads_table.php b/database/migrations/2021_10_12_170118_add_locked_by_column_to_threads_table.php deleted file mode 100644 index 059a96737..000000000 --- a/database/migrations/2021_10_12_170118_add_locked_by_column_to_threads_table.php +++ /dev/null @@ -1,21 +0,0 @@ -timestamp('locked_at')->nullable()->default(null); - $table->integer('locked_by')->unsigned()->nullable()->default(null); - - $table->foreign('locked_by') - ->references('id') - ->on('users') - ->onDelete('SET NULL'); - }); - } -}; diff --git a/database/migrations/2021_10_31_143501_add_declined_at_column_to_articles_table.php b/database/migrations/2021_10_31_143501_add_declined_at_column_to_articles_table.php deleted file mode 100644 index fd9b94d0a..000000000 --- a/database/migrations/2021_10_31_143501_add_declined_at_column_to_articles_table.php +++ /dev/null @@ -1,15 +0,0 @@ -timestamp('declined_at')->nullable()->after('shared_at'); - }); - } -}; diff --git a/database/migrations/2021_11_15_213258_add_updated_by_to_threads_and_replies_table.php b/database/migrations/2021_11_15_213258_add_updated_by_to_threads_and_replies_table.php deleted file mode 100644 index beb4257e7..000000000 --- a/database/migrations/2021_11_15_213258_add_updated_by_to_threads_and_replies_table.php +++ /dev/null @@ -1,19 +0,0 @@ -foreignId('updated_by')->nullable(); - }); - - Schema::table('replies', function (Blueprint $table) { - $table->foreignId('updated_by')->nullable(); - }); - } -}; diff --git a/database/migrations/2021_11_22_093555_migrate_thread_feed_to_timestamp.php b/database/migrations/2021_11_22_093555_migrate_thread_feed_to_timestamp.php deleted file mode 100644 index 7601de076..000000000 --- a/database/migrations/2021_11_22_093555_migrate_thread_feed_to_timestamp.php +++ /dev/null @@ -1,33 +0,0 @@ -timestamp('last_activity_at') - ->after('slug') - ->nullable() - ->index(); - }); - - // Iterate over all the threads and update the `last_active_at` timestamp to - // the latest reply `created_at` or thread `created_at` if no reply exists. - if (! app()->runningUnitTests()) { - Thread::with(['repliesRelation' => function ($query) { - $query->latest(); - }]) - ->lazy() - ->each(function ($thread) { - $thread->update([ - 'last_activity_at' => ($reply = $thread->replies()->first()) ? $reply->created_at : $thread->created_at, - ]); - }); - } - } -}; diff --git a/database/migrations/2022_04_06_152416_add_uuids_to_tables.php b/database/migrations/2022_04_06_152416_add_uuids_to_tables.php deleted file mode 100644 index f40966a93..000000000 --- a/database/migrations/2022_04_06_152416_add_uuids_to_tables.php +++ /dev/null @@ -1,28 +0,0 @@ -uuid($columnName) - ->after('id') - ->index("{$tableName}_{$columnName}_index") - ->nullable(); - }); - } - } -}; diff --git a/database/migrations/2022_05_10_180922_make_uuids_non_nullable.php b/database/migrations/2022_05_10_180922_make_uuids_non_nullable.php deleted file mode 100644 index 3291fb6c9..000000000 --- a/database/migrations/2022_05_10_180922_make_uuids_non_nullable.php +++ /dev/null @@ -1,28 +0,0 @@ -dropIndex($tableName.'_uuid_index'); - - $table->uuid('uuid') - ->nullable(false) - ->unique() - ->change(); - }); - } - } -}; diff --git a/database/migrations/2022_06_14_072001_create_blocked_users_table.php b/database/migrations/2022_06_14_072001_create_blocked_users_table.php deleted file mode 100644 index 6a56af9bd..000000000 --- a/database/migrations/2022_06_14_072001_create_blocked_users_table.php +++ /dev/null @@ -1,19 +0,0 @@ -id(); - $table->unsignedInteger('user_id'); - $table->foreign('user_id')->references('id')->on('users')->cascadeOnDelete(); - $table->unsignedInteger('blocked_user_id'); - $table->foreign('blocked_user_id')->references('id')->on('users')->cascadeOnDelete(); - }); - } -}; diff --git a/database/migrations/2022_07_08_145847_create_spam_reports_table.php b/database/migrations/2022_07_08_145847_create_spam_reports_table.php deleted file mode 100644 index 07389e21d..000000000 --- a/database/migrations/2022_07_08_145847_create_spam_reports_table.php +++ /dev/null @@ -1,21 +0,0 @@ -id(); - $table->unsignedInteger('reporter_id'); - $table->foreign('reporter_id')->references('id')->on('users')->cascadeOnDelete(); - $table->nullableMorphs('spam'); - $table->timestamps(); - - $table->unique(['reporter_id', 'spam_id', 'spam_type']); - }); - } -}; diff --git a/database/migrations/2022_07_09_191433_update_articles_table_add_view_count.php b/database/migrations/2022_07_09_191433_update_articles_table_add_view_count.php deleted file mode 100644 index 72f1c6fbd..000000000 --- a/database/migrations/2022_07_09_191433_update_articles_table_add_view_count.php +++ /dev/null @@ -1,15 +0,0 @@ -bigInteger('view_count')->nullable()->after('is_pinned'); - }); - } -}; diff --git a/database/migrations/2022_07_29_135113_add__website_to_users_table.php b/database/migrations/2022_07_29_135113_add__website_to_users_table.php deleted file mode 100644 index 6cb2ef75e..000000000 --- a/database/migrations/2022_07_29_135113_add__website_to_users_table.php +++ /dev/null @@ -1,15 +0,0 @@ -string('website')->nullable()->after('twitter'); - }); - } -}; diff --git a/database/migrations/2022_08_21_215918_add_soft_delete_columns_to_replies_table.php b/database/migrations/2022_08_21_215918_add_soft_delete_columns_to_replies_table.php deleted file mode 100644 index 66f63b431..000000000 --- a/database/migrations/2022_08_21_215918_add_soft_delete_columns_to_replies_table.php +++ /dev/null @@ -1,18 +0,0 @@ -softDeletes(); - $table->integer('deleted_by')->unsigned()->nullable(); - $table->foreign('deleted_by')->references('id')->on('users')->onDelete('CASCADE'); - $table->text('deleted_reason')->nullable(); - }); - } -}; diff --git a/database/migrations/2022_10_15_150405_add_banned_reason_to_users_table.php b/database/migrations/2022_10_15_150405_add_banned_reason_to_users_table.php deleted file mode 100644 index 4c89d89d8..000000000 --- a/database/migrations/2022_10_15_150405_add_banned_reason_to_users_table.php +++ /dev/null @@ -1,15 +0,0 @@ -text('banned_reason')->after('banned_at')->nullable(); - }); - } -}; diff --git a/database/migrations/2022_12_11_145605_add_expires_at_column_sanctum.php b/database/migrations/2022_12_11_145605_add_expires_at_column_sanctum.php deleted file mode 100644 index 595d3c342..000000000 --- a/database/migrations/2022_12_11_145605_add_expires_at_column_sanctum.php +++ /dev/null @@ -1,15 +0,0 @@ -timestamp('expires_at')->nullable()->after('last_used_at'); - }); - } -}; diff --git a/database/migrations/2023_01_31_190506_add_allowed_notifications_column_to_users_table.php b/database/migrations/2023_01_31_190506_add_allowed_notifications_column_to_users_table.php deleted file mode 100755 index 1e5af27f4..000000000 --- a/database/migrations/2023_01_31_190506_add_allowed_notifications_column_to_users_table.php +++ /dev/null @@ -1,15 +0,0 @@ -json('allowed_notifications')->nullable(); - }); - } -}; diff --git a/database/migrations/2024_08_28_104736_create_job_batches_table.php b/database/migrations/2024_08_28_104736_create_job_batches_table.php new file mode 100644 index 000000000..d9cd6b5ea --- /dev/null +++ b/database/migrations/2024_08_28_104736_create_job_batches_table.php @@ -0,0 +1,27 @@ +string('id')->primary(); + $table->string('name'); + $table->integer('total_jobs'); + $table->integer('pending_jobs'); + $table->integer('failed_jobs'); + $table->longText('failed_job_ids'); + $table->mediumText('options')->nullable(); + $table->integer('cancelled_at')->nullable(); + $table->integer('created_at'); + $table->integer('finished_at')->nullable(); + }); + } +}; diff --git a/database/migrations/2024_08_28_104755_create_jobs_table.php b/database/migrations/2024_08_28_104755_create_jobs_table.php new file mode 100644 index 000000000..58a8bc948 --- /dev/null +++ b/database/migrations/2024_08_28_104755_create_jobs_table.php @@ -0,0 +1,24 @@ +bigIncrements('id'); + $table->string('queue')->index(); + $table->longText('payload'); + $table->unsignedTinyInteger('attempts'); + $table->unsignedInteger('reserved_at')->nullable(); + $table->unsignedInteger('available_at'); + $table->unsignedInteger('created_at'); + }); + } +}; diff --git a/database/schema/mysql-schema.dump b/database/schema/mysql-schema.sql similarity index 64% rename from database/schema/mysql-schema.dump rename to database/schema/mysql-schema.sql index 07dbf82f6..c9c815c7d 100644 --- a/database/schema/mysql-schema.dump +++ b/database/schema/mysql-schema.sql @@ -192,6 +192,21 @@ CREATE TABLE `replies` ( CONSTRAINT `replies_deleted_by_foreign` FOREIGN KEY (`deleted_by`) REFERENCES `users` (`id`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; /*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `sessions`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `sessions` ( + `id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `user_id` bigint unsigned DEFAULT NULL, + `ip_address` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `user_agent` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci, + `payload` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `last_activity` int NOT NULL, + PRIMARY KEY (`id`), + KEY `sessions_user_id_index` (`user_id`), + KEY `sessions_last_activity_index` (`last_activity`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `spam_reports`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; @@ -309,6 +324,7 @@ CREATE TABLE `users` ( `banned_at` datetime DEFAULT NULL, `banned_reason` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci, `email_verified_at` timestamp NULL DEFAULT NULL, + `allowed_notifications` json DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `users_email_unique` (`email`), UNIQUE KEY `users_username_unique` (`username`), @@ -324,80 +340,81 @@ CREATE TABLE `users` ( /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; -INSERT INTO `migrations` VALUES (1,'2013_09_17_113019_create_users_table',1); -INSERT INTO `migrations` VALUES (2,'2013_09_17_121043_create_session_table',1); -INSERT INTO `migrations` VALUES (3,'2013_09_17_160916_create_roles_table',1); -INSERT INTO `migrations` VALUES (4,'2013_09_17_164244_create_role_user_table',1); -INSERT INTO `migrations` VALUES (5,'2013_09_17_170055_add_is_banned_field_to_users',1); -INSERT INTO `migrations` VALUES (6,'2013_09_18_115103_create_pastes_table',1); -INSERT INTO `migrations` VALUES (7,'2013_09_19_101701_create_comments_table',1); -INSERT INTO `migrations` VALUES (8,'2013_09_19_104855_create_activity_table',1); -INSERT INTO `migrations` VALUES (9,'2013_09_22_130010_add_image_url_field_to_users',1); -INSERT INTO `migrations` VALUES (10,'2013_09_22_130711_add_type_field_to_comments',1); -INSERT INTO `migrations` VALUES (11,'2013_09_22_163103_create_articles_table',1); -INSERT INTO `migrations` VALUES (12,'2013_09_22_163347_create_tags_table',1); -INSERT INTO `migrations` VALUES (13,'2013_09_22_163816_create_article_tag_table',1); -INSERT INTO `migrations` VALUES (14,'2013_09_23_111349_add_description_field_to_tags',1); -INSERT INTO `migrations` VALUES (15,'2013_09_23_121454_add_published_at_field_to_articles',1); -INSERT INTO `migrations` VALUES (16,'2013_09_23_160937_add_comment_counter_cache_to_articles',1); -INSERT INTO `migrations` VALUES (17,'2013_09_24_145833_create_contributors_table',1); -INSERT INTO `migrations` VALUES (18,'2013_09_27_014229_add_soft_delete_to_articles',1); -INSERT INTO `migrations` VALUES (19,'2013_09_27_015000_add_soft_delete_to_users',1); -INSERT INTO `migrations` VALUES (20,'2013_09_27_015109_add_soft_delete_to_comments',1); -INSERT INTO `migrations` VALUES (21,'2013_09_27_021650_add_soft_delete_to_pastes',1); -INSERT INTO `migrations` VALUES (22,'2013_10_24_131412_create_comment_tag_table',1); -INSERT INTO `migrations` VALUES (23,'2013_10_30_104107_add_tag_section_fields',1); -INSERT INTO `migrations` VALUES (24,'2013_12_08_161643_comments_add_laravel_version',1); -INSERT INTO `migrations` VALUES (25,'2013_12_14_151829_articles_add_laravel_verion_field',1); -INSERT INTO `migrations` VALUES (26,'2014_01_27_135001_forum_threads_create_table',1); -INSERT INTO `migrations` VALUES (27,'2014_01_27_141317_forum_replies_create_table',1); -INSERT INTO `migrations` VALUES (28,'2014_01_31_140118_tagged_items_create_table',1); -INSERT INTO `migrations` VALUES (29,'2014_02_01_022633_pastes_add_hash_field',1); -INSERT INTO `migrations` VALUES (30,'2014_02_07_125035_forum_threads_add_question_fields',1); -INSERT INTO `migrations` VALUES (31,'2014_02_07_144708_forum_threads_add_solution_reply_id',1); -INSERT INTO `migrations` VALUES (32,'2014_02_07_155103_forum_thread_visitation_timestamps_create_table',1); -INSERT INTO `migrations` VALUES (33,'2014_05_30_115728_users_add_remember_me_token',1); -INSERT INTO `migrations` VALUES (34,'2014_09_10_112330_add_ip_to_pastes_table',1); -INSERT INTO `migrations` VALUES (35,'2014_11_09_185116_pinned_threads',1); -INSERT INTO `migrations` VALUES (36,'2014_12_07_143131_add_user_confirmation_columns',1); -INSERT INTO `migrations` VALUES (37,'2014_12_13_164931_create_ip_columns',1); -INSERT INTO `migrations` VALUES (38,'2014_12_13_210738_add_spam_counter_to_users_table',1); -INSERT INTO `migrations` VALUES (39,'2014_12_21_212154_remove_contributors_table',1); -INSERT INTO `migrations` VALUES (40,'2015_04_12_171949_add_indexes',1); -INSERT INTO `migrations` VALUES (41,'2015_04_12_172949_add_indexes_to_tagged_items',1); -INSERT INTO `migrations` VALUES (42,'2015_07_26_160128_l5_cleanup',1); -INSERT INTO `migrations` VALUES (43,'2015_08_26_191523_drop_unused_tables',1); -INSERT INTO `migrations` VALUES (44,'2017_04_08_104959_next_version',1); -INSERT INTO `migrations` VALUES (45,'2017_07_08_202506_add_user_bio_column',1); -INSERT INTO `migrations` VALUES (46,'2017_08_29_123258_add_banned_at_column',1); -INSERT INTO `migrations` VALUES (47,'2017_10_18_193001_create_subscriptions_table',1); -INSERT INTO `migrations` VALUES (48,'2017_12_03_111900_create_likes_table',1); -INSERT INTO `migrations` VALUES (49,'2018_01_27_111437_fix_subscription_indexes',1); -INSERT INTO `migrations` VALUES (50,'2018_02_20_215439_create_failed_jobs_table',1); -INSERT INTO `migrations` VALUES (51,'2018_05_22_191538_cleanup_tables',1); -INSERT INTO `migrations` VALUES (52,'2020_01_09_193921_create_notifications_table',1); -INSERT INTO `migrations` VALUES (53,'2020_04_07_181731_create_series_table',1); -INSERT INTO `migrations` VALUES (54,'2020_04_07_185543_create_community_articles_table',1); -INSERT INTO `migrations` VALUES (55,'2020_07_16_185353_add_twitter_columns',1); -INSERT INTO `migrations` VALUES (56,'2020_10_01_093001_add_email_verified_at_column_to_users',1); -INSERT INTO `migrations` VALUES (57,'2020_11_03_205735_add_uuid_to_failed_jobs_table',1); -INSERT INTO `migrations` VALUES (58,'2020_11_22_194212_create_schedule_monitor_tables',1); -INSERT INTO `migrations` VALUES (59,'2021_03_10_161050_add_index_to_replyable_type',1); -INSERT INTO `migrations` VALUES (60,'2021_07_05_205125_remove_series',1); -INSERT INTO `migrations` VALUES (61,'2021_07_23_110409_update_articles_table_add_hero_image_field',1); -INSERT INTO `migrations` VALUES (62,'2021_07_31_183222_unique_github_ids',1); -INSERT INTO `migrations` VALUES (63,'2021_09_12_220452_add_resolved_by_to_threads_table',2); -INSERT INTO `migrations` VALUES (64,'2021_10_31_143501_add_declined_at_column_to_articles_table',3); -INSERT INTO `migrations` VALUES (65,'2021_11_15_213258_add_updated_by_to_threads_and_replies_table',4); -INSERT INTO `migrations` VALUES (66,'2021_11_22_093555_migrate_thread_feed_to_timestamp',4); -INSERT INTO `migrations` VALUES (67,'2021_10_12_170118_add_locked_by_column_to_threads_table',5); -INSERT INTO `migrations` VALUES (68,'2019_12_14_000001_create_personal_access_tokens_table',6); -INSERT INTO `migrations` VALUES (69,'2022_04_06_152416_add_uuids_to_tables',7); -INSERT INTO `migrations` VALUES (70,'2022_05_10_180922_make_uuids_non_nullable',7); -INSERT INTO `migrations` VALUES (71,'2022_06_14_072001_create_blocked_users_table',8); -INSERT INTO `migrations` VALUES (72,'2022_07_09_191433_update_articles_table_add_view_count',9); -INSERT INTO `migrations` VALUES (73,'2022_07_29_135113_add__website_to_users_table',9); -INSERT INTO `migrations` VALUES (74,'2022_08_21_215918_add_soft_delete_columns_to_replies_table',10); -INSERT INTO `migrations` VALUES (75,'2022_07_08_145847_create_spam_reports_table',11); -INSERT INTO `migrations` VALUES (76,'2022_10_15_150405_add_banned_reason_to_users_table',11); -INSERT INTO `migrations` VALUES (77,'2022_12_11_145605_add_expires_at_column_sanctum',12); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (1,'2013_09_17_113019_create_users_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (2,'2013_09_17_121043_create_session_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (3,'2013_09_17_160916_create_roles_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (4,'2013_09_17_164244_create_role_user_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (5,'2013_09_17_170055_add_is_banned_field_to_users',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (6,'2013_09_18_115103_create_pastes_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (7,'2013_09_19_101701_create_comments_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (8,'2013_09_19_104855_create_activity_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (9,'2013_09_22_130010_add_image_url_field_to_users',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (10,'2013_09_22_130711_add_type_field_to_comments',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (11,'2013_09_22_163103_create_articles_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (12,'2013_09_22_163347_create_tags_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (13,'2013_09_22_163816_create_article_tag_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (14,'2013_09_23_111349_add_description_field_to_tags',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (15,'2013_09_23_121454_add_published_at_field_to_articles',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (16,'2013_09_23_160937_add_comment_counter_cache_to_articles',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (17,'2013_09_24_145833_create_contributors_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (18,'2013_09_27_014229_add_soft_delete_to_articles',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (19,'2013_09_27_015000_add_soft_delete_to_users',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (20,'2013_09_27_015109_add_soft_delete_to_comments',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (21,'2013_09_27_021650_add_soft_delete_to_pastes',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (22,'2013_10_24_131412_create_comment_tag_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (23,'2013_10_30_104107_add_tag_section_fields',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (24,'2013_12_08_161643_comments_add_laravel_version',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (25,'2013_12_14_151829_articles_add_laravel_verion_field',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (26,'2014_01_27_135001_forum_threads_create_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (27,'2014_01_27_141317_forum_replies_create_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (28,'2014_01_31_140118_tagged_items_create_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (29,'2014_02_01_022633_pastes_add_hash_field',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (30,'2014_02_07_125035_forum_threads_add_question_fields',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (31,'2014_02_07_144708_forum_threads_add_solution_reply_id',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (32,'2014_02_07_155103_forum_thread_visitation_timestamps_create_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (33,'2014_05_30_115728_users_add_remember_me_token',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (34,'2014_09_10_112330_add_ip_to_pastes_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (35,'2014_11_09_185116_pinned_threads',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (36,'2014_12_07_143131_add_user_confirmation_columns',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (37,'2014_12_13_164931_create_ip_columns',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (38,'2014_12_13_210738_add_spam_counter_to_users_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (39,'2014_12_21_212154_remove_contributors_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (40,'2015_04_12_171949_add_indexes',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (41,'2015_04_12_172949_add_indexes_to_tagged_items',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (42,'2015_07_26_160128_l5_cleanup',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (43,'2015_08_26_191523_drop_unused_tables',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (44,'2017_04_08_104959_next_version',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (45,'2017_07_08_202506_add_user_bio_column',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (46,'2017_08_29_123258_add_banned_at_column',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (47,'2017_10_18_193001_create_subscriptions_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (48,'2017_12_03_111900_create_likes_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (49,'2018_01_27_111437_fix_subscription_indexes',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (50,'2018_02_20_215439_create_failed_jobs_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (51,'2018_05_22_191538_cleanup_tables',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (52,'2020_01_09_193921_create_notifications_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (53,'2020_04_07_181731_create_series_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (54,'2020_04_07_185543_create_community_articles_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (55,'2020_07_16_185353_add_twitter_columns',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (56,'2020_10_01_093001_add_email_verified_at_column_to_users',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (57,'2020_11_03_205735_add_uuid_to_failed_jobs_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (58,'2020_11_22_194212_create_schedule_monitor_tables',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (59,'2021_03_10_161050_add_index_to_replyable_type',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (60,'2021_07_05_205125_remove_series',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (61,'2021_07_23_110409_update_articles_table_add_hero_image_field',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (62,'2021_07_31_183222_unique_github_ids',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (63,'2021_09_12_220452_add_resolved_by_to_threads_table',2); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (64,'2021_10_31_143501_add_declined_at_column_to_articles_table',3); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (65,'2021_11_15_213258_add_updated_by_to_threads_and_replies_table',4); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (66,'2021_11_22_093555_migrate_thread_feed_to_timestamp',4); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (67,'2021_10_12_170118_add_locked_by_column_to_threads_table',5); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (68,'2019_12_14_000001_create_personal_access_tokens_table',6); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (69,'2022_04_06_152416_add_uuids_to_tables',7); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (70,'2022_05_10_180922_make_uuids_non_nullable',7); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (71,'2022_06_14_072001_create_blocked_users_table',8); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (72,'2022_07_09_191433_update_articles_table_add_view_count',9); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (73,'2022_07_29_135113_add__website_to_users_table',9); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (74,'2022_08_21_215918_add_soft_delete_columns_to_replies_table',10); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (75,'2022_07_08_145847_create_spam_reports_table',11); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (76,'2022_10_15_150405_add_banned_reason_to_users_table',11); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (77,'2022_12_11_145605_add_expires_at_column_sanctum',12); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (78,'2023_01_31_190506_add_allowed_notifications_column_to_users_table',13); diff --git a/lang/en/validation.php b/lang/en/validation.php deleted file mode 100644 index 70407c9d9..000000000 --- a/lang/en/validation.php +++ /dev/null @@ -1,184 +0,0 @@ - '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.', - 'ascii' => 'The :attribute must only contain single-byte alphanumeric characters and symbols.', - '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.', - 'decimal' => 'The :attribute must have :decimal decimal places.', - '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.', - 'doesnt_end_with' => 'The :attribute may not end with one of the following: :values.', - 'doesnt_start_with' => 'The :attribute may not start with one of the following: :values.', - '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.', - 'lowercase' => 'The :attribute must be lowercase.', - '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.', - ], - 'max_digits' => 'The :attribute must not have more than :max digits.', - '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.', - ], - 'min_digits' => 'The :attribute must have at least :min digits.', - 'missing' => 'The :attribute field must be missing.', - 'missing_if' => 'The :attribute field must be missing when :other is :value.', - 'missing_unless' => 'The :attribute field must be missing unless :other is :value.', - 'missing_with' => 'The :attribute field must be missing when :values is present.', - 'missing_with_all' => 'The :attribute field must be missing when :values are present.', - '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' => [ - 'letters' => 'The :attribute must contain at least one letter.', - 'mixed' => 'The :attribute must contain at least one uppercase and one lowercase letter.', - 'numbers' => 'The :attribute must contain at least one number.', - 'symbols' => 'The :attribute must contain at least one symbol.', - 'uncompromised' => 'The given :attribute has appeared in a data leak. Please choose a different :attribute.', - ], - '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_if_accepted' => 'The :attribute field is required when :other is accepted.', - '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.', - 'uppercase' => 'The :attribute must be uppercase.', - 'url' => 'The :attribute must be a valid URL.', - 'ulid' => 'The :attribute must be a valid ULID.', - '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 90b3cf0c6..8502c633e 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -20,9 +20,10 @@ - - - + + + + diff --git a/public/index.php b/public/index.php index 75dd8877f..947d98963 100644 --- a/public/index.php +++ b/public/index.php @@ -1,55 +1,17 @@ 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 856681dd0..bd952d2a0 100644 --- a/routes/api.php +++ b/routes/api.php @@ -1,7 +1,7 @@ middleware('throttle:api')->group(function () { Route::post('/', [ArticlesController::class, 'store'])->name('api.articles.store'); diff --git a/routes/channels.php b/routes/channels.php deleted file mode 100644 index eefef2459..000000000 --- a/routes/channels.php +++ /dev/null @@ -1,7 +0,0 @@ -id === (int) $id; -}); diff --git a/routes/console.php b/routes/console.php new file mode 100644 index 000000000..4602d7a95 --- /dev/null +++ b/routes/console.php @@ -0,0 +1,17 @@ +comment(Inspiring::quote()); +})->purpose('Display an inspiring quote')->hourly(); + +Schedule::command('schedule-monitor:sync')->dailyAt('04:56'); +Schedule::command('model:prune', ['--model' => MonitoredScheduledTaskLogItem::class])->daily(); +Schedule::command('horizon:snapshot')->everyFiveMinutes(); +Schedule::command('lio:post-article-to-twitter')->twiceDaily(14, 18); +Schedule::command('lio:generate-sitemap')->daily()->graceTimeInMinutes(25); +Schedule::command('lio:update-article-view-counts')->twiceDaily(); diff --git a/routes/web.php b/routes/web.php index d5689cd96..d5146396c 100644 --- a/routes/web.php +++ b/routes/web.php @@ -27,7 +27,7 @@ use App\Http\Controllers\SocialImageController; use App\Http\Controllers\SubscriptionController; use App\Http\Controllers\UnblockUserController; -use App\Http\Middleware\Authenticate; +use Illuminate\Auth\Middleware\Authenticate; use Illuminate\Support\Facades\Route; Route::feeds(); diff --git a/tests/CreatesApplication.php b/tests/CreatesApplication.php deleted file mode 100644 index cc6830112..000000000 --- a/tests/CreatesApplication.php +++ /dev/null @@ -1,21 +0,0 @@ -make(Kernel::class)->bootstrap(); - - return $app; - } -} diff --git a/tests/Feature/AuthTest.php b/tests/Feature/AuthTest.php index 0273b98bb..4313fe2b8 100644 --- a/tests/Feature/AuthTest.php +++ b/tests/Feature/AuthTest.php @@ -43,6 +43,7 @@ 'email' => 'The email field is required.', 'username' => 'The username field is required.', 'rules' => 'The rules must be accepted.', + 'terms' => 'The terms must be accepted.', ]); }); diff --git a/tests/Feature/ReplyTest.php b/tests/Feature/ReplyTest.php index 7a1afe934..281374d07 100644 --- a/tests/Feature/ReplyTest.php +++ b/tests/Feature/ReplyTest.php @@ -7,7 +7,7 @@ use App\Models\User; use App\Notifications\MentionNotification; use App\Rules\InvalidMentionRule; -use Illuminate\Foundation\Testing\DatabaseMigrations; +use Illuminate\Foundation\Testing\RefreshDatabase; use Illuminate\Notifications\DatabaseNotification; use Illuminate\Support\Facades\Notification; use Illuminate\Support\HtmlString; @@ -15,7 +15,7 @@ use Tests\TestCase; uses(TestCase::class); -uses(DatabaseMigrations::class); +uses(RefreshDatabase::class); test('users can add a reply to a thread', function () { $thread = Thread::factory()->create(['subject' => 'The first thread', 'slug' => 'the-first-thread']); @@ -75,11 +75,11 @@ }); test('users cannot delete a reply they do not own', function () { - Reply::factory()->create(); + $reply = Reply::factory()->create(); $this->login(); - $this->delete('/replies/1') + $this->delete("/replies/{$reply->id}") ->assertForbidden(); }); @@ -201,12 +201,21 @@ 'replyable_type' => Thread::TABLE, ]); - $notification = DatabaseNotification::first(); - $this->assertSame($user->id, (int) $notification->notifiable_id); - $this->assertSame('users', $notification->notifiable_type); - $this->assertSame('mention', $notification->data['type']); - $this->assertSame('The first thread', $notification->data['replyable_subject']); -}); + $tested = false; + + foreach (DatabaseNotification::all() as $notification) { + if ($notification->type === MentionNotification::class) { + $this->assertSame($user->id, (int) $notification->notifiable_id); + $this->assertSame('users', $notification->notifiable_type); + $this->assertSame('mention', $notification->data['type']); + $this->assertSame('The first thread', $notification->data['replyable_subject']); + + $tested = true; + } + } + + $this->assertTrue($tested); +})->only(); test('users are not notified when mentioned in an edited reply', function () { Notification::fake(); diff --git a/tests/Integration/Models/ThreadTest.php b/tests/Integration/Models/ThreadTest.php index 0c149737b..48f96cced 100644 --- a/tests/Integration/Models/ThreadTest.php +++ b/tests/Integration/Models/ThreadTest.php @@ -87,6 +87,9 @@ $threadUpdatedYesterday = createThreadFromYesterday(); $threadFromToday = createThreadFromToday(); $threadFromTwoDaysAgo = createThreadFromTwoDaysAgo(); + + sleep(1); + dispatch_sync(new CreateReply(Str::uuid(), 'Hello world', User::factory()->create(), $threadFromTwoDaysAgo)); $threads = Thread::feed(); diff --git a/tests/Integration/Rules/PasscheckRuleTest.php b/tests/Integration/Rules/PasscheckRuleTest.php index 7711c8e18..ee3c11679 100644 --- a/tests/Integration/Rules/PasscheckRuleTest.php +++ b/tests/Integration/Rules/PasscheckRuleTest.php @@ -11,16 +11,12 @@ $this->login(['password' => bcrypt('foo')]); $rule = new PasscheckRule; - $result = $rule->passes('password', 'foo'); - - expect($result)->toBeTrue(); -}); + $rule->validate('password', 'foo', fn () => throw new Exception); +})->throwsNoExceptions(); it('fails when the password is incorrect', function () { $this->login(); $rule = new PasscheckRule; - $result = $rule->passes('password', 'foo'); - - expect($result)->toBeFalse(); -}); + $rule->validate('password', 'foo', fn () => throw new Exception); +})->throws(Exception::class); diff --git a/tests/TestCase.php b/tests/TestCase.php index 1ec3bb513..f14f9bd61 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -6,7 +6,6 @@ class TestCase extends IlluminateTestCase { - use CreatesApplication; use CreatesUsers; use HttpAssertions; diff --git a/tests/Unit/Rules/DoesNotContainUrlRuleTest.php b/tests/Unit/Rules/DoesNotContainUrlRuleTest.php index d6c9301e7..0972a47ee 100644 --- a/tests/Unit/Rules/DoesNotContainUrlRuleTest.php +++ b/tests/Unit/Rules/DoesNotContainUrlRuleTest.php @@ -3,19 +3,13 @@ use App\Rules\DoesNotContainUrlRule; it('detects a url in a string', function () { - $this->assertFalse( - (new DoesNotContainUrlRule)->passes('foo', 'This is a string http://example.com with an url in it.'), - ); -}); + (new DoesNotContainUrlRule)->validate('foo', 'This is a string http://example.com with an url in it.', fn () => throw new Exception); +})->throws(Exception::class); it('passes when no url is present', function () { - $this->assertTrue( - (new DoesNotContainUrlRule)->passes('foo', 'This is a string without an url in it.'), - ); -}); + (new DoesNotContainUrlRule)->validate('foo', 'This is a string without an url in it.', fn () => throw new Exception); +})->throwsNoExceptions(); it('passes when extra spaces are present', function () { - $this->assertTrue( - (new DoesNotContainUrlRule)->passes('foo', 'This is a string with extra spaces.'), - ); -}); + (new DoesNotContainUrlRule)->validate('foo', 'This is a string with extra spaces.', fn () => throw new Exception); +})->throwsNoExceptions(); diff --git a/tests/Unit/Rules/HttpImageRuleTest.php b/tests/Unit/Rules/HttpImageRuleTest.php index f95a67036..82ab2a6ea 100644 --- a/tests/Unit/Rules/HttpImageRuleTest.php +++ b/tests/Unit/Rules/HttpImageRuleTest.php @@ -3,13 +3,9 @@ use App\Rules\HttpImageRule; it('passes when no http links are detected', function () { - $this->assertTrue( - (new HttpImageRule)->passes('body', 'some text ![](https://link.com)'), - ); -}); + (new HttpImageRule)->validate('body', 'some text ![](https://link.com)', fn () => throw new Exception); +})->throwsNoExceptions(); it('fails when http links are detected', function () { - $this->assertFalse( - (new HttpImageRule)->passes('body', 'some text ![](http://link.com)'), - ); -}); + (new HttpImageRule)->validate('body', 'some text ![](http://link.com)', fn () => throw new Exception); +})->throws(Exception::class); diff --git a/tests/Unit/Rules/InvalidMentionRuleTest.php b/tests/Unit/Rules/InvalidMentionRuleTest.php index 1e0175a1d..8bce0e929 100644 --- a/tests/Unit/Rules/InvalidMentionRuleTest.php +++ b/tests/Unit/Rules/InvalidMentionRuleTest.php @@ -3,7 +3,7 @@ use App\Rules\InvalidMentionRule; it('passes when no invalid mentions are detected', function ($body) { - expect((new InvalidMentionRule)->passes('body', $body))->toBeTrue(); + expect((new InvalidMentionRule)->validate('body', $body, fn () => throw new Exception)); })->with([ 'Hello, I\'m looking for some help', 'I\'ve seen [this link](https://example.com), is it legit?', @@ -24,10 +24,10 @@ [link](https://example.com) \n ![image](https://example.com/image.png)", -]); +])->throwsNoExceptions(); it('fails when invalid mentions are detected', function ($body) { - expect((new InvalidMentionRule)->passes('body', $body))->toBeFalse(); + expect((new InvalidMentionRule)->validate('body', $body, fn () => throw new Exception)); })->with([ '[@driesvints](https://somethingnasty.com)', 'Hey [@joedixon](https://somethingnasty.com), is it legit?', @@ -48,4 +48,4 @@ [link](https://example.com) \n ![image](https://example.com/image.png)", -]); +])->throws(Exception::class);