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',
   ]);
}