Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 54
0.00% covered (danger)
0.00%
0 / 10
CRAP
0.00% covered (danger)
0.00%
0 / 1
AdminVapiConfigController
0.00% covered (danger)
0.00%
0 / 54
0.00% covered (danger)
0.00%
0 / 10
132
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getGlobalDefaults
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
2
 updateGlobalDefaults
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
2
 getCompanyVapiConfig
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
2
 updateCompanyVapiConfig
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
2
 deleteCompanyVapiConfig
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
2
 getUserVapiConfig
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
2
 updateUserVapiConfig
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
2
 deleteUserVapiConfig
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
2
 previewMergedConfig
0.00% covered (danger)
0.00%
0 / 12
0.00% covered (danger)
0.00%
0 / 1
6
1<?php
2
3namespace App\Http\Controllers\v2\Admin;
4
5use App\Http\Controllers\Controller;
6use App\Http\Models\Auth\User;
7use App\Http\Services\VapiConfigService;
8use Illuminate\Http\JsonResponse;
9use Illuminate\Http\Request;
10
11/**
12 * Admin controller for managing VAPI configuration at all levels.
13 *
14 * Provides CRUD operations for global defaults, company overrides,
15 * and user overrides. Only accessible by users with VENGRESO_ADMIN role.
16 */
17class AdminVapiConfigController extends Controller
18{
19    public function __construct(
20        private readonly VapiConfigService $vapiConfigService
21    ) {}
22
23    /**
24     * Get the global VAPI defaults.
25     *
26     * @param Request $request
27     * @return JsonResponse
28     *
29     * @response 200 {"result": {"data": {...}}}
30     */
31    public function getGlobalDefaults(Request $request): JsonResponse
32    {
33        $defaults = $this->vapiConfigService->getGlobalDefaults();
34
35        return response()->json([
36            'data' => $defaults,
37        ]);
38    }
39
40    /**
41     * Update the global VAPI defaults.
42     *
43     * @param Request $request
44     * @return JsonResponse
45     *
46     * @response 200 {"result": {"data": {...}}}
47     */
48    public function updateGlobalDefaults(Request $request): JsonResponse
49    {
50        $request->validate([
51            'value' => 'required|array',
52        ]);
53
54        $updated = $this->vapiConfigService->updateGlobalDefaults($request->input('value'));
55
56        return response()->json([
57            'data' => $updated,
58        ]);
59    }
60
61    /**
62     * Get company-level VAPI overrides.
63     *
64     * @param Request $request
65     * @param string $companyId
66     * @return JsonResponse
67     *
68     * @response 200 {"result": {"data": {...}}}
69     */
70    public function getCompanyVapiConfig(Request $request, string $companyId): JsonResponse
71    {
72        $overrides = $this->vapiConfigService->getCompanyOverrides($companyId);
73
74        return response()->json([
75            'data' => $overrides,
76        ]);
77    }
78
79    /**
80     * Update company-level VAPI overrides.
81     *
82     * @param Request $request
83     * @param string $companyId
84     * @return JsonResponse
85     *
86     * @response 200 {"result": {"data": {...}}}
87     */
88    public function updateCompanyVapiConfig(Request $request, string $companyId): JsonResponse
89    {
90        $request->validate([
91            'value' => 'required|array',
92        ]);
93
94        $updated = $this->vapiConfigService->updateCompanyOverrides($companyId, $request->input('value'));
95
96        return response()->json([
97            'data' => $updated,
98        ]);
99    }
100
101    /**
102     * Delete company-level VAPI overrides (reset to global defaults).
103     *
104     * @param Request $request
105     * @param string $companyId
106     * @return JsonResponse
107     *
108     * @response 200 {"result": {"message": "Company VAPI config deleted."}}
109     */
110    public function deleteCompanyVapiConfig(Request $request, string $companyId): JsonResponse
111    {
112        $this->vapiConfigService->deleteCompanyOverrides($companyId);
113
114        return response()->json([
115            'message' => 'Company VAPI config deleted.',
116        ]);
117    }
118
119    /**
120     * Get user-level VAPI overrides.
121     *
122     * @param Request $request
123     * @param string $userId
124     * @return JsonResponse
125     *
126     * @response 200 {"result": {"data": {...}}}
127     */
128    public function getUserVapiConfig(Request $request, string $userId): JsonResponse
129    {
130        $overrides = $this->vapiConfigService->getUserOverrides($userId);
131
132        return response()->json([
133            'data' => $overrides,
134        ]);
135    }
136
137    /**
138     * Update user-level VAPI overrides.
139     *
140     * @param Request $request
141     * @param string $userId
142     * @return JsonResponse
143     *
144     * @response 200 {"result": {"data": {...}}}
145     */
146    public function updateUserVapiConfig(Request $request, string $userId): JsonResponse
147    {
148        $request->validate([
149            'value' => 'required|array',
150        ]);
151
152        $updated = $this->vapiConfigService->updateUserOverrides($userId, $request->input('value'));
153
154        return response()->json([
155            'data' => $updated,
156        ]);
157    }
158
159    /**
160     * Delete user-level VAPI overrides (reset to company/global defaults).
161     *
162     * @param Request $request
163     * @param string $userId
164     * @return JsonResponse
165     *
166     * @response 200 {"result": {"message": "User VAPI config deleted."}}
167     */
168    public function deleteUserVapiConfig(Request $request, string $userId): JsonResponse
169    {
170        $this->vapiConfigService->deleteUserOverrides($userId);
171
172        return response()->json([
173            'message' => 'User VAPI config deleted.',
174        ]);
175    }
176
177    /**
178     * Preview the merged config for a specific user (bypasses cache).
179     *
180     * @param Request $request
181     * @param string $userId
182     * @return JsonResponse
183     *
184     * @response 200 {"result": {"data": {...}}}
185     */
186    public function previewMergedConfig(Request $request, string $userId): JsonResponse
187    {
188        $user = User::find($userId);
189
190        if (!$user) {
191            return response()->json([
192                'error' => 'User not found.',
193            ], 404);
194        }
195
196        $config = $this->vapiConfigService->previewMergedConfig(
197            $userId,
198            $user->company_id ?? null
199        );
200
201        return response()->json([
202            'data' => $config,
203        ]);
204    }
205}