Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
37 / 37
100.00% covered (success)
100.00%
7 / 7
CRAP
100.00% covered (success)
100.00%
1 / 1
UserFieldInjectionController
100.00% covered (success)
100.00%
37 / 37
100.00% covered (success)
100.00%
7 / 7
10
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%
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
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
2
 addRemovedEntry
100.00% covered (success)
100.00%
7 / 7
100.00% covered (success)
100.00%
1 / 1
1
 restoreRemovedEntry
100.00% covered (success)
100.00%
9 / 9
100.00% covered (success)
100.00%
1 / 1
2
 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;
4
5use App\Http\Controllers\Controller;
6use App\Http\Requests\v2\UserFieldInjection\RemoveEntryRequest;
7use App\Http\Requests\v2\UserFieldInjection\UpsertDomainRequest;
8use App\Http\Resources\v2\UserFieldInjectionResource;
9use App\Http\Services\UserFieldInjectionService;
10use Illuminate\Http\JsonResponse;
11use Illuminate\Http\Request;
12
13/**
14 * User Field Injection Controller
15 *
16 * Allows authenticated users to customize their own field injection rules.
17 * Users can add/override domain entries, remove global entries, and reset
18 * their customizations.
19 */
20class UserFieldInjectionController extends Controller
21{
22    public function __construct(
23        private readonly UserFieldInjectionService $service
24    ) {}
25
26    /**
27     * Get the authenticated user's field injection customizations.
28     *
29     * @param  Request  $request  The authenticated request
30     *
31     * @response 200 {"result": {"user_id": "...", "field_injection": [...], "removed_entries": [...]}}
32     */
33    public function index(Request $request): UserFieldInjectionResource|JsonResponse
34    {
35        $config = $this->service->getUserFieldInjectionFresh($request->user()->_id);
36
37        if (! $config) {
38            return response()->json([
39                'user_id' => $request->user()->_id,
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.
50     *
51     * @param  UpsertDomainRequest  $request  Validated request with fields array
52     * @param  string  $domain  The domain name to upsert
53     *
54     * @response 200 {"result": {"user_id": "...", "field_injection": [...], "removed_entries": [...]}}
55     */
56    public function upsertDomain(UpsertDomainRequest $request, string $domain): UserFieldInjectionResource
57    {
58        $config = $this->service->upsertDomain(
59            $request->user()->_id,
60            $domain,
61            $request->validated()['fields']
62        );
63
64        return new UserFieldInjectionResource($config);
65    }
66
67    /**
68     * Remove a user's custom domain entry.
69     *
70     * @param  Request  $request  The authenticated request
71     * @param  string  $domain  The domain name to remove
72     *
73     * @response 200 {"result": {"user_id": "...", "field_injection": [...], "removed_entries": [...]}}
74     */
75    public function removeDomain(Request $request, string $domain): UserFieldInjectionResource|JsonResponse
76    {
77        $config = $this->service->removeDomain($request->user()->_id, $domain);
78
79        if (! $config) {
80            return response()->json(['error' => 'No customizations found'], 404);
81        }
82
83        return new UserFieldInjectionResource($config);
84    }
85
86    /**
87     * Mark a global {domain, selector} pair as removed for this user.
88     *
89     * @param  RemoveEntryRequest  $request  Validated request with domain and selector
90     *
91     * @response 200 {"result": {"user_id": "...", "field_injection": [...], "removed_entries": [...]}}
92     */
93    public function addRemovedEntry(RemoveEntryRequest $request): UserFieldInjectionResource
94    {
95        $validated = $request->validated();
96
97        $config = $this->service->addRemovedEntry(
98            $request->user()->_id,
99            $validated['domain'],
100            $validated['selector']
101        );
102
103        return new UserFieldInjectionResource($config);
104    }
105
106    /**
107     * Restore a previously removed global entry.
108     *
109     * @param  RemoveEntryRequest  $request  Validated request with domain and selector
110     *
111     * @response 200 {"result": {"user_id": "...", "field_injection": [...], "removed_entries": [...]}}
112     */
113    public function restoreRemovedEntry(RemoveEntryRequest $request): UserFieldInjectionResource|JsonResponse
114    {
115        $validated = $request->validated();
116
117        $config = $this->service->restoreRemovedEntry(
118            $request->user()->_id,
119            $validated['domain'],
120            $validated['selector']
121        );
122
123        if (! $config) {
124            return response()->json(['error' => 'No customizations found'], 404);
125        }
126
127        return new UserFieldInjectionResource($config);
128    }
129
130    /**
131     * Reset all user customizations (delete user config).
132     *
133     * @param  Request  $request  The authenticated request
134     *
135     * @response 200 {"message": "Customizations reset successfully"}
136     */
137    public function destroy(Request $request): JsonResponse
138    {
139        $this->service->deleteAll($request->user()->_id);
140
141        return response()->json(['message' => 'Customizations reset successfully']);
142    }
143}