Skip to content

Commit

Permalink
Merge pull request #4 from samsonasik/add-track-table
Browse files Browse the repository at this point in the history
adding track detail of album
  • Loading branch information
samsonasik authored Mar 27, 2020
2 parents 7a7fb39 + 92e4824 commit 431ddc4
Show file tree
Hide file tree
Showing 32 changed files with 986 additions and 33 deletions.
7 changes: 7 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,13 @@ database.default.DBDriver = MySQLi
php spark migrate -n Album
```
**4.** Run db seed (Optional)
```bash
php spark db:seed "Album\Database\Seeds\AlbumSeeder"
php spark db:seed "Album\Database\Seeds\TrackSeeder"
```
**4.** Run development server:
```bash
Expand Down
1 change: 1 addition & 0 deletions phpstan.neon
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,5 @@ parameters:
- '#Access to protected property [a-zA-Z0-9\\_]+Model::\$returnType.#'
- '#Method ([a-zA-Z0-9\\_]+)(Controllers)([a-zA-Z0-9\\_]+)(::)([a-zA-Z0-9]+)(\(\)) has no return typehint specified.#'
- '#Call to an undefined static method Config\\Services::albumRepository()#'
- '#Call to an undefined static method Config\\Services::trackRepository()#'
- '#Call to protected method builder\(\) of class CodeIgniter\\Model.#'
14 changes: 14 additions & 0 deletions src/Config/Routes.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,17 @@
// example URI: /album/1
$routes->match(['get', 'post'], 'edit/(:num)', 'Album::edit/$1', ['as' => 'album-edit']);
});

$routes->group('track', ['namespace' => 'Album\Controllers'], function ($routes) {
// URI: /track/1
$routes->get('(:num)', 'Track::index/$1', ['as' => 'track-index']);

// URI: /track/add/(:num)
$routes->match(['get', 'post'], 'add/(:num)', 'Track::add/$1', ['as' => 'track-add']);

// example URI: /track/delete/1
$routes->get('delete/(:num)/(:num)', 'Track::delete/$1/$2', ['as' => 'track-delete']);

// example URI: /track/1
$routes->match(['get', 'post'], 'edit/(:num)/(:num)', 'Track::edit/$1/$2', ['as' => 'track-edit']);
});
15 changes: 13 additions & 2 deletions src/Config/Services.php
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
<?php namespace Album\Config;

use Album\Infrastructure\Persistence\Album\SQLAlbumRepository;
use Album\Models\AlbumModel;
use Album\Infrastructure\Persistence\Track\SQLTrackRepository;
use Album\Models;
use CodeIgniter\Config\BaseService;

class Services extends BaseService
Expand All @@ -13,6 +14,16 @@ public static function albumRepository($getShared = true)
return static::getSharedInstance('albumRepository');
}

return new SQLAlbumRepository(model(AlbumModel::class));
return new SQLAlbumRepository(model(Models\AlbumModel::class));
}

public static function trackRepository($getShared = true)
{
if ($getShared)
{
return static::getSharedInstance('trackRepository');
}

return new SQLTrackRepository(model(Models\TrackModel::class));
}
}
6 changes: 3 additions & 3 deletions src/Controllers/Album.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ public function index()
$data['albums'] = $this->repository->findPaginatedData($data['keyword']);
$data['pager'] = $this->repository->pager();

return view('Album\Views\index', $data);
return view('Album\Views\album\index', $data);
}

public function add()
Expand All @@ -40,7 +40,7 @@ public function add()
return redirect()->withInput()->back();
}

return view('Album\Views\add', ['errors' => session()->getFlashData('errors')]);
return view('Album\Views\album\add', ['errors' => session()->getFlashData('errors')]);
}

public function edit(int $id)
Expand All @@ -67,7 +67,7 @@ public function edit(int $id)
return redirect()->withInput()->back();
}

