Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 71
0.00% covered (danger)
0.00%
0 / 9
CRAP
0.00% covered (danger)
0.00%
0 / 1
UserPersonaController
0.00% covered (danger)
0.00%
0 / 71
0.00% covered (danger)
0.00%
0 / 9
90
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 index
0.00% covered (danger)
0.00%
0 / 16
0.00% covered (danger)
0.00%
0 / 1
2
 getQuota
0.00% covered (danger)
0.00%
0 / 11
0.00% covered (danger)
0.00%
0 / 1
2
 create
0.00% covered (danger)
0.00%
0 / 9
0.00% covered (danger)
0.00%
0 / 1
2
 generate
0.00% covered (danger)
0.00%
0 / 11
0.00% covered (danger)
0.00%
0 / 1
2
 update
0.00% covered (danger)
0.00%
0 / 9
0.00% covered (danger)
0.00%
0 / 1
2
 setDefault
0.00% covered (danger)
0.00%
0 / 6
0.00% covered (danger)
0.00%
0 / 1
2
 delete
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
2
 get
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2
3namespace App\Http\Controllers\v2;
4
5use App\Enums\HttpStatusCode;
6use App\Http\Controllers\Controller;
7use App\Http\Models\UserPersona;
8use App\Http\Requests\UserPersona\UserPersonaCreateFormRequest;
9use App\Http\Requests\UserPersona\UserPersonaGenerateAIEmulationFormRequest;
10use App\Http\Requests\UserPersona\UserPersonaIndexFormRequest;
11use App\Http\Requests\UserPersona\UserPersonaSetDefaultFormRequest;
12use App\Http\Services\UserPersonaService;
13use App\Traits\SubscriptionTrait;
14use Illuminate\Http\JsonResponse;
15use Illuminate\Http\Request;
16use Illuminate\Support\Facades\Cache;
17
18class UserPersonaController extends Controller
19{
20    use SubscriptionTrait;
21    private string $regeneratePersonaCacheKey = 'regenerate_persona_cache_key';
22
23    public function __construct(
24        private UserPersonaService $userPersonaService,
25    ) {}
26
27
28    public function index(UserPersonaIndexFormRequest $request): JsonResponse
29    {
30        $itemsPerPage = $request->input('items_per_page');
31        $currentPage = $request->input('page');
32        $disabled = $request->input('disabled', 'false') === 'true';
33        $filter = $request->input('filter', '');
34
35        $data = $this->userPersonaService->getAll(
36            $itemsPerPage,
37            $currentPage,
38            $filter,
39            $disabled
40        );
41
42        return response()->json(
43            data: [
44                'data' => $data
45            ],
46            status: HttpStatusCode::OK->value
47        );
48    }
49
50    public function getQuota(Request $request): JsonResponse
51    {
52        $user = $request->user();
53        $plan = $this->getCurrentPlan($user);
54
55        $personaCount = UserPersona::where('user_id', $user->_id)->count();
56
57        return response()->json(
58            data: [
59                'created' => $personaCount,
60                'quota' => $plan->user_persona_available,
61                'remaining' => $plan->user_persona_available - $personaCount
62            ],
63            status: HttpStatusCode::CREATED->value
64        );
65    }
66
67    public function create(UserPersonaCreateFormRequest $request): JsonResponse
68    {
69        $userId = $request->user()->id;
70
71        Cache::delete($this->regeneratePersonaCacheKey . "_{$userId}");
72
73        $validatedData = $request->validated();
74        $validatedData['user_id'] = $userId;
75
76        $data = $this->userPersonaService->create($validatedData);
77
78        return response()->json(
79            data: $data,
80            status: HttpStatusCode::CREATED->value
81        );
82    }
83
84    public function generate(UserPersonaGenerateAIEmulationFormRequest $request): JsonResponse
85    {
86        $user = $request->user();
87        $userId = $user->id;
88        $regenerateCount = Cache::get($this->regeneratePersonaCacheKey . "_{$userId}", 0);
89        Cache::put($this->regeneratePersonaCacheKey . "_{$userId}", $regenerateCount + 1, now()->addDay());
90
91        $validatedData = $request->validated();
92        $validatedData['user_id'] = $userId;
93
94        $data = $this->userPersonaService->generateUserPersonaAIEmulation($validatedData, $user, $regenerateCount);
95
96        return response()->json(
97            data: $data,
98            status: HttpStatusCode::CREATED->value
99        );
100    }
101
102    public function update(UserPersonaCreateFormRequest $request, UserPersona $userPersona): JsonResponse
103    {
104        $userId = $request->user()->id;
105
106        Cache::delete($this->regeneratePersonaCacheKey . "_{$userId}");
107
108        $validatedData = $request->validated();
109        $validatedData['user_id'] = $userId;
110
111        $data = $this->userPersonaService->update($userPersona->id, $validatedData);
112
113        return response()->json(
114            data: $data,
115            status: HttpStatusCode::CREATED->value
116        );
117    }
118
119    public function setDefault(UserPersonaSetDefaultFormRequest $request, UserPersona $userPersona): JsonResponse
120    {
121        $validatedData = $request->validated();
122        $data = $this->userPersonaService->setDefault($userPersona->id, $validatedData['is_default']);
123
124        return response()->json(
125            data: $data,
126            status: HttpStatusCode::CREATED->value
127        );
128    }
129
130    public function delete(UserPersona $userPersona): JsonResponse
131    {
132        $this->userPersonaService->delete($userPersona);
133
134        return response()->json(
135            status: HttpStatusCode::NO_CONTENT->value
136        );
137    }
138
139    public function get(UserPersona $userPersona): JsonResponse
140    {
141        return response()->json(
142            data: $userPersona,
143            status: HttpStatusCode::OK->value
144        );
145    }
146}