Skip to content
This repository has been archived by the owner on Jun 8, 2023. It is now read-only.

feat: life metrics #462

Merged
merged 17 commits into from
May 5, 2023
48 changes: 48 additions & 0 deletions app/Domains/Vault/ManageLifeMetrics/Services/CreateLifeMetric.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
<?php

namespace App\Domains\Vault\ManageLifeMetrics\Services;

use App\Interfaces\ServiceInterface;
use App\Models\LifeMetric;
use App\Services\BaseService;

class CreateLifeMetric extends BaseService implements ServiceInterface
{
/**
* Get the validation rules that apply to the service.
*/
public function rules(): array
{
return [
'account_id' => 'required|uuid|exists:accounts,id',
'vault_id' => 'required|uuid|exists:vaults,id',
'author_id' => 'required|uuid|exists:users,id',
'label' => 'required|string|max:255',
];
}

/**
* Get the permissions that apply to the user calling the service.
*/
public function permissions(): array
{
return [
'author_must_belong_to_account',
'author_must_be_vault_editor',
'vault_must_belong_to_account',
];
}

/**
* Create a life metric.
*/
public function execute(array $data): LifeMetric
{
$this->validateRules($data);

return LifeMetric::create([
'vault_id' => $data['vault_id'],
'label' => $data['label'],
]);
}
}
47 changes: 47 additions & 0 deletions app/Domains/Vault/ManageLifeMetrics/Services/DestroyLifeMetric.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
<?php

namespace App\Domains\Vault\ManageLifeMetrics\Services;

use App\Interfaces\ServiceInterface;
use App\Services\BaseService;

