Skip to content

Commit dffb0f0

Browse files
Backend Refactor & Expose Events (#87)
* refactor: change deletion logic & implement event * refactor: change creation logic & implement event * chore: fix * chore: fix * efactor: change update logic & implement event * fix: add back types * chore: remove unused imports * chore: fix phpstan * chore: raise PHP version to ^8.1 * chore: raise flarum/core constraint to ^1.8.5 * feat: add in boilerplate events
1 parent 972eda3 commit dffb0f0

11 files changed

+118
-87
lines changed

.github/workflows/backend.yml

+1
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,6 @@ jobs:
88
with:
99
enable_backend_testing: false
1010
enable_phpstan: true
11+
php_versions: '["8.1", "8.2", "8.3"]'
1112

1213
backend_directory: .

composer.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@
2828
"forum": "https://discuss.flarum.org/d/5791"
2929
},
3030
"require": {
31-
"flarum/core": "^1.2"
31+
"php": "^8.1",
32+
"flarum/core": "^1.8.5"
3233
},
3334
"replace": {
3435
"flagrow/masquerade": "*"

src/Api/Controllers/DeleteFieldController.php

+10-19
Original file line numberDiff line numberDiff line change
@@ -2,38 +2,29 @@
22

33
namespace FoF\Masquerade\Api\Controllers;
44

5+
use Flarum\Api\Controller\AbstractDeleteController;
56
use Flarum\Http\RequestUtil;
6-
use FoF\Masquerade\Api\Serializers\FieldSerializer;
77
use FoF\Masquerade\Repositories\FieldRepository;
8-
use FoF\Masquerade\Validators\FieldValidator;
9-
use Flarum\Api\Controller\AbstractShowController;
108
use Illuminate\Support\Arr;
119
use Psr\Http\Message\ServerRequestInterface;
12-
use Tobscure\JsonApi\Document;
1310

14-
class DeleteFieldController extends AbstractShowController
11+
class DeleteFieldController extends AbstractDeleteController
1512
{
16-
public $serializer = FieldSerializer::class;
17-
18-
protected $validator;
19-
protected $fields;
20-
21-
public function __construct(FieldValidator $validator, FieldRepository $fields)
13+
public function __construct(
14+
protected FieldRepository $fields
15+
)
2216
{
23-
$this->validator = $validator;
24-
$this->fields = $fields;
2517
}
2618

27-
protected function data(ServerRequestInterface $request, Document $document)
19+
protected function delete(ServerRequestInterface $request)
2820
{
29-
RequestUtil::getActor($request)->assertAdmin();
21+
$actor = RequestUtil::getActor($request);
22+
$actor->assertAdmin();
3023

3124
$id = Arr::get($request->getQueryParams(), 'id');
3225

33-
if ($deleted = $this->fields->delete($id)) {
34-
return $deleted;
35-
}
26+
$field = $this->fields->findOrFail($id);
3627

37-
throw new \RuntimeException('Could not delete Field');
28+
$this->fields->delete($actor, $field);
3829
}
3930
}

src/Api/Controllers/StoreFieldController.php

+10-15
Original file line numberDiff line numberDiff line change
@@ -2,36 +2,31 @@
22

33
namespace FoF\Masquerade\Api\Controllers;
44

5+
use Flarum\Api\Controller\AbstractCreateController;
56
use Flarum\Http\RequestUtil;
6-
use FoF\Masquerade\Api\Serializers\FieldSerializer;
77
use FoF\Masquerade\Repositories\FieldRepository;
8-
use FoF\Masquerade\Validators\FieldValidator;
9-
use Flarum\Api\Controller\AbstractShowController;
8+
use FoF\Masquerade\Api\Serializers\FieldSerializer;
109
use Illuminate\Support\Arr;
1110
use Psr\Http\Message\ServerRequestInterface;
1211
use Tobscure\JsonApi\Document;
1312

14-
class StoreFieldController extends AbstractShowController
13+
class StoreFieldController extends AbstractCreateController
1514
{
1615
public $serializer = FieldSerializer::class;
1716

18-
protected $validator;
19-
protected $fields;
20-
21-
public function __construct(FieldValidator $validator, FieldRepository $fields)
17+
public function __construct(
18+
protected FieldRepository $fields
19+
)
2220
{
23-
$this->validator = $validator;
24-
$this->fields = $fields;
2521
}
2622

2723
protected function data(ServerRequestInterface $request, Document $document)
2824
{
29-
RequestUtil::getActor($request)->assertAdmin();
25+
$actor = RequestUtil::getActor($request);
26+
$actor->assertAdmin();
3027

3128
$attributes = Arr::get($request->getParsedBody(), 'data.attributes', []);
3229

33-
$this->validator->assertValid($attributes);
34-
35-
return $this->fields->store($attributes);
30+
return $this->fields->store($actor, $attributes);
3631
}
37-
}
32+
}

