Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
95.83% covered (success)
95.83%
23 / 24
75.00% covered (warning)
75.00%
3 / 4
CRAP
0.00% covered (danger)
0.00%
0 / 1
AIRequestLogController
95.83% covered (success)
95.83%
23 / 24
75.00% covered (warning)
75.00%
3 / 4
7
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%
13 / 13
100.00% covered (success)
100.00%
1 / 1
1
 show
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
2
 regenerate
83.33% covered (warning)
83.33%
5 / 6
0.00% covered (danger)
0.00%
0 / 1
3.04
1<?php
2
3namespace App\Http\Controllers\v2\Admin;
4
5use App\Http\Controllers\Controller;
6use App\Http\Requests\v2\AIRequestLog\IndexAIRequestLogRequest;
7use App\Http\Requests\v2\AIRequestLog\RegenerateAIRequestLogRequest;
8use App\Http\Requests\v2\AIRequestLog\ShowAIRequestLogRequest;
9use App\Http\Resources\v2\AIRequestLogResource;
10use App\Http\Services\AIRequestLogService;
11use Illuminate\Http\JsonResponse;
12use Illuminate\Http\Resources\Json\AnonymousResourceCollection;
13
14/**
15 * Admin controller for AI request log monitoring.
16 *
17 * Provides endpoints for listing, viewing, and regenerating
18 * AI request logs in the CMC admin panel.
19 */
20class AIRequestLogController extends Controller
21{
22    public function __construct(
23        private readonly AIRequestLogService $aiRequestLogService
24    ) {}
25
26    /**
27     * List AI request logs with optional filters and pagination.
28     *
29     * @param  IndexAIRequestLogRequest  $request  Validated request with filter parameters
30     *
31     * @response 200 {"result": {"data": [{"id": "...", "user_name": "...", ...}], "meta": {"current_page": 1, "per_page": 25, "total": 100}}}
32     */
33    public function index(IndexAIRequestLogRequest $request): AnonymousResourceCollection
34    {
35        $filters = $request->only([
36            'user_id',
37            'company_id',
38            'feature',
39            'status',
40            'search',
41            'sort_order',
42            'date_from',
43            'date_to',
44        ]);
45
46        $perPage = $request->input('per_page', 25);
47
48        $logs = $this->aiRequestLogService->getAllPaginated($filters, $perPage);
49
50        return AIRequestLogResource::collection($logs);
51    }
52
53    /**
54     * Get a single AI request log entry.
55     *
56     * @param  ShowAIRequestLogRequest  $request  Validated request (authorization only)
57     * @param  string  $id  The log entry ID
58     * @return AIRequestLogResource
59     *
60     * @response 200 {"result": {"id": "...", "prompt_input": "...", "prompt_output": "..."}}
61     * @response 404 {"error": "AI request log not found."}
62     */
63    public function show(ShowAIRequestLogRequest $request, string $id): AIRequestLogResource|JsonResponse
64    {
65        $log = $this->aiRequestLogService->findById($id);
66
67        if (! $log) {
68            return response()->json(['error' => 'AI request log not found.'], 404);
69        }
70
71        return new AIRequestLogResource($log);
72    }
73
74    /**
75     * Re-execute an AI request with modified parameters.
76     *
77     * Creates a new log entry with regenerated=true and the modified prompt/config.
78     *
79     * @param  RegenerateAIRequestLogRequest  $request  Validated request with modified parameters
80     * @param  string  $id  The original log entry ID to regenerate from
81     *
82     * @response 201 {"result": {"id": "...", "regenerated": true, "regenerated_from_id": "..."}}
83     * @response 404 {"error": "AI request log not found."}
84     */
85    public function regenerate(RegenerateAIRequestLogRequest $request, string $id): AIRequestLogResource|JsonResponse
86    {
87        try {
88            $log = $this->aiRequestLogService->regenerate($id, $request->validated());
89
90            return (new AIRequestLogResource($log))->response()->setStatusCode(201);
91        } catch (\Exception $e) {
92            if ($e->getMessage() === 'Original AI request log not found.') {
93                return response()->json(['error' => $e->getMessage()], 404);
94            }
95
96            throw $e;
97        }
98    }
99}