class DestroyLifeMetric extends BaseService implements ServiceInterface
{
/**
* Get the validation rules that apply to the service.
*/
public function rules(): array
{
return [
'account_id' => 'required|uuid|exists:accounts,id',
'vault_id' => 'required|uuid|exists:vaults,id',
'author_id' => 'required|uuid|exists:users,id',
'life_metric_id' => 'required|integer|exists:life_metrics,id',
];
}

/**
* Get the permissions that apply to the user calling the service.
*/
public function permissions(): array
{
return [
'author_must_belong_to_account',
'author_must_be_vault_editor',
'vault_must_belong_to_account',
];
}

/**
* Destroy a life metric.
*/
public function execute(array $data): void
{
$this->validateRules($data);

$lifeMetric = $this->vault->lifeMetrics()
->findOrFail($data['life_metric_id']);

$lifeMetric->delete();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
<?php

namespace App\Domains\Vault\ManageLifeMetrics\Services;

use App\Interfaces\ServiceInterface;
use App\Models\LifeMetric;
use App\Services\BaseService;

class IncrementLifeMetric extends BaseService implements ServiceInterface
{
/**
* Get the validation rules that apply to the service.
*/
public function rules(): array
{
return [
'account_id' => 'required|uuid|exists:accounts,id',
'vault_id' => 'required|uuid|exists:vaults,id',
'author_id' => 'required|uuid|exists:users,id',
'life_metric_id' => 'required|integer|exists:life_metrics,id',
];
}

/**
* Get the permissions that apply to the user calling the service.
*/
public function permissions(): array
{
return [
'author_must_belong_to_account',
'author_must_be_vault_editor',
'vault_must_belong_to_account',
];
}

/**
* Increment the life metric for the given contact.
*/
public function execute(array $data): LifeMetric
{
$this->validateRules($data);

$lifeMetric = $this->vault->lifeMetrics()
->findOrFail($data['life_metric_id']);

$contact = $this->author->getContactInVault($this->vault);

$contact->lifeMetrics()->save($lifeMetric);

return $lifeMetric;
}
}
52 changes: 52 additions & 0 deletions app/Domains/Vault/ManageLifeMetrics/Services/UpdateLifeMetric.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
<?php

namespace App\Domains\Vault\ManageLifeMetrics\Services;

use App\Interfaces\ServiceInterface;
use App\Models\LifeMetric;
use App\Services\BaseService;

class UpdateLifeMetric extends BaseService implements ServiceInterface
{
/**
* Get the validation rules that apply to the service.
*/
public function rules(): array
{
return [
'account_id' => 'required|uuid|exists:accounts,id',
'vault_id' => 'required|uuid|exists:vaults,id',
'author_id' => 'required|uuid|exists:users,id',
'life_metric_id' => 'required|integer|exists:life_metrics,id',
'label' => 'required|string|max:255',
];
}

/**
* Get the permissions that apply to the user calling the service.
*/
public function permissions(): array
{
return [
'author_must_belong_to_account',
'author_must_be_vault_editor',
'vault_must_belong_to_account',
];
}

/**
* Update a life metric.
*/
public function execute(array $data): LifeMetric
{
$this->validateRules($data);

$lifeMetric = $this->vault->lifeMetrics()
->findOrFail($data['life_metric_id']);

$lifeMetric->label = $data['label'];
$lifeMetric->save();

return $lifeMetric;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
<?php

namespace App\Domains\Vault\ManageLifeMetrics\Web\Controllers;

use App\Domains\Vault\ManageLifeMetrics\Services\IncrementLifeMetric;
use App\Domains\Vault\ManageLifeMetrics\Web\ViewHelpers\VaultLifeMetricsViewHelper;
use App\Http\Controllers\Controller;
use App\Models\Vault;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class LifeMetricContactController extends Controller
{
public function store(Request $request, string $vaultId, int $lifeMetricId)
{
$data = [
'account_id' => Auth::user()->account_id,
'author_id' => Auth::id(),
'vault_id' => $vaultId,
'life_metric_id' => $lifeMetricId,
];

$lifeMetric = (new IncrementLifeMetric())->execute($data);

$vault = Vault::find($vaultId);
$contact = Auth::user()->getContactInVault($vault);

return response()->json([
'data' => VaultLifeMetricsViewHelper::dto($lifeMetric, Carbon::now()->year, $contact),
], 201);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
<?php

namespace App\Domains\Vault\ManageLifeMetrics\Web\Controllers;

use App\Domains\Vault\ManageLifeMetrics\Services\CreateLifeMetric;
use App\Domains\Vault\ManageLifeMetrics\Services\DestroyLifeMetric;
use App\Domains\Vault\ManageLifeMetrics\Services\UpdateLifeMetric;
use App\Domains\Vault\ManageLifeMetrics\Web\ViewHelpers\VaultLifeMetricsViewHelper;
use App\Http\Controllers\Controller;
use App\Models\Vault;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class LifeMetricController extends Controller
{
public function store(Request $request, string $vaultId)
{
$data = [
'account_id' => Auth::user()->account_id,
'author_id' => Auth::id(),
'vault_id' => $vaultId,
'label' => $request->input('label'),
];

$lifeMetric = (new CreateLifeMetric())->execute($data);

$vault = Vault::find($vaultId);
$contact = Auth::user()->getContactInVault($vault);

return response()->json([
'data' => VaultLifeMetricsViewHelper::dto($lifeMetric, Carbon::now()->year, $contact),
], 201);
}

public function update(Request $request, string $vaultId, int $lifeMetricId)
{
$data = [
'account_id' => Auth::user()->account_id,
'author_id' => Auth::id(),
'vault_id' => $vaultId,
'life_metric_id' => $lifeMetricId,
'label' => $request->input('label'),
];

$lifeMetric = (new UpdateLifeMetric())->execute($data);
$vault = Vault::find($vaultId);
$contact = Auth::user()->getContactInVault($vault);

return response()->json([
'data' => VaultLifeMetricsViewHelper::dto($lifeMetric, Carbon::now()->year, $contact),
], 200);
}

public function destroy(Request $request, string $vaultId, int $lifeMetricId)
{
$data = [
'account_id' => Auth::user()->account_id,
'author_id' => Auth::id(),
'vault_id' => $vaultId,
'life_metric_id' => $lifeMetricId,
];

(new DestroyLifeMetric())->execute($data);

return response()->json([
'data' => true,
], 200);
}
}