67 lines
2.2 KiB
PHP
67 lines
2.2 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Http\Controllers\Academy;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use App\Services\Academy\AcademyInteractionService;
|
|
use App\Support\AcademyAnalytics\AcademyAnalyticsContentType;
|
|
use Illuminate\Http\JsonResponse;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Validation\Rule;
|
|
use InvalidArgumentException;
|
|
|
|
final class AcademyInteractionController extends Controller
|
|
{
|
|
public function __construct(private readonly AcademyInteractionService $interactions)
|
|
{
|
|
}
|
|
|
|
public function like(Request $request): JsonResponse
|
|
{
|
|
abort_unless((bool) config('academy.enabled', true), 404);
|
|
|
|
$validated = $this->validatePayload($request);
|
|
|
|
try {
|
|
$payload = $this->interactions->toggleLike($request->user(), (string) $validated['content_type'], (int) $validated['content_id'], $request);
|
|
} catch (InvalidArgumentException $exception) {
|
|
return response()->json(['message' => $exception->getMessage()], 422);
|
|
}
|
|
|
|
return response()->json($payload);
|
|
}
|
|
|
|
public function save(Request $request): JsonResponse
|
|
{
|
|
abort_unless((bool) config('academy.enabled', true), 404);
|
|
|
|
$validated = $this->validatePayload($request);
|
|
|
|
try {
|
|
$payload = $this->interactions->toggleSave($request->user(), (string) $validated['content_type'], (int) $validated['content_id'], $request);
|
|
} catch (InvalidArgumentException $exception) {
|
|
return response()->json(['message' => $exception->getMessage()], 422);
|
|
}
|
|
|
|
return response()->json($payload);
|
|
}
|
|
|
|
/**
|
|
* @return array<string, mixed>
|
|
*/
|
|
private function validatePayload(Request $request): array
|
|
{
|
|
return $request->validate([
|
|
'content_type' => ['required', 'string', Rule::in([
|
|
AcademyAnalyticsContentType::PROMPT,
|
|
AcademyAnalyticsContentType::LESSON,
|
|
AcademyAnalyticsContentType::COURSE,
|
|
AcademyAnalyticsContentType::PROMPT_PACK,
|
|
AcademyAnalyticsContentType::CHALLENGE,
|
|
])],
|
|
'content_id' => ['required', 'integer', 'min:1'],
|
|
]);
|
|
}
|
|
} |