diff --git a/.github/workflows/test-and-lint-js.yml b/.github/workflows/test-and-lint-js.yml index e6a05d3a..1b169b91 100644 --- a/.github/workflows/test-and-lint-js.yml +++ b/.github/workflows/test-and-lint-js.yml @@ -21,7 +21,7 @@ jobs: - uses: actions/checkout@v4 - name: Cache dependencies - uses: actions/cache@v2 + uses: actions/cache@v4 with: path: node_modules key: ${{ runner.os }}-npm-dependencies-${{ hashFiles('package.lock') }} diff --git a/.github/workflows/test-and-lint-php.yml b/.github/workflows/test-and-lint-php.yml index da9a53b9..b6bc485b 100644 --- a/.github/workflows/test-and-lint-php.yml +++ b/.github/workflows/test-and-lint-php.yml @@ -40,7 +40,7 @@ jobs: run: composer validate - name: Cache dependencies - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: vendor key: ${{ runner.os }}-composer-dependencies-${{ hashFiles('composer.lock') }} diff --git a/api.json b/api.json new file mode 100644 index 00000000..0ba4fdfa --- /dev/null +++ b/api.json @@ -0,0 +1 @@ +{"openapi":"3.1.0","info":{"title":"Escooters","version":"0.0.1"},"servers":[{"url":"http:\/\/escooters.blumilk.localhost\/api"}],"paths":{"\/register":{"post":{"operationId":"register","tags":["Auth"],"requestBody":{"content":{"application\/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"email":{"type":"string","format":"email"},"password":{"type":"string"}},"required":["name","email","password"]}}}},"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"403":{"$ref":"#\/components\/responses\/AuthorizationException"}}}},"\/login":{"post":{"operationId":"login","tags":["Auth"],"requestBody":{"content":{"application\/json":{"schema":{"type":"object","properties":{"email":{"type":"string","format":"email"},"password":{"type":"string"}},"required":["email","password"]}}}},"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"anyOf":[{"type":"string"},{"type":"object","properties":{"":{"type":"array","items":{"type":"string"}},"access_token":{"type":"string"}},"required":[null,"access_token"]}]}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"403":{"$ref":"#\/components\/responses\/AuthorizationException"}}}},"\/logout":{"post":{"operationId":"logout","tags":["Auth"],"requestBody":{"content":{"application\/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}}}}},"\/language\/{locale}":{"post":{"operationId":"changeLocale","tags":["ChangeLocale"],"parameters":[{"name":"locale","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application\/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}}}}},"\/admin\/cities":{"get":{"operationId":"cities.index","tags":["City"],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"cities":{"type":"array","items":{"$ref":"#\/components\/schemas\/CityResource"}},"providers":{"type":"array","items":{"$ref":"#\/components\/schemas\/ProviderResource"}},"countries":{"type":"array","items":{"$ref":"#\/components\/schemas\/CountryResource"}},"citiesWithoutAssignedCountry":{"type":"array","items":{"$ref":"#\/components\/schemas\/CityWithoutAssignedCountryResource"}}},"required":["cities","providers","countries","citiesWithoutAssignedCountry"]}}}}}},"post":{"operationId":"cities.store","tags":["City"],"requestBody":{"content":{"application\/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"latitude":{"type":"number"},"longitude":{"type":"number"},"country_id":{"type":"integer"}},"required":["name","latitude","longitude"]}}}},"responses":{"201":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"403":{"$ref":"#\/components\/responses\/AuthorizationException"}}}},"\/admin\/cities\/create":{"get":{"operationId":"cities.create","tags":["City"]}},"\/admin\/cities\/{city}":{"get":{"operationId":"cities.show","tags":["City"],"parameters":[{"name":"city","in":"path","required":true,"schema":{"type":"string"}}]},"put":{"operationId":"cities.update","tags":["City"],"parameters":[{"name":"city","in":"path","required":true,"description":"The city ID","schema":{"type":"integer"}}],"requestBody":{"content":{"application\/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"latitude":{"type":"number"},"longitude":{"type":"number"},"country_id":{"type":"integer"}},"required":["name","latitude","longitude"]}}}},"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"422":{"$ref":"#\/components\/responses\/ValidationException"},"403":{"$ref":"#\/components\/responses\/AuthorizationException"}}},"delete":{"operationId":"cities.destroy","tags":["City"],"parameters":[{"name":"city","in":"path","required":true,"description":"The city ID","schema":{"type":"integer"}}],"requestBody":{"content":{"application\/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"}}}},"\/admin\/cities\/{city}\/edit":{"get":{"operationId":"cities.edit","tags":["City"],"parameters":[{"name":"city","in":"path","required":true,"schema":{"type":"string"}}]}},"\/city-alternative-name":{"get":{"operationId":"city-alternative-name.index","tags":["CityAlternativeName"]},"post":{"operationId":"city-alternative-name.store","tags":["CityAlternativeName"],"requestBody":{"content":{"application\/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"city_id":{"type":"integer"}},"required":["name"]}}}},"responses":{"201":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"403":{"$ref":"#\/components\/responses\/AuthorizationException"}}}},"\/city-alternative-name\/create":{"get":{"operationId":"city-alternative-name.create","tags":["CityAlternativeName"]}},"\/city-alternative-name\/{city_alternative_name}":{"get":{"operationId":"city-alternative-name.show","tags":["CityAlternativeName"],"parameters":[{"name":"city_alternative_name","in":"path","required":true,"schema":{"type":"string"}}]},"put":{"operationId":"city-alternative-name.update","tags":["CityAlternativeName"],"parameters":[{"name":"city_alternative_name","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application\/json":{"schema":{"type":"object"}}}}}},"\/city-alternative-name\/{city_alternative_name}\/edit":{"get":{"operationId":"city-alternative-name.edit","tags":["CityAlternativeName"],"parameters":[{"name":"city_alternative_name","in":"path","required":true,"schema":{"type":"string"}}]}},"\/city-alternative-name\/{cityAlternativeName}":{"delete":{"operationId":"city-alternative-name.destroy","tags":["CityAlternativeName"],"parameters":[{"name":"cityAlternativeName","in":"path","required":true,"description":"The city alternative name ID","schema":{"type":"integer"}}],"requestBody":{"content":{"application\/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"}}}},"\/opinions":{"post":{"operationId":"cityOpinion.store","tags":["CityOpinion"],"requestBody":{"content":{"application\/json":{"schema":{"type":"object","properties":{"rating":{"type":"number","minimum":1,"maximum":5},"content":{"type":"string"},"city_id":{"type":"number"}},"required":["rating","content","city_id"]}}}},"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"403":{"$ref":"#\/components\/responses\/AuthorizationException"}}}},"\/opinions\/{cityOpinion}":{"patch":{"operationId":"cityOpinion.update","tags":["CityOpinion"],"parameters":[{"name":"cityOpinion","in":"path","required":true,"description":"The city opinion ID","schema":{"type":"integer"}}],"requestBody":{"content":{"application\/json":{"schema":{"type":"object","properties":{"rating":{"type":"number","minimum":1,"maximum":5},"content":{"type":"string"},"city_id":{"type":"number"}},"required":["rating","content","city_id"]}}}},"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"422":{"$ref":"#\/components\/responses\/ValidationException"},"403":{"$ref":"#\/components\/responses\/AuthorizationException"}}},"delete":{"operationId":"cityOpinion.destroy","tags":["CityOpinion"],"parameters":[{"name":"cityOpinion","in":"path","required":true,"description":"The city opinion ID","schema":{"type":"integer"}}],"requestBody":{"content":{"application\/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"}}}},"\/{country}\/{city}":{"get":{"operationId":"cityPage.index","tags":["CityPage"],"parameters":[{"name":"country","in":"path","required":true,"description":"The country slug","schema":{"type":"string"}},{"name":"city","in":"path","required":true,"description":"The city slug","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"city":{"$ref":"#\/components\/schemas\/CityResource"},"providers":{"type":"array","items":{"$ref":"#\/components\/schemas\/ProviderResource"}},"cityOpinions":{"type":"array","items":{"$ref":"#\/components\/schemas\/CityOpinionResource"}}},"required":["city","providers","cityOpinions"]}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"}}}},"\/providers":{"get":{"operationId":"cityProvider.index","tags":["CityProvider"],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"cities":{"type":"array","items":{"$ref":"#\/components\/schemas\/CityResource"}},"providers":{"type":"array","items":{"$ref":"#\/components\/schemas\/ProviderResource"}},"countries":{"type":"array","items":{"$ref":"#\/components\/schemas\/CountryResource"}}},"required":["cities","providers","countries"]}}}}}}},"\/update-city-providers\/{city}":{"patch":{"operationId":"cityProvider.update","tags":["CityProvider"],"parameters":[{"name":"city","in":"path","required":true,"description":"The city ID","schema":{"type":"integer"}}],"requestBody":{"content":{"application\/json":{"schema":{"type":"object","properties":{"providerNames":{"type":"array","items":{"type":"string"}}}}}}},"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"422":{"$ref":"#\/components\/responses\/ValidationException"},"403":{"$ref":"#\/components\/responses\/AuthorizationException"}}}},"\/run-importers":{"post":{"operationId":"cityProvider.runImporters","tags":["CityProvider"],"requestBody":{"content":{"application\/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}}}}},"\/delete-city-without-assigned-country\/{city}":{"delete":{"operationId":"cityWithoutAssignedCountry.destroy","tags":["CityWithoutAssignedCountry"],"parameters":[{"name":"city","in":"path","required":true,"description":"The city ID","schema":{"type":"integer"}}],"requestBody":{"content":{"application\/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"}}}},"\/delete-all-cities-without-assigned-country":{"post":{"operationId":"cityWithoutAssignedCountry.destroyAll","tags":["CityWithoutAssignedCountry"],"requestBody":{"content":{"application\/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}}}}},"\/admin\/countries":{"get":{"operationId":"countries.index","tags":["Country"],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"countries":{"type":"array","items":{"$ref":"#\/components\/schemas\/CountryResource"}}},"required":["countries"]}}}}}},"post":{"operationId":"countries.store","tags":["Country"],"requestBody":{"content":{"application\/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"alternative_name":{"type":["string","null"]},"latitude":{"type":"number"},"longitude":{"type":"number"},"iso":{"type":"string"}},"required":["name","latitude","longitude","iso"]}}}},"responses":{"201":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"403":{"$ref":"#\/components\/responses\/AuthorizationException"}}}},"\/admin\/countries\/create":{"get":{"operationId":"countries.create","tags":["Country"]}},"\/admin\/countries\/{country}":{"get":{"operationId":"countries.show","tags":["Country"],"parameters":[{"name":"country","in":"path","required":true,"schema":{"type":"string"}}]},"put":{"operationId":"countries.update","tags":["Country"],"parameters":[{"name":"country","in":"path","required":true,"description":"The country ID","schema":{"type":"integer"}}],"requestBody":{"content":{"application\/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"alternative_name":{"type":["string","null"]},"latitude":{"type":"number"},"longitude":{"type":"number"},"iso":{"type":"string"}},"required":["name","latitude","longitude","iso"]}}}},"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"422":{"$ref":"#\/components\/responses\/ValidationException"},"403":{"$ref":"#\/components\/responses\/AuthorizationException"}}},"delete":{"operationId":"countries.destroy","tags":["Country"],"parameters":[{"name":"country","in":"path","required":true,"description":"The country ID","schema":{"type":"integer"}}],"requestBody":{"content":{"application\/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"}}}},"\/admin\/countries\/{country}\/edit":{"get":{"operationId":"countries.edit","tags":["Country"],"parameters":[{"name":"country","in":"path","required":true,"schema":{"type":"string"}}]}},"\/admin\/dashboard":{"get":{"operationId":"dashboard.index","tags":["Dashboard"],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"usersCount":{"type":"string"},"citiesWithProvidersCount":{"type":"string"},"countriesWithCitiesWithProvidersCount":{"type":"string"},"providersCount":{"type":"string"},"providerCitiesCount":{"type":"string"},"providers":{"type":"array","items":{"$ref":"#\/components\/schemas\/ProviderResource"}}},"required":["usersCount","citiesWithProvidersCount","countriesWithCitiesWithProvidersCount","providersCount","providerCitiesCount","providers"]}}}}}},"post":{"operationId":"dashboard.store","tags":["Dashboard"],"requestBody":{"content":{"application\/json":{"schema":{"type":"object"}}}}}},"\/admin\/dashboard\/create":{"get":{"operationId":"dashboard.create","tags":["Dashboard"]}},"\/admin\/dashboard\/{dashboard}":{"get":{"operationId":"dashboard.show","tags":["Dashboard"],"parameters":[{"name":"dashboard","in":"path","required":true,"schema":{"type":"string"}}]},"put":{"operationId":"dashboard.update","tags":["Dashboard"],"parameters":[{"name":"dashboard","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application\/json":{"schema":{"type":"object"}}}}},"delete":{"operationId":"dashboard.destroy","tags":["Dashboard"],"parameters":[{"name":"dashboard","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application\/json":{"schema":{"type":"object"}}}}}},"\/admin\/dashboard\/{dashboard}\/edit":{"get":{"operationId":"dashboard.edit","tags":["Dashboard"],"parameters":[{"name":"dashboard","in":"path","required":true,"schema":{"type":"string"}}]}},"\/favorites":{"post":{"operationId":"favorites.store","tags":["Favorites"],"requestBody":{"content":{"application\/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"anyOf":[{"type":"object","properties":{"message":{"type":"string","example":"City removed from favorites."}},"required":["message"]},{"type":"object","properties":{"message":{"type":"string","example":"City added to favorites."}},"required":["message"]}]}}}}}}},"\/favorites\/{cityId}":{"get":{"operationId":"favorites.check","tags":["Favorites"],"parameters":[{"name":"cityId","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"boolean"}}}}}}},"\/favorite-cities":{"get":{"operationId":"favorites.index","tags":["Favorites"],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"cities":{"type":"string"},"providers":{"type":"array","items":{"$ref":"#\/components\/schemas\/ProviderResource"}}},"required":["cities","providers"]}}}}}}},"\/admin\/importers":{"get":{"operationId":"importInfo.index","tags":["ImportInfo"],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"importInfo":{"type":"array","items":{"$ref":"#\/components\/schemas\/ImportInfoResource"}},"codes":{"type":"string"},"providers":{"type":"string"}},"required":["importInfo","codes","providers"]}}}}}}},"\/admin\/providers":{"get":{"operationId":"providers.index","tags":["Provider"],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"providers":{"type":"array","items":{"$ref":"#\/components\/schemas\/ProviderResource"}}},"required":["providers"]}}}}}},"post":{"operationId":"providers.store","tags":["Provider"],"requestBody":{"content":{"application\/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"color":{"type":"string"},"file":{"type":"string"}},"required":["name","color","file"]}}}},"responses":{"201":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"403":{"$ref":"#\/components\/responses\/AuthorizationException"}}}},"\/admin\/providers\/create":{"get":{"operationId":"providers.create","tags":["Provider"]}},"\/admin\/providers\/{provider}":{"get":{"operationId":"providers.show","tags":["Provider"],"parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string"}}]},"put":{"operationId":"providers.update","tags":["Provider"],"parameters":[{"name":"provider","in":"path","required":true,"description":"The provider name","schema":{"type":"string"}}],"requestBody":{"content":{"application\/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"color":{"type":"string"},"file":{"type":"string"}},"required":["name","color","file"]}}}},"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"422":{"$ref":"#\/components\/responses\/ValidationException"},"403":{"$ref":"#\/components\/responses\/AuthorizationException"}}},"delete":{"operationId":"providers.destroy","tags":["Provider"],"parameters":[{"name":"provider","in":"path","required":true,"description":"The provider name","schema":{"type":"string"}}],"requestBody":{"content":{"application\/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"}}}},"\/admin\/providers\/{provider}\/edit":{"get":{"operationId":"providers.edit","tags":["Provider"],"parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string"}}]}},"\/images\/providers\/{filename}":{"get":{"operationId":"provider.showLogo","tags":["Provider"],"parameters":[{"name":"filename","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"image":{"type":"string"},"mime_type":{"type":"string","example":"image\/png"}},"required":["image","mime_type"]}}}}}}}},"components":{"schemas":{"CityAlternativeName":{"type":"object","properties":{"id":{"type":"integer"},"name":{"type":"string"},"city_id":{"type":"integer"},"created_at":{"type":["string","null"],"format":"date-time"},"updated_at":{"type":["string","null"],"format":"date-time"}},"required":["id","name","city_id","created_at","updated_at"],"title":"CityAlternativeName"},"CityOpinion":{"type":"object","properties":{"id":{"type":"integer"},"content":{"type":"string"},"rating":{"type":"integer"},"city_id":{"type":"integer"},"user_id":{"type":"integer"},"created_at":{"type":["string","null"],"format":"date-time"},"updated_at":{"type":["string","null"],"format":"date-time"}},"required":["id","content","rating","city_id","user_id","created_at","updated_at"],"title":"CityOpinion"},"CityOpinionResource":{"type":"object","properties":{"id":{"type":"integer"},"rating":{"type":"integer"},"content":{"type":"string"},"updated_at":{"type":["string","null"],"format":"date-time"},"user":{"$ref":"#\/components\/schemas\/User"}},"required":["id","rating","content","updated_at","user"],"title":"CityOpinionResource"},"CityProvider":{"type":"object","properties":{"id":{"type":"integer"},"provider_name":{"type":"string"},"city_id":{"type":"integer"},"created_by":{"type":["string","null"]},"created_at":{"type":["string","null"],"format":"date-time"},"updated_at":{"type":["string","null"],"format":"date-time"}},"required":["id","provider_name","city_id","created_by","created_at","updated_at"],"title":"CityProvider"},"CityResource":{"type":"object","properties":{"id":{"type":"integer"},"name":{"type":"string"},"slug":{"type":"string"},"latitude":{"type":["string","null"]},"longitude":{"type":["string","null"]},"city_alternative_names":{"type":"array","items":{"$ref":"#\/components\/schemas\/CityAlternativeName"}},"cityProviders":{"type":"array","items":{"$ref":"#\/components\/schemas\/CityProvider"}},"country":{"$ref":"#\/components\/schemas\/Country"},"cityOpinions":{"type":"array","items":{"$ref":"#\/components\/schemas\/CityOpinion"}}},"required":["id","name","slug","latitude","longitude","city_alternative_names","cityProviders","country","cityOpinions"],"title":"CityResource"},"CityWithoutAssignedCountryResource":{"type":"object","properties":{"id":{"type":"integer"},"city_name":{"type":"string"},"country_name":{"type":"string"}},"required":["id","city_name","country_name"],"title":"CityWithoutAssignedCountryResource"},"Country":{"type":"object","properties":{"id":{"type":"integer"},"name":{"type":"string"},"slug":{"type":"string"},"alternative_name":{"type":["string","null"]},"latitude":{"type":["string","null"]},"longitude":{"type":["string","null"]},"iso":{"type":"string"},"created_at":{"type":["string","null"],"format":"date-time"},"updated_at":{"type":["string","null"],"format":"date-time"}},"required":["id","name","slug","alternative_name","latitude","longitude","iso","created_at","updated_at"],"title":"Country"},"CountryResource":{"type":"object","properties":{"id":{"type":"integer"},"name":{"type":"string"},"slug":{"type":"string"},"alternative_name":{"type":["string","null"]},"latitude":{"type":["string","null"]},"longitude":{"type":["string","null"]},"iso":{"type":"string"}},"required":["id","name","slug","alternative_name","latitude","longitude","iso"],"title":"CountryResource"},"ImportInfoResource":{"type":"string","title":"ImportInfoResource"},"ProviderResource":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":["string","null"]},"android_url":{"type":["string","null"]},"ios_url":{"type":["string","null"]},"color":{"type":"string"}},"required":["name","url","android_url","ios_url","color"],"title":"ProviderResource"},"User":{"type":"object","properties":{"id":{"type":"integer"},"name":{"type":"string"},"email":{"type":"string"},"email_verified_at":{"type":["string","null"],"format":"date-time"},"created_at":{"type":["string","null"],"format":"date-time"},"updated_at":{"type":["string","null"],"format":"date-time"}},"required":["id","name","email","email_verified_at","created_at","updated_at"],"title":"User"}},"responses":{"ValidationException":{"description":"Validation error","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Errors overview."},"errors":{"type":"object","description":"A detailed description of each field that failed validation.","additionalProperties":{"type":"array","items":{"type":"string"}}}},"required":["message","errors"]}}}},"AuthorizationException":{"description":"Authorization error","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Error overview."}},"required":["message"]}}}},"ModelNotFoundException":{"description":"Not found","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Error overview."}},"required":["message"]}}}}}}} \ No newline at end of file diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index 3e4d6ff7..bfe40033 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -16,6 +16,7 @@ protected function schedule(Schedule $schedule): void $service = new DataImporterService(); $service->run("server"); })->monthly(); + $schedule->command("sanctum:prune-expired --hours=24")->daily(); } protected function commands(): void diff --git a/app/Http/Controllers/Admin/ProviderController.php b/app/Http/Controllers/Admin/ProviderController.php new file mode 100644 index 00000000..dc740e1d --- /dev/null +++ b/app/Http/Controllers/Admin/ProviderController.php @@ -0,0 +1,84 @@ +search("name") + ->orderByName() + ->orderByTimeRange() + ->paginate(self::ITEMS_PER_PAGE) + ->withQueryString(); + + return Inertia::render("Providers/Index", [ + "providers" => ProviderResource::collection($providers), + ]); + } + + public function store(ProviderRequest $request): void + { + Provider::query()->create($request->validated()); + + $fileName = $this->getFilename($request); + $fileContents = $request->file("file")->get(); + + Storage::disk("public")->put("providers/" . $fileName, $fileContents); + } + + public function update(ProviderRequest $request, Provider $provider): void + { + $provider->update($request->validated()); + + $imageName = $this->getFilename($request); + $storageImagePath = storage_path("app/public/providers/" . $imageName); + $resourceImagePath = resource_path("providers/" . $imageName); + $imageContents = $request->file("file")->get(); + + if (file_exists($resourceImagePath)) { + file_put_contents($resourceImagePath, $imageContents); + Storage::put($storageImagePath, file_get_contents($imageContents)); + } else { + Storage::put($storageImagePath, file_get_contents($imageContents)); + } + } + + public function destroy(Provider $provider): void + { + $provider->delete(); + $imagePath = storage_path("app/public/providers/" . strtolower($provider["name"]) . ".png"); + File::delete($imagePath); + } + + public function showLogo(string $filename): InertiaResponse + { + $imagePath = storage_path("app/public/providers/" . $filename); + + if (!file_exists($imagePath)) { + $imagePath = storage_path("app/public/providers/unknown.png"); + } + + return response(file_get_contents($imagePath), 200, ["Content-Type" => "image/png"]); + } + + public function getFilename(ProviderRequest $request): string + { + return strtolower($request["name"]) . "." . $request->file("file")->getClientOriginalExtension(); + } +} diff --git a/app/Http/Controllers/Api/Admin/CityAlternativeNameController.php b/app/Http/Controllers/Api/Admin/CityAlternativeNameController.php new file mode 100644 index 00000000..2f119649 --- /dev/null +++ b/app/Http/Controllers/Api/Admin/CityAlternativeNameController.php @@ -0,0 +1,27 @@ +create($request->validated()); + + return response()->json(["message" => __("City alternative name created successfully.")], 201); + } + + public function destroy(CityAlternativeName $cityAlternativeName): JsonResponse + { + $cityAlternativeName->delete(); + + return response()->json(["message" => __("City alternative name deleted successfully.")]); + } +} diff --git a/app/Http/Controllers/Api/Admin/CityController.php b/app/Http/Controllers/Api/Admin/CityController.php new file mode 100644 index 00000000..d12cf59f --- /dev/null +++ b/app/Http/Controllers/Api/Admin/CityController.php @@ -0,0 +1,67 @@ +with("cityAlternativeNames", "cityProviders", "country") + ->orderByProvidersCount() + ->searchCityNames() + ->orderByName() + ->orderByCountry() + ->orderByTimeRange() + ->orderByEmptyCoordinates() + ->paginate(15) + ->withQueryString(); + + $providers = Provider::all(); + $countries = Country::all(); + + $citiesWithoutAssignedCountry = CityWithoutAssignedCountry::all(); + + return response()->json([ + "cities" => CityResource::collection($cities), + "providers" => ProviderResource::collection($providers), + "countries" => CountryResource::collection($countries), + "citiesWithoutAssignedCountry" => CityWithoutAssignedCountryResource::collection($citiesWithoutAssignedCountry), + ]); + } + + public function store(CityRequest $request): JsonResponse + { + City::query()->create($request->validated()); + + return response()->json(["message" => __("City created successfully.")], 201); + } + + public function update(CityRequest $request, City $city): JsonResponse + { + $city->update($request->validated()); + + return response()->json(["message" => __("City updated successfully.")]); + } + + public function destroy(City $city): JsonResponse + { + $city->delete(); + + return response()->json(["message" => __("City deleted successfully.")]); + } +} diff --git a/app/Http/Controllers/Api/Admin/CountryController.php b/app/Http/Controllers/Api/Admin/CountryController.php new file mode 100644 index 00000000..3b8246c9 --- /dev/null +++ b/app/Http/Controllers/Api/Admin/CountryController.php @@ -0,0 +1,49 @@ +search("name") + ->orderByName() + ->orderByTimeRange() + ->paginate(15) + ->withQueryString(); + + return response()->json([ + "countries" => CountryResource::collection($countries), + ]); + } + + public function store(CountryRequest $request): JsonResponse + { + Country::query()->create($request->validated()); + + return response()->json(["message" => __("Country created successfully.")], 201); + } + + public function update(CountryRequest $request, Country $country): JsonResponse + { + $country->update($request->validated()); + + return response()->json(["message" => __("Country updated successfully.")]); + } + + public function destroy(Country $country): JsonResponse + { + $country->delete(); + + return response()->json(["message" => __("Country deleted successfully.")]); + } +} diff --git a/app/Http/Controllers/Api/Admin/ImportInfoController.php b/app/Http/Controllers/Api/Admin/ImportInfoController.php new file mode 100644 index 00000000..166cac0a --- /dev/null +++ b/app/Http/Controllers/Api/Admin/ImportInfoController.php @@ -0,0 +1,32 @@ +with("importInfoDetails") + ->orderByDesc("created_at") + ->paginate(15) + ->withQueryString(); + $codes = Code::all(); + $providers = Provider::all(); + + return response()->json([ + "importInfo" => ImportInfoResource::collection($importInfo), + "codes" => $codes, + "providers" => $providers, + ]); + } +} diff --git a/app/Http/Controllers/Api/Admin/ProviderController.php b/app/Http/Controllers/Api/Admin/ProviderController.php new file mode 100644 index 00000000..7f3f59a9 --- /dev/null +++ b/app/Http/Controllers/Api/Admin/ProviderController.php @@ -0,0 +1,94 @@ +search("name") + ->orderByName() + ->orderByTimeRange() + ->paginate(self::ITEMS_PER_PAGE) + ->withQueryString(); + + return response()->json([ + "providers" => ProviderResource::collection($providers), + ]); + } + + public function store(ProviderRequest $request): JsonResponse + { + Provider::query()->create($request->validated()); + + $fileName = $this->getFilename($request->name, $request->file("file")); + $fileContents = $request->file("file")->get(); + + Storage::disk("public")->put("providers/" . $fileName, $fileContents); + + return response()->json(["message" => __("Provider created successfully.")], 201); + } + + public function update(ProviderRequest $request, Provider $provider): JsonResponse + { + $provider->update($request->validated()); + + $imageName = $this->getFilename($request->name, $request->file("file")); + $storageImagePath = storage_path("app/public/providers/" . $imageName); + $resourceImagePath = resource_path("providers/" . $imageName); + $imageContents = $request->file("file")->get(); + + if (file_exists($resourceImagePath)) { + file_put_contents($resourceImagePath, $imageContents); + Storage::put($storageImagePath, file_get_contents($imageContents)); + } else { + Storage::put($storageImagePath, file_get_contents($imageContents)); + } + + return response()->json(["message" => __("Provider updated successfully.")]); + } + + public function destroy(Provider $provider): JsonResponse + { + $provider->delete(); + $imagePath = storage_path("app/public/providers/" . strtolower($provider["name"]) . ".png"); + File::delete($imagePath); + + return response()->json(["message" => __("Provider deleted successfully.")]); + } + + public function showLogo(string $filename): JsonResponse + { + $imagePath = storage_path("app/public/providers/" . $filename); + + if (!file_exists($imagePath)) { + $imagePath = storage_path("app/public/providers/unknown.png"); + } + + $imageData = base64_encode(file_get_contents($imagePath)); + + return response()->json([ + "image" => $imageData, + "mime_type" => "image/png", + ]); + } + + private function getFilename(string $name, UploadedFile $file): string + { + return strtolower($name) . "." . $file->getClientOriginalExtension(); + } +} diff --git a/app/Http/Controllers/Api/AuthController.php b/app/Http/Controllers/Api/AuthController.php new file mode 100644 index 00000000..1225cc83 --- /dev/null +++ b/app/Http/Controllers/Api/AuthController.php @@ -0,0 +1,116 @@ + $request->input("name"), + "email" => $request->input("email"), + "password" => Hash::make($request->input("password")), + ]); + + return response()->json([ + "message" => __("User created."), + ]); + } + + public function login(LoginRequest $request): JsonResponse + { + $remember = $request->boolean("remember", false); + + if (Auth::attempt([ + "email" => $request->email, + "password" => $request->password, + ], $remember)) { + $user = Auth::user(); + $user_id = (string)Auth::id(); + + $token_abilities = $this->getUserAbilities($user); + + $token = $user->createToken($user_id, $token_abilities)->plainTextToken; + + return response()->json([ + $token_abilities, + "access_token" => $token, + ]); + } + + return response()->json([ + "message" => __("Invalid credentials."), + ], Response::HTTP_UNAUTHORIZED); + } + + public function logout(Request $request): JsonResponse + { + $request->user()->currentAccessToken()->delete(); + + return response()->json([ + "message" => __("Logged out."), + ]); + } + + public function redirectToProvider(string $provider): JsonResponse + { + $redirect_url = Socialite::driver($provider)->stateless()->redirect()->getTargetUrl(); + + return response()->json([ + "redirect_url" => $redirect_url, + ]); + } + + public function handleProviderRedirect(string $provider): JsonResponse + { + try { + $user = Socialite::driver($provider)->user(); + + $user = User::firstOrCreate([ + "email" => $user->getEmail(), + ], [ + "name" => $user->getName(), + "password" => Hash::make(Str::password(8)), + ]); + $token_abilities = $this->getUserAbilities($user); + + $user_id = $user->id->toString(); + $token = $user->createToken($user_id, $token_abilities)->plainTextToken; + + return response()->json([ + "access_token" => $token, + ]); + } catch (Exception $e) { + return response()->json([ + "message" => __("Login failed."), + ]); + } + } + + private function getUserAbilities(Authenticatable $user): array + { + $abilities = []; + + if ($user->isAdmin()) { + $abilities[] = "HasAdminRole"; + } + + return $abilities; + } +} diff --git a/app/Http/Controllers/Api/ChangeLocaleController.php b/app/Http/Controllers/Api/ChangeLocaleController.php new file mode 100644 index 00000000..408970cb --- /dev/null +++ b/app/Http/Controllers/Api/ChangeLocaleController.php @@ -0,0 +1,27 @@ +setLocale($locale); + + return response()->json([ + "message" => __("Language has been changed."), + ]); + } + + return response()->json([ + "message" => __("Error changing the language."), + ]); + } +} diff --git a/app/Http/Controllers/Api/CityOpinionController.php b/app/Http/Controllers/Api/CityOpinionController.php new file mode 100644 index 00000000..7565e043 --- /dev/null +++ b/app/Http/Controllers/Api/CityOpinionController.php @@ -0,0 +1,45 @@ +user() + ->cityOpinions() + ->create($request->validated()); + + return response()->json([ + "message" => __("Opinion added successfully."), + ]); + } + + public function update(CityOpinionRequest $request, CityOpinion $cityOpinion): JsonResponse + { + $opinion = $request->validated(); + $opinion["user_id"] = $request->user()->id; + + $cityOpinion->update($opinion); + + return response()->json([ + "message" => __("Opinion edited successfully."), + ]); + } + + public function destroy(CityOpinion $cityOpinion): JsonResponse + { + $cityOpinion->delete(); + + return response()->json([ + "message" => __("Opinion removed successfully!"), + ]); + } +} diff --git a/app/Http/Controllers/Api/CityPageController.php b/app/Http/Controllers/Api/CityPageController.php new file mode 100644 index 00000000..5e35f2e9 --- /dev/null +++ b/app/Http/Controllers/Api/CityPageController.php @@ -0,0 +1,36 @@ +whereBelongsTo($country) + ->where("id", $city->id) + ->with("cityProviders", "country") + ->firstOrFail(); + + $providers = Provider::all(); + + $cityOpinions = $selectedCity->cityOpinions()->with(["user"])->orderByDesc("updated_at")->paginate("4")->withQueryString(); + + return response()->json([ + "city" => new CityResource($selectedCity), + "providers" => ProviderResource::collection($providers), + "cityOpinions" => CityOpinionResource::collection($cityOpinions), + ]); + } +} diff --git a/app/Http/Controllers/Api/CityProviderController.php b/app/Http/Controllers/Api/CityProviderController.php new file mode 100644 index 00000000..d4990c6a --- /dev/null +++ b/app/Http/Controllers/Api/CityProviderController.php @@ -0,0 +1,65 @@ +has("cityProviders") + ->whereHas("cityProviders", fn($query): Builder => $query->whereNotNull("latitude")->whereNotNull("longitude")) + ->get() + ->sortBy("name") + ->sortByDesc(fn(City $city): int => $city->cityProviders->count()), + ); + + $providers = ProviderResource::collection(Provider::all()->sortBy("name")); + $countries = Country::whereHas("cities.cityProviders") + ->with(["cities.cityAlternativeNames", "cities.cityProviders"]) + ->get() + ->sortBy("name"); + + $countries = CountryResource::collection($countries); + + return response()->json([ + "cities" => $cities, + "providers" => $providers, + "countries" => $countries, + ]); + } + + public function update(CityProviderService $service, CityProviderRequest $request, City $city): JsonResponse + { + $service->updateProvider($request->providerNames, $city); + + return response()->json([ + "message" => __("City providers updated successfully."), + ]); + } + + public function runImporters(DataImporterService $service): JsonResponse + { + $service->run(); + + return response()->json([ + "message" => __("Importers started."), + ]); + } +} diff --git a/app/Http/Controllers/Api/CityWithoutAssignedCountryController.php b/app/Http/Controllers/Api/CityWithoutAssignedCountryController.php new file mode 100644 index 00000000..a3068ecd --- /dev/null +++ b/app/Http/Controllers/Api/CityWithoutAssignedCountryController.php @@ -0,0 +1,30 @@ +delete(); + + return response()->json([ + "message" => __("City removed successfully!"), + ]); + } + + public function destroyAll(): JsonResponse + { + CityWithoutAssignedCountry::query()->delete(); + + return response()->json([ + "message" => __("All cities removed successfully!"), + ]); + } +} diff --git a/app/Http/Controllers/Api/Controller.php b/app/Http/Controllers/Api/Controller.php new file mode 100644 index 00000000..5029ee9f --- /dev/null +++ b/app/Http/Controllers/Api/Controller.php @@ -0,0 +1,15 @@ +get(); + $citiesWithProvidersCount = $citiesWithProviders->count(); + + $citiesWithProvidersIds = $citiesWithProviders->pluck("city_id"); + $countriesWithCitiesWithProvidersIds = City::whereIn("id", $citiesWithProvidersIds)->distinct()->pluck("country_id"); + $countriesWithCitiesWithProvidersCount = Country::whereIn("id", $countriesWithCitiesWithProvidersIds)->count(); + + $providersCount = Provider::count(); + + $providerCitiesCount = $citiesWithProviders + ->pluck("provider_name") + ->countBy() + ->map(function (int $count, string $name): array { + return [ + "name" => $name, + "count" => $count, + ]; + }) + ->sortByDesc("count") + ->values() + ->all(); + + $providers = ProviderResource::collection(Provider::all()); + + return response()->json([ + "usersCount" => $usersCount, + "citiesWithProvidersCount" => $citiesWithProvidersCount, + "countriesWithCitiesWithProvidersCount" => $countriesWithCitiesWithProvidersCount, + "providersCount" => $providersCount, + "providerCitiesCount" => $providerCitiesCount, + "providers" => $providers, + ]); + } +} diff --git a/app/Http/Controllers/Api/FavoritesController.php b/app/Http/Controllers/Api/FavoritesController.php new file mode 100644 index 00000000..38b49116 --- /dev/null +++ b/app/Http/Controllers/Api/FavoritesController.php @@ -0,0 +1,63 @@ +user(); + + $favoriteCities = $user->favorites()->with(["city.country", "city.cityProviders"])->get(); + + $cities = $favoriteCities->map(fn($favorite) => CityResource::make($favorite->city)); + + $providers = Provider::all(); + + return response()->json([ + "cities" => $cities, + "providers" => ProviderResource::collection($providers), + ]); + } + + public function store(Request $request): JsonResponse + { + $cityId = $request->input("city_id"); + $userId = $request->user()?->id; + + $favorite = Favorites::firstOrCreate([ + "user_id" => $userId, + "city_id" => $cityId, + ]); + + if ($favorite->wasRecentlyCreated) { + return response()->json([ + "message" => "City added to favorites.", + ]); + } + $favorite->delete(); + + return response()->json([ + "message" => "City removed from favorites.", + ]); + } + + public function check(Request $request, int $cityId): bool + { + $userId = $request->user()->id; + + return Favorites::where("user_id", $userId) + ->where("city_id", $cityId) + ->exists(); + } +} diff --git a/app/Http/Controllers/FavoritesController.php b/app/Http/Controllers/FavoritesController.php index e3aa021d..8314b4ad 100644 --- a/app/Http/Controllers/FavoritesController.php +++ b/app/Http/Controllers/FavoritesController.php @@ -20,7 +20,10 @@ public function index(): Response { $user = Auth::user(); - $favoriteCities = $user->favorites()->with(["city.country", "city.cityProviders"])->get(); + $favoriteCities = $user + ->favorites() + ->with(["city.country", "city.cityProviders"]) + ->get(); $cities = $favoriteCities->map(fn($favorite) => CityResource::make($favorite->city)); @@ -37,9 +40,10 @@ public function store(Request $request, Session $session): void $cityId = $request->input("city_id"); $userId = $request->user()?->id; - $favorite = Favorites::firstOrCreate( - ["user_id" => $userId, "city_id" => $cityId], - ); + $favorite = Favorites::firstOrCreate([ + "user_id" => $userId, + "city_id" => $cityId, + ]); if ($favorite->wasRecentlyCreated) { $session->flash("message", "City added to favorites."); diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index f1e055a7..27b96873 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -29,6 +29,9 @@ use Illuminate\Session\Middleware\AuthenticateSession; use Illuminate\Session\Middleware\StartSession; use Illuminate\View\Middleware\ShareErrorsFromSession; +use Laravel\Sanctum\Http\Middleware\CheckAbilities; +use Laravel\Sanctum\Http\Middleware\CheckForAnyAbility; +use Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful; use Spatie\Permission\Middleware\RoleMiddleware; class Kernel extends HttpKernel @@ -69,6 +72,7 @@ class Kernel extends HttpKernel "api" => [ ThrottleRequests::class . ":api", SubstituteBindings::class, + EnsureFrontendRequestsAreStateful::class, ], ]; @@ -91,5 +95,7 @@ class Kernel extends HttpKernel "throttle" => ThrottleRequests::class, "verified" => EnsureEmailIsVerified::class, "role" => RoleMiddleware::class, + "ability" => CheckAbilities::class, + "any-ability" => CheckForAnyAbility::class, ]; } diff --git a/app/Http/Requests/ProviderRequest.php b/app/Http/Requests/ProviderRequest.php new file mode 100644 index 00000000..9c9855a5 --- /dev/null +++ b/app/Http/Requests/ProviderRequest.php @@ -0,0 +1,35 @@ + ["required", "string", "regex:/^[A-Z\s]/", "max:100", $this->uniqueRuleForProvider("name")], + "color" => ["required", "string", "size:7"], + "file" => [ + "required", + "mimes:png", + File::image() + ->max(config("app.provider_logo_size")) + ->dimensions(Rule::dimensions()->width(config("app.provider_logo_width"))->height(config("app.provider_logo_height"))), + ], + ]; + } + + protected function uniqueRuleForProvider(string $column): Unique + { + $currentProviderId = $this->route(param: "provider"); + + return Rule::unique(table: "providers", column: $column)->ignore($currentProviderId); + } +} diff --git a/app/Importers/BinBinDataImporter.php b/app/Importers/BinBinDataImporter.php index 7c9b2803..85c6d5f5 100644 --- a/app/Importers/BinBinDataImporter.php +++ b/app/Importers/BinBinDataImporter.php @@ -65,7 +65,6 @@ public function transform(): void $existingCityProviders[] = $provider; } } - $this->deleteMissingProviders(self::getProviderName(), $existingCityProviders); } } diff --git a/app/Models/Provider.php b/app/Models/Provider.php index cf5841b6..85011719 100644 --- a/app/Models/Provider.php +++ b/app/Models/Provider.php @@ -4,6 +4,8 @@ namespace App\Models; +use App\QueryBuilders\SortQuery; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Model; /** @@ -16,9 +18,19 @@ class Provider extends Model public $incrementing = false; protected $primaryKey = "name"; protected $keyType = "string"; + protected $fillable = [ + "name", + "url", + "color", + ]; - public function cityProvider() + public static function query(): Builder { - return $this->belongsTo(CityProvider::class); + return parent::query(); + } + + public function newEloquentBuilder($query): SortQuery + { + return new SortQuery($query); } } diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index fffe88be..2d9544a4 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -6,6 +6,8 @@ use Illuminate\Http\Resources\Json\JsonResource; use Illuminate\Support\ServiceProvider; +use Laravel\Sanctum\PersonalAccessToken; +use Laravel\Sanctum\Sanctum; class AppServiceProvider extends ServiceProvider { @@ -26,5 +28,6 @@ public function register(): void public function boot(): void { JsonResource::withoutWrapping(); + Sanctum::usePersonalAccessTokenModel(PersonalAccessToken::class); } } diff --git a/composer.json b/composer.json index ffeda934..d80b50b7 100644 --- a/composer.json +++ b/composer.json @@ -9,6 +9,7 @@ "ext-dom": "*", "ext-pdo": "*", "guzzlehttp/guzzle": "^7.8", + "inertiajs/inertia-laravel": "^0.6.9", "laravel/framework": "^10.13.0", "laravel/sanctum": "^3.2.5", diff --git a/composer.lock b/composer.lock index f33ad918..1e0af277 100644 --- a/composer.lock +++ b/composer.lock @@ -5,6 +5,7 @@ "This file is @generated automatically" ], "content-hash": "f81ee215369d6106663203f64d141543", + "packages": [ { "name": "brick/math", @@ -132,23 +133,23 @@ }, { "name": "clue/stream-filter", - "version": "v1.6.0", + "version": "v1.7.0", "source": { "type": "git", "url": "https://github.com/clue/stream-filter.git", - "reference": "d6169430c7731d8509da7aecd0af756a5747b78e" + "reference": "049509fef80032cb3f051595029ab75b49a3c2f7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/clue/stream-filter/zipball/d6169430c7731d8509da7aecd0af756a5747b78e", - "reference": "d6169430c7731d8509da7aecd0af756a5747b78e", + "url": "https://api.github.com/repos/clue/stream-filter/zipball/049509fef80032cb3f051595029ab75b49a3c2f7", + "reference": "049509fef80032cb3f051595029ab75b49a3c2f7", "shasum": "" }, "require": { "php": ">=5.3" }, "require-dev": { - "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.36" + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" }, "type": "library", "autoload": { @@ -170,7 +171,7 @@ } ], "description": "A simple and modern approach to stream filtering in PHP", - "homepage": "https://github.com/clue/php-stream-filter", + "homepage": "https://github.com/clue/stream-filter", "keywords": [ "bucket brigade", "callback", @@ -182,7 +183,7 @@ ], "support": { "issues": "https://github.com/clue/stream-filter/issues", - "source": "https://github.com/clue/stream-filter/tree/v1.6.0" + "source": "https://github.com/clue/stream-filter/tree/v1.7.0" }, "funding": [ { @@ -194,7 +195,81 @@ "type": "github" } ], - "time": "2022-02-21T13:15:14+00:00" + "time": "2023-12-20T15:40:13+00:00" + }, + { + "name": "dedoc/scramble", + "version": "v0.9.0", + "source": { + "type": "git", + "url": "https://github.com/dedoc/scramble.git", + "reference": "6280da6809eecaa03243d726b957cc174b1ccb70" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dedoc/scramble/zipball/6280da6809eecaa03243d726b957cc174b1ccb70", + "reference": "6280da6809eecaa03243d726b957cc174b1ccb70", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^10.0|^11.0", + "nikic/php-parser": "^5.0", + "php": "^8.1", + "phpstan/phpdoc-parser": "^1.0", + "spatie/laravel-package-tools": "^1.9.2" + }, + "require-dev": { + "laravel/pint": "^v1.1.0", + "nunomaduro/collision": "^7.0|^8.0", + "orchestra/testbench": "^8.0|^9.0", + "pestphp/pest": "^2.34", + "pestphp/pest-plugin-laravel": "^2.3", + "phpunit/phpunit": "^10.5", + "spatie/pest-plugin-snapshots": "^2.1" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Dedoc\\Scramble\\ScrambleServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Dedoc\\Scramble\\": "src", + "Dedoc\\Scramble\\Database\\Factories\\": "database/factories" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Lytvynenko", + "email": "litvinenko95@gmail.com", + "role": "Developer" + } + ], + "description": "Automatic generation of API documentation for Laravel applications.", + "homepage": "https://github.com/dedoc/scramble", + "keywords": [ + "documentation", + "laravel", + "openapi" + ], + "support": { + "issues": "https://github.com/dedoc/scramble/issues", + "source": "https://github.com/dedoc/scramble/tree/v0.9.0" + }, + "funding": [ + { + "url": "https://github.com/romalytvynenko", + "type": "github" + } + ], + "time": "2024-03-11T19:27:28+00:00" }, { "name": "dflydev/dot-access-data", @@ -273,16 +348,16 @@ }, { "name": "doctrine/inflector", - "version": "2.0.8", + "version": "2.0.9", "source": { "type": "git", "url": "https://github.com/doctrine/inflector.git", - "reference": "f9301a5b2fb1216b2b08f02ba04dc45423db6bff" + "reference": "2930cd5ef353871c821d5c43ed030d39ac8cfe65" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/inflector/zipball/f9301a5b2fb1216b2b08f02ba04dc45423db6bff", - "reference": "f9301a5b2fb1216b2b08f02ba04dc45423db6bff", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/2930cd5ef353871c821d5c43ed030d39ac8cfe65", + "reference": "2930cd5ef353871c821d5c43ed030d39ac8cfe65", "shasum": "" }, "require": { @@ -344,7 +419,7 @@ ], "support": { "issues": "https://github.com/doctrine/inflector/issues", - "source": "https://github.com/doctrine/inflector/tree/2.0.8" + "source": "https://github.com/doctrine/inflector/tree/2.0.9" }, "funding": [ { @@ -360,7 +435,7 @@ "type": "tidelift" } ], - "time": "2023-06-16T13:40:37+00:00" + "time": "2024-01-15T18:05:13+00:00" }, { "name": "doctrine/lexer", @@ -1302,20 +1377,20 @@ }, { "name": "laravel/framework", - "version": "v10.39.0", + "version": "v10.43.0", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "114926b07bfb5fbf2545c03aa2ce5c8c37be650c" + "reference": "4f7802dfc9993cb57cf69615491ce1a7eb2e9529" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/114926b07bfb5fbf2545c03aa2ce5c8c37be650c", - "reference": "114926b07bfb5fbf2545c03aa2ce5c8c37be650c", + "url": "https://api.github.com/repos/laravel/framework/zipball/4f7802dfc9993cb57cf69615491ce1a7eb2e9529", + "reference": "4f7802dfc9993cb57cf69615491ce1a7eb2e9529", "shasum": "" }, "require": { - "brick/math": "^0.9.3|^0.10.2|^0.11", + "brick/math": "^0.9.3|^0.10.2|^0.11|^0.12", "composer-runtime-api": "^2.2", "doctrine/inflector": "^2.0.5", "dragonmantank/cron-expression": "^3.3.2", @@ -1503,20 +1578,20 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2023-12-27T14:26:28+00:00" + "time": "2024-01-30T16:25:02+00:00" }, { "name": "laravel/prompts", - "version": "v0.1.14", + "version": "v0.1.15", "source": { "type": "git", "url": "https://github.com/laravel/prompts.git", - "reference": "2219fa9c4b944add1e825c3bdb8ecae8bc503bc6" + "reference": "d814a27514d99b03c85aa42b22cfd946568636c1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/prompts/zipball/2219fa9c4b944add1e825c3bdb8ecae8bc503bc6", - "reference": "2219fa9c4b944add1e825c3bdb8ecae8bc503bc6", + "url": "https://api.github.com/repos/laravel/prompts/zipball/d814a27514d99b03c85aa42b22cfd946568636c1", + "reference": "d814a27514d99b03c85aa42b22cfd946568636c1", "shasum": "" }, "require": { @@ -1558,22 +1633,22 @@ ], "support": { "issues": "https://github.com/laravel/prompts/issues", - "source": "https://github.com/laravel/prompts/tree/v0.1.14" + "source": "https://github.com/laravel/prompts/tree/v0.1.15" }, - "time": "2023-12-27T04:18:09+00:00" + "time": "2023-12-29T22:37:42+00:00" }, { "name": "laravel/sanctum", - "version": "v3.3.2", + "version": "v3.3.3", "source": { "type": "git", "url": "https://github.com/laravel/sanctum.git", - "reference": "e1a272893bec13cf135627f7e156030b3afe1e60" + "reference": "8c104366459739f3ada0e994bcd3e6fd681ce3d5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/sanctum/zipball/e1a272893bec13cf135627f7e156030b3afe1e60", - "reference": "e1a272893bec13cf135627f7e156030b3afe1e60", + "url": "https://api.github.com/repos/laravel/sanctum/zipball/8c104366459739f3ada0e994bcd3e6fd681ce3d5", + "reference": "8c104366459739f3ada0e994bcd3e6fd681ce3d5", "shasum": "" }, "require": { @@ -1626,7 +1701,7 @@ "issues": "https://github.com/laravel/sanctum/issues", "source": "https://github.com/laravel/sanctum" }, - "time": "2023-11-03T13:42:14+00:00" + "time": "2023-12-19T18:44:48+00:00" }, { "name": "laravel/serializable-closure", @@ -1760,25 +1835,25 @@ }, { "name": "laravel/tinker", - "version": "v2.8.2", + "version": "v2.9.0", "source": { "type": "git", "url": "https://github.com/laravel/tinker.git", - "reference": "b936d415b252b499e8c3b1f795cd4fc20f57e1f3" + "reference": "502e0fe3f0415d06d5db1f83a472f0f3b754bafe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/tinker/zipball/b936d415b252b499e8c3b1f795cd4fc20f57e1f3", - "reference": "b936d415b252b499e8c3b1f795cd4fc20f57e1f3", + "url": "https://api.github.com/repos/laravel/tinker/zipball/502e0fe3f0415d06d5db1f83a472f0f3b754bafe", + "reference": "502e0fe3f0415d06d5db1f83a472f0f3b754bafe", "shasum": "" }, "require": { - "illuminate/console": "^6.0|^7.0|^8.0|^9.0|^10.0", - "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0|^10.0", - "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0", + "illuminate/console": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", + "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", + "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", "php": "^7.2.5|^8.0", - "psy/psysh": "^0.10.4|^0.11.1", - "symfony/var-dumper": "^4.3.4|^5.0|^6.0" + "psy/psysh": "^0.11.1|^0.12.0", + "symfony/var-dumper": "^4.3.4|^5.0|^6.0|^7.0" }, "require-dev": { "mockery/mockery": "~1.3.3|^1.4.2", @@ -1786,13 +1861,10 @@ "phpunit/phpunit": "^8.5.8|^9.3.3" }, "suggest": { - "illuminate/database": "The Illuminate Database package (^6.0|^7.0|^8.0|^9.0|^10.0)." + "illuminate/database": "The Illuminate Database package (^6.0|^7.0|^8.0|^9.0|^10.0|^11.0)." }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "2.x-dev" - }, "laravel": { "providers": [ "Laravel\\Tinker\\TinkerServiceProvider" @@ -1823,9 +1895,9 @@ ], "support": { "issues": "https://github.com/laravel/tinker/issues", - "source": "https://github.com/laravel/tinker/tree/v2.8.2" + "source": "https://github.com/laravel/tinker/tree/v2.9.0" }, - "time": "2023-08-15T14:27:00+00:00" + "time": "2024-01-04T16:10:04+00:00" }, { "name": "league/commonmark", @@ -2017,16 +2089,16 @@ }, { "name": "league/flysystem", - "version": "3.23.0", + "version": "3.23.1", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", - "reference": "d4ad81e2b67396e33dc9d7e54ec74ccf73151dcc" + "reference": "199e1aebbe3e62bd39f4d4fc8c61ce0b3786197e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/d4ad81e2b67396e33dc9d7e54ec74ccf73151dcc", - "reference": "d4ad81e2b67396e33dc9d7e54ec74ccf73151dcc", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/199e1aebbe3e62bd39f4d4fc8c61ce0b3786197e", + "reference": "199e1aebbe3e62bd39f4d4fc8c61ce0b3786197e", "shasum": "" }, "require": { @@ -2091,7 +2163,7 @@ ], "support": { "issues": "https://github.com/thephpleague/flysystem/issues", - "source": "https://github.com/thephpleague/flysystem/tree/3.23.0" + "source": "https://github.com/thephpleague/flysystem/tree/3.23.1" }, "funding": [ { @@ -2103,20 +2175,20 @@ "type": "github" } ], - "time": "2023-12-04T10:16:17+00:00" + "time": "2024-01-26T18:42:03+00:00" }, { "name": "league/flysystem-local", - "version": "3.23.0", + "version": "3.23.1", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem-local.git", - "reference": "5cf046ba5f059460e86a997c504dd781a39a109b" + "reference": "b884d2bf9b53bb4804a56d2df4902bb51e253f00" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/5cf046ba5f059460e86a997c504dd781a39a109b", - "reference": "5cf046ba5f059460e86a997c504dd781a39a109b", + "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/b884d2bf9b53bb4804a56d2df4902bb51e253f00", + "reference": "b884d2bf9b53bb4804a56d2df4902bb51e253f00", "shasum": "" }, "require": { @@ -2151,7 +2223,7 @@ ], "support": { "issues": "https://github.com/thephpleague/flysystem-local/issues", - "source": "https://github.com/thephpleague/flysystem-local/tree/3.23.0" + "source": "https://github.com/thephpleague/flysystem-local/tree/3.23.1" }, "funding": [ { @@ -2163,20 +2235,20 @@ "type": "github" } ], - "time": "2023-12-04T10:14:46+00:00" + "time": "2024-01-26T18:25:23+00:00" }, { "name": "league/mime-type-detection", - "version": "1.14.0", + "version": "1.15.0", "source": { "type": "git", "url": "https://github.com/thephpleague/mime-type-detection.git", - "reference": "b6a5854368533df0295c5761a0253656a2e52d9e" + "reference": "ce0f4d1e8a6f4eb0ddff33f57c69c50fd09f4301" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/b6a5854368533df0295c5761a0253656a2e52d9e", - "reference": "b6a5854368533df0295c5761a0253656a2e52d9e", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/ce0f4d1e8a6f4eb0ddff33f57c69c50fd09f4301", + "reference": "ce0f4d1e8a6f4eb0ddff33f57c69c50fd09f4301", "shasum": "" }, "require": { @@ -2207,7 +2279,7 @@ "description": "Mime-type detection for Flysystem", "support": { "issues": "https://github.com/thephpleague/mime-type-detection/issues", - "source": "https://github.com/thephpleague/mime-type-detection/tree/1.14.0" + "source": "https://github.com/thephpleague/mime-type-detection/tree/1.15.0" }, "funding": [ { @@ -2219,7 +2291,7 @@ "type": "tidelift" } ], - "time": "2023-10-17T14:13:20+00:00" + "time": "2024-01-28T23:22:08+00:00" }, { "name": "league/oauth1-client", @@ -2467,16 +2539,16 @@ }, { "name": "nesbot/carbon", - "version": "2.72.1", + "version": "2.72.3", "source": { "type": "git", "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "2b3b3db0a2d0556a177392ff1a3bf5608fa09f78" + "reference": "0c6fd108360c562f6e4fd1dedb8233b423e91c83" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/2b3b3db0a2d0556a177392ff1a3bf5608fa09f78", - "reference": "2b3b3db0a2d0556a177392ff1a3bf5608fa09f78", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/0c6fd108360c562f6e4fd1dedb8233b423e91c83", + "reference": "0c6fd108360c562f6e4fd1dedb8233b423e91c83", "shasum": "" }, "require": { @@ -2570,35 +2642,35 @@ "type": "tidelift" } ], - "time": "2023-12-08T23:47:49+00:00" + "time": "2024-01-25T10:35:09+00:00" }, { "name": "nette/schema", - "version": "v1.2.5", + "version": "v1.3.0", "source": { "type": "git", "url": "https://github.com/nette/schema.git", - "reference": "0462f0166e823aad657c9224d0f849ecac1ba10a" + "reference": "a6d3a6d1f545f01ef38e60f375d1cf1f4de98188" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/schema/zipball/0462f0166e823aad657c9224d0f849ecac1ba10a", - "reference": "0462f0166e823aad657c9224d0f849ecac1ba10a", + "url": "https://api.github.com/repos/nette/schema/zipball/a6d3a6d1f545f01ef38e60f375d1cf1f4de98188", + "reference": "a6d3a6d1f545f01ef38e60f375d1cf1f4de98188", "shasum": "" }, "require": { - "nette/utils": "^2.5.7 || ^3.1.5 || ^4.0", - "php": "7.1 - 8.3" + "nette/utils": "^4.0", + "php": "8.1 - 8.3" }, "require-dev": { - "nette/tester": "^2.3 || ^2.4", + "nette/tester": "^2.4", "phpstan/phpstan-nette": "^1.0", - "tracy/tracy": "^2.7" + "tracy/tracy": "^2.8" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.2-dev" + "dev-master": "1.3-dev" } }, "autoload": { @@ -2630,22 +2702,22 @@ ], "support": { "issues": "https://github.com/nette/schema/issues", - "source": "https://github.com/nette/schema/tree/v1.2.5" + "source": "https://github.com/nette/schema/tree/v1.3.0" }, - "time": "2023-10-05T20:37:59+00:00" + "time": "2023-12-11T11:54:22+00:00" }, { "name": "nette/utils", - "version": "v4.0.3", + "version": "v4.0.4", "source": { "type": "git", "url": "https://github.com/nette/utils.git", - "reference": "a9d127dd6a203ce6d255b2e2db49759f7506e015" + "reference": "d3ad0aa3b9f934602cb3e3902ebccf10be34d218" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/utils/zipball/a9d127dd6a203ce6d255b2e2db49759f7506e015", - "reference": "a9d127dd6a203ce6d255b2e2db49759f7506e015", + "url": "https://api.github.com/repos/nette/utils/zipball/d3ad0aa3b9f934602cb3e3902ebccf10be34d218", + "reference": "d3ad0aa3b9f934602cb3e3902ebccf10be34d218", "shasum": "" }, "require": { @@ -2716,31 +2788,33 @@ ], "support": { "issues": "https://github.com/nette/utils/issues", - "source": "https://github.com/nette/utils/tree/v4.0.3" + "source": "https://github.com/nette/utils/tree/v4.0.4" }, - "time": "2023-10-29T21:02:13+00:00" + "time": "2024-01-17T16:50:36+00:00" }, { "name": "nikic/php-parser", - "version": "v4.18.0", + "version": "v5.0.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999" + "reference": "4a21235f7e56e713259a6f76bf4b5ea08502b9dc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/1bcbb2179f97633e98bbbc87044ee2611c7d7999", - "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/4a21235f7e56e713259a6f76bf4b5ea08502b9dc", + "reference": "4a21235f7e56e713259a6f76bf4b5ea08502b9dc", "shasum": "" }, "require": { + "ext-ctype": "*", + "ext-json": "*", "ext-tokenizer": "*", - "php": ">=7.0" + "php": ">=7.4" }, "require-dev": { "ircmaxell/php-yacc": "^0.0.7", - "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" }, "bin": [ "bin/php-parse" @@ -2748,7 +2822,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.9-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -2772,9 +2846,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.18.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.0.0" }, - "time": "2023-12-10T21:03:43+00:00" + "time": "2024-01-07T17:17:35+00:00" }, { "name": "nunomaduro/termwind", @@ -3418,16 +3492,16 @@ }, { "name": "php-http/promise", - "version": "1.2.1", + "version": "1.3.0", "source": { "type": "git", "url": "https://github.com/php-http/promise.git", - "reference": "44a67cb59f708f826f3bec35f22030b3edb90119" + "reference": "2916a606d3b390f4e9e8e2b8dd68581508be0f07" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/promise/zipball/44a67cb59f708f826f3bec35f22030b3edb90119", - "reference": "44a67cb59f708f826f3bec35f22030b3edb90119", + "url": "https://api.github.com/repos/php-http/promise/zipball/2916a606d3b390f4e9e8e2b8dd68581508be0f07", + "reference": "2916a606d3b390f4e9e8e2b8dd68581508be0f07", "shasum": "" }, "require": { @@ -3464,9 +3538,9 @@ ], "support": { "issues": "https://github.com/php-http/promise/issues", - "source": "https://github.com/php-http/promise/tree/1.2.1" + "source": "https://github.com/php-http/promise/tree/1.3.0" }, - "time": "2023-11-08T12:57:08+00:00" + "time": "2024-01-04T18:49:48+00:00" }, { "name": "phpoption/phpoption", @@ -3543,6 +3617,53 @@ ], "time": "2023-11-12T21:59:55+00:00" }, + { + "name": "phpstan/phpdoc-parser", + "version": "1.27.0", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpdoc-parser.git", + "reference": "86e4d5a4b036f8f0be1464522f4c6b584c452757" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/86e4d5a4b036f8f0be1464522f4c6b584c452757", + "reference": "86e4d5a4b036f8f0be1464522f4c6b584c452757", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/annotations": "^2.0", + "nikic/php-parser": "^4.15", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^1.5", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-strict-rules": "^1.0", + "phpunit/phpunit": "^9.5", + "symfony/process": "^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "PHPStan\\PhpDocParser\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPDoc parser with support for nullable, intersection and generic types", + "support": { + "issues": "https://github.com/phpstan/phpdoc-parser/issues", + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.27.0" + }, + "time": "2024-03-21T13:14:53+00:00" + }, { "name": "psr/clock", "version": "1.0.0", @@ -3957,25 +4078,25 @@ }, { "name": "psy/psysh", - "version": "v0.11.22", + "version": "v0.12.0", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "128fa1b608be651999ed9789c95e6e2a31b5802b" + "reference": "750bf031a48fd07c673dbe3f11f72362ea306d0d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/128fa1b608be651999ed9789c95e6e2a31b5802b", - "reference": "128fa1b608be651999ed9789c95e6e2a31b5802b", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/750bf031a48fd07c673dbe3f11f72362ea306d0d", + "reference": "750bf031a48fd07c673dbe3f11f72362ea306d0d", "shasum": "" }, "require": { "ext-json": "*", "ext-tokenizer": "*", - "nikic/php-parser": "^4.0 || ^3.1", - "php": "^8.0 || ^7.0.8", - "symfony/console": "^6.0 || ^5.0 || ^4.0 || ^3.4", - "symfony/var-dumper": "^6.0 || ^5.0 || ^4.0 || ^3.4" + "nikic/php-parser": "^5.0 || ^4.0", + "php": "^8.0 || ^7.4", + "symfony/console": "^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4", + "symfony/var-dumper": "^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4" }, "conflict": { "symfony/console": "4.4.37 || 5.3.14 || 5.3.15 || 5.4.3 || 5.4.4 || 6.0.3 || 6.0.4" @@ -3986,8 +4107,7 @@ "suggest": { "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)", "ext-pdo-sqlite": "The doc command requires SQLite to work.", - "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well.", - "ext-readline": "Enables support for arrow-key history navigation, and showing and manipulating command history." + "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well." }, "bin": [ "bin/psysh" @@ -3995,7 +4115,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-0.11": "0.11.x-dev" + "dev-main": "0.12.x-dev" }, "bamarni-bin": { "bin-links": false, @@ -4031,9 +4151,9 @@ ], "support": { "issues": "https://github.com/bobthecow/psysh/issues", - "source": "https://github.com/bobthecow/psysh/tree/v0.11.22" + "source": "https://github.com/bobthecow/psysh/tree/v0.12.0" }, - "time": "2023-10-14T21:56:36+00:00" + "time": "2023-12-20T15:28:09+00:00" }, { "name": "ralouphie/getallheaders", @@ -4509,6 +4629,66 @@ ], "time": "2023-10-12T14:38:46+00:00" }, + { + "name": "spatie/laravel-package-tools", + "version": "1.16.4", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-package-tools.git", + "reference": "ddf678e78d7f8b17e5cdd99c0c3413a4a6592e53" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/ddf678e78d7f8b17e5cdd99c0c3413a4a6592e53", + "reference": "ddf678e78d7f8b17e5cdd99c0c3413a4a6592e53", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^9.28|^10.0|^11.0", + "php": "^8.0" + }, + "require-dev": { + "mockery/mockery": "^1.5", + "orchestra/testbench": "^7.7|^8.0", + "pestphp/pest": "^1.22", + "phpunit/phpunit": "^9.5.24", + "spatie/pest-plugin-test-time": "^1.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\LaravelPackageTools\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "role": "Developer" + } + ], + "description": "Tools for creating Laravel packages", + "homepage": "https://github.com/spatie/laravel-package-tools", + "keywords": [ + "laravel-package-tools", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/laravel-package-tools/issues", + "source": "https://github.com/spatie/laravel-package-tools/tree/1.16.4" + }, + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2024-03-20T07:29:11+00:00" + }, { "name": "spatie/laravel-permission", "version": "6.3.0", @@ -4593,16 +4773,16 @@ }, { "name": "stichoza/google-translate-php", - "version": "v5.1.2", + "version": "v5.1.3", "source": { "type": "git", "url": "https://github.com/Stichoza/google-translate-php.git", - "reference": "e43089e0c6fcc366027e8bf593060bb4e9c2c839" + "reference": "0d3de083a4b286868c4456cc76448a439a5aae07" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Stichoza/google-translate-php/zipball/e43089e0c6fcc366027e8bf593060bb4e9c2c839", - "reference": "e43089e0c6fcc366027e8bf593060bb4e9c2c839", + "url": "https://api.github.com/repos/Stichoza/google-translate-php/zipball/0d3de083a4b286868c4456cc76448a439a5aae07", + "reference": "0d3de083a4b286868c4456cc76448a439a5aae07", "shasum": "" }, "require": { @@ -4641,7 +4821,7 @@ ], "support": { "issues": "https://github.com/Stichoza/google-translate-php/issues", - "source": "https://github.com/Stichoza/google-translate-php/tree/v5.1.2" + "source": "https://github.com/Stichoza/google-translate-php/tree/v5.1.3" }, "funding": [ { @@ -4669,20 +4849,20 @@ "type": "patreon" } ], - "time": "2023-08-04T01:11:03+00:00" + "time": "2023-12-18T21:40:16+00:00" }, { "name": "symfony/console", - "version": "v6.4.2", + "version": "v6.4.3", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "0254811a143e6bc6c8deea08b589a7e68a37f625" + "reference": "2aaf83b4de5b9d43b93e4aec6f2f8b676f7c567e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/0254811a143e6bc6c8deea08b589a7e68a37f625", - "reference": "0254811a143e6bc6c8deea08b589a7e68a37f625", + "url": "https://api.github.com/repos/symfony/console/zipball/2aaf83b4de5b9d43b93e4aec6f2f8b676f7c567e", + "reference": "2aaf83b4de5b9d43b93e4aec6f2f8b676f7c567e", "shasum": "" }, "require": { @@ -4747,7 +4927,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.4.2" + "source": "https://github.com/symfony/console/tree/v6.4.3" }, "funding": [ { @@ -4763,20 +4943,20 @@ "type": "tidelift" } ], - "time": "2023-12-10T16:15:48+00:00" + "time": "2024-01-23T14:51:35+00:00" }, { "name": "symfony/css-selector", - "version": "v7.0.0", + "version": "v7.0.3", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "bb51d46e53ef8d50d523f0c5faedba056a27943e" + "reference": "ec60a4edf94e63b0556b6a0888548bb400a3a3be" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/bb51d46e53ef8d50d523f0c5faedba056a27943e", - "reference": "bb51d46e53ef8d50d523f0c5faedba056a27943e", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/ec60a4edf94e63b0556b6a0888548bb400a3a3be", + "reference": "ec60a4edf94e63b0556b6a0888548bb400a3a3be", "shasum": "" }, "require": { @@ -4812,7 +4992,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v7.0.0" + "source": "https://github.com/symfony/css-selector/tree/v7.0.3" }, "funding": [ { @@ -4828,7 +5008,7 @@ "type": "tidelift" } ], - "time": "2023-10-31T17:59:56+00:00" + "time": "2024-01-23T15:02:46+00:00" }, { "name": "symfony/deprecation-contracts", @@ -4899,16 +5079,16 @@ }, { "name": "symfony/dom-crawler", - "version": "v6.4.0", + "version": "v6.4.3", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "14ff4fd2a5c8969d6158dbe7ef5b17d6a9c6ba33" + "reference": "6db31849011fefe091e94d0bb10cba26f7919894" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/14ff4fd2a5c8969d6158dbe7ef5b17d6a9c6ba33", - "reference": "14ff4fd2a5c8969d6158dbe7ef5b17d6a9c6ba33", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/6db31849011fefe091e94d0bb10cba26f7919894", + "reference": "6db31849011fefe091e94d0bb10cba26f7919894", "shasum": "" }, "require": { @@ -4946,7 +5126,7 @@ "description": "Eases DOM navigation for HTML and XML documents", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dom-crawler/tree/v6.4.0" + "source": "https://github.com/symfony/dom-crawler/tree/v6.4.3" }, "funding": [ { @@ -4962,20 +5142,20 @@ "type": "tidelift" } ], - "time": "2023-11-20T16:41:16+00:00" + "time": "2024-01-23T14:51:35+00:00" }, { "name": "symfony/error-handler", - "version": "v6.4.0", + "version": "v6.4.3", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "c873490a1c97b3a0a4838afc36ff36c112d02788" + "reference": "6dc3c76a278b77f01d864a6005d640822c6f26a6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/c873490a1c97b3a0a4838afc36ff36c112d02788", - "reference": "c873490a1c97b3a0a4838afc36ff36c112d02788", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/6dc3c76a278b77f01d864a6005d640822c6f26a6", + "reference": "6dc3c76a278b77f01d864a6005d640822c6f26a6", "shasum": "" }, "require": { @@ -5021,7 +5201,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.0" + "source": "https://github.com/symfony/error-handler/tree/v6.4.3" }, "funding": [ { @@ -5037,20 +5217,20 @@ "type": "tidelift" } ], - "time": "2023-10-18T09:43:34+00:00" + "time": "2024-01-29T15:40:36+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v7.0.2", + "version": "v7.0.3", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "098b62ae81fdd6cbf941f355059f617db28f4f9a" + "reference": "834c28d533dd0636f910909d01b9ff45cc094b5e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/098b62ae81fdd6cbf941f355059f617db28f4f9a", - "reference": "098b62ae81fdd6cbf941f355059f617db28f4f9a", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/834c28d533dd0636f910909d01b9ff45cc094b5e", + "reference": "834c28d533dd0636f910909d01b9ff45cc094b5e", "shasum": "" }, "require": { @@ -5101,7 +5281,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v7.0.2" + "source": "https://github.com/symfony/event-dispatcher/tree/v7.0.3" }, "funding": [ { @@ -5117,7 +5297,7 @@ "type": "tidelift" } ], - "time": "2023-12-27T22:24:19+00:00" + "time": "2024-01-23T15:02:46+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -5261,16 +5441,16 @@ }, { "name": "symfony/http-client", - "version": "v7.0.0", + "version": "v7.0.3", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "c3e90d09b3c45a5d47170e81a712d51c352cbc68" + "reference": "3d2605c07cd14aec294f72f5bf8147702f7a5ada" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/c3e90d09b3c45a5d47170e81a712d51c352cbc68", - "reference": "c3e90d09b3c45a5d47170e81a712d51c352cbc68", + "url": "https://api.github.com/repos/symfony/http-client/zipball/3d2605c07cd14aec294f72f5bf8147702f7a5ada", + "reference": "3d2605c07cd14aec294f72f5bf8147702f7a5ada", "shasum": "" }, "require": { @@ -5333,7 +5513,7 @@ "http" ], "support": { - "source": "https://github.com/symfony/http-client/tree/v7.0.0" + "source": "https://github.com/symfony/http-client/tree/v7.0.3" }, "funding": [ { @@ -5349,7 +5529,7 @@ "type": "tidelift" } ], - "time": "2023-11-29T08:40:23+00:00" + "time": "2024-01-29T15:41:16+00:00" }, { "name": "symfony/http-client-contracts", @@ -5431,16 +5611,16 @@ }, { "name": "symfony/http-foundation", - "version": "v6.4.2", + "version": "v6.4.3", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "172d807f9ef3fc3fbed8377cc57c20d389269271" + "reference": "5677bdf7cade4619cb17fc9e1e7b31ec392244a9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/172d807f9ef3fc3fbed8377cc57c20d389269271", - "reference": "172d807f9ef3fc3fbed8377cc57c20d389269271", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/5677bdf7cade4619cb17fc9e1e7b31ec392244a9", + "reference": "5677bdf7cade4619cb17fc9e1e7b31ec392244a9", "shasum": "" }, "require": { @@ -5488,7 +5668,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.2" + "source": "https://github.com/symfony/http-foundation/tree/v6.4.3" }, "funding": [ { @@ -5504,20 +5684,20 @@ "type": "tidelift" } ], - "time": "2023-12-27T22:16:42+00:00" + "time": "2024-01-23T14:51:35+00:00" }, { "name": "symfony/http-kernel", - "version": "v6.4.2", + "version": "v6.4.3", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "13e8387320b5942d0dc408440c888e2d526efef4" + "reference": "9c6ec4e543044f7568a53a76ab1484ecd30637a2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/13e8387320b5942d0dc408440c888e2d526efef4", - "reference": "13e8387320b5942d0dc408440c888e2d526efef4", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/9c6ec4e543044f7568a53a76ab1484ecd30637a2", + "reference": "9c6ec4e543044f7568a53a76ab1484ecd30637a2", "shasum": "" }, "require": { @@ -5601,7 +5781,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.2" + "source": "https://github.com/symfony/http-kernel/tree/v6.4.3" }, "funding": [ { @@ -5617,20 +5797,20 @@ "type": "tidelift" } ], - "time": "2023-12-30T15:31:44+00:00" + "time": "2024-01-31T07:21:29+00:00" }, { "name": "symfony/mailer", - "version": "v6.4.2", + "version": "v6.4.3", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "6da89e5c9202f129717a770a03183fb140720168" + "reference": "74412c62f88a85a41b61f0b71ab0afcaad6f03ee" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/6da89e5c9202f129717a770a03183fb140720168", - "reference": "6da89e5c9202f129717a770a03183fb140720168", + "url": "https://api.github.com/repos/symfony/mailer/zipball/74412c62f88a85a41b61f0b71ab0afcaad6f03ee", + "reference": "74412c62f88a85a41b61f0b71ab0afcaad6f03ee", "shasum": "" }, "require": { @@ -5681,7 +5861,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v6.4.2" + "source": "https://github.com/symfony/mailer/tree/v6.4.3" }, "funding": [ { @@ -5697,20 +5877,20 @@ "type": "tidelift" } ], - "time": "2023-12-19T09:12:31+00:00" + "time": "2024-01-29T15:01:07+00:00" }, { "name": "symfony/mime", - "version": "v6.4.0", + "version": "v6.4.3", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "ca4f58b2ef4baa8f6cecbeca2573f88cd577d205" + "reference": "5017e0a9398c77090b7694be46f20eb796262a34" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/ca4f58b2ef4baa8f6cecbeca2573f88cd577d205", - "reference": "ca4f58b2ef4baa8f6cecbeca2573f88cd577d205", + "url": "https://api.github.com/repos/symfony/mime/zipball/5017e0a9398c77090b7694be46f20eb796262a34", + "reference": "5017e0a9398c77090b7694be46f20eb796262a34", "shasum": "" }, "require": { @@ -5765,7 +5945,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v6.4.0" + "source": "https://github.com/symfony/mime/tree/v6.4.3" }, "funding": [ { @@ -5781,7 +5961,7 @@ "type": "tidelift" } ], - "time": "2023-10-17T11:49:05+00:00" + "time": "2024-01-30T08:32:12+00:00" }, { "name": "symfony/options-resolver", @@ -6590,16 +6770,16 @@ }, { "name": "symfony/process", - "version": "v6.4.2", + "version": "v6.4.3", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "c4b1ef0bc80533d87a2e969806172f1c2a980241" + "reference": "31642b0818bfcff85930344ef93193f8c607e0a3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/c4b1ef0bc80533d87a2e969806172f1c2a980241", - "reference": "c4b1ef0bc80533d87a2e969806172f1c2a980241", + "url": "https://api.github.com/repos/symfony/process/zipball/31642b0818bfcff85930344ef93193f8c607e0a3", + "reference": "31642b0818bfcff85930344ef93193f8c607e0a3", "shasum": "" }, "require": { @@ -6631,7 +6811,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v6.4.2" + "source": "https://github.com/symfony/process/tree/v6.4.3" }, "funding": [ { @@ -6647,7 +6827,7 @@ "type": "tidelift" } ], - "time": "2023-12-22T16:42:54+00:00" + "time": "2024-01-23T14:51:35+00:00" }, { "name": "symfony/psr-http-message-bridge", @@ -6740,16 +6920,16 @@ }, { "name": "symfony/routing", - "version": "v6.4.2", + "version": "v6.4.3", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "98eab13a07fddc85766f1756129c69f207ffbc21" + "reference": "3b2957ad54902f0f544df83e3d58b38d7e8e5842" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/98eab13a07fddc85766f1756129c69f207ffbc21", - "reference": "98eab13a07fddc85766f1756129c69f207ffbc21", + "url": "https://api.github.com/repos/symfony/routing/zipball/3b2957ad54902f0f544df83e3d58b38d7e8e5842", + "reference": "3b2957ad54902f0f544df83e3d58b38d7e8e5842", "shasum": "" }, "require": { @@ -6803,7 +6983,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v6.4.2" + "source": "https://github.com/symfony/routing/tree/v6.4.3" }, "funding": [ { @@ -6819,7 +6999,7 @@ "type": "tidelift" } ], - "time": "2023-12-29T15:34:34+00:00" + "time": "2024-01-30T13:55:02+00:00" }, { "name": "symfony/service-contracts", @@ -6905,16 +7085,16 @@ }, { "name": "symfony/string", - "version": "v7.0.2", + "version": "v7.0.3", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "cc78f14f91f5e53b42044d0620961c48028ff9f5" + "reference": "524aac4a280b90a4420d8d6a040718d0586505ac" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/cc78f14f91f5e53b42044d0620961c48028ff9f5", - "reference": "cc78f14f91f5e53b42044d0620961c48028ff9f5", + "url": "https://api.github.com/repos/symfony/string/zipball/524aac4a280b90a4420d8d6a040718d0586505ac", + "reference": "524aac4a280b90a4420d8d6a040718d0586505ac", "shasum": "" }, "require": { @@ -6971,7 +7151,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v7.0.2" + "source": "https://github.com/symfony/string/tree/v7.0.3" }, "funding": [ { @@ -6987,20 +7167,20 @@ "type": "tidelift" } ], - "time": "2023-12-10T16:54:46+00:00" + "time": "2024-01-29T15:41:16+00:00" }, { "name": "symfony/translation", - "version": "v6.4.2", + "version": "v6.4.3", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "a2ab2ec1a462e53016de8e8d5e8912bfd62ea681" + "reference": "637c51191b6b184184bbf98937702bcf554f7d04" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/a2ab2ec1a462e53016de8e8d5e8912bfd62ea681", - "reference": "a2ab2ec1a462e53016de8e8d5e8912bfd62ea681", + "url": "https://api.github.com/repos/symfony/translation/zipball/637c51191b6b184184bbf98937702bcf554f7d04", + "reference": "637c51191b6b184184bbf98937702bcf554f7d04", "shasum": "" }, "require": { @@ -7023,7 +7203,7 @@ "symfony/translation-implementation": "2.3|3.0" }, "require-dev": { - "nikic/php-parser": "^4.13", + "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", @@ -7066,7 +7246,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v6.4.2" + "source": "https://github.com/symfony/translation/tree/v6.4.3" }, "funding": [ { @@ -7082,7 +7262,7 @@ "type": "tidelift" } ], - "time": "2023-12-18T09:25:29+00:00" + "time": "2024-01-29T13:11:52+00:00" }, { "name": "symfony/translation-contracts", @@ -7164,16 +7344,16 @@ }, { "name": "symfony/uid", - "version": "v6.4.0", + "version": "v6.4.3", "source": { "type": "git", "url": "https://github.com/symfony/uid.git", - "reference": "8092dd1b1a41372110d06374f99ee62f7f0b9a92" + "reference": "1d31267211cc3a2fff32bcfc7c1818dac41b6fc0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/uid/zipball/8092dd1b1a41372110d06374f99ee62f7f0b9a92", - "reference": "8092dd1b1a41372110d06374f99ee62f7f0b9a92", + "url": "https://api.github.com/repos/symfony/uid/zipball/1d31267211cc3a2fff32bcfc7c1818dac41b6fc0", + "reference": "1d31267211cc3a2fff32bcfc7c1818dac41b6fc0", "shasum": "" }, "require": { @@ -7218,7 +7398,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/uid/tree/v6.4.0" + "source": "https://github.com/symfony/uid/tree/v6.4.3" }, "funding": [ { @@ -7234,20 +7414,20 @@ "type": "tidelift" } ], - "time": "2023-10-31T08:18:17+00:00" + "time": "2024-01-23T14:51:35+00:00" }, { "name": "symfony/var-dumper", - "version": "v6.4.2", + "version": "v6.4.3", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "68d6573ec98715ddcae5a0a85bee3c1c27a4c33f" + "reference": "0435a08f69125535336177c29d56af3abc1f69da" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/68d6573ec98715ddcae5a0a85bee3c1c27a4c33f", - "reference": "68d6573ec98715ddcae5a0a85bee3c1c27a4c33f", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/0435a08f69125535336177c29d56af3abc1f69da", + "reference": "0435a08f69125535336177c29d56af3abc1f69da", "shasum": "" }, "require": { @@ -7303,7 +7483,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v6.4.2" + "source": "https://github.com/symfony/var-dumper/tree/v6.4.3" }, "funding": [ { @@ -7319,7 +7499,7 @@ "type": "tidelift" } ], - "time": "2023-12-28T19:16:56+00:00" + "time": "2024-01-23T14:53:30+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", @@ -7862,16 +8042,16 @@ }, { "name": "fakerphp/faker", - "version": "v1.23.0", + "version": "v1.23.1", "source": { "type": "git", "url": "https://github.com/FakerPHP/Faker.git", - "reference": "e3daa170d00fde61ea7719ef47bb09bb8f1d9b01" + "reference": "bfb4fe148adbf78eff521199619b93a52ae3554b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/e3daa170d00fde61ea7719ef47bb09bb8f1d9b01", - "reference": "e3daa170d00fde61ea7719ef47bb09bb8f1d9b01", + "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/bfb4fe148adbf78eff521199619b93a52ae3554b", + "reference": "bfb4fe148adbf78eff521199619b93a52ae3554b", "shasum": "" }, "require": { @@ -7897,11 +8077,6 @@ "ext-mbstring": "Required for multibyte Unicode string functionality." }, "type": "library", - "extra": { - "branch-alias": { - "dev-main": "v1.21-dev" - } - }, "autoload": { "psr-4": { "Faker\\": "src/Faker/" @@ -7924,9 +8099,9 @@ ], "support": { "issues": "https://github.com/FakerPHP/Faker/issues", - "source": "https://github.com/FakerPHP/Faker/tree/v1.23.0" + "source": "https://github.com/FakerPHP/Faker/tree/v1.23.1" }, - "time": "2023-06-12T08:44:38+00:00" + "time": "2024-01-02T13:46:09+00:00" }, { "name": "filp/whoops", @@ -8001,21 +8176,22 @@ }, { "name": "friendsofphp/php-cs-fixer", - "version": "v3.41.1", + "version": "v3.48.0", "source": { "type": "git", "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", - "reference": "8b6ae8dcbaf23f09680643ab832a4a3a260265f6" + "reference": "a92472c6fb66349de25211f31c77eceae3df024e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/8b6ae8dcbaf23f09680643ab832a4a3a260265f6", - "reference": "8b6ae8dcbaf23f09680643ab832a4a3a260265f6", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/a92472c6fb66349de25211f31c77eceae3df024e", + "reference": "a92472c6fb66349de25211f31c77eceae3df024e", "shasum": "" }, "require": { "composer/semver": "^3.4", "composer/xdebug-handler": "^3.0.3", + "ext-filter": "*", "ext-json": "*", "ext-tokenizer": "*", "php": "^7.4 || ^8.0", @@ -8040,8 +8216,7 @@ "php-cs-fixer/accessible-object": "^1.1", "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.4", "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.4", - "phpunit/phpunit": "^9.6", - "symfony/phpunit-bridge": "^6.3.8 || ^7.0", + "phpunit/phpunit": "^9.6 || ^10.5.5", "symfony/yaml": "^5.4 || ^6.0 || ^7.0" }, "suggest": { @@ -8080,7 +8255,7 @@ ], "support": { "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", - "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.41.1" + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.48.0" }, "funding": [ { @@ -8088,7 +8263,7 @@ "type": "github" } ], - "time": "2023-12-10T19:59:27+00:00" + "time": "2024-01-19T21:44:39+00:00" }, { "name": "hamcrest/hamcrest-php", @@ -8143,22 +8318,22 @@ }, { "name": "kubawerlos/php-cs-fixer-custom-fixers", - "version": "v3.17.0", + "version": "v3.19.2", "source": { "type": "git", "url": "https://github.com/kubawerlos/php-cs-fixer-custom-fixers.git", - "reference": "bbfb4ff20d148ed9531b1cfc9c9a861faba72b9a" + "reference": "e17ffa5d25dafed7a8bcf545fc1b576a664c87e7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/kubawerlos/php-cs-fixer-custom-fixers/zipball/bbfb4ff20d148ed9531b1cfc9c9a861faba72b9a", - "reference": "bbfb4ff20d148ed9531b1cfc9c9a861faba72b9a", + "url": "https://api.github.com/repos/kubawerlos/php-cs-fixer-custom-fixers/zipball/e17ffa5d25dafed7a8bcf545fc1b576a664c87e7", + "reference": "e17ffa5d25dafed7a8bcf545fc1b576a664c87e7", "shasum": "" }, "require": { "ext-filter": "*", "ext-tokenizer": "*", - "friendsofphp/php-cs-fixer": "^3.22", + "friendsofphp/php-cs-fixer": "^3.47", "php": "^7.4 || ^8.0" }, "require-dev": { @@ -8183,22 +8358,22 @@ "description": "A set of custom fixers for PHP CS Fixer", "support": { "issues": "https://github.com/kubawerlos/php-cs-fixer-custom-fixers/issues", - "source": "https://github.com/kubawerlos/php-cs-fixer-custom-fixers/tree/v3.17.0" + "source": "https://github.com/kubawerlos/php-cs-fixer-custom-fixers/tree/v3.19.2" }, - "time": "2023-11-19T12:08:42+00:00" + "time": "2024-01-25T16:31:36+00:00" }, { "name": "laravel/telescope", - "version": "v4.17.3", + "version": "v4.17.5", "source": { "type": "git", "url": "https://github.com/laravel/telescope.git", - "reference": "17a420d0121b03ea90648dd4484b62abe6d3e261" + "reference": "2c5295261d1459e4f9b157c407a663a6685f3ddf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/telescope/zipball/17a420d0121b03ea90648dd4484b62abe6d3e261", - "reference": "17a420d0121b03ea90648dd4484b62abe6d3e261", + "url": "https://api.github.com/repos/laravel/telescope/zipball/2c5295261d1459e4f9b157c407a663a6685f3ddf", + "reference": "2c5295261d1459e4f9b157c407a663a6685f3ddf", "shasum": "" }, "require": { @@ -8254,9 +8429,9 @@ ], "support": { "issues": "https://github.com/laravel/telescope/issues", - "source": "https://github.com/laravel/telescope/tree/v4.17.3" + "source": "https://github.com/laravel/telescope/tree/v4.17.5" }, - "time": "2023-12-11T22:00:12+00:00" + "time": "2024-01-30T15:41:45+00:00" }, { "name": "mockery/mockery", @@ -8609,23 +8784,23 @@ }, { "name": "phpunit/php-code-coverage", - "version": "10.1.10", + "version": "10.1.11", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "599109c8ca6bae97b23482d557d2874c25a65e59" + "reference": "78c3b7625965c2513ee96569a4dbb62601784145" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/599109c8ca6bae97b23482d557d2874c25a65e59", - "reference": "599109c8ca6bae97b23482d557d2874c25a65e59", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/78c3b7625965c2513ee96569a4dbb62601784145", + "reference": "78c3b7625965c2513ee96569a4dbb62601784145", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^4.15", + "nikic/php-parser": "^4.18 || ^5.0", "php": ">=8.1", "phpunit/php-file-iterator": "^4.0", "phpunit/php-text-template": "^3.0", @@ -8675,7 +8850,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.10" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.11" }, "funding": [ { @@ -8683,7 +8858,7 @@ "type": "github" } ], - "time": "2023-12-11T06:28:43+00:00" + "time": "2023-12-21T15:38:30+00:00" }, { "name": "phpunit/php-file-iterator", @@ -8930,16 +9105,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.5.3", + "version": "10.5.9", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "6fce887c71076a73f32fd3e0774a6833fc5c7f19" + "reference": "0bd663704f0165c9e76fe4f06ffa6a1ca727fdbe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/6fce887c71076a73f32fd3e0774a6833fc5c7f19", - "reference": "6fce887c71076a73f32fd3e0774a6833fc5c7f19", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/0bd663704f0165c9e76fe4f06ffa6a1ca727fdbe", + "reference": "0bd663704f0165c9e76fe4f06ffa6a1ca727fdbe", "shasum": "" }, "require": { @@ -9011,7 +9186,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.3" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.9" }, "funding": [ { @@ -9027,7 +9202,7 @@ "type": "tidelift" } ], - "time": "2023-12-13T07:25:23+00:00" + "time": "2024-01-22T14:35:40+00:00" }, { "name": "sebastian/cli-parser", @@ -9275,20 +9450,20 @@ }, { "name": "sebastian/complexity", - "version": "3.1.0", + "version": "3.2.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "68cfb347a44871f01e33ab0ef8215966432f6957" + "reference": "68ff824baeae169ec9f2137158ee529584553799" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/68cfb347a44871f01e33ab0ef8215966432f6957", - "reference": "68cfb347a44871f01e33ab0ef8215966432f6957", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/68ff824baeae169ec9f2137158ee529584553799", + "reference": "68ff824baeae169ec9f2137158ee529584553799", "shasum": "" }, "require": { - "nikic/php-parser": "^4.10", + "nikic/php-parser": "^4.18 || ^5.0", "php": ">=8.1" }, "require-dev": { @@ -9297,7 +9472,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.1-dev" + "dev-main": "3.2-dev" } }, "autoload": { @@ -9321,7 +9496,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/complexity/issues", "security": "https://github.com/sebastianbergmann/complexity/security/policy", - "source": "https://github.com/sebastianbergmann/complexity/tree/3.1.0" + "source": "https://github.com/sebastianbergmann/complexity/tree/3.2.0" }, "funding": [ { @@ -9329,20 +9504,20 @@ "type": "github" } ], - "time": "2023-09-28T11:50:59+00:00" + "time": "2023-12-21T08:37:17+00:00" }, { "name": "sebastian/diff", - "version": "5.0.3", + "version": "5.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "912dc2fbe3e3c1e7873313cc801b100b6c68c87b" + "reference": "fbf413a49e54f6b9b17e12d900ac7f6101591b7f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/912dc2fbe3e3c1e7873313cc801b100b6c68c87b", - "reference": "912dc2fbe3e3c1e7873313cc801b100b6c68c87b", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/fbf413a49e54f6b9b17e12d900ac7f6101591b7f", + "reference": "fbf413a49e54f6b9b17e12d900ac7f6101591b7f", "shasum": "" }, "require": { @@ -9355,7 +9530,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "5.0-dev" + "dev-main": "5.1-dev" } }, "autoload": { @@ -9388,7 +9563,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", "security": "https://github.com/sebastianbergmann/diff/security/policy", - "source": "https://github.com/sebastianbergmann/diff/tree/5.0.3" + "source": "https://github.com/sebastianbergmann/diff/tree/5.1.0" }, "funding": [ { @@ -9396,7 +9571,7 @@ "type": "github" } ], - "time": "2023-05-01T07:48:21+00:00" + "time": "2023-12-22T10:55:06+00:00" }, { "name": "sebastian/environment", @@ -9604,20 +9779,20 @@ }, { "name": "sebastian/lines-of-code", - "version": "2.0.1", + "version": "2.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "649e40d279e243d985aa8fb6e74dd5bb28dc185d" + "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/649e40d279e243d985aa8fb6e74dd5bb28dc185d", - "reference": "649e40d279e243d985aa8fb6e74dd5bb28dc185d", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/856e7f6a75a84e339195d48c556f23be2ebf75d0", + "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0", "shasum": "" }, "require": { - "nikic/php-parser": "^4.10", + "nikic/php-parser": "^4.18 || ^5.0", "php": ">=8.1" }, "require-dev": { @@ -9650,7 +9825,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.1" + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.2" }, "funding": [ { @@ -9658,7 +9833,7 @@ "type": "github" } ], - "time": "2023-08-31T09:25:50+00:00" + "time": "2023-12-21T08:38:20+00:00" }, { "name": "sebastian/object-enumerator", @@ -10008,21 +10183,20 @@ }, { "name": "spatie/flare-client-php", - "version": "1.4.3", + "version": "1.4.4", "source": { "type": "git", "url": "https://github.com/spatie/flare-client-php.git", - "reference": "5db2fdd743c3ede33f2a5367d89ec1a7c9c1d1ec" + "reference": "17082e780752d346c2db12ef5d6bee8e835e399c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/flare-client-php/zipball/5db2fdd743c3ede33f2a5367d89ec1a7c9c1d1ec", - "reference": "5db2fdd743c3ede33f2a5367d89ec1a7c9c1d1ec", + "url": "https://api.github.com/repos/spatie/flare-client-php/zipball/17082e780752d346c2db12ef5d6bee8e835e399c", + "reference": "17082e780752d346c2db12ef5d6bee8e835e399c", "shasum": "" }, "require": { "illuminate/pipeline": "^8.0|^9.0|^10.0|^11.0", - "nesbot/carbon": "^2.62.1", "php": "^8.0", "spatie/backtrace": "^1.5.2", "symfony/http-foundation": "^5.2|^6.0|^7.0", @@ -10066,7 +10240,7 @@ ], "support": { "issues": "https://github.com/spatie/flare-client-php/issues", - "source": "https://github.com/spatie/flare-client-php/tree/1.4.3" + "source": "https://github.com/spatie/flare-client-php/tree/1.4.4" }, "funding": [ { @@ -10074,20 +10248,20 @@ "type": "github" } ], - "time": "2023-10-17T15:54:07+00:00" + "time": "2024-01-31T14:18:45+00:00" }, { "name": "spatie/ignition", - "version": "1.11.3", + "version": "1.12.0", "source": { "type": "git", "url": "https://github.com/spatie/ignition.git", - "reference": "3d886de644ff7a5b42e4d27c1e1f67c8b5f00044" + "reference": "5b6f801c605a593106b623e45ca41496a6e7d56d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/ignition/zipball/3d886de644ff7a5b42e4d27c1e1f67c8b5f00044", - "reference": "3d886de644ff7a5b42e4d27c1e1f67c8b5f00044", + "url": "https://api.github.com/repos/spatie/ignition/zipball/5b6f801c605a593106b623e45ca41496a6e7d56d", + "reference": "5b6f801c605a593106b623e45ca41496a6e7d56d", "shasum": "" }, "require": { @@ -10157,39 +10331,39 @@ "type": "github" } ], - "time": "2023-10-18T14:09:40+00:00" + "time": "2024-01-03T15:49:39+00:00" }, { "name": "spatie/laravel-ignition", - "version": "2.3.2", + "version": "2.4.1", "source": { "type": "git", "url": "https://github.com/spatie/laravel-ignition.git", - "reference": "4800661a195e15783477d99f7f8f669a49793996" + "reference": "005e1e7b1232f3b22d7e7be3f602693efc7dba67" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-ignition/zipball/4800661a195e15783477d99f7f8f669a49793996", - "reference": "4800661a195e15783477d99f7f8f669a49793996", + "url": "https://api.github.com/repos/spatie/laravel-ignition/zipball/005e1e7b1232f3b22d7e7be3f602693efc7dba67", + "reference": "005e1e7b1232f3b22d7e7be3f602693efc7dba67", "shasum": "" }, "require": { "ext-curl": "*", "ext-json": "*", "ext-mbstring": "*", - "illuminate/support": "^10.0", + "illuminate/support": "^10.0|^11.0", "php": "^8.1", "spatie/flare-client-php": "^1.3.5", "spatie/ignition": "^1.9", - "symfony/console": "^6.2.3", - "symfony/var-dumper": "^6.2.3" + "symfony/console": "^6.2.3|^7.0", + "symfony/var-dumper": "^6.2.3|^7.0" }, "require-dev": { - "livewire/livewire": "^2.11", + "livewire/livewire": "^2.11|^3.3.5", "mockery/mockery": "^1.5.1", - "openai-php/client": "^0.3.4", - "orchestra/testbench": "^8.0", - "pestphp/pest": "^1.22.3", + "openai-php/client": "^0.8.1", + "orchestra/testbench": "^8.0|^9.0", + "pestphp/pest": "^2.30", "phpstan/extension-installer": "^1.2", "phpstan/phpstan-deprecation-rules": "^1.1.1", "phpstan/phpstan-phpunit": "^1.3.3", @@ -10249,20 +10423,20 @@ "type": "github" } ], - "time": "2023-12-15T13:44:49+00:00" + "time": "2024-01-12T13:14:58+00:00" }, { "name": "symfony/filesystem", - "version": "v7.0.0", + "version": "v7.0.3", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "7da8ea2362a283771478c5f7729cfcb43a76b8b7" + "reference": "2890e3a825bc0c0558526c04499c13f83e1b6b12" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/7da8ea2362a283771478c5f7729cfcb43a76b8b7", - "reference": "7da8ea2362a283771478c5f7729cfcb43a76b8b7", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/2890e3a825bc0c0558526c04499c13f83e1b6b12", + "reference": "2890e3a825bc0c0558526c04499c13f83e1b6b12", "shasum": "" }, "require": { @@ -10296,7 +10470,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v7.0.0" + "source": "https://github.com/symfony/filesystem/tree/v7.0.3" }, "funding": [ { @@ -10312,7 +10486,7 @@ "type": "tidelift" } ], - "time": "2023-07-27T06:33:22+00:00" + "time": "2024-01-23T15:02:46+00:00" }, { "name": "symfony/polyfill-php81", @@ -10395,16 +10569,16 @@ }, { "name": "symfony/stopwatch", - "version": "v7.0.0", + "version": "v7.0.3", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "7bbfa3dd564a0ce12eb4acaaa46823c740f9cb7a" + "reference": "983900d6fddf2b0cbaacacbbad07610854bd8112" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/7bbfa3dd564a0ce12eb4acaaa46823c740f9cb7a", - "reference": "7bbfa3dd564a0ce12eb4acaaa46823c740f9cb7a", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/983900d6fddf2b0cbaacacbbad07610854bd8112", + "reference": "983900d6fddf2b0cbaacacbbad07610854bd8112", "shasum": "" }, "require": { @@ -10437,7 +10611,7 @@ "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v7.0.0" + "source": "https://github.com/symfony/stopwatch/tree/v7.0.3" }, "funding": [ { @@ -10453,7 +10627,7 @@ "type": "tidelift" } ], - "time": "2023-07-05T13:06:06+00:00" + "time": "2024-01-23T15:02:46+00:00" }, { "name": "theseer/tokenizer", diff --git a/config/app.php b/config/app.php index d2eed306..a5ea6c8f 100644 --- a/config/app.php +++ b/config/app.php @@ -45,4 +45,8 @@ "aliases" => Facade::defaultAliases()->merge([ ])->toArray(), + + "provider_logo_size" => 10 * 1024, + "provider_logo_width" => 150, + "provider_logo_height" => 100, ]; diff --git a/config/auth.php b/config/auth.php index cf69f129..e0bdd12b 100644 --- a/config/auth.php +++ b/config/auth.php @@ -9,6 +9,10 @@ ], "guards" => [ + "api" => [ + "driver" => "sanctum", + "provider" => "users", + ], "web" => [ "driver" => "session", "provider" => "users", diff --git a/config/sanctum.php b/config/sanctum.php index 09cc519c..9c241d06 100644 --- a/config/sanctum.php +++ b/config/sanctum.php @@ -13,7 +13,7 @@ "guard" => ["web"], - "expiration" => null, + "expiration" => 720, "middleware" => [ "verify_csrf_token" => App\Http\Middleware\VerifyCsrfToken::class, diff --git a/config/scramble.php b/config/scramble.php new file mode 100644 index 00000000..9c9d14c0 --- /dev/null +++ b/config/scramble.php @@ -0,0 +1,27 @@ + "api", + "api_domain" => null, + "export_path" => "api.json", + "theme" => "light", + "info" => [ + "version" => env("API_VERSION", "0.0.1"), + "description" => "", + ], + "ui" => [ + "hide_try_it" => false, + "logo" => "", + "try_it_credentials_policy" => "include", + ], + "servers" => null, + "middleware" => [ + "web", + RestrictedDocsAccess::class, + ], + "extensions" => [], +]; diff --git a/database/migrations/2023_06_21_134722_create_permission_tables.php b/database/migrations/2023_06_21_134722_create_permission_tables.php index f7c3bc49..5c640d44 100644 --- a/database/migrations/2023_06_21_134722_create_permission_tables.php +++ b/database/migrations/2023_06_21_134722_create_permission_tables.php @@ -16,11 +16,11 @@ public function up(): void $teams = config("permission.teams"); if (empty($tableNames)) { - throw new \Exception("Error: config/permission.php not loaded. Run [php artisan config:clear] and try again."); + throw new Exception("Error: config/permission.php not loaded. Run [php artisan config:clear] and try again."); } if ($teams && empty($columnNames["team_foreign_key"] ?? null)) { - throw new \Exception("Error: team_foreign_key on config/permission.php not loaded. Run [php artisan config:clear] and try again."); + throw new Exception("Error: team_foreign_key on config/permission.php not loaded. Run [php artisan config:clear] and try again."); } Schema::create($tableNames["permissions"], function (Blueprint $table): void { @@ -133,7 +133,7 @@ public function down(): void $tableNames = config("permission.table_names"); if (empty($tableNames)) { - throw new \Exception("Error: config/permission.php not found and defaults could not be merged. Please publish the package configuration before proceeding, or drop the tables manually."); + throw new Exception("Error: config/permission.php not found and defaults could not be merged. Please publish the package configuration before proceeding, or drop the tables manually."); } Schema::drop($tableNames["role_has_permissions"]); diff --git a/database/seeders/ProviderSeeder.php b/database/seeders/ProviderSeeder.php index 4dd15985..a30efa2f 100644 --- a/database/seeders/ProviderSeeder.php +++ b/database/seeders/ProviderSeeder.php @@ -30,6 +30,7 @@ use App\Importers\ZwingsDataImporter; use App\Models\Provider; use Illuminate\Database\Seeder; +use Illuminate\Support\Facades\Storage; class ProviderSeeder extends Seeder { @@ -71,6 +72,18 @@ public function run(): void "android_url" => $provider["android_url"] ?? null, "ios_url" => $provider["ios_url"] ?? null, ]); + + $imageName = strtolower($provider["name"]) . ".png"; + $imagePath = resource_path("providers/" . $imageName); + $newImagePath = "public/providers/" . $imageName; + + if (file_exists($imagePath) && !Storage::exists($newImagePath)) { + Storage::put($newImagePath, file_get_contents($imagePath)); + } + } + + if (file_exists(resource_path("providers/unknown.png")) && !Storage::exists( "public/providers/unknown.png")) { + Storage::put("public/providers/unknown.png", file_get_contents(resource_path("providers/unknown.png"))); } } } diff --git a/environment/dev/app/Dockerfile b/environment/dev/app/Dockerfile index 9cc0bc88..68ad7d7d 100644 --- a/environment/dev/app/Dockerfile +++ b/environment/dev/app/Dockerfile @@ -1,8 +1,8 @@ -FROM composer/composer:2.5.8-bin as composer-bin +FROM composer/composer:2.6.6-bin as composer-bin FROM node:21.4.0-bullseye-slim as node -FROM php:8.3.1-fpm-bullseye +FROM php:8.3.3-fpm-bullseye COPY --from=composer-bin ./composer /usr/bin/composer @@ -52,7 +52,7 @@ RUN apt-get update \ && docker-php-ext-enable \ redis -ARG XDEBUG_VERSION=3.2.1 +ARG XDEBUG_VERSION=3.3.1 ARG INSTALL_XDEBUG=true RUN if [ ${INSTALL_XDEBUG} = true ]; then \ diff --git a/environment/staging/app/Dockerfile b/environment/staging/app/Dockerfile index 78859e08..c68fc0b5 100644 --- a/environment/staging/app/Dockerfile +++ b/environment/staging/app/Dockerfile @@ -1,8 +1,8 @@ -FROM composer/composer:2.5.8-bin as composer-bin +FROM composer/composer:2.6.6-bin as composer-bin FROM node:20.4.0-bullseye-slim as node -FROM php:8.3.1-fpm-bullseye +FROM php:8.3.3-fpm-bullseye COPY --from=composer-bin ./composer /usr/bin/composer diff --git a/lang/pl.json b/lang/pl.json index dbe9e592..917919d3 100644 --- a/lang/pl.json +++ b/lang/pl.json @@ -1,5 +1,6 @@ { "Prices": "Ceny", + "Find a ride": "Znajdź przejazd", "Favorite cities": "Ulubione miasta", "Rules": "Zasady", "Loading": "Ładowanie", @@ -9,6 +10,8 @@ "Search city": "Szukaj miasta", "Search country": "Szukaj kraju", "Search provider": "Szukaj dostawcy", + "Browse": "Przeglądaj", + "No file selected.": "Nie wybrano pliku.", "Register": "Zarejestruj", "Name": "Nazwa", "Email": "E-mail", @@ -25,6 +28,10 @@ "Log in to add to favorites.": "Zaloguj się, aby dodać do ulubionych.", "Sorry we couldn't find any cities.": "Przepraszamy, ale nie mogliśmy znaleźć żadnych miast.", "Sorry we couldn't find any countries.": "Przepraszamy, ale nie mogliśmy znaleźć żadnych krajów.", + "Login to add to favorites.": "Zaloguj się, aby dodać do ulubionych.", + "Sorry we couldn`t find any cities.": "Przepraszamy, ale nie mogliśmy znaleźć żadnych miast.", + "Sorry we couldn`t find any countries.": "Przepraszamy, ale nie mogliśmy znaleźć żadnych krajów.", + "Sorry we couldn`t find any providers.": "Przepraszamy, ale nie mogliśmy znaleźć żadnych dostawców.", "advert1": "Jest wielu dostawców hulajnóg elektrycznych, więc czasami można poczuć pewne niepewności co do tego, których aplikacji powinno się używać podczas swoich podróży.", "advert2": "Ta aplikacja pomoże Ci z planowaniem Twoich wakacji lub podróży biznesowych.", "Edit": "Edytuj", @@ -33,7 +40,9 @@ "Add": "Dodaj", "Create city": "Utwórz miasto", "Create country": "Utwórz kraj", + "Create provider": "Utwórz dostawcę", "Update city": "Aktualizuj miasto", + "Update provider": "Aktualizuj dostawcę", "Save": "Zapisz", "Add alternative name": "Dodaj alternatywną nazwę", "Clear filters": "Wyczyść filtry", @@ -44,6 +53,7 @@ "Choose provider": "Wybierz dostawcę", "Latitude": "Szerokość geograficzna", "Longitude": "Długość geograficzna", + "Color": "Kolor", "Providers": "Dostawcy", "Importers": "Importerzy", "Country": "Kraj", @@ -57,6 +67,8 @@ "of": "z", "to": "do", "results": "wyników", + "Language has been changed.": "Język został zmieniony.", + "Error changing language.": "Błąd podczas zmiany języka.", "Alternative name": "Alternatywna nazwa", "Filling map with providers...": "Wypełnianie mapy dostawcami...", "Didn't find any providers.": "Nie znaleziono dostawców.", @@ -79,18 +91,22 @@ "City removed from favorites.": "Miasto usunięte z ulubionych.", "City updated successfully.": "Miasto zaktualizowane pomyślnie.", "Country updated successfully.": "Kraj zaktualizowany pomyślnie.", + "Provider updated successfully.": "Dostawca zaktualizowany pomyślnie.", "City created successfully.": "Miasto utworzone pomyślnie.", + "Provider created successfully.": "Dostawca utworzony pomyślnie.", "Country created successfully.": "Kraj utworzony pomyślnie.", "City deleted successfully.": "Miasto usunięte pomyślnie.", + "Provider deleted successfully.": "Dostawca usunięty pomyślnie.", "Cities deleted successfully.": "Miasta usunięte pomyślnie.", "Country deleted successfully.": "Kraj usunięty pomyślnie.", "There was an error.": "Wystąpił błąd.", "There was an error creating the city.": "Wystąpił błąd podczas tworzenia miasta.", "There was an error deleting the city.": "Wystąpił błąd podczas usuwania miasta.", "There was an error deleting cities.": "Wystąpił błąd podczas usuwania miast.", - "There was an error creating the country.": "Wystąpił błąd podczas tworzenia kraju.", "There was an error adding alternative city name.": "Wystąpił błąd podczas dodawania alternatywnej nazwy miasta.", + "There was an error creating the provider.": "Wystąpił błąd podczas dodawania dostawcy.", + "There was an error updating the provider.": "Wystąpił błąd podczas aktualizowania dostawcy.", "Alternative city name added successfully.": "Alternatywna nazwa miasta dodana pomyślnie.", "Alternative city name deleted successfully.": "Alternatywna nazwa miasta usunięta pomyślnie.", "City providers updated successfully.": "Dostawcy dostępni w mieście zaktualizowani pomyślnie.", @@ -126,6 +142,9 @@ "Cities with no country assigned": "Miasta bez przypisanego kraju", "Cities with no coordinates assigned": "Miasta bez przypisanych współrzędnych", "Delete all cities with no country assigned": "Usuń wszystkie miasta bez przypisanego kraju", + "All cities removed successfully!" : "Wszystkie miasta usunięte pomyślnie!", + "City alternative name created successfully.": "Alternatywna nazwa miasta utworzona pomyślnie", + "City alternative name deleted successfully.": "Alternatywna nazwa miasta usunięta pomyślnie", "Opinion added successfully.": "Opinia dodana pomyślnie.", "There was an error adding your opinion.": "Wystąpił błąd podczas dodawania opinii.", "Opinion edited successfully.": "Opinia zaktualizowana pomyślnie.", @@ -139,12 +158,14 @@ "Opinion removed successfully!": "Opinia usunięta pomyślnie.", "Delete city": "Usunąć miasto", "Delete country": "Usunąć kraj", + "Delete provider": "Usunąć dostawcę", "Delete that opinion": "Usunąć opinię", "That opinion": "Ta opinia", "This operation cannot be undone.": "Ta operacja nie może zostać cofnięta.", "You have logged in successfully.": "Zalogowano pomyślnie.", "You have logged out successfully.": "Wylogowano pomyślnie.", "You have registered successfully.": "Zarejestrowano pomyślnie", + "Login failed.": "Logowanie nie powiodło się.", "Please, rate that city": "Oceń miasto", "You can also login by:": "Możesz również zalogować się przez:", "Rules import started.": "Import zasad uruchomiony.", diff --git a/package-lock.json b/package-lock.json index a64436ef..6dcb2997 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,11 +11,11 @@ "@inertiajs/inertia-vue3": "^0.6.0", "@inertiajs/progress": "^0.2.7", "@inertiajs/vue3": "^1.0.9", - "@tailwindcss/forms": "^0.5.4", + "@tailwindcss/forms": "^0.5.7", "@tailwindcss/typography": "^0.5.9", "@vueuse/core": "^10.3.0", "axios": "^1.6.2", - "chart.js": "^4.4.0", + "chart.js": "^4.4.2", "laravel-vite-plugin": "^0.8.1", "leaflet-cascade-buttons": "^1.0.10", "lodash": "^4.17.21", @@ -659,9 +659,9 @@ } }, "node_modules/@tailwindcss/forms": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.6.tgz", - "integrity": "sha512-Fw+2BJ0tmAwK/w01tEFL5TiaJBX1NLT1/YbWgvm7ws3Qcn11kiXxzNTEQDMs5V3mQemhB56l3u0i9dwdzSQldA==", + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.7.tgz", + "integrity": "sha512-QE7X69iQI+ZXwldE+rzasvbJiyV/ju1FGHH0Qn2W3FKbuYtqp8LKcy6iSw79fVUT5/Vvf+0XgLCeYVG+UV6hOw==", "dependencies": { "mini-svg-data-uri": "^1.2.3" }, @@ -1398,14 +1398,14 @@ } }, "node_modules/chart.js": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.0.tgz", - "integrity": "sha512-vQEj6d+z0dcsKLlQvbKIMYFHd3t8W/7L2vfJIbYcfyPcRx92CsHqECpueN8qVGNlKyDcr5wBrYAYKnfu/9Q1hQ==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.2.tgz", + "integrity": "sha512-6GD7iKwFpP5kbSD4MeRRRlTnQvxfQREy36uEtm1hzHzcOqwWx0YEHuspuoNlslu+nciLIB7fjjsHkUv/FzFcOg==", "dependencies": { "@kurkle/color": "^0.3.0" }, "engines": { - "pnpm": ">=7" + "pnpm": ">=8" } }, "node_modules/chokidar": { diff --git a/package.json b/package.json index 31d4bcaa..35a29306 100644 --- a/package.json +++ b/package.json @@ -13,11 +13,11 @@ "@inertiajs/inertia-vue3": "^0.6.0", "@inertiajs/progress": "^0.2.7", "@inertiajs/vue3": "^1.0.9", - "@tailwindcss/forms": "^0.5.4", + "@tailwindcss/forms": "^0.5.7", "@tailwindcss/typography": "^0.5.9", "@vueuse/core": "^10.3.0", "axios": "^1.6.2", - "chart.js": "^4.4.0", + "chart.js": "^4.4.2", "laravel-vite-plugin": "^0.8.1", "leaflet-cascade-buttons": "^1.0.10", "lodash": "^4.17.21", diff --git a/public/providers/quick.png b/public/providers/quick.png deleted file mode 100644 index 274a2d0f..00000000 Binary files a/public/providers/quick.png and /dev/null differ diff --git a/resources/js/Pages/Landing/SearchPanel.vue b/resources/js/Pages/Landing/SearchPanel.vue index ffa74d2d..24df1bcd 100644 --- a/resources/js/Pages/Landing/SearchPanel.vue +++ b/resources/js/Pages/Landing/SearchPanel.vue @@ -35,7 +35,7 @@ const filteredCities = computed(() => { } else { return props.cities.filter(city => city.country.id === selectedCountryId && - city.cityProviders.some(cityProvider => cityProvider.provider_name === selectedProviderName), + city.cityProviders.some(cityProvider => cityProvider.provider_name === selectedProviderName), ) } }) @@ -48,9 +48,9 @@ const filteredProviders = computed(() => { return props.providers.filter(provider => props.cities.some(city => city.country.id === selectedCountryId && - city.cityProviders.some(cityProvider => - cityProvider.provider_name === provider.name, - ), + city.cityProviders.some(cityProvider => + cityProvider.provider_name === provider.name, + ), ), ) } diff --git a/resources/js/Pages/Providers/Index.vue b/resources/js/Pages/Providers/Index.vue new file mode 100644 index 00000000..ae910fc4 --- /dev/null +++ b/resources/js/Pages/Providers/Index.vue @@ -0,0 +1,216 @@ + + + diff --git a/resources/js/Shared/Components/Import.vue b/resources/js/Shared/Components/Import.vue index ae0b38d2..455d31d3 100644 --- a/resources/js/Shared/Components/Import.vue +++ b/resources/js/Shared/Components/Import.vue @@ -106,9 +106,9 @@ function toggleImportDialog() {
- +
diff --git a/resources/js/Shared/Components/Provider.vue b/resources/js/Shared/Components/Provider.vue new file mode 100644 index 00000000..41f660da --- /dev/null +++ b/resources/js/Shared/Components/Provider.vue @@ -0,0 +1,180 @@ + + + diff --git a/resources/js/Shared/Components/UploadFileButton.vue b/resources/js/Shared/Components/UploadFileButton.vue new file mode 100644 index 00000000..930d3807 --- /dev/null +++ b/resources/js/Shared/Components/UploadFileButton.vue @@ -0,0 +1,32 @@ + + + diff --git a/resources/js/Shared/Layout/AdminNavigation.vue b/resources/js/Shared/Layout/AdminNavigation.vue index 7ae79744..9c58cdf3 100644 --- a/resources/js/Shared/Layout/AdminNavigation.vue +++ b/resources/js/Shared/Layout/AdminNavigation.vue @@ -1,6 +1,6 @@