<?php
namespace ApplicationBundle\Modules\Api\Controller;
use ApplicationBundle\Controller\GenericController;
use ApplicationBundle\Modules\Api\Service\ActivityLogService;
use InvalidArgumentException;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
class ActivityLogController extends GenericController
{
public function logAction(Request $request): JsonResponse
{
$payload = $this->extractPayload($request);
$service = new ActivityLogService($this->getDoctrine()->getManager());
try {
$activityLog = $service->log($payload);
} catch (InvalidArgumentException $exception) {
return new JsonResponse([
'success' => false,
'code' => 'HB_VALIDATION_ERROR',
'message' => 'Validation failed',
'errors' => [$exception->getMessage()],
], 400);
} catch (\Throwable $exception) {
return new JsonResponse([
'success' => false,
'code' => 'HB_INTERNAL_ERROR',
'message' => 'Activity log could not be saved',
], 500);
}
return new JsonResponse([
'success' => true,
'code' => 'HB_OK',
'message' => 'Activity logged successfully',
'data' => [
'id' => $activityLog->getId(),
'user_id' => $activityLog->getUserId(),
'session_id' => $activityLog->getSessionId(),
'route' => $activityLog->getRoute(),
'action_type' => $activityLog->getActionType(),
'duration_seconds' => $activityLog->getDurationSeconds(),
'created_at' => $activityLog->getCreatedAt() ? $activityLog->getCreatedAt()->format('Y-m-d H:i:s') : null,
],
], 201);
}
private function extractPayload(Request $request): array
{
$contentType = strtolower((string) $request->headers->get('Content-Type', ''));
$rawContent = trim((string) $request->getContent());
if ($rawContent !== '' && strpos($contentType, 'application/json') !== false) {
$decoded = json_decode($rawContent, true);
return is_array($decoded) ? $decoded : [];
}
return $request->request->all();
}
}