From 683dccbfac64fe37080a4cfeff886947648feecb Mon Sep 17 00:00:00 2001 From: Joseph Cohen Date: Sun, 22 Feb 2015 22:22:01 -0600 Subject: [PATCH 1/2] Update components through API --- .../Controllers/Api/ComponentController.php | 27 +++++++++++++++++++ .../Component/ComponentRepository.php | 10 +++++++ .../Component/EloquentComponentRepository.php | 19 +++++++++++++ 3 files changed, 56 insertions(+) diff --git a/src/Http/Controllers/Api/ComponentController.php b/src/Http/Controllers/Api/ComponentController.php index 13c1fc6e..d192142c 100644 --- a/src/Http/Controllers/Api/ComponentController.php +++ b/src/Http/Controllers/Api/ComponentController.php @@ -94,6 +94,33 @@ class ComponentController extends Controller return $component; } + /** + * Update an existing component. + * + * @param int $id + * + * @return \CachetHQ\Cachet\Models\Component + */ + public function putComponent($id) + { + $component = $this->component->update($id, Binput::except('tags')); + + if (Binput::has('tags')) { + $tags = preg_split('/ ?, ?/', Binput::get('tags')); + + // For every tag, do we need to create it? + $componentTags = array_map(function ($taggable) use ($component) { + return Tag::firstOrCreate([ + 'name' => $taggable, + ])->id; + }, $tags); + + $component->tags()->sync($componentTags); + } + + return $component; + } + /** * Delete an existing component. * diff --git a/src/Repositories/Component/ComponentRepository.php b/src/Repositories/Component/ComponentRepository.php index fdd3fcc7..1b80f9fa 100644 --- a/src/Repositories/Component/ComponentRepository.php +++ b/src/Repositories/Component/ComponentRepository.php @@ -21,6 +21,16 @@ interface ComponentRepository */ public function create($userId, array $data); + /** + * Update a model by id. + * + * @param int $id + * @param array $data + * + * @return \Illuminate\Database\Eloquent\Model + */ + public function update($id, array $data); + /** * Finds a model by id. * diff --git a/src/Repositories/Component/EloquentComponentRepository.php b/src/Repositories/Component/EloquentComponentRepository.php index 7420fff6..f3851d78 100644 --- a/src/Repositories/Component/EloquentComponentRepository.php +++ b/src/Repositories/Component/EloquentComponentRepository.php @@ -45,4 +45,23 @@ class EloquentComponentRepository extends EloquentRepository implements Componen return $component; } + + /** + * Update a model by id. + * + * @param int $id + * @param array $data + * + * @return \Illuminate\Database\Eloquent\Model + */ + public function update($id, array $data) + { + $component = $this->model->findOrFail($id); + $component->fill($data); + $this->validate($component); + + $component->update($data); + + return $component; + } } From cdd31ed05dfb499118628df96a1208209db31144 Mon Sep 17 00:00:00 2001 From: Joseph Cohen Date: Mon, 23 Feb 2015 00:00:20 -0600 Subject: [PATCH 2/2] Use include for relations --- app/routes/api.php | 1 - .../Controllers/Api/ComponentController.php | 12 ------- src/Transformers/ComponentTransformer.php | 34 +++++++++++++++++++ src/Transformers/TagTransformer.php | 27 +++++++++++++++ 4 files changed, 61 insertions(+), 13 deletions(-) create mode 100644 src/Transformers/TagTransformer.php diff --git a/app/routes/api.php b/app/routes/api.php index f5d2c52b..30ad0450 100644 --- a/app/routes/api.php +++ b/app/routes/api.php @@ -4,7 +4,6 @@ Route::api(['after' => 'allowed_domains', 'namespace' => 'CachetHQ\Cachet\Http\C // Components Route::get('components', 'ComponentController@getComponents'); Route::get('components/{id}', 'ComponentController@getComponent'); - Route::get('components/{id}/incidents', 'ComponentController@getComponentIncidents'); // Incidents Route::get('incidents', 'IncidentController@getIncidents'); diff --git a/src/Http/Controllers/Api/ComponentController.php b/src/Http/Controllers/Api/ComponentController.php index d192142c..a63fceef 100644 --- a/src/Http/Controllers/Api/ComponentController.php +++ b/src/Http/Controllers/Api/ComponentController.php @@ -53,18 +53,6 @@ class ComponentController extends Controller return $this->component->findOrFail($id); } - /** - * Return a component with incidents. - * - * @param int $id - * - * @return \CachetHQ\Cachet\Models\Component - */ - public function getComponentIncidents($id) - { - return $this->component->with($id, ['incidents']); - } - /** * Create a new component. * diff --git a/src/Transformers/ComponentTransformer.php b/src/Transformers/ComponentTransformer.php index 4f18f93f..8235e6bd 100644 --- a/src/Transformers/ComponentTransformer.php +++ b/src/Transformers/ComponentTransformer.php @@ -7,6 +7,16 @@ use League\Fractal\TransformerAbstract; class ComponentTransformer extends TransformerAbstract { + /** + * List of resources possible to include. + * + * @var array + */ + protected $availableIncludes = [ + 'incidents', + 'tags', + ]; + /** * Transform a component model into an array. * @@ -27,4 +37,28 @@ class ComponentTransformer extends TransformerAbstract 'updated_at' => $component->updated_at->timestamp, ]; } + + /** + * Include component incidents. + * + * @return League\Fractal\Resource\Collection + */ + public function includeIncidents(Component $component) + { + $incidents = $component->incidents; + + return $this->collection($incidents, new IncidentTransformer()); + } + + /** + * Include components tags. + * + * @return League\Fractal\Resource\Collection + */ + public function includeTags(Component $component) + { + $incidents = $component->tags; + + return $this->collection($incidents, new TagTransformer()); + } } diff --git a/src/Transformers/TagTransformer.php b/src/Transformers/TagTransformer.php new file mode 100644 index 00000000..f17ca3a9 --- /dev/null +++ b/src/Transformers/TagTransformer.php @@ -0,0 +1,27 @@ + (int) $tag->id, + 'name' => $tag->name, + 'description' => $tag->slug, + 'created_at' => $tag->created_at->timestamp, + 'updated_at' => $tag->updated_at->timestamp, + ]; + } +}