Bladeren bron

feat(unit-payment-account): endpoints /me para salvar e consultar a chave Asaas da unidade

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
ebagabee 4 weken geleden
bovenliggende
commit
d07878b1f6

+ 49 - 0
app/Http/Controllers/UnitPaymentAccountController.php

@@ -0,0 +1,49 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Http\Controllers\Concerns\ResolvesActiveUnit;
+use App\Http\Requests\UnitPaymentAccountRequest;
+use App\Http\Resources\UnitPaymentAccountResource;
+use App\Services\UnitPaymentAccountService;
+use Illuminate\Http\JsonResponse;
+
+class UnitPaymentAccountController extends Controller
+{
+    use ResolvesActiveUnit;
+
+    public function __construct(
+        protected UnitPaymentAccountService $service,
+    ) {}
+
+    public function showMe(): JsonResponse
+    {
+        $unitId = $this->activeUnitId();
+
+        if (!$unitId) {
+            return $this->errorResponse(message: 'Unidade não encontrada', code: 404);
+        }
+
+        $item = $this->service->getByUnitId($unitId);
+
+        return $this->successResponse(
+            payload: $item ? new UnitPaymentAccountResource($item) : null,
+        );
+    }
+
+    public function upsertMe(UnitPaymentAccountRequest $request): JsonResponse
+    {
+        $unitId = $this->activeUnitId();
+
+        if (!$unitId) {
+            return $this->errorResponse(message: 'Unidade não encontrada', code: 404);
+        }
+
+        $item = $this->service->upsertAsaasApiKey($unitId, $request->validated('asaas_api_key'));
+
+        return $this->successResponse(
+            payload: new UnitPaymentAccountResource($item),
+            message: __('messages.updated'),
+        );
+    }
+}

+ 16 - 0
app/Http/Requests/UnitPaymentAccountRequest.php

@@ -0,0 +1,16 @@
+<?php
+
+namespace App\Http\Requests;
+
+use Illuminate\Foundation\Http\FormRequest;
+
+class UnitPaymentAccountRequest extends FormRequest
+{
+    public function rules(): array
+    {
+        return [
+            // Pode vir vazia para limpar a integração. Chaves do Asaas são longas.
+            'asaas_api_key' => 'present|nullable|string|max:500',
+        ];
+    }
+}

+ 29 - 0
app/Http/Resources/UnitPaymentAccountResource.php

@@ -0,0 +1,29 @@
+<?php
+
+namespace App\Http\Resources;
+
+use Illuminate\Http\Request;
+use Illuminate\Http\Resources\Json\JsonResource;
+
+/**
+ * Nunca expõe a api_key em texto puro: devolve apenas se está configurada e
+ * uma versão mascarada (últimos 4 caracteres) para confirmação visual.
+ */
+class UnitPaymentAccountResource extends JsonResource
+{
+    public function toArray(Request $request): array
+    {
+        $key = $this->asaas_api_key;
+
+        return [
+            'id'                   => $this->id,
+            'unit_id'              => $this->unit_id,
+            'status'               => $this->status,
+            'asaas_configured'     => filled($key),
+            'asaas_api_key_masked' => filled($key)
+                ? str_repeat('•', 8) . mb_substr($key, -4)
+                : null,
+            'onboarded_at'         => $this->onboarded_at?->format('Y-m-d H:i:s'),
+        ];
+    }
+}

+ 34 - 0
app/Services/UnitPaymentAccountService.php

@@ -0,0 +1,34 @@
+<?php
+
+namespace App\Services;
+
+use App\Models\UnitPaymentAccount;
+
+class UnitPaymentAccountService
+{
+    public function getByUnitId(int $unitId): ?UnitPaymentAccount
+    {
+        return UnitPaymentAccount::where('unit_id', $unitId)->first();
+    }
+
+    /**
+     * Cria/atualiza a conta de pagamento da unidade.
+     *
+     * Quando a chave vem vazia, a integração é considerada limpa (status pending).
+     */
+    public function upsertAsaasApiKey(int $unitId, ?string $apiKey): UnitPaymentAccount
+    {
+        $apiKey = $apiKey !== null ? trim($apiKey) : null;
+        $hasKey = $apiKey !== null && $apiKey !== '';
+
+        $model = UnitPaymentAccount::firstOrNew(['unit_id' => $unitId]);
+
+        $model->asaas_api_key = $hasKey ? $apiKey : null;
+        $model->status        = $hasKey ? UnitPaymentAccount::STATUS_ACTIVE : UnitPaymentAccount::STATUS_PENDING;
+        $model->onboarded_at  = $hasKey ? ($model->onboarded_at ?? now()) : null;
+
+        $model->save();
+
+        return $model->fresh();
+    }
+}

+ 9 - 0
routes/authRoutes/unit_payment_account.php

@@ -0,0 +1,9 @@
+<?php
+
+use Illuminate\Support\Facades\Route;
+use App\Http\Controllers\UnitPaymentAccountController;
+
+Route::controller(UnitPaymentAccountController::class)->prefix('unit-payment-account')->group(function () {
+    Route::get('/me', 'showMe');
+    Route::post('/me', 'upsertMe');
+});