Skip to content

Commit c3ffc40

Browse files
committed
Add Docker, partial user relationships, JSON API spec, api blueprint in partial files. change Aglio theme.
1 parent 5330f1e commit c3ffc40

33 files changed

+2068
-388
lines changed

.dockerignore

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
Dockerfile
2+
node_modules/
3+
.git
4+
.gitignore
5+
.DS_Store
6+
.env

.env.example

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@ API_PREFIX=api
88
API_VERSION=v1
99
API_DEBUG=true
1010

11-
DB_HOST=localhost
12-
DB_DATABASE=laravel_api
13-
DB_USERNAME=homestead
14-
DB_PASSWORD=secret
11+
DB_HOST=mysql
12+
DB_DATABASE=api
13+
DB_USERNAME=root
14+
DB_PASSWORD=root
1515

1616
CACHE_DRIVER=file
1717
SESSION_DRIVER=file

Dockerfile

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
FROM joselfonsecadt/php7.0:1.0.0
2+
3+
MAINTAINER Jose Fonseca <jose@ditecnologia.com>
4+
5+
COPY docker/default /etc/nginx/sites-available/default
6+
7+
COPY docker/php-fpm.conf /etc/php/7.0/fpm/php-fpm.conf
8+
9+
COPY docker/www.conf /etc/php/7.0/fpm/pool.d/www.conf
10+
11+
COPY . /var/www/html/
12+
13+
EXPOSE 80
14+
15+
COPY docker/supervisord.conf /etc/supervisor/conf.d/supervisord.conf
16+
17+
WORKDIR /var/www/html/
18+
19+
RUN cp .env.example .env
20+
21+
CMD ["/usr/bin/supervisord"]

app/Contracts/Users/UsersServiceContract.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,11 @@ public function create(array $attributes = []);
3636
/**
3737
* @param int|string $id
3838
* @param array $attributes
39+
* @param bool $partial
3940
* @return User
4041
* @throws ValidationException
4142
*/
42-
public function update($id, array $attributes = []);
43+
public function update($id, array $attributes = [], $partial = false);
4344

4445
/**
4546
* @param int|string $id

app/Http/Controllers/Users/UsersController.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,17 @@ public function update(Request $request, $uuid)
8383
return $this->response->array($this->service->transform($user));
8484
}
8585

86+
/**
87+
* @param Request $request
88+
* @param $uuid
89+
* @return mixed
90+
*/
91+
public function partialUpdate(Request $request, $uuid)
92+
{
93+
$user = $this->service->update($uuid, $request->all(), true);
94+
return $this->response->array($this->service->transform($user));
95+
}
96+
8697