src/Api/Controllers/UpdateFieldController.php

+10-13
Original file line numberDiff line numberDiff line change
@@ -2,38 +2,35 @@
22

33
namespace FoF\Masquerade\Api\Controllers;
44

5+
use Flarum\Api\Controller\AbstractCreateController;
56
use Flarum\Http\RequestUtil;
67
use FoF\Masquerade\Api\Serializers\FieldSerializer;
78
use FoF\Masquerade\Repositories\FieldRepository;
8-
use FoF\Masquerade\Validators\FieldValidator;
9-
use Flarum\Api\Controller\AbstractShowController;
109
use Illuminate\Support\Arr;
1110
use Psr\Http\Message\ServerRequestInterface;
1211
use Tobscure\JsonApi\Document;
1312

14-
class UpdateFieldController extends AbstractShowController
13+
class UpdateFieldController extends AbstractCreateController
1514
{
1615
public $serializer = FieldSerializer::class;
1716

18-
protected $validator;
19-
protected $fields;
20-
21-
public function __construct(FieldValidator $validator, FieldRepository $fields)
17+
public function __construct (
18+
protected FieldRepository $field
19+
)
2220
{
23-
$this->validator = $validator;
24-
$this->fields = $fields;
2521
}
2622

2723
protected function data(ServerRequestInterface $request, Document $document)
2824
{
29-
RequestUtil::getActor($request)->assertAdmin();
25+
$actor = RequestUtil::getActor($request);
26+
$actor->assertAdmin();
3027

3128
$id = Arr::get($request->getQueryParams(), 'id');
3229

33-
$attributes = Arr::get($request->getParsedBody(), 'data.attributes', []);
30+
$field = $this->field->findOrFail($id);
3431

35-
$this->validator->assertValid($attributes);
32+
$attributes = Arr::get($request->getParsedBody(), 'data.attributes', []);
3633

37-
return $this->fields->update($id, $attributes);
34+
return $this->field->update($actor, $field, $attributes);
3835
}
3936
}

src/Api/Controllers/UserConfigureController.php

-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
namespace FoF\Masquerade\Api\Controllers;
44

55
use Flarum\Http\RequestUtil;
6-
use FoF\Masquerade\Api\Serializers\FieldSerializer;
76
use FoF\Masquerade\Field;
87
use FoF\Masquerade\Repositories\FieldRepository;
98
use FoF\Masquerade\Validators\AnswerValidator;

