|
DeleteCrmEntityTrait
|
NULL
|
NULL
|
NULL
|
|
DeleteCrmEntityTrait
|
NULL
|
NULL
|
NULL
|
|
private function executeRequest(callable $apiCall) private function executeRequest(callable $apiCall)
{
$this->ensureValidToken();
if (!$this->rateLimiter->canMakeRequest($this->config)) {
$waitSeconds = $this->rateLimiter->requestAvailableIn($this->config);
$this->log->warning('[HubSpot] Rate limit exceeded', [
'team_id' => $this->config->team_id,
'wait_seconds' => $waitSeconds,
]);
throw new RateLimitException("HubSpot rate limit hit; retry in {$waitSeconds}s", $waitSeconds);
}
$this->rateLimiter->incrementRequestCount($this->config);
try {
return $apiCall();
} catch (ApiException $e) {
if ($e->getCode() === 429) {
$retryAfter = $this->parseRetryAfter($e); // X-HubSpot-RateLimit-* / Retry-After
// optional: pre-burn the local bucket so subsequent calls back off
throw new RateLimitException('HubSpot 429', $retryAfter, $e);
}
throw $e;
...
|
NULL
|
NULL
|
NULL
|
|
private function executeRequest(callable $apiCall) private function executeRequest(callable $apiCall)
{
$this->ensureValidToken();
if (!$this->rateLimiter->canMakeRequest($this->config)) {
$waitSeconds = $this->rateLimiter->requestAvailableIn($this->config);
$this->log->warning('[HubSpot] Rate limit exceeded', [
'team_id' => $this->config->team_id,
'wait_seconds' => $waitSeconds,
]);
throw new RateLimitException("HubSpot rate limit hit; retry in {$waitSeconds}s", $waitSeconds);
}
$this->rateLimiter->incrementRequestCount($this->config);
try {
return $apiCall();
} catch (ApiException $e) {
if ($e->getCode() === 429) {
$retryAfter = $this->parseRetryAfter($e); // X-HubSpot-RateLimit-* / Retry-After
// optional: pre-burn the local bucket so subsequent calls back off
throw new RateLimitException('HubSpot 429', $retryAfter, $e);
}
throw $e;
...
|
NULL
|
NULL
|
NULL
|
|
private function executeRequest(callable $apiCall) private function executeRequest(callable $apiCall)
{
$this->ensureValidToken();
if (!$this->rateLimiter->canMakeRequest($this->config)) {
$waitSeconds = $this->rateLimiter->requestAvailableIn($this->config);
$this->log->warning('[HubSpot] Rate limit exceeded', [
'team_id' => $this->config->team_id,
'wait_seconds' => $waitSeconds,
]);
throw new RateLimitException("HubSpot rate limit hit; retry in {$waitSeconds}s", $waitSeconds);
}
$this->rateLimiter->incrementRequestCount($this->config);
try {
return $apiCall();
} catch (ApiException $e) {
if ($e->getCode() === 429) {
$retryAfter = $this->parseRetryAfter($e); // X-HubSpot-RateLimit-* / Retry-After
// optional: pre-burn the local bucket so subsequent calls back off
throw new RateLimitException('HubSpot 429', $retryAfter, $e);
}
throw $e;
...
|
NULL
|
NULL
|
NULL
|
|
app/Services/Crm/Hubspot/Client.php:621
|
NULL
|
NULL
|
NULL
|
|
app/Services/Crm/Hubspot/Client
|
NULL
|
NULL
|
NULL
|
|
app/Services/Crm/Hubspot/Client
|
NULL
|
NULL
|
NULL
|
|
емаил
|
NULL
|
NULL
|
NULL
|
|
email
|
NULL
|
NULL
|
NULL
|
|
стагигн
|
NULL
|
NULL
|
NULL
|
|
stagign
|
NULL
|
NULL
|
NULL
|
|
stagiнг
|
NULL
|
NULL
|
NULL
|
|
staging
|
NULL
|
NULL
|
NULL
|
|
automated-reports
|
NULL
|
NULL
|
NULL
|
|
php artisan
|
NULL
|
NULL
|
NULL
|
|
[
{
"id": 81,
"uuid": [
{
"id": 81,
"uuid": "0x439D68938006E338A3AE8423A9448BB7",
"report_id": 55,
"name": "Becky's Objection Handling Tracking - 19 - 25 Apr 2026",
"media_type": "pdf",
"parent_id": null,
"status": 2,
"reason": 0,
"payload": {"user_question":"What objections are prospects raising most often, and how is Becky responding to each one? For each objection:\n- State the objection topic (e.g. price, timing, competitor preference)\n- Give a short example of how Becky handled it\n- Flag whether the handling was effective or if it stalled the conversation\n\nKeep the output structured with one section per objection type. Maximum 5 objections. Use bullet points within each section.","call_ids":["54969768","54969766","54969749"],"team_id":1,"request_id":"8006e338-6893-439d-a3ae-8423a9448bb7","callback_url":"https:\/\/team:[EMAIL]\/webhook\/reports\/ready","report_period":"19 - 25 Apr 2026","report_name":"Becky's Objection Handling T......
|
NULL
|
NULL
|
NULL
|
|
SELECT
arr.id,
arr.report_id,
arr.uuid SELECT
arr.id,
arr.report_id,
arr.uuid,
arr.parent_id,
arr.media_type,
arr.status,
arr.reason,
arr.requested_at,
arr.generated_at,
arr.sent_at,
arr.created_at,
arr.updated_at,
ar.type AS report_type,
ar.frequency AS report_frequency,
ar.team_id AS report_team_id,
ar.uuid AS report_uuid,
ar.custom_name AS report_custom_name
FROM automated_report_results arr
JOIN automated_reports ar ON ar.id = arr.report_id
WHERE ar.type = 'ask_jiminny'
AND DATE(arr.created_at) = CURDATE() -- or replace with the date you tested
AND arr.report_id IN (
SELECT report_id
FROM automated_report_results
WHERE DATE(created_at) = CURDATE()
GROUP BY report_id
HAVING COUNT(*) >= 2
)
ORDER BY arr.report_id, arr.created_at;...
|
NULL
|
NULL
|
NULL
|
|
$isManualTrigger
|
NULL
|
NULL
|
NULL
|
|
$isManualTrigger
|
NULL
|
NULL
|
NULL
|
|
$isManualTrigger
|
NULL
|
NULL
|
NULL
|
|
AutomatedReportsService::FREQUENCY_DAILY
|
NULL
|
NULL
|
NULL
|
|
AutomatedReportsService::FREQUENCY_DAILY
|
NULL
|
NULL
|
NULL
|
|
AutomatedReportsService::FREQUENCY_DAILY
|
NULL
|
NULL
|
NULL
|
|
AutomatedReportsCommand
|
NULL
|
NULL
|
NULL
|
|
AutomatedReportsCommand
|
NULL
|
NULL
|
NULL
|
|
Remaining issues
1. Extra DB query still fires on Remaining issues
1. Extra DB query still fires on every page load
app/Http/Transformers/UserTransformer.php:139 / app/Repositories/AutomatedReportsRepository.php:291-297
'hasGeneratedAiReports' => $this->getAutomatedReportsRepository()->userReportsExist($user),
The switch from count() > 0 to exists() is a good micro-optimisation — MySQL can short-circuit on the first matching row. But the query still executes on every UserTransformer::transform() call, which happens on every /users/current request (i.e. every page load). The applyUserAccessScope method uses whereJsonContains on two JSON columns (recipients->users, groups) — these can't be indexed efficiently and will degrade as the automated_reports table grows.
Suggested mitigations (in order of effort):
Request-level cache: wrap in once() (Laravel 11) or Cache::store('array')->remember("user_reports_exist_{$user->getId()}", ...) so it's computed at most once per request even if transform() is called multiple times in ......
|
NULL
|
NULL
|
NULL
|
|
Remaining issues
1. Extra DB query still fires on Remaining issues
1. Extra DB query still fires on every page load
app/Http/Transformers/UserTransformer.php:139 / app/Repositories/AutomatedReportsRepository.php:291-297
'hasGeneratedAiReports' => $this->getAutomatedReportsRepository()->userReportsExist($user),
The switch from count() > 0 to exists() is a good micro-optimisation — MySQL can short-circuit on the first matching row. But the query still executes on every UserTransformer::transform() call, which happens on every /users/current request (i.e. every page load). The applyUserAccessScope method uses whereJsonContains on two JSON columns (recipients->users, groups) — these can't be indexed efficiently and will degrade as the automated_reports table grows.
Suggested mitigations (in order of effort):
Request-level cache: wrap in once() (Laravel 11) or Cache::store('array')->remember("user_reports_exist_{$user->getId()}", ...) so it's computed at most once per request even if transform() is called multiple times in ......
|
NULL
|
NULL
|
NULL
|
|
Remaining issues
1. Extra DB query still fires on Remaining issues
1. Extra DB query still fires on every page load
app/Http/Transformers/UserTransformer.php:139 / app/Repositories/AutomatedReportsRepository.php:291-297
'hasGeneratedAiReports' => $this->getAutomatedReportsRepository()->userReportsExist($user),
The switch from count() > 0 to exists() is a good micro-optimisation — MySQL can short-circuit on the first matching row. But the query still executes on every UserTransformer::transform() call, which happens on every /users/current request (i.e. every page load). The applyUserAccessScope method uses whereJsonContains on two JSON columns (recipients->users, groups) — these can't be indexed efficiently and will degrade as the automated_reports table grows.
Suggested mitigations (in order of effort):
Request-level cache: wrap in once() (Laravel 11) or Cache::store('array')->remember("user_reports_exist_{$user->getId()}", ...) so it's computed at most once per request even if transform() is called multiple times in ......
|
NULL
|
NULL
|
NULL
|
|
цоммент
|
NULL
|
NULL
|
NULL
|
|
comment
|
NULL
|
NULL
|
NULL
|
|
цлауде
|
NULL
|
NULL
|
NULL
|
|
claude
|
NULL
|
NULL
|
NULL
|
|
усер
|
NULL
|
NULL
|
NULL
|
|
user
|
NULL
|
NULL
|
NULL
|
|
едге цасе
|
NULL
|
NULL
|
NULL
|
|
edge case
|
NULL
|
NULL
|
NULL
|
|
УсерТрансформер
|
NULL
|
NULL
|
NULL
|
|
UserTransformer
|
NULL
|
NULL
|
NULL
|
|
пормотион
|
NULL
|
NULL
|
NULL
|
|
pormotion
|
NULL
|
NULL
|
NULL
|
|
pро
|
NULL
|
NULL
|
NULL
|
|
pro
|
NULL
|
NULL
|
NULL
|
|
ендпоитн
|
NULL
|
NULL
|
NULL
|
|
endpoitn
|
NULL
|
NULL
|
NULL
|
|
endpoiнт
|
NULL
|
NULL
|
NULL
|
|
endpoint
|
NULL
|
NULL
|
NULL
|
|
AJ Panorama
|
NULL
|
NULL
|
NULL
|
|
AJ Panorama
|
NULL
|
NULL
|
NULL
|
|
log show --predicate 'process == "CleanSho log show --predicate 'process == "CleanShot X"' --last 1h...
|
NULL
|
NULL
|
NULL
|