8798
/**
8899
* @param Request $request

app/Services/Installation/InstallAppHandler.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace App\Services\Installation;
44

5+
use Artisan;
56
use App\Entities\Role;
67
use App\Entities\Permission;
78
use App\Contracts\Users\UsersServiceContract;
@@ -71,6 +72,7 @@ public function __construct()
7172
*/
7273
public function handle(InstallAppCommand $command)
7374
{
75+
Artisan::call('passport:install');
7476
$this->createRoles()
7577
->createPermissions()
7678
->createAdminUser((array) $command)

app/Services/Users/UsersService.php

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
namespace App\Services\Users;
44

55
use App\Entities\User;
6+
use League\Fractal\Serializer\JsonApiSerializer;
7+
use League\Fractal\Serializer\SerializerAbstract;
68
use League\Fractal\TransformerAbstract;
79
use Dingo\Api\Exception\ResourceException;
810
use App\Transformers\Users\UserTransformer;
@@ -37,8 +39,8 @@ class UsersService implements FractalAble, ValidateAble, UsersServiceContract
3739
* @var array
3840
*/
3941
protected $validationUpdateRules = [
40-
'name' => 'sometimes|required',
41-
'password' => 'sometimes|required|min:8|confirmed'
42+
'name' => 'required',
43+
'email' => 'required|unique:users,email'
4244
];
4345

4446
/**
@@ -62,7 +64,7 @@ class UsersService implements FractalAble, ValidateAble, UsersServiceContract
6264
* Declare the includes to use in the with query
6365
* @var array
6466
*/
65-
protected $includes = [];
67+
protected $includes = ['roles.permissions'];
6668

6769
/**
6870
* UsersService constructor.
@@ -76,18 +78,26 @@ public function __construct(User $model)
7678
/**
7779
* @return mixed
7880
*/
79-
public function setTransformer() : TransformerAbstract
81+
public function setTransformer(): TransformerAbstract
8082
{
8183
return app(UserTransformer::class);
8284
}
8385

86+
/**
87+
* Sets the serializer to be used in the transformation
88+
* @return SerializerAbstract
89+
*/
90+
public function setSerializer()
91+
{
92+
return new JsonApiSerializer(url('api'));
93+
}
8494

8595
/**
8696
* @param array $attributes
8797
* @param int $limit
8898
* @return \Illuminate\Contracts\Pagination\LengthAwarePaginator|\Illuminate\Database\Eloquent\Collection|static[]
8999
*/
90-
public function get(Array $attributes = [], $limit = 20)
100+
public function get(array $attributes = [], $limit = 20)
91101
{
92102
$model = $this->model->with($this->includes);
93103
$this->addFilter($attributes);
@@ -127,17 +137,26 @@ public function create(array $attributes = [])
127137
/**
128138
* @param int|string $id
129139
* @param array $attributes
140+
* @param bool $partial
130141
* @return User
131142
* @throws ResourceException
132143
*/
133-
public function update($id, array $attributes = [])
144+
public function update($id, array $attributes = [], $partial = false)
134145
{
135146
$model = $this->find($id);
136-
if (isset($attributes['email']) && $attributes['email'] != $model->email) {
137-
$this->validationUpdateRules['email'] = 'sometimes|required|unique:users,email,'.$model->id;
147+
if (array_key_exists('email', $attributes)) {
148+
$this->validationUpdateRules['email'] = 'required|unique:users,email,' . $model->id;
149+
}
150+
if (array_key_exists('password', $attributes)) {
151+
$this->validationUpdateRules['password'] = 'required|min:8|confirmed';
152+
}
153+
if ($partial) {
154+
$this->validationUpdateRules = array_map(function ($value) {
155+
return "sometimes|" . $value;
156+
}, $this->validationUpdateRules);
138157
}
139158
$this->runValidator($attributes, $this->validationUpdateRules, $this->validationMessages);
140-
if(isset($attributes['password'])) {
159+
if (isset($attributes['password'])) {
141160
$attributes['password'] = bcrypt($attributes['password']);
142161
}
143162
$model->fill($attributes);
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<?php
2+
3+
namespace App\Transformers\Users;
4+
5+
use App\Entities\Permission;
6+
use League\Fractal\TransformerAbstract;
7+
8+
/**
9+
* Class PermissionTransformer
10+
* @package App\Transformers\Users
11+
*/
12+
class PermissionTransformer extends TransformerAbstract
13+
{
14+
15+
/**
16+
* @param Permission $model
17+
* @return array
18+
*/
19+
public function transform(Permission $model)
20+
{
21+
return [
22+
'id' => $model->uuid,
23+
'name' => $model->name,
24+
'created_at' => $model->created_at->toIso8601String(),
25+
'updated_at' => $model->updated_at->toIso8601String(),
26+
];
27+
}
28+
29+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<?php
2+
3+
namespace App\Transformers\Users;
4+
5+
use App\Entities\Role;
6+
use League\Fractal\TransformerAbstract;
7+
8+
/**
9+
* Class RolTransformer
10+
* @package App\Transformers\Users
11+
*/
12+
class RoleTransformer extends TransformerAbstract
13+
{
14+
15+
/**
16+
* @var array
17+
*/
18+
protected $availableIncludes = ['permissions'];
19+
20+
/**
21+
* @param Role $model
22+
* @return array
23+
*/
24+
public function transform(Role $model)
25+
{
26+
return [
27+
'id' => $model->uuid,
28+
'name' => $model->name,
29+
'created_at' => $model->created_at->toIso8601String(),
30+
'updated_at' => $model->updated_at->toIso8601String(),
31+
];
32+
}
33+
34+
/**
35+
* @param Role $model
36+
* @return \League\Fractal\Resource\Collection
37+
*/
38+
public function includePermissions(Role $model)
39+
{
40+
return $this->collection($model->permissions, new PermissionTransformer(), 'permissions');
41+
}
42+
43+
}

app/Transformers/Users/UserTransformer.php

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,12 @@
1111
*/
1212
class UserTransformer extends TransformerAbstract
1313
{
14+
15+
/**
16+
* @var array
17+
*/
18+
protected $defaultIncludes = ['roles'];
19+
1420
/**
1521
* @param User $model
1622
* @return array
@@ -22,7 +28,16 @@ public function transform(User $model)
2228
'name' => $model->name,
2329
'email' => $model->email,
2430
'created_at' => $model->created_at->toIso8601String(),
25-
'updated_at' => $model->updated_at->toIso8601String(),
31+
'updated_at' => $model->updated_at->toIso8601String()
2632
];
2733
}
34+
35+
/**
36+
* @param User $model
37+
* @return \League\Fractal\Resource\Collection
38+
*/
39+
public function includeRoles(User $model)
40+
{
41+
return $this->collection($model->roles, new RoleTransformer(), 'roles');
42+
}
2843
}

composer.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,11 @@
1818
"dingo/api": "1.0.*@dev",
1919
"laravel/tinker": "~1.0",
2020
"joselfonseca/laravel-tactician" : "0.3.*",
21+
"joselfonseca/laravel-api-tools" : "3.0.*",
2122
"spatie/laravel-fractal": "^3.3",
2223
"laravel/passport": "^2.0",
2324
"webpatser/laravel-uuid": "^2.0",
24-
"spatie/laravel-permission": "^1.7",
25-
"joselfonseca/laravel-api-tools" : "dev-master"
25+
"spatie/laravel-permission": "^1.7"
2626
},
2727
"require-dev": {
2828
"fzaninotto/faker": "~1.4",

0 commit comments

Comments
 (0)