src/Events/AbstractFieldEvent.php

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<?php
2+
3+
/*
4+
* This file is part of fof/terms.
5+
*
6+
* Copyright (c) FriendsOfFlarum.
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace FoF\Masquerade\Events;
13+
14+
use Flarum\User\User;
15+
use FoF\Masquerade\Field;
16+
17+
abstract class AbstractFieldEvent
18+
{
19+
public function __construct (
20+
public Field $field,
21+
public User $actor,
22+
public array $data
23+
)
24+
{
25+
}
26+
}

src/Events/FieldCreated.php

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<?php
2+
3+
namespace FoF\Masquerade\Events;
4+
5+
class FieldCreated extends AbstractFieldEvent
6+
{
7+
}

src/Events/FieldDeleted.php

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<?php
2+
3+
namespace FoF\Masquerade\Events;
4+
5+
class FieldDeleted extends AbstractFieldEvent
6+
{
7+
}

src/Events/FieldUpdated.php

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<?php
2+
3+
namespace FoF\Masquerade\Events;
4+
5+
class FieldUpdated extends AbstractFieldEvent
6+
{
7+
}

src/Repositories/FieldRepository.php

+38-38
Original file line numberDiff line numberDiff line change
@@ -4,33 +4,27 @@
44

55
use FoF\Masquerade\Answer;
66
use FoF\Masquerade\Field;
7+
use FoF\Masquerade\Events\FieldCreated;
8+
use FoF\Masquerade\Events\FieldUpdated;
9+
use FoF\Masquerade\Events\FieldDeleted;
710
use FoF\Masquerade\FieldType\TypeFactory;
11+
use FoF\Masquerade\Validators\FieldValidator;
812
use Flarum\User\User;
913
use Illuminate\Cache\Repository;
14+
use Illuminate\Contracts\Events\Dispatcher;
1015

1116
class FieldRepository
1217
{
1318
const CACHE_KEY_ALL_FIELDS = 'fof.masquerade.fields.all';
1419
const CACHE_KEY_UNCOMPLETED = 'fof.masquerade.uncompleted.u.%d';
1520

16-
/**
17-
* @var Field
18-
*/
19-
protected $field;
20-
/**
21-
* @var Repository
22-
*/
23-
protected $cache;
24-
25-
/**
26-
* FieldRepository constructor.
27-
* @param Field $field
28-
* @param Repository $cache
29-
*/
30-
public function __construct(Field $field, Repository $cache)
21+
public function __construct (
22+
protected Field $field,
23+
protected FieldValidator $validator,
24+
protected Repository $cache,
25+
protected Dispatcher $events
26+
)
3127
{
32-
$this->field = $field;
33-
$this->cache = $cache;
3428
}
3529

3630
/**
@@ -43,39 +37,49 @@ public function all()
4337
});
4438
}
4539

46-
public function store(array $attributes): Field
40+
public function clearCacheAllFields()
4741
{
48-
$field = $this->field->newInstance();
49-
$field->sort = $this->highestSort();
42+
$this->cache->forget(static::CACHE_KEY_ALL_FIELDS);
43+
}
5044

51-
$type = TypeFactory::typeForField($attributes);
45+
public function findOrFail(string $id)
46+
{
47+
return $this->field->newQuery()->findOrFail($id);
48+
}
49+
50+
public function store(User $actor, array $attributes): Field
51+
{
52+
$this->validator->assertValid($attributes);
5253

54+
$type = TypeFactory::typeForField($attributes);
5355
$attributes = array_merge($attributes, $type->overrideAttributes());
5456

55-
$field->fill($attributes);
57+
$field = new Field($attributes);
5658
$field->save();
5759

58-
$this->cache->forget(static::CACHE_KEY_ALL_FIELDS);
60+
$this->events->dispatch(new FieldCreated($field, $actor, $attributes));
61+
62+
$this->clearCacheAllFields();
5963

6064
return $field;
6165
}
6266

63-
public function update($id, array $attributes): Field
67+
public function update(User $actor, Field $field, array $attributes): Field
6468
{
65-
/** @var Field */
66-
$field = $this->field->findOrFail($id);
69+
$this->validator->assertValid($attributes);
6770

6871
$type = TypeFactory::typeForField($attributes);
69-
7072
$attributes = array_merge($attributes, $type->overrideAttributes());
7173

7274
$field->fill($attributes);
7375

7476
if ($field->isDirty()) {
7577
$field->save();
76-
}
7778

78-
$this->cache->forget(static::CACHE_KEY_ALL_FIELDS);
79+
$this->events->dispatch(new FieldUpdated($field, $actor, $attributes));
80+
81+
$this->clearCacheAllFields();
82+
}
7983

8084
return $field;
8185
}
@@ -92,19 +96,15 @@ public function sorting(array $sorting)
9296
$this->cache->forget(static::CACHE_KEY_ALL_FIELDS);
9397
}
9498

95-
/**
96-
* @param $id
97-
* @return bool|Field
98-
*/
99-
public function delete($id)
99+
public function delete(User $actor, Field $field)
100100
{
101-
$field = $this->field->findOrFail($id);
101+
$response = $field->delete();
102102

103-
$field->delete();
103+
$this->events->dispatch(new FieldDeleted($field, $actor, []));
104104

105-
$this->cache->forget(static::CACHE_KEY_ALL_FIELDS);
105+
$this->clearCacheAllFields();
106106

107-
return $field;
107+
return $response;
108108
}
109109

110110
/**

0 commit comments

Comments
 (0)