Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
94.59% covered (success)
94.59%
35 / 37
71.43% covered (warning)
71.43%
5 / 7
CRAP
0.00% covered (danger)
0.00%
0 / 1
UserFieldInjectionController
94.59% covered (success)
94.59%
35 / 37
71.43% covered (warning)
71.43%
5 / 7
10.02
0.00% covered (danger)
0.00%
0 / 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%
8 / 8
100.00% covered (success)
100.00%
1 / 1
2
 upsertDomain
100.00% covered (success)
100.00%
6 / 6
100.00% covered (success)
100.00%
1 / 1
1
 removeDomain
75.00% covered (warning)
75.00%
3 / 4
0.00% covered (danger)
0.00%
0 / 1
2.06
 addRemovedEntry
100.00% covered (success)
100.00%
7 / 7
100.00% covered (success)
100.00%
1 / 1
1
 restoreRemovedEntry
88.89% covered (warning)
88.89%
8 / 9
0.00% covered (danger)
0.00%
0 / 1
2.01
 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\Requests\v2\UserFieldInjection\AdminBaseRequest;
7use App\Http\Requests\v2\UserFieldInjection\AdminRemoveEntryRequest;
8use App\Http\Requests\v2\UserFieldInjection\AdminUpsertDomainRequest;
9use App\Http\Resources\v2\UserFieldInjectionResource;
10use App\Http\Services\UserFieldInjectionService;
11use Illuminate\Http\JsonResponse;
12
13/**
14 * Admin User Field Injection Controller
15 *
16 * Allows Vengreso admins to manage field injection customizations
17 * for any user. All endpoints require VENGRESO_ADMIN role.
18 */
19class UserFieldInjectionController extends Controller
20{
21    public function __construct(
22        private readonly UserFieldInjectionService $service
23    ) {}
24
25    /**
26     * Get a user's field injection customizations.
27     *
28     * @param  AdminBaseRequest  $request  Authorized admin request
29     * @param  string  $userId  The target user ID
30     *
31     * @response 200 {"result": {"user_id": "...", "field_injection": [...], "removed_entries": [...]}}
32     */
33    public function index(AdminBaseRequest $request, string $userId): UserFieldInjectionResource|JsonResponse
34    {
35        $config = $this->service->getUserFieldInjectionFresh($userId);
36
37        if (! $config) {
38            return response()->json([
39                'user_id' => $userId,
40                'field_injection' => [],
41                'removed_entries' => [],
42            ]);
43        }
44
45        return new UserFieldInjectionResource($config);
46    }
47
48    /**
49     * Add or update fields for a specific domain on a user's config.
50     *
51     * @param  AdminUpsertDomainRequest  $request  Validated admin request with fields array
52     * @param  string  $userId  The target user ID
53     * @param  string  $domain  The domain name to upsert
54     *
55     * @response 200 {"result": {"user_id": "...", "field_injection": [...], "removed_entries": [...]}}
56     */
57    public function upsertDomain(AdminUpsertDomainRequest $request, string $userId, string $domain): UserFieldInjectionResource
58    {
59        $config = $this->service->upsertDomain(
60            $userId,
61            $domain,
62            $request->validated()['fields']
63        );
64
65        return new UserFieldInjectionResource($config);
66    }
67
68    /**
69     * Remove a domain entry from a user's config.
70     *
71     * @param  AdminBaseRequest  $request  Authorized admin request
72     * @param  string  $userId  The target user ID
73     * @param  string  $domain  The domain to remove
74     *
75     * @response 200 {"result": {"user_id": "...", "field_injection": [...], "removed_entries": [...]}}
76     */
77    public function removeDomain(AdminBaseRequest $request, string $userId, string $domain): UserFieldInjectionResource|JsonResponse
78    {
79        $config = $this->service->removeDomain($userId, $domain);
80
81        if (! $config) {
82            return response()->json(['error' => 'No customizations found'], 404);
83        }
84
85        return new UserFieldInjectionResource($config);
86    }
87
88    /**
89     * Mark a global {domain, selector} pair as removed for a user.
90     *
91     * @param  AdminRemoveEntryRequest  $request  Validated admin request with domain and selector
92     * @param  string  $userId  The target user ID
93     *
94     * @response 200 {"result": {"user_id": "...", "field_injection": [...], "removed_entries": [...]}}
95     */
96    public function addRemovedEntry(AdminRemoveEntryRequest $request, string $userId): UserFieldInjectionResource
97    {
98        $validated = $request->validated();
99
100        $config = $this->service->addRemovedEntry(
101            $userId,
102            $validated['domain'],
103            $validated['selector']
104        );
105
106        return new UserFieldInjectionResource($config);
107    }
108
109    /**
110     * Restore a previously removed global entry for a user.
111     *
112     * @param  AdminRemoveEntryRequest  $request  Validated admin request with domain and selector
113     * @param  string  $userId  The target user ID
114     *
115     * @response 200 {"result": {"user_id": "...", "field_injection": [...], "removed_entries": [...]}}
116     */
117    public function restoreRemovedEntry(AdminRemoveEntryRequest $request, string $userId): UserFieldInjectionResource|JsonResponse
118    {
119        $validated = $request->validated();
120
121        $config = $this->service->restoreRemovedEntry(
122            $userId,
123            $validated['domain'],
124            $validated['selector']
125        );
126
127        if (! $config) {
128            return response()->json(['error' => 'No customizations found'], 404);
129        }
130
131        return new UserFieldInjectionResource($config);
132    }
133
134    /**
135     * Reset all customizations for a user.
136     *
137     * @param  AdminBaseRequest  $request  Authorized admin request
138     * @param  string  $userId  The target user ID
139     *
140     * @response 200 {"message": "Customizations reset successfully"}
141     */
142    public function destroy(AdminBaseRequest $request, string $userId): JsonResponse
143    {
144        $this->service->deleteAll($userId);
145
146        return response()->json(['message' => 'Customizations reset successfully']);
147    }
148}