Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
12 / 12
100.00% covered (success)
100.00%
6 / 6
CRAP
100.00% covered (success)
100.00%
1 / 1
PromptToneController
100.00% covered (success)
100.00%
12 / 12
100.00% covered (success)
100.00%
6 / 6
6
100.00% covered (success)
100.00%
1 / 1
 __construct
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 index
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
 show
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 store
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
1
 update
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
 destroy
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2
3namespace App\Http\Controllers\v2\Admin;
4
5use App\Http\Controllers\Controller;
6use App\Http\Models\PromptTone;
7use App\Http\Requests\v2\PromptTone\DestroyPromptToneRequest;
8use App\Http\Requests\v2\PromptTone\IndexPromptToneRequest;
9use App\Http\Requests\v2\PromptTone\ShowPromptToneRequest;
10use App\Http\Requests\v2\PromptTone\StorePromptToneRequest;
11use App\Http\Requests\v2\PromptTone\UpdatePromptToneRequest;
12use App\Http\Resources\v2\PromptToneResource;
13use App\Http\Services\PromptToneService;
14use Illuminate\Http\JsonResponse;
15use Illuminate\Http\Resources\Json\AnonymousResourceCollection;
16
17/**
18 * Controller for managing prompt tone configurations.
19 *
20 * Only accessible by users with the VENGRESO_ADMIN role.
21 * Provides CRUD operations for the prompt_tone collection,
22 * which stores tone of voice options used by engage and post AI features.
23 */
24class PromptToneController extends Controller
25{
26    public function __construct(
27        private PromptToneService $promptToneService
28    ) {}
29
30    /**
31     * Get all prompt tones.
32     *
33     * Returns tones ordered by newest first (created_at desc).
34     *
35     * @param  IndexPromptToneRequest  $request  Validated request (authorization only)
36     *
37     * @response 200 {
38     *   "result": {
39     *     "data": [
40     *       {
41     *         "id": "684c1ce8dca2c6351807ec23",
42     *         "name": "Professional",
43     *         "prompt": "Write in a professional tone...",
44     *         "created_at": 1718278600,
45     *         "updated_at": 1718278600
46     *       }
47     *     ]
48     *   }
49     * }
50     */
51    public function index(IndexPromptToneRequest $request): AnonymousResourceCollection
52    {
53        $tones = $this->promptToneService->getAll();
54
55        return PromptToneResource::collection($tones);
56    }
57
58    /**
59     * Get a single prompt tone by ID.
60     *
61     * @param  ShowPromptToneRequest  $request  Validated request (authorization only)
62     * @param  PromptTone  $promptTone  The prompt tone to retrieve (route model binding)
63     *
64     * @response 200 {
65     *   "result": {
66     *     "data": {
67     *       "id": "684c1ce8dca2c6351807ec23",
68     *       "name": "Professional",
69     *       "prompt": "Write in a professional tone...",
70     *       "created_at": 1718278600,
71     *       "updated_at": 1718278600
72     *     }
73     *   }
74     * }
75     */
76    public function show(ShowPromptToneRequest $request, PromptTone $promptTone): PromptToneResource
77    {
78        return new PromptToneResource($promptTone);
79    }
80
81    /**
82     * Create a new prompt tone.
83     *
84     * @param  StorePromptToneRequest  $request  Validated request with prompt tone data
85     *
86     * @response 201 {
87     *   "result": {
88     *     "data": {
89     *       "id": "684c1ce8dca2c6351807ec23",
90     *       "name": "Casual",
91     *       "prompt": "Write in a casual tone...",
92     *       "created_at": 1718278600,
93     *       "updated_at": 1718278600
94     *     }
95     *   }
96     * }
97     */
98    public function store(StorePromptToneRequest $request): JsonResponse
99    {
100        $tone = $this->promptToneService->create($request->validated());
101
102        return (new PromptToneResource($tone))
103            ->response()
104            ->setStatusCode(201);
105    }
106
107    /**
108     * Update an existing prompt tone.
109     *
110     * @param  UpdatePromptToneRequest  $request  Validated request with update data
111     * @param  PromptTone  $promptTone  The prompt tone to update (route model binding)
112     *
113     * @response 200 {
114     *   "result": {
115     *     "data": {
116     *       "id": "684c1ce8dca2c6351807ec23",
117     *       "name": "Updated Tone",
118     *       "prompt": "Updated prompt...",
119     *       "created_at": 1718278600,
120     *       "updated_at": 1718278600
121     *     }
122     *   }
123     * }
124     */
125    public function update(UpdatePromptToneRequest $request, PromptTone $promptTone): PromptToneResource
126    {
127        $tone = $this->promptToneService->update($promptTone, $request->validated());
128
129        return new PromptToneResource($tone);
130    }
131
132    /**
133     * Delete a prompt tone.
134     *
135     * @param  DestroyPromptToneRequest  $request  Validated request (authorization only)
136     * @param  PromptTone  $promptTone  The prompt tone to delete (route model binding)
137     *
138     * @response 204 No content
139     */
140    public function destroy(DestroyPromptToneRequest $request, PromptTone $promptTone): JsonResponse
141    {
142        $this->promptToneService->delete($promptTone);
143
144        return response()->json(null, 204);
145    }
146}