It includes seeds and factories to make testing the UI easier, and the order of migrations needed to be changed to prevent conflicts.tags/v0.1.0
@@ -0,0 +1,25 @@ | |||||
<?php | |||||
namespace App\Models; | |||||
use Illuminate\Database\Eloquent\Factories\HasFactory; | |||||
use Illuminate\Database\Eloquent\Model; | |||||
use App\Models\User; | |||||
use App\Models\Service; | |||||
class Order extends Model | |||||
{ | |||||
use HasFactory; | |||||
protected $fillable = [ | |||||
'quantity' | |||||
]; | |||||
public function service() { | |||||
return $this->belongsTo(Service::class); | |||||
} | |||||
public function user() { | |||||
return $this->belongsTo(User::class); | |||||
} | |||||
} |
@@ -0,0 +1,21 @@ | |||||
<?php | |||||
namespace App\Models; | |||||
use Illuminate\Database\Eloquent\Factories\HasFactory; | |||||
use Illuminate\Database\Eloquent\Model; | |||||
use App\Models\Order; | |||||
class Service extends Model | |||||
{ | |||||
use HasFactory; | |||||
protected $fillable = [ | |||||
'name', 'type', 'site', 'available' | |||||
]; | |||||
public function order() { | |||||
return $this->hasMany(Order::class); | |||||
} | |||||
} |
@@ -6,6 +6,7 @@ use Illuminate\Contracts\Auth\MustVerifyEmail; | |||||
use Illuminate\Database\Eloquent\Factories\HasFactory; | use Illuminate\Database\Eloquent\Factories\HasFactory; | ||||
use Illuminate\Foundation\Auth\User as Authenticatable; | use Illuminate\Foundation\Auth\User as Authenticatable; | ||||
use Illuminate\Notifications\Notifiable; | use Illuminate\Notifications\Notifiable; | ||||
use App\Models\Order; | |||||
class User extends Authenticatable implements MustVerifyEmail | class User extends Authenticatable implements MustVerifyEmail | ||||
{ | { | ||||
@@ -40,4 +41,8 @@ class User extends Authenticatable implements MustVerifyEmail | |||||
protected $casts = [ | protected $casts = [ | ||||
'email_verified_at' => 'datetime', | 'email_verified_at' => 'datetime', | ||||
]; | ]; | ||||
public function orders() { | |||||
return $this->hasMany(Order::class); | |||||
} | |||||
} | } |
@@ -0,0 +1,38 @@ | |||||
<?php | |||||
namespace Database\Factories; | |||||
use App\Models\Order; | |||||
use App\Models\User; | |||||
use App\Models\Service; | |||||
use Illuminate\Database\Eloquent\Factories\Factory; | |||||
use Illuminate\Support\Facades\Log; | |||||
class OrderFactory extends Factory | |||||
{ | |||||
/** | |||||
* The name of the factory's corresponding model. | |||||
* | |||||
* @var string | |||||
*/ | |||||
protected $model = Order::class; | |||||
/** | |||||
* Define the model's default state. | |||||
* | |||||
* @return array | |||||
*/ | |||||
public function definition() | |||||
{ | |||||
return [ | |||||
'quantity' => $this->faker->randomNumber(4, false), | |||||
'service_id' => function() { | |||||
return Service::inRandomOrder()->first()->id; | |||||
}, | |||||
'user_id' => function() { | |||||
return User::inRandomOrder()->first()->id; | |||||
}, | |||||
]; | |||||
} | |||||
} |
@@ -0,0 +1,37 @@ | |||||
<?php | |||||
use Illuminate\Database\Migrations\Migration; | |||||
use Illuminate\Database\Schema\Blueprint; | |||||
use Illuminate\Support\Facades\Schema; | |||||
use App\Models\Service; | |||||
class CreateServicesTable extends Migration | |||||
{ | |||||
/** | |||||
* Run the migrations. | |||||
* | |||||
* @return void | |||||
*/ | |||||
public function up() | |||||
{ | |||||
Schema::create('services', function (Blueprint $table) { | |||||
$table->id(); | |||||
$table->timestamps(); | |||||
$table->string('name'); | |||||
$table->string('type')->nullable(); | |||||
$table->string('site'); | |||||
$table->boolean('available'); | |||||
}); | |||||
} | |||||
/** | |||||
* Reverse the migrations. | |||||
* | |||||
* @return void | |||||
*/ | |||||
public function down() | |||||
{ | |||||
Schema::dropIfExists('services'); | |||||
} | |||||
} |
@@ -16,7 +16,8 @@ class CreateOrdersTable extends Migration | |||||
Schema::create('orders', function (Blueprint $table) { | Schema::create('orders', function (Blueprint $table) { | ||||
$table->id(); | $table->id(); | ||||
$table->timestamps(); | $table->timestamps(); | ||||
$table->string('product'); | |||||
$table->foreignId('service_id')->constrained(); | |||||
$table->foreignId('user_id')->constrained(); | |||||
$table->bigInteger('quantity'); | $table->bigInteger('quantity'); | ||||
}); | }); | ||||
} | } |
@@ -4,6 +4,8 @@ namespace Database\Seeders; | |||||
use Illuminate\Database\Seeder; | use Illuminate\Database\Seeder; | ||||
use App\Models\User; | use App\Models\User; | ||||
use App\Models\Order; | |||||
use App\Models\Service; | |||||
use Illuminate\Support\Facades\Hash; | use Illuminate\Support\Facades\Hash; | ||||
class DatabaseSeeder extends Seeder | class DatabaseSeeder extends Seeder | ||||
@@ -15,7 +17,31 @@ class DatabaseSeeder extends Seeder | |||||
*/ | */ | ||||
public function run() | public function run() | ||||
{ | { | ||||
User::create([ | |||||
Service::create([ | |||||
'name' => 'youtube_views', | |||||
'type' => 'views', | |||||
'site' => 'youtube', | |||||
'available' => true, | |||||
]); | |||||
Service::create([ | |||||
'name' => 'instagram_views', | |||||
'type' => 'views', | |||||
'site' => 'instagram', | |||||
'available' => true, | |||||
]); | |||||
Service::create([ | |||||
'name' => 'spotify_plays', | |||||
'type' => 'plays', | |||||
'site' => 'spotify', | |||||
'available' => true, | |||||
]); | |||||
Service::create([ | |||||
'name' => 'twitter_likes', | |||||
'type' => 'likes', | |||||
'site' => 'spotify', | |||||
'available' => false, | |||||
]); | |||||
$test_user = User::create([ | |||||
'name' => 'test_user_unverified', | 'name' => 'test_user_unverified', | ||||
'email' => 'unverified@example.com', | 'email' => 'unverified@example.com', | ||||
'role' => 'client', | 'role' => 'client', | ||||
@@ -39,5 +65,8 @@ class DatabaseSeeder extends Seeder | |||||
'active' => true, | 'active' => true, | ||||
'password' => Hash::make("test123") | 'password' => Hash::make("test123") | ||||
]); | ]); | ||||
Order::factory()->count(15)->for($test_user)->create(); | |||||
Order::factory()->count(25)->create(); | |||||
} | } | ||||
} | } |