From cc3a36307a9be0347a9ca21ef7442e4ca15649af Mon Sep 17 00:00:00 2001 From: SithLordAD Date: Sun, 8 Jan 2023 11:17:15 -0800 Subject: [PATCH 1/2] defined relationships in models, created factories, created seeders, created migrations --- .gitignore | 33 +++++++++++++++++ app/Models/Filter.php | 24 +++++++++++++ app/Models/Location.php | 15 ++++++++ app/Models/Requirement.php | 15 ++++++++ app/Models/Resource.php | 15 ++++++++ app/Models/Test.php | 11 ++++++ app/Models/Type.php | 15 ++++++++ database/factories/FilterFactory.php | 28 +++++++++++++++ database/factories/LocationFactory.php | 23 ++++++++++++ database/factories/RequirementFactory.php | 24 +++++++++++++ database/factories/ResourceFactory.php | 29 +++++++++++++++ database/factories/TypeFactory.php | 23 ++++++++++++ database/factories/UserFactory.php | 27 ++++++-------- .../2014_10_12_000000_create_users_table.php | 4 +-- ...12_100000_create_password_resets_table.php | 4 +-- ..._08_19_000000_create_failed_jobs_table.php | 4 +-- ...01_create_personal_access_tokens_table.php | 7 ++-- .../2022_10_22_143859_create_types_table.php | 31 ++++++++++++++++ ...10_22_144011_create_requirements_table.php | 33 +++++++++++++++++ ...22_10_22_171337_create_locations_table.php | 31 ++++++++++++++++ ...2022_10_22_171338_create_filters_table.php | 36 +++++++++++++++++++ ...22_10_22_182303_create_resources_table.php | 36 +++++++++++++++++++ .../2022_10_30_130954_create_tests_table.php | 31 ++++++++++++++++ 23 files changed, 473 insertions(+), 26 deletions(-) create mode 100644 app/Models/Filter.php create mode 100644 app/Models/Location.php create mode 100644 app/Models/Requirement.php create mode 100644 app/Models/Resource.php create mode 100644 app/Models/Test.php create mode 100644 app/Models/Type.php create mode 100644 database/factories/FilterFactory.php create mode 100644 database/factories/LocationFactory.php create mode 100644 database/factories/RequirementFactory.php create mode 100644 database/factories/ResourceFactory.php create mode 100644 database/factories/TypeFactory.php create mode 100644 database/migrations/2022_10_22_143859_create_types_table.php create mode 100644 database/migrations/2022_10_22_144011_create_requirements_table.php create mode 100644 database/migrations/2022_10_22_171337_create_locations_table.php create mode 100644 database/migrations/2022_10_22_171338_create_filters_table.php create mode 100644 database/migrations/2022_10_22_182303_create_resources_table.php create mode 100644 database/migrations/2022_10_30_130954_create_tests_table.php diff --git a/.gitignore b/.gitignore index eb003b0..37cd3bd 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,36 @@ npm-debug.log yarn-error.log /.idea /.vscode + +### macOS ### +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +### macOS Patch ### +# iCloud generated files +*.icloud \ No newline at end of file diff --git a/app/Models/Filter.php b/app/Models/Filter.php new file mode 100644 index 0000000..68e7065 --- /dev/null +++ b/app/Models/Filter.php @@ -0,0 +1,24 @@ +belongsTo(Location::class); + } + public function requirement(){ + return $this->belongsTo(Requrement::class); + } + public function type(){ + return $this->belongsTo(Type::class); + } + public function resource(){ + return $this->hasMany(Resource::class); + } +} diff --git a/app/Models/Location.php b/app/Models/Location.php new file mode 100644 index 0000000..0b423b0 --- /dev/null +++ b/app/Models/Location.php @@ -0,0 +1,15 @@ +hasMany(Filter::class); + } +} diff --git a/app/Models/Requirement.php b/app/Models/Requirement.php new file mode 100644 index 0000000..7f2cf69 --- /dev/null +++ b/app/Models/Requirement.php @@ -0,0 +1,15 @@ +hasMany(Filter::class); + } +} diff --git a/app/Models/Resource.php b/app/Models/Resource.php new file mode 100644 index 0000000..097ea71 --- /dev/null +++ b/app/Models/Resource.php @@ -0,0 +1,15 @@ +belongsTo(Filter::class); + } +} diff --git a/app/Models/Test.php b/app/Models/Test.php new file mode 100644 index 0000000..9a9ae4e --- /dev/null +++ b/app/Models/Test.php @@ -0,0 +1,11 @@ +hasMany(Filter::class); + } +} diff --git a/database/factories/FilterFactory.php b/database/factories/FilterFactory.php new file mode 100644 index 0000000..c4d3a2a --- /dev/null +++ b/database/factories/FilterFactory.php @@ -0,0 +1,28 @@ + + */ +class FilterFactory extends Factory +{ + /** + * Define the model's default state. + * + * @return array + */ + public function definition() + { + return [ + 'cost' => random_int(1,100), + 'duration_in_months'=>random_int (1,100), + 'season_index'=>random_int(1,4), + 'location_id'=>Location::factory(), + 'type_id'=>Type::factory(), + 'requirement_id'=>Requirement::factory(), + ]; + } +} diff --git a/database/factories/LocationFactory.php b/database/factories/LocationFactory.php new file mode 100644 index 0000000..685c196 --- /dev/null +++ b/database/factories/LocationFactory.php @@ -0,0 +1,23 @@ + + */ +class LocationFactory extends Factory +{ + /** + * Define the model's default state. + * + * @return array + */ + public function definition() + { + return [ + 'location_name'=>fake()->city(), + ]; + } +} diff --git a/database/factories/RequirementFactory.php b/database/factories/RequirementFactory.php new file mode 100644 index 0000000..b22748b --- /dev/null +++ b/database/factories/RequirementFactory.php @@ -0,0 +1,24 @@ + + */ +class RequirementFactory extends Factory +{ + /** + * Define the model's default state. + * + * @return array + */ + public function definition() + { + return [ + 'age'=>random_int(1,100), + 'grade_level'=>random_int(1,12), + ]; + } +} diff --git a/database/factories/ResourceFactory.php b/database/factories/ResourceFactory.php new file mode 100644 index 0000000..44d9f86 --- /dev/null +++ b/database/factories/ResourceFactory.php @@ -0,0 +1,29 @@ + + */ +class ResourceFactory extends Factory +{ + /** + * Define the model's default state. + * + * @return array + */ + public function definition() + { + return [ + 'title'=>fake()->jobTitle(), + 'content'=>fake()->paragraph($nbSentences = 4, $variableNbSentences = true), + 'active'=>0, + 'created_at'=>fake()->dateTimeBetween($startDate = '-30 years', $endDate = 'now', $timezone = 'UTC'), + 'updated_at'=>fake()->dateTimeBetween($startDate = '-20 years', $endDate = 'now', $timezone = 'UTC'), + 'views_last_month'=>random_int(1,4000), + 'filter_id'=>Filter::factory(), + ]; + } +} diff --git a/database/factories/TypeFactory.php b/database/factories/TypeFactory.php new file mode 100644 index 0000000..df45e5f --- /dev/null +++ b/database/factories/TypeFactory.php @@ -0,0 +1,23 @@ + + */ +class TypeFactory extends Factory +{ + /** + * Define the model's default state. + * + * @return array + */ + public function definition() + { + return [ + 'type_name'=>fake()->catchPhrase(), + ]; + } +} diff --git a/database/factories/UserFactory.php b/database/factories/UserFactory.php index a24ce53..da6feab 100644 --- a/database/factories/UserFactory.php +++ b/database/factories/UserFactory.php @@ -2,29 +2,24 @@ namespace Database\Factories; -use App\Models\User; use Illuminate\Database\Eloquent\Factories\Factory; use Illuminate\Support\Str; +/** + * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\User> + */ class UserFactory extends Factory { - /** - * The name of the factory's corresponding model. - * - * @var string - */ - protected $model = User::class; - /** * Define the model's default state. * - * @return array + * @return array */ public function definition() { return [ - 'name' => $this->faker->name(), - 'email' => $this->faker->unique()->safeEmail(), + 'name' => fake()->name(), + 'email' => fake()->safeEmail(), 'email_verified_at' => now(), 'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password 'remember_token' => Str::random(10), @@ -34,14 +29,12 @@ public function definition() /** * Indicate that the model's email address should be unverified. * - * @return \Illuminate\Database\Eloquent\Factories\Factory + * @return static */ public function unverified() { - return $this->state(function (array $attributes) { - return [ - 'email_verified_at' => null, - ]; - }); + return $this->state(fn (array $attributes) => [ + 'email_verified_at' => null, + ]); } } diff --git a/database/migrations/2014_10_12_000000_create_users_table.php b/database/migrations/2014_10_12_000000_create_users_table.php index 621a24e..cf6b776 100644 --- a/database/migrations/2014_10_12_000000_create_users_table.php +++ b/database/migrations/2014_10_12_000000_create_users_table.php @@ -4,7 +4,7 @@ use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; -class CreateUsersTable extends Migration +return new class extends Migration { /** * Run the migrations. @@ -33,4 +33,4 @@ public function down() { Schema::dropIfExists('users'); } -} +}; diff --git a/database/migrations/2014_10_12_100000_create_password_resets_table.php b/database/migrations/2014_10_12_100000_create_password_resets_table.php index 0ee0a36..fcacb80 100644 --- a/database/migrations/2014_10_12_100000_create_password_resets_table.php +++ b/database/migrations/2014_10_12_100000_create_password_resets_table.php @@ -4,7 +4,7 @@ use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; -class CreatePasswordResetsTable extends Migration +return new class extends Migration { /** * Run the migrations. @@ -29,4 +29,4 @@ public function down() { Schema::dropIfExists('password_resets'); } -} +}; diff --git a/database/migrations/2019_08_19_000000_create_failed_jobs_table.php b/database/migrations/2019_08_19_000000_create_failed_jobs_table.php index 6aa6d74..1719198 100644 --- a/database/migrations/2019_08_19_000000_create_failed_jobs_table.php +++ b/database/migrations/2019_08_19_000000_create_failed_jobs_table.php @@ -4,7 +4,7 @@ use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; -class CreateFailedJobsTable extends Migration +return new class extends Migration { /** * Run the migrations. @@ -33,4 +33,4 @@ public function down() { Schema::dropIfExists('failed_jobs'); } -} +}; diff --git a/database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php b/database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php index 3ce0002..6c81fd2 100644 --- a/database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php +++ b/database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php @@ -4,7 +4,7 @@ use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; -class CreatePersonalAccessTokensTable extends Migration +return new class extends Migration { /** * Run the migrations. @@ -14,12 +14,13 @@ class CreatePersonalAccessTokensTable extends Migration public function up() { Schema::create('personal_access_tokens', function (Blueprint $table) { - $table->bigIncrements('id'); + $table->id(); $table->morphs('tokenable'); $table->string('name'); $table->string('token', 64)->unique(); $table->text('abilities')->nullable(); $table->timestamp('last_used_at')->nullable(); + $table->timestamp('expires_at')->nullable(); $table->timestamps(); }); } @@ -33,4 +34,4 @@ public function down() { Schema::dropIfExists('personal_access_tokens'); } -} +}; diff --git a/database/migrations/2022_10_22_143859_create_types_table.php b/database/migrations/2022_10_22_143859_create_types_table.php new file mode 100644 index 0000000..f0c330b --- /dev/null +++ b/database/migrations/2022_10_22_143859_create_types_table.php @@ -0,0 +1,31 @@ +id(); + $table->text('type_name'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('types'); + } +}; diff --git a/database/migrations/2022_10_22_144011_create_requirements_table.php b/database/migrations/2022_10_22_144011_create_requirements_table.php new file mode 100644 index 0000000..b0ced44 --- /dev/null +++ b/database/migrations/2022_10_22_144011_create_requirements_table.php @@ -0,0 +1,33 @@ +id(); + $table->integer('age'); + $table->integer('grade_level'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('requirements'); + } +}; diff --git a/database/migrations/2022_10_22_171337_create_locations_table.php b/database/migrations/2022_10_22_171337_create_locations_table.php new file mode 100644 index 0000000..3cacf22 --- /dev/null +++ b/database/migrations/2022_10_22_171337_create_locations_table.php @@ -0,0 +1,31 @@ +id(); + $table->text('location_name'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('locations'); + } +}; diff --git a/database/migrations/2022_10_22_171338_create_filters_table.php b/database/migrations/2022_10_22_171338_create_filters_table.php new file mode 100644 index 0000000..c2c05ec --- /dev/null +++ b/database/migrations/2022_10_22_171338_create_filters_table.php @@ -0,0 +1,36 @@ +id(); + $table->integer('cost'); + $table->integer('duration_in_months'); + $table->foreignID('location_id')->constrained('locations'); + $table->foreignID('type_id')->constrained('types'); + $table->foreignID('requirement_id')->constrained('requirements'); + $table->integer('season_index'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('filters'); + } +}; diff --git a/database/migrations/2022_10_22_182303_create_resources_table.php b/database/migrations/2022_10_22_182303_create_resources_table.php new file mode 100644 index 0000000..1479ec8 --- /dev/null +++ b/database/migrations/2022_10_22_182303_create_resources_table.php @@ -0,0 +1,36 @@ +id(); + $table->string('title'); + $table->foreignID('filter_id')->constrained('filters'); + $table->text('content'); + $table->boolean('active')->default(0); + $table->integer('views_last_month'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('resources'); + } +}; diff --git a/database/migrations/2022_10_30_130954_create_tests_table.php b/database/migrations/2022_10_30_130954_create_tests_table.php new file mode 100644 index 0000000..733cb34 --- /dev/null +++ b/database/migrations/2022_10_30_130954_create_tests_table.php @@ -0,0 +1,31 @@ +id(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('tests'); + } +}; From 541cfc9ea4eb9fe512d0a2ec2d666136bf41c066 Mon Sep 17 00:00:00 2001 From: SithLordAD Date: Sat, 11 Feb 2023 13:22:21 -0800 Subject: [PATCH 2/2] defined relationships in models, created factories, created seeders, created migrations --- app/Models/Filter.php | 13 +-- ...Requirement.php => FilterResourceType.php} | 6 +- app/Models/{Location.php => FilterValue.php} | 2 +- app/Models/Resource.php | 8 +- app/Models/ResourceResourceFooter.php | 19 ++++ app/Models/Test.php | 11 --- app/Models/Type.php | 15 --- database/factories/FilterFactory.php | 8 +- .../factories/FilterResourceTypesFactory.php | 24 +++++ ...tionFactory.php => FilterTypesFactory.php} | 6 +- ...entFactory.php => FilterValuesFactory.php} | 8 +- database/factories/FundingsFactory.php | 26 +++++ database/factories/InstitutionFactory.php | 25 +++++ database/factories/OpportunitiesFactory.php | 26 +++++ database/factories/ProgramsFactory.php | 26 +++++ database/factories/ResourceFactory.php | 29 ------ database/factories/ResourceFooterFactory.php | 24 +++++ .../ResourceResourceFootersFactory.php | 24 +++++ ...ypeFactory.php => ResourceTypeFactory.php} | 6 +- database/factories/ResourcesFactory.php | 28 ++++++ database/factories/UserFactory.php | 10 +- ...22_10_22_182303_create_resources_table.php | 36 ------- ...01_29_192104_create_institutions_table.php | 33 +++++++ ...29_192203_create_resource_types_table.php} | 8 +- ...23_01_29_192219_create_resources_table.php | 39 ++++++++ ..._192240_create_resource_footers_table.php} | 9 +- ...23_01_29_192241_create_programs_table.php} | 11 ++- ...023_01_29_192315_create_fundings_table.php | 34 +++++++ ...1_29_192331_create_opportunities_table.php | 34 +++++++ ...create_resource_resource_footers_table.php | 33 +++++++ ...1_29_192434_create_filter_types_table.php} | 8 +- ...023_01_29_192447_create_filters_table.php} | 11 +-- ...1_29_192502_create_filter_values_table.php | 33 +++++++ ...525_create_filter_resource_types_table.php | 33 +++++++ database/seeders/Filter.php | 19 ++++ database/seeders/FilterResourceTypes.php | 19 ++++ database/seeders/FilterTypes.php | 19 ++++ database/seeders/FilterValues.php | 19 ++++ database/seeders/Fundings.php | 19 ++++ database/seeders/Institution.php | 19 ++++ database/seeders/Programs.php | 19 ++++ database/seeders/ResourceFooter.php | 19 ++++ database/seeders/ResourceResourceFooters.php | 19 ++++ database/seeders/ResourceType.php | 19 ++++ database/seeders/Resources.php | 19 ++++ docker-compose.yml | 97 +++++++++++++++++++ 46 files changed, 821 insertions(+), 151 deletions(-) rename app/Models/{Requirement.php => FilterResourceType.php} (63%) rename app/Models/{Location.php => FilterValue.php} (87%) create mode 100644 app/Models/ResourceResourceFooter.php delete mode 100644 app/Models/Test.php delete mode 100644 app/Models/Type.php create mode 100644 database/factories/FilterResourceTypesFactory.php rename database/factories/{LocationFactory.php => FilterTypesFactory.php} (74%) rename database/factories/{RequirementFactory.php => FilterValuesFactory.php} (70%) create mode 100644 database/factories/FundingsFactory.php create mode 100644 database/factories/InstitutionFactory.php create mode 100644 database/factories/OpportunitiesFactory.php create mode 100644 database/factories/ProgramsFactory.php delete mode 100644 database/factories/ResourceFactory.php create mode 100644 database/factories/ResourceFooterFactory.php create mode 100644 database/factories/ResourceResourceFootersFactory.php rename database/factories/{TypeFactory.php => ResourceTypeFactory.php} (77%) create mode 100644 database/factories/ResourcesFactory.php delete mode 100644 database/migrations/2022_10_22_182303_create_resources_table.php create mode 100644 database/migrations/2023_01_29_192104_create_institutions_table.php rename database/migrations/{2022_10_22_171337_create_locations_table.php => 2023_01_29_192203_create_resource_types_table.php} (65%) create mode 100644 database/migrations/2023_01_29_192219_create_resources_table.php rename database/migrations/{2022_10_30_130954_create_tests_table.php => 2023_01_29_192240_create_resource_footers_table.php} (61%) rename database/migrations/{2022_10_22_144011_create_requirements_table.php => 2023_01_29_192241_create_programs_table.php} (61%) create mode 100644 database/migrations/2023_01_29_192315_create_fundings_table.php create mode 100644 database/migrations/2023_01_29_192331_create_opportunities_table.php create mode 100644 database/migrations/2023_01_29_192416_create_resource_resource_footers_table.php rename database/migrations/{2022_10_22_143859_create_types_table.php => 2023_01_29_192434_create_filter_types_table.php} (64%) rename database/migrations/{2022_10_22_171338_create_filters_table.php => 2023_01_29_192447_create_filters_table.php} (57%) create mode 100644 database/migrations/2023_01_29_192502_create_filter_values_table.php create mode 100644 database/migrations/2023_01_29_192525_create_filter_resource_types_table.php create mode 100644 database/seeders/Filter.php create mode 100644 database/seeders/FilterResourceTypes.php create mode 100644 database/seeders/FilterTypes.php create mode 100644 database/seeders/FilterValues.php create mode 100644 database/seeders/Fundings.php create mode 100644 database/seeders/Institution.php create mode 100644 database/seeders/Programs.php create mode 100644 database/seeders/ResourceFooter.php create mode 100644 database/seeders/ResourceResourceFooters.php create mode 100644 database/seeders/ResourceType.php create mode 100644 database/seeders/Resources.php create mode 100644 docker-compose.yml diff --git a/app/Models/Filter.php b/app/Models/Filter.php index 68e7065..aaa1f19 100644 --- a/app/Models/Filter.php +++ b/app/Models/Filter.php @@ -9,16 +9,7 @@ class Filter extends Model { use HasFactory; - public function location(){ - return $this->belongsTo(Location::class); - } - public function requirement(){ - return $this->belongsTo(Requrement::class); - } - public function type(){ - return $this->belongsTo(Type::class); - } - public function resource(){ - return $this->hasMany(Resource::class); + public function filterType(){ + return $this->belongsTo(FilterType::class); } } diff --git a/app/Models/Requirement.php b/app/Models/FilterResourceType.php similarity index 63% rename from app/Models/Requirement.php rename to app/Models/FilterResourceType.php index 7f2cf69..17f3200 100644 --- a/app/Models/Requirement.php +++ b/app/Models/FilterResourceType.php @@ -5,11 +5,15 @@ use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; -class Requirement extends Model +class FilterResourceType extends Model { use HasFactory; public function filter(){ return $this->hasMany(Filter::class); } + + public function resourceType(){ + return $this->hasMany(ResourceType::class); + } } diff --git a/app/Models/Location.php b/app/Models/FilterValue.php similarity index 87% rename from app/Models/Location.php rename to app/Models/FilterValue.php index 0b423b0..551ed71 100644 --- a/app/Models/Location.php +++ b/app/Models/FilterValue.php @@ -5,7 +5,7 @@ use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; -class Location extends Model +class FilterValue extends Model { use HasFactory; diff --git a/app/Models/Resource.php b/app/Models/Resource.php index 097ea71..d7044a8 100644 --- a/app/Models/Resource.php +++ b/app/Models/Resource.php @@ -9,7 +9,11 @@ class Resource extends Model { use HasFactory; - public function filter(){ - return $this->belongsTo(Filter::class); + public function institution(){ + return $this->belongsTo(Institution::class); + } + + public function resourceType(){ + return $this->belongsTo(ResourceType::class); } } diff --git a/app/Models/ResourceResourceFooter.php b/app/Models/ResourceResourceFooter.php new file mode 100644 index 0000000..d8e9f07 --- /dev/null +++ b/app/Models/ResourceResourceFooter.php @@ -0,0 +1,19 @@ +hasMany(Resource::class); + } + + public function resourceFooter(){ + return $this->hasOne(Resource::class); + } +} diff --git a/app/Models/Test.php b/app/Models/Test.php deleted file mode 100644 index 9a9ae4e..0000000 --- a/app/Models/Test.php +++ /dev/null @@ -1,11 +0,0 @@ -hasMany(Filter::class); - } -} diff --git a/database/factories/FilterFactory.php b/database/factories/FilterFactory.php index c4d3a2a..3c99b96 100644 --- a/database/factories/FilterFactory.php +++ b/database/factories/FilterFactory.php @@ -17,12 +17,8 @@ class FilterFactory extends Factory public function definition() { return [ - 'cost' => random_int(1,100), - 'duration_in_months'=>random_int (1,100), - 'season_index'=>random_int(1,4), - 'location_id'=>Location::factory(), - 'type_id'=>Type::factory(), - 'requirement_id'=>Requirement::factory(), + 'label'=>fake->text($maxNbChars = 50), + 'filter_type_id'=>FilterType::factory() ]; } } diff --git a/database/factories/FilterResourceTypesFactory.php b/database/factories/FilterResourceTypesFactory.php new file mode 100644 index 0000000..e1e6de3 --- /dev/null +++ b/database/factories/FilterResourceTypesFactory.php @@ -0,0 +1,24 @@ + + */ +class FilterResourceTypesFactory extends Factory +{ + /** + * Define the model's default state. + * + * @return array + */ + public function definition() + { + return [ + 'filter_id'=>Filter::factory(), + 'resource_type_id'=>ResourceType::factory() + ]; + } +} diff --git a/database/factories/LocationFactory.php b/database/factories/FilterTypesFactory.php similarity index 74% rename from database/factories/LocationFactory.php rename to database/factories/FilterTypesFactory.php index 685c196..1a34dd3 100644 --- a/database/factories/LocationFactory.php +++ b/database/factories/FilterTypesFactory.php @@ -5,9 +5,9 @@ use Illuminate\Database\Eloquent\Factories\Factory; /** - * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\location> + * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Model> */ -class LocationFactory extends Factory +class FilterTypesFactory extends Factory { /** * Define the model's default state. @@ -17,7 +17,7 @@ class LocationFactory extends Factory public function definition() { return [ - 'location_name'=>fake()->city(), + 'input_type'=>fake()->text($maxNbchars = 100) ]; } } diff --git a/database/factories/RequirementFactory.php b/database/factories/FilterValuesFactory.php similarity index 70% rename from database/factories/RequirementFactory.php rename to database/factories/FilterValuesFactory.php index b22748b..a4b70fa 100644 --- a/database/factories/RequirementFactory.php +++ b/database/factories/FilterValuesFactory.php @@ -5,9 +5,9 @@ use Illuminate\Database\Eloquent\Factories\Factory; /** - * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\requirement> + * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Model> */ -class RequirementFactory extends Factory +class FilterValuesFactory extends Factory { /** * Define the model's default state. @@ -17,8 +17,8 @@ class RequirementFactory extends Factory public function definition() { return [ - 'age'=>random_int(1,100), - 'grade_level'=>random_int(1,12), + 'value'=>text($maxNbChars = 50), + 'filter_id'=>Filter::factory() ]; } } diff --git a/database/factories/FundingsFactory.php b/database/factories/FundingsFactory.php new file mode 100644 index 0000000..7557529 --- /dev/null +++ b/database/factories/FundingsFactory.php @@ -0,0 +1,26 @@ + + */ +class FundingsFactory extends Factory +{ + /** + * Define the model's default state. + * + * @return array + */ + public function definition() + { + return [ + 'type'=>fake(), + 'eligibility'=>fake(), + 'application_deadline'=>"December 31, 2023", + 'highlight'=>fake()->text($maxNbChars = 1000) + ]; + } +} diff --git a/database/factories/InstitutionFactory.php b/database/factories/InstitutionFactory.php new file mode 100644 index 0000000..0efcc98 --- /dev/null +++ b/database/factories/InstitutionFactory.php @@ -0,0 +1,25 @@ + + */ +class InstitutionFactory extends Factory +{ + /** + * Define the model's default state. + * + * @return array + */ + public function definition() + { + return [ + 'name'=>fake()->company(), + 'icon'=>fake()->imageUrl($width = 640, $height = 480), + 'location'=>fake()->state() + ]; + } +} diff --git a/database/factories/OpportunitiesFactory.php b/database/factories/OpportunitiesFactory.php new file mode 100644 index 0000000..8bdaa82 --- /dev/null +++ b/database/factories/OpportunitiesFactory.php @@ -0,0 +1,26 @@ + + */ +class OpportunitiesFactory extends Factory +{ + /** + * Define the model's default state. + * + * @return array + */ + public function definition() + { + return [ + 'program_length'=>random_int(1,20), + 'admissions_requirements'=>fake()->text($maxNbChars = 200), + 'highlight'=>fake()->text($maxNbChars = 1000), + 'financial'=>fake()->text($maxNbChars = 100) + ]; + } +} diff --git a/database/factories/ProgramsFactory.php b/database/factories/ProgramsFactory.php new file mode 100644 index 0000000..f7ad530 --- /dev/null +++ b/database/factories/ProgramsFactory.php @@ -0,0 +1,26 @@ + + */ +class ProgramsFactory extends Factory +{ + /** + * Define the model's default state. + * + * @return array + */ + public function definition() + { + return [ + 'program_length'=>random_int(1,20), + 'location'=>address(), + 'highlight'=>fake()->text($maxNbChars = 1000), + 'cost'=>randomFloat($nbMaxDecimals = NULL, $min = 0, $max = NULL) + ]; + } +} diff --git a/database/factories/ResourceFactory.php b/database/factories/ResourceFactory.php deleted file mode 100644 index 44d9f86..0000000 --- a/database/factories/ResourceFactory.php +++ /dev/null @@ -1,29 +0,0 @@ - - */ -class ResourceFactory extends Factory -{ - /** - * Define the model's default state. - * - * @return array - */ - public function definition() - { - return [ - 'title'=>fake()->jobTitle(), - 'content'=>fake()->paragraph($nbSentences = 4, $variableNbSentences = true), - 'active'=>0, - 'created_at'=>fake()->dateTimeBetween($startDate = '-30 years', $endDate = 'now', $timezone = 'UTC'), - 'updated_at'=>fake()->dateTimeBetween($startDate = '-20 years', $endDate = 'now', $timezone = 'UTC'), - 'views_last_month'=>random_int(1,4000), - 'filter_id'=>Filter::factory(), - ]; - } -} diff --git a/database/factories/ResourceFooterFactory.php b/database/factories/ResourceFooterFactory.php new file mode 100644 index 0000000..096e0c5 --- /dev/null +++ b/database/factories/ResourceFooterFactory.php @@ -0,0 +1,24 @@ + + */ +class ResourceFooterFactory extends Factory +{ + /** + * Define the model's default state. + * + * @return array + */ + public function definition() + { + return [ + 'additional_info'=>fake()->text($maxNbChars = 200), + 'link'=>fake()->url() + ]; + } +} diff --git a/database/factories/ResourceResourceFootersFactory.php b/database/factories/ResourceResourceFootersFactory.php new file mode 100644 index 0000000..15d9923 --- /dev/null +++ b/database/factories/ResourceResourceFootersFactory.php @@ -0,0 +1,24 @@ + + */ +class ResourceResourceFootersFactory extends Factory +{ + /** + * Define the model's default state. + * + * @return array + */ + public function definition() + { + return [ + 'resource_id'=>Resource::factory(), + 'resource_footer_id'=>ResourceFooter::factory() + ]; + } +} diff --git a/database/factories/TypeFactory.php b/database/factories/ResourceTypeFactory.php similarity index 77% rename from database/factories/TypeFactory.php rename to database/factories/ResourceTypeFactory.php index df45e5f..7118ba4 100644 --- a/database/factories/TypeFactory.php +++ b/database/factories/ResourceTypeFactory.php @@ -5,9 +5,9 @@ use Illuminate\Database\Eloquent\Factories\Factory; /** - * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\type> + * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Model> */ -class TypeFactory extends Factory +class ResourceTypeFactory extends Factory { /** * Define the model's default state. @@ -17,7 +17,7 @@ class TypeFactory extends Factory public function definition() { return [ - 'type_name'=>fake()->catchPhrase(), + 'name'=>fake()->jobTitle() ]; } } diff --git a/database/factories/ResourcesFactory.php b/database/factories/ResourcesFactory.php new file mode 100644 index 0000000..a42ba63 --- /dev/null +++ b/database/factories/ResourcesFactory.php @@ -0,0 +1,28 @@ + + */ +class ResourcesFactory extends Factory +{ + /** + * Define the model's default state. + * + * @return array + */ + public function definition() + { + return [ + 'title'=>fake(), + 'content'=>text($maxNbChars = 1500), + 'status'=>random_int(0,1), + 'views_last_month'=>random_in(0,5000), + 'institution_id'=>Institution::factory(), + + ]; + } +} diff --git a/database/factories/UserFactory.php b/database/factories/UserFactory.php index da6feab..4970dfd 100644 --- a/database/factories/UserFactory.php +++ b/database/factories/UserFactory.php @@ -18,11 +18,11 @@ class UserFactory extends Factory public function definition() { return [ - 'name' => fake()->name(), - 'email' => fake()->safeEmail(), - 'email_verified_at' => now(), - 'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password - 'remember_token' => Str::random(10), + 'name'=>fake()->name(), + 'email'=>fake()->safeEmail(), + 'email_verified_at'=>now(), + 'password'=>'$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password + 'remember_token'=>Str::random(10), ]; } diff --git a/database/migrations/2022_10_22_182303_create_resources_table.php b/database/migrations/2022_10_22_182303_create_resources_table.php deleted file mode 100644 index 1479ec8..0000000 --- a/database/migrations/2022_10_22_182303_create_resources_table.php +++ /dev/null @@ -1,36 +0,0 @@ -id(); - $table->string('title'); - $table->foreignID('filter_id')->constrained('filters'); - $table->text('content'); - $table->boolean('active')->default(0); - $table->integer('views_last_month'); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::dropIfExists('resources'); - } -}; diff --git a/database/migrations/2023_01_29_192104_create_institutions_table.php b/database/migrations/2023_01_29_192104_create_institutions_table.php new file mode 100644 index 0000000..75f088b --- /dev/null +++ b/database/migrations/2023_01_29_192104_create_institutions_table.php @@ -0,0 +1,33 @@ +id()->autoIncrement()->primary(); + $table->string("name"); + $table->string("icon"); + $table->string("location"); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('institutions'); + } +}; diff --git a/database/migrations/2022_10_22_171337_create_locations_table.php b/database/migrations/2023_01_29_192203_create_resource_types_table.php similarity index 65% rename from database/migrations/2022_10_22_171337_create_locations_table.php rename to database/migrations/2023_01_29_192203_create_resource_types_table.php index 3cacf22..2bd3869 100644 --- a/database/migrations/2022_10_22_171337_create_locations_table.php +++ b/database/migrations/2023_01_29_192203_create_resource_types_table.php @@ -13,9 +13,9 @@ */ public function up() { - Schema::create('locations', function (Blueprint $table) { - $table->id(); - $table->text('location_name'); + Schema::create('resource_types', function (Blueprint $table) { + $table->id()->autoIncrement()->primary(); + $table->string("name")->unique(); }); } @@ -26,6 +26,6 @@ public function up() */ public function down() { - Schema::dropIfExists('locations'); + Schema::dropIfExists('resource_types'); } }; diff --git a/database/migrations/2023_01_29_192219_create_resources_table.php b/database/migrations/2023_01_29_192219_create_resources_table.php new file mode 100644 index 0000000..872e93d --- /dev/null +++ b/database/migrations/2023_01_29_192219_create_resources_table.php @@ -0,0 +1,39 @@ +id()->autoIncrement()->primary(); + $table->string("title")->nullable(); + $table->text("content"); + $table->boolean("status")->default(false); + $table->integer("views_last_month")->default(0); + $table->integer("institution_id"); + $table->integer("resourceable_id"); + $table->integer("resource_type_id"); + $table->foreign("institution_id")->constrained(); + $table->foreign("resource_type_id")->constrained(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('resources'); + } +}; diff --git a/database/migrations/2022_10_30_130954_create_tests_table.php b/database/migrations/2023_01_29_192240_create_resource_footers_table.php similarity index 61% rename from database/migrations/2022_10_30_130954_create_tests_table.php rename to database/migrations/2023_01_29_192240_create_resource_footers_table.php index 733cb34..80498c0 100644 --- a/database/migrations/2022_10_30_130954_create_tests_table.php +++ b/database/migrations/2023_01_29_192240_create_resource_footers_table.php @@ -13,9 +13,10 @@ */ public function up() { - Schema::create('tests', function (Blueprint $table) { - $table->id(); - $table->timestamps(); + Schema::create('resource_footers', function (Blueprint $table) { + $table->id()->autoIncrement()->primary(); + $table->string("additional_info"); + $table->string("link"); }); } @@ -26,6 +27,6 @@ public function up() */ public function down() { - Schema::dropIfExists('tests'); + Schema::dropIfExists('resource_footers'); } }; diff --git a/database/migrations/2022_10_22_144011_create_requirements_table.php b/database/migrations/2023_01_29_192241_create_programs_table.php similarity index 61% rename from database/migrations/2022_10_22_144011_create_requirements_table.php rename to database/migrations/2023_01_29_192241_create_programs_table.php index b0ced44..2cba06a 100644 --- a/database/migrations/2022_10_22_144011_create_requirements_table.php +++ b/database/migrations/2023_01_29_192241_create_programs_table.php @@ -13,11 +13,12 @@ */ public function up() { - Schema::create('requirements', function (Blueprint $table) { + Schema::create('programs', function (Blueprint $table) { $table->id(); - $table->integer('age'); - $table->integer('grade_level'); - $table->timestamps(); + $table->string("program_length"); + $table->string("location"); + $table->text("highlight"); + $table->unsignedDouble("cost"); }); } @@ -28,6 +29,6 @@ public function up() */ public function down() { - Schema::dropIfExists('requirements'); + Schema::dropIfExists('programs'); } }; diff --git a/database/migrations/2023_01_29_192315_create_fundings_table.php b/database/migrations/2023_01_29_192315_create_fundings_table.php new file mode 100644 index 0000000..8a6f249 --- /dev/null +++ b/database/migrations/2023_01_29_192315_create_fundings_table.php @@ -0,0 +1,34 @@ +id()->autoIncrement()->primary(); + $table->string("type"); + $table->string("eligibility"); + $table->string("application_deadline"); + $table->text("highlight"); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('fundings'); + } +}; diff --git a/database/migrations/2023_01_29_192331_create_opportunities_table.php b/database/migrations/2023_01_29_192331_create_opportunities_table.php new file mode 100644 index 0000000..e9fa50a --- /dev/null +++ b/database/migrations/2023_01_29_192331_create_opportunities_table.php @@ -0,0 +1,34 @@ +id()->autoIncrement()->primary(); + $table->string("program_length"); + $table->text("admissions_requirements"); + $table->text("highlight"); + $table->string("financial"); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('opportunities'); + } +}; diff --git a/database/migrations/2023_01_29_192416_create_resource_resource_footers_table.php b/database/migrations/2023_01_29_192416_create_resource_resource_footers_table.php new file mode 100644 index 0000000..acb1fa0 --- /dev/null +++ b/database/migrations/2023_01_29_192416_create_resource_resource_footers_table.php @@ -0,0 +1,33 @@ +integer("resource_id"); + $table->integer("resource_footer_id"); + $table->foreign("resource_id")->constrained(); + $table->foreign("resource_footer_id")->constrained(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('resource_resource_footers'); + } +}; diff --git a/database/migrations/2022_10_22_143859_create_types_table.php b/database/migrations/2023_01_29_192434_create_filter_types_table.php similarity index 64% rename from database/migrations/2022_10_22_143859_create_types_table.php rename to database/migrations/2023_01_29_192434_create_filter_types_table.php index f0c330b..7200dc9 100644 --- a/database/migrations/2022_10_22_143859_create_types_table.php +++ b/database/migrations/2023_01_29_192434_create_filter_types_table.php @@ -13,9 +13,9 @@ */ public function up() { - Schema::create('types', function (Blueprint $table) { - $table->id(); - $table->text('type_name'); + Schema::create('filter_types', function (Blueprint $table) { + $table->id()->autoIncrement()->primary(); + $table->string("input_type")->unique(); }); } @@ -26,6 +26,6 @@ public function up() */ public function down() { - Schema::dropIfExists('types'); + Schema::dropIfExists('filter_types'); } }; diff --git a/database/migrations/2022_10_22_171338_create_filters_table.php b/database/migrations/2023_01_29_192447_create_filters_table.php similarity index 57% rename from database/migrations/2022_10_22_171338_create_filters_table.php rename to database/migrations/2023_01_29_192447_create_filters_table.php index c2c05ec..f6cea25 100644 --- a/database/migrations/2022_10_22_171338_create_filters_table.php +++ b/database/migrations/2023_01_29_192447_create_filters_table.php @@ -14,13 +14,10 @@ public function up() { Schema::create('filters', function (Blueprint $table) { - $table->id(); - $table->integer('cost'); - $table->integer('duration_in_months'); - $table->foreignID('location_id')->constrained('locations'); - $table->foreignID('type_id')->constrained('types'); - $table->foreignID('requirement_id')->constrained('requirements'); - $table->integer('season_index'); + $table->id()->autoIncrement()->primary(); + $table->string("label"); + $table->integer("filter_type_id"); + $table->foreign("filter_type_id")->constrained(); }); } diff --git a/database/migrations/2023_01_29_192502_create_filter_values_table.php b/database/migrations/2023_01_29_192502_create_filter_values_table.php new file mode 100644 index 0000000..58e6a3c --- /dev/null +++ b/database/migrations/2023_01_29_192502_create_filter_values_table.php @@ -0,0 +1,33 @@ +id()->autoIncrement()->primary(); + $table->string("value"); + $table->integer("filter_id"); + $table->foreign("filter_id")->constrained(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('filter_values'); + } +}; diff --git a/database/migrations/2023_01_29_192525_create_filter_resource_types_table.php b/database/migrations/2023_01_29_192525_create_filter_resource_types_table.php new file mode 100644 index 0000000..e11ac81 --- /dev/null +++ b/database/migrations/2023_01_29_192525_create_filter_resource_types_table.php @@ -0,0 +1,33 @@ +integer("filter_id"); + $table->integer("resource_type_id"); + $table->foreign("filter_id")->constrained(); + $table->foreign("resource_type_id")->contrained(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('filter_resource_types'); + } +}; diff --git a/database/seeders/Filter.php b/database/seeders/Filter.php new file mode 100644 index 0000000..5bc81e1 --- /dev/null +++ b/database/seeders/Filter.php @@ -0,0 +1,19 @@ +create(); + } +} diff --git a/database/seeders/FilterResourceTypes.php b/database/seeders/FilterResourceTypes.php new file mode 100644 index 0000000..26d48c8 --- /dev/null +++ b/database/seeders/FilterResourceTypes.php @@ -0,0 +1,19 @@ +create(); + } +} diff --git a/database/seeders/FilterTypes.php b/database/seeders/FilterTypes.php new file mode 100644 index 0000000..c151983 --- /dev/null +++ b/database/seeders/FilterTypes.php @@ -0,0 +1,19 @@ +create(); + } +} diff --git a/database/seeders/FilterValues.php b/database/seeders/FilterValues.php new file mode 100644 index 0000000..1ad99dd --- /dev/null +++ b/database/seeders/FilterValues.php @@ -0,0 +1,19 @@ +create(); + } +} diff --git a/database/seeders/Fundings.php b/database/seeders/Fundings.php new file mode 100644 index 0000000..ca16e28 --- /dev/null +++ b/database/seeders/Fundings.php @@ -0,0 +1,19 @@ +create(); + } +} diff --git a/database/seeders/Institution.php b/database/seeders/Institution.php new file mode 100644 index 0000000..a18b77a --- /dev/null +++ b/database/seeders/Institution.php @@ -0,0 +1,19 @@ +create(); + } +} diff --git a/database/seeders/Programs.php b/database/seeders/Programs.php new file mode 100644 index 0000000..2831e3c --- /dev/null +++ b/database/seeders/Programs.php @@ -0,0 +1,19 @@ +create(); + } +} diff --git a/database/seeders/ResourceFooter.php b/database/seeders/ResourceFooter.php new file mode 100644 index 0000000..6caead1 --- /dev/null +++ b/database/seeders/ResourceFooter.php @@ -0,0 +1,19 @@ +create(); + } +} diff --git a/database/seeders/ResourceResourceFooters.php b/database/seeders/ResourceResourceFooters.php new file mode 100644 index 0000000..b43b507 --- /dev/null +++ b/database/seeders/ResourceResourceFooters.php @@ -0,0 +1,19 @@ +create(); + } +} diff --git a/database/seeders/ResourceType.php b/database/seeders/ResourceType.php new file mode 100644 index 0000000..4c5581f --- /dev/null +++ b/database/seeders/ResourceType.php @@ -0,0 +1,19 @@ +create(); + } +} diff --git a/database/seeders/Resources.php b/database/seeders/Resources.php new file mode 100644 index 0000000..df2e675 --- /dev/null +++ b/database/seeders/Resources.php @@ -0,0 +1,19 @@ +create(); + } +} diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..794d53a --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,97 @@ +# For more information: https://laravel.com/docs/sail +version: '3' +services: + laravel.test: + build: + context: ./vendor/laravel/sail/runtimes/8.1 + dockerfile: Dockerfile + args: + WWWGROUP: '${WWWGROUP}' + image: sail-8.1/app + extra_hosts: + - 'host.docker.internal:host-gateway' + ports: + - '${APP_PORT:-80}:80' + - '${VITE_PORT:-5173}:${VITE_PORT:-5173}' + environment: + WWWUSER: '${WWWUSER}' + LARAVEL_SAIL: 1 + XDEBUG_MODE: '${SAIL_XDEBUG_MODE:-off}' + XDEBUG_CONFIG: '${SAIL_XDEBUG_CONFIG:-client_host=host.docker.internal}' + volumes: + - '.:/var/www/html' + networks: + - sail + depends_on: + - mysql + - redis + - meilisearch + - mailhog + - selenium + mysql: + image: 'mysql/mysql-server:8.0' + ports: + - '${FORWARD_DB_PORT:-3306}:3306' + environment: + MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}' + MYSQL_ROOT_HOST: "%" + MYSQL_DATABASE: '${DB_DATABASE}' + MYSQL_USER: '${DB_USERNAME}' + MYSQL_PASSWORD: '${DB_PASSWORD}' + MYSQL_ALLOW_EMPTY_PASSWORD: 1 + volumes: + - 'sail-mysql:/var/lib/mysql' + - './vendor/laravel/sail/database/mysql/create-testing-database.sh:/docker-entrypoint-initdb.d/10-create-testing-database.sh' + networks: + - sail + healthcheck: + test: ["CMD", "mysqladmin", "ping", "-p${DB_PASSWORD}"] + retries: 3 + timeout: 5s + redis: + image: 'redis:alpine' + ports: + - '${FORWARD_REDIS_PORT:-6379}:6379' + volumes: + - 'sail-redis:/data' + networks: + - sail + healthcheck: + test: ["CMD", "redis-cli", "ping"] + retries: 3 + timeout: 5s + meilisearch: + image: 'getmeili/meilisearch:latest' + ports: + - '${FORWARD_MEILISEARCH_PORT:-7700}:7700' + volumes: + - 'sail-meilisearch:/meili_data' + networks: + - sail + healthcheck: + test: ["CMD", "wget", "--no-verbose", "--spider", "http://localhost:7700/health"] + retries: 3 + timeout: 5s + mailhog: + image: 'mailhog/mailhog:latest' + ports: + - '${FORWARD_MAILHOG_PORT:-1025}:1025' + - '${FORWARD_MAILHOG_DASHBOARD_PORT:-8025}:8025' + networks: + - sail + selenium: + image: 'selenium/standalone-chrome' + volumes: + - '/dev/shm:/dev/shm' + networks: + - sail +networks: + sail: + driver: bridge +volumes: + sail-mysql: + driver: local + sail-redis: + driver: local + sail-meilisearch: + driver: local