Home - A3mercury/Laravel-Ionic-Demo-API GitHub Wiki
Pre-added code
Env
...
APP_URL=https://laravel-ionic-demo.dev
...
DB_DATABASE=laravelionicdemo
DB_USERNAME=root
DB_PASSWORD=password
...
CorsMiddleware.php
<?php
namespace App\Http\Middleware;
use Closure;
class CorsMiddleware
{
public function handle($request, Closure $next)
{
return $next($request)
->header('Access-Control-Allow-Origin', '*')
->header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS')
->header('Access-Control-Allow-Headers', 'Minimum-App-Version, Origin, Content-Type, X-Auth-Token, authorization, X-Requested-With');
}
}
Kernel.php
protected $middlewareGroups = [
'web' => [
...
\App\Http\Middleware\CorsMiddleware::class,
],
Migrations
Users:
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
$table->string('first_name');
$table->string('last_name');
$table->string('email')->unique();
$table->string('password');
$table->boolean('is_super')->nullable();
$table->rememberToken();
$table->timestamps();
});
Tasks:
Schema::create('tasks', function (Blueprint $table) {
$table->increments('id');
$table->integer('user_id')->unsigned();
$table->foreign('user_id')->references('id')->on('users')->onUpdate('restrict')->onDelete('restrict');
$table->string('title');
$table->timestamps();
});
TaskItems:
Schema::create('task_items', function (Blueprint $table) {
$table->increments('id');
$table->integer('task_id')->unsigned();
$table->foreign('task_id')->references('id')->on('tasks')->onUpdate('restrict')->onDelete('restrict');
$table->string('label');
$table->timestamp('completed')->nullable();
$table->timestamps();
});
Seeders
UserSeeder:
public function run()
{
$austin = User::create([
'first_name' => 'Austin',
'last_name' => 'Andrews',
'email' => '[email protected]',
'password' => Hash::make('password'),
]);
$bob = User::create([
'first_name' => 'Bob',
'last_name' => 'Smith',
'email' => '[email protected]',
'password' => Hash::make('password'),
]);
$coach = User::create([
'first_name' => 'Coach',
'last_name' => 'Rags',
'email' => '[email protected]',
'password' => Hash::make('scud'),
'is_super' => true,
]);
}
TaskSeeder:
public function run()
{
$tasks = [
[
'user_id' => 1,
'title' => 'Shopping List',
],
[
'user_id' => 1,
'title' => 'Reminders',
],
[
'user_id' => 1,
'title' => 'Books',
],
[
'user_id' => 2,
'title' => 'Shopping List',
],
[
'user_id' => 2,
'title' => 'Reminders',
],
];
foreach ($tasks as $task) {
Task::create($task);
};
}
TaskItemSeeder:
public function run()
{
$items = [
// Shopping list
[
'task_id' => 1,
'label' => 'Eggs'
],
[
'task_id' => 1,
'label' => 'Cheese'
],
[
'task_id' => 1,
'label' => 'Bread'
],
[
'task_id' => 1,
'label' => 'Milk'
],
[
'task_id' => 1,
'label' => 'Coffee'
],
[
'task_id' => 1,
'label' => 'Paper towels'
],
[
'task_id' => 1,
'label' => 'Chicken'
],
[
'task_id' => 4,
'label' => 'Chips'
],
[
'task_id' => 4,
'label' => 'Bean dip'
],
// Reminders
[
'task_id' => 2,
'label' => 'Pay rent'
],
[
'task_id' => 2,
'label' => 'Code daily'
],
[
'task_id' => 2,
'label' => 'Work out'
],
// Books
[
'task_id' => 3,
'label' => 'Harry Potter and the Half Blood Prince'
],
[
'task_id' => 3,
'label' => 'Blue Ocean Strategy'
],
[
'task_id' => 3,
'label' => 'Ben Shapiro: Evil in America'
],
];
foreach ($items as $item) {
TaskItem::create($item);
}
}
DatabaseSeeder:
$this->call(UserSeeder::class);
$this->call(TaskSeeder::class);
$this->call(TaskItemSeeder::class);
AuthServiceProvider
public function boot()
{
$this->registerPolicies();
Auth::setUser(User::where('email', '[email protected]')->first());
// Auth::setUser(User::where('email', '[email protected]')->first());
// Auth::setUser(User::where('email', '[email protected]')->first());
}
Demo Code
Models
User:
<?php
namespace App;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable
{
use Notifiable;
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'first_name',
'last_name',
'email',
'password',
];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password',
'remember_token',
];
public function tasks()
{
return $this->hasMany(Task::class);
}
public function taskItems()
{
return $this->hasManyThrough(TaskItem::class, Task::class);
}
}
Task:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Task extends Model
{
protected $fillable = [
'user_id',
'title',
];
public function user()
{
return $this->belongsTo(User::class);
}
public function taskItems()
{
return $this->hasMany(TaskItem::class);
}
public function scopeVisibleTo($query, User $user)
{
if ($user->is_super) {
return $query;
}
return $query->where('user_id', $user->id);
}
}
TaskItem:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class TaskItem extends Model
{
protected $fillable = [
'task_id',
'label',
'completed'
];
public function task()
{
return $this->belongsTo(Task::class);
}
}
Routes
Route::get('/tasks')
->name('task.index')
->uses('TaskController@index');
Route::get('/task/{task}')
->name('task.show')
->uses('TaskController@show');
Route::post('/task/item/store')
->name('tasks.items.store')
->uses('TaskItemsController@store');
Route::post('/task/item/complete')
->name('task.items.complete')
->uses('TaskItemsController@complete');
Controllers
TasksController:
@index
public function index()
{
return json_encode([
'message' => 'success',
'tasks' => Task::visibleTo(Auth::user())->get(),
]);
}
@show
public function show(Task $task)
{
return json_encode([
'message' => 'success',
'items' => $task->taskItems
]);
}
TaskItemsController:
@store
public function store()
{
$this->validate(request(), [
'task_id' => 'required|integer|exists:tasks,id',
'label' => 'required|max:48',
]);
$task_item = TaskItem::create([
'task_id' => request('task_id'),
'label' => request('label')
]);
return json_encode([
'message' => 'success',
]);
}
@complete
public function complete()
{
$this->validate(request(), [
'item_id' => 'required|integer|exists:task_items,id',
]);
$task_item = TaskItem::find(request('item_id'));
$task_item->update([
'completed' => $task_item->completed ? null : Carbon::now(),
]);
return json_encode([
'message' => 'success',
]);
}