|
9 | 9 | use App\Http\Resources\DNSRecordResource; |
10 | 10 | use App\Models\DNSRecord; |
11 | 11 | use App\Models\Domain; |
| 12 | +use App\Models\Project; |
12 | 13 | use Illuminate\Http\JsonResponse; |
13 | 14 | use Illuminate\Http\Request; |
14 | 15 | use Illuminate\Http\Resources\Json\ResourceCollection; |
|
19 | 20 | use Spatie\RouteAttributes\Attributes\Post; |
20 | 21 | use Spatie\RouteAttributes\Attributes\Prefix; |
21 | 22 |
|
22 | | -#[Prefix('api/domains/{domain}/records')] |
23 | | -#[Middleware(['auth:sanctum'])] |
| 23 | +#[Prefix('api/projects/{project}/domains/{domain}/records')] |
| 24 | +#[Middleware(['auth:sanctum', 'can-see-project'])] |
24 | 25 | class DNSRecordController extends Controller |
25 | 26 | { |
26 | 27 | #[Get('/', name: 'api.dns-records', middleware: 'ability:read')] |
27 | | - public function index(Domain $domain): ResourceCollection |
| 28 | + public function index(Project $project, Domain $domain): ResourceCollection |
28 | 29 | { |
29 | 30 | $this->authorize('view', $domain); |
30 | 31 |
|
| 32 | + $this->validateRoute($project, $domain); |
| 33 | + |
31 | 34 | $records = $domain->records()->orderBy('type')->orderBy('name')->get(); |
32 | 35 |
|
33 | 36 | return DNSRecordResource::collection($records); |
34 | 37 | } |
35 | 38 |
|
36 | 39 | #[Post('/', name: 'api.dns-records.create', middleware: 'ability:write')] |
37 | | - public function create(Request $request, Domain $domain): DNSRecordResource |
| 40 | + public function create(Request $request, Project $project, Domain $domain): DNSRecordResource |
38 | 41 | { |
39 | 42 | $this->authorize('update', $domain); |
40 | 43 |
|
| 44 | + $this->validateRoute($project, $domain); |
| 45 | + |
41 | 46 | $record = app(CreateDNSRecord::class)->create($domain, $request->all()); |
42 | 47 |
|
43 | 48 | return new DNSRecordResource($record); |
44 | 49 | } |
45 | 50 |
|
46 | 51 | #[Get('{dnsRecord}', name: 'api.dns-records.show', middleware: 'ability:read')] |
47 | | - public function show(Domain $domain, DNSRecord $dnsRecord): DNSRecordResource |
| 52 | + public function show(Project $project, Domain $domain, DNSRecord $dnsRecord): DNSRecordResource |
48 | 53 | { |
49 | | - if ($dnsRecord->domain_id !== $domain->id) { |
50 | | - abort(404); |
51 | | - } |
52 | | - |
53 | 54 | $this->authorize('view', $domain); |
54 | 55 |
|
| 56 | + $this->validateRoute($project, $domain); |
| 57 | + |
| 58 | + $this->validateRecord($domain, $dnsRecord); |
| 59 | + |
55 | 60 | return new DNSRecordResource($dnsRecord); |
56 | 61 | } |
57 | 62 |
|
58 | 63 | #[Patch('{dnsRecord}', name: 'api.dns-records.update', middleware: 'ability:write')] |
59 | | - public function update(Request $request, Domain $domain, DNSRecord $dnsRecord): DNSRecordResource |
| 64 | + public function update(Request $request, Project $project, Domain $domain, DNSRecord $dnsRecord): DNSRecordResource |
60 | 65 | { |
61 | | - if ($dnsRecord->domain_id !== $domain->id) { |
62 | | - abort(404); |
63 | | - } |
64 | | - |
65 | 66 | $this->authorize('update', $domain); |
66 | 67 |
|
| 68 | + $this->validateRoute($project, $domain); |
| 69 | + |
| 70 | + $this->validateRecord($domain, $dnsRecord); |
| 71 | + |
67 | 72 | app(UpdateDNSRecord::class)->update($dnsRecord, $request->all()); |
68 | 73 |
|
69 | 74 | return new DNSRecordResource($dnsRecord); |
70 | 75 | } |
71 | 76 |
|
72 | 77 | #[Delete('{dnsRecord}', name: 'api.dns-records.destroy', middleware: 'ability:write')] |
73 | | - public function destroy(Domain $domain, DNSRecord $dnsRecord): JsonResponse |
| 78 | + public function destroy(Project $project, Domain $domain, DNSRecord $dnsRecord): JsonResponse |
74 | 79 | { |
75 | | - if ($dnsRecord->domain_id !== $domain->id) { |
76 | | - abort(404); |
77 | | - } |
78 | | - |
79 | 80 | $this->authorize('update', $domain); |
| 81 | + $this->validateRoute($project, $domain); |
| 82 | + $this->validateRecord($domain, $dnsRecord); |
80 | 83 |
|
81 | 84 | app(DeleteDNSRecord::class)->delete($dnsRecord); |
82 | 85 |
|
83 | 86 | return response()->json(['message' => 'DNS record deleted successfully']); |
84 | 87 | } |
| 88 | + |
| 89 | + private function validateRoute(Project $project, Domain $domain): void |
| 90 | + { |
| 91 | + if ($project->id !== $domain->project_id) { |
| 92 | + abort(404, 'Domain not found in project'); |
| 93 | + } |
| 94 | + } |
| 95 | + |
| 96 | + private function validateRecord(Domain $domain, DNSRecord $dnsRecord): void |
| 97 | + { |
| 98 | + if ($dnsRecord->domain_id !== $domain->id) { |
| 99 | + abort(404, 'DNS record not found in domain'); |
| 100 | + } |
| 101 | + } |
85 | 102 | } |
0 commit comments