diff --git a/app/Models/Bike.php b/app/Models/Bike.php new file mode 100644 index 0000000000000000000000000000000000000000..05c406f1ad5065fdd508355e34404aa34f5746ac --- /dev/null +++ b/app/Models/Bike.php @@ -0,0 +1,29 @@ +<?php + +namespace App\Models; + +use Illuminate\Database\Eloquent\Factories\HasFactory; +use Illuminate\Database\Eloquent\Model; +use Illuminate\Database\Eloquent\Relations\BelongsTo; +use Illuminate\Database\Eloquent\Relations\HasMany; + +/** + * @method static create(array $array) + */ +class Bike extends Model +{ + use HasFactory; + + protected $fillable = [ + 'stop_id', + 'unlocked', + ]; + + public function stop(): BelongsTo{ + return $this->belongsTo(Stop::class); + } + + public function routes(): HasMany{ + return $this->hasMany(Route::class); + } +} diff --git a/app/Models/ElectricBike.php b/app/Models/ElectricBike.php new file mode 100644 index 0000000000000000000000000000000000000000..8991516c9ecc90fa3e9b6aee3eec9e8241a4c42e --- /dev/null +++ b/app/Models/ElectricBike.php @@ -0,0 +1,17 @@ +<?php + +namespace App\Models; + +use Illuminate\Database\Eloquent\Factories\HasFactory; +use Illuminate\Database\Eloquent\Model; + +class ElectricBike extends Bike +{ + use HasFactory; + protected $table = 'electric_bikes'; + + protected $fillable = [ + 'id', + 'battery', + ]; +} diff --git a/app/Models/Reward.php b/app/Models/Reward.php new file mode 100644 index 0000000000000000000000000000000000000000..3b40b1923ef096321fe69d667b3787dc7775a995 --- /dev/null +++ b/app/Models/Reward.php @@ -0,0 +1,26 @@ +<?php + +namespace App\Models; + +use Illuminate\Database\Eloquent\Factories\HasFactory; +use Illuminate\Database\Eloquent\Model; +use Illuminate\Database\Eloquent\Relations\BelongsToMany; + +/** + * @method static create(array $array) + */ +class Reward extends Model +{ + use HasFactory; + + protected $fillable = [ + 'title', + 'description', + 'user_id', + 'reward_id', + ]; + + public function users(): BelongsToMany{ + return $this->belongsToMany(User::class, 'user_reward')->withTimestamps(); + } +} diff --git a/app/Models/Route.php b/app/Models/Route.php new file mode 100644 index 0000000000000000000000000000000000000000..987300d4f49784fd77de0ebeaee262d4367febb0 --- /dev/null +++ b/app/Models/Route.php @@ -0,0 +1,38 @@ +<?php + +namespace App\Models; + +use Illuminate\Database\Eloquent\Factories\HasFactory; +use Illuminate\Database\Eloquent\Model; +use Illuminate\Database\Eloquent\Relations\BelongsTo; + +class Route extends Model +{ + use HasFactory; + + protected $fillable = [ + "user_id", + "initial_stop_id", + "final_stop_id", + "bike_id", + "distance", + "duration", + "points", + ]; + + public function user(): BelongsTo{ + return $this->belongsTo(Route::class); + } + + public function start(): BelongsTo{ + return $this->belongsTo(Stop::class,'initial_stop_id'); + } + + public function end(): BelongsTo{ + return $this->belongsTo(Stop::class, "final_stop_id"); + } + + public function bike(): BelongsTo{ + return $this->belongsTo(Bike::class); + } +} diff --git a/app/Models/Stop.php b/app/Models/Stop.php new file mode 100644 index 0000000000000000000000000000000000000000..2a256761eadb23783b69fb544495495482c5101b --- /dev/null +++ b/app/Models/Stop.php @@ -0,0 +1,37 @@ +<?php + +namespace App\Models; + +use Illuminate\Database\Eloquent\Factories\HasFactory; +use Illuminate\Database\Eloquent\Model; +use Illuminate\Database\Eloquent\Relations\HasMany; + +/** + * @method static create(array $array) + */ +class Stop extends Model +{ + use HasFactory; + + protected $fillable = [ + "lng", + "lat", + "address", + "total_spaces" + ]; + + public function bikes(): HasMany{ + return $this->hasMany(Bike::class); + } + + public function routes(): HasMany{ + return $this->hasMany(Route::class); + } + + public function routesStart(): HasMany{ + return $this->hasMany(Route::class, "initial_stop_id"); + } + public function routesEnd(): HasMany{ + return $this->hasMany(Route::class, "final_stop_id"); + } +} diff --git a/app/Models/User.php b/app/Models/User.php index 89963686eb21407d17eea9a5871d88658ff32d2b..aea9982747212ebf54344dcd3e3e63624f17e195 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -4,10 +4,15 @@ namespace App\Models; use Illuminate\Contracts\Auth\MustVerifyEmail; use Illuminate\Database\Eloquent\Factories\HasFactory; +use Illuminate\Database\Eloquent\Relations\BelongsToMany; +use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Laravel\Sanctum\HasApiTokens; +/** + * @method static create(string[] $array) + */ class User extends Authenticatable { use HasApiTokens, HasFactory, Notifiable; @@ -41,4 +46,12 @@ class User extends Authenticatable protected $casts = [ 'email_verified_at' => 'datetime', ]; + + public function routes(): HasMany{ + return $this->hasMany(Route::class); + } + + public function rewards(): BelongsToMany{ + return $this->belongsToMany(Reward::class, 'user_reward')->withTimestamps(); + } } diff --git a/database/factories/BikeFactory.php b/database/factories/BikeFactory.php new file mode 100644 index 0000000000000000000000000000000000000000..12ae306c4d54dc0b9168f5f7dfca381dd7b5a9d7 --- /dev/null +++ b/database/factories/BikeFactory.php @@ -0,0 +1,22 @@ +<?php + +namespace Database\Factories; + +use Illuminate\Database\Eloquent\Factories\Factory; + +/** + * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Bike> + */ +class BikeFactory extends Factory +{ + /** + * Define the model's default state. + * + * @return array<string, mixed> + */ + public function definition() + { + return [ + ]; + } +} diff --git a/database/factories/RewardFactory.php b/database/factories/RewardFactory.php new file mode 100644 index 0000000000000000000000000000000000000000..59512b6f56594fa9b882a2442a79ae649efdf113 --- /dev/null +++ b/database/factories/RewardFactory.php @@ -0,0 +1,23 @@ +<?php + +namespace Database\Factories; + +use Illuminate\Database\Eloquent\Factories\Factory; + +/** + * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Reward> + */ +class RewardFactory extends Factory +{ + /** + * Define the model's default state. + * + * @return array<string, mixed> + */ + public function definition() + { + return [ + // + ]; + } +} diff --git a/database/factories/StopFactory.php b/database/factories/StopFactory.php new file mode 100644 index 0000000000000000000000000000000000000000..64c002db49ede211104b71a1810b6e1085103305 --- /dev/null +++ b/database/factories/StopFactory.php @@ -0,0 +1,26 @@ +<?php + +namespace Database\Factories; + +use Illuminate\Database\Eloquent\Factories\Factory; + +/** + * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Stop> + */ +class StopFactory extends Factory +{ + /** + * Define the model's default state. + * + * @return array<string, mixed> + */ + public function definition() + { + return [ + 'lng' => $this->faker->longitude, + 'lat' => $this->faker->latitude, + 'address' => $this->faker->address, + 'total_spaces' => 10, + ]; + } +} diff --git a/database/migrations/2022_06_13_141748_create_stops_table.php b/database/migrations/2022_06_13_141748_create_stops_table.php new file mode 100644 index 0000000000000000000000000000000000000000..aaae4947d33c64596ea06602269abd20c86c56ba --- /dev/null +++ b/database/migrations/2022_06_13_141748_create_stops_table.php @@ -0,0 +1,35 @@ +<?php + +use Illuminate\Database\Migrations\Migration; +use Illuminate\Database\Schema\Blueprint; +use Illuminate\Support\Facades\Schema; + +return new class extends Migration +{ + /** + * Run the migrations. + * + * @return void + */ + public function up() + { + Schema::create('stops', function (Blueprint $table) { + $table->id(); + $table->double("lng"); + $table->double("lat"); + $table->string("address"); + $table->integer("total_spaces"); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('stops'); + } +}; diff --git a/database/migrations/2022_06_13_151027_create_bikes_table.php b/database/migrations/2022_06_13_151027_create_bikes_table.php new file mode 100644 index 0000000000000000000000000000000000000000..705aadf3aab4c15459a871baf8f83029d9027fd8 --- /dev/null +++ b/database/migrations/2022_06_13_151027_create_bikes_table.php @@ -0,0 +1,36 @@ +<?php + +use Illuminate\Database\Migrations\Migration; +use Illuminate\Database\Schema\Blueprint; +use Illuminate\Support\Facades\Schema; + +return new class extends Migration +{ + /** + * Run the migrations. + * + * @return void + */ + public function up() + { + Schema::create('bikes', function (Blueprint $table) { + $table->id(); + $table->foreignId('stop_id') + ->index() + ->constrained() + ->cascadeOnUpdate(); + $table->boolean('unlocked'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('bikes'); + } +}; diff --git a/database/migrations/2022_06_13_153838_create_electric_bikes_table.php b/database/migrations/2022_06_13_153838_create_electric_bikes_table.php new file mode 100644 index 0000000000000000000000000000000000000000..db6b5b73b5caf8e379b40e3ae2d58610f49de036 --- /dev/null +++ b/database/migrations/2022_06_13_153838_create_electric_bikes_table.php @@ -0,0 +1,34 @@ +<?php + +use Illuminate\Database\Migrations\Migration; +use Illuminate\Database\Schema\Blueprint; +use Illuminate\Support\Facades\Schema; + +return new class extends Migration +{ + /** + * Run the migrations. + * + * @return void + */ + public function up() + { + Schema::create('electric_bikes', function (Blueprint $table) { + $table->id(); + $table->integer('battery'); + $table->timestamps(); + + $table->foreign('id')->references('id')->on('bikes'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('electric_bikes'); + } +}; diff --git a/database/migrations/2022_06_14_151011_create_routes_table.php b/database/migrations/2022_06_14_151011_create_routes_table.php new file mode 100644 index 0000000000000000000000000000000000000000..51d6e35c0c2649c5fa6426286baeef6404e100b9 --- /dev/null +++ b/database/migrations/2022_06_14_151011_create_routes_table.php @@ -0,0 +1,69 @@ +<?php + +use Illuminate\Database\Migrations\Migration; +use Illuminate\Database\Schema\Blueprint; +use Illuminate\Support\Facades\Schema; + +return new class extends Migration +{ + /** + * Run the migrations. + * + * @return void + */ + public function up() + { + Schema::create('routes', function (Blueprint $table) { + $table->id(); + $table->foreignId('user_id') + ->index() + ->constrained() + ->cascadeOnUpdate() + ->cascadeOnDelete(); + + $table->bigInteger('initial_stop_id') + ->index(); + $table->foreign('initial_stop_id') + ->references('id') + ->on('stops') + ->onUpdate('cascade') + ->onDelete('cascade'); + + $table->bigInteger('final_stop_id') + ->index() + ->nullable(); + $table->foreign('final_stop_id') + ->references('id') + ->on('stops') + ->onUpdate('cascade') + ->onDelete('cascade'); + + $table->foreignId('bike_id') + ->index() + ->constrained() + ->cascadeOnUpdate() + ->cascadeOnDelete(); + + $table->integer('distance') + ->nullable(); + $table->integer('duration') + ->nullable(); + $table->integer('points') + ->nullable(); + + $table->json('mapbox_response') + ->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('routes'); + } +}; diff --git a/database/migrations/2022_06_15_144408_create_rewards_table.php b/database/migrations/2022_06_15_144408_create_rewards_table.php new file mode 100644 index 0000000000000000000000000000000000000000..deebdc13d82e5969780f3d6271f280245a308ef3 --- /dev/null +++ b/database/migrations/2022_06_15_144408_create_rewards_table.php @@ -0,0 +1,50 @@ +<?php + +use Illuminate\Database\Migrations\Migration; +use Illuminate\Database\Schema\Blueprint; +use Illuminate\Support\Facades\Schema; + +return new class extends Migration +{ + /** + * Run the migrations. + * + * @return void + */ + public function up() + { + Schema::create('rewards', function (Blueprint $table) { + $table->id(); + $table->string('name'); + $table->string('description'); + $table->integer('points'); + $table->integer('total_available'); + $table->string('image')->nullable(); + $table->timestamps(); + }); + + Schema::create('user_reward', function (Blueprint $table){ + $table->id(); + $table->foreignId('user_id') + ->constrained() + ->cascadeOnUpdate() + ->cascadeOnDelete(); + $table->foreignId('reward_id') + ->constrained() + ->cascadeOnUpdate() + ->cascadeOnDelete(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('rewards'); + Schema::dropIfExists('user_reward'); + } +}; diff --git a/database/seeders/BikeSeeder.php b/database/seeders/BikeSeeder.php new file mode 100644 index 0000000000000000000000000000000000000000..22543e813c4b525d15a0c86a0ebe286d7772b4ad --- /dev/null +++ b/database/seeders/BikeSeeder.php @@ -0,0 +1,46 @@ +<?php + +namespace Database\Seeders; + +use App\Models\Bike; +use App\Models\ElectricBike; +use Illuminate\Database\Console\Seeds\WithoutModelEvents; +use Illuminate\Database\Seeder; + +class BikeSeeder extends Seeder +{ + /** + * Run the database seeds. + * + * @return void + */ + public function run() + { + $bike = Bike::create([ + 'stop_id' => 1, + 'unlocked' => false + ]); + ElectricBike::create([ + 'id' => $bike->id, + 'battery' => 60 + ]); + Bike::create([ + 'stop_id' => 1, + 'unlocked' => false + ]); + + $bike = Bike::create([ + 'stop_id' => 2, + 'unlocked' => false + ]); + ElectricBike::create([ + 'id' => $bike->id, + 'battery' => 70 + ]); + + Bike::create([ + 'stop_id' => 3, + 'unlocked' => false + ]); + } +} diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index c1c48a060cf65c15925509e53589835c3bf451d2..88eb4f82d9539a3796eb81912a5ec7801696392d 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -14,11 +14,10 @@ class DatabaseSeeder extends Seeder */ public function run() { - // \App\Models\User::factory(10)->create(); - - // \App\Models\User::factory()->create([ - // 'name' => 'Test User', - // 'email' => 'test@example.com', - // ]); + $this->call(UserSeeder::class); + $this->call(StopSeeder::class); + $this->call(BikeSeeder::class); + $this->call(RouteSeeder::class); + $this->call(RewardSeeder::class); } } diff --git a/database/seeders/ElectricBikeSeeder.php b/database/seeders/ElectricBikeSeeder.php new file mode 100644 index 0000000000000000000000000000000000000000..b61929b2d9ce96cecbf7e97319d55abf0cd65790 --- /dev/null +++ b/database/seeders/ElectricBikeSeeder.php @@ -0,0 +1,19 @@ +<?php + +namespace Database\Seeders; + +use Illuminate\Database\Console\Seeds\WithoutModelEvents; +use Illuminate\Database\Seeder; + +class ElectricBikeSeeder extends Seeder +{ + /** + * Run the database seeds. + * + * @return void + */ + public function run() + { + // + } +} diff --git a/database/seeders/RewardSeeder.php b/database/seeders/RewardSeeder.php new file mode 100644 index 0000000000000000000000000000000000000000..54727890906059adbb61c5bb1d395b618cfb5ee2 --- /dev/null +++ b/database/seeders/RewardSeeder.php @@ -0,0 +1,51 @@ +<?php + +namespace Database\Seeders; + +use App\Models\Reward; +use Illuminate\Database\Console\Seeds\WithoutModelEvents; +use Illuminate\Database\Seeder; + +class RewardSeeder extends Seeder +{ + /** + * Run the database seeds. + * + * @return void + */ + public function run() + { + $reward = Reward::create([ + 'name' => 'Reward 1', + 'description' => 'A short description', + 'points' => 100, + 'total_available' => 5 + ]); + $reward->users()->sync([1,2]); + $reward = Reward::create([ + 'name' => 'Reward 2', + 'description' => 'A short description 2', + 'points' => 200, + 'total_available' => 2 + ]); + $reward->users()->sync([1]); + Reward::create([ + 'name' => 'Reward 3', + 'description' => 'A short description 3', + 'points' => 1000, + 'total_available' => 1 + ]); + Reward::create([ + 'name' => 'Reward 4', + 'description' => 'A short description 4', + 'points' => 4, + 'total_available' => 10 + ]); + Reward::create([ + 'name' => 'Reward 5', + 'description' => 'A short description 5', + 'points' => 500, + 'total_available' => 5 + ]); + } +} diff --git a/database/seeders/RouteSeeder.php b/database/seeders/RouteSeeder.php new file mode 100644 index 0000000000000000000000000000000000000000..e1fd5f2775c38986c39c1f445ef6c7cc6e9db5eb --- /dev/null +++ b/database/seeders/RouteSeeder.php @@ -0,0 +1,29 @@ +<?php + +namespace Database\Seeders; + +use App\Models\Route; +use Illuminate\Database\Console\Seeds\WithoutModelEvents; +use Illuminate\Database\Seeder; + +class RouteSeeder extends Seeder +{ + /** + * Run the database seeds. + * + * @return void + */ + public function run() + { + Route::create([ + "user_id" => 1, + "initial_stop_id" => 1, + "final_stop_id" => 2, + "bike_id" => 1, + "distance" => 500, + "duration" => 1000, + "points" => 100, + "mapbox_response" => '{"routes":[{"geometry":{"coordinates":[[-4.730855,41.653319],[-4.731204,41.653354],[-4.731172,41.653568],[-4.729951,41.653454],[-4.725932,41.652181],[-4.726006,41.652131],[-4.726499,41.65228]],"type":"LineString"},"legs":[{"summary":"","weight":328,"duration":298,"steps":[],"distance":571.6}],"weight_name":"cyclability","weight":328,"duration":298,"distance":571.6}],"waypoints":[{"distance":0.33309312638707467,"name":"","location":[-4.730855,41.653319]},{"distance":1.4233601888820147,"name":"Plaza de la Fuente Dorada","location":[-4.726499,41.65228]}],"code":"Ok","uuid":"34oyDWtItbRpJKZb00E5_J2jmiJlWLfQagPHfulbhv5_2m0FkCUA0g=="}' + ]); + } +} diff --git a/database/seeders/StopSeeder.php b/database/seeders/StopSeeder.php new file mode 100644 index 0000000000000000000000000000000000000000..a38b399028ff2cb187baf8fa9144613220d044bb --- /dev/null +++ b/database/seeders/StopSeeder.php @@ -0,0 +1,44 @@ +<?php + +namespace Database\Seeders; + +use App\Models\Bike; +use App\Models\Stop; +use Illuminate\Database\Console\Seeds\WithoutModelEvents; +use Illuminate\Database\Seeder; + +class StopSeeder extends Seeder +{ + /** + * Run the database seeds. + * + * @return void + */ + public function run() + { + Stop::create([ + "lng"=> -4.731, + "lat"=> 41.653, + "address"=> "Plaza de Poniente", + "total_spaces"=> 10, + ]); + Stop::create([ + "lng"=> -4.726, + "lat"=> 41.652, + "address"=> "Plaza de Fuente Dorada", + "total_spaces"=> 10, + ]); + Stop::create([ + "lng"=> -4.725, + "lat"=> 41.648, + "address"=> "Plaza Madrid", + "total_spaces"=> 10, + ]); + Stop::create([ + "lng"=> -4.729, + "lat"=> 41.647, + "address"=> "Plaza Zorrilla", + "total_spaces"=> 10, + ]); + } +} diff --git a/database/seeders/UserSeeder.php b/database/seeders/UserSeeder.php new file mode 100644 index 0000000000000000000000000000000000000000..53bc2192f850407e3505cc0871960cb70735c872 --- /dev/null +++ b/database/seeders/UserSeeder.php @@ -0,0 +1,29 @@ +<?php + +namespace Database\Seeders; + +use App\Models\User; +use Illuminate\Database\Console\Seeds\WithoutModelEvents; +use Illuminate\Database\Seeder; + +class UserSeeder extends Seeder +{ + /** + * Run the database seeds. + * + * @return void + */ + public function run() + { + User::create([ + 'name' => 'Jorge', + 'email' => 'jorge@uva.es', + 'password' => '12345678' + ]); + User::create([ + 'name' => 'Mario', + 'email' => 'mario@uva.es', + 'password' => '12345678' + ]); + } +}