return view('Album\Views\edit', ['album' => $album, 'errors' => session()->getFlashData('errors')]);
return view('Album\Views\album\edit', ['album' => $album, 'errors' => session()->getFlashData('errors')]);
}

public function delete(int $id)
Expand Down
120 changes: 120 additions & 0 deletions src/Controllers/Track.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
<?php namespace Album\Controllers;

use Album\Domain\Album\AlbumRepository;
use Album\Domain\Exception\RecordNotFoundException;
use Album\Domain\Track\TrackRepository;
use App\Controllers\BaseController;
use CodeIgniter\Exceptions\PageNotFoundException;
use Config\Services;

class Track extends BaseController
{
/** @var AlbumRepository */
private $albumRepository;

/** @var TrackRepository */
private $trackRepository;

public function __construct()
{
$this->albumRepository = Services::albumRepository();
$this->trackRepository = Services::trackRepository();
}

public function index(int $albumId)
{
try
{
$album = $this->albumRepository->findAlbumOfId($albumId);
}
catch (RecordNotFoundException $e)
{
throw new PageNotFoundException($e->getMessage());
}

$data['keyword'] = $this->request->getGet('keyword') ?? '';
$data['album'] = $album;
$data['tracks'] = $this->trackRepository->findPaginatedData($album, $data['keyword']);
$data['pager'] = $this->trackRepository->pager();

return view('Album\Views\track\index', $data);
}

public function add(int $albumId)
{
try
{
$album = $this->albumRepository->findAlbumOfId($albumId);
}
catch (RecordNotFoundException $e)
{
throw new PageNotFoundException($e->getMessage());
}

if ($this->request->getMethod() === 'post')
{
$data = $this->request->getPost();
if ($this->trackRepository->save($data))
{
session()->setFlashdata('status', 'New album track has been added');
return redirect()->route('track-index', [$albumId]);
}

session()->setFlashdata('errors', $this->trackRepository->errors());
return redirect()->withInput()->back();
}

return view('Album\Views\track\add', [
'album' => $album,
'errors' => session()->getFlashData('errors'),
]);
}

public function edit(int $albumId, int $trackId)
{
try
{
$album = $this->albumRepository->findAlbumOfId($albumId);
$track = $this->trackRepository->findTrackOfId($trackId);
}
catch (RecordNotFoundException $e)
{
throw new PageNotFoundException($e->getMessage());
}

if ($this->request->getMethod() === 'post')
{
$data = $this->request->getPost();
if ($this->trackRepository->save($data))
{
session()->setFlashdata('status', 'Album track has been updated');
return redirect()->route('track-index', [$albumId]);
}

session()->setFlashdata('errors', $this->trackRepository->errors());
return redirect()->withInput()->back();
}

return view('Album\Views\track\edit', [
'album' => $album,
'track' => $track,
'errors' => session()->getFlashData('errors'),
]);
}

public function delete(int $albumId, int $trackId)
{
try
{
$this->albumRepository->findAlbumOfId($albumId);
$this->trackRepository->deleteOfId($trackId);
}
catch (RecordNotFoundException $e)
{
throw new PageNotFoundException($e->getMessage());
}

session()->setFlashdata('status', 'Album track has been deleted');
return redirect()->route('track-index', [$albumId]);
}
}
37 changes: 37 additions & 0 deletions src/Database/Migrations/2020-03-26-203957_Track.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
<?php namespace Album\Database\Migrations;

use CodeIgniter\Database\Migration;

