Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
11 / 11
100.00% covered (success)
100.00%
2 / 2
CRAP
100.00% covered (success)
100.00%
1 / 1
ExtensionController
100.00% covered (success)
100.00%
11 / 11
100.00% covered (success)
100.00%
2 / 2
3
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
 files
100.00% covered (success)
100.00%
10 / 10
100.00% covered (success)
100.00%
1 / 1
2
1<?php
2
3namespace App\Http\Controllers\v2\Admin;
4
5use App\Http\Controllers\Controller;
6use App\Http\Requests\v2\Extension\Admin\IndexExtensionFilesRequest;
7use App\Http\Services\ExtensionService;
8use Exception;
9use Illuminate\Http\JsonResponse;
10
11/**
12 * Extension Controller
13 *
14 * Manages FlyMSG extension file listings from GitHub releases and artifacts.
15 * Admin-only endpoints for VengresoAdmin users.
16 */
17class ExtensionController extends Controller
18{
19    public function __construct(
20        private ExtensionService $extensionService
21    ) {}
22
23    /**
24     * Get available extension files from GitHub
25     *
26     * Fetches production releases (GitHub Releases) and staging builds (GitHub Actions artifacts)
27     * for the FlyMSG Chrome and Edge extensions.
28     *
29     * @param  IndexExtensionFilesRequest  $request  Validated request with authorization
30     *
31     * @response 200 {
32     *   "result": {
33     *     "production": [
34     *       {
35     *         "version": "1.2.3",
36     *         "build": 4,
37     *         "browser": "chrome",
38     *         "file_name": "chrome-extension-v1.2.3-build.4.zip",
39     *         "download_url": "https://github.com/.../chrome-extension.zip",
40     *         "size_bytes": 1024000,
41     *         "published_at": 1642521600,
42     *         "source": "release"
43     *       }
44     *     ],
45     *     "staging": [
46     *       {
47     *         "version": "1.2.4-staging",
48     *         "browser": "chrome",
49     *         "artifact_name": "chrome-staging-1.2.4",
50     *         "download_url": "https://api.github.com/.../zip",
51     *         "size_bytes": 1024000,
52     *         "created_at": 1642521600,
53     *         "expires_at": 1645113600,
54     *         "expired": false,
55     *         "source": "artifact"
56     *       }
57     *     ],
58     *     "meta": {
59     *       "current_page": 1,
60     *       "per_page": 30,
61     *       "total": 45,
62     *       "total_production": 25,
63     *       "total_staging": 20
64     *     }
65     *   }
66     * }
67     *
68     * @throws Exception When GitHub API fails or configuration is invalid
69     */
70    public function files(IndexExtensionFilesRequest $request): JsonResponse
71    {
72        try {
73            $files = $this->extensionService->getExtensionFiles(
74                $request->includeExpired(),
75                $request->page(),
76                $request->perPage()
77            );
78
79            return response()->json($files);
80        } catch (Exception $e) {
81            return response()->json([
82                'error' => $e->getMessage(),
83            ], 500);
84        }
85    }
86}