class Track extends Migration
{
public function up()
{
$this->forge->addField([
'id' => [
'type' => 'BIGINT',
'unsigned' => true,
'auto_increment' => true,
],
'album_id' => [
'type' => 'BIGINT',
'unsigned' => true,
],
'title' => [
'type' => 'VARCHAR',
'constraint' => '255',
],
'author' => [
'type' => 'VARCHAR',
'constraint' => '255',
],
]);
$this->forge->addKey('id', true);
$this->forge->addForeignKey('album_id', 'album', 'id', 'CASCADE', 'CASCADE');
$this->forge->createTable('track');
}

public function down()
{
$this->forge->dropTable('track');
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<?php namespace AlbumTest\Database\Seeds;
<?php namespace Album\Database\Seeds;

use CodeIgniter\Database\Seeder;

Expand All @@ -9,7 +9,7 @@ public function run()
$row = [
'id' => 1,
'artist' => 'Sheila On 7',
'title' => 'Melompat Lebih Tinggi',
'title' => 'Kisah Klasik Untuk Masa Depan',
];

$this->db->table('album')->insert($row);
Expand Down
18 changes: 18 additions & 0 deletions src/Database/Seeds/TrackSeeder.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<?php namespace Album\Database\Seeds;

use CodeIgniter\Database\Seeder;

class TrackSeeder extends Seeder
{
public function run()
{
$row = [
'id' => 1,
'album_id' => 1,
'title' => 'Sebuah Kisah Klasik',
'author' => 'Eross Chandra',
];

$this->db->table('track')->insert($row);
}
}
17 changes: 10 additions & 7 deletions src/Domain/Album/Album.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,18 @@

use CodeIgniter\Entity;

/**
* @property int $id
* @property string $artist
* @property string $title
*/
class Album extends Entity
{
public function __construct(array $data = null)
{
$data['artist'] = $data['artist'] ?? '';
$data['title'] = $data['title'] ?? '';

parent::__construct($data);
}
protected $attributes = [
'id' => null,
'artist' => null,
'title' => null,
];

public function setArtist(string $artist): self
{
Expand Down
8 changes: 2 additions & 6 deletions src/Domain/Album/AlbumRepository.php
Original file line number Diff line number Diff line change
@@ -1,13 +1,9 @@
<?php namespace Album\Domain\Album;

use CodeIgniter\Pager\PagerInterface;
use Album\Domain\Repository;

interface AlbumRepository
interface AlbumRepository extends Repository
{
public function findPaginatedData(string $keyword = ''): ?array;
public function pager(): ?PagerInterface;
public function findAlbumOfId(int $id): Album;
public function save(array $data): bool;
public function errors(): ?array;
public function deleteOfId(int $id): bool;
}
11 changes: 11 additions & 0 deletions src/Domain/Repository.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?php namespace Album\Domain;

use CodeIgniter\Pager\PagerInterface;

interface Repository
{
public function pager(): ?PagerInterface;
public function save(array $data): bool;
public function errors(): ?array;
public function deleteOfId(int $id): bool;
}
36 changes: 36 additions & 0 deletions src/Domain/Track/Track.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
<?php namespace Album\Domain\Track;

use CodeIgniter\Entity;

/**
* @property int $id
* @property int $album_id
* @property string $title
*/
class Track extends Entity
{
protected $attributes = [
'id' => null,
'album_id' => null,
'title' => null,
'author' => null,
];

public function setAlbumId(int $albumId): self
{
$this->attributes['album_id'] = $albumId;
return $this;
}

public function setTitle(string $title): self
{
$this->attributes['title'] = ucwords($title);
return $this;
}

public function setAuthor(string $author): self
{
$this->attributes['author'] = ucwords($author);
return $this;
}
}
9 changes: 9 additions & 0 deletions src/Domain/Track/TrackNotFoundException.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<?php namespace Album\Domain\Track;

use Album\Domain\Exception\RecordNotFoundException;

class TrackNotFoundException extends RecordNotFoundException
{
/** @var string */
public $message = 'The album track you requested does not exist.';
}
10 changes: 10 additions & 0 deletions src/Domain/Track/TrackRepository.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?php namespace Album\Domain\Track;

use Album\Domain\Album\Album;
use Album\Domain\Repository;

interface TrackRepository extends Repository
{
public function findPaginatedData(Album $album, string $keyword = ''): ?array;
public function findTrackOfId(int $id): Track;
}
Loading

0 comments on commit 431ddc4

Please sign in to comment.