|
10171
|
Pull requests · screenpipe/screenpipe · GitHub
Pul Pull requests · screenpipe/screenpipe · GitHub
Pull requests · screenpipe/screenpipe · GitHub
Close tab
Home | Hostinger
Home | Hostinger
Login – Nginx Proxy Manager
Login – Nginx Proxy Manager
Screenpipe — Archive
Screenpipe — Archive
SQLite Web: archive.db
SQLite Web: archive.db
SQLite Web: db.sqlite
SQLite Web: db.sqlite
screenpipe/.claude/skills at main · screenpipe/screenpipe · GitHub
screenpipe/.claude/skills at main · screenpipe/screenpipe · GitHub
DXP4800PLUS-B5F8
DXP4800PLUS-B5F8
Оптичен интернет за дома - EON телевизия | Vivacom | 5G
Оптичен интернет за дома - EON телевизия | Vivacom | 5G
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Open history (⇧⌘H)
Open bookmarks (⌘B)
Bitwarden
Skip to content
Skip to content
Navigation Menu
Navigation Menu
Homepage
Platform
Solutions
Resources
Open Source
Enterprise
Pricing
Pricing
Search or jump to…
Search or jump to...
Sign in
Sign in
Sign up
Sign up
Appearance settings
screenpipe
screenpipe
/
screenpipe
screenpipe
Public
You must be signed in to change notification settings
Notifications
Fork 1.7k
Fork
1.7k
You must be signed in to star a repository
Star
18.6k
Code
Code
Issues 16
Issues
16
Pull requests 17
Pull requests
17
Discussions
Discussions
Actions
Actions
Projects
Projects
Security and quality
Security and quality
Insights
Insights
Pull requests: screenpipe/screenpipe
Pull requests: screenpipe/screenpipe
is:pr is:closed
Labels 43
Labels
43
Milestones 0
Milestones
0
New pull request
New pull request
Clear current search query, filters, and sorts
Clear current search query, filters, and sorts
17 Open
17 Open
1,593 Closed
1,593 Closed
Author
Author
Label
Label
Projects
Projects
Milestones
Milestones
Reviews
Reviews
Assignee
Assignee
Sort
Sort
Pull requests list
Pull requests list
docs(testing): add 3 recent regression test entries
docs(testing): add 3 recent regression test entries
#3224 by
louis030195
louis030195
Collaborator
was closed
3 days ago
•
Review required before merging
Review required
1 comment
1
testing: update spec from recent changes (2026-05-04)
testing: update spec from recent changes (2026-05-04)
#3223 by
louis030195
louis030195
Collaborator
was closed
3 days ago
•
Review required before merging
Review required
1 comment
1
fix: add circuit breaker for corrupted segmentation model
fix: add circuit breaker for corrupted segmentation model
#3222 by
louis030195
louis030195
Collaborator
was closed
3 days ago
•
Review required before merging
Review required
2 comments
2
docs(testing): add a11y multi-line bbox regression entry
docs(testing): add a11y multi-line bbox regression entry
#3221 by
louis030195
louis030195
Collaborator
was closed
3 days ago
•
Review required before merging
Review required
1 comment
1
fix: add diagnostic logging for audio device configuration selection
fix: add diagnostic logging for audio device configuration selection
#3220 by
louis030195
louis030195
Collaborator
was closed
3 days ago
•
Review required before merging
Review required
1 comment
1
docs: improve SEO titles across generic pages
docs: improve SEO titles across generic pages
#3219 by
mintlify
mintlify
Bot
was merged
4 days ago
•
Review required before merging
Review required
1 comment
1
changelog: week of may 3, 2026
changelog: week of may 3, 2026
#3218 by
mintlify
mintlify
Bot
was closed
3 days ago
•
Review required before merging
Review required
2 comments
2
docs(testing): add multi-line text bbox capture regression test
docs(testing): add multi-line text bbox capture regression test
#3217 by
louis030195
louis030195
Collaborator
was closed
3 days ago
•
Review required before merging
Review required
1 comment
1
docs(testing): add Windows GetWindowRect bounds regression test
docs(testing): add Windows GetWindowRect bounds regression test
#3216 by
louis030195
louis030195
Collaborator
was closed
3 days ago
•
Review required before merging
Review required
1 comment
1
Fix devcontainer cargo path
Fix devcontainer cargo path
#3214 by
julpel8
julpel8
Contributor
was merged
4 days ago...
|
Firefox
|
Pull requests · screenpipe/screenpipe · GitHub — P Pull requests · screenpipe/screenpipe · GitHub — Personal...
|
github.com/screenpipe/screenpipe/pulls?page=2& github.com/screenpipe/screenpipe/pulls?page=2&q=is%3Apr+is%3Aclosed...
|
10171
|
|
10170
|
Platform Sprint 3 Q2 - Platform Team - Scrum Board Platform Sprint 3 Q2 - Platform Team - Scrum Board - Jira
Platform Sprint 3 Q2 - Platform Team - Scrum Board - Jira
Unnamed Group
SevenShores\Hubspot\Exceptions\BadRequest: Client error: `POST [URL_WITH_CREDENTIALS] -5,69 +5,64 @@5namespace Jiminny\Component\ES\Processor\Actions;5namespace Jiminny\Component\ES\Processor\Actions;667use Elastica\Document;7use Elastica\Document;8-use Illuminate\Support\Collection;9use Jiminny\Component\ElasticSearch\Contract\Searchable;8use Jiminny\Component\ElasticSearch\Contract\Searchable;10use Jiminny\Component\ES\Processor\DTOs\DocumentLoad;9use Jiminny\Component\ES\Processor\DTOs\DocumentLoad;11use Jiminny\Component\ES\Processor\DTOs\SimpleCollection;10use Jiminny\Component\ES\Processor\DTOs\SimpleCollection;12use Jiminny\Component\ES\Processor\EntityQueryBuilder;11use Jiminny\Component\ES\Processor\EntityQueryBuilder;13-use Jiminny\Component\ES\Processor\Traits\SkipActivityTrait;14use Jiminny\Exceptions\SyncActivityException;12use Jiminny\Exceptions\SyncActivityException;15use Jiminny\Models\Model;13use Jiminny\Models\Model;16use Sentry\Laravel\Facade as Sentry;14use Sentry\Laravel\Facade as Sentry;15+use Throwable;171618class LoadDocumentsAction17class LoadDocumentsAction19{18{20-use SkipActivityTrait;19+public function __construct(21-20+private readonly EntityQueryBuilder $queryBuilder22-private const int RDS_CHUNK_SIZE = 250;21+ ) {22+ }232324-/**25- * @codeCoverageIgnore26- */27public function loadDocuments(string $updateTarget, array $entityIdsList): DocumentLoad24public function loadDocuments(string $updateTarget, array $entityIdsList): DocumentLoad28 {25 {29$documentsToUpdate = new SimpleCollection();26$documentsToUpdate = new SimpleCollection();30$documentsToDelete = new SimpleCollection();27$documentsToDelete = new SimpleCollection();312832-// do get mariadb data29+$query = $this->queryBuilder->getEntityQuery($updateTarget, $entityIdsList);33-$query = EntityQueryBuilder::getEntityQuery($updateTarget, $entityIdsList);343035-$query->chunkByIdDesc(31+/** @var Model&Searchable $entityModel */36-self::RDS_CHUNK_SIZE,32+foreach ($query->cursor() as $entityModel) {37-function (Collection $entityModels) use ($documentsToUpdate, $documentsToDelete) {33+if ($entityModel->isDeleted()) {38-/** @var Model&Searchable $entityForDeletion */34+/**39-foreach ($entityModels->whereNotNull('deleted_at') as $entityForDeletion) {35+ * Cleanup (from ElasticSearch) scheduled entities that were recently deleted.40-$documentsToDelete->add($entityForDeletion->getId());36+ * After a deletion, no more updates on a record are expected, so the operation is considered final,41- }37+ * unless the record is restored.42-38+ */43-/** @var Model&Searchable $entityModel */39+$documentsToDelete->add($entityModel->getId());44-foreach ($entityModels->whereNull('deleted_at') as $entityModel) {40+ } else {45-if (self::shouldSkipActivity($entityModel)) {41+try {46-/**42+$documentsToUpdate->add(47- * If the activity type is in the skip list, we should not push it for indexing.43+new Document((string) $entityModel->getId(), $entityModel->getIndexableAttributes())48- * If an ES record already exists, we should remove it to free up storage and processing power44+ );49- */45+ } catch (Throwable $error) {50-$documentsToDelete->add($entityModel->getId());46+ Sentry::captureException(51-47+new SyncActivityException(52-continue;48+'ES entity async RDS build data failed',53- }49+$error->getCode(),54-50+$error55-try {51+ )56-$documentsToUpdate->add(52+ );57-new Document((string) $entityModel->getId(), $entityModel->getIndexableAttributes())58- );59- } catch (\Throwable $error) {60- Sentry::captureException(61-new SyncActivityException(62-'ES entity async RDS build data failed',63-$error->getCode(),64-$error65- )66- );67- }68 }53 }69 }54 }70- );55+56+/**57+ * Clean up fragmented memory.58+ * Dropping relations and unsetting the entity model after hydration and usage,59+ * allows GC to remove heap memory allocations, and recycle already allocated memory,60+ * instead of allocating more memory from OS.61+ * Unset operations signal GC to collect destroyed object memory62+ */63+$entityModel->setRelations([]);64+ unset($entityModel);65+ }716672return new DocumentLoad($documentsToUpdate, $documentsToDelete);67return new DocumentLoad($documentsToUpdate, $documentsToDelete);73 }68 }</selection>” selected. Please summarize the selection using precise and concise language. Use headers and bulleted lists in the summary, to make it scannable. Maintain the meaning and factual accuracy.
You said
I’m on page “<tabTitle>Jy 20820 es reindex stream model hydration by Vasi</tabTitle>” with “<selection>@@ -5,69 +5,64 @@5namespace Jiminny\Component\ES\Processor\Actions;5namespace Jiminny\Component\ES\Processor\Actions;667use Elastica\Document;7use Elastica\Document;8-use Illuminate\Support\Collection;9use Jiminny\Component\ElasticSearch\Contract\Searchable;8use Jiminny\Component\ElasticSearch\Contract\Searchable;10use Jiminny\Component\ES\Processor\DTOs\DocumentLoad;9use Jiminny\Component\ES\Processor\DTOs\DocumentLoad;11use Jiminny\Component\ES\Processor\DTOs\SimpleCollection;10use Jiminny\Component\ES\Processor\DTOs\SimpleCollection;12use Jiminny\Component\ES\Processor\EntityQueryBuilder;11use Jiminny\Component\ES\Processor\EntityQueryBuilder;13-use Jiminny\Component\ES\Processor\Traits\SkipActivityTrait;14use Jiminny\Exceptions\SyncActivityException;12use Jiminny\Exceptions\SyncActivityException;15use Jiminny\Models\Model;13use Jiminny\Models\Model;16use Sentry\Laravel\Facade as Sentry;14use Sentry\Laravel\Facade as Sentry;15+use Throwable;171618class LoadDocumentsAction17class LoadDocumentsAction19{18{20-use SkipActivityTrait;19+public function __construct(21-20+private readonly EntityQueryBuilder $queryBuilder22-private const int RDS_CHUNK_SIZE = 250;21+ ) {22+ }232324-/**25- * @codeCoverageIgnore26- */27public function loadDocuments(string $updateTarget, array $entityIdsList): DocumentLoad24public function loadDocuments(string $updateTarget, array $entityIdsList): DocumentLoad28 {25 {29$documentsToUpdate = new SimpleCollection();26$documentsToUpdate = new SimpleCollection();30$documentsToDelete = new SimpleCollection();27$documentsToDelete = new SimpleCollection();312832-// do get mariadb data29+$query = $this->queryBuilder->getEntityQuery($updateTarget, $entityIdsList);33-$query = EntityQueryBuilder::getEntityQuery($updateTarget, $entityIdsList);343035-$query->chunkByIdDesc(31+/** @var Model&Searchable $entityModel */36-self::RDS_CHUNK_SIZE,32+foreach ($query->cursor() as $entityModel) {37-function (Collection $entityModels) use ($documentsToUpdate, $documentsToDelete) {33+if ($entityModel->isDeleted()) {38-/** @var Model&Searchable $entityForDeletion */34+/**39-foreach ($entityModels->whereNotNull('deleted_at') as $entityForDeletion) {35+ * Cleanup (from ElasticSearch) scheduled entities that were recently deleted.40-$documentsToDelete->add($entityForDeletion->getId());36+ * After a deletion, no more updates on a record are expected, so the operation is considered final,41- }37+ * unless the record is restored.42-38+ */43-/** @var Model&Searchable $entityModel */39+$documentsToDelete->add($entityModel->getId());44-foreach ($entityModels->whereNull('deleted_at') as $entityModel) {40+ } else {45-if (self::shouldSkipActivity($entityModel)) {41+try {46-/**42+$documentsToUpdate->add(47- * If the activity type is in the skip list, we should not push it for indexing.43+new Document((string) $entityModel->getId(), $entityModel->getIndexableAttributes())48- * If an ES record already exists, we should remove it to free up storage and processing power44+ );49- */45+ } catch (Throwable $error) {50-$documentsToDelete->add($entityModel->getId());46+ Sentry::captureException(51-47+new SyncActivityException(52-continue;48+'ES entity async RDS build data failed',53- }49+$error->getCode(),54-50+$error55-try {51+ )56-$documentsToUpdate->add(52+ );57-new Document((string) $entityModel->getId(), $entityModel->getIndexableAttributes())58- );59- } catch (\Throwable $error) {60- Sentry::captureException(61-new SyncActivityException(62-'ES entity async RDS build data failed',63-$error->getCode(),64-$error65- )66- );67- }68 }53 }69 }54 }70- );55+56+/**57+ * Clean up fragmented memory.58+ * Dropping relations and unsetting the entity model after hydration and usage,59+ * allows GC to remove heap memory allocations, and recycle already allocated memory,60+ * instead of allocating more memory from OS.61+ * Unset operations signal GC to collect destroyed object memory62+ */63+$entityModel->setRelations([]);64+ unset($entityModel);65+ }716672return new DocumentLoad($documentsToUpdate, $documentsToDelete);67return new DocumentLoad($documentsToUpdate, $documentsToDelete);73 }68 }</selection>” selected.
Please summarize the selection using precise and concise language. Use headers and bulleted lists in the summary, to make it scannable. Maintain the meaning and factual accuracy.
Collapse
Listen
Show more options
Show thinking
Gemini said
Gemini said
Overview
Overview
This diff refactors the
LoadDocumentsAction
class to optimize memory usage and data processing. It transitions the database query execution from batch chunking to lazy loading using cursors, introduces explicit memory management techniques, and updates the class structure to use dependency injection.
Architectural & Structural Changes
Architectural & Structural Changes
Dependency Injection:
Injected
EntityQueryBuilder
via the constructor instead of calling it statically.
Removed Traits & Constants:
Removed the
SkipActivityTrait
entirely (and its associated skip logic), as well as the
RDS_CHUNK_SIZE
constant.
Namespace Imports:
Added the
Throwable
import and removed
Illuminate\Support\Collection
.
Data Processing Refactor
Data Processing Refactor
Cursor Implementation:
Replaced
chunkByIdDesc
with
cursor()
, iterating through records sequentially rather than loading batches of 250 into memory.
Simplified Deletion Checks:
Replaced Laravel collection filtering (
whereNotNull('deleted_at')
) with a direct
$entityModel->isDeleted()
check on each model during iteration.
Removed Skip Logic:
Removed the
shouldSkipActivity
check, meaning all non-deleted models are now directly processed for updates.
Exception Handling:
Updated the catch block to use the imported
Throwable
interface rather than the fully qualified
\Throwable
.
Memory Optimization
Memory Optimization
Explicit Garbage Collection:
Added specific cleanup steps inside the iteration loop. Dropping loaded relationships (
$entityModel->setRelations([])
) and unsetting the model (
unset($entityModel)
) explicitly signals the PHP Garbage Collector to free and recycle heap memory, preventing excessive OS memory allocation during large stream hydration.
Good response
Bad response
Share & export
Copy
Show more options
Copy prompt
Edit
You said You are seasoned code reviewer and your task is to make detailed code review of summarized page. First understand the code changes, then evaluate it and try to find potential issues and bottlenecks.
You said
You are seasoned code reviewer and your task is to make detailed code
review of summarized page. First understand the code changes, then
evaluate it and try to find potential issues and bottlenecks.
Expand
Listen
Show more options
Show thinking
Gemini said
Gemini said
Code Review: LoadDocumentsAction Refactoring
Code Review:
LoadDocumentsAction
Refactoring
As requested, I have reviewed the refactoring of the
LoadDocumentsAction
class. While the intent to modernize the architecture and optimize memory is clear, there are several critical architectural flaws and potential bottlenecks in the new implementation that need to be addressed before this goes to production.
Here is my detailed evaluation.
1. Strengths & Positive Changes
1. Strengths & Positive Changes
Dependency Injection:
Moving
EntityQueryBuilder
from a static call to an injected dependency significantly improves the testability of the class. You can now easily mock the query builder in your unit tests.
Simplified Readability:
Replacing the nested closures required by
chunkByIdDesc
with a flatter
foreach
structure makes the code easier to read and reason about.
Garbage Collection Awareness:
The developer is actively thinking about heap memory and Garbage Collection (GC), which is crucial for background workers and hydration scripts.
2. Critical Issues & Bottlenecks
2. Critical Issues & Bottlenecks
A. The "Infinite Accumulation" Memory Leak
A. The "Infinite Accumulation" Memory Leak
The primary goal of this refactor was memory optimization, but the implementation defeats its own purpose.
The Issue:
The code iterates over the database cursor and manually unsets
$entityModel
to free memory. However, it simultaneously instantiates new
Document
objects and adds them to
$documentsToUpdate
(and IDs to
$documentsToDelete
).
The Bottleneck:
These collections are not flushed or processed within the loop; they are accumulated and returned at the end of the method. If this script processes 500,000 records,
$documentsToUpdate
will hold 500,000 ElasticSearch
Document
objects in RAM at once, inevitably leading to an Out Of Memory (OOM) fatal error.
B. Laravel cursor() and N+1 Query Problems
B. Laravel
cursor()
and N+1 Query Problems
Replacing
chunkByIdDesc()
with
cursor()
introduces a severe database performance risk.
The Issue:
Laravel's
cursor()
executes a single query and uses a PHP generator to yield results one by one via a PDO cursor. Because it does not process models in batches,
cursor()
cannot eager-load relationships.
*
The Bottleneck:
If
$entityModel->getIndexableAttributes()
relies on
any
database relationships (e.g., getting a user's company or tags), it will trigger an N+1 query. For 100,000 records, this will execute 100,001 database queries, absolutely hammering the database.
C. Long-Running PDO Connections
C. Long-Running PDO Connections
The Issue:
Because
cursor()
keeps a single database connection open while iterating through the results, any network latency encountered inside the loop extends the transaction time.
The Bottleneck:
If ElasticSearch
Document
instantiation or the Sentry API calls (on failure) take time, the PDO connection to the MariaDB database will remain open for an extended period, potentially leading to connection timeouts, blocked processes, or database lock exhaustion.
3. Minor Issues & Observations
3. Minor Issues & Observations
Missing Skip Logic:
The removal of
SkipActivityTrait
assumes these models no longer need to be bypassed. If this was an accidental omission, you will end up polluting ElasticSearch with activity logs that were previously filtered out, wasting ES storage and processing power.
Synchronous Sentry Calls:
If a specific batch of data is malformed and throws multiple
Throwable
errors consecutively,
Sentry::captureException
will make synchronous outbound HTTP calls for every failed record. This will severely degrade the throughput of the hydration process.
4. Recommendations for Refactoring
4. Recommendations for Refactoring
To resolve these issues, I recommend a hybrid approach utilizing Laravel's
lazyById()
(or returning to chunking) combined with batch-processing the ElasticSearch payloads:
Use
lazyById()
instead of
cursor()
:
* Laravel's
lazyById(250)
fetches records in chunks under the hood (allowing for eager loading of relations without N+1) but yields them as a flat generator to the
foreach
loop. This gives you the clean syntax of a generator with the safety of chunked eager loading.
Dispatch to ElasticSearch Inside the Loop:
* Do not wait until the end of the method to return massive collections.
Keep a counter. When
$documentsToUpdate
reaches a certain threshold (e.g., 500 documents), dispatch them to ElasticSearch, empty the
SimpleCollection
, and continue the loop.
Group Sentry Exceptions:
Consider implementing a circuit breaker or batching error logs so that a sudden spike in formatting errors doesn't result in thousands of synchronous API calls to Sentry.
Good response
Bad response
Redo
Share & export
Copy
Show more options
Enter a prompt for Gemini
encrypted
Enter a prompt for Gemini
encrypted
Open upload file menu
Tools
Open mode picker
Pro
Microphone
Send message
Your Jiminny chats aren’t used to improve our models. Gemini is AI. It can make mistakes, so double check it.
Your privacy & Gemini Opens in a new window
Your privacy & Gemini
Opens in a new window
Summarize page
Summarize page
Skip to main content
Skip to main content
Toggle organization menu
Issues
Issues
Explore
Explore
Dashboards
Dashboards
Monitors
Monitors
Settings
Settings
Try Business
What's New
Help
[EMAIL]
Issues
Expand
Feed
Feed
Errors & Outages
Errors & Outages
Breached Metrics
Breached Metrics
Warnings
Warnings
User Feedback
User Feedback
Autofix
Autofix
Recently Run
Recently Run
All Views
All Views
Configure
Alerts Moved
Alerts
Moved
Issues
Issues
View Project Details
APP-1EED
Ask Seer
Ask Seer
/
Give Feedback
SevenShores\Hubspot\Exceptions\BadRequest
View events...
|
Firefox
|
SevenShores\Hubspot\Exceptions\BadRequest: Client SevenShores\Hubspot\Exceptions\BadRequest: Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response: {"status":"error","message":"You have reached your secondly limit.","errorType":"RATE_LIMIT — Work...
|
jiminny.sentry.io/issues/7007366572/events/e72ac6c jiminny.sentry.io/issues/7007366572/events/e72ac6ccaa9445e3ae04d55cb8c32844/?project=82419...
|
10170
|
|
10169
|
Platform Sprint 3 Q2 - Platform Team - Scrum Board Platform Sprint 3 Q2 - Platform Team - Scrum Board - Jira
Platform Sprint 3 Q2 - Platform Team - Scrum Board - Jira
Unnamed Group
SevenShores\Hubspot\Exceptions\BadRequest: Client error: `POST [URL_WITH_CREDENTIALS] -5,69 +5,64 @@5namespace Jiminny\Component\ES\Processor\Actions;5namespace Jiminny\Component\ES\Processor\Actions;667use Elastica\Document;7use Elastica\Document;8-use Illuminate\Support\Collection;9use Jiminny\Component\ElasticSearch\Contract\Searchable;8use Jiminny\Component\ElasticSearch\Contract\Searchable;10use Jiminny\Component\ES\Processor\DTOs\DocumentLoad;9use Jiminny\Component\ES\Processor\DTOs\DocumentLoad;11use Jiminny\Component\ES\Processor\DTOs\SimpleCollection;10use Jiminny\Component\ES\Processor\DTOs\SimpleCollection;12use Jiminny\Component\ES\Processor\EntityQueryBuilder;11use Jiminny\Component\ES\Processor\EntityQueryBuilder;13-use Jiminny\Component\ES\Processor\Traits\SkipActivityTrait;14use Jiminny\Exceptions\SyncActivityException;12use Jiminny\Exceptions\SyncActivityException;15use Jiminny\Models\Model;13use Jiminny\Models\Model;16use Sentry\Laravel\Facade as Sentry;14use Sentry\Laravel\Facade as Sentry;15+use Throwable;171618class LoadDocumentsAction17class LoadDocumentsAction19{18{20-use SkipActivityTrait;19+public function __construct(21-20+private readonly EntityQueryBuilder $queryBuilder22-private const int RDS_CHUNK_SIZE = 250;21+ ) {22+ }232324-/**25- * @codeCoverageIgnore26- */27public function loadDocuments(string $updateTarget, array $entityIdsList): DocumentLoad24public function loadDocuments(string $updateTarget, array $entityIdsList): DocumentLoad28 {25 {29$documentsToUpdate = new SimpleCollection();26$documentsToUpdate = new SimpleCollection();30$documentsToDelete = new SimpleCollection();27$documentsToDelete = new SimpleCollection();312832-// do get mariadb data29+$query = $this->queryBuilder->getEntityQuery($updateTarget, $entityIdsList);33-$query = EntityQueryBuilder::getEntityQuery($updateTarget, $entityIdsList);343035-$query->chunkByIdDesc(31+/** @var Model&Searchable $entityModel */36-self::RDS_CHUNK_SIZE,32+foreach ($query->cursor() as $entityModel) {37-function (Collection $entityModels) use ($documentsToUpdate, $documentsToDelete) {33+if ($entityModel->isDeleted()) {38-/** @var Model&Searchable $entityForDeletion */34+/**39-foreach ($entityModels->whereNotNull('deleted_at') as $entityForDeletion) {35+ * Cleanup (from ElasticSearch) scheduled entities that were recently deleted.40-$documentsToDelete->add($entityForDeletion->getId());36+ * After a deletion, no more updates on a record are expected, so the operation is considered final,41- }37+ * unless the record is restored.42-38+ */43-/** @var Model&Searchable $entityModel */39+$documentsToDelete->add($entityModel->getId());44-foreach ($entityModels->whereNull('deleted_at') as $entityModel) {40+ } else {45-if (self::shouldSkipActivity($entityModel)) {41+try {46-/**42+$documentsToUpdate->add(47- * If the activity type is in the skip list, we should not push it for indexing.43+new Document((string) $entityModel->getId(), $entityModel->getIndexableAttributes())48- * If an ES record already exists, we should remove it to free up storage and processing power44+ );49- */45+ } catch (Throwable $error) {50-$documentsToDelete->add($entityModel->getId());46+ Sentry::captureException(51-47+new SyncActivityException(52-continue;48+'ES entity async RDS build data failed',53- }49+$error->getCode(),54-50+$error55-try {51+ )56-$documentsToUpdate->add(52+ );57-new Document((string) $entityModel->getId(), $entityModel->getIndexableAttributes())58- );59- } catch (\Throwable $error) {60- Sentry::captureException(61-new SyncActivityException(62-'ES entity async RDS build data failed',63-$error->getCode(),64-$error65- )66- );67- }68 }53 }69 }54 }70- );55+56+/**57+ * Clean up fragmented memory.58+ * Dropping relations and unsetting the entity model after hydration and usage,59+ * allows GC to remove heap memory allocations, and recycle already allocated memory,60+ * instead of allocating more memory from OS.61+ * Unset operations signal GC to collect destroyed object memory62+ */63+$entityModel->setRelations([]);64+ unset($entityModel);65+ }716672return new DocumentLoad($documentsToUpdate, $documentsToDelete);67return new DocumentLoad($documentsToUpdate, $documentsToDelete);73 }68 }</selection>” selected. Please summarize the selection using precise and concise language. Use headers and bulleted lists in the summary, to make it scannable. Maintain the meaning and factual accuracy.
You said
I’m on page “<tabTitle>Jy 20820 es reindex stream model hydration by Vasi</tabTitle>” with “<selection>@@ -5,69 +5,64 @@5namespace Jiminny\Component\ES\Processor\Actions;5namespace Jiminny\Component\ES\Processor\Actions;667use Elastica\Document;7use Elastica\Document;8-use Illuminate\Support\Collection;9use Jiminny\Component\ElasticSearch\Contract\Searchable;8use Jiminny\Component\ElasticSearch\Contract\Searchable;10use Jiminny\Component\ES\Processor\DTOs\DocumentLoad;9use Jiminny\Component\ES\Processor\DTOs\DocumentLoad;11use Jiminny\Component\ES\Processor\DTOs\SimpleCollection;10use Jiminny\Component\ES\Processor\DTOs\SimpleCollection;12use Jiminny\Component\ES\Processor\EntityQueryBuilder;11use Jiminny\Component\ES\Processor\EntityQueryBuilder;13-use Jiminny\Component\ES\Processor\Traits\SkipActivityTrait;14use Jiminny\Exceptions\SyncActivityException;12use Jiminny\Exceptions\SyncActivityException;15use Jiminny\Models\Model;13use Jiminny\Models\Model;16use Sentry\Laravel\Facade as Sentry;14use Sentry\Laravel\Facade as Sentry;15+use Throwable;171618class LoadDocumentsAction17class LoadDocumentsAction19{18{20-use SkipActivityTrait;19+public function __construct(21-20+private readonly EntityQueryBuilder $queryBuilder22-private const int RDS_CHUNK_SIZE = 250;21+ ) {22+ }232324-/**25- * @codeCoverageIgnore26- */27public function loadDocuments(string $updateTarget, array $entityIdsList): DocumentLoad24public function loadDocuments(string $updateTarget, array $entityIdsList): DocumentLoad28 {25 {29$documentsToUpdate = new SimpleCollection();26$documentsToUpdate = new SimpleCollection();30$documentsToDelete = new SimpleCollection();27$documentsToDelete = new SimpleCollection();312832-// do get mariadb data29+$query = $this->queryBuilder->getEntityQuery($updateTarget, $entityIdsList);33-$query = EntityQueryBuilder::getEntityQuery($updateTarget, $entityIdsList);343035-$query->chunkByIdDesc(31+/** @var Model&Searchable $entityModel */36-self::RDS_CHUNK_SIZE,32+foreach ($query->cursor() as $entityModel) {37-function (Collection $entityModels) use ($documentsToUpdate, $documentsToDelete) {33+if ($entityModel->isDeleted()) {38-/** @var Model&Searchable $entityForDeletion */34+/**39-foreach ($entityModels->whereNotNull('deleted_at') as $entityForDeletion) {35+ * Cleanup (from ElasticSearch) scheduled entities that were recently deleted.40-$documentsToDelete->add($entityForDeletion->getId());36+ * After a deletion, no more updates on a record are expected, so the operation is considered final,41- }37+ * unless the record is restored.42-38+ */43-/** @var Model&Searchable $entityModel */39+$documentsToDelete->add($entityModel->getId());44-foreach ($entityModels->whereNull('deleted_at') as $entityModel) {40+ } else {45-if (self::shouldSkipActivity($entityModel)) {41+try {46-/**42+$documentsToUpdate->add(47- * If the activity type is in the skip list, we should not push it for indexing.43+new Document((string) $entityModel->getId(), $entityModel->getIndexableAttributes())48- * If an ES record already exists, we should remove it to free up storage and processing power44+ );49- */45+ } catch (Throwable $error) {50-$documentsToDelete->add($entityModel->getId());46+ Sentry::captureException(51-47+new SyncActivityException(52-continue;48+'ES entity async RDS build data failed',53- }49+$error->getCode(),54-50+$error55-try {51+ )56-$documentsToUpdate->add(52+ );57-new Document((string) $entityModel->getId(), $entityModel->getIndexableAttributes())58- );59- } catch (\Throwable $error) {60- Sentry::captureException(61-new SyncActivityException(62-'ES entity async RDS build data failed',63-$error->getCode(),64-$error65- )66- );67- }68 }53 }69 }54 }70- );55+56+/**57+ * Clean up fragmented memory.58+ * Dropping relations and unsetting the entity model after hydration and usage,59+ * allows GC to remove heap memory allocations, and recycle already allocated memory,60+ * instead of allocating more memory from OS.61+ * Unset operations signal GC to collect destroyed object memory62+ */63+$entityModel->setRelations([]);64+ unset($entityModel);65+ }716672return new DocumentLoad($documentsToUpdate, $documentsToDelete);67return new DocumentLoad($documentsToUpdate, $documentsToDelete);73 }68 }</selection>” selected.
Please summarize the selection using precise and concise language. Use headers and bulleted lists in the summary, to make it scannable. Maintain the meaning and factual accuracy.
Collapse
Listen
Show more options
Show thinking
Gemini said
Gemini said
Overview
Overview
This diff refactors the
LoadDocumentsAction
class to optimize memory usage and data processing. It transitions the database query execution from batch chunking to lazy loading using cursors, introduces explicit memory management techniques, and updates the class structure to use dependency injection.
Architectural & Structural Changes
Architectural & Structural Changes
Dependency Injection:
Injected
EntityQueryBuilder
via the constructor instead of calling it statically.
Removed Traits & Constants:
Removed the
SkipActivityTrait
entirely (and its associated skip logic), as well as the
RDS_CHUNK_SIZE
constant.
Namespace Imports:
Added the
Throwable
import and removed
Illuminate\Support\Collection
.
Data Processing Refactor
Data Processing Refactor
Cursor Implementation:
Replaced
chunkByIdDesc
with
cursor()
, iterating through records sequentially rather than loading batches of 250 into memory.
Simplified Deletion Checks:
Replaced Laravel collection filtering (
whereNotNull('deleted_at')
) with a direct
$entityModel->isDeleted()
check on each model during iteration.
Removed Skip Logic:
Removed the
shouldSkipActivity
check, meaning all non-deleted models are now directly processed for updates.
Exception Handling:
Updated the catch block to use the imported
Throwable
interface rather than the fully qualified
\Throwable
.
Memory Optimization
Memory Optimization
Explicit Garbage Collection:
Added specific cleanup steps inside the iteration loop. Dropping loaded relationships (
$entityModel->setRelations([])
) and unsetting the model (
unset($entityModel)
) explicitly signals the PHP Garbage Collector to free and recycle heap memory, preventing excessive OS memory allocation during large stream hydration.
Good response
Bad response
Share & export
Copy
Show more options
Copy prompt
Edit
You said You are seasoned code reviewer and your task is to make detailed code review of summarized page. First understand the code changes, then evaluate it and try to find potential issues and bottlenecks.
You said
You are seasoned code reviewer and your task is to make detailed code
review of summarized page. First understand the code changes, then
evaluate it and try to find potential issues and bottlenecks.
Expand
Listen
Show more options
Show thinking
Gemini said
Gemini said
Code Review: LoadDocumentsAction Refactoring
Code Review:
LoadDocumentsAction
Refactoring
As requested, I have reviewed the refactoring of the
LoadDocumentsAction
class. While the intent to modernize the architecture and optimize memory is clear, there are several critical architectural flaws and potential bottlenecks in the new implementation that need to be addressed before this goes to production.
Here is my detailed evaluation.
1. Strengths & Positive Changes
1. Strengths & Positive Changes
Dependency Injection:
Moving
EntityQueryBuilder
from a static call to an injected dependency significantly improves the testability of the class. You can now easily mock the query builder in your unit tests.
Simplified Readability:
Replacing the nested closures required by
chunkByIdDesc
with a flatter
foreach
structure makes the code easier to read and reason about.
Garbage Collection Awareness:
The developer is actively thinking about heap memory and Garbage Collection (GC), which is crucial for background workers and hydration scripts.
2. Critical Issues & Bottlenecks
2. Critical Issues & Bottlenecks
A. The "Infinite Accumulation" Memory Leak
A. The "Infinite Accumulation" Memory Leak
The primary goal of this refactor was memory optimization, but the implementation defeats its own purpose.
The Issue:
The code iterates over the database cursor and manually unsets
$entityModel
to free memory. However, it simultaneously instantiates new
Document
objects and adds them to
$documentsToUpdate
(and IDs to
$documentsToDelete
).
The Bottleneck:
These collections are not flushed or processed within the loop; they are accumulated and returned at the end of the method. If this script processes 500,000 records,
$documentsToUpdate
will hold 500,000 ElasticSearch
Document
objects in RAM at once, inevitably leading to an Out Of Memory (OOM) fatal error.
B. Laravel cursor() and N+1 Query Problems
B. Laravel
cursor()
and N+1 Query Problems
Replacing
chunkByIdDesc()
with
cursor()
introduces a severe database performance risk.
The Issue:
Laravel's
cursor()
executes a single query and uses a PHP generator to yield results one by one via a PDO cursor. Because it does not process models in batches,
cursor()
cannot eager-load relationships.
*
The Bottleneck:
If
$entityModel->getIndexableAttributes()
relies on
any
database relationships (e.g., getting a user's company or tags), it will trigger an N+1 query. For 100,000 records, this will execute 100,001 database queries, absolutely hammering the database.
C. Long-Running PDO Connections
C. Long-Running PDO Connections
The Issue:
Because
cursor()
keeps a single database connection open while iterating through the results, any network latency encountered inside the loop extends the transaction time.
The Bottleneck:
If ElasticSearch
Document
instantiation or the Sentry API calls (on failure) take time, the PDO connection to the MariaDB database will remain open for an extended period, potentially leading to connection timeouts, blocked processes, or database lock exhaustion.
3. Minor Issues & Observations
3. Minor Issues & Observations
Missing Skip Logic:
The removal of
SkipActivityTrait
assumes these models no longer need to be bypassed. If this was an accidental omission, you will end up polluting ElasticSearch with activity logs that were previously filtered out, wasting ES storage and processing power.
Synchronous Sentry Calls:
If a specific batch of data is malformed and throws multiple
Throwable
errors consecutively,
Sentry::captureException
will make synchronous outbound HTTP calls for every failed record. This will severely degrade the throughput of the hydration process.
4. Recommendations for Refactoring
4. Recommendations for Refactoring
To resolve these issues, I recommend a hybrid approach utilizing Laravel's
lazyById()
(or returning to chunking) combined with batch-processing the ElasticSearch payloads:
Use
lazyById()
instead of
cursor()
:
* Laravel's
lazyById(250)
fetches records in chunks under the hood (allowing for eager loading of relations without N+1) but yields them as a flat generator to the
foreach
loop. This gives you the clean syntax of a generator with the safety of chunked eager loading.
Dispatch to ElasticSearch Inside the Loop:
* Do not wait until the end of the method to return massive collections.
Keep a counter. When
$documentsToUpdate
reaches a certain threshold (e.g., 500 documents), dispatch them to ElasticSearch, empty the
SimpleCollection
, and continue the loop.
Group Sentry Exceptions:
Consider implementing a circuit breaker or batching error logs so that a sudden spike in formatting errors doesn't result in thousands of synchronous API calls to Sentry.
Good response
Bad response
Redo
Share & export
Copy
Show more options
Enter a prompt for Gemini
encrypted
Enter a prompt for Gemini
encrypted
Open upload file menu
Tools
Open mode picker
Pro
Microphone
Send message
Your Jiminny chats aren’t used to improve our models. Gemini is AI. It can make mistakes, so double check it.
Your privacy & Gemini Opens in a new window
Your privacy & Gemini
Opens in a new window
Summarize page
Summarize page
Skip to main content
Skip to main content
Toggle organization menu
Issues
Issues
Explore
Explore
Dashboards
Dashboards
Monitors
Monitors
Settings
Settings
Try Business
What's New
Help
[EMAIL]
Issues
Expand
Feed
Feed
Errors & Outages
Errors & Outages
Breached Metrics
Breached Metrics
Warnings
Warnings
User Feedback
User Feedback
Autofix
Autofix
Recently Run
Recently Run
All Views
All Views
Configure
Alerts Moved
Alerts
Moved
Issues
Issues
View Project Details
APP-1EED
Ask Seer
Ask Seer
/
Give Feedback
SevenShores\Hubspot\Exceptions\BadRequest
View events
Events (total)
Users (90d)
Level: Error
Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response: {"status":"error","message":"You have reached your secondly limit.","errorType":"RATE_LIMIT","correlationId":"019e04ea-a (truncated...)
17K
0
Ongoing
/app/Services/Crm/Hubspot/Pagination/HubspotPaginationService.php in Jiminny\Services\Crm\Hubspot\Pagination\HubspotPaginationService::executeSearchRequest
Resolve
Resolve
More resolve options
Archive
Archive
Archive options
Subscribe
Share
More Actions
Priority
Modify issue priority
High
Assignee
Modify issue assignee
Lukas Kovalik
All Envs
All Envs
90D
90D
Add a search term
Add a search term
Close sidebar
Toggle graph series - Events
Events
17K
Toggle graph series - Users
Users
0
release 68% 874599
release
68%
874599
environment 92% production
environment
92%
production
runtime.name 100% php
runtime.name
100%
php
os.build 92% #1 SMP Tue Jun 17 10:29:19 UTC 2025...
|
Firefox
|
SevenShores\Hubspot\Exceptions\BadRequest: Client SevenShores\Hubspot\Exceptions\BadRequest: Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response: {"status":"error","message":"You have reached your secondly limit.","errorType":"RATE_LIMIT — Work...
|
jiminny.sentry.io/issues/7007366572/events/e72ac6c jiminny.sentry.io/issues/7007366572/events/e72ac6ccaa9445e3ae04d55cb8c32844/?project=82419...
|
10169
|
|
10168
|
Platform Sprint 3 Q2 - Platform Team - Scrum Board Platform Sprint 3 Q2 - Platform Team - Scrum Board - Jira
jiminny.atlassian.net
Platform Sprint 3 Q2 - Platform Team - Scrum Board - Jira
Platform Sprint 3 Q2 - Platform Team - Scrum Board - Jira
Close tab
Unnamed Group
SevenShores\Hubspot\Exceptions\BadRequest: Client error: `POST [URL_WITH_CREDENTIALS] -5,69 +5,64 @@5namespace Jiminny\Component\ES\Processor\Actions;5namespace Jiminny\Component\ES\Processor\Actions;667use Elastica\Document;7use Elastica\Document;8-use Illuminate\Support\Collection;9use Jiminny\Component\ElasticSearch\Contract\Searchable;8use Jiminny\Component\ElasticSearch\Contract\Searchable;10use Jiminny\Component\ES\Processor\DTOs\DocumentLoad;9use Jiminny\Component\ES\Processor\DTOs\DocumentLoad;11use Jiminny\Component\ES\Processor\DTOs\SimpleCollection;10use Jiminny\Component\ES\Processor\DTOs\SimpleCollection;12use Jiminny\Component\ES\Processor\EntityQueryBuilder;11use Jiminny\Component\ES\Processor\EntityQueryBuilder;13-use Jiminny\Component\ES\Processor\Traits\SkipActivityTrait;14use Jiminny\Exceptions\SyncActivityException;12use Jiminny\Exceptions\SyncActivityException;15use Jiminny\Models\Model;13use Jiminny\Models\Model;16use Sentry\Laravel\Facade as Sentry;14use Sentry\Laravel\Facade as Sentry;15+use Throwable;171618class LoadDocumentsAction17class LoadDocumentsAction19{18{20-use SkipActivityTrait;19+public function __construct(21-20+private readonly EntityQueryBuilder $queryBuilder22-private const int RDS_CHUNK_SIZE = 250;21+ ) {22+ }232324-/**25- * @codeCoverageIgnore26- */27public function loadDocuments(string $updateTarget, array $entityIdsList): DocumentLoad24public function loadDocuments(string $updateTarget, array $entityIdsList): DocumentLoad28 {25 {29$documentsToUpdate = new SimpleCollection();26$documentsToUpdate = new SimpleCollection();30$documentsToDelete = new SimpleCollection();27$documentsToDelete = new SimpleCollection();312832-// do get mariadb data29+$query = $this->queryBuilder->getEntityQuery($updateTarget, $entityIdsList);33-$query = EntityQueryBuilder::getEntityQuery($updateTarget, $entityIdsList);343035-$query->chunkByIdDesc(31+/** @var Model&Searchable $entityModel */36-self::RDS_CHUNK_SIZE,32+foreach ($query->cursor() as $entityModel) {37-function (Collection $entityModels) use ($documentsToUpdate, $documentsToDelete) {33+if ($entityModel->isDeleted()) {38-/** @var Model&Searchable $entityForDeletion */34+/**39-foreach ($entityModels->whereNotNull('deleted_at') as $entityForDeletion) {35+ * Cleanup (from ElasticSearch) scheduled entities that were recently deleted.40-$documentsToDelete->add($entityForDeletion->getId());36+ * After a deletion, no more updates on a record are expected, so the operation is considered final,41- }37+ * unless the record is restored.42-38+ */43-/** @var Model&Searchable $entityModel */39+$documentsToDelete->add($entityModel->getId());44-foreach ($entityModels->whereNull('deleted_at') as $entityModel) {40+ } else {45-if (self::shouldSkipActivity($entityModel)) {41+try {46-/**42+$documentsToUpdate->add(47- * If the activity type is in the skip list, we should not push it for indexing.43+new Document((string) $entityModel->getId(), $entityModel->getIndexableAttributes())48- * If an ES record already exists, we should remove it to free up storage and processing power44+ );49- */45+ } catch (Throwable $error) {50-$documentsToDelete->add($entityModel->getId());46+ Sentry::captureException(51-47+new SyncActivityException(52-continue;48+'ES entity async RDS build data failed',53- }49+$error->getCode(),54-50+$error55-try {51+ )56-$documentsToUpdate->add(52+ );57-new Document((string) $entityModel->getId(), $entityModel->getIndexableAttributes())58- );59- } catch (\Throwable $error) {60- Sentry::captureException(61-new SyncActivityException(62-'ES entity async RDS build data failed',63-$error->getCode(),64-$error65- )66- );67- }68 }53 }69 }54 }70- );55+56+/**57+ * Clean up fragmented memory.58+ * Dropping relations and unsetting the entity model after hydration and usage,59+ * allows GC to remove heap memory allocations, and recycle already allocated memory,60+ * instead of allocating more memory from OS.61+ * Unset operations signal GC to collect destroyed object memory62+ */63+$entityModel->setRelations([]);64+ unset($entityModel);65+ }716672return new DocumentLoad($documentsToUpdate, $documentsToDelete);67return new DocumentLoad($documentsToUpdate, $documentsToDelete);73 }68 }</selection>” selected. Please summarize the selection using precise and concise language. Use headers and bulleted lists in the summary, to make it scannable. Maintain the meaning and factual accuracy.
You said
I’m on page “<tabTitle>Jy 20820 es reindex stream model hydration by Vasi</tabTitle>” with “<selection>@@ -5,69 +5,64 @@5namespace Jiminny\Component\ES\Processor\Actions;5namespace Jiminny\Component\ES\Processor\Actions;667use Elastica\Document;7use Elastica\Document;8-use Illuminate\Support\Collection;9use Jiminny\Component\ElasticSearch\Contract\Searchable;8use Jiminny\Component\ElasticSearch\Contract\Searchable;10use Jiminny\Component\ES\Processor\DTOs\DocumentLoad;9use Jiminny\Component\ES\Processor\DTOs\DocumentLoad;11use Jiminny\Component\ES\Processor\DTOs\SimpleCollection;10use Jiminny\Component\ES\Processor\DTOs\SimpleCollection;12use Jiminny\Component\ES\Processor\EntityQueryBuilder;11use Jiminny\Component\ES\Processor\EntityQueryBuilder;13-use Jiminny\Component\ES\Processor\Traits\SkipActivityTrait;14use Jiminny\Exceptions\SyncActivityException;12use Jiminny\Exceptions\SyncActivityException;15use Jiminny\Models\Model;13use Jiminny\Models\Model;16use Sentry\Laravel\Facade as Sentry;14use Sentry\Laravel\Facade as Sentry;15+use Throwable;171618class LoadDocumentsAction17class LoadDocumentsAction19{18{20-use SkipActivityTrait;19+public function __construct(21-20+private readonly EntityQueryBuilder $queryBuilder22-private const int RDS_CHUNK_SIZE = 250;21+ ) {22+ }232324-/**25- * @codeCoverageIgnore26- */27public function loadDocuments(string $updateTarget, array $entityIdsList): DocumentLoad24public function loadDocuments(string $updateTarget, array $entityIdsList): DocumentLoad28 {25 {29$documentsToUpdate = new SimpleCollection();26$documentsToUpdate = new SimpleCollection();30$documentsToDelete = new SimpleCollection();27$documentsToDelete = new SimpleCollection();312832-// do get mariadb data29+$query = $this->queryBuilder->getEntityQuery($updateTarget, $entityIdsList);33-$query = EntityQueryBuilder::getEntityQuery($updateTarget, $entityIdsList);343035-$query->chunkByIdDesc(31+/** @var Model&Searchable $entityModel */36-self::RDS_CHUNK_SIZE,32+foreach ($query->cursor() as $entityModel) {37-function (Collection $entityModels) use ($documentsToUpdate, $documentsToDelete) {33+if ($entityModel->isDeleted()) {38-/** @var Model&Searchable $entityForDeletion */34+/**39-foreach ($entityModels->whereNotNull('deleted_at') as $entityForDeletion) {35+ * Cleanup (from ElasticSearch) scheduled entities that were recently deleted.40-$documentsToDelete->add($entityForDeletion->getId());36+ * After a deletion, no more updates on a record are expected, so the operation is considered final,41- }37+ * unless the record is restored.42-38+ */43-/** @var Model&Searchable $entityModel */39+$documentsToDelete->add($entityModel->getId());44-foreach ($entityModels->whereNull('deleted_at') as $entityModel) {40+ } else {45-if (self::shouldSkipActivity($entityModel)) {41+try {46-/**42+$documentsToUpdate->add(47- * If the activity type is in the skip list, we should not push it for indexing.43+new Document((string) $entityModel->getId(), $entityModel->getIndexableAttributes())48- * If an ES record already exists, we should remove it to free up storage and processing power44+ );49- */45+ } catch (Throwable $error) {50-$documentsToDelete->add($entityModel->getId());46+ Sentry::captureException(51-47+new SyncActivityException(52-continue;48+'ES entity async RDS build data failed',53- }49+$error->getCode(),54-50+$error55-try {51+ )56-$documentsToUpdate->add(52+ );57-new Document((string) $entityModel->getId(), $entityModel->getIndexableAttributes())58- );59- } catch (\Throwable $error) {60- Sentry::captureException(61-new SyncActivityException(62-'ES entity async RDS build data failed',63-$error->getCode(),64-$error65- )66- );67- }68 }53 }69 }54 }70- );55+56+/**57+ * Clean up fragmented memory.58+ * Dropping relations and unsetting the entity model after hydration and usage,59+ * allows GC to remove heap memory allocations, and recycle already allocated memory,60+ * instead of allocating more memory from OS.61+ * Unset operations signal GC to collect destroyed object memory62+ */63+$entityModel->setRelations([]);64+ unset($entityModel);65+ }716672return new DocumentLoad($documentsToUpdate, $documentsToDelete);67return new DocumentLoad($documentsToUpdate, $documentsToDelete);73 }68 }</selection>” selected.
Please summarize the selection using precise and concise language. Use headers and bulleted lists in the summary, to make it scannable. Maintain the meaning and factual accuracy.
Collapse
Listen
Show more options
Show thinking
Gemini said
Gemini said
Overview
Overview
This diff refactors the
LoadDocumentsAction
class to optimize memory usage and data processing. It transitions the database query execution from batch chunking to lazy loading using cursors, introduces explicit memory management techniques, and updates the class structure to use dependency injection.
Architectural & Structural Changes
Architectural & Structural Changes
Dependency Injection:
Injected
EntityQueryBuilder
via the constructor instead of calling it statically.
Removed Traits & Constants:
Removed the
SkipActivityTrait
entirely (and its associated skip logic), as well as the
RDS_CHUNK_SIZE
constant.
Namespace Imports:
Added the
Throwable
import and removed
Illuminate\Support\Collection
.
Data Processing Refactor
Data Processing Refactor
Cursor Implementation:
Replaced
chunkByIdDesc
with
cursor()
, iterating through records sequentially rather than loading batches of 250 into memory.
Simplified Deletion Checks:
Replaced Laravel collection filtering (
whereNotNull('deleted_at')
) with a direct
$entityModel->isDeleted()
check on each model during iteration.
Removed Skip Logic:
Removed the
shouldSkipActivity
check, meaning all non-deleted models are now directly processed for updates.
Exception Handling:
Updated the catch block to use the imported
Throwable
interface rather than the fully qualified
\Throwable
.
Memory Optimization
Memory Optimization
Explicit Garbage Collection:
Added specific cleanup steps inside the iteration loop. Dropping loaded relationships (
$entityModel->setRelations([])
) and unsetting the model (
unset($entityModel)
) explicitly signals the PHP Garbage Collector to free and recycle heap memory, preventing excessive OS memory allocation during large stream hydration.
Good response
Bad response
Share & export
Copy
Show more options
Copy prompt
Edit
You said You are seasoned code reviewer and your task is to make detailed code review of summarized page. First understand the code changes, then evaluate it and try to find potential issues and bottlenecks.
You said
You are seasoned code reviewer and your task is to make detailed code
review of summarized page. First understand the code changes, then
evaluate it and try to find potential issues and bottlenecks.
Expand
Listen
Show more options
Show thinking
Gemini said
Gemini said
Code Review: LoadDocumentsAction Refactoring
Code Review:
LoadDocumentsAction
Refactoring
As requested, I have reviewed the refactoring of the
LoadDocumentsAction
class. While the intent to modernize the architecture and optimize memory is clear, there are several critical architectural flaws and potential bottlenecks in the new implementation that need to be addressed before this goes to production.
Here is my detailed evaluation.
1. Strengths & Positive Changes
1. Strengths & Positive Changes
Dependency Injection:
Moving
EntityQueryBuilder
from a static call to an injected dependency significantly improves the testability of the class. You can now easily mock the query builder in your unit tests.
Simplified Readability:
Replacing the nested closures required by
chunkByIdDesc
with a flatter
foreach
structure makes the code easier to read and reason about.
Garbage Collection Awareness:
The developer is actively thinking about heap memory and Garbage Collection (GC), which is crucial for background workers and hydration scripts.
2. Critical Issues & Bottlenecks
2. Critical Issues & Bottlenecks
A. The "Infinite Accumulation" Memory Leak
A. The "Infinite Accumulation" Memory Leak
The primary goal of this refactor was memory optimization, but the implementation defeats its own purpose.
The Issue:
The code iterates over the database cursor and manually unsets
$entityModel
to free memory. However, it simultaneously instantiates new
Document
objects and adds them to
$documentsToUpdate
(and IDs to
$documentsToDelete
).
The Bottleneck:
These collections are not flushed or processed within the loop; they are accumulated and returned at the end of the method. If this script processes 500,000 records,
$documentsToUpdate
will hold 500,000 ElasticSearch
Document
objects in RAM at once, inevitably leading to an Out Of Memory (OOM) fatal error.
B. Laravel cursor() and N+1 Query Problems
B. Laravel
cursor()
and N+1 Query Problems
Replacing
chunkByIdDesc()
with
cursor()
introduces a severe database performance risk.
The Issue:
Laravel's
cursor()
executes a single query and uses a PHP generator to yield results one by one via a PDO cursor. Because it does not process models in batches,
cursor()
cannot eager-load relationships.
*
The Bottleneck:
If
$entityModel->getIndexableAttributes()
relies on
any
database relationships (e.g., getting a user's company or tags), it will trigger an N+1 query. For 100,000 records, this will execute 100,001 database queries, absolutely hammering the database.
C. Long-Running PDO Connections
C. Long-Running PDO Connections...
|
Firefox
|
SevenShores\Hubspot\Exceptions\BadRequest: Client SevenShores\Hubspot\Exceptions\BadRequest: Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response: {"status":"error","message":"You have reached your secondly limit.","errorType":"RATE_LIMIT — Work...
|
jiminny.sentry.io/issues/7007366572/events/e72ac6c jiminny.sentry.io/issues/7007366572/events/e72ac6ccaa9445e3ae04d55cb8c32844/?project=82419...
|
10168
|
|
10167
|
Platform Sprint 3 Q2 - Platform Team - Scrum Board Platform Sprint 3 Q2 - Platform Team - Scrum Board - Jira
Platform Sprint 3 Q2 - Platform Team - Scrum Board - Jira
Close tab
Unnamed Group
SevenShores\Hubspot\Exceptions\BadRequest: Client error: `POST [URL_WITH_CREDENTIALS] -5,69 +5,64 @@5namespace Jiminny\Component\ES\Processor\Actions;5namespace Jiminny\Component\ES\Processor\Actions;667use Elastica\Document;7use Elastica\Document;8-use Illuminate\Support\Collection;9use Jiminny\Component\ElasticSearch\Contract\Searchable;8use Jiminny\Component\ElasticSearch\Contract\Searchable;10use Jiminny\Component\ES\Processor\DTOs\DocumentLoad;9use Jiminny\Component\ES\Processor\DTOs\DocumentLoad;11use Jiminny\Component\ES\Processor\DTOs\SimpleCollection;10use Jiminny\Component\ES\Processor\DTOs\SimpleCollection;12use Jiminny\Component\ES\Processor\EntityQueryBuilder;11use Jiminny\Component\ES\Processor\EntityQueryBuilder;13-use Jiminny\Component\ES\Processor\Traits\SkipActivityTrait;14use Jiminny\Exceptions\SyncActivityException;12use Jiminny\Exceptions\SyncActivityException;15use Jiminny\Models\Model;13use Jiminny\Models\Model;16use Sentry\Laravel\Facade as Sentry;14use Sentry\Laravel\Facade as Sentry;15+use Throwable;171618class LoadDocumentsAction17class LoadDocumentsAction19{18{20-use SkipActivityTrait;19+public function __construct(21-20+private readonly EntityQueryBuilder $queryBuilder22-private const int RDS_CHUNK_SIZE = 250;21+ ) {22+ }232324-/**25- * @codeCoverageIgnore26- */27public function loadDocuments(string $updateTarget, array $entityIdsList): DocumentLoad24public function loadDocuments(string $updateTarget, array $entityIdsList): DocumentLoad28 {25 {29$documentsToUpdate = new SimpleCollection();26$documentsToUpdate = new SimpleCollection();30$documentsToDelete = new SimpleCollection();27$documentsToDelete = new SimpleCollection();312832-// do get mariadb data29+$query = $this->queryBuilder->getEntityQuery($updateTarget, $entityIdsList);33-$query = EntityQueryBuilder::getEntityQuery($updateTarget, $entityIdsList);343035-$query->chunkByIdDesc(31+/** @var Model&Searchable $entityModel */36-self::RDS_CHUNK_SIZE,32+foreach ($query->cursor() as $entityModel) {37-function (Collection $entityModels) use ($documentsToUpdate, $documentsToDelete) {33+if ($entityModel->isDeleted()) {38-/** @var Model&Searchable $entityForDeletion */34+/**39-foreach ($entityModels->whereNotNull('deleted_at') as $entityForDeletion) {35+ * Cleanup (from ElasticSearch) scheduled entities that were recently deleted.40-$documentsToDelete->add($entityForDeletion->getId());36+ * After a deletion, no more updates on a record are expected, so the operation is considered final,41- }37+ * unless the record is restored.42-38+ */43-/** @var Model&Searchable $entityModel */39+$documentsToDelete->add($entityModel->getId());44-foreach ($entityModels->whereNull('deleted_at') as $entityModel) {40+ } else {45-if (self::shouldSkipActivity($entityModel)) {41+try {46-/**42+$documentsToUpdate->add(47- * If the activity type is in the skip list, we should not push it for indexing.43+new Document((string) $entityModel->getId(), $entityModel->getIndexableAttributes())48- * If an ES record already exists, we should remove it to free up storage and processing power44+ );49- */45+ } catch (Throwable $error) {50-$documentsToDelete->add($entityModel->getId());46+ Sentry::captureException(51-47+new SyncActivityException(52-continue;48+'ES entity async RDS build data failed',53- }49+$error->getCode(),54-50+$error55-try {51+ )56-$documentsToUpdate->add(52+ );57-new Document((string) $entityModel->getId(), $entityModel->getIndexableAttributes())58- );59- } catch (\Throwable $error) {60- Sentry::captureException(61-new SyncActivityException(62-'ES entity async RDS build data failed',63-$error->getCode(),64-$error65- )66- );67- }68 }53 }69 }54 }70- );55+56+/**57+ * Clean up fragmented memory.58+ * Dropping relations and unsetting the entity model after hydration and usage,59+ * allows GC to remove heap memory allocations, and recycle already allocated memory,60+ * instead of allocating more memory from OS.61+ * Unset operations signal GC to collect destroyed object memory62+ */63+$entityModel->setRelations([]);64+ unset($entityModel);65+ }716672return new DocumentLoad($documentsToUpdate, $documentsToDelete);67return new DocumentLoad($documentsToUpdate, $documentsToDelete);73 }68 }</selection>” selected. Please summarize the selection using precise and concise language. Use headers and bulleted lists in the summary, to make it scannable. Maintain the meaning and factual accuracy.
You said
I’m on page “<tabTitle>Jy 20820 es reindex stream model hydration by Vasi</tabTitle>” with “<selection>@@ -5,69 +5,64 @@5namespace Jiminny\Component\ES\Processor\Actions;5namespace Jiminny\Component\ES\Processor\Actions;667use Elastica\Document;7use Elastica\Document;8-use Illuminate\Support\Collection;9use Jiminny\Component\ElasticSearch\Contract\Searchable;8use Jiminny\Component\ElasticSearch\Contract\Searchable;10use Jiminny\Component\ES\Processor\DTOs\DocumentLoad;9use Jiminny\Component\ES\Processor\DTOs\DocumentLoad;11use Jiminny\Component\ES\Processor\DTOs\SimpleCollection;10use Jiminny\Component\ES\Processor\DTOs\SimpleCollection;12use Jiminny\Component\ES\Processor\EntityQueryBuilder;11use Jiminny\Component\ES\Processor\EntityQueryBuilder;13-use Jiminny\Component\ES\Processor\Traits\SkipActivityTrait;14use Jiminny\Exceptions\SyncActivityException;12use Jiminny\Exceptions\SyncActivityException;15use Jiminny\Models\Model;13use Jiminny\Models\Model;16use Sentry\Laravel\Facade as Sentry;14use Sentry\Laravel\Facade as Sentry;15+use Throwable;171618class LoadDocumentsAction17class LoadDocumentsAction19{18{20-use SkipActivityTrait;19+public function __construct(21-20+private readonly EntityQueryBuilder $queryBuilder22-private const int RDS_CHUNK_SIZE = 250;21+ ) {22+ }232324-/**25- * @codeCoverageIgnore26- */27public function loadDocuments(string $updateTarget, array $entityIdsList): DocumentLoad24public function loadDocuments(string $updateTarget, array $entityIdsList): DocumentLoad28 {25 {29$documentsToUpdate = new SimpleCollection();26$documentsToUpdate = new SimpleCollection();30$documentsToDelete = new SimpleCollection();27$documentsToDelete = new SimpleCollection();312832-// do get mariadb data29+$query = $this->queryBuilder->getEntityQuery($updateTarget, $entityIdsList);33-$query = EntityQueryBuilder::getEntityQuery($updateTarget, $entityIdsList);343035-$query->chunkByIdDesc(31+/** @var Model&Searchable $entityModel */36-self::RDS_CHUNK_SIZE,32+foreach ($query->cursor() as $entityModel) {37-function (Collection $entityModels) use ($documentsToUpdate, $documentsToDelete) {33+if ($entityModel->isDeleted()) {38-/** @var Model&Searchable $entityForDeletion */34+/**39-foreach ($entityModels->whereNotNull('deleted_at') as $entityForDeletion) {35+ * Cleanup (from ElasticSearch) scheduled entities that were recently deleted.40-$documentsToDelete->add($entityForDeletion->getId());36+ * After a deletion, no more updates on a record are expected, so the operation is considered final,41- }37+ * unless the record is restored.42-38+ */43-/** @var Model&Searchable $entityModel */39+$documentsToDelete->add($entityModel->getId());44-foreach ($entityModels->whereNull('deleted_at') as $entityModel) {40+ } else {45-if (self::shouldSkipActivity($entityModel)) {41+try {46-/**42+$documentsToUpdate->add(47- * If the activity type is in the skip list, we should not push it for indexing.43+new Document((string) $entityModel->getId(), $entityModel->getIndexableAttributes())48- * If an ES record already exists, we should remove it to free up storage and processing power44+ );49- */45+ } catch (Throwable $error) {50-$documentsToDelete->add($entityModel->getId());46+ Sentry::captureException(51-47+new SyncActivityException(52-continue;48+'ES entity async RDS build data failed',53- }49+$error->getCode(),54-50+$error55-try {51+ )56-$documentsToUpdate->add(52+ );57-new Document((string) $entityModel->getId(), $entityModel->getIndexableAttributes())58- );59- } catch (\Throwable $error) {60- Sentry::captureException(61-new SyncActivityException(62-'ES entity async RDS build data failed',63-$error->getCode(),64-$error65- )66- );67- }68 }53 }69 }54 }70- );55+56+/**57+ * Clean up fragmented memory.58+ * Dropping relations and unsetting the entity model after hydration and usage,59+ * allows GC to remove heap memory allocations, and recycle already allocated memory,60+ * instead of allocating more memory from OS.61+ * Unset operations signal GC to collect destroyed object memory62+ */63+$entityModel->setRelations([]);64+ unset($entityModel);65+ }716672return new DocumentLoad($documentsToUpdate, $documentsToDelete);67return new DocumentLoad($documentsToUpdate, $documentsToDelete);73 }68 }</selection>” selected.
Please summarize the selection using precise and concise language. Use headers and bulleted lists in the summary, to make it scannable. Maintain the meaning and factual accuracy.
Collapse
Listen
Show more options
Show thinking
Gemini said
Gemini said
Overview
Overview
This diff refactors the
LoadDocumentsAction
class to optimize memory usage and data processing. It transitions the database query execution from batch chunking to lazy loading using cursors, introduces explicit memory management techniques, and updates the class structure to use dependency injection.
Architectural & Structural Changes
Architectural & Structural Changes
Dependency Injection:
Injected
EntityQueryBuilder
via the constructor instead of calling it statically.
Removed Traits & Constants:
Removed the
SkipActivityTrait
entirely (and its associated skip logic), as well as the
RDS_CHUNK_SIZE
constant.
Namespace Imports:
Added the
Throwable
import and removed
Illuminate\Support\Collection
.
Data Processing Refactor
Data Processing Refactor
Cursor Implementation:
Replaced
chunkByIdDesc
with
cursor()
, iterating through records sequentially rather than loading batches of 250 into memory.
Simplified Deletion Checks:
Replaced Laravel collection filtering (
whereNotNull('deleted_at')
) with a direct
$entityModel->isDeleted()
check on each model during iteration.
Removed Skip Logic:
Removed the
shouldSkipActivity
check, meaning all non-deleted models are now directly processed for updates.
Exception Handling:
Updated the catch block to use the imported
Throwable
interface rather than the fully qualified
\Throwable
.
Memory Optimization
Memory Optimization
Explicit Garbage Collection:
Added specific cleanup steps inside the iteration loop. Dropping loaded relationships (
$entityModel->setRelations([])
) and unsetting the model (
unset($entityModel)
) explicitly signals the PHP Garbage Collector to free and recycle heap memory, preventing excessive OS memory allocation during large stream hydration.
Good response
Bad response
Share & export
Copy
Show more options
Copy prompt
Edit
You said You are seasoned code reviewer and your task is to make detailed code review of summarized page. First understand the code changes, then evaluate it and try to find potential issues and bottlenecks.
You said
You are seasoned code reviewer and your task is to make detailed code
review of summarized page. First understand the code changes, then
evaluate it and try to find potential issues and bottlenecks.
Expand
Listen
Show more options
Show thinking
Gemini said
Gemini said
Code Review: LoadDocumentsAction Refactoring
Code Review:
LoadDocumentsAction
Refactoring
As requested, I have reviewed the refactoring of the
LoadDocumentsAction
class. While the intent to modernize the architecture and optimize memory is clear, there are several critical architectural flaws and potential bottlenecks in the new implementation that need to be addressed before this goes to production.
Here is my detailed evaluation.
1. Strengths & Positive Changes
1. Strengths & Positive Changes
Dependency Injection:
Moving
EntityQueryBuilder
from a static call to an injected dependency significantly improves the testability of the class. You can now easily mock the query builder in your unit tests.
Simplified Readability:
Replacing the nested closures required by
chunkByIdDesc
with a flatter
foreach
structure makes the code easier to read and reason about.
Garbage Collection Awareness:
The developer is actively thinking about heap memory and Garbage Collection (GC), which is crucial for background workers and hydration scripts.
2. Critical Issues & Bottlenecks
2. Critical Issues & Bottlenecks
A. The "Infinite Accumulation" Memory Leak
A. The "Infinite Accumulation" Memory Leak
The primary goal of this refactor was memory optimization, but the implementation defeats its own purpose....
|
Firefox
|
SevenShores\Hubspot\Exceptions\BadRequest: Client SevenShores\Hubspot\Exceptions\BadRequest: Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response: {"status":"error","message":"You have reached your secondly limit.","errorType":"RATE_LIMIT — Work...
|
jiminny.sentry.io/issues/7007366572/events/e72ac6c jiminny.sentry.io/issues/7007366572/events/e72ac6ccaa9445e3ae04d55cb8c32844/?project=82419...
|
10167
|
|
10166
|
PhostormcodeCode diff reviewulauon and senury tate PhostormcodeCode diff reviewulauon and senury tate concems are real Dut predate unis change —1aopen separate tickets for them rather than expand this PR's scope."summarize the code review suggestionswitch cursor() to lazyByld(250) . It preserves the single-loop, generator-style code in thenew vesion wnlerestonne crover Datenee eazer loaelne avolelne ntiongetindexableAttributes() ) and releasing the DB connection between chunks (avoidinglong-held PDO connections during ES/Sentry calls).une orner uwo concers raised ov ue reviewer — unbounded accumulaonin$documentsToUpdate / $documentsToDelete,and synchronous Sentry calls on every failure-— are vala dut dre-care uis rr ana ve lone in sevarare uckers. not as blockers nereok lets fully understand chunkByldDesc(250), cursor and lazyByld(250). I amnot sure l am fully clear on the issue l want to understnad it before suggestingthe changeDissected three Laravel iteration methods and their memory. connection, and eager-loading implications >G00d instincr — ler's actualv understand what each one does at the souroo leve. becausethe difterences only make sense once vou see the queries that actually hit the database.cursoroUnder the hood, this runs one query and uses PDO's unbuftered mode to stream results. OnMvSOL MariaDB that means P00: :MYSOL ATTR USE BUFFERED QUERY = false. The drivertells the server "send me rows as I ask for them." and the server keeps the result set openserver-side until voll ve consumed it all or the connection drons)What you get:SELECT * FROM activities WHERE ... ORDER BY id:-- A this querv stavs "active" on the connection for the entire foreachlPHP memory: only the current row's hydrated r 1el is alive. Very low.DB connection: held open and busy for the entire iteration. You cannot run another query onWrite a message…Opus 4.7 Adaptive vPP-1EED17 hours ago JSONerronTrace: Trace TDJumo to: HiahliahtsStack Tracec379cb6a6f224dcab13f4f1ed38d504brace* Display venshores Hubspot Exceptions BadRequestzleHttp Exception Clientexceptionnt error: POSt httos://api.hubapi.com/crm/v3/0biects/contact/search& resulted in a 429 100 Manv Requests' response:atus":"error", "message":"You have reached your secondly limit.","errorType":"RATE_LIMIT", "correlationId":"019e04ea-a (truncated...)chanism generichandled trueshed in non-aoo:/vendor/quzzlehtto/auzzle/src/Excention/RequestExceotion.oho 11 in Guzzeltto, Excention Request Excention:createShow 11 more framesp/Services/Crm/Hubspot/Paqination/HubspotPaqinationService.php:163inJiminny/Services\Crm.\Hubspot\Paqination.HubspotPaqinationSenvice:.executeSearchRequesp/Services/Crm/Hubspot/Pagination/HubspotPaginationService.php:51 in JiminnyServices\Crm\Hubspot\Pagination\HubspotPaginationService::getPaginatedDataGeneratorin Appp/Services/crm/Hubspot/client.php:94 in JiminnyServices\erm\Hubspot\Client::getPaginatedDataIn Appo//Services/Crm/Hubsoot/Service.oho:1212 in Jiminnv Services Crm Hubsoot|Service:Jiminnv Services Crm Hubsoot.closure)ed from:/vendor/larave//tramework/src/llluminate/Cache/Repositorv.oho:564inlluminateCache-Reoositorv.remembenp/Services/Crm/Hubspot/Service.ohp:1206 in Jiminny Services Crm Hubspot Service:matchByNamep/Services/Crm/CachedCrmServiceDecorator.php:167 in Jiminny\Services\Crm\CachedCrmServiceDecorator:matchByNamein Appp/Services/Crm/ermActivityService.php:227in Jiminny Services\Crm \CrmActivityService::hndCrmRecordsIn Appo/Services/Crm/CrmActivitvService.ohv:130inJiminnv|Services\Crm\CrmActivitvService-undateParticinantsCrmDatalp/Services/Crm/CrmActivityService.php:81 in Jiminny\Services\Crm\CrmActivityService::updateCrmDataIn Appp/Jobs/Crm/MatchActivityCrmData.oho:107 in Jiminny Jobs Crm MatchActivityCrmData:Jiminny Jobs Crm (closure)In Aoped from: /vendor/laravel/frarb/Jobs/Crm/MatchActivityCrmData.php:87 in Jiminny\Jobs\Crm\MatchActivityCrmData:handleIn Apped from:vendor/laravel/fraork/src/Illuminate/Container/BoundMethod.php:36 in Illuminate\Container\BoundMethod:Illuminate\Container\(closure)chow 14 more framesb/Queue/Worker/Worker.php:71 in Jiminny\Queue\Worker\Worker:processnd feam. Wuondor/lorouol/feomaworl/ora/llluminoto/Ououo/worbornhn.4ZGd.llluminotolOuouolWorbor.run70hShow 17 more frames_Copyasv100% 5rilo May 20:0/.0.@ Ask Seer * .Try out Seer nowv Issue TrackingGithub# JiraV ACCIVICYAdd a comment.8 Assignedoy LuKas Kovalik to themselves.Marked as Ongoino6 months agcFirst Seen6 months agov PeooleLK participatingSSJKIPIN viewedCimilar IectesMerged Issues...
|
iTerm2
|
NULL
|
NULL
|
10166
|
|
10165
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
19
Previous Highlighted Error
Next Highlighted Error
[2026-05-07 14:21:15] local.INFO: [Hubspot] DEBUG Getting headers {
"headers":{
"Date":["Thu,07 May 2026 14:21:15 GMT"],
"Content-Type":["application/json;charset=utf-8"],
"Transfer-Encoding":["chunked"],
"Connection":["keep-alive"],
"CF-Ray":["9f80deb8db60dc3a-SOF"],
"CF-Cache-Status":["DYNAMIC"],
"Strict-Transport-Security":["max-age=31536000; includeSubDomains; preload"],
"Vary":["origin,
accept-encoding"],
"access-control-allow-credentials":["false"],
"server-timing":["hcid;desc=\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\",
cfr;desc=\"9f80deb8e7c6dc3a-IAD\""],
"x-content-type-options":["nosniff"],
"x-hubspot-correlation-id":["019e02d0-6fd8-7812-bdba-885b7ccb3ee3"],
"Set-Cookie":["__cf_bm=SIUrtdQgXVrik50pdqF6hZVYKhzTnQBidvMabeCtm0Y-1778163675-[IP_ADDRESS]-rI.ZggtDKxTge5zr8_2gbBfWMQQ.ufZEXDZyHz2mBUFdzdo2gTHEsOkXMSEShjK0hGYxNhUGM1ZoBpX7BcFZcHEjA7Cs_.SMUhUnd2nYjko; path=/; expires=Thu,
07-May-26 14:51:15 GMT; domain=.hubapi.com; HttpOnly; Secure; SameSite=None"],
"Report-To":["{
\"endpoints\":[{
\"url\":\"https:\\/\\/a.nel.cloudflare.com\\/report\\/v4?s=NYAlsVTP0fYm32qrSDjxYE4sd2RWRqiSp3wHsmdEgZlzoYdxI%2BIxVpHmsKn3O%2BKVA3mFIJ2m7YRECDGSM%2BW2IYTzo6FM4%2BdUIjURO8srzKSvJgZ%2BQ6R79arKQw3uHLlX\"}],
\"group\":\"cf-nel\",
\"max_age\":604800}"],
"NEL":["{
\"success_fraction\":0.01,
\"report_to\":\"cf-nel\",
\"max_age\":604800}"],
"Server":["cloudflare"]}} {
"correlation_id":"95236535-ec98-4541-b92a-adfa73b69eab",
"trace_id":"c7ab8365-903f-46d4-9403-0e5b551e3545"}
Show Replace Field
Search History
doSearch
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
1/1
Previous Occurrence
Next Occurrence
Filter Search Results
Open in Window, Multiple Cursors
Click to highlight
Close
Code changed:
Hide
Sync Changes
Hide This Notification
7
48
1
33
1
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Services\Crm\Hubspot;
use Carbon\Carbon;
use Exception;
use Generator;
use GuzzleHttp\Exception\RequestException;
use Illuminate\Support\Facades\Cache;
use InvalidArgumentException;
use Jiminny\Contracts\Repositories\TeamRepository;
use Jiminny\Contracts\Services\Crm\ClientInterface;
use Jiminny\Contracts\Services\Crm\FetchRelatedActivityInterface;
use Jiminny\Contracts\Services\Crm\LayoutManagementInterface;
use Jiminny\Contracts\Services\Crm\MatchCrmEntitiesInterface;
use Jiminny\Contracts\Services\Crm\Provider\HubspotInterface;
use Jiminny\Contracts\Services\Crm\RemoteEntityLookupInterface;
use Jiminny\Contracts\Services\Crm\RemoteEntityManipulationInterface;
use Jiminny\Contracts\Services\Crm\SavePlaybackLinkToCrmInterface;
use Jiminny\Contracts\Services\Crm\SendSummaryToCrmInterface;
use Jiminny\Contracts\Services\Crm\SettingsInterface;
use Jiminny\Contracts\Services\Crm\SyncCrmEntitiesInterface;
use Jiminny\Contracts\Services\Crm\SyncCrmMetadataInterface;
use Jiminny\Contracts\Services\Crm\VerifyTaskExistsInterface;
use Jiminny\Exceptions\CrmException;
use Jiminny\Exceptions\HttpNotFoundException;
use Jiminny\Jobs\Crm\NoteObject;
use Jiminny\Models\Account;
use Jiminny\Models\Activity;
use Jiminny\Models\Contact;
use Jiminny\Models\Contracts\ActivityContract;
use Jiminny\Models\Crm\BusinessProcess;
use Jiminny\Models\Crm\Field;
use Jiminny\Models\Crm\FieldData;
use Jiminny\Models\Crm\Layout;
use Jiminny\Models\Crm\Profile;
use Jiminny\Models\Lead;
use Jiminny\Models\Opportunity;
use Jiminny\Models\Participant;
use Jiminny\Models\Playbook;
use Jiminny\Models\SocialAccount;
use Jiminny\Models\Stage;
use Jiminny\Models\User;
use Jiminny\Repositories\Crm\CrmEntityRepository;
use Jiminny\Repositories\Crm\FieldRepository;
use Jiminny\Repositories\Crm\ProfileRepository;
use Jiminny\Repositories\ParticipantRepository;
use Jiminny\Services\Avatar\ProspectPhotoPathService;
use Jiminny\Services\Crm\BaseService;
use Jiminny\Services\Crm\Hubspot\Actions\SyncArchivedProfilesAction;
use Jiminny\Services\Crm\Hubspot\Fields\ValueNormalizer;
use Jiminny\Services\Crm\Hubspot\ServiceTraits\OpportunitySyncTrait;
use Jiminny\Services\Crm\Hubspot\ServiceTraits\SyncCrmEntitiesTrait;
use Jiminny\Services\Crm\Hubspot\ServiceTraits\SyncFieldsTrait;
use Jiminny\Services\Crm\Hubspot\ServiceTraits\WriteCrmTrait;
use Jiminny\Services\Crm\MatchDomainByEmailInterface;
use Jiminny\Services\Crm\OpportunitySyncStrategyResolver;
use Jiminny\Services\Crm\ResolveCompanyNameByEmailTrait;
use Jiminny\Utils\PlaybackUrlBuilder;
use Sentry;
use SevenShores\Hubspot\Exceptions\BadRequest;
use Throwable;
use UnexpectedValueException;
/**
* @phpstan-type CrmFieldDefinition array{
* name: string,
* label: string,
* description: string,
* type: string,
* fieldType: string,
* hidden: bool,
* showCurrencySymbol: bool,
* options: array<array{
* id: string,
* label: string,
* value?: string,
* }
*/
class Service extends BaseService implements
HubspotInterface,
SyncCrmEntitiesInterface,
SyncCrmMetadataInterface,
SendSummaryToCrmInterface,
MatchDomainByEmailInterface,
SavePlaybackLinkToCrmInterface,
RemoteEntityManipulationInterface,
FetchRelatedActivityInterface,
LayoutManagementInterface,
SettingsInterface,
MatchCrmEntitiesInterface,
RemoteEntityLookupInterface,
VerifyTaskExistsInterface
{
use ResolveCompanyNameByEmailTrait;
use SyncCrmEntitiesTrait;
use WriteCrmTrait;
use SyncFieldsTrait;
use OpportunitySyncTrait;
private const int ENGAGEMENT_BODY_MAX_LENGTH = 65536;
private const string LOG_DATE_FORMAT = 'Y-m-d H:i:s';
private const int BATCH_UPDATE_LIMIT = 100;
private const string TEN_SECONDLY_ROLLING_POLICY = 'TEN_SECONDLY_ROLLING';
private const int TEN_SECONDLY_ROLLING_LIMIT = 10;
private const string TYPE_NOTE = 'NOTE';
private const string TYPE_MEETING = 'MEETING';
private const string TYPE_CALL = 'CALL';
private const string API_URL = '[URL_WITH_CREDENTIALS] ClientInterface|Client
*/
protected $client;
protected OpportunitySyncStrategyResolver $opportunitySyncStrategyResolver;
protected CrmEntityRepository $crmEntityRepository;
protected ProspectPhotoPathService $prospectPhotoPathService;
private SyncFieldAction $syncFieldAction;
private PayloadBuilder $payloadBuilder;
private SyncRelatedActivityManager $syncRelatedActivityManager;
private SyncArchivedProfilesAction $syncArchivedProfilesAction;
private WebhookSyncBatchProcessor $batchProcessor;
public function __construct(
Client $client,
SyncFieldAction $syncFieldAction,
PayloadBuilder $payloadBuilder,
ProspectPhotoPathService $prospectPhotoPathService,
SyncArchivedProfilesAction $syncArchivedProfilesAction,
WebhookSyncBatchProcessor $batchProcessor,
) {
parent::__construct();
$this->client = $client;
$this->syncFieldAction = $syncFieldAction;
$this->prospectPhotoPathService = $prospectPhotoPathService;
$this->payloadBuilder = $payloadBuilder;
$this->syncArchivedProfilesAction = $syncArchivedProfilesAction;
$this->batchProcessor = $batchProcessor;
$this->opportunitySyncStrategyResolver = app(OpportunitySyncStrategyResolver::class, [
'client' => $this->client,
]);
$this->syncRelatedActivityManager = app(SyncRelatedActivityManager::class, [
'client' => $this->client,
'payloadBuilder' => $this->payloadBuilder,
'logger' => $this->logger,
]);
$this->crmEntityRepository = app(CrmEntityRepository::class);
$this->dealFieldsService = app(DealFieldsService::class);
}
public function getDisplayName(): string
{
return 'HubSpot';
}
protected function getOAuthAccount(User $user): ?SocialAccount
{
// In this case, the Account Owner is always the connection for any API operations.
$owner = $user->team->owner;
return $owner->getSocialAccount(SocialAccount::PROVIDER_HUBSPOT);
}
public function getClient(): Client
{
/** @var Client */
return $this->client;
}
/**
* Convert raw field data into a format compatible with CRM APIs.
*
* @param bool $internal Direction of the conversion.
* True is pulling from CRM, false normalize before sending to CRM.
*/
public function normalizeValue(string $fieldType, string $fieldValue, bool $internal = false): string
{
return ValueNormalizer::normalize(
fieldType: $fieldType,
fieldValue: $fieldValue,
isInbound: $internal,
);
}
/**
* @inheritdoc
*/
public function getDefaultFields(string $activityType): array
{
$fields = [];
if ($activityType === Playbook::ACTIVITY_TYPE_TASK) {
$defaultFields = FieldDefinitions::defaultTaskFields();
// This lazy creates these fields if not already setup.
foreach ($defaultFields as $defaultField) {
$fields[] = $this->config->fields()->firstOrCreate($defaultField);
}
}
return $fields;
}
/**
* @inheritdoc
*/
public function getDefaultActivityField(string $activityType): Field
{
/** @var Field $activityField */
$activityField = $this->config->fields()->where([
'crm_provider_id' => 'activityType',
'object_type' => $activityType,
])->first();
return $activityField;
}
/**
* @inheritdoc
*/
public function getSupportedPlaybookTypes(): array
{
return [Playbook::ACTIVITY_TYPE_TASK];
}
/**
* @inheritdoc
*/
public function getDefaultActivityLayoutFields(string $activityType, string $layoutType): array
{
$fields = [];
if ($activityType === Playbook::ACTIVITY_TYPE_TASK) {
// Outcome should always be provided calls/meetings.
$fieldData = [
[
'crm_provider_id' => $layoutType === Layout::TYPE_SOFTPHONE_SUMMARY ? 'disposition' : 'meetingOutcome',
'object_type' => Field::OBJECT_TASK,
],
];
foreach ($fieldData as $data) {
$field = $this->config->fields()->where($data)->first();
// Only add the field if it is created, which it should be.
if ($field) {
$fields[] = $field;
}
}
}
return $fields;
}
public function getDealInsightsFields(): array
{
return FieldDefinitions::dealInsightsFields();
}
protected function getDefaultFollowupLayoutFields(string $activityType): array
{
$fields = [];
$fieldRepo = app(FieldRepository::class);
$fieldData = FieldDefinitions::followupFieldsFilter();
foreach ($fieldData as $data) {
$field = $fieldRepo->findOneConfigurationFieldByProperties($this->config, $data);
// Only add the field if it is created, which it should be.
if ($field) {
$fields[] = $field;
}
}
return $fields;
}
/**
* @inheritdoc
*/
public function syncField(Field $field): void
{
switch ($field->object_type) {
case Field::OBJECT_ACCOUNT:
$crmField = $this->client->getInstance()->companyProperties()->get($field->crm_provider_id);
break;
case Field::OBJECT_CONTACT:
$crmField = $this->client->getInstance()->contactProperties()->get($field->crm_provider_id);
break;
case Field::OBJECT_OPPORTUNITY:
$crmField = $this->client->getInstance()->dealProperties()->get($field->crm_provider_id);
break;
case Field::OBJECT_TASK:
$this->syncSingleTaskField($field);
return;
default:
return;
}
$this->syncFieldAction->execute($field, $crmField->toArray());
}
/**
* @param array<array{
* id:string,
* label:string,
* value?:string
* }> $options
*
* @throws CrmException
*
* @return FieldData[]
*
*/
public function importPicklistValues(
Field $field,
array $options = [['id' => '', 'label' => '', 'value' => '']],
): array {
if (! empty($options[0]['id']) || ! empty($options[0]['value'])) {
// We already have the options, no need to fetch them again
return $this->importOptions($field, $options);
}
$options = [];
switch ($field->getObjectType()) {
case Field::OBJECT_ACCOUNT:
$options = $this->getClient()->fetchPropertyOptions('company', $field->getCrmProviderId());
break;
case Field::OBJECT_CONTACT:
$options = $this->getClient()->fetchPropertyOptions('contact', $field->getCrmProviderId());
break;
case Field::OBJECT_OPPORTUNITY:
// Hubspot has different endpoint for stages
$options = $this->getClient()->fetchOpportunityFieldOptions($field);
break;
case Field::OBJECT_TASK:
if ($field->getCrmProviderId() === 'disposition') {
$options = $this->getClient()->fetchDispositionFieldOptions();
} elseif (in_array($field->getCrmProviderId(), ['meetingOutcome', 'activityType'])) {
$options = $this->getClient()->fetchMeetingOutcomeFieldOptions($field);
}
break;
default:
$this->logger->warning('Invalid object type', [
'object_type' => $field->getObjectType(),
'field_id' => $field->getId(),
]);
throw new CrmException('Invalid object type');
}
return $this->importOptions($field, $options);
}
/**
* @inheritdoc
*/
public function importStages(?array $types = null, ?string $missingStageName = null): ?Stage
{
$missingStage = null;
try {
// Use the HubSpot API client instead of the SDK crmPipelines() method
$endpoint = self::getDealsPipelinesEndpoint();
$pipelinesResponse = $this->client->getInstance()->getClient()->request('GET', $endpoint);
$pipelines = $pipelinesResponse->data->results;
} catch (RequestException|BadRequest $exception) {
throw $exception;
}
foreach ($pipelines as $pipeline) {
$stages = [];
// We create a business process to contain the pipeline, and store all stages against it.
$p = ResponseNormalize::normalizePipeline($pipeline);
// Create/update business process for this pipeline
$businessProcess = $this->config->businessProcesses()->updateOrCreate([
'crm_provider_id' => $p['id'],
], [
'team_id' => $this->team->id,
'name' => mb_strimwidth($p['label'], 0, 150),
'type' => BusinessProcess::TYPE_OPPORTUNITY,
'is_selectable' => $p['active'],
]);
// A record type is really a clone of the business process, used to store which record uses which pipeline.
// Create/update record type clone
$this->config->recordTypes()->updateOrCreate([
'crm_provider_id' => $p['id'],
], [
'team_id' => $this->team->id,
'name' => mb_strimwidth($p['label'], 0, 150),
'is_selectable' => $p['active'],
'business_process_id' => $businessProcess->id ?? null,
]);
// Stages - fetch all existing stages upfront to avoid N+1 queries
$existingStages = $this->config->stages()
->withTrashed()
->where('type', Stage::TYPE_OPPORTUNITY)
->get()
->keyBy('crm_provider_id');
foreach ($p['stages'] as $dealStage) {
$s = ResponseNormalize::normalizeDealStage($dealStage);
/** @var ?Stage $existingStage */
$existingStage = $existingStages->get($s['id']);
// Restore soft-deleted stages that are now active in HubSpot
if ($existingStage?->trashed() && $s['active']) {
$existingStage->restore();
}
// Upsert stage (updates soft-deleted records without restoring them)
$stage = $this->config->stages()->withTrashed()->updateOrCreate([
'crm_provider_id' => $s['id'],
], [
'team_id' => $this->team->id,
'name' => mb_strimwidth($s['label'], 0, 50),
'label' => mb_strimwidth($s['label'], 0, 191),
'type' => Stage::TYPE_OPPORTUNITY,
'sequence' => $s['displayOrder'],
'is_selectable' => $s['active'],
'probability' => $s['probability'] * 100,
]);
if ($missingStageName === $s['id']) {
$missingStage = $stage;
}
$stages[] = $stage->id;
}
$businessProcess->stages()->sync($stages);
}
return $missingStage;
}
/**
* @inheritdoc
*/
public function syncOrganization(): void
{
try {
$endpoint = '[URL_WITH_CREDENTIALS]
*/
public function find(string $name, array $scopes): array
{
$count = $this->limit ?? 20;
$offset = $this->offset ?? 0;
/** @var array<int, array<string, mixed>> */
return Cache::remember(
key: $this->team->getId() . $name . $count . $offset,
ttl: 300,
callback: function () use ($name, $offset, $count): array {
$data = [];
// Use the new V3 API to find contacts based on additional fields.
foreach (['companies', 'contacts'] as $objectType) {
$payload = $this->generateNameSearchPayload($name, $offset, $count);
$type = $objectType === 'companies' ? 'account' : 'contact';
try {
$response = $this->client->search($objectType, $payload);
// Build mapped list.
foreach ($response['results'] as $object) {
$properties = $object['properties'];
$objectName = $this->buildContactName($properties);
$record = [
'crmId' => $object['id'],
// Pass crmUrl to the FE, needed for success message in the extension when you log activity.
'crmUrl' => $this->generateProviderUrl($object['id'], $type),
'name' => $objectName,
'prospectType' => $type,
'phoneNumbers' => [],
];
if ($type === 'account') {
$record['industry'] = $properties['industry'] ?? null;
} else {
$record['title'] = $properties['jobtitle'] ?? null;
$record['organization'] = $properties['company'] ?? null;
}
$countryCode = $this->buildContactCountry($properties);
$parsedNumber = $this->buildContactPhone($countryCode, $properties);
// Add phone number to record.
if (! empty($parsedNumber['phone'])) {
$record['phoneNumbers'][] = [
'number' => $parsedNumber['phone'],
'nationalFormat' => phone_national($countryCode, $parsedNumber['phone']),
'type' => 'phone',
];
}
// Add mobile phone number to record.
if (! empty($properties['mobilephone'])) {
$mobileNumber = phone_e164($countryCode, $properties['mobilephone']);
if ($mobileNumber !== null) {
$record['phoneNumbers'][] = [
'number' => $mobileNumber,
'nationalFormat' => phone_national($countryCode, $mobileNumber),
'type' => 'mobile',
];
}
}
$data[] = $record;
}
} catch (BadRequest $e) {
$this->logger->warning('[' . $this->getDisplayName() . '] Search failed', [
'teamId' => $this->team->getUuid(),
'request' => $payload,
'reason' => $e->getMessage(),
]);
throw $e;
}
}
return $data;
},
);
}
/**
* @inheritdoc
*/
public function findOpportunities(?string $crmAccountId, ?string $crmContactId, ?int $userId = null): array
{
$data = [];
$ownerData = [];
$ownerId = null;
if ($crmAccountId === null) {
return $data;
}
if ($userId) {
$profileRepository = app(ProfileRepository::class);
$profile = $profileRepository->findProfileByUserId($this->config, $userId);
$ownerId = $profile instanceof Profile ? $profile->getCrmProviderId() : null;
}
$closedStages = $this->getClosedDealStages();
$payload = $this->payloadBuilder->generateOpportunitiesSearchPayload(
$this->config,
$crmAccountId,
$closedStages,
);
$results = $this->client->getPaginatedData($payload, 'deals');
foreach ($results['results'] as $object) {
$properties = $object['properties'];
$amount = null;
if (empty($properties['amount']) === false) {
$currency = $properties['deal_currency_code'] ?? $this->config->default_currency;
// Values can contain commas and any junk so strip them.
$value = (float) preg_replace('/[^\d.]/', '', $properties['amount']);
$amount = formatCurrency($value, $currency);
}
$businessProcess = $this->config
->businessProcesses()
->where('crm_provider_id', $properties['pipeline'])
->first();
if ($businessProcess === null) {
// Import it.
$stage = $this->importStages([Stage::TYPE_OPPORTUNITY], $properties['dealstage']);
$businessProcess = $this->config
->businessProcesses()
->where('crm_provider_id', $properties['pipeline'])
->first();
} else {
$stage = $businessProcess
->stages()
->where('crm_provider_id', $properties['dealstage'])
->where('type', Stage::TYPE_OPPORTUNITY)
->first();
if ($stage === null) {
// Import it.
$stage = $this->importStages(null, $properties['dealstage']);
}
}
$recordType = null;
if ($businessProcess) {
$recordType = $businessProcess->recordTypes()->first();
}
$isWon = in_array($properties['dealstage'], $closedStages['won']);
$isLost = in_array($properties['dealstage'], $closedStages['lost']);
$record = [
'crmId' => $object['id'],
'name' => $properties['dealname'] ?? 'Unknown Deal',
'value' => $amount,
'won' => $isWon,
'closed' => $isWon || $isLost,
'stage' => [
'id' => $stage?->getUuid() ?? '',
'name' => $stage?->getName() ?? '',
],
];
if ($recordType) {
$record += [
'recordType' => [
'id' => $recordType->id_string,
'name' => $recordType->name,
],
];
}
if ($ownerId && isset($properties['hubspot_owner_id']) && $properties['hubspot_owner_id'] === $ownerId) {
$ownerData[] = $record;
}
$data[] = $record;
}
if (! empty($ownerData)) {
return $ownerData;
}
return $data;
}
/**
* @inheritdoc
*/
public function getTasks(?string $objectType, string $objectId, ?string $opportunityId): array
{
$data = [];
switch ($objectType) {
case 'contact':
$hsObject = 'contact';
break;
case 'account':
$hsObject = 'company';
break;
default:
// This is a hack to prioritise and override a contact/company with a deal.
if ($opportunityId) {
$hsObject = 'deal';
$objectId = $opportunityId;
} else {
throw new InvalidArgumentException('Object type not supported.');
}
}
$engagementTypes = ['meetings', 'tasks'];
foreach ($engagementTypes as $engagementType) {
$payload = $this->payloadBuilder->getLinkToTaskPayload($hsObject, $objectId, $engagementType);
$this->logger->info('[HubSpot] CRM Search requested', [
'request' => $payload,
]);
$engagements = $this->client->getPaginatedData($payload, $engagementType);
foreach ($engagements['results'] as $engagement) {
if ($engagementType == 'meetings') {
$title = $engagement['properties']['hs_meeting_title'] ?? 'Scheduled meeting';
} elseif ($engagementType == 'tasks') {
$title = $engagement['properties']['hs_task_subject'];
} else {
$title = 'Scheduled meeting';
}
$data[] = [
'crmId' => $engagement['id'],
'subject' => $title,
'due' => $engagement['properties']['hs_timestamp'],
'type' => $engagement['properties']['hs_activity_type'] ?? null,
];
}
}
usort($data, function ($item1, $item2) {
return $item2['due'] <=> $item1['due'];
});
return $data;
}
/**
* Try to find CRM Objects using email address
*
* @return null|array{
* Lead|null,
* Account|null,
* Opportunity|null,
* Contact|null,
* Stage|null,
* string|null
* }
*/
public function matchExactlyByEmail(string $email, ?int $userId = null): ?array
{
$contactProperties = [
'email',
'firstname',
'lastname',
'country',
'phone',
'mobilephone',
'jobtitle',
'hubspot_owner_id',
'associatedcompanyid',
'photo',
];
$contact = null;
$account = null;
try {
$hsContact = $this->getClient()->getContactByEmail($email, $contactProperties);
if ($hsContact) {
$contact = $this->importContact($hsContact);
$account = $contact->account;
}
$data = $this->convertCrmData($contact, $account, $userId);
return ! empty(array_filter($data)) ? $data : null;
} catch (BadRequest $e) {
$this->logger->warning('[HubSpot] Search failed', [
'team_id' => $this->team->getId(),
'search_identifier' => $email,
'reason' => $e->getMessage(),
]);
}
return null;
}
public function getDomain(string $email): ?string
{
return $this->getDomainFromEmail($email);
}
/**
* Try to find CRM objects using domain name of the email address
*
* @return null|array{
* Lead|null,
* Account|null,
* Opportunity|null,
* Contact|null,
* Stage|null,
* string|null
* }
*/
public function matchByDomain(string $domain, ?int $userId = null): ?array
{
$companyName = $domain;
// Try to find a company matching their email domain.
$companyProperties = [
'country',
'phone',
'name',
'hs_avatar_filemanager_key',
'industry',
'hubspot_owner_id',
'domain',
];
try {
$hsAccounts = $this->client
->getInstance()
->companies()
->searchByDomain($companyName, $companyProperties);
} catch (Throwable $e) {
$this->logger->info('[HubSpot] Search failed', [
'error' => $e->getMessage(),
'domain' => $domain,
]);
return null;
}
$account = null;
// If there are multiple accounts, don't guess, we'll ask later.
if (\count($hsAccounts->data->results) === 1) {
// Persist this remote object.
$account = $this->syncAccount($hsAccounts->data->results[0]->companyId);
}
$data = $this->convertCrmData(null, $account, $userId);
return ! empty(array_filter($data)) ? $data : null;
}
/**
* @return array{
* Lead|null,
* Account|null,
* Opportunity|null,
* Contact|null,
* Stage|null,
* string|null
* }
*/
protected function convertCrmData(?Contact $contact, ?Account $account, ?int $userId = null): array
{
$countryCode = null;
if ($contact && $contact->country_code) {
$countryCode = $contact->country_code;
} elseif ($account && $account->country_code) {
$countryCode = $account->country_code;
}
try {
$hsOpportunities = $this->findOpportunities(
$account ? $account->crm_provider_id : null,
$contact ? $contact->crm_provider_id : null,
$userId
);
} catch (Exception $e) {
$hsOpportunities = [];
}
// If there are multiple opportunities, don't guess, we'll ask later.
$opportunity = null;
$stage = null;
if (! empty($hsOpportunities)) {
// Persist this remote object.
$opportunity = $this->syncOpportunity($hsOpportunities[0]['crmId']);
$stage = $opportunity?->getStage();
}
return [
null,
$account,
$opportunity,
$contact,
$stage,
$countryCode,
];
}
protected function getCacheKey(string $object, ?int $userId = null): ?string
{
$key = $this->team->getId() . $object;
$keySuffix = $this->getOwnerKeySuffix($userId);
return $key . $keySuffix;
}
private function getOwnerKeySuffix(?int $userId = null): string
{
return $userId === null ? '' : (string) $userId;
}
/**
* @return null|array{
* Lead|null,
* Account|null,
* Opportunity|null,
* Contact|null,
* Stage|null,
* string|null
*}
*/
public function matchByPhone(string $phone, ?string $rawPhoneNumber = null, ?int $userId = null): ?array
{
if (str_contains($phone, '**')) {
return null;
}
// trim all whitespaces if present so the lookup doesn't fail
$phone = str_replace(' ', '', $phone);
// Check if the user is internal.
if ($this->isPhoneNumberOfTeamMember($phone)) {
return null;
}
$response = $this->searchForPhoneNumber($phone);
if (empty($response)) {
return null;
}
// This would ideally importContact instead but the response type differs.
$contact = $this->findAndSyncContact($response['results'][0]['id']);
if (! $contact instanceof Contact) {
return null;
}
$account = $contact->account;
$countryCode = $contact->country_code ?? $account->country_code ?? null;
try {
$hsOpportunities = $this->findOpportunities(
$account?->crm_provider_id,
$contact->crm_provider_id,
$userId
);
} catch (Exception $e) {
$hsOpportunities = [];
}
$opportunity = null;
$stage = null;
try {
if (! empty($hsOpportunities)) {
// Persist this remote object.
$opportunity = $this->syncOpportunity($hsOpportunities[0]['crmId']);
$stage = $opportunity?->getStage();
}
} catch (Exception $e) {
$this->logger->debug('[HubSpot] Opportunity failed to sync.', [
'reason' => $e->getMessage(),
]);
}
return [
null,
$account,
$opportunity,
$contact,
$stage,
$countryCode,
];
}
private function isPhoneNumberOfTeamMember(string $phone): bool
{
$teamRepository = app(TeamRepository::class);
$user = $teamRepository->findTeamMemberByPhone($this->team, $phone);
if ($user instanceof User) {
return true;
}
return false;
}
private function findAndSyncContact(string $crmId): ?Contact
{
try {
return $this->syncContact($crmId);
} catch (Exception $exception) {
$this->logger->info('[HubSpot] Phone match failed', [
'reason' => $exception->getMessage(),
]);
return null;
}
}
private function hasResults(array $response): bool
{
return isset($response['total']) && is_numeric($response['total']) && $response['total'] > 0;
}
private function searchForPhoneNumber(string $phone): array
{
// Normalizes the provided phone number for the API search.
$normalizedPhone = $this->normalizePhoneNumber($phone);
$payload = $this->payloadBuilder->generatePhoneSearchPayload($normalizedPhone);
$this->logger->info('[HubSpot] Phone match search triggered', [
'phone' => $phone,
'normalizedPhone' => $normalizedPhone,
'payload' => $payload,
]);
$response = $this->handlePhoneSearchRequest($normalizedPhone, $payload);
if (! $this->hasResults($response)) {
$nationalPhone = preg_replace('/\D/', '', phone_national(null, $phone));
$payload = $this->payloadBuilder->generatePhoneSearchPayload($nationalPhone);
$this->logger->info('[HubSpot] Phone match national number search triggered', [
'phone' => $phone,
'nationalPhone' => $nationalPhone,
'payload' => $payload,
]);
$response = $this->handlePhoneSearchRequest($phone, $payload);
}
if (! $this->hasResults($response)) {
$payload = $this->payloadBuilder->generatePhoneSearchPayload($normalizedPhone, true);
$this->logger->info('[HubSpot] Phone match alternative search triggered', [
'phone' => $phone,
'normalizedPhone' => $normalizedPhone,
'payload' => $payload,
]);
$response = $this->handlePhoneSearchRequest($phone, $payload);
}
return $this->hasResults($response) ? $response : [];
}
private function handlePhoneSearchRequest(string $phone, array $payload): array
{
try {
return $this->client->search('contacts', $payload);
} catch (Exception $exception) {
$this->logger->info('[HubSpot] Phone match failed', [
'phone' => $phone,
'reason' => $exception->getMessage(),
]);
return [];
}
}
private function normalizePhoneNumber(string $phone): string
{
return ltrim(phone_e164(null, $phone), '+0');
}
/**
* @return null|array{
* Lead|null,
* Account|null,
* Opportunity|null,
* Contact|null,
* Stage|null,
* string|null
* }
*/
public function matchByName(string $name, ?int $userId = null): ?array
{
// Don't waste time searching for single character strings.
if (\strlen($name) <= 1) {
return null;
}
$cacheKey = $this->getCacheKey($name, $userId);
$result = Cache::remember($cacheKey, 60, function () use ($name, $userId) {
$payload = $this->payloadBuilder->generateSearchContactsByNamePayload(
$name,
$this->getContactFields()
);
$hsContacts = $this->client->getPaginatedData($payload, 'contact');
if (empty($hsContacts['results'])) {
return false;
}
$contact = $this->importContact($hsContacts['results'][0]);
if ($contact === null) {
return false;
}
$account = $contact->account;
$countryCode = $contact->country_code ?? $account->country_code ?? null;
try {
$hsOpportunities = $this->findOpportunities(
$account ? $account->crm_provider_id : null,
$contact->crm_provider_id,
$userId
);
} catch (Exception $e) {
$hsOpportunities = [];
}
$opportunity = null;
$stage = null;
if (! empty($hsOpportunities)) {
// Persist this remote object.
$opportunity = $this->syncOpportunity($hsOpportunities[0]['crmId']);
$stage = $opportunity?->getStage();
}
return [
null,
$account,
$opportunity,
$contact,
$stage,
$countryCode,
];
});
return is_array($result) ? $result : null;
}
private function convertActivityAssociations(Activity $activity): array
{
return [
'contactIds' => $this->getParticipantsIds($activity),
'companyIds' => $activity->hasAccount() ? [$activity->account->crm_provider_id] : [],
'dealIds' => $activity->hasOpportunity() ? [$activity->opportunity->crm_provider_id] : [],
'ownerIds' => [],
];
}
private function getParticipantsIds(Activity $activity): array
{
$attendees = [];
$participantRepository = app(ParticipantRepository::class);
$participants = $participantRepository->getParticipantsWhoEnteredMeeting($activity);
foreach ($participants as $participant) {
if ($participant->user_id || $participant->isCoach()) {
continue;
}
$contact = $participant->contact()->first();
if ($contact && $contact->crm_provider_id) {
$attendees[] = $contact->crm_provider_id;
} else {
if (! empty($participant->name)) {
$attendeeData = $this->fetchMissingAttendeeInfo($participant);
}
if (! empty($attendeeData['id'])) {
$attendees[] = $attendeeData['id'];
}
}
}
if ($activity->hasContact()) {
$attendees[] = $activity->contact->crm_provider_id;
}
return array_unique($attendees);
}
private function fetchMissingAttendeeInfo(Participant $participant): array
{
// Check if we need to look inside an account context.
$activity = $participant->getActivity();
$companyId = $activity->hasAccount() ? $activity->getAccount()->crm_provider_id : null;
// First check the local data.
/** @var Contact[] $contacts */
$contacts = $this->team->contacts()
->with('account')
->where('name', $participant->name)
->whereNotNull('email')
->get();
foreach ($contacts as $contact) {
// If we have a company in scope, check the contact is associated to it.
if (
$companyId !== null
&& ($contact->account_id === null || $companyId !== $contact->account->crm_provider_id)
) {
continue;
}
return [
'id' => $contact->crm_provider_id,
'email' => $contact->email,
];
}
$payload = $this->generateNameSearchPayload($participant->name, 0, 20);
try {
$response = $this->client->getNewInstance()->crm()->contacts()->searchApi()->doSearch($payload);
// TODO add some logic to choose the most suitable contact if multiple
foreach ($response['results'] as $object) {
$properties = $object['properties'];
if (empty($object['properties']) === false) {
// Check the company matches the contact.
// Todo: Move this check inside the API search.
if ($companyId !== null && $companyId !== $properties['associatedcompanyid']) {
continue;
}
return [
'id' => $object['id'],
'email' => $properties['email'],
];
}
}
} catch (Exception $e) {
$this->logger->warning('[' . $this->getDisplayName() . '] Search failed', [
'teamId' => $this->team->id_string,
'request' => $payload,
'reason' => $e->getMessage(),
]);
}
return [];
}
/**
* Store transcripts as note engagement.
*
* @throws Exception
*/
public function createTranscriptNotes(Activity $activity): void
{
// For HS no need to check if Crm profile - Log Notes field is enabled
// We only check if store_transcript toggle is enabled on crm profile.
$engagement = [
'active' => true,
'ownerId' => $this->profile->crm_provider_id,
'timestamp' => $activity->created_at->tz($activity->user->timezone)->getTimestamp() * 1000,
'type' => 'NOTE',
];
// Generate activity transcription.
$transcriptionData = $this->generateTranscription($activity);
// Truncate Notes with max notes length because transcription text could be very long.
$transcripts = mb_strimwidth($transcriptionData, 0, static::ENGAGEMENT_BODY_MAX_LENGTH);
$metadata = [
'body' => $transcripts,
];
$associations = $this->convertActivityAssociations($activity);
try {
$hsEngagement = $this->client
->getInstance()
->engagements()
->create($engagement, $associations, $metadata);
$this->logCrmEngagementManipulation(self::ACTION_CREATE, $engagement, $metadata, $associations);
$noteId = $hsEngagement->data->engagement->id;
// Store crm logged id in transcription.
$transcription = $activity->getTranscription();
$transcription->crm_activity_id = $noteId;
$transcription->save();
} catch (Exception $e) {
Sentry::captureException($e);
}
}
/*
* @inheritdoc
*/
public function updateRecord(string $objectType, string $objectId, array $data, array $headers = []): void
{
$payload = [
'properties' => $data,
];
try {
switch ($objectType) {
case FieldData::OBJECT_OPPORTUNITY:
$this->client->getNewInstance()->crm()->deals()->basicApi()->update($objectId, $payload);
break;
case FieldData::OBJECT_CONTACT:
$this->client->getNewInstance()->crm()->contacts()->basicApi()->update($objectId, $payload);
break;
case FieldData::OBJECT_ACCOUNT:
$this->client->getNewInstance()->crm()->companies()->basicApi()->update($objectId, $payload);
break;
case FieldData::OBJECT_TASK:
// Endpoint for Engagements not ready
$engagements = [
'type' => 'TASK',
];
$metadata = $data;
...
|
PhpStorm
|
faVsco.js – Hubspot/Service.php
|
NULL
|
10165
|
|
10164
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
19
Previous Highlighted Error
Next Highlighted Error
[2026-05-07 14:21:15] local.INFO: [Hubspot] DEBUG Getting headers {
"headers":{
"Date":["Thu,07 May 2026 14:21:15 GMT"],
"Content-Type":["application/json;charset=utf-8"],
"Transfer-Encoding":["chunked"],
"Connection":["keep-alive"],
"CF-Ray":["9f80deb8db60dc3a-SOF"],
"CF-Cache-Status":["DYNAMIC"],
"Strict-Transport-Security":["max-age=31536000; includeSubDomains; preload"],
"Vary":["origin,
accept-encoding"],
"access-control-allow-credentials":["false"],
"server-timing":["hcid;desc=\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\",
cfr;desc=\"9f80deb8e7c6dc3a-IAD\""],
"x-content-type-options":["nosniff"],
"x-hubspot-correlation-id":["019e02d0-6fd8-7812-bdba-885b7ccb3ee3"],
"Set-Cookie":["__cf_bm=SIUrtdQgXVrik50pdqF6hZVYKhzTnQBidvMabeCtm0Y-1778163675-[IP_ADDRESS]-rI.ZggtDKxTge5zr8_2gbBfWMQQ.ufZEXDZyHz2mBUFdzdo2gTHEsOkXMSEShjK0hGYxNhUGM1ZoBpX7BcFZcHEjA7Cs_.SMUhUnd2nYjko; path=/; expires=Thu,
07-May-26 14:51:15 GMT; domain=.hubapi.com; HttpOnly; Secure; SameSite=None"],
"Report-To":["{
\"endpoints\":[{
\"url\":\"https:\\/\\/a.nel.cloudflare.com\\/report\\/v4?s=NYAlsVTP0fYm32qrSDjxYE4sd2RWRqiSp3wHsmdEgZlzoYdxI%2BIxVpHmsKn3O%2BKVA3mFIJ2m7YRECDGSM%2BW2IYTzo6FM4%2BdUIjURO8srzKSvJgZ%2BQ6R79arKQw3uHLlX\"}],
\"group\":\"cf-nel\",
\"max_age\":604800}"],
"NEL":["{
\"success_fraction\":0.01,
\"report_to\":\"cf-nel\",
\"max_age\":604800}"],
"Server":["cloudflare"]}} {
"correlation_id":"95236535-ec98-4541-b92a-adfa73b69eab",
"trace_id":"c7ab8365-903f-46d4-9403-0e5b551e3545"}
Show Replace Field
Search History
doSearch
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
1/1
Previous Occurrence
Next Occurrence
Filter Search Results
Open in Window, Multiple Cursors
Click to highlight
Close
Code changed:
Hide
Sync Changes
Hide This Notification
7
48
1
33
1
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Services\Crm\Hubspot;
use Carbon\Carbon;
use Exception;
use Generator;
use GuzzleHttp\Exception\RequestException;
use Illuminate\Support\Facades\Cache;
use InvalidArgumentException;
use Jiminny\Contracts\Repositories\TeamRepository;
use Jiminny\Contracts\Services\Crm\ClientInterface;
use Jiminny\Contracts\Services\Crm\FetchRelatedActivityInterface;
use Jiminny\Contracts\Services\Crm\LayoutManagementInterface;
use Jiminny\Contracts\Services\Crm\MatchCrmEntitiesInterface;
use Jiminny\Contracts\Services\Crm\Provider\HubspotInterface;
use Jiminny\Contracts\Services\Crm\RemoteEntityLookupInterface;
use Jiminny\Contracts\Services\Crm\RemoteEntityManipulationInterface;
use Jiminny\Contracts\Services\Crm\SavePlaybackLinkToCrmInterface;
use Jiminny\Contracts\Services\Crm\SendSummaryToCrmInterface;
use Jiminny\Contracts\Services\Crm\SettingsInterface;
use Jiminny\Contracts\Services\Crm\SyncCrmEntitiesInterface;
use Jiminny\Contracts\Services\Crm\SyncCrmMetadataInterface;
use Jiminny\Contracts\Services\Crm\VerifyTaskExistsInterface;
use Jiminny\Exceptions\CrmException;
use Jiminny\Exceptions\HttpNotFoundException;
use Jiminny\Jobs\Crm\NoteObject;
use Jiminny\Models\Account;
use Jiminny\Models\Activity;
use Jiminny\Models\Contact;
use Jiminny\Models\Contracts\ActivityContract;
use Jiminny\Models\Crm\BusinessProcess;
use Jiminny\Models\Crm\Field;
use Jiminny\Models\Crm\FieldData;
use Jiminny\Models\Crm\Layout;
use Jiminny\Models\Crm\Profile;
use Jiminny\Models\Lead;
use Jiminny\Models\Opportunity;
use Jiminny\Models\Participant;
use Jiminny\Models\Playbook;
use Jiminny\Models\SocialAccount;
use Jiminny\Models\Stage;
use Jiminny\Models\User;
use Jiminny\Repositories\Crm\CrmEntityRepository;
use Jiminny\Repositories\Crm\FieldRepository;
use Jiminny\Repositories\Crm\ProfileRepository;
use Jiminny\Repositories\ParticipantRepository;
use Jiminny\Services\Avatar\ProspectPhotoPathService;
use Jiminny\Services\Crm\BaseService;
use Jiminny\Services\Crm\Hubspot\Actions\SyncArchivedProfilesAction;
use Jiminny\Services\Crm\Hubspot\Fields\ValueNormalizer;
use Jiminny\Services\Crm\Hubspot\ServiceTraits\OpportunitySyncTrait;
use Jiminny\Services\Crm\Hubspot\ServiceTraits\SyncCrmEntitiesTrait;
use Jiminny\Services\Crm\Hubspot\ServiceTraits\SyncFieldsTrait;
use Jiminny\Services\Crm\Hubspot\ServiceTraits\WriteCrmTrait;
use Jiminny\Services\Crm\MatchDomainByEmailInterface;
use Jiminny\Services\Crm\OpportunitySyncStrategyResolver;
use Jiminny\Services\Crm\ResolveCompanyNameByEmailTrait;
use Jiminny\Utils\PlaybackUrlBuilder;
use Sentry;
use SevenShores\Hubspot\Exceptions\BadRequest;
use Throwable;
use UnexpectedValueException;
/**
* @phpstan-type CrmFieldDefinition array{
* name: string,
* label: string,
* description: string,
* type: string,
* fieldType: string,
* hidden: bool,
* showCurrencySymbol: bool,
* options: array<array{
* id: string,
* label: string,
* value?: string,
* }
*/
class Service extends BaseService implements
HubspotInterface,
SyncCrmEntitiesInterface,
SyncCrmMetadataInterface,
SendSummaryToCrmInterface,
MatchDomainByEmailInterface,
SavePlaybackLinkToCrmInterface,
RemoteEntityManipulationInterface,
FetchRelatedActivityInterface,
LayoutManagementInterface,
SettingsInterface,
MatchCrmEntitiesInterface,
RemoteEntityLookupInterface,
VerifyTaskExistsInterface
{
use ResolveCompanyNameByEmailTrait;
use SyncCrmEntitiesTrait;
use WriteCrmTrait;
use SyncFieldsTrait;
use OpportunitySyncTrait;
private const int ENGAGEMENT_BODY_MAX_LENGTH = 65536;
private const string LOG_DATE_FORMAT = 'Y-m-d H:i:s';
private const int BATCH_UPDATE_LIMIT = 100;
private const string TEN_SECONDLY_ROLLING_POLICY = 'TEN_SECONDLY_ROLLING';
private const int TEN_SECONDLY_ROLLING_LIMIT = 10;
private const string TYPE_NOTE = 'NOTE';
private const string TYPE_MEETING = 'MEETING';
private const string TYPE_CALL = 'CALL';
private const string API_URL = '[URL_WITH_CREDENTIALS] ClientInterface|Client
*/
protected $client;
protected OpportunitySyncStrategyResolver $opportunitySyncStrategyResolver;
protected CrmEntityRepository $crmEntityRepository;
protected ProspectPhotoPathService $prospectPhotoPathService;
private SyncFieldAction $syncFieldAction;
private PayloadBuilder $payloadBuilder;
private SyncRelatedActivityManager $syncRelatedActivityManager;
private SyncArchivedProfilesAction $syncArchivedProfilesAction;
private WebhookSyncBatchProcessor $batchProcessor;
public function __construct(
Client $client,
SyncFieldAction $syncFieldAction,
PayloadBuilder $payloadBuilder,
ProspectPhotoPathService $prospectPhotoPathService,
SyncArchivedProfilesAction $syncArchivedProfilesAction,
WebhookSyncBatchProcessor $batchProcessor,
) {
parent::__construct();
$this->client = $client;
$this->syncFieldAction = $syncFieldAction;
$this->prospectPhotoPathService = $prospectPhotoPathService;
$this->payloadBuilder = $payloadBuilder;
$this->syncArchivedProfilesAction = $syncArchivedProfilesAction;
$this->batchProcessor = $batchProcessor;
$this->opportunitySyncStrategyResolver = app(OpportunitySyncStrategyResolver::class, [
'client' => $this->client,
]);
$this->syncRelatedActivityManager = app(SyncRelatedActivityManager::class, [
'client' => $this->client,
'payloadBuilder' => $this->payloadBuilder,
'logger' => $this->logger,
]);
$this->crmEntityRepository = app(CrmEntityRepository::class);
$this->dealFieldsService = app(DealFieldsService::class);
}
public function getDisplayName(): string
{
return 'HubSpot';
}
protected function getOAuthAccount(User $user): ?SocialAccount
{
// In this case, the Account Owner is always the connection for any API operations.
$owner = $user->team->owner;
return $owner->getSocialAccount(SocialAccount::PROVIDER_HUBSPOT);
}
public function getClient(): Client
{
/** @var Client */
return $this->client;
}
/**
* Convert raw field data into a format compatible with CRM APIs.
*
* @param bool $internal Direction of the conversion.
* True is pulling from CRM, false normalize before sending to CRM.
*/
public function normalizeValue(string $fieldType, string $fieldValue, bool $internal = false): string
{
return ValueNormalizer::normalize(
fieldType: $fieldType,
fieldValue: $fieldValue,
isInbound: $internal,
);
}
/**
* @inheritdoc
*/
public function getDefaultFields(string $activityType): array
{
$fields = [];
if ($activityType === Playbook::ACTIVITY_TYPE_TASK) {
$defaultFields = FieldDefinitions::defaultTaskFields();
// This lazy creates these fields if not already setup.
foreach ($defaultFields as $defaultField) {
$fields[] = $this->config->fields()->firstOrCreate($defaultField);
}
}
return $fields;
}
/**
* @inheritdoc
*/
public function getDefaultActivityField(string $activityType): Field
{
/** @var Field $activityField */
$activityField = $this->config->fields()->where([
'crm_provider_id' => 'activityType',
'object_type' => $activityType,
])->first();
return $activityField;
}
/**
* @inheritdoc
*/
public function getSupportedPlaybookTypes(): array
{
return [Playbook::ACTIVITY_TYPE_TASK];
}
/**
* @inheritdoc
*/
public function getDefaultActivityLayoutFields(string $activityType, string $layoutType): array
{
$fields = [];
if ($activityType === Playbook::ACTIVITY_TYPE_TASK) {
// Outcome should always be provided calls/meetings.
$fieldData = [
[
'crm_provider_id' => $layoutType === Layout::TYPE_SOFTPHONE_SUMMARY ? 'disposition' : 'meetingOutcome',
'object_type' => Field::OBJECT_TASK,
],
];
foreach ($fieldData as $data) {
$field = $this->config->fields()->where($data)->first();
// Only add the field if it is created, which it should be.
if ($field) {
$fields[] = $field;
}
}
}
return $fields;
}
public function getDealInsightsFields(): array
{
return FieldDefinitions::dealInsightsFields();
}
protected function getDefaultFollowupLayoutFields(string $activityType): array
{
$fields = [];
$fieldRepo = app(FieldRepository::class);
$fieldData = FieldDefinitions::followupFieldsFilter();
foreach ($fieldData as $data) {
$field = $fieldRepo->findOneConfigurationFieldByProperties($this->config, $data);
// Only add the field if it is created, which it should be.
if ($field) {
$fields[] = $field;
}
}
return $fields;
}
/**
* @inheritdoc
*/
public function syncField(Field $field): void
{
switch ($field->object_type) {
case Field::OBJECT_ACCOUNT:
$crmField = $this->client->getInstance()->companyProperties()->get($field->crm_provider_id);
break;
case Field::OBJECT_CONTACT:
$crmField = $this->client->getInstance()->contactProperties()->get($field->crm_provider_id);
break;
case Field::OBJECT_OPPORTUNITY:
$crmField = $this->client->getInstance()->dealProperties()->get($field->crm_provider_id);
break;
case Field::OBJECT_TASK:
$this->syncSingleTaskField($field);
return;
default:
return;
}
$this->syncFieldAction->execute($field, $crmField->toArray());
}
/**
* @param array<array{
* id:string,
* label:string,
* value?:string
* }> $options
*
* @throws CrmException
*
* @return FieldData[]
*
*/
public function importPicklistValues(
Field $field,
array $options = [['id' => '', 'label' => '', 'value' => '']],
): array {
if (! empty($options[0]['id']) || ! empty($options[0]['value'])) {
// We already have the options, no need to fetch them again
return $this->importOptions($field, $options);
}
$options = [];
switch ($field->getObjectType()) {
case Field::OBJECT_ACCOUNT:
$options = $this->getClient()->fetchPropertyOptions('company', $field->getCrmProviderId());
break;
case Field::OBJECT_CONTACT:
$options = $this->getClient()->fetchPropertyOptions('contact', $field->getCrmProviderId());
break;
case Field::OBJECT_OPPORTUNITY:
// Hubspot has different endpoint for stages
$options = $this->getClient()->fetchOpportunityFieldOptions($field);
break;
case Field::OBJECT_TASK:
if ($field->getCrmProviderId() === 'disposition') {
$options = $this->getClient()->fetchDispositionFieldOptions();
} elseif (in_array($field->getCrmProviderId(), ['meetingOutcome', 'activityType'])) {
$options = $this->getClient()->fetchMeetingOutcomeFieldOptions($field);
}
break;
default:
$this->logger->warning('Invalid object type', [
'object_type' => $field->getObjectType(),
'field_id' => $field->getId(),
]);
throw new CrmException('Invalid object type');
}
return $this->importOptions($field, $options);
}
/**
* @inheritdoc
*/
public function importStages(?array $types = null, ?string $missingStageName = null): ?Stage
{
$missingStage = null;
try {
// Use the HubSpot API client instead of the SDK crmPipelines() method
$endpoint = self::getDealsPipelinesEndpoint();
$pipelinesResponse = $this->client->getInstance()->getClient()->request('GET', $endpoint);
$pipelines = $pipelinesResponse->data->results;
} catch (RequestException|BadRequest $exception) {
throw $exception;
}
foreach ($pipelines as $pipeline) {
$stages = [];
// We create a business process to contain the pipeline, and store all stages against it.
$p = ResponseNormalize::normalizePipeline($pipeline);
// Create/update business process for this pipeline
$businessProcess = $this->config->businessProcesses()->updateOrCreate([
'crm_provider_id' => $p['id'],
], [
'team_id' => $this->team->id,
'name' => mb_strimwidth($p['label'], 0, 150),
'type' => BusinessProcess::TYPE_OPPORTUNITY,
'is_selectable' => $p['active'],
]);
// A record type is really a clone of the business process, used to store which record uses which pipeline.
// Create/update record type clone
$this->config->recordTypes()->updateOrCreate([
'crm_provider_id' => $p['id'],
], [
'team_id' => $this->team->id,
'name' => mb_strimwidth($p['label'], 0, 150),
'is_selectable' => $p['active'],
'business_process_id' => $businessProcess->id ?? null,
]);
// Stages - fetch all existing stages upfront to avoid N+1 queries
$existingStages = $this->config->stages()
->withTrashed()
->where('type', Stage::TYPE_OPPORTUNITY)
->get()
->keyBy('crm_provider_id');
foreach ($p['stages'] as $dealStage) {
$s = ResponseNormalize::normalizeDealStage($dealStage);
/** @var ?Stage $existingStage */
$existingStage = $existingStages->get($s['id']);
// Restore soft-deleted stages that are now active in HubSpot
if ($existingStage?->trashed() && $s['active']) {
$existingStage->restore();
}
// Upsert stage (updates soft-deleted records without restoring them)
$stage = $this->config->stages()->withTrashed()->updateOrCreate([
'crm_provider_id' => $s['id'],
], [
'team_id' => $this->team->id,
'name' => mb_strimwidth($s['label'], 0, 50),
'label' => mb_strimwidth($s['label'], 0, 191),
'type' => Stage::TYPE_OPPORTUNITY,
'sequence' => $s['displayOrder'],
'is_selectable' => $s['active'],
'probability' => $s['probability'] * 100,
]);
if ($missingStageName === $s['id']) {
$missingStage = $stage;
}
$stages[] = $stage->id;
}
$businessProcess->stages()->sync($stages);
}
return $missingStage;
}
/**
* @inheritdoc
*/
public function syncOrganization(): void
{
try {
$endpoint = '[URL_WITH_CREDENTIALS]
*/
public function find(string $name, array $scopes): array
{
$count = $this->limit ?? 20;
$offset = $this->offset ?? 0;
/** @var array<int, array<string, mixed>> */
return Cache::remember(
key: $this->team->getId() . $name . $count . $offset,
ttl: 300,
callback: function () use ($name, $offset, $count): array {
$data = [];
// Use the new V3 API to find contacts based on additional fields.
foreach (['companies', 'contacts'] as $objectType) {
$payload = $this->generateNameSearchPayload($name, $offset, $count);
$type = $objectType === 'companies' ? 'account' : 'contact';
try {
$response = $this->client->search($objectType, $payload);
// Build mapped list.
foreach ($response['results'] as $object) {
$properties = $object['properties'];
$objectName = $this->buildContactName($properties);
$record = [
'crmId' => $object['id'],
// Pass crmUrl to the FE, needed for success message in the extension when you log activity.
'crmUrl' => $this->generateProviderUrl($object['id'], $type),
'name' => $objectName,
'prospectType' => $type,
'phoneNumbers' => [],
];
if ($type === 'account') {
$record['industry'] = $properties['industry'] ?? null;
} else {
$record['title'] = $properties['jobtitle'] ?? null;
$record['organization'] = $properties['company'] ?? null;
}
$countryCode = $this->buildContactCountry($properties);
$parsedNumber = $this->buildContactPhone($countryCode, $properties);
// Add phone number to record.
if (! empty($parsedNumber['phone'])) {
$record['phoneNumbers'][] = [
'number' => $parsedNumber['phone'],
'nationalFormat' => phone_national($countryCode, $parsedNumber['phone']),
'type' => 'phone',
];
}
// Add mobile phone number to record.
if (! empty($properties['mobilephone'])) {
$mobileNumber = phone_e164($countryCode, $properties['mobilephone']);
if ($mobileNumber !== null) {
$record['phoneNumbers'][] = [
'number' => $mobileNumber,
'nationalFormat' => phone_national($countryCode, $mobileNumber),
'type' => 'mobile',
];
}
}
$data[] = $record;
}
} catch (BadRequest $e) {
$this->logger->warning('[' . $this->getDisplayName() . '] Search failed', [
'teamId' => $this->team->getUuid(),
'request' => $payload,
'reason' => $e->getMessage(),
]);
throw $e;
}
}
return $data;
},
);
}
/**
* @inheritdoc
*/
public function findOpportunities(?string $crmAccountId, ?string $crmContactId, ?int $userId = null): array
{
$data = [];
$ownerData = [];
$ownerId = null;
if ($crmAccountId === null) {
return $data;
}
if ($userId) {
$profileRepository = app(ProfileRepository::class);
$profile = $profileRepository->findProfileByUserId($this->config, $userId);
$ownerId = $profile instanceof Profile ? $profile->getCrmProviderId() : null;
}
$closedStages = $this->getClosedDealStages();
$payload = $this->payloadBuilder->generateOpportunitiesSearchPayload(
$this->config,
$crmAccountId,
$closedStages,
);
$results = $this->client->getPaginatedData($payload, 'deals');
foreach ($results['results'] as $object) {
$properties = $object['properties'];
$amount = null;
if (empty($properties['amount']) === false) {
$currency = $properties['deal_currency_code'] ?? $this->config->default_currency;
// Values can contain commas and any junk so strip them.
$value = (float) preg_replace('/[^\d.]/', '', $properties['amount']);
$amount = formatCurrency($value, $currency);
}
$businessProcess = $this->config
->businessProcesses()
->where('crm_provider_id', $properties['pipeline'])
->first();
if ($businessProcess === null) {
// Import it.
$stage = $this->importStages([Stage::TYPE_OPPORTUNITY], $properties['dealstage']);
$businessProcess = $this->config
->businessProcesses()
->where('crm_provider_id', $properties['pipeline'])
->first();
} else {
$stage = $businessProcess
->stages()
->where('crm_provider_id', $properties['dealstage'])
->where('type', Stage::TYPE_OPPORTUNITY)
->first();
if ($stage === null) {
// Import it.
$stage = $this->importStages(null, $properties['dealstage']);
}
}
$recordType = null;
if ($businessProcess) {
$recordType = $businessProcess->recordTypes()->first();
}
$isWon = in_array($properties['dealstage'], $closedStages['won']);
$isLost = in_array($properties['dealstage'], $closedStages['lost']);
$record = [
'crmId' => $object['id'],
'name' => $properties['dealname'] ?? 'Unknown Deal',
'value' => $amount,
'won' => $isWon,
'closed' => $isWon || $isLost,
'stage' => [
'id' => $stage?->getUuid() ?? '',
'name' => $stage?->getName() ?? '',
],
];
if ($recordType) {
$record += [
'recordType' => [
'id' => $recordType->id_string,
'name' => $recordType->name,
],
];
}
if ($ownerId && isset($properties['hubspot_owner_id']) && $properties['hubspot_owner_id'] === $ownerId) {
$ownerData[] = $record;
}
$data[] = $record;
}
if (! empty($ownerData)) {
return $ownerData;
}
return $data;
}
/**
* @inheritdoc
*/
public function getTasks(?string $objectType, string $objectId, ?string $opportunityId): array
{
$data = [];
switch ($objectType) {
case 'contact':
$hsObject = 'contact';
break;
case 'account':
$hsObject = 'company';
break;
default:
// This is a hack to prioritise and override a contact/company with a deal.
if ($opportunityId) {
$hsObject = 'deal';
$objectId = $opportunityId;
} else {
throw new InvalidArgumentException('Object type not supported.');
}
}
$engagementTypes = ['meetings', 'tasks'];
foreach ($engagementTypes as $engagementType) {
$payload = $this->payloadBuilder->getLinkToTaskPayload($hsObject, $objectId, $engagementType);
$this->logger->info('[HubSpot] CRM Search requested', [
'request' => $payload,
]);
$engagements = $this->client->getPaginatedData($payload, $engagementType);
foreach ($engagements['results'] as $engagement) {
if ($engagementType == 'meetings') {
$title = $engagement['properties']['hs_meeting_title'] ?? 'Scheduled meeting';
} elseif ($engagementType == 'tasks') {
$title = $engagement['properties']['hs_task_subject'];
} else {
$title = 'Scheduled meeting';
}
$data[] = [
'crmId' => $engagement['id'],
'subject' => $title,
'due' => $engagement['properties']['hs_timestamp'],
'type' => $engagement['properties']['hs_activity_type'] ?? null,
];
}
}
usort($data, function ($item1, $item2) {
return $item2['due'] <=> $item1['due'];
});
return $data;
}
/**
* Try to find CRM Objects using email address
*
* @return null|array{
* Lead|null,
* Account|null,
* Opportunity|null,
* Contact|null,
* Stage|null,
* string|null
* }
*/
public function matchExactlyByEmail(string $email, ?int $userId = null): ?array
{
$contactProperties = [
'email',
'firstname',
'lastname',
'country',
'phone',
'mobilephone',
'jobtitle',
'hubspot_owner_id',
'associatedcompanyid',
'photo',
];
$contact = null;
$account = null;
try {
$hsContact = $this->getClient()->getContactByEmail($email, $contactProperties);
if ($hsContact) {
$contact = $this->importContact($hsContact);
$account = $contact->account;
}
$data = $this->convertCrmData($contact, $account, $userId);
return ! empty(array_filter($data)) ? $data : null;
} catch (BadRequest $e) {
$this->logger->warning('[HubSpot] Search failed', [
'team_id' => $this->team->getId(),
'search_identifier' => $email,
'reason' => $e->getMessage(),
]);
}
return null;
}
public function getDomain(string $email): ?string
{
return $this->getDomainFromEmail($email);
}
/**
* Try to find CRM objects using domain name of the email address
*
* @return null|array{
* Lead|null,
* Account|null,
* Opportunity|null,
* Contact|null,
* Stage|null,
* string|null
* }
*/
public function matchByDomain(string $domain, ?int $userId = null): ?array
{
$companyName = $domain;
// Try to find a company matching their email domain.
$companyProperties = [
'country',
'phone',
'name',
'hs_avatar_filemanager_key',
'industry',
'hubspot_owner_id',
'domain',
];
try {
$hsAccounts = $this->client
->getInstance()
->companies()
->searchByDomain($companyName, $companyProperties);
} catch (Throwable $e) {
$this->logger->info('[HubSpot] Search failed', [
'error' => $e->getMessage(),
'domain' => $domain,
]);
return null;
}
$account = null;
// If there are multiple accounts, don't guess, we'll ask later.
if (\count($hsAccounts->data->results) === 1) {
// Persist this remote object.
$account = $this->syncAccount($hsAccounts->data->results[0]->companyId);
}
$data = $this->convertCrmData(null, $account, $userId);
return ! empty(array_filter($data)) ? $data : null;
}
/**
* @return array{
* Lead|null,
* Account|null,
* Opportunity|null,
* Contact|null,
* Stage|null,
* string|null
* }
*/
protected function convertCrmData(?Contact $contact, ?Account $account, ?int $userId = null): array
{
$countryCode = null;
if ($contact && $contact->country_code) {
$countryCode = $contact->country_code;
} elseif ($account && $account->country_code) {
$countryCode = $account->country_code;
}
try {
$hsOpportunities = $this->findOpportunities(
$account ? $account->crm_provider_id : null,
$contact ? $contact->crm_provider_id : null,
$userId
);
} catch (Exception $e) {
$hsOpportunities = [];
}
// If there are multiple opportunities, don't guess, we'll ask later.
$opportunity = null;
$stage = null;
if (! empty($hsOpportunities)) {
// Persist this remote object.
$opportunity = $this->syncOpportunity($hsOpportunities[0]['crmId']);
$stage = $opportunity?->getStage();
}
return [
null,
$account,
$opportunity,
$contact,
$stage,
$countryCode,
];
}
protected function getCacheKey(string $object, ?int $userId = null): ?string
{
$key = $this->team->getId() . $object;
$keySuffix = $this->getOwnerKeySuffix($userId);
return $key . $keySuffix;
}
private function getOwnerKeySuffix(?int $userId = null): string
{
return $userId === null ? '' : (string) $userId;
}
/**
* @return null|array{
* Lead|null,
* Account|null,
* Opportunity|null,
* Contact|null,
* Stage|null,
* string|null
*}
*/
public function matchByPhone(string $phone, ?string $rawPhoneNumber = null, ?int $userId = null): ?array
{
if (str_contains($phone, '**')) {
return null;
}
// trim all whitespaces if present so the lookup doesn't fail
$phone = str_replace(' ', '', $phone);
// Check if the user is internal.
if ($this->isPhoneNumberOfTeamMember($phone)) {
return null;
}
$response = $this->searchForPhoneNumber($phone);
if (empty($response)) {
return null;
}
// This would ideally importContact instead but the response type differs.
$contact = $this->findAndSyncContact($response['results'][0]['id']);
if (! $contact instanceof Contact) {
return null;
}
$account = $contact->account;
$countryCode = $contact->country_code ?? $account->country_code ?? null;
try {
$hsOpportunities = $this->findOpportunities(
$account?->crm_provider_id,
$contact->crm_provider_id,
$userId
);
} catch (Exception $e) {
$hsOpportunities = [];
}
$opportunity = null;
$stage = null;
try {
if (! empty($hsOpportunities)) {
// Persist this remote object.
$opportunity = $this->syncOpportunity($hsOpportunities[0]['crmId']);
$stage = $opportunity?->getStage();
}
} catch (Exception $e) {
$this->logger->debug('[HubSpot] Opportunity failed to sync.', [
'reason' => $e->getMessage(),
]);
}
return [
null,
$account,
$opportunity,
$contact,
$stage,
$countryCode,
];
}
private function isPhoneNumberOfTeamMember(string $phone): bool
{
$teamRepository = app(TeamRepository::class);
$user = $teamRepository->findTeamMemberByPhone($this->team, $phone);
if ($user instanceof User) {
return true;
}
return false;
}
private function findAndSyncContact(string $crmId): ?Contact
{
try {
return $this->syncContact($crmId);
} catch (Exception $exception) {
$this->logger->info('[HubSpot] Phone match failed', [
'reason' => $exception->getMessage(),
]);
return null;
}
}
private function hasResults(array $response): bool
{
return isset($response['total']) && is_numeric($response['total']) && $response['total'] > 0;
}
private function searchForPhoneNumber(string $phone): array
{
// Normalizes the provided phone number for the API search.
$normalizedPhone = $this->normalizePhoneNumber($phone);
$payload = $this->payloadBuilder->generatePhoneSearchPayload($normalizedPhone);
$this->logger->info('[HubSpot] Phone match search triggered', [
'phone' => $phone,
'normalizedPhone' => $normalizedPhone,
'payload' => $payload,
]);
$response = $this->handlePhoneSearchRequest($normalizedPhone, $payload);
if (! $this->hasResults($response)) {
$nationalPhone = preg_replace('/\D/', '', phone_national(null, $phone));
$payload = $this->payloadBuilder->generatePhoneSearchPayload($nationalPhone);
$this->logger->info('[HubSpot] Phone match national number search triggered', [
'phone' => $phone,
'nationalPhone' => $nationalPhone,
'payload' => $payload,
]);
$response = $this->handlePhoneSearchRequest($phone, $payload);
}
if (! $this->hasResults($response)) {
$payload = $this->payloadBuilder->generatePhoneSearchPayload($normalizedPhone, true);
$this->logger->info('[HubSpot] Phone match alternative search triggered', [
'phone' => $phone,
'normalizedPhone' => $normalizedPhone,
'payload' => $payload,
]);
$response = $this->handlePhoneSearchRequest($phone, $payload);
}
return $this->hasResults($response) ? $response : [];
}
private function handlePhoneSearchRequest(string $phone, array $payload): array
{
try {
return $this->client->search('contacts', $payload);
} catch (Exception $exception) {
$this->logger->info('[HubSpot] Phone match failed', [
'phone' => $phone,
'reason' => $exception->getMessage(),
]);
return [];
}
}
private function normalizePhoneNumber(string $phone): string
{
return ltrim(phone_e164(null, $phone), '+0');
}
/**
* @return null|array{
* Lead|null,
* Account|null,
* Opportunity|null,
* Contact|null,
* Stage|null,
* string|null
* }
*/
public function matchByName(string $name, ?int $userId = null): ?array
{
// Don't waste time searching for single character strings.
if (\strlen($name) <= 1) {
return null;
}
$cacheKey = $this->getCacheKey($name, $userId);
$result = Cache::remember($cacheKey, 60, function () use ($name, $userId) {
$payload = $this->payloadBuilder->generateSearchContactsByNamePayload(
$name,
$this->getContactFields()
);
$hsContacts = $this->client->getPaginatedData($payload, 'contact');
if (empty($hsContacts['results'])) {
return false;
}
$contact = $this->importContact($hsContacts['results'][0]);
if ($contact === null) {
return false;
}
$account = $contact->account;
$countryCode = $contact->country_code ?? $account->country_code ?? null;
try {
$hsOpportunities = $this->findOpportunities(
$account ? $account->crm_provider_id : null,
$contact->crm_provider_id,
$userId
);
} catch (Exception $e) {
$hsOpportunities = [];
}
$opportunity = null;
$stage = null;
if (! empty($hsOpportunities)) {
// Persist this remote object.
$opportunity = $this->syncOpportunity($hsOpportunities[0]['crmId']);
$stage = $opportunity?->getStage();
}
return [
null,
$account,
$opportunity,
$contact,
$stage,
$countryCode,
];
});
return is_array($result) ? $result : null;
}
private function convertActivityAssociations(Activity $activity): array
{
return [
'contactIds' => $this->getParticipantsIds($activity),
'companyIds' => $activity->hasAccount() ? [$activity->account->crm_provider_id] : [],
'dealIds' => $activity->hasOpportunity() ? [$activity->opportunity->crm_provider_id] : [],
'ownerIds' => [],
];
}
private function getParticipantsIds(Activity $activity): array
{
$attendees = [];
$participantRepository = app(ParticipantRepository::class);
$participants = $participantRepository->getParticipantsWhoEnteredMeeting($activity);
foreach ($participants as $participant) {
if ($participant->user_id || $participant->isCoach()) {
continue;
}
$contact = $participant->contact()->first();
if ($contact && $contact->crm_provider_id) {
$attendees[] = $contact->crm_provider_id;
} else {
if (! empty($participant->name)) {
$attendeeData = $this->fetchMissingAttendeeInfo($participant);
}
if (! empty($attendeeData['id'])) {
$attendees[] = $attendeeData['id'];
}
}
}
if ($activity->hasContact()) {
$attendees[] = $activity->contact->crm_provider_id;
}
return array_unique($attendees);
}
private function fetchMissingAttendeeInfo(Participant $participant): array
{
// Check if we need to look inside an account context.
$activity = $participant->getActivity();
$companyId = $activity->hasAccount() ? $activity->getAccount()->crm_provider_id : null;
// First check the local data.
/** @var Contact[] $contacts */
$contacts = $this->team->contacts()
->with('account')
->where('name', $participant->name)
->whereNotNull('email')
->get();
foreach ($contacts as $contact) {
// If we have a company in scope, check the contact is associated to it.
if (
$companyId !== null
&& ($contact->account_id === null || $companyId !== $contact->account->crm_provider_id)
) {
continue;
}
return [
'id' => $contact->crm_provider_id,
'email' => $contact->email,
];
}
$payload = $this->generateNameSearchPayload($participant->name, 0, 20);
try {
$response = $this->client->getNewInstance()->crm()->contacts()->searchApi()->doSearch($payload);
// TODO add some logic to choose the most suitable contact if multiple
foreach ($response['results'] as $object) {
$properties = $object['properties'];
if (empty($object['properties']) === false) {
// Check the company matches the contact.
// Todo: Move this check inside the API search.
if ($companyId !== null && $companyId !== $properties['associatedcompanyid']) {
continue;
}
return [
'id' => $object['id'],
'email' => $properties['email'],
];
}
}
} catch (Exception $e) {
$this->logger->warning('[' . $this->getDisplayName() . '] Search failed', [
'teamId' => $this->team->id_string,
'request' => $payload,
'reason' => $e->getMessage(),
]);
}
return [];
}
/**
* Store transcripts as note engagement.
*
* @throws Exception
*/
public function createTranscriptNotes(Activity $activity): void
{
// For HS no need to check if Crm profile - Log Notes field is enabled
// We only check if store_transcript toggle is enabled on crm profile.
$engagement = [
'active' => true,
'ownerId' => $this->profile->crm_provider_id,
'timestamp' => $activity->created_at->tz($activity->user->timezone)->getTimestamp() * 1000,
'type' => 'NOTE',
];
// Generate activity transcription.
$transcriptionData = $this->generateTranscription($activity);
// Truncate Notes with max notes length because transcription text could be very long.
$transcripts = mb_strimwidth($transcriptionData, 0, static::ENGAGEMENT_BODY_MAX_LENGTH);
$metadata = [
'body' => $transcripts,
];
$associations = $this->convertActivityAssociations($activity);
try {
$hsEngagement = $this->client
->getInstance()
->engagements()
->create($engagement, $associations, $metadata);
$this->logCrmEngagementManipulation(self::ACTION_CREATE, $engagement, $metadata, $associations);
$noteId = $hsEngagement->data->engagement->id;
// Store crm logged id in transcription.
$transcription = $activity->getTranscription();
$transcription->crm_activity_id = $noteId;
$transcription->save();
} catch (Exception $e) {
Sentry::captureException($e);
}
}
/*
* @inheritdoc
*/
public function updateRecord(string $objectType, string $objectId, array $data, array $headers = []): void
{
$payload = [
'properties' => $data,
];
try {
switch ($objectType) {
case FieldData::OBJECT_OPPORTUNITY:
$this->client->getNewInstance()->crm()->deals()->basicApi()->update($objectId, $payload);
break;
case FieldData::OBJECT_CONTACT:
$this->client->getNewInstance()->crm()->contacts()->basicApi()->update($objectId, $payload);
break;
case FieldData::OBJECT_ACCOUNT:
$this->client->getNewInstance()->crm()->companies()->basicApi()->update($objectId, $payload);
break;
case FieldData::OBJECT_TASK:
// Endpoint for Engagements not ready
$engagements = [
'type' => 'TASK',
];
$metadata = $data;
...
|
PhpStorm
|
faVsco.js – Hubspot/Service.php
|
NULL
|
10164
|
|
10163
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
19
Previous Highlighted Error
Next Highlighted Error
[2026-05-07 14:21:15] local.INFO: [Hubspot] DEBUG Getting headers {
"headers":{
"Date":["Thu,07 May 2026 14:21:15 GMT"],
"Content-Type":["application/json;charset=utf-8"],
"Transfer-Encoding":["chunked"],
"Connection":["keep-alive"],
"CF-Ray":["9f80deb8db60dc3a-SOF"],
"CF-Cache-Status":["DYNAMIC"],
"Strict-Transport-Security":["max-age=31536000; includeSubDomains; preload"],
"Vary":["origin,
accept-encoding"],
"access-control-allow-credentials":["false"],
"server-timing":["hcid;desc=\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\",
cfr;desc=\"9f80deb8e7c6dc3a-IAD\""],
"x-content-type-options":["nosniff"],
"x-hubspot-correlation-id":["019e02d0-6fd8-7812-bdba-885b7ccb3ee3"],
"Set-Cookie":["__cf_bm=SIUrtdQgXVrik50pdqF6hZVYKhzTnQBidvMabeCtm0Y-1778163675-[IP_ADDRESS]-rI.ZggtDKxTge5zr8_2gbBfWMQQ.ufZEXDZyHz2mBUFdzdo2gTHEsOkXMSEShjK0hGYxNhUGM1ZoBpX7BcFZcHEjA7Cs_.SMUhUnd2nYjko; path=/; expires=Thu,
07-May-26 14:51:15 GMT; domain=.hubapi.com; HttpOnly; Secure; SameSite=None"],
"Report-To":["{
\"endpoints\":[{
\"url\":\"https:\\/\\/a.nel.cloudflare.com\\/report\\/v4?s=NYAlsVTP0fYm32qrSDjxYE4sd2RWRqiSp3wHsmdEgZlzoYdxI%2BIxVpHmsKn3O%2BKVA3mFIJ2m7YRECDGSM%2BW2IYTzo6FM4%2BdUIjURO8srzKSvJgZ%2BQ6R79arKQw3uHLlX\"}],
\"group\":\"cf-nel\",
\"max_age\":604800}"],
"NEL":["{
\"success_fraction\":0.01,
\"report_to\":\"cf-nel\",
\"max_age\":604800}"],
"Server":["cloudflare"]}} {
"correlation_id":"95236535-ec98-4541-b92a-adfa73b69eab",
"trace_id":"c7ab8365-903f-46d4-9403-0e5b551e3545"}
Show Replace Field
Search History
doSearch
New Line
Match Case
Words
Regex
Replace History...
|
PhpStorm
|
faVsco.js – Hubspot/Service.php
|
NULL
|
10163
|
|
10162
|
Switch workspaces… (Jiminny Inc) Has new messages
Switch workspaces… (Jiminny Inc) Has new messages
Home
Home
DMs
DMs
Activity
Activity
Files
Files
Later
Later
More…
More
Unreads
Threads
Huddles
Drafts & sent
1
Directories
jiminny-x-integration-app
platform-inner-team
ai-chapter
alerts
backend
bugs
confusion-clinic
curiosity_lab
engineering
general
jiminny-bg
platform-tickets
product_launches
random
releases
sofia-office
support
thank-yous
the_people_of_jiminny
Vasil Vasilev
Nikolay Ivanov
Galya Dimitrova
Aneliya Angelova
,
Nikolay Yankov
,
Steliyan Georgiev
Stoyan Tanev
Stefka Stoyanova
Ves
Aneliya Angelova
James Graham
Lukas Kovalik
you
Toast
Jira Cloud
Messages
Messages
Add canvas
Add canvas
Files
Files
Pins
Pins
Add and Edit Channel Tabs
Canvas
List
Folder
Jump to date
Vasil Vasilev
Today at 2:52:43 PM
2:52 PM
Лукаш, привет
Today at 2:52:48 PM
2:52
хвърли моля те едно око тука
Today at 2:52:49 PM
2:52
https://github.com/jiminny/app/pull/12059
https://github.com/jiminny/app/pull/12059
Today at 2:53:03 PM
2:53
опитвам се да оптимизирам процеса по индексиране на активитита за ЕС
Today at 2:54:16 PM
2:54
идеята е да намаля паметта която се ползва за да се генерира един бач от 100 активитита
Today at 2:54:35 PM
2:54
и после да увелича размера на бачовете, за да имаме по малко blocking операции в ЕС, като реиндексира
Lukas Kovalik
Today at 4:12:58 PM
4:12 PM
здрасти, изглежда ок, но когато го минах и през gemini ми даде един warning.
Today at 4:13:17 PM
4:13
Switch
cursor()
to
lazyById(250)
. It preserves the single-loop, generator-style code in the new version while restoring proper batched eager loading (avoiding N+1 on
getIndexableAttributes()
) and releasing the DB connection between chunks (avoiding long-held PDO connections during ES/Sentry calls).
Vasil Vasilev
Today at 4:40:06 PM
4:40 PM
хм, интересна идея
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:41:03 PM
4:41
ще го проверя
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:41:17 PM
4:41
така или иначе в понеделник ще иде на прод, днес не ми се рискува
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Vasil Vasilev
Today at 6:05:10 PM
6:05 PM
мм, прав си
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 6:05:26 PM
6:05
задълбах по на дълбоко, и се оказва, че cursor ще произведе друг проблем
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 6:05:35 PM
6:05
cursor не зарежда допълннителните таблици
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 6:06:07 PM
6:06
ще стриймне моделите, но за всеки ще вика поотделно with(opportunities, leads, accounts….) и всичко останало
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 6:06:16 PM
6:06
което обезмисля цялата гимнастика
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 6:06:21 PM
6:06
ще го ревизирам с lazy loading
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 6:06:43 PM
6:06
на по малки бачове, за да спестя памет от моделите, просто ще взема данните на няколко пъти
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
loading…
PhostorimcodeFV faVsco.js?9 JY-20725-handle-HS-search-rate-limiProledey(© RemoteCrmobjectmanif © HubspotSyncStrategybase.png€ ResponseNormalize.pheCachedcrmservicebecorator.onpsyncrielaAction.ong© SyncRelatedActivityMar© MatchActivityCrmData.php© CrmActivityService.phgc) MatchermDatc wednooksynebalchrrov O IntegrationAppdosearchx 5 Cc WTIY:>D Accessors>© Api• contiaO DTOW) FiltersM.lobsclass service excenas baseservice znpcemencs903904 CpubLic tunccion matchbybomaln Scring saomain, tinc suseria = nulu: tarrayProspectSearchStrateg)ServiceTraitsC) DataClient.oho© DecorateActivity.php© LocalSearch.phpelocalSearchinterface.of© RemoteSearch.php(C) Service.phpv Ml isteners913© ConvertLeadActivities.p© PurgeLookupCache.php> D MetadataD Migration[ Pipedrive915917>C Fields0 OpportunityMatcher> @ OpportunitySyncStrated921›_ Prospectsearchstrateay>W ServiceTraits925(c) Client.phpc) [EMAIL]) FieldDefinitions.onvC) PavloadBuilder.ohv929930(C) Profile, ohoC) @uervBuilder.ohoC) @uerv.andler.ohoC) @uerviterator nhol9331934(C) @uervRecults.nhn© Service.php(C) SvncRatchRedicServicescompanyname = soomarn'Try to find a company matchina their emall domain.ScompanyProperties = ['hs avatar filemanader key!.try 1ShsAccounts = Sthis->clientl->getInstance->comnaniesol->ceanchRvlomain(ScomnanvName ScomnanvPronenties)•} catch (Throwable $e) {Sthis->logger->info('[HubSpot] Search failed', ['error' => $e->getMessage()D):return nulbSaccount = null:I/ If there are multiple accounts. don'+ quess.we'll ask laterif count(ShsAccounts->data->results) zz= 10 <Persist this remote obiect.Saccount = Sthis->svncAccountShsAccounts->data->results101->comoanv1d0•M Traite© BaseClient.php© BaseService.php(C CachodGrm CorvicaDacoratSdata = Sthis->conventcrmlatald contact: nuil Saccount Susentd)•© CountryCodeResolver.php4) CrmActivitvProviderintegraneturn I emntvlannav filten(Sdata)) ? Sdata • null-rilo May 20:00.33© ProspectCache.phpB7B48 MMSSATATl HI=custom.log ^A SF (jiminny@localhost]4 HS_local (jiminny@localhost]# console [PKou.# console leu)# console [slAGiNg)[2026-05-07 14:21:15] local.INF0: [Hubspot] DEBUG Getting headers {"neaders".?"Uace":L"Inu,or May 2020 14.21.15 6Ml"Jn"Transter-Encod1nq":"chunked")."Connection":"keep-alive""CF-Ray" : ["9f80deb8db60dc3a-SOF"],"Strict-Transport-Secur1ty":"max-aqe=31536008* 1ncLudeSubDomains: preload")nacceot-encodino""server-timing": ["hcid;desc=\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\","x-hubspot-correlation-id":["019e02d0-6fd8-7812-bdba-885b7ccb3ee3"],"So+-Cookie"." c+hm-Stlirtd0aXVr.kSandas6hzVVKhzTn0BidvMaheCtmoV-1778163675-1.0.107-May-26 14:51:15 GMT; domain=.hubapi.com; Http0nly; Secure; SameSite=None"],"Renont-To".f"*"endpoints\":[{"unl".httns:la.nel.cloudflane.com./nenon+W/v42c=NVA1cVTPQfVm32anS0#xVF/sd2RN\"group\":\"cf-nel\","max_age\":604800}"]|"NEL": ["1success_traccion.0.01rreportto. "cr-nel,"max age":604800}"]"Server": ["cloudflare"]}} {"correlation_1d":"95256555-ec78-4541-b9za-adta/Sb6Yeab"."trace_10":C/AD8565-905t-4604-9405-0e5b551e5545CascadeHubspot Rate LimitindAskJiminnyReportActivityServiceTest -Hubspot Rate Limit ReInvestigating Rate LinNew CascadeHubspot CRM Call Re- 11I1Actions/SyncArchivedProfilesAction.phpCallVia executeRequest()?Rate Limitapp/Services/Activity/HubSpot/Service.phpThis service uses Sthis=›crmService (the CRM Service.oho))- it makes no direct HubSpot APl calls itselt. All calls delegate through crmservice-›aetcal10, crmService->searchCallsForPeriod(), crmService->syncOpportunity(), crmService->parseRecords() .Critical Findings1. Line 1313 - raw searchApi→>doSearch - matchExactlyByParticipantinService.pno:#Service.oho:1313)Sresponse = sthis->cuient->aetNewinstance->crmo->contactso-searchAoi->doSearchSoavload):• Goes completely around the Client wrapper - no 429 handling, no RateLimitException, no rate limit awareness•Uses the search rate limit bucket• Can be replaced with $this->client-›search('contacts', $payload) - same endpoint, same result, adds 429 protection,tine 020.022-comnandoctl.sconrchRuhorninfl_matchRuDomain/).• Service.php:920-923ShsAccounts = $this->client->getInstance()->companies()->searchByDomain(ScompanyName, ScompanyProperties):• Uses v1 SDK's searchByDomain which calls a search endpoint — hits the search rate limit bucket• No 429 protection• Cannot be trivially replaced with client-›search() (different endpoint/format), but could be wrapped in executeRequest ()2.detdnnortunitvRvldhac executeReauestcommented out.• Client.php:238-239$deal = Sthis->executeRequest(fn () => $this->getNewInstance()->crm()->deals()->basicApi()->getById(• Deliberatelv disabled _ this means sinale deal fetches in HubsootSingleSvncStrateav also aet no 429 protection.Ask anvthina (&4L)Tnl "896-20UITE.Río 4 spaces...
|
Slack
|
Vasil Vasilev (DM) - Jiminny Inc - 3 new items - S Vasil Vasilev (DM) - Jiminny Inc - 3 new items - Slack...
|
NULL
|
10162
|
|
10161
|
Switch workspaces… (Jiminny Inc) Has new messages
Switch workspaces… (Jiminny Inc) Has new messages
Home
Home
DMs
DMs
Activity
Activity
Files
Files
Later
Later
More…
More
Unreads
Threads
Huddles
Drafts & sent
1
Directories
jiminny-x-integration-app
platform-inner-team
ai-chapter
alerts
backend
bugs
confusion-clinic
curiosity_lab
engineering
general
jiminny-bg
platform-tickets
product_launches
random
releases
sofia-office
support
thank-yous
the_people_of_jiminny
Vasil Vasilev
Nikolay Ivanov
Galya Dimitrova
Aneliya Angelova
,
Nikolay Yankov
,
Steliyan Georgiev
Stoyan Tanev
Stefka Stoyanova
Ves
Aneliya Angelova
James Graham
Lukas Kovalik
you
Toast
Jira Cloud
Messages
Messages
Add canvas
Add canvas
Files
Files
Pins
Pins
Add and Edit Channel Tabs
Canvas
List
Folder
Jump to date
Vasil Vasilev
Today at 2:52:43 PM
2:52 PM
Лукаш, привет
Today at 2:52:48 PM
2:52
хвърли моля те едно око тука
Today at 2:52:49 PM
2:52
https://github.com/jiminny/app/pull/12059
https://github.com/jiminny/app/pull/12059
Today at 2:53:03 PM
2:53
опитвам се да оптимизирам процеса по индексиране на активитита за ЕС
Today at 2:54:16 PM
2:54
идеята е да намаля паметта която се ползва за да се генерира един бач от 100 активитита
Today at 2:54:35 PM
2:54
и после да увелича размера на бачовете, за да имаме по малко blocking операции в ЕС, като реиндексира
Lukas Kovalik
Today at 4:12:58 PM
4:12 PM
здрасти, изглежда ок, но когато го минах и през gemini ми даде един warning.
Today at 4:13:17 PM
4:13
Switch
cursor()
to
lazyById(250)
. It preserves the single-loop, generator-style code in the new version while restoring proper batched eager loading (avoiding N+1 on
getIndexableAttributes()
) and releasing the DB connection between chunks (avoiding long-held PDO connections during ES/Sentry calls).
Vasil Vasilev
Today at 4:40:06 PM
4:40 PM
хм, интересна идея
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:41:03 PM
4:41
ще го проверя
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:41:17 PM
4:41
така или иначе в понеделник ще иде на прод, днес не ми се рискува
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Vasil Vasilev
Today at 6:05:10 PM
6:05 PM
мм, прав си
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 6:05:26 PM
6:05
задълбах по на дълбоко, и се оказва, че cursor ще произведе друг проблем
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 6:05:35 PM
6:05
cursor не зарежда допълннителните таблици
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 6:06:07 PM
6:06
ще стриймне моделите, но за всеки ще вика поотделно with(opportunities, leads, accounts….) и всичко останало
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 6:06:16 PM
6:06
което обезмисля цялата гимнастика
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 6:06:21 PM
6:06
ще го ревизирам с lazy loading
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 6:06:43 PM
6:06
на по малки бачове, за да спестя памет от моделите, просто ще взема данните на няколко пъти
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
loading…
SlackFileEditViewGoHistoryWindowHelpLukás Koválik's No...ProGPHubspot API calls+n Home1000TestDailyAgents+ New agentWorkspace* Quick NoteWorkJira ticketView of SprintDailyPlanSprintStefka 1-1TododevEvaluationKnowledgera IdeasPrivateE Home viewsIntegration-appWork KnowledgeWork Knowledgetesting keyboard4Todo2 New chat x03 Hubspot / Hubspot API callsCritical Findings1. Line 1313 - rawsearchApi()->doSearch()- matchExSresponse = Sthis->client->getNewInstance()->crm(• Goes completely around the Client wrapper - no 429• Uses the search rate limit bucket• Can be replaced with $this->client->search('contacts"2. Line 920-923 — companies()->searchByDomain() - m$hsAccounts = $this->client->getInstance()->compai• Uses v1 SDK's searchByDomainwhich calls a search e• No 429 protection• Cannot be trivially replaced with client->search() (diffePress 'space' for Al or 'l' for commands40QHomeDMsActivityFilesLater...MoreED→Jiminny... v# conrusion-cHnic# curiosity_lab# engineering# general# jiminny-bg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi...• Direct messagesSo Vasil VasilevNikolay IvanovGalya DimitrovaAneliya Angelova, ...2 Stoyan Tanev €ã. Stefka StoyanovaC. Ves. Aneliya Angelovado James GrahamLukas Kovalik y... O#:: AppsToastJira Cloudlabl100% <•Fri 8 May 20:06:31Describe what you are looking forVasil Vasilev• MessagesAdd canvasO Files< Pins+carsoro to Lazyoysa(couyele prescivesthe single-loop, gToday~-yle code in the newversion while restoring proper batched eagerloading (avoiding N+1 ongetIndexableAttributes ) and releasing the DBconnection between chunks (avoiding long-heldPDO connections during ES/Sentry calls).Vasil Vasilev 4:40 PMхм, интересна идеяще го проверятака или иначе в понеделник ще иде на прод.днес не ми се рискуваVasil Vasilev 6:05 PMмм, прав сизадълбах по на дълбоко, и се оказва, че cursorще произведе друг проблемcursor не зарежда допьлннителните таблицище стриймне моделите, но за всеки ще викапоотделно with(opportunities, leads, accounts....) ивсичко останалокоето обезмисля цялата гимнастикаще го ревизирам с lazy loadingна по малки бачове, за да спестя памет отмоделите, просто ще взема данните на няколкопЪтиMessage Vasil Vasilev+...
|
Slack
|
Vasil Vasilev (DM) - Jiminny Inc - 3 new items - S Vasil Vasilev (DM) - Jiminny Inc - 3 new items - Slack...
|
NULL
|
10161
|
|
10160
|
Switch workspaces… (Jiminny Inc) Has new messages
Switch workspaces… (Jiminny Inc) Has new messages
Home
Home
DMs
DMs
Activity
Activity
Files
Files
Later
Later
More…
More
Unreads
Threads
Huddles
Drafts & sent
1
Directories
jiminny-x-integration-app
platform-inner-team
ai-chapter
alerts
backend
bugs
confusion-clinic
curiosity_lab
engineering
general
jiminny-bg
platform-tickets
product_launches
random
releases
sofia-office
support
thank-yous
the_people_of_jiminny
Vasil Vasilev
Nikolay Ivanov
Galya Dimitrova
Aneliya Angelova
,
Nikolay Yankov
,
Steliyan Georgiev
Stoyan Tanev
Stefka Stoyanova
Ves
Aneliya Angelova
James Graham
Lukas Kovalik
you
Toast
Jira Cloud
Messages
Messages
Add canvas
Add canvas
Files
Files
Pins
Pins
Add and Edit Channel Tabs
Canvas
List
Folder
Jump to date
Vasil Vasilev
Today at 2:52:43 PM
2:52 PM
Лукаш, привет
Today at 2:52:48 PM
2:52
хвърли моля те едно око тука
Today at 2:52:49 PM
2:52
https://github.com/jiminny/app/pull/12059
https://github.com/jiminny/app/pull/12059
Today at 2:53:03 PM
2:53
опитвам се да оптимизирам процеса по индексиране на активитита за ЕС
Today at 2:54:16 PM
2:54
идеята е да намаля паметта която се ползва за да се генерира един бач от 100 активитита
Today at 2:54:35 PM
2:54
и после да увелича размера на бачовете, за да имаме по малко blocking операции в ЕС, като реиндексира
Lukas Kovalik
Today at 4:12:58 PM
4:12 PM
здрасти, изглежда ок, но когато го минах и през gemini ми даде един warning.
Today at 4:13:17 PM
4:13
Switch
cursor()
to
lazyById(250)
. It preserves the single-loop, generator-style code in the new version while restoring proper batched eager loading (avoiding N+1 on
getIndexableAttributes()
) and releasing the DB connection between chunks (avoiding long-held PDO connections during ES/Sentry calls).
Vasil Vasilev
Today at 4:40:06 PM
4:40 PM
хм, интересна идея
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:41:03 PM
4:41
ще го проверя
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:41:17 PM
4:41
така или иначе в понеделник ще иде на прод, днес не ми се рискува
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Vasil Vasilev
Today at 6:05:10 PM
6:05 PM
мм, прав си
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 6:05:26 PM
6:05
задълбах по на дълбоко, и се оказва, че cursor ще произведе друг проблем
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 6:05:35 PM
6:05
cursor не зарежда допълннителните таблици
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 6:06:07 PM
6:06
ще стриймне моделите, но за всеки ще вика поотделно with(opportunities, leads, accounts….) и всичко останало
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 6:06:16 PM
6:06
което обезмисля цялата гимнастика
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 6:06:21 PM
6:06
ще го ревизирам с lazy loading
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 6:06:43 PM
6:06
на по малки бачове, за да спестя памет от моделите, просто ще взема данните на няколко пъти
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
PhostorimcodeFV faVsco.js?9 JY-20725-handle-HS-search-rate-limiProledey(© RemoteCrmobjectmanif © HubspotSyncStrategybase.png€ ResponseNormalize.pheCachedcrmservicebecorator.onp© syncrielaAction.ong© SyncRelatedActivityMar© MatchActivityCrmData.php© CrmActivityService.phgc) MatchermDatc wednooksynebalchrrov O IntegrationAppdosearchx 5 Cc WTIY:>D Accessors>© Api• contiaO DTOW) FiltersM.lobsclass service excenas baseservice znpcemencs903904 CpubLic tunccion matchbybomaln Scring saomain, tinc suseria = nulu: tarrayProspectSearchStrateg)ServiceTraitsC) DataClient.oho© DecorateActivity.php© LocalSearch.php© LocalSearchinterface.pt© RemoteSearch.php(C) Service.phpv Ml isteners913© ConvertLeadActivities.p© PurgeLookupCache.php> D MetadataD Migration[ Pipedrive915917>C FieldsC OpportunityMatcher> @ OpportunitySyncStrated921›_ Prospectsearchstrateay>W ServiceTraits925(c) Client.phpc) [EMAIL]) FieldDefinitions.onvC) PavloadBuilder.ohv929930(C) Profile, ohoC) @uervBuilder.ohoC) @uerv.andler.ohoC) @uerviterator nhol9331934(C) @uervRecults.nhn© Service.php(C) SvncRatchRedicServicescompanyname = soomarn'Try to find a company matchina their emall domain.ScompanyProperties = ['hs avatar filemanader key!.try 1ShsAccounts = Sthis->clientl->getInstance->comnaniesol->ceanchRvlomain(ScomnanvName ScomnanvPronenties)•} catch (Throwable $e) {Sthis->logger->info('[HubSpot] Search failed', ['error' => $e->getMessage()D):return nulbSaccount = null:I/ If there are multiple accounts. don'+ quess.we'll ask laterif count(ShsAccounts->data->results) zz= 10 <Persist this remote obiect.Saccount = Sthis->svncAccountShsAccounts->data->results101->comoanv1d0•M Traite© BaseClient.php© BaseService.php(C CachodGrm CorvicaDacoratSdata = Sthis->conventcrmlatald contact: nuil Saccount Susentd)•© CountryCodeResolver.php4) CrmActivitvProviderintegraneturn I emntvlannav filten(Sdata)) ? Sdata • null-rilo May 20:00.0© ProspectCache.phpB7B48 MMSSATATl HI=custom.log ^4 SF (jiminny@localhost]4 HS_local [jiminny@localhost]# console [PKou.# console leu)# console [slAGiNg)[2026-05-07 14:21:15] local.INF0: [Hubspot] DEBUG Getting headers {"neaders".?"Uace":L"Inu,or May 2020 14.21.15 6Ml"Jn"Transter-Encod1nq":"chunked")."Connection":"keep-alive""CF-Ray" : ["9f80deb8db60dc3a-SOF"],"Strict-Transport-Secur1ty":"max-aqe=31536008* 1ncLudeSubDomains: preload")nacceot-encodino""server-timing": ["hcid;desc=\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\","x-hubspot-correlation-id":["019e02d0-6fd8-7812-bdba-885b7ccb3ee3"],"So+-Cookie"." c+hm-Stlirtd0aXVr.kSandas6hzVVKhzTn0BidvMaheCtmoV-1778163675-1.0.107-May-26 14:51:15 GMT; domain=.hubapi.com; Http0nly; Secure; SameSite=None"],"Renont-To".f"*"endpoints\":[{"unl".httns:la.nel.cloudflane.com./nenon+W/v42c=NVA1cVTPQfVm32anS0#xVF/sd2RN\"group\":\"cf-nel\","max_age\":604800}"]|"NEL": ["1success_traccion.0.01rreportto. "cr-nel,"max age":604800}"]"Server": ["cloudflare"]}} {"correlation_1d":"95256555-ec78-4541-b9za-adta/Sb6Yeab"."trace_10":C/AD8565-905t-4604-9405-0e5b551e5545CascadeHubspot Rate LimitindAskJiminnyReportActivityServiceTest -Hubspot Rate Limit ReInvestigating Rate LinNew CascadeHubspot CRM Call Re- 11I1Actions/SyncArchivedProfilesAction.phpCallVia executeRequest()?Rate Limitapp/Services/Activity/HubSpot/Service.phpThis service uses Sthis=›crmService (the CRM Service.oho))- it makes no direct HubSpot APl calls itselt. All calls delegate through crmservice-›aetcal10, crmService->searchCallsForPeriod(), crmService->syncOpportunity(), crmService->parseRecords() .Critical Findings1. Line 1313 - raw searchApi→>doSearch - matchExactlyByParticipantinService.pno:#Service.oho:1313)Sresponse = sthis->cuient->aetNewinstance->crmo->contactso-searchAoi->doSearchSoavload):• Goes completely around the Client wrapper - no 429 handling, no RateLimitException, no rate limit awareness•Uses the search rate limit bucket• Can be replaced with $this->client-›search('contacts', $payload) - same endpoint, same result, adds 429 protection,tine 020.022-comnandoctl.sconrchRuhorninfl_matchRuDomain/).• Service.php:920-923ShsAccounts = $this->client->getInstance()->companies()->searchByDomain(ScompanyName, ScompanyProperties):• Uses v1 SDK's searchByDomain which calls a search endpoint — hits the search rate limit bucket• No 429 protection• Cannot be trivially replaced with client-›search() (different endpoint/format), but could be wrapped in executeRequest ()2.detdnnortunitvRvldhac executeReauestcommented out.• Client.php:238-239$deal = Sthis->executeRequest(fn () => $this->getNewInstance()->crm()->deals()->basicApi()->getById(• Deliberatelv disabled _ this means sinale deal fetches in HubsootSingleSvncStrateav also aet no 429 protection.Ask anvthina (&4L)Tnl "896-20UITE.Río 4 spaces...
|
Slack
|
Vasil Vasilev (DM) - Jiminny Inc - 3 new items - S Vasil Vasilev (DM) - Jiminny Inc - 3 new items - Slack...
|
NULL
|
10160
|
|
10159
|
Switch workspaces… (Jiminny Inc) Has new messages
Switch workspaces… (Jiminny Inc) Has new messages
Home
Home
DMs
DMs
Activity
Activity
Files
Files
Later
Later
More…
More
Unreads
Threads
Huddles
Drafts & sent
1
Directories
jiminny-x-integration-app
platform-inner-team
ai-chapter
alerts
backend
bugs
confusion-clinic
curiosity_lab
engineering
general
jiminny-bg
platform-tickets
product_launches
random
releases
sofia-office
support
thank-yous
the_people_of_jiminny
Vasil Vasilev
Nikolay Ivanov
Galya Dimitrova
Aneliya Angelova
,
Nikolay Yankov
,
Steliyan Georgiev
Stoyan Tanev
Stefka Stoyanova
Ves
Aneliya Angelova
James Graham
Lukas Kovalik
you
Toast
Jira Cloud
Messages
Messages
Add canvas
Add canvas
Files
Files
Pins
Pins
Add and Edit Channel Tabs
Canvas
List
Folder
Jump to date
Vasil Vasilev
Today at 2:52:43 PM
2:52 PM
Лукаш, привет
Today at 2:52:48 PM
2:52
хвърли моля те едно око тука
Today at 2:52:49 PM
2:52
https://github.com/jiminny/app/pull/12059
https://github.com/jiminny/app/pull/12059
Today at 2:53:03 PM
2:53
опитвам се да оптимизирам процеса по индексиране на активитита за ЕС
Today at 2:54:16 PM
2:54
идеята е да намаля паметта която се ползва за да се генерира един бач от 100 активитита
Today at 2:54:35 PM
2:54
и после да увелича размера на бачовете, за да имаме по малко blocking операции в ЕС, като реиндексира
Lukas Kovalik
Today at 4:12:58 PM
4:12 PM
здрасти, изглежда ок, но когато го минах и през gemini ми даде един warning.
Today at 4:13:17 PM
4:13
Switch
cursor()
to
lazyById(250)
. It preserves the single-loop, generator-style code in the new version while restoring proper batched eager loading (avoiding N+1 on
getIndexableAttributes()
) and releasing the DB connection between chunks (avoiding long-held PDO connections during ES/Sentry calls).
Vasil Vasilev
Today at 4:40:06 PM
4:40 PM
хм, интересна идея
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:41:03 PM
4:41
ще го проверя
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:41:17 PM
4:41
така или иначе в понеделник ще иде на прод, днес не ми се рискува
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Vasil Vasilev
Today at 6:05:10 PM
6:05 PM
мм, прав си
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 6:05:26 PM
6:05
задълбах по на дълбоко, и се оказва, че cursor ще произведе друг проблем
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
SlackFileEditViewGoHistoryWindowHelpLukás Koválik's No...ProGPHubspot API calls+n Home1000TestDailyAgents+ New agentWorkspace* Quick NoteWorkJira ticketView of SprintDailyPlanSprintStefka 1-1TododevEvaluationKnowledgera IdeasPrivateE Home viewsIntegration-appWork KnowledgeWork Knowledgetesting keyboard4Todo2 New chat x03 Hubspot / Hubspot API callsCritical Findings1. Line 1313 - rawsearchApi()->doSearch()- matchExSresponse = Sthis->client->getNewInstance()->crm(• Goes completely around the Client wrapper - no 429• Uses the search rate limit bucket• Can be replaced with $this->client->search('contacts"2. Line 920-923 — companies()->searchByDomain() - m$hsAccounts = $this->client->getInstance()->compai• Uses v1 SDK's searchByDomainwhich calls a search e• No 429 protection• Cannot be trivially replaced with client->search() (diffePress 'space' for Al or 'l' for commands40QHomeDMsActivityFilesLater...MoreED→Jiminny... v# conrusion-cHnic# curiosity_lab# engineering# general# jiminny-bg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi...• Direct messagesSo Vasil VasilevNikolay IvanovGalya DimitrovaAneliya Angelova, ...2 Stoyan Tanev €ã. Stefka StoyanovaC. Ves. Aneliya Angelovado James GrahamLukas Kovalik y... O#:: AppsToastJira Cloudlabl100% <•Fri 8 May 20:05:59Describe what you are looking forVasil Vasilev• MessagesAdd canvasO Files< Pins+carsoro to Lazyoysa(couyele prescivesthe single-loop, gToday~-yle code in the newversion while restoring proper batched eagerloading (avoiding N+1 ongetIndexableAttributes ) and releasing the DBconnection between chunks (avoiding long-heldPDO connections during ES/Sentry calls).Vasil Vasilev 4:40 PMхм, интересна идеяще го проверятака или иначе в понеделник ще иде на прод.днес не ми се рискуваVasil Vasilev 6:05 PMмм, прав сизадълбах по на дълбоко, и се оказва, че cursorще произведе друг проблемcursor не зарежда допьлннителните таблицище стриймне моделите, но за всеки ще викапоотделно with(opportunities, leads, accounts....) ивсичко останалокоето обезмисля цялата гимнастикаще го ревизирам с lazy loadingна по малки бачове, за да спестя памет отмоделите, просто ще взема данните на няколкопЪтиMessage Vasil Vasilev+...
|
Slack
|
Vasil Vasilev (DM) - Jiminny Inc - 3 new items - S Vasil Vasilev (DM) - Jiminny Inc - 3 new items - Slack...
|
NULL
|
10159
|
|
10158
|
Switch workspaces… (Jiminny Inc) Has new messages
Switch workspaces… (Jiminny Inc) Has new messages
Home
Home
DMs
DMs
Activity
Activity
Files
Files
Later
Later
More…
More
Unreads
Threads
Huddles
Drafts & sent
1
Directories
jiminny-x-integration-app
platform-inner-team
ai-chapter
alerts
backend
bugs
confusion-clinic
curiosity_lab
engineering
general
jiminny-bg
platform-tickets
product_launches
random
releases
sofia-office
support
thank-yous
the_people_of_jiminny
Vasil Vasilev
Nikolay Ivanov
Galya Dimitrova
Aneliya Angelova
,
Nikolay Yankov
,
Steliyan Georgiev
Stoyan Tanev
Stefka Stoyanova
Ves
Aneliya Angelova
James Graham
Lukas Kovalik
you
Toast
Jira Cloud
Messages
Messages
Add canvas
Add canvas
Files
Files
Pins
Pins
Add and Edit Channel Tabs
Canvas
List
Folder
Jump to date
Lukas Kovalik
Apr 28th at 4:53:41 PM
4:53 PM
ок, ще питам Вес, мерси
Vasil Vasilev
Apr 28th at 5:00:16 PM
5:00 PM
моля
Jump to date
Vasil Vasilev
Today at 2:52:43 PM
2:52 PM
Лукаш, привет
Today at 2:52:48 PM
2:52
хвърли моля те едно око тука
Today at 2:52:49 PM
2:52
https://github.com/jiminny/app/pull/12059
https://github.com/jiminny/app/pull/12059
Today at 2:53:03 PM
2:53
опитвам се да оптимизирам процеса по индексиране на активитита за ЕС
Today at 2:54:16 PM
2:54
идеята е да намаля паметта която се ползва за да се генерира един бач от 100 активитита
Today at 2:54:35 PM
2:54
и после да увелича размера на бачовете, за да имаме по малко blocking операции в ЕС, като реиндексира
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 4:12:58 PM
4:12 PM
здрасти, изглежда ок, но когато го минах и през gemini ми даде един warning.
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:13:17 PM
4:13
Switch
cursor()
to
lazyById(250)
. It preserves the single-loop, generator-style code in the new version while restoring proper batched eager loading (avoiding N+1 on
getIndexableAttributes()
) and releasing the DB connection between chunks (avoiding long-held PDO connections during ES/Sentry calls).
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Vasil Vasilev
Today at 4:40:06 PM
4:40 PM
хм, интересна идея
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:41:03 PM
4:41
ще го проверя
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:41:17 PM
4:41
така или иначе в понеделник ще иде на прод, днес не ми се рискува
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Vasil Vasilev
Today at 6:05:10 PM
6:05 PM
мм, прав си
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 6:05:26 PM
6:05
задълбах по на дълбоко, и се оказва, че cursor ще произведе друг проблем
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 6:05:35 PM
6:05
cursor не зарежда допълннителните таблици
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 6:06:07 PM
6:06
ще стриймне моделите, но за всеки ще вика поотделно with(opportunities, leads, accounts….) и всичко останало
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 6:06:16 PM
6:06
което обезмисля цялата гимнастика
Today at 6:06:21 PM
6:06
ще го ревизирам с lazy loading
Today at 6:06:43 PM
6:06
на по малки бачове, за да спестя памет от моделите, просто ще взема данните на няколко пъти
loading…
PhostorimcodeFV faVsco.js?9 JY-20725-handle-HS-search-rate-limiProledey(© RemoteCrmobjectmanif © HubspotSyncStrategybase.png€ ResponseNormalize.phrCachedcrmservicebecorator.onpsyncrielaAction.ong© SyncRelatedActivityMar© MatchActivityCrmData.php© CrmActivityService.phgc) MatchermDatc wednooksynebalchrrov O IntegrationAppdosearchx 5 Cc wTIY:>D Accessors>© Api• contiaO DTOW) FiltersM.lobsclass service excenas baseservice znpcemencs903904 CpubLic tunccion matchbybomaln Scring saomain, tinc suseria = nulu: tarrayProspectSearchStrateg)ServiceTraitsC) DataClient.oho© DecorateActivity.php© [EMAIL]© RemoteSearch.php(C) Service.php913v Ml isteners© ConvertLeadActivities.p© PurgeLookupCache.php> D MetadataD Migration[ Pipedrive915917>C FieldsC OpportunityMatcher> @ OpportunitySyncStrated921_Prospectsearchstrateay>W ServiceTraits925(c) Client.phpc) [EMAIL]) FieldDefinitions.onvC) PavloadBuilder.ohv929930(C) Profile, ohoC) @uervBuilder.ohoC) @uerv.andler.ohoC) @uerviterator nhol9331934(C) @uervRecults.nhn© Service.php(C) SvncRatchRedicServicescompanyname = soomarn'Try to find a company matchina their emall domain.ScompanyProperties = ['hs avatar filemanader key!.try 1ShsAccounts = Sthis->clientl->getInstance->comnaniesol->ceanchRvlomain(ScomnanvName ScomnanvPronenties)•} catch (Throwable $e) {Sthis->logger->info('[HubSpot] Search failed', ["error = se->gethessageD):return nulbSaccount = null:I/ If there are multiple accounts. don'+ quess.we'll ask laterif count(ShsAccounts->data->results) zz= 10 <Persist this remote obiect.Saccount = Sthis->svncAccountShsAccounts->data->results101->comoanv1d0•M Traite© BaseClient.php© BaseService.php(C CachodGrm CorvicaDacaratSdata = Sthis->conventcrmlatald contact: nuil Saccount Susentd)•© CountryCodeResolver.phpneturn I emntvlannav filten(Sdata)) ? Sdata • null-4) CrmActivitvProviderintegrariio May 20:00.41© ProspectCache.php=custom.log ^A SF (jiminny@localhost]4 HS_local [jiminny@localhost]# console [PKou.# console leu)# console [slAGiNg)[2026-05-07 14:21:15] local.INF0: [Hubspot] DEBUG Getting headers {"neaders".?"Uace":L"Inu,or May 2020 14.21.15 6Ml"Jn"Transter-Encod1nq":"chunked")."Connection":"keep-alive""CF-Ray" : ["9f80deb8db60dc3a-SOF"],"Strict-Transport-Secur1ty":"max-aqe=31536008* 1ncLudeSubDomains: preload")nacceot-encodino""server-timing": ["hcid;desc=\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\","x-hubspot-correlation-id":["019e02d0-6fd8-7812-bdba-885b7ccb3ee3"],"So+-Cookie"." c+hm-Stlirtd0aXVr.kSandas6hzVVKhzTn0BidvMaheCtmoV-1778163675-1.0.107-May-26 14:51:15 GMT; domain=.hubapi.com; Http0nly; Secure; SameSite=None"],"Renont-To".f"*"endpoints\":[{"unl".httns:la.nel.cloudflane.com./nenon+W/v42c=NVA1cVTPQfVm32anS0#xVF/sd2RN\"group\":\"cf-nel\","max_age\":604800}"]|"NEL":["{success_traccion.0.01rreportto. "cr-nel,"max age":604800}"]"Server": ["cloudflare"]}} {"correlation_1d":"95256555-ec78-4541-b9za-adta/Sb6Yeab"."trace_10":C/AD8565-905t-4604-9405-0e5b551e5545CascadeHubspot Rate LimitindAskJiminnyReportActivityServiceTest -Hubspot Rate Limit ReInvestigating Rate LinNew CascadeHubspot CRM Call ReActions/SyncArchivedProfilesAction.phpCallVia executeRequest()?Rate Limitapp/Services/Activity/HubSpot/Service.phpThis service uses Sthis=›crmService (the CRM Service.oho))- it makes no direct HubSpot APl calls itselt. All calls delegate through crmservice-›aetcal10, crmService->searchCallsForPeriod(), crmService->syncOpportunity(), crmService->parseRecords() .Critical Findings1. Line 1313 - raw searchApi→>doSearch - matchExactlyByParticipantinService.pno:#Service.oho:1313)Sresponse = sthis->cuient->aetNewinstance->crmo->contactso-searchAoi->doSearchSoavload):• Goes completely around the Client wrapper - no 429 handling, no RateLimitException, no rate limit awareness•Uses the search rate limit bucket• Can be replaced with $this->client-›search('contacts', $payload) - same endpoint, same result, adds 429 protection,tine 020.022-comnandoctl.sconrchRuhorninfl_matchRuDomain/).• Service.php:920-923ShsAccounts = $this->client->getInstance()->companies()->searchByDomain(ScompanyName, ScompanyProperties):• Uses v1 SDK's searchByDomain which calls a search endpoint — hits the search rate limit bucket• No 429 protection• Cannot be trivially replaced with client-›search() (different endpoint/format), but could be wrapped in executeRequest ()2.detdnnortunitvRvldhac executeReauestcommented out.• Client.php:238-239$deal = Sthis->executeRequest(fn () => $this->getNewInstance()->crm()->deals()->basicApi()->getById(• Deliberatelv disabled _ this means sinale deal fetches in HubsootSingleSvncStrateav also aet no 429 protection.Ask anvthina (&4L)Tnl "896-20UITE.Rfo 4 spaces...
|
Slack
|
Vasil Vasilev (DM) - Jiminny Inc - 3 new items - S Vasil Vasilev (DM) - Jiminny Inc - 3 new items - Slack...
|
NULL
|
10158
|
|
10157
|
Switch workspaces… (Jiminny Inc) Has new messages
Switch workspaces… (Jiminny Inc) Has new messages
Home
Home
DMs
DMs
Activity
Activity
Files
Files
Later
Later
More…
More
Unreads
Threads
Huddles
Drafts & sent
1
Directories
jiminny-x-integration-app
platform-inner-team
ai-chapter
alerts
backend
bugs
confusion-clinic
curiosity_lab
engineering
general
jiminny-bg
platform-tickets
product_launches
random
releases
sofia-office
support
thank-yous
the_people_of_jiminny
Vasil Vasilev
Nikolay Ivanov
Galya Dimitrova
Aneliya Angelova
,
SlackFileEditViewGoHistoryWindowHelpLukás Koválik's No...ProGPHubspot API calls+n Home1000TestDailyAgents+ New agentWorkspace* Quick NoteWorkJira ticketView of SprintDailyPlanSprintStefka 1-1TododevEvaluationKnowledgera IdeasPrivateE Home viewsIntegration-appWork KnowledgeWork Knowledgetesting keyboard4Todo2 New chat x03 Hubspot / Hubspot API callsCritical Findings1. Line 1313 - rawsearchApi()->doSearch()- matchExlSresponse = Sthis->client->getNewInstance()->crm(• Goes completely around the Client wrapper - no 429• Uses the search rate limit bucket• Can be replaced with $this->client->search('contacts"2. Line 920-923 — companies()->searchByDomain() - m$hsAccounts = $this->client->getInstance()->compai• Uses v1 SDK's searchByDomainwhich calls a search e• No 429 protection• Cannot be trivially replaced with client->search() (diffePress 'space' for Al or 'l' for commandsHomeDMsActivityFilesLater...MoreED→Jiminny... v# conrusion-cHnic# curiosity_lab# engineering# general# jiminny-bg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi...• Direct messagesSo Vasil Vasilevo Nikolay IvanovGalya DimitrovaAneliya Angelova, ...2 Stoyan Tanev €ã. Stefka StoyanovaC. Ves. Aneliya Angelovado James GrahamLukas Kovalik y...#:: AppsToastJira Cloud40100% <•Fri 8 May 20:05:27QDescribe what you are looking forVasil Vasilev6 0• Messagest* Add canvasO Files< Pins+да се генерира еToday ~* 100 активититаи после да увелича размера на бачовете, за даимаме по малко blocking операции в ЕС, катореиндексир-99 HLukas Koval!здрасти, изглежда ок, но когато го минах и презgemini ми даде един warning.Switch cursor() to lazyById(250) . It preservesthe single-loop, generator-style code in the newversion while restoring proper batched eagerloading (avoiding N+1 ongetIndexableAttributes) ) and releasing the DBconnection between chunks (avoiding long-heldPDO connections during ES/Sentry calls).Vasil Vasilev 4:40 PMхм, интересна идеяще го проверятака или иначе в понеделник ще иде на прод,днес не ми се рискуваVasil Vasilev 6:05 PMмм, прав сизадълбах по на дълбоко, и се оказва, че cursorще произведе друг проблемcursor не зарежда допълннителните таблицище стриймне моделите, но за всеки ще викаMessage Vasil Vasilev+...
|
Slack
|
Vasil Vasilev (DM) - Jiminny Inc - 3 new items - S Vasil Vasilev (DM) - Jiminny Inc - 3 new items - Slack...
|
NULL
|
10157
|
|
10156
|
Switch workspaces… (Jiminny Inc) Has new messages
Switch workspaces… (Jiminny Inc) Has new messages
Home
Home
DMs
DMs
Activity
Activity
Files
Files
Later
Later
More…
More
Unreads
Threads
Huddles
Drafts & sent
1
Directories
jiminny-x-integration-app
platform-inner-team
ai-chapter
alerts
backend
bugs
confusion-clinic
curiosity_lab
engineering
general
jiminny-bg
platform-tickets
product_launches
random
releases
sofia-office
support
thank-yous
the_people_of_jiminny
Vasil Vasilev
Nikolay Ivanov
Galya Dimitrova
Aneliya Angelova
,
Nikolay Yankov
,
Steliyan Georgiev
Stoyan Tanev
Stefka Stoyanova
Ves
Aneliya Angelova
James Graham
Lukas Kovalik
you
Toast
Jira Cloud
Messages
Messages
Add canvas
Add canvas
Files
Files
Pins
Pins
Add and Edit Channel Tabs
Canvas
List
Folder
Jump to date
Vasil Vasilev
Today at 2:52:43 PM
2:52 PM
Лукаш, привет
Today at 2:52:48 PM
2:52
хвърли моля те едно око тука
Today at 2:52:49 PM
2:52
https://github.com/jiminny/app/pull/12059
https://github.com/jiminny/app/pull/12059
Today at 2:53:03 PM
2:53
опитвам се да оптимизирам процеса по индексиране на активитита за ЕС
Today at 2:54:16 PM
2:54
идеята е да намаля паметта която се ползва за да се генерира един бач от 100 активитита
Today at 2:54:35 PM
2:54
и после да увелича размера на бачовете, за да имаме по малко blocking операции в ЕС, като реиндексира
Lukas Kovalik
Today at 4:12:58 PM
4:12 PM
здрасти, изглежда ок, но когато го минах и през gemini ми даде един warning.
Today at 4:13:17 PM
4:13
Switch
cursor()
to
lazyById(250)
. It preserves the single-loop, generator-style code in the new version while restoring proper batched eager loading (avoiding N+1 on
getIndexableAttributes()
) and releasing the DB connection between chunks (avoiding long-held PDO connections during ES/Sentry calls).
Vasil Vasilev
Today at 4:40:06 PM
4:40 PM
хм, интересна идея
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:41:03 PM
4:41
ще го проверя
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:41:17 PM
4:41
така или иначе в понеделник ще иде на прод, днес не ми се рискува
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Vasil Vasilev
Today at 6:05:10 PM
6:05 PM
мм, прав си
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 6:05:26 PM
6:05
задълбах по на дълбоко, и се оказва, че cursor ще произведе друг проблем
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 6:05:35 PM
6:05
cursor не зарежда допълннителните таблици
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 6:06:07 PM
6:06
ще стриймне моделите, но за всеки ще вика поотделно with(opportunities, leads, accounts….) и всичко останало
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 6:06:16 PM
6:06
което обезмисля цялата гимнастика
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 6:06:21 PM
6:06
ще го ревизирам с lazy loading
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 6:06:43 PM
6:06
на по малки бачове, за да спестя памет от моделите, просто ще взема данните на няколко пъти
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
SlackFileEditViewGoHistoryWindowHelpLukás Koválik's No...ProGPHubspot API calls+n Home1000TestDailyAgents+ New agentWorkspace* Quick NoteWorkJira ticketView of SprintDailyPlanSprint|Stefka 1-1|TododevEvaluationKnowledgee IdeasPrivateE Home viewsIntegration-appWork KnowledgeWork Knowledgetesting keyboard4 Todo2 New chat x03 Hubspot / Hubspot API callsCritical Findings1. Line 1313 - rawsearchApi()->doSearch()- matchEx|Sresponse = $this->client->getNewInstance()->crm(• Goes completely around the Client wrapper - no 429• Uses the search rate limit bucket• Can be replaced with $this->client->search('contacts"2. Line 920-923 — companies()->searchByDomain() - m$hsAccounts = $this->client->getInstance()->compai• Uses v1 SDK's searchByDomainwhich calls a search e• No 429 protection• Cannot be trivially replaced with client->search() (diffePress 'space' for Al or 'l' for commands40QHomeDMsActivityFilesLater...MoreED→Jiminny... v# conrusion-cHnic# curiosity_lab# engineering# general# jiminny-bg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi...• Direct messagesSo Vasil Vasilevao Nikolay IvanovGalya DimitrovaAneliya Angelova, ...2 Stoyan Tanev €ã. Stefka StoyanovaC. Ves. Aneliya Angelovado James GrahamLukas Kovalik y... O::: AppsToalJira Cloudlabl100% <•Fri 8 May 20:04:55Describe what you are looking forVasil Vasilev• MessagesAdd canvasO Files< Pins+carsoro to LazyDyia(coueipreseivesthe single-loop, gToday~-yle code in the newversion while restoring proper batched eagerloading (avoiding N+1 ongetIndexableAttributes ) and releasing the DBconnection between chunks (avoiding long-heldPDO connections during ES/Sentry calls).Vasil Vasilev 4:40 PMхм, интересна идеяще го проверятака или иначе в понеделник ще иде на прод.днес не ми се рискуваVasil Vasilev 6:05 PMмм, прав сизадълбах по на дълбоко, и се оказва, че cursorще произведе друг проблемcursor не зарежда допьлннителните таблицище стриймне моделите, но за всеки ще викапоотделно with(opportunities, leads, accounts....) ивсичко останалокоето обезмисля цялата гимнастикаще го ревизирам с lazy loadingна по малки бачове, за да спестя памет отмоделите, просто ще взема данните на няколкопЪтиMessage Vasil Vasilev+...
|
Slack
|
Vasil Vasilev (DM) - Jiminny Inc - 3 new items - S Vasil Vasilev (DM) - Jiminny Inc - 3 new items - Slack...
|
NULL
|
10156
|
|
10155
|
Switch workspaces… (Jiminny Inc) Has new messages
Switch workspaces… (Jiminny Inc) Has new messages
Home
Home
DMs
DMs
Activity
Activity
Files
Files
Later
Later
More…
More
Unreads
Threads
Huddles
Drafts & sent
1
Directories
jiminny-x-integration-app
platform-inner-team
ai-chapter
alerts
backend
bugs
confusion-clinic
curiosity_lab
engineering
general
jiminny-bg
platform-tickets
product_launches
random
releases
sofia-office
support
thank-yous
the_people_of_jiminny
Vasil Vasilev
Nikolay Ivanov
Galya Dimitrova
Aneliya Angelova
,
Nikolay Yankov
,
Steliyan Georgiev
Stoyan Tanev
Stefka Stoyanova
Ves
Aneliya Angelova
James Graham
Lukas Kovalik
you
Toast
Jira Cloud
Messages
Messages
Add canvas
Add canvas
Files
Files
Pins
Pins
Add and Edit Channel Tabs
Canvas
List
Folder
Jump to date
Vasil Vasilev
Today at 2:52:43 PM
2:52 PM
Лукаш, привет
Today at 2:52:48 PM
2:52
хвърли моля те едно око тука
Today at 2:52:49 PM
2:52
https://github.com/jiminny/app/pull/12059
https://github.com/jiminny/app/pull/12059
Today at 2:53:03 PM
2:53
опитвам се да оптимизирам процеса по индексиране на активитита за ЕС
Today at 2:54:16 PM
2:54
идеята е да намаля паметта която се ползва за да се генерира един бач от 100 активитита
Today at 2:54:35 PM
2:54
и после да увелича размера на бачовете, за да имаме по малко blocking операции в ЕС, като реиндексира
Lukas Kovalik
Today at 4:12:58 PM
4:12 PM
здрасти, изглежда ок, но когато го минах и през gemini ми даде един warning.
Today at 4:13:17 PM
4:13
Switch
cursor()
to
lazyById(250)
. It preserves the single-loop, generator-style code in the new version while restoring proper batched eager loading (avoiding N+1 on
getIndexableAttributes()
) and releasing the DB connection between chunks (avoiding long-held PDO connections during ES/Sentry calls).
Vasil Vasilev
Today at 4:40:06 PM
4:40 PM
хм, интересна идея
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:41:03 PM
4:41
ще го проверя
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:41:17 PM
4:41
така или иначе в понеделник ще иде на прод, днес не ми се рискува
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Vasil Vasilev
Today at 6:05:10 PM
6:05 PM
мм, прав си
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 6:05:26 PM
6:05
задълбах по на дълбоко, и се оказва, че cursor ще произведе друг проблем
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 6:05:35 PM
6:05
cursor не зарежда допълннителните таблици
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 6:06:07 PM
6:06
ще стриймне моделите, но за всеки ще вика поотделно with(opportunities, leads, accounts….) и всичко останало
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 6:06:16 PM
6:06
което обезмисля цялата гимнастика
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 6:06:21 PM
6:06
ще го ревизирам с lazy loading
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 6:06:43 PM
6:06
на по малки бачове, за да спестя памет от моделите, просто ще взема данните на няколко пъти
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
PhostorimcodeFV faVsco.js?9 JY-20725-handle-HS-search-rate-limiProledey(© RemoteCrmobjectmanif © HubspotSyncStrategybase.png€ ResponseNormalize.pheCachedcrmservicebecorator.onpsyncrielaAction.ong© SyncRelatedActivityMar© MatchActivityCrmData.php© CrmActivityService.phgc) MatchermDatc wednooksynebalchrrov O IntegrationAppdosearchx 5 Cc WTIY:>D Accessors>© Api• contiaO DTOW) FiltersM.lobsclass service excenas baseservice znpcemencs903904 CpubLic tunccion matchbybomaln Scring saomain, tinc suseria = nulu: tarrayProspectSearchStrateg)ServiceTraitsC) DataClient.oho© DecorateActivity.php© LocalSearch.phpelocalSearchinterface.of© RemoteSearch.php(C) Service.phpv Ml isteners913© ConvertLeadActivities.p© PurgeLookupCache.php> D MetadataD Migration[ Pipedrive915917>C FieldsC OpportunityMatcher> @ OpportunitySyncStrated921›_ Prospectsearchstrateay>W ServiceTraits925(c) Client.phpc) [EMAIL]) FieldDefinitions.onvC) PavloadBuilder.ohv929930(C) Profile, ohoC) @uervBuilder.ohoC) @uerv.andler.ohoC) @uerviterator nhol9331934(C) @uervRecults.nhn© Service.php(C) SvncRatchRedicServicescompanyname = soomarn'Try to find a company matchina their emall domain.ScompanyProperties = ['hs avatar filemanader key!.try 1ShsAccounts = Sthis->clientl->getInstance->comnaniesol->ceanchRvlomain(ScomnanvName ScomnanvPronenties)•} catch (Throwable $e) {Sthis->logger->info('[HubSpot] Search failed', ['error' => $e->getMessage()D):return nulbSaccount = null:I/ If there are multiple accounts. don'+ quess.we'll ask laterif count(ShsAccounts->data->results) zz= 10 <Persist this remote obiect.Saccount = Sthis->svncAccountShsAccounts->data->results101->comoanv1d0•M Traite© BaseClient.php© BaseService.php(C CachodGrm CorvicaDacoratSdata = Sthis->conventcrmlatald contact: nuil Saccount Susentd)•© CountryCodeResolver.php4) CrmActivitvProviderintegraneturn I emntvlannav filten(Sdata)) ? Sdata • null-rilo May 20:04.0g© ProspectCache.phpB7B48 MMSSATATl HI=custom.log ^4 SF (jiminny@localhost]4 HS_local (jiminny@localhost]# console [PKou.# console leu)# console [slAGiNg)[2026-05-07 14:21:15] local.INF0: [Hubspot] DEBUG Getting headers {"neaders".?"Uace":L"Inu,or May 2020 14.21.15 6Ml"Jn"Transter-Encod1nq":"chunked")."Connection":"keep-alive""CF-Ray" : ["9f80deb8db60dc3a-SOF"],"Strict-Transport-Secur1ty":"max-aqe=31536008* 1ncLudeSubDomains: preload")nacceot-encodino""server-timing": ["hcid;desc=\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\","x-hubspot-correlation-id":["019e02d0-6fd8-7812-bdba-885b7ccb3ee3"],"So+-Cookie"." c+hm-Stlirtd0aXVr.kSandas6hzVVKhzTn0BidvMaheCtmoV-1778163675-1.0.107-May-26 14:51:15 GMT; domain=.hubapi.com; Http0nly; Secure; SameSite=None"],"Renont-To".f"*"endpoints\":[{"unl".httns:la.nel.cloudflane.com./nenon+W/v42c=NVA1cVTPQfVm32anS0#xVF/sd2RN\"group\":\"cf-nel\","max_age\":604800}"]|"NEL": ["1success_traccion.0.01rreportto. "cr-nel,"max age":604800}"]"Server": ["cloudflare"]}} {"correlation_1d":"95256555-ec78-4541-b9za-adta/Sb6Yeab"."trace_10":C/AD8565-905t-4604-9405-0e5b551e5545CascadeHubspot Rate LimitindAskJiminnyReportActivityServiceTest -Hubspot Rate Limit ReInvestigating Rate LinNew CascadeHubspot CRM Call Re- 11I1Actions/SyncArchivedProfilesAction.phpCallVia executeRequest()?Rate Limitapp/Services/Activity/HubSpot/Service.phpThis service uses Sthis=›crmService (the CRM Service.oho))- it makes no direct HubSpot APl calls itselt. All calls delegate through crmservice-›aetcal10, crmService->searchCallsForPeriod(), crmService->syncOpportunity(), crmService->parseRecords() .Critical Findings1. Line 1313 - raw searchApi→>doSearch - matchExactlyByParticipantinService.pno:#Service.oho:1313)Sresponse = sthis->cuient->aetNewinstance->crmo->contactso-searchAoi->doSearchSoavload):• Goes completely around the Client wrapper - no 429 handling, no RateLimitException, no rate limit awareness•Uses the search rate limit bucket• Can be replaced with $this->client-›search('contacts', $payload) - same endpoint, same result, adds 429 protection,tine 020.022-comnandoctl.sconrchRuhorninfl_matchRuDomain/).• Service.php:920-923ShsAccounts = $this->client->getInstance()->companies()->searchByDomain(ScompanyName, ScompanyProperties):• Uses v1 SDK's searchByDomain which calls a search endpoint — hits the search rate limit bucket• No 429 protection• Cannot be trivially replaced with client-›search() (different endpoint/format), but could be wrapped in executeRequest ()2.detdnnortunitvRvldhac executeReauestcommented out.• Client.php:238-239$deal = Sthis->executeRequest(fn () => $this->getNewInstance()->crm()->deals()->basicApi()->getById(• Deliberatelv disabled _ this means sinale deal fetches in HubsootSingleSvncStrateav also aet no 429 protection.Ask anvthina (&4L)Tnl "896-20UITE.Río 4 spaces...
|
Slack
|
Vasil Vasilev (DM) - Jiminny Inc - 3 new items - S Vasil Vasilev (DM) - Jiminny Inc - 3 new items - Slack...
|
NULL
|
10155
|
|
10154
|
Switch workspaces… (Jiminny Inc) Has new messages
Switch workspaces… (Jiminny Inc) Has new messages
Home
Home
DMs
DMs
Activity
Activity
Files
Files
Later
Later
More…
More
Unreads
Threads
Huddles
Drafts & sent
1
Directories
jiminny-x-integration-app
platform-inner-team
ai-chapter
alerts
backend
bugs
confusion-clinic
curiosity_lab
engineering
general
jiminny-bg
platform-tickets
product_launches
random
releases
sofia-office
support
thank-yous
the_people_of_jiminny
Vasil Vasilev
Nikolay Ivanov
Galya Dimitrova
Aneliya Angelova
,
Nikolay Yankov
,
Steliyan Georgiev
Stoyan Tanev
Stefka Stoyanova
Ves
Aneliya Angelova
James Graham
Lukas Kovalik
you
Toast
Jira Cloud
Messages
Messages
Add canvas
Add canvas
Files
Files
Pins
Pins
Add and Edit Channel Tabs
Canvas
List
Folder
Jump to date
Vasil Vasilev
Apr 28th at 4:51:31 PM
4:51 PM
a, ти искаш в amazon да добавим ключ за достъп до QAi ?
Apr 28th at 4:51:38 PM
4:51
Вес се грижи за тея неща
Apr 28th at 4:52:06 PM
4:52
дори не съм сигурен дали тоя ключ не трябва да бъде в CircleCI при билда на имиджа
Apr 28th at 4:52:10 PM
4:52
т.е.
Apr 28th at 4:52:12 PM
4:52
пак не знам
Lukas Kovalik
Apr 28th at 4:53:41 PM
4:53 PM
ок, ще питам Вес, мерси
Vasil Vasilev
Apr 28th at 5:00:16 PM
5:00 PM
моля
Jump to date
Vasil Vasilev
Today at 2:52:43 PM
2:52 PM
Лукаш, привет
Today at 2:52:48 PM
2:52
хвърли моля те едно око тука
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:52:49 PM
2:52
https://github.com/jiminny/app/pull/12059
https://github.com/jiminny/app/pull/12059
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:53:03 PM
2:53
опитвам се да оптимизирам процеса по индексиране на активитита за ЕС
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:54:16 PM
2:54
идеята е да намаля паметта която се ползва за да се генерира един бач от 100 активитита
React with white_check_mark
React with eyes
SlackFileEditViewGoHistoryWindowHelpLukás Koválik's No...ProGPHubspot API calls+n Home1000TestDailyAgents+ New agentWorkspace* Quick NoteWorkJira ticketView of SprintDailyPlanSprintStefka 1-1TododevEvaluationKnowledgera IdeasPrivateE Home viewsIntegration-appWork KnowledgeWork Knowledgetesting keyboard4Todo2 New chat x03 Hubspot / Hubspot API callsCritical Findings1. Line 1313 - rawsearchApi()->doSearch()- matchExSresponse = Sthis->client->getNewInstance()->crm(• Goes completely around the Client wrapper - no 429• Uses the search rate limit bucket• Can be replaced with $this->client->search('contacts"2. Line 920-923 — companies()->searchByDomain() - m$hsAccounts = $this->client->getInstance()->compai• Uses v1 SDK's searchByDomainwhich calls a search e• No 429 protection• Cannot be trivially replaced with client->search() (diffePress 'space' for Al or 'l' for commands40QHomeDMsActivityFilesLater...MoreED→Jiminny... v# conrusion-clnic# curiosity_lab# engineering# general# jiminny-bg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi...• Direct messagese. Vasil Vasilevo Nikolay IvanovGalya DimitrovaAneliya Angelova, ...2 Stoyan Tanev €ã. Stefka StoyanovaC Vese. Aneliya Angelovado James GrahamLukas Kovalik y... O::: AppsToalJira Cloud100% CFri 8 May 17:26:41Describe what you are looking forVasil Vasilev6 0MessagesAdd canvasлукаш, привет@ Files< Pins+Todayхвърли моля те смгукаhttps://github.com/jiminny/app/pull/12059опитвам се да оптимизирам процеса поиндексиране на активитита за ЕСидеята е да намаля паметта която се ползва зада се генерира един бач от 100 активититаи после да увелича размера на бачовете, за даимаме по малко blocking операции в ЕС, катореиндексираLukas Kovalik 4:12 PMздрасти, изглежда ок, но когато го минах и презgemini ми даде един warning.Switch cursor() to lazyById(250) . It preservesthe single-loop, generator-style code in the newversion while restoring proper batched eagerloading (avoiding N+1 ongetIndexableAttributes() ) and releasing the DBconnection between chunks (avoiding long-heldPDO connections during ES/Sentry calls).Vasil Vasilev 4:40 PMхм, интересна идеяще го проверятака или иначе в понеделник ще иде на прод,днес не ми се рискуваMessage Vasil Vasilev+Aa..•...
|
Slack
|
Vasil Vasilev (DM) - Jiminny Inc - 3 new items - S Vasil Vasilev (DM) - Jiminny Inc - 3 new items - Slack...
|
NULL
|
10154
|
|
10153
|
Switch workspaces… (Jiminny Inc) Has new messages
Switch workspaces… (Jiminny Inc) Has new messages
Home
Home
DMs
DMs
Activity
Activity
Files
Files
Later
Later
More…
More
Unreads
Threads
Huddles
Drafts & sent
1
Directories
jiminny-x-integration-app
platform-inner-team
ai-chapter
alerts
backend
bugs
confusion-clinic
curiosity_lab
engineering
general
jiminny-bg
platform-tickets
product_launches
random
releases
sofia-office
support
thank-yous
the_people_of_jiminny
Vasil Vasilev
Nikolay Ivanov
Galya Dimitrova
Aneliya Angelova
,
Nikolay Yankov
,
Steliyan Georgiev
Stoyan Tanev
Stefka Stoyanova
Ves
Aneliya Angelova
James Graham
Lukas Kovalik
you
Toast
Jira Cloud
Messages
Messages
Add canvas
Add canvas
Files
Files
Pins
Pins
Add and Edit Channel Tabs
Canvas
List
Folder
Jump to date
Vasil Vasilev
Apr 28th at 4:51:31 PM
4:51 PM
a, ти искаш в amazon да добавим ключ за достъп до QAi ?
Apr 28th at 4:51:38 PM
4:51
Вес се грижи за тея неща
Apr 28th at 4:52:06 PM
4:52
дори не съм сигурен дали тоя ключ не трябва да бъде в CircleCI при билда на имиджа
Apr 28th at 4:52:10 PM
4:52
т.е.
Apr 28th at 4:52:12 PM
4:52
пак не знам
Lukas Kovalik
Apr 28th at 4:53:41 PM
4:53 PM
ок, ще питам Вес, мерси
Vasil Vasilev
Apr 28th at 5:00:16 PM
5:00 PM
моля
Jump to date
Vasil Vasilev
Today at 2:52:43 PM
2:52 PM
Лукаш, привет
Today at 2:52:48 PM
2:52
хвърли моля те едно око тука
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:52:49 PM
2:52
https://github.com/jiminny/app/pull/12059
https://github.com/jiminny/app/pull/12059
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:53:03 PM
2:53
опитвам се да оптимизирам процеса по индексиране на активитита за ЕС
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:54:16 PM
2:54
идеята е да намаля паметта която се ползва за да се генерира един бач от 100 активитита
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:54:35 PM
2:54
и после да увелича размера на бачовете, за да имаме по малко blocking операции в ЕС, като реиндексира
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 4:12:58 PM
4:12 PM
здрасти, изглежда ок, но когато го минах и през gemini ми даде един warning.
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:13:17 PM
4:13
Switch
cursor()
to
lazyById(250)
. It preserves the single-loop, generator-style code in the new version while restoring proper batched eager loading (avoiding N+1 on
getIndexableAttributes()
) and releasing the DB connection between chunks (avoiding long-held PDO connections during ES/Sentry calls).
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Vasil Vasilev
Today at 4:40:06 PM
4:40 PM
хм, интересна идея
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:41:03 PM
4:41
ще го проверя
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:41:17 PM
4:41
така или иначе в понеделник ще иде на прод, днес не ми се рискува
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
loading…
PhostorimcodeFV faVsco.js?9 JY-20725-handle-HS-search-rate-limiProledey(© RemoteCrmobjectmanif © HubspotSyncStrategybase.png€ ResponseNormalize.phrCachedcrmservicebecorator.onp© syncrielaAction.ong© SyncRelatedActivityMar© MatchActivityCrmData.php© CrmActivityService.phgc) MatchermDatc wednooksynebalchrrov O IntegrationAppdosearchx 5 Cc wTIY:>D Accessors>© Api• contiaO DTOW) FiltersM.lobsclass service excenas baseservice znpcemencs903904 Cpubuic tunccion macchbybomaln scring saomain, tinc suserla = nulu: rarrayProspectSearchStrateg)ServiceTraitsC) DataClient.oho© DecorateActivity.php© LocalSearch.phpelocalSearchinterface.of© RemoteSearch.php(C) Service.phpv Ml isteners913© ConvertLeadActivities.p© PurgeLookupCache.php> D MetadataD Migration[ Pipedrive915917>C FieldsC OpportunityMatcher> @ OpportunitySyncStrated921›_ Prospectsearchstrateay>W ServiceTraits925(c) Client.phpc) [EMAIL]) FieldDefinitions.onvC) PavloadBuilder.ohv929930(C) Profile, ohoC) @uervBuilder.ohoC) @uerv.andler.ohoC) @uerviterator nhol9331934(C) @uervRecults.nhn© Service.php(C) SvncRatchRedicServicescompanyname = soomarn'Try to find a company matchina their emall domain.ScompanyProperties = ['hs avatar filemanader key!.try 1ShsAccounts = Sthis->clientl->getInstance->comnaniesol->ceanchRvlomain(ScomnanvName ScomnanvPronenties)•} catch (Throwable $e) {Sthis->logger->info('[HubSpot] Search failed', ['error' => $e->getMessage()D):return nulbSaccount = null:I/ If there are multiple accounts. don'+ quess.we'll ask laterif count(ShsAccounts->data->results) zz= 10 <Persist this remote obiect.Saccount = Sthis->svncAccount(ShsAccounts->data->results10l->comoanvid0•M Traite© BaseClient.php© BaseService.php(C CachodGrm CorvicaDacoratSdata = Sthis->conventcrmlatald contact: niin Saccount, Susentd).© CountryCodeResolver.php4) CrmActivitvProviderintegraneturn I emntvlannav filten(Sdata)) ? Sdata • null-ril o May 1/:20.40© ProspectCache.phpB7B48 MMSSATATl HI=custom.log ^4 SF (jiminny@localhost]4 HS_local [jiminny@localhost]# console [PKou.# console leu)# console [slAGiNg)[2026-05-07 14:21:15] local.INF0: [Hubspot] DEBUG Getting headers {"neaders".?"Uace":L"Inu,or May 2020 14.21.15 6Ml"Jn"Transter-Encod1nq":"chunked")."Connection":"keep-alive""CF-Ray" : ["9f80deb8db60dc3a-SOF"],"Strict-Transport-Secur1ty":"max-aqe=31536008* 1ncLudeSubDomains: preload")nacceot-encodino""server-timing": ["hcid;desc=\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\","x-hubspot-correlation-id":["019e02d0-6fd8-7812-bdba-885b7ccb3ee3"],"So+-Cookie"." c+hm-Stlirtd0aXVr.kSandas6hzVVKhzTn0BidvMaheCtm0V-1778163675-1.0.107-May-26 14:51:15 GMT; domain=.hubapi.com; Http0nly; Secure; SameSite=None"],"Renont-To".f"*"endpoints\":[{"unl".httns:la.nel.cloudflane.com./nenon+W/v42c=NVA1cVTPQfVm32anS0#xVF/sd2RN\"group\":\"cf-nel\","max_age\":604800}"]|"NEL":["{success_traccion.0.01rreportto. "cr-nel,"max age":604800}"]"Server": ["cloudflare"]}} {"correlation_1d":"95256555-ec78-4541-b9za-adta/Sb6Yeab"."trace_10":C/AD8565-905t-4604-9405-0e5b551e5545CascadeHubspot Rate LimitindHubspot Rate Limit ReInvestigating Rate LinNew CascadeHubspot CRM Call ReActions/SyncArchivedProfilesAction.phpCallVia executeRequest()?Rate Limitapp/Services/Activity/HubSpot/Service.phpThis service uses Sthis=›crmService (the CRM Service.oho))- it makes no direct HubSpot APl calls itselt. All calls delegate through crmservice-›aetcal10, crmService->searchCallsForPeriod(), crmService->syncOpportunity(), crmService->parseRecords() .Critical Findings1. Line 1313 - raw searchApi→>doSearch - matchExactlyByParticipantinService.po:#Service.oho:1313)Sresponse = sthis->cuient->aetNewinstance->crmo->contactso-searchAoi->doSearchSoavload):• Goes comoletelv around the Client wraoper — no 429 handlina, no Ratel imitFxcention. no rate limit awareness•Uses the search rate limit bucket• Can be replaced with $this->client-›search('contacts', $payload) - same endpoint, same result, adds 429 protection,tine 020.022-comnandoctl.sconrchRuhorninfl_matchRuDomain/).• Service.php:920-923ShsAccounts = $this->client->getInstance()->companies()->searchByDomain(ScompanyName, ScompanyProperties):• Uses v1 SDK's searchByDomain which calls a search endooint — hits the search rate limit bucket• No 429 protection• Cannot be trivially replaced with client-›search() (different endpoint/format), but could be wrapped in executeRequest ()2.detdnnortunitvRvldhac executeReauestcommented out.• Client.php:238-239$deal = Sthis->executeRequest(fn () => $this->getNewInstance()->crm()->deals()->basicApi()->getById(• Deliberatelv disabled _ this means sinale deal fetches in HubsootSingleSvncStrateav also aet no 429 protection.Ask anvthina (&4L)Tnl "896-20UITE.Rfo 4 spaces...
|
Slack
|
Vasil Vasilev (DM) - Jiminny Inc - 3 new items - S Vasil Vasilev (DM) - Jiminny Inc - 3 new items - Slack...
|
NULL
|
10153
|
|
10152
|
Switch workspaces… (Jiminny Inc) Has new messages
Switch workspaces… (Jiminny Inc) Has new messages
Home
Home
DMs
DMs
Activity
Activity
Files
Files
Later
Later
More…
More
Unreads
Threads
Huddles
Drafts & sent
1
Directories
jiminny-x-integration-app
platform-inner-team
ai-chapter
alerts
backend
bugs
confusion-clinic
curiosity_lab
engineering
general
jiminny-bg
platform-tickets
product_launches
random
releases
sofia-office
support
thank-yous
the_people_of_jiminny
Vasil Vasilev
Nikolay Ivanov
Galya Dimitrova
Aneliya Angelova
,
Nikolay Yankov
,
Steliyan Georgiev
Stoyan Tanev
Stefka Stoyanova
Ves
Aneliya Angelova
James Graham
Lukas Kovalik
you
Toast
Jira Cloud
Messages
Messages
Add canvas
Add canvas
Files
Files
Pins
Pins
Add and Edit Channel Tabs
Canvas
List
Folder
Jump to date
Vasil Vasilev
Apr 28th at 4:51:31 PM
4:51 PM
a, ти искаш в amazon да добавим ключ за достъп до QAi ?
Apr 28th at 4:51:38 PM
4:51
Вес се грижи за тея неща
Apr 28th at 4:52:06 PM
SlackFileEditViewGoHistoryWindowHelpLukás Koválik's No...ProGPHubspot API calls+n Home1000TestDailyAgents+ New agentWorkspace* Quick NoteWorkJira ticketView of SprintDailyPlanSprintStefka 1-1TododevEvaluationKnowledgera IdeasPrivateE Home viewsIntegration-appWork KnowledgeWork Knowledgetesting keyboard4Todo2 New chat x03 Hubspot / Hubspot API callsCritical Findings1. Line 1313 - rawsearchApi()->doSearch()- matchExlSresponse = Sthis->client->getNewInstance()->crm(• Goes completely around the Client wrapper - no 429• Uses the search rate limit bucket• Can be replaced with $this->client->search('contacts"2. Line 920-923 — companies()->searchByDomain() - m$hsAccounts = $this->client->getInstance()->compai• Uses v1 SDK's searchByDomainwhich calls a search e• No 429 protection• Cannot be trivially replaced with client->search() (diffePress 'space' for Al or 'l' for commands40QHomeDMsActivityFilesLater...MoreED→Jiminny... v# conrusion-clnic# curiosity_lab# engineering# general# jiminny-bg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi...• Direct messagese. Vasil Vasilevo Nikolay IvanovGalya DimitrovaAneliya Angelova, ...2 Stoyan Tanev €ã. Stefka StoyanovaC Vese. Aneliya Angelovado James GrahamLukas Kovalik y... O::: AppsToalJira Cloud100% CFri 8 May 17:26:10Describe what you are looking forVasil Vasilev6 0MessagesAdd canvasлукаш, привет@ Files< Pins+Todayхвърли моля те смгукаhttps://github.com/jiminny/app/pull/12059опитвам се да оптимизирам процеса поиндексиране на активитита за ЕСидеята е да намаля паметта която се ползва зада се генерира един бач от 100 активититаи после да увелича размера на бачовете, за даимаме по малко blocking операции в ЕС, катореиндексираLukas Kovalik 4:12 PMздрасти, изглежда ок, но когато го минах и презgemini ми даде един warning.Switch cursor() to lazyById(250) . It preservesthe single-loop, generator-style code in the newversion while restoring proper batched eagerloading (avoiding N+1 ongetIndexableAttributes() ) and releasing the DBconnection between chunks (avoiding long-heldPDO connections during ES/Sentry calls).Vasil Vasilev 4:40 PMхм, интересна идеяще го проверятака или иначе в понеделник ще иде на прод,днес не ми се рискуваMessage Vasil Vasilev+Aa..•...
|
Slack
|
Vasil Vasilev (DM) - Jiminny Inc - 3 new items - S Vasil Vasilev (DM) - Jiminny Inc - 3 new items - Slack...
|
NULL
|
10152
|
|
10151
|
Switch workspaces… (Jiminny Inc) Has new messages
Switch workspaces… (Jiminny Inc) Has new messages
Home
Home
DMs
DMs
Activity
Activity
Files
Files
Later
Later
More…
More
Unreads
Threads
Huddles
Drafts & sent
1
Directories
jiminny-x-integration-app
platform-inner-team
ai-chapter
alerts
backend
bugs
confusion-clinic
curiosity_lab
engineering
general
jiminny-bg
platform-tickets
product_launches
random
releases
sofia-office
support
thank-yous
the_people_of_jiminny
Vasil Vasilev
Nikolay Ivanov
Galya Dimitrova
Aneliya Angelova
,
Nikolay Yankov
,
Steliyan Georgiev
Stoyan Tanev
Stefka Stoyanova
Ves
Aneliya Angelova
James Graham
Lukas Kovalik
you
Toast
Jira Cloud
Messages
Messages
Add canvas
Add canvas
Files
Files
Pins
Pins
Add and Edit Channel Tabs
Canvas
List
Folder
Jump to date
Vasil Vasilev
Apr 28th at 4:51:31 PM
4:51 PM
a, ти искаш в amazon да добавим ключ за достъп до QAi ?
Apr 28th at 4:51:38 PM
4:51
Вес се грижи за тея неща
Apr 28th at 4:52:06 PM
4:52
дори не съм сигурен дали тоя ключ не трябва да бъде в CircleCI при билда на имиджа
Apr 28th at 4:52:10 PM
4:52
т.е.
Apr 28th at 4:52:12 PM
4:52
пак не знам
Lukas Kovalik
Apr 28th at 4:53:41 PM
4:53 PM
ок, ще питам Вес, мерси
Vasil Vasilev
Apr 28th at 5:00:16 PM
5:00 PM
моля
Jump to date
Vasil Vasilev
Today at 2:52:43 PM
2:52 PM
Лукаш, привет
Today at 2:52:48 PM
2:52
хвърли моля те едно око тука
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:52:49 PM
2:52
https://github.com/jiminny/app/pull/12059
https://github.com/jiminny/app/pull/12059
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:53:03 PM
2:53
опитвам се да оптимизирам процеса по индексиране на активитита за ЕС
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:54:16 PM
2:54
идеята е да намаля паметта която се ползва за да се генерира един бач от 100 активитита
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:54:35 PM
2:54
и после да увелича размера на бачовете, за да имаме по малко blocking операции в ЕС, като реиндексира
React with white_check_mark
React with eyes
React with raised_hands
PhostorimcodeFV faVsco.js?9 JY-20725-handle-HS-search-rate-limiProledey(© RemoteCrmobjectmanif © HubspotSyncStrategybase.png€ ResponseNormalize.phrCachedcrmservicebecorator.onp© syncrielaAction.ong© SyncRelatedActivityMar© MatchActivityCrmData.php© CrmActivityService.phgc) MatchermDatc wednooksynebalchrrov O IntegrationAppdosearchx 5 Cc wTIY:>D Accessors>© Api• contiaO DTOW) FiltersM.lobsclass service excenas baseservice znpcemencs903904 Cpubuic tunccion macchbybomaln scring saomain, tinc suserla = nulu: rarrayProspectSearchStrateg)ServiceTraitsC) DataClient.oho© DecorateActivity.php© LocalSearch.phpelocalSearchinterface.of© RemoteSearch.php(C) Service.phpv Ml isteners913© ConvertLeadActivities.p© PurgeLookupCache.php> D MetadataD Migration[ Pipedrive915917>C FieldsC OpportunityMatcher> @ OpportunitySyncStrated921›_ Prospectsearchstrateay>W ServiceTraits925(c) Client.phpc) [EMAIL]) FieldDefinitions.onvC) PavloadBuilder.ohv929930(C) Profile, ohoC) @uervBuilder.ohoC) @uerv.andler.ohoC) @uerviterator nhol9331934(C) @uervRecults.nhn© Service.php(C) SvncRatchRedicServicescompanyname = soomarn'Try to find a company matchina their emall domain.ScompanyProperties = ['hs avatar filemanader key!.try 1ShsAccounts = Sthis->clientl->getInstance->comnaniesol->ceanchRvlomain(ScomnanvName ScomnanvPronenties)•} catch (Throwable $e) {Sthis->logger->info('[HubSpot] Search failed', ['error' => $e->getMessage()D):return nulbSaccount = null:I/ If there are multiple accounts. don'+ quess.we'll ask laterif count(ShsAccounts->data->results) zz= 10 <Persist this remote obiect.Saccount = Sthis->svncAccount(ShsAccounts->data->results10l->comoanvid0•M Traite© BaseClient.php© BaseService.php(C CachodGrm CorvicaDacoratSdata = Sthis->conventcrmlatald contact: niin Saccount, Susentd).© CountryCodeResolver.php4) CrmActivitvProviderintegraneturn I emntvlannav filten(Sdata)) ? Sdata • null-rilo May 1/:20.00© ProspectCache.phpB7B48 MMSSATATl HI=custom.log ^A SF (jiminny@localhost]4 HS_local [jiminny@localhost]# console [PKou.# console leu)# console [slAGiNg)[2026-05-07 14:21:15] local.INF0: [Hubspot] DEBUG Getting headers {"neaders".?"Uace":L"Inu,or May 2020 14.21.15 6Ml"Jn"Transter-Encod1nq":"chunked")."Connection":"keep-alive""CF-Ray" : ["9f80deb8db60dc3a-SOF"],"Strict-Transport-Secur1ty":"max-aqe=31536008* 1ncLudeSubDomains: preload")nacceot-encodino""server-timing": ["hcid;desc=\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\","x-hubspot-correlation-id":["019e02d0-6fd8-7812-bdba-885b7ccb3ee3"],"So+-Cookie"." c+hm-Stlirtd0aXVr.kSandas6hzVVKhzTn0BidvMaheCtm0V-1778163675-1.0.107-May-26 14:51:15 GMT; domain=.hubapi.com; Http0nly; Secure; SameSite=None"],"Renont-To".f"*"endpoints\":[{"unl".httns:la.nel.cloudflane.com./nenon+W/v42c=NVA1cVTPQfVm32anS0#xVF/sd2RN\"group\":\"cf-nel\","max_age\":604800}"]|"NEL":["{success_traccion.0.01rreportto. "cr-nel,"max age":604800}"]"Server": ["cloudflare"]}} {"correlation_1d":"95256555-ec78-4541-b9za-adta/Sb6Yeab"."trace_10":C/AD8565-905t-4604-9405-0e5b551e5545CascadeHubspot Rate LimitindHubspot Rate Limit ReInvestigating Rate LinNew CascadeHubspot CRM Call ReActions/SyncArchivedProfilesAction.phpCallVia executeRequest()?Rate Limitapp/Services/Activity/HubSpot/Service.phpThis service uses Sthis=›crmService (the CRM Service.oho))- it makes no direct HubSpot APl calls itselt. All calls delegate through crmservice-›aetcal10, crmService->searchCallsForPeriod(), crmService->syncOpportunity(), crmService->parseRecords() .Critical Findings1. Line 1313 - raw searchApi→>doSearch - matchExactlyByParticipantinService.po:#Service.oho:1313)Sresponse = sthis->cuient->aetNewinstance->crmo->contactso-searchAoi->doSearchSoavload):• Goes comoletelv around the Client wraoper — no 429 handlina, no Ratel imitFxcention. no rate limit awareness•Uses the search rate limit bucket• Can be replaced with $this->client-›search('contacts', $payload) - same endpoint, same result, adds 429 protection,tine 020.022-comnandoctl.sconrchRuhorninfl_matchRuDomain/).• Service.php:920-923ShsAccounts = $this->client->getInstance()->companies()->searchByDomain(ScompanyName, ScompanyProperties):• Uses v1 SDK's searchByDomain which calls a search endooint — hits the search rate limit bucket• No 429 protection• Cannot be trivially replaced with client-›search() (different endpoint/format), but could be wrapped in executeRequest ()2.detdnnortunitvRvldhac executeReauestcommented out.• Client.php:238-239$deal = Sthis->executeRequest(fn () => $this->getNewInstance()->crm()->deals()->basicApi()->getById(• Deliberatelv disabled _ this means sinale deal fetches in HubsootSingleSvncStrateav also aet no 429 protection.Ask anvthina (&4L)Tnl "896-20UITE.Rfo 4 spaces...
|
Slack
|
Vasil Vasilev (DM) - Jiminny Inc - 3 new items - S Vasil Vasilev (DM) - Jiminny Inc - 3 new items - Slack...
|
NULL
|
10151
|
|
10150
|
Switch workspaces… (Jiminny Inc) Has new messages
Switch workspaces… (Jiminny Inc) Has new messages
Home
Home
DMs
DMs
Activity
Activity
Files
Files
Later
Later
More…
More
Unreads
Threads
Huddles
Drafts & sent
1
Directories
jiminny-x-integration-app
platform-inner-team
ai-chapter
alerts
backend
bugs
confusion-clinic
curiosity_lab
engineering
general
jiminny-bg
platform-tickets
product_launches
random
releases
sofia-office
support
thank-yous
the_people_of_jiminny
Vasil Vasilev
Nikolay Ivanov
Galya Dimitrova
Aneliya Angelova
,
Nikolay Yankov
,
Steliyan Georgiev
Stoyan Tanev
Stefka Stoyanova
Ves
Aneliya Angelova
James Graham
Lukas Kovalik
you
Toast
Jira Cloud
Messages
Messages
Add canvas
Add canvas
Files
Files
Pins
Pins
Add and Edit Channel Tabs
Canvas
List
Folder
Jump to date
Vasil Vasilev
Apr 28th at 4:51:31 PM
4:51 PM
a, ти искаш в amazon да добавим ключ за достъп до QAi ?
Apr 28th at 4:51:38 PM
4:51
Вес се грижи за тея неща
Apr 28th at 4:52:06 PM
4:52
дори не съм сигурен дали тоя ключ не трябва да бъде в CircleCI при билда на имиджа
Apr 28th at 4:52:10 PM
4:52
т.е.
Apr 28th at 4:52:12 PM
4:52
пак не знам
Lukas Kovalik
Apr 28th at 4:53:41 PM
4:53 PM
ок, ще питам Вес, мерси
Vasil Vasilev
Apr 28th at 5:00:16 PM
5:00 PM
моля
Jump to date
Vasil Vasilev
Today at 2:52:43 PM
2:52 PM
Лукаш, привет
Today at 2:52:48 PM
2:52
хвърли моля те едно око тука
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:52:49 PM
2:52
https://github.com/jiminny/app/pull/12059
https://github.com/jiminny/app/pull/12059
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:53:03 PM
2:53
опитвам се да оптимизирам процеса по индексиране на активитита за ЕС
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:54:16 PM
2:54
идеята е да намаля паметта която се ползва за да се генерира един бач от 100 активитита
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:54:35 PM
2:54
и после да увелича размера на бачовете, за да имаме по малко blocking операции в ЕС, като реиндексира
SlackFileEditViewGoHistoryWindowHelpLukás Koválik's No...ProGPHubspot API calls+n Home1000TestDailyAgents+ New agentWorkspace* Quick NoteWorkJira ticketView of SprintDailyPlanSprintStefka 1-1TododevEvaluationKnowledgera IdeasPrivateE Home viewsIntegration-appWork KnowledgeWork Knowledgetesting keyboard4Todo2 New chat x03 Hubspot / Hubspot API callsCritical Findings1. Line 1313 - rawsearchApi()->doSearch()- matchExlSresponse = Sthis->client->getNewInstance()->crm(• Goes completely around the Client wrapper - no 429• Uses the search rate limit bucket• Can be replaced with $this->client->search('contacts"2. Line 920-923 — companies()->searchByDomain() - m$hsAccounts = $this->client->getInstance()->compai• Uses v1 SDK's searchByDomainwhich calls a search e• No 429 protection• Cannot be trivially replaced with client->search() (diffePress 'space' for Al or 'l' for commands40QHomeDMsActivityFilesLater...MoreED→Jiminny... v# conrusion-clnic# curiosity_lab# engineering# general# jiminny-bg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi...• Direct messagese. Vasil Vasilevo Nikolay IvanovGalya DimitrovaAneliya Angelova, ...2 Stoyan Tanev €ã. Stefka StoyanovaC Vese. Aneliya Angelovado James GrahamLukas Kovalik y... O::: AppsToalJira Cloud100% CFri 8 May 17:25:37Describe what you are looking forVasil Vasilev6 0MessagesAdd canvasлукаш, привет@ Files< Pins+Todayхвърли моля те смгукаhttps://github.com/jiminny/app/pull/12059опитвам се да оптимизирам процеса поиндексиране на активитита за ЕСидеята е да намаля паметта която се ползва зада се генерира един бач от 100 активититаи после да увелича размера на бачовете, за даимаме по малко blocking операции в ЕС, катореиндексираLukas Kovalik 4:12 PMздрасти, изглежда ок, но когато го минах и презgemini ми даде един warning.Switch cursor() to lazyById(250) . It preservesthe single-loop, generator-style code in the newversion while restoring proper batched eagerloading (avoiding N+1 ongetIndexableAttributes() ) and releasing the DBconnection between chunks (avoiding long-heldPDO connections during ES/Sentry calls).Vasil Vasilev 4:40 PMхм, интересна идеяще го проверятака или иначе в понеделник ще иде на прод,днес не ми се рискуваMessage Vasil Vasilev+Aa..•...
|
Slack
|
Vasil Vasilev (DM) - Jiminny Inc - 3 new items - S Vasil Vasilev (DM) - Jiminny Inc - 3 new items - Slack...
|
NULL
|
10150
|
|
10149
|
Switch workspaces… (Jiminny Inc) Has new messages
Switch workspaces… (Jiminny Inc) Has new messages
Home
Home
DMs
DMs
Activity
Activity
Files
Files
Later
Later
More…
More
Unreads
Threads
Huddles
Drafts & sent
1
Directories
jiminny-x-integration-app
platform-inner-team
ai-chapter
alerts
backend
bugs
confusion-clinic
curiosity_lab
engineering
general
jiminny-bg
platform-tickets
product_launches
random
releases
sofia-office
support
thank-yous
the_people_of_jiminny
Vasil Vasilev
Nikolay Ivanov
Galya Dimitrova
Aneliya Angelova
,
Nikolay Yankov
,
Steliyan Georgiev
Stoyan Tanev
Stefka Stoyanova
Ves
Aneliya Angelova
James Graham
Lukas Kovalik
you
Toast
Jira Cloud
Messages
Messages
Add canvas
Add canvas
Files
Files
Pins
Pins
Add and Edit Channel Tabs
Canvas
List
Folder
Jump to date
Vasil Vasilev
Apr 28th at 4:51:31 PM
4:51 PM
a, ти искаш в amazon да добавим ключ за достъп до QAi ?
Apr 28th at 4:51:38 PM
4:51
Вес се грижи за тея неща
Apr 28th at 4:52:06 PM
4:52
дори не съм сигурен дали тоя ключ не трябва да бъде в CircleCI при билда на имиджа
Apr 28th at 4:52:10 PM
4:52
т.е.
Apr 28th at 4:52:12 PM
4:52
пак не знам
Lukas Kovalik
Apr 28th at 4:53:41 PM
4:53 PM
ок, ще питам Вес, мерси
Vasil Vasilev
Apr 28th at 5:00:16 PM
5:00 PM
моля
Jump to date
Vasil Vasilev
Today at 2:52:43 PM
2:52 PM
Лукаш, привет
Today at 2:52:48 PM
2:52
хвърли моля те едно око тука
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:52:49 PM
2:52
https://github.com/jiminny/app/pull/12059
https://github.com/jiminny/app/pull/12059
React with white_check_mark
PhostorimcodeFV faVsco.js?9 JY-20725-handle-HS-search-rate-limiProledey(© RemoteCrmobjectmanif © HubspotSyncStrategybase.png€ ResponseNormalize.phrCachedcrmservicebecorator.onpsyncrielaAction.ong© SyncRelatedActivityMar© MatchActivityCrmData.php© CrmActivityService.phgc) MatchermDatc wednooksynebalchrrov O IntegrationAppdosearchx 5 Cc wTIY:>D Accessors>© Api• contiaO DTOW) FiltersM.lobsclass service excenas baseservice znpcemencs903904 Cpubuic tunccion macchbybomaln scring saomain, tinc suserla = nulu: rarrayProspectSearchStrateg)ServiceTraitsC) DataClient.oho© DecorateActivity.php© LocalSearch.phpelocalSearchinterface.of909© RemoteSearch.php(C) Service.phpv Ml isteners913© ConvertLeadActivities.p© PurgeLookupCache.php> D MetadataD Migration[ Pipedrive915917>C FieldsC OpportunityMatcher> @ OpportunitySyncStrated921›_ Prospectsearchstrateay>W ServiceTraits925(c) Client.phpc) [EMAIL]) FieldDefinitions.onvC) PavloadBuilder.ohv929930(C) Profile, ohoC) @uervBuilder.ohoC) @uerv.andler.ohoC) @uerviterator nhol9331934(C) @uervRecults.nhn© Service.php(C) SvncRatchRedicServicescompanyname = soomarn'Try to find a company matchina their emall domain.ScompanyProperties = ['hs avatar filemanader key!.try 1ShsAccounts = Sthis->clientl->getInstance->comnaniesol->ceanchRvlomain(ScomnanvName ScomnanvPronenties)•} catch (Throwable $e) {Sthis->logger->info('[HubSpot] Search failed', ['error' => $e->getMessage()D):return nulbSaccount = null:I/ If there are multiple accounts. don'+ quess.we'll ask laterif count(ShsAccounts->data->results) zz= 10 <Persist this remote obiect.Saccount = Sthis->svncAccount(ShsAccounts->data->results10l->comoanvid0•M Traite© BaseClient.php© BaseService.php(C CachodGrm CorvicaDacoratSdata = Sthis->conventcrmlatald contact: niin Saccount, Susentd).© CountryCodeResolver.php4) CrmActivitvProviderintegraneturn I emntvlannav filten(Sdata)) ? Sdata • null-rilo May 11:20.32© ProspectCache.php=custom.log ^A SF (jiminny@localhost]4 HS_local [jiminny@localhost]# console [PKou.# console leu)# console [slAGiNg)[2026-05-07 14:21:15] local.INF0: [Hubspot] DEBUG Getting headers {"neaders".?"Uace":L"Inu,or May 2020 14.21.15 6Ml"Jn"Transter-Encod1nq":"chunked")."Connection":"keep-alive""CF-Ray" : ["9f80deb8db60dc3a-SOF"],"Strict-Transport-Secur1ty":"max-aqe=31536008* 1ncLudeSubDomains: preload")nacceot-encodino""server-timing": ["hcid;desc=\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\","x-hubspot-correlation-id":["019e02d0-6fd8-7812-bdba-885b7ccb3ee3"],"So+-Cookie"." c+hm-Stlirtd0aXVr.kSandas6hzVVKhzTn0BidvMaheCtm0V-1778163675-1.0.107-May-26 14:51:15 GMT; domain=.hubapi.com; Http0nly; Secure; SameSite=None"],"Renont-To".f"*"endpoints\":[{"unl".httns:la.nel.cloudflane.com./nenon+W/v42c=NVA1cVTPQfVm32anS0#xVF/sd2RN\"group\":\"cf-nel\","max_age\":604800}"]|"NEL":["{success_traccion.0.01rreportto. "cr-nel,"max age":604800}"]"Server": ["cloudflare"]}} {"correlation_1d":"95256555-ec78-4541-b9za-adta/Sb6Yeab"."trace_10":C/AD8565-905t-4604-9405-0e5b551e5545CascadeHubspot Rate LimitindAskJiminnyReportActivityServiceTest -Hubspot Rate Limit ReInvestigating Rate LinNew CascadeHubspot CRM Call ReActions/SyncArchivedProfilesAction.phpCallVia executeRequest()?Rate Limitapp/Services/Activity/HubSpot/Service.phpThis service uses Sthis=›crmService (the CRM Service.oho))- it makes no direct HubSpot APl calls itselt. All calls delegate through crmservice-›aetcal10, crmService->searchCallsForPeriod(), crmService->syncOpportunity(), crmService->parseRecords() .Critical Findings1. Line 1313 - raw searchApi→>doSearch - matchExactlyByParticipantinService.po:#Service.oho:1313)Sresponse = sthis->cuient->aetNewinstance->crmo->contactso-searchAoi->doSearchSoavload):• Goes comoletelv around the Client wraoper — no 429 handlina, no Ratel imitFxcention. no rate limit awareness•Uses the search rate limit bucket• Can be replaced with $this->client-›search('contacts', $payload) - same endpoint, same result, adds 429 protection,tine 020.022-comnandoctl.sconrchRuhorninfl_matchRuDomain/).• Service.php:920-923ShsAccounts = $this->client->getInstance()->companies()->searchByDomain(ScompanyName, ScompanyProperties):• Uses v1 SDK's searchByDomain which calls a search endooint — hits the search rate limit bucket• No 429 protection• Cannot be trivially replaced with client-›search() (different endpoint/format), but could be wrapped in executeRequest ()2.detdnnortunitvRvldhac executeReauestcommented out.• Client.php:238-239$deal = Sthis->executeRequest(fn () => $this->getNewInstance()->crm()->deals()->basicApi()->getById(• Deliberatelv disabled _ this means sinale deal fetches in HubsootSingleSvncStrateav also aet no 429 protection.Ask anvthina (&4L)Tnl "896-20UITE.Rfo 4 spaces...
|
Slack
|
Vasil Vasilev (DM) - Jiminny Inc - 3 new items - S Vasil Vasilev (DM) - Jiminny Inc - 3 new items - Slack...
|
NULL
|
10149
|
|
10148
|
Switch workspaces… (Jiminny Inc) Has new messages
Switch workspaces… (Jiminny Inc) Has new messages
Home
Home
DMs
DMs
Activity
Activity
Files
Files
Later
Later
More…
More
Unreads
Threads
Huddles
Drafts & sent
1
Directories
jiminny-x-integration-app
platform-inner-team
ai-chapter
alerts
backend
bugs
confusion-clinic
curiosity_lab
engineering
general
jiminny-bg
platform-tickets
product_launches
random
releases
sofia-office
support
thank-yous
the_people_of_jiminny
Vasil Vasilev
Nikolay Ivanov
Galya Dimitrova
Aneliya Angelova
,
Nikolay Yankov
,
Steliyan Georgiev
Stoyan Tanev
Stefka Stoyanova
Ves
Aneliya Angelova
James Graham
Lukas Kovalik
you
Toast
Jira Cloud
Messages
Messages
Add canvas
Add canvas
Files
Files
Pins
Pins
Add and Edit Channel Tabs
Canvas
List
Folder
Jump to date
Vasil Vasilev
Apr 28th at 4:51:31 PM
4:51 PM
a, ти искаш в amazon да добавим ключ за достъп до QAi ?
Apr 28th at 4:51:38 PM
4:51
Вес се грижи за тея неща
Apr 28th at 4:52:06 PM
4:52
дори не съм сигурен дали тоя ключ не трябва да бъде в CircleCI при билда на имиджа
Apr 28th at 4:52:10 PM
4:52
т.е.
Apr 28th at 4:52:12 PM
4:52
пак не знам
Lukas Kovalik
Apr 28th at 4:53:41 PM
4:53 PM
ок, ще питам Вес, мерси
Vasil Vasilev
Apr 28th at 5:00:16 PM
5:00 PM
моля
Jump to date
Vasil Vasilev
Today at 2:52:43 PM
2:52 PM
Лукаш, привет
Today at 2:52:48 PM
2:52
хвърли моля те едно око тука
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:52:49 PM
2:52
https://github.com/jiminny/app/pull/12059
https://github.com/jiminny/app/pull/12059
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:53:03 PM
2:53
опитвам се да оптимизирам процеса по индексиране на активитита за ЕС
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:54:16 PM
2:54
идеята е да намаля паметта която се ползва за да се генерира един бач от 100 активитита
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:54:35 PM
2:54
и после да увелича размера на бачовете, за да имаме по малко blocking операции в ЕС, като реиндексира
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 4:12:58 PM
4:12 PM
здрасти, изглежда ок, но когато го минах и през gemini ми даде един warning.
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:13:17 PM
4:13
Switch
cursor()
to
lazyById(250)
. It preserves the single-loop, generator-style code in the new version while restoring proper batched eager loading (avoiding N+1 on
getIndexableAttributes()
) and releasing the DB connection between chunks (avoiding long-held PDO connections during ES/Sentry calls).
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Vasil Vasilev
Today at 4:40:06 PM
4:40 PM
хм, интересна идея
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:41:03 PM
4:41
ще го проверя
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:41:17 PM
4:41
така или иначе в понеделник ще иде на прод, днес не ми се рискува
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
loading…
SlackFileEditViewGoHistoryWindowHelpLukás Koválik's No...ProGPHubspot API calls+n Home1000TestDailyAgents+ New agentWorkspace* Quick NoteWorkJira ticketView of SprintDailyPlanSprintStefka 1-1TododevEvaluationKnowledgera IdeasPrivateE Home viewsIntegration-appWork KnowledgeWork Knowledgetesting keyboard4Todo2 New chat x03 Hubspot / Hubspot API callsCritical Findings1. Line 1313 - rawsearchApi()->doSearch()- matchExlSresponse = Sthis->client->getNewInstance()->crm(• Goes completely around the Client wrapper - no 429• Uses the search rate limit bucket• Can be replaced with $this->client->search('contacts"2. Line 920-923 — companies()->searchByDomain() - m$hsAccounts = $this->client->getInstance()->compai• Uses v1 SDK's searchByDomainwhich calls a search e• No 429 protection• Cannot be trivially replaced with client->search() (diffePress 'space' for Al or 'l' for commands40QHomeDMsActivityFilesLater...MoreED→Jiminny... v# conrusion-clnic# curiosity_lab# engineering# general# jiminny-bg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi...• Direct messagese. Vasil Vasilevo Nikolay IvanovGalya DimitrovaAneliya Angelova, ...2 Stoyan Tanev €ã. Stefka StoyanovaC Vese. Aneliya Angelovado James GrahamLukas Kovalik y... O::: AppsToalJira Cloud100% CFri 8 May 17:25:04Describe what you are looking forVasil Vasilev6 0MessagesAdd canvasлукаш, привет@ Files< Pins+Todayхвърли моля те смгукаhttps://github.com/jiminny/app/pull/12059опитвам се да оптимизирам процеса поиндексиране на активитита за ЕСидеята е да намаля паметта която се ползва зада се генерира един бач от 100 активититаи после да увелича размера на бачовете, за даимаме по малко blocking операции в ЕС, катореиндексираLukas Kovalik 4:12 PMздрасти, изглежда ок, но когато го минах и презgemini ми даде един warning.Switch cursor() to lazyById(250) . It preservesthe single-loop, generator-style code in the newversion while restoring proper batched eagerloading (avoiding N+1 ongetIndexableAttributes() ) and releasing the DBconnection between chunks (avoiding long-heldPDO connections during ES/Sentry calls).Vasil Vasilev 4:40 PMхм, интересна идеяще го проверятака или иначе в понеделник ще иде на прод,днес не ми се рискуваMessage Vasil Vasilev+Aa..•...
|
Slack
|
Vasil Vasilev (DM) - Jiminny Inc - 3 new items - S Vasil Vasilev (DM) - Jiminny Inc - 3 new items - Slack...
|
NULL
|
10148
|
|
10147
|
Switch workspaces… (Jiminny Inc) Has new messages
Switch workspaces… (Jiminny Inc) Has new messages
Home
Home
DMs
DMs
Activity
Activity
Files
Files
Later
Later
More…
More
Unreads
Threads
Huddles
Drafts & sent
1
Directories
jiminny-x-integration-app
platform-inner-team
ai-chapter
alerts
backend
bugs
confusion-clinic
curiosity_lab
engineering
general
jiminny-bg
platform-tickets
product_launches
random
releases
sofia-office
support
thank-yous
the_people_of_jiminny
Vasil Vasilev
Nikolay Ivanov
Galya Dimitrova
Aneliya Angelova
,
Nikolay Yankov
,
Steliyan Georgiev
Stoyan Tanev
Stefka Stoyanova
Ves
Aneliya Angelova
James Graham
Lukas Kovalik
you
Toast
Jira Cloud
Messages
Messages
Add canvas
Add canvas
Files
Files
Pins
Pins
Add and Edit Channel Tabs
Canvas
List
Folder
Jump to date
Vasil Vasilev
Apr 28th at 4:51:31 PM
4:51 PM
a, ти искаш в amazon да добавим ключ за достъп до QAi ?
Apr 28th at 4:51:38 PM
4:51
Вес се грижи за тея неща
Apr 28th at 4:52:06 PM
4:52
дори не съм сигурен дали тоя ключ не трябва да бъде в CircleCI при билда на имиджа
Apr 28th at 4:52:10 PM
4:52
т.е.
Apr 28th at 4:52:12 PM
4:52
пак не знам
Lukas Kovalik
Apr 28th at 4:53:41 PM
4:53 PM
ок, ще питам Вес, мерси
Vasil Vasilev
Apr 28th at 5:00:16 PM
5:00 PM
моля
Jump to date
Vasil Vasilev
Today at 2:52:43 PM
2:52 PM
Лукаш, привет
Today at 2:52:48 PM
2:52
хвърли моля те едно око тука
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:52:49 PM
2:52
https://github.com/jiminny/app/pull/12059
https://github.com/jiminny/app/pull/12059
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:53:03 PM
2:53
опитвам се да оптимизирам процеса по индексиране на активитита за ЕС
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:54:16 PM
2:54
идеята е да намаля паметта която се ползва за да се генерира един бач от 100 активитита
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:54:35 PM
2:54
и после да увелича размера на бачовете, за да имаме по малко blocking операции в ЕС, като реиндексира
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 4:12:58 PM
4:12 PM
здрасти, изглежда ок, но когато го минах и през gemini ми даде един warning.
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:13:17 PM
4:13
Switch
cursor()
to
lazyById(250)
. It preserves the single-loop, generator-style code in the new version while restoring proper batched eager loading (avoiding N+1 on
getIndexableAttributes()
) and releasing the DB connection between chunks (avoiding long-held PDO connections during ES/Sentry calls).
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Vasil Vasilev
Today at 4:40:06 PM
4:40 PM
хм, интересна идея
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:41:03 PM
4:41
ще го проверя
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:41:17 PM
4:41
така или иначе в понеделник ще иде на прод, днес не ми се рискува
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
PhostorimcodeFV faVsco.js?9 JY-20725-handle-HS-search-rate-limiProledey(© RemoteCrmobjectmanif © HubspotSyncStrategybase.png€ ResponseNormalize.pheCachedcrmservicebecorator.onpsyncrielaAction.ong© SyncRelatedActivityMar© MatchActivityCrmData.php© CrmActivityService.phgc) MatchermDatc wednooksynebalchrrov O IntegrationAppdosearchx 5 Cc WTIY:>D Accessors> Api• contiaO DTOW) FiltersM.lobsclass service excenas baseservice znpcemencs903904 Cpubuic tunccion macchbybomaln scring saomain, tinc suserla = nulu: rarrayProspectSearchStrateg)ServiceTraitsC) DataClient.oho© DecorateActivity.php© LocalSearch.phpelocalSearchinterface.of© RemoteSearch.php(C) Service.phpv Ml isteners913© ConvertLeadActivities.p© PurgeLookupCache.php> D MetadataD Migration[ Pipedrive915917>C FieldsC OpportunityMatcher> @ OpportunitySyncStrated921›_ Prospectsearchstrateay>W ServiceTraits925(c) Client.phpc) [EMAIL]) FieldDefinitions.onvC) PavloadBuilder.ohv929930(C) Profile, ohoC) @uervBuilder.ohoC) @uerv.andler.ohoC) @uerviterator nhol9331934(C) @uervRecults.nhn© Service.php(C) SvncRatchRedicServicescompanyname = soomarn'Try to find a company matchina their emall domain.ScompanyProperties = ['hs avatar filemanader key!.try 1ShsAccounts = Sthis->clientl->getInstance->comnaniesol->ceanchRvlomain(ScomnanvName ScomnanvPronenties)•} catch (Throwable $e) {Sthis->logger->info('[HubSpot] Search failed', ['error' => $e->getMessage()D):return nulbSaccount = null:I/ If there are multiple accounts. don'+ quess.we'll ask laterif count(ShsAccounts->data->results) zz= 10 <Persist this remote obiect.Saccount = Sthis->svncAccount(ShsAccounts->data->results10l->comoanvid0•M Traite© BaseClient.php© BaseService.php(C CachodGrm CorvicaDacoratSdata = Sthis->conventcrmlatald contact: niin Saccount, Susentd).© CountryCodeResolver.php4) CrmActivitvProviderintegraneturn I emntvlannav filten(Sdata)) ? Sdata • null-rilo May 1/:20.09© ProspectCache.phpB7B48 MMSSATATl HI=custom.log ^4 SF (jiminny@localhost]4 HS_local (jiminny@localhost]# console [PKou.# console leu)# console [slAGiNg)[2026-05-07 14:21:15] local.INF0: [Hubspot] DEBUG Getting headers {"neaders".?"Uace":L"Inu,or May 2020 14.21.15 6Ml"Jn"Transter-Encod1nq":"chunked")."Connection":"keep-alive""CF-Ray" : ["9f80deb8db60dc3a-SOF"],"Strict-Transport-Secur1ty":"max-aqe=31536008* 1ncLudeSubDomains: preload")nacceot-encodino""server-timing": ["hcid;desc=\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\","x-hubspot-correlation-id":["019e02d0-6fd8-7812-bdba-885b7ccb3ee3"],"So+-Cookie"." c+hm-Stlirtd0aXVr.kSandas6hzVVKhzTn0BidvMaheCtm0V-1778163675-1.0.107-May-26 14:51:15 GMT; domain=.hubapi.com; Http0nly; Secure; SameSite=None"],"Renont-To".f"*"endpoints\":[{"unl".httns:la.nel.cloudflane.com./nenon+W/v42c=NVA1cVTPQfVm32anS0#xVF/sd2RN\"group\":\"cf-nel\","max_age\":604800}"]|"NEL": ["1success_traccion.0.01rreportto. "cr-nel,"max age":604800}"]"Server": ["cloudflare"]}} {"correlation_1d":"95256555-ec78-4541-b9za-adta/Sb6Yeab"."trace_10":C/AD8565-905t-4604-9405-0e5b551e5545CascadeHubspot Rate LimitindAskJiminnyReportActivityServiceTest -Hubspot Rate Limit ReInvestigating Rate LinNew CascadeHubspot CRM Call Re- 11I1Actions/SyncArchivedProfilesAction.phpCallVia executeRequest()?Rate Limitapp/Services/Activity/HubSpot/Service.phpThis service uses Sthis=›crmService (the CRM Service.oho))- it makes no direct HubSpot APl calls itselt. All calls delegate through crmservice-›aetcal10, crmService->searchCallsForPeriod(), crmService->syncOpportunity(), crmService->parseRecords() .Critical Findings1. Line 1313 - raw searchApi→>doSearch - matchExactlyByParticipantinService.po:#Service.oho:1313)Sresponse = sthis->cuient->aetNewinstance->crmo->contactso-searchAoi->doSearchSoavload):• Goes comoletelv around the Client wraoper — no 429 handlina, no Ratel imitFxcention. no rate limit awareness•Uses the search rate limit bucket• Can be replaced with $this->client-›search('contacts', $payload) - same endpoint, same result, adds 429 protection,tine 020.022-comnandoctl.sconrchRuhorninfl_matchRuDomain/).• Service.php:920-923ShsAccounts = $this->client->getInstance()->companies()->searchByDomain(ScompanyName, ScompanyProperties):• Uses v1 SDK's searchByDomain which calls a search endooint — hits the search rate limit bucket• No 429 protection• Cannot be trivially replaced with client-›search() (different endpoint/format), but could be wrapped in executeRequest ()2.detdnnortunitvRvldhac executeReauestcommented out.• Client.php:238-239$deal = Sthis->executeRequest(fn () => $this->getNewInstance()->crm()->deals()->basicApi()->getById(• Deliberatelv disabled _ this means sinale deal fetches in HubsootSingleSvncStrateav also aet no 429 protection.Ask anvthina (&4L)Tnl "896-20UITE.Rfo 4 spaces...
|
Slack
|
Vasil Vasilev (DM) - Jiminny Inc - 3 new items - S Vasil Vasilev (DM) - Jiminny Inc - 3 new items - Slack...
|
NULL
|
10147
|
|
10146
|
Switch workspaces… (Jiminny Inc) Has new messages
Switch workspaces… (Jiminny Inc) Has new messages
Home
Home
DMs
DMs
Activity
Activity
Files
Files
Later
Later
More…
More
Unreads
Threads
Huddles
Drafts & sent
1
Directories
jiminny-x-integration-app
platform-inner-team
ai-chapter
alerts
backend
bugs
confusion-clinic
curiosity_lab
engineering
general
jiminny-bg
platform-tickets
product_launches
random
releases
sofia-office
support
thank-yous
the_people_of_jiminny
Vasil Vasilev
Nikolay Ivanov
Galya Dimitrova
Aneliya Angelova
,
Nikolay Yankov
,
Steliyan Georgiev
Stoyan Tanev
Stefka Stoyanova
Ves
Aneliya Angelova
James Graham
Lukas Kovalik
you
Toast
Jira Cloud
Messages
Messages
Add canvas
Add canvas
Files
Files
Pins
Pins
Add and Edit Channel Tabs
Canvas
List
Folder
Jump to date
Vasil Vasilev
Apr 28th at 4:51:31 PM
4:51 PM
a, ти искаш в amazon да добавим ключ за достъп до QAi ?
Apr 28th at 4:51:38 PM
4:51
Вес се грижи за тея неща
Apr 28th at 4:52:06 PM
4:52
дори не съм сигурен дали тоя ключ не трябва да бъде в CircleCI при билда на имиджа
Apr 28th at 4:52:10 PM
4:52
т.е.
Apr 28th at 4:52:12 PM
4:52
пак не знам
Lukas Kovalik
Apr 28th at 4:53:41 PM
4:53 PM
ок, ще питам Вес, мерси
Vasil Vasilev
Apr 28th at 5:00:16 PM
5:00 PM
моля
Jump to date
Vasil Vasilev
Today at 2:52:43 PM
2:52 PM
Лукаш, привет
Today at 2:52:48 PM
2:52
хвърли моля те едно око тука
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:52:49 PM
2:52
https://github.com/jiminny/app/pull/12059
https://github.com/jiminny/app/pull/12059
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:53:03 PM
2:53
опитвам се да оптимизирам процеса по индексиране на активитита за ЕС
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:54:16 PM
2:54
идеята е да намаля паметта която се ползва за да се генерира един бач от 100 активитита
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:54:35 PM
2:54
и после да увелича размера на бачовете, за да имаме по малко blocking операции в ЕС, като реиндексира
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 4:12:58 PM
4:12 PM
здрасти, изглежда ок, но когато го минах и през gemini ми даде един warning.
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:13:17 PM
4:13
Switch
cursor()
to
lazyById(250)
. It preserves the single-loop, generator-style code in the new version while restoring proper batched eager loading (avoiding N+1 on
getIndexableAttributes()
) and releasing the DB connection between chunks (avoiding long-held PDO connections during ES/Sentry calls).
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Vasil Vasilev
Today at 4:40:06 PM
4:40 PM
хм, интересна идея
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:41:03 PM
4:41
ще го проверя
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:41:17 PM
4:41
така или иначе в понеделник ще иде на прод, днес не ми се рискува
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
loading…
SlackFileEditViewGoHistoryWindowHelpLukás Koválik's No...ProGPHubspot API calls+n Home1000TestDailyAgents+ New agentWorkspace* Quick NoteWorkJira ticketView of SprintDailyPlanSprintStefka 1-1TododevEvaluationKnowledgera IdeasPrivateE Home viewsIntegration-appWork KnowledgeWork Knowledgetesting keyboard4Todo2 New chat x03 Hubspot / Hubspot API callsCritical Findings1. Line 1313 - rawsearchApi()->doSearch()- matchExlSresponse = Sthis->client->getNewInstance()->crm(• Goes completely around the Client wrapper - no 429• Uses the search rate limit bucket• Can be replaced with $this->client->search('contacts"2. Line 920-923 — companies()->searchByDomain() - m$hsAccounts = $this->client->getInstance()->compai• Uses v1 SDK's searchByDomainwhich calls a search e• No 429 protection• Cannot be trivially replaced with client->search() (diffePress 'space' for Al or 'l' for commands40QHomeDMsActivityFilesLater...MoreED→Jiminny... v# conrusion-clnic# curiosity_lab# engineering# general# jiminny-bg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi...• Direct messagese. Vasil Vasilevo Nikolay IvanovGalya DimitrovaAneliya Angelova, ...2 Stoyan Tanev €ã. Stefka StoyanovaC Vese. Aneliya Angelovado James GrahamLukas Kovalik y... O::: AppsToalJira Cloud100% CFri 8 May 17:24:31Describe what you are looking forVasil Vasilev6 0MessagesAdd canvasлукаш, привет@ Files< Pins+Todayхвърли моля те смгукаhttps://github.com/jiminny/app/pull/12059опитвам се да оптимизирам процеса поиндексиране на активитита за ЕСидеята е да намаля паметта която се ползва зада се генерира един бач от 100 активититаи после да увелича размера на бачовете, за даимаме по малко blocking операции в ЕС, катореиндексираLukas Kovalik 4:12 PMздрасти, изглежда ок, но когато го минах и презgemini ми даде един warning.Switch cursor() to lazyById(250) . It preservesthe single-loop, generator-style code in the newversion while restoring proper batched eagerloading (avoiding N+1 ongetIndexableAttributes() ) and releasing the DBconnection between chunks (avoiding long-heldPDO connections during ES/Sentry calls).Vasil Vasilev 4:40 PMхм, интересна идеяще го проверятака или иначе в понеделник ще иде на прод,днес не ми се рискуваMessage Vasil Vasilev+Aa..•...
|
Slack
|
Vasil Vasilev (DM) - Jiminny Inc - 3 new items - S Vasil Vasilev (DM) - Jiminny Inc - 3 new items - Slack...
|
NULL
|
10146
|
|
10145
|
Switch workspaces… (Jiminny Inc) Has new messages
Switch workspaces… (Jiminny Inc) Has new messages
Home
Home
DMs
DMs
Activity
Activity
Files
Files
Later
Later
More…
More
Unreads
Threads
Huddles
Drafts & sent
1
Directories
jiminny-x-integration-app
platform-inner-team
ai-chapter
alerts
backend
bugs
confusion-clinic
curiosity_lab
engineering
general
jiminny-bg
platform-tickets
product_launches
random
releases
sofia-office
support
thank-yous
the_people_of_jiminny
Vasil Vasilev
Nikolay Ivanov
Galya Dimitrova
Aneliya Angelova
,
Nikolay Yankov
,
Steliyan Georgiev
Stoyan Tanev
Stefka Stoyanova
Ves
Aneliya Angelova
James Graham
Lukas Kovalik
you
Toast
Jira Cloud
Messages
Messages
Add canvas
Add canvas
Files
Files
Pins
Pins
Add and Edit Channel Tabs
Canvas
List
Folder
Jump to date
Vasil Vasilev
Apr 28th at 4:51:31 PM
4:51 PM
a, ти искаш в amazon да добавим ключ за достъп до QAi ?
Apr 28th at 4:51:38 PM
4:51
Вес се грижи за тея неща
Apr 28th at 4:52:06 PM
4:52
дори не съм сигурен дали тоя ключ не трябва да бъде в CircleCI при билда на имиджа
Apr 28th at 4:52:10 PM
4:52
т.е.
Apr 28th at 4:52:12 PM
4:52
пак не знам
Lukas Kovalik
Apr 28th at 4:53:41 PM
4:53 PM
ок, ще питам Вес, мерси
Vasil Vasilev
Apr 28th at 5:00:16 PM
5:00 PM
моля
Jump to date
Vasil Vasilev
Today at 2:52:43 PM
2:52 PM
Лукаш, привет
Today at 2:52:48 PM
2:52
хвърли моля те едно око тука
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:52:49 PM
2:52
https://github.com/jiminny/app/pull/12059
https://github.com/jiminny/app/pull/12059
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:53:03 PM
2:53
опитвам се да оптимизирам процеса по индексиране на активитита за ЕС
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:54:16 PM
2:54
идеята е да намаля паметта която се ползва за да се генерира един бач от 100 активитита
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:54:35 PM
2:54
и после да увелича размера на бачовете, за да имаме по малко blocking операции в ЕС, като реиндексира
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 4:12:58 PM
4:12 PM
здрасти, изглежда ок, но когато го минах и през gemini ми даде един warning.
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:13:17 PM
4:13
Switch
cursor()
to
lazyById(250)
. It preserves the single-loop, generator-style code in the new version while restoring proper batched eager loading (avoiding N+1 on
getIndexableAttributes()
) and releasing the DB connection between chunks (avoiding long-held PDO connections during ES/Sentry calls).
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Vasil Vasilev
Today at 4:40:06 PM
4:40 PM
хм, интересна идея
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:41:03 PM
4:41
ще го проверя
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:41:17 PM
4:41
така или иначе в понеделник ще иде на прод, днес не ми се рискува
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
loading…
PhostorimcodeFV faVsco.js?9 JY-20725-handle-HS-search-rate-limiProledey(© RemoteCrmobjectmanif © HubspotSyncStrategybase.png€ ResponseNormalize.pheCachedcrmservicebecorator.onpsyncrielaAction.ong© SyncRelatedActivityMar© MatchActivityCrmData.php© CrmActivityService.phgc) MatchermDatc wednooksynebalchrrov O IntegrationAppdosearchx 5 Cc WTIY:>D Accessors> Api• contiaO DTOW) FiltersM.lobsclass service excenas baseservice znpcemencs903904 Cpubuic tunccion macchbybomaln scring saomain, tinc suserla = nulu: rarrayProspectSearchStrateg)ServiceTraitsC) DataClient.oho© DecorateActivity.php© LocalSearch.phpelocalSearchinterface.of© RemoteSearch.php(C) Service.phpv Ml isteners913© ConvertLeadActivities.p© PurgeLookupCache.php> D MetadataD Migration[ Pipedrive915917>C Fields0 OpportunityMatcher> @ OpportunitySyncStrated921›_ Prospectsearchstrateay>W ServiceTraits925(c) Client.phpc) [EMAIL]) FieldDefinitions.onvC) PavloadBuilder.ohv929930(C) Profile, ohoC) @uervBuilder.ohoC) @uerv.andler.ohoC) @uerviterator nhol9331934(C) @uervRecults.nhn© Service.php(C) SvncRatchRedicServicescompanyname = soomarn'Try to find a company matchina their emall domain.ScompanyProperties = ['hs avatar filemanader key!.try 1ShsAccounts = Sthis->clientl->getInstance->comnaniesol->ceanchRvlomain(ScomnanvName ScomnanvPronenties)•} catch (Throwable $e) {Sthis->logger->info('[HubSpot] Search failed', ['error' => $e->getMessage()D):return nulbSaccount = null:I/ If there are multiple accounts. don'+ quess.we'll ask laterif count(ShsAccounts->data->results) zz= 10 <Persist this remote obiect.Saccount = Sthis->svncAccount(ShsAccounts->data->results10l->comoanvid0•M Traite© BaseClient.php© BaseService.php(C CachodGrm CorvicaDacoratSdata = Sthis->conventcrmlatald contact: niin Saccount, Susentd).© CountryCodeResolver.php4) CrmActivitvProviderintegraneturn I emntvlannav filten(Sdata)) ? Sdata • null-ril o May 1/:24.30© ProspectCache.phpB7B48 MMSSATATl HI=custom.log ^A SF (jiminny@localhost]4 HS_local (jiminny@localhost]# console [PKou.# console leu)# console [slAGiNg)[2026-05-07 14:21:15] local.INF0: [Hubspot] DEBUG Getting headers {"neaders".?"Uace":L"Inu,or May 2020 14.21.15 6Ml"Jn"Transter-Encod1nq":"chunked")."Connection":"keep-alive""CF-Ray" : ["9f80deb8db60dc3a-SOF"],"Strict-Transport-Secur1ty":"max-aqe=31536008* 1ncLudeSubDomains: preload")nacceot-encodino""server-timing": ["hcid;desc=\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\","x-hubspot-correlation-id":["019e02d0-6fd8-7812-bdba-885b7ccb3ee3"],"So+-Cookie"." c+hm-Stlirtd0aXVr.kSandas6hzVVKhzTn0BidvMaheCtm0V-1778163675-1.0.107-May-26 14:51:15 GMT; domain=.hubapi.com; Http0nly; Secure; SameSite=None"],"Renont-To".f"*"endpoints\":[{"unl".httns:la.nel.cloudflane.com./nenon+W/v42c=NVA1cVTPQfVm32anS0#xVF/sd2RN\"group\":\"cf-nel\","max_age\":604800}"]|"NEL": ["1success_traccion.0.01rreportto. "cr-nel,"max age":604800}"]"Server": ["cloudflare"]}} {"correlation_1d":"95256555-ec78-4541-b9za-adta/Sb6Yeab"."trace_10":C/AD8565-905t-4604-9405-0e5b551e5545CascadeHubspot Rate LimitindAskJiminnyReportActivityServiceTest -Hubspot Rate Limit ReInvestigating Rate LinNew CascadeHubspot CRM Call Re- 11I1Actions/SyncArchivedProfilesAction.phpCallVia executeRequest()?Rate Limitapp/Services/Activity/HubSpot/Service.phpThis service uses Sthis=›crmService (the CRM Service.oho))- it makes no direct HubSpot APl calls itselt. All calls delegate through crmservice-›aetcal10, crmService->searchCallsForPeriod(), crmService->syncOpportunity(), crmService->parseRecords() .Critical Findings1. Line 1313 - raw searchApi→>doSearch - matchExactlyByParticipantinService.po:#Service.oho:1313)Sresponse = sthis->cuient->aetNewinstance->crmo->contactso-searchAoi->doSearchSoavload):• Goes comoletelv around the Client wraoper — no 429 handlina, no Ratel imitFxcention. no rate limit awareness•Uses the search rate limit bucket• Can be replaced with $this->client-›search('contacts', $payload) - same endpoint, same result, adds 429 protection,tine 020.022-comnandoctl.sconrchRuhorninfl_matchRuDomain/).• Service.php:920-923ShsAccounts = $this->client->getInstance()->companies()->searchByDomain(ScompanyName, ScompanyProperties):• Uses v1 SDK's searchByDomain which calls a search endooint — hits the search rate limit bucket• No 429 protection• Cannot be trivially replaced with client-›search() (different endpoint/format), but could be wrapped in executeRequest ()2.detdnnortunitvRvldhac executeReauestcommented out.• Client.php:238-239$deal = Sthis->executeRequest(fn () => $this->getNewInstance()->crm()->deals()->basicApi()->getById(• Deliberatelv disabled _ this means sinale deal fetches in HubsootSingleSvncStrateav also aet no 429 protection.Ask anvthina (&4L)Tnl "896-20UITE.Rfo 4 spaces...
|
Slack
|
Vasil Vasilev (DM) - Jiminny Inc - 3 new items - S Vasil Vasilev (DM) - Jiminny Inc - 3 new items - Slack...
|
NULL
|
10145
|
|
10144
|
Switch workspaces… (Jiminny Inc) Has new messages
Switch workspaces… (Jiminny Inc) Has new messages
Home
Home
DMs
DMs
Activity
Activity
Files
Files
Later
Later
More…
More
Unreads
Threads
Huddles
Drafts & sent
1
Directories
jiminny-x-integration-app
platform-inner-team
ai-chapter
alerts
backend
bugs
confusion-clinic
curiosity_lab
engineering
general
jiminny-bg
platform-tickets
product_launches
random
releases
sofia-office
support
thank-yous
the_people_of_jiminny
Vasil Vasilev
Nikolay Ivanov
Galya Dimitrova
Aneliya Angelova
,
Nikolay Yankov
,
Steliyan Georgiev
Stoyan Tanev
Stefka Stoyanova
Ves
Aneliya Angelova
James Graham
Lukas Kovalik
you
Toast
Jira Cloud
Messages
Messages
Add canvas
Add canvas
Files
Files
Pins
Pins
Add and Edit Channel Tabs
Canvas
List
Folder
Jump to date
Vasil Vasilev
Apr 28th at 4:51:31 PM
4:51 PM
a, ти искаш в amazon да добавим ключ за достъп до QAi ?
Apr 28th at 4:51:38 PM
4:51
Вес се грижи за тея неща
Apr 28th at 4:52:06 PM
4:52
дори не съм сигурен дали тоя ключ не трябва да бъде в CircleCI при билда на имиджа
Apr 28th at 4:52:10 PM
4:52
т.е.
Apr 28th at 4:52:12 PM
4:52
пак не знам
Lukas Kovalik
Apr 28th at 4:53:41 PM
4:53 PM
ок, ще питам Вес, мерси
Vasil Vasilev
Apr 28th at 5:00:16 PM
5:00 PM
моля
Jump to date
Vasil Vasilev
Today at 2:52:43 PM
2:52 PM
Лукаш, привет
Today at 2:52:48 PM
2:52
хвърли моля те едно око тука
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:52:49 PM
2:52
https://github.com/jiminny/app/pull/12059
https://github.com/jiminny/app/pull/12059
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:53:03 PM
2:53
опитвам се да оптимизирам процеса по индексиране на активитита за ЕС
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:54:16 PM
2:54
идеята е да намаля паметта която се ползва за да се генерира един бач от 100 активитита
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:54:35 PM
2:54
и после да увелича размера на бачовете, за да имаме по малко blocking операции в ЕС, като реиндексира
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 4:12:58 PM
4:12 PM
здрасти, изглежда ок, но когато го минах и през gemini ми даде един warning.
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:13:17 PM
4:13
Switch
cursor()
to
lazyById(250)
. It preserves the single-loop, generator-style code in the new version while restoring proper batched eager loading (avoiding N+1 on
getIndexableAttributes()
) and releasing the DB connection between chunks (avoiding long-held PDO connections during ES/Sentry calls).
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Vasil Vasilev
Today at 4:40:06 PM
4:40 PM
хм, интересна идея
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:41:03 PM
4:41
ще го проверя
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:41:17 PM
4:41
така или иначе в понеделник ще иде на прод, днес не ми се рискува
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
loading…
SlackFileEditViewGoHistoryWindowHelpLukás Koválik's No...ProGPHubspot API calls+n Home1000TestDailyAgents+ New agentWorkspace* Quick NoteWorkJira ticketView of SprintDailyPlanSprintStefka 1-1TododevEvaluationKnowledgera IdeasPrivateE Home viewsIntegration-appWork KnowledgeWork Knowledgetesting keyboard4Todo2 New chat x03 Hubspot / Hubspot API callsCritical Findings1. Line 1313 - rawsearchApi()->doSearch()- matchExlSresponse = Sthis->client->getNewInstance()->crm(• Goes completely around the Client wrapper - no 429• Uses the search rate limit bucket• Can be replaced with $this->client->search('contacts"2. Line 920-923 — companies()->searchByDomain() - m$hsAccounts = $this->client->getInstance()->compai• Uses v1 SDK's searchByDomainwhich calls a search e• No 429 protection• Cannot be trivially replaced with client->search() (diffePress 'space' for Al or 'l' for commands40QHomeDMsActivityFilesLater...MoreED→Jiminny... v# conrusion-clnic# curiosity_lab# engineering# general# jiminny-bg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi...• Direct messagese. Vasil Vasilevo Nikolay IvanovGalya DimitrovaAneliya Angelova, ...2 Stoyan Tanev €ã. Stefka StoyanovaC Vese. Aneliya Angelovado James GrahamLukas Kovalik y... O::: AppsToalJira Cloud100% CFri 8 May 17:23:58Describe what you are looking forVasil Vasilev6 0MessagesAdd canvasлукаш, привет@ Files< Pins+Todayхвърли моля те смгукаhttps://github.com/jiminny/app/pull/12059опитвам се да оптимизирам процеса поиндексиране на активитита за ЕСидеята е да намаля паметта която се ползва зада се генерира един бач от 100 активититаи после да увелича размера на бачовете, за даимаме по малко blocking операции в ЕС, катореиндексираLukas Kovalik 4:12 PMздрасти, изглежда ок, но когато го минах и презgemini ми даде един warning.Switch cursor() to lazyById(250) . It preservesthe single-loop, generator-style code in the newversion while restoring proper batched eagerloading (avoiding N+1 ongetIndexableAttributes() ) and releasing the DBconnection between chunks (avoiding long-heldPDO connections during ES/Sentry calls).Vasil Vasilev 4:40 PMхм, интересна идеяще го проверятака или иначе в понеделник ще иде на прод,днес не ми се рискуваMessage Vasil Vasilev+Aa..•...
|
Slack
|
Vasil Vasilev (DM) - Jiminny Inc - 3 new items - S Vasil Vasilev (DM) - Jiminny Inc - 3 new items - Slack...
|
NULL
|
10144
|
|
10143
|
Switch workspaces… (Jiminny Inc) Has new messages
Switch workspaces… (Jiminny Inc) Has new messages
Home
Home
DMs
DMs
Activity
Activity
Files
Files
Later
Later
More…
More
Unreads
Threads
Huddles
Drafts & sent
1
Directories
jiminny-x-integration-app
platform-inner-team
ai-chapter
alerts
backend
bugs
confusion-clinic
curiosity_lab
engineering
general
jiminny-bg
platform-tickets
product_launches
random
releases
sofia-office
support
thank-yous
the_people_of_jiminny
Vasil Vasilev
Nikolay Ivanov
Galya Dimitrova
Aneliya Angelova
,
Nikolay Yankov
,
Steliyan Georgiev
Stoyan Tanev
Stefka Stoyanova
Ves
Aneliya Angelova
James Graham
Lukas Kovalik
you
Toast
Jira Cloud
Messages
Messages
Add canvas
Add canvas
Files
Files
Pins
Pins
Add and Edit Channel Tabs
Canvas
List
Folder
Jump to date
Vasil Vasilev
Apr 28th at 4:51:31 PM
4:51 PM
a, ти искаш в amazon да добавим ключ за достъп до QAi ?
Apr 28th at 4:51:38 PM
4:51
Вес се грижи за тея неща
Apr 28th at 4:52:06 PM
4:52
дори не съм сигурен дали тоя ключ не трябва да бъде в CircleCI при билда на имиджа
Apr 28th at 4:52:10 PM
4:52
т.е.
Apr 28th at 4:52:12 PM
4:52
пак не знам
Lukas Kovalik
Apr 28th at 4:53:41 PM
4:53 PM
ок, ще питам Вес, мерси
Vasil Vasilev
Apr 28th at 5:00:16 PM
5:00 PM
моля
Jump to date
Vasil Vasilev
Today at 2:52:43 PM
2:52 PM
Лукаш, привет
Today at 2:52:48 PM
2:52
хвърли моля те едно око тука
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:52:49 PM
2:52
https://github.com/jiminny/app/pull/12059
https://github.com/jiminny/app/pull/12059
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:53:03 PM
2:53
опитвам се да оптимизирам процеса по индексиране на активитита за ЕС
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:54:16 PM
2:54
идеята е да намаля паметта която се ползва за да се генерира един бач от 100 активитита
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:54:35 PM
2:54
и после да увелича размера на бачовете, за да имаме по малко blocking операции в ЕС, като реиндексира
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 4:12:58 PM
4:12 PM
здрасти, изглежда ок, но когато го минах и през gemini ми даде един warning.
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:13:17 PM
4:13
Switch
cursor()
to
lazyById(250)
. It preserves the single-loop, generator-style code in the new version while restoring proper batched eager loading (avoiding N+1 on
getIndexableAttributes()
) and releasing the DB connection between chunks (avoiding long-held PDO connections during ES/Sentry calls).
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Vasil Vasilev
Today at 4:40:06 PM
4:40 PM
хм, интересна идея
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:41:03 PM
4:41
ще го проверя
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:41:17 PM
4:41
така или иначе в понеделник ще иде на прод, днес не ми се рискува
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
loading…
PhostorimcodeFV faVsco.js?9 JY-20725-handle-HS-search-rate-limiProledey(© RemoteCrmobjectmanif © HubspotSyncStrategybase.png€ ResponseNormalize.pheCachedcrmservicebecorator.onpsyncrielaAction.ong© SyncRelatedActivityMar© MatchActivityCrmData.php© CrmActivityService.phgc) MatchermDatc wednooksynebalchrrov O IntegrationAppdosearchx 5 Cc WTIY:>D Accessors> Api• contiaO DTOW) FiltersM.lobsclass service excenas baseservice znpcemencs903904 Cpubuic tunccion macchbybomaln scring saomain, tinc suserla = nulu: rarrayProspectSearchStrateg)ServiceTraitsC) DataClient.oho© DecorateActivity.php© LocalSearch.phpelocalSearchinterface.of© RemoteSearch.php(C) Service.phpv Ml isteners913© ConvertLeadActivities.p© PurgeLookupCache.php> D MetadataD Migration[ Pipedrive915917>C Fields0 OpportunityMatcher> @ OpportunitySyncStrated921›_ Prospectsearchstrateay>W ServiceTraits925(c) Client.phpc) [EMAIL]) FieldDefinitions.onvC) PavloadBuilder.ohv929930(C) Profile, ohoC) @uervBuilder.ohoC) @uerv.andler.ohoC) @uerviterator nhol9331934(C) @uervRecults.nhn© Service.php(C) SvncRatchRedicServicescompanyname = soomarn'Try to find a company matchina their emall domain.ScompanyProperties = ['hs avatar filemanader key!.try 1ShsAccounts = Sthis->clientl->getInstance->comnaniesol->ceanchRvlomain(ScomnanvName ScomnanvPronenties)•} catch (Throwable $e) {Sthis->logger->info('[HubSpot] Search failed', ['error' => $e->getMessage()D):return nulbSaccount = null:I/ If there are multiple accounts. don'+ quess.we'll ask laterif count(ShsAccounts->data->results) zz= 10 <Persist this remote obiect.Saccount = Sthis->svncAccount(ShsAccounts->data->results10l->comoanvid0•M Traite© BaseClient.php© BaseService.php(C CachodGrm CorvicaDacoratSdata = Sthis->conventcrmlatald contact: niin Saccount, Susentd).© CountryCodeResolver.php4) CrmActivitvProviderintegraneturn I emntvlannav filten(Sdata)) ? Sdata • null-rilo May 11:23.00© ProspectCache.phpB7B48 MMSSATATl HI=custom.log ^A SF (jiminny@localhost]4 HS_local (jiminny@localhost]# console [PKou.# console leu)# console [slAGiNg)[2026-05-07 14:21:15] local.INF0: [Hubspot] DEBUG Getting headers {"neaders".?"Uace":L"Inu,or May 2020 14.21.15 6Ml"Jn"Transter-Encod1nq":"chunked")."Connection":"keep-alive""CF-Ray" : ["9f80deb8db60dc3a-SOF"],"Strict-Transport-Secur1ty":"max-aqe=31536008* 1ncLudeSubDomains: preload")nacceot-encodino""server-timing": ["hcid;desc=\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\","x-hubspot-correlation-id":["019e02d0-6fd8-7812-bdba-885b7ccb3ee3"],"So+-Cookie"." c+hm-Stlirtd0aXVr.kSandas6hzVVKhzTn0BidvMaheCtm0V-1778163675-1.0.107-May-26 14:51:15 GMT; domain=.hubapi.com; Http0nly; Secure; SameSite=None"],"Renont-To".f"*"endpoints\":[{"unl".httns:la.nel.cloudflane.com./nenon+W/v42c=NVA1cVTPQfVm32anS0#xVF/sd2RN\"group\":\"cf-nel\","max_age\":604800}"]|"NEL": ["1success_traccion.0.01rreportto. "cr-nel,"max age":604800}"]"Server": ["cloudflare"]}} {"correlation_1d":"95256555-ec78-4541-b9za-adta/Sb6Yeab"."trace_10":C/AD8565-905t-4604-9405-0e5b551e5545CascadeHubspot Rate LimitindAskJiminnyReportActivityServiceTest -Hubspot Rate Limit ReInvestigating Rate LinNew CascadeHubspot CRM Call Re- 11I1Actions/SyncArchivedProfilesAction.phpCallVia executeRequest()?Rate Limitapp/Services/Activity/HubSpot/Service.phpThis service uses Sthis=›crmService (the CRM Service.oho))- it makes no direct HubSpot APl calls itselt. All calls delegate through crmservice-›aetcal10, crmService->searchCallsForPeriod(), crmService->syncOpportunity(), crmService->parseRecords() .Critical Findings1. Line 1313 - raw searchApi→>doSearch - matchExactlyByParticipantinService.po:#Service.oho:1313)Sresponse = sthis->cuient->aetNewinstance->crmo->contactso-searchAoi->doSearchSoavload):• Goes comoletelv around the Client wraoper — no 429 handlina, no Ratel imitFxcention. no rate limit awareness•Uses the search rate limit bucket• Can be replaced with $this->client-›search('contacts', $payload) - same endpoint, same result, adds 429 protection,tine 020.022-comnandoctl.sconrchRuhorninfl_matchRuDomain/).• Service.php:920-923ShsAccounts = $this->client->getInstance()->companies()->searchByDomain(ScompanyName, ScompanyProperties):• Uses v1 SDK's searchByDomain which calls a search endooint — hits the search rate limit bucket• No 429 protection• Cannot be trivially replaced with client-›search() (different endpoint/format), but could be wrapped in executeRequest ()2.detdnnortunitvRvldhac executeReauestcommented out.• Client.php:238-239$deal = Sthis->executeRequest(fn () => $this->getNewInstance()->crm()->deals()->basicApi()->getById(• Deliberatelv disabled _ this means sinale deal fetches in HubsootSingleSvncStrateav also aet no 429 protection.Ask anvthina (&4L)Tnl "896-20UITE.Rfo 4 spaces...
|
Slack
|
Vasil Vasilev (DM) - Jiminny Inc - 3 new items - S Vasil Vasilev (DM) - Jiminny Inc - 3 new items - Slack...
|
NULL
|
10143
|
|
10142
|
Switch workspaces… (Jiminny Inc) Has new messages
Switch workspaces… (Jiminny Inc) Has new messages
Home
Home
DMs
DMs
Activity
Activity
Files
Files
Later
Later
More…
More
Unreads
Threads
Huddles
Drafts & sent
1
Directories
jiminny-x-integration-app
platform-inner-team
ai-chapter
alerts
backend
bugs
confusion-clinic
curiosity_lab
engineering
general
jiminny-bg
platform-tickets
product_launches
random
releases
sofia-office
support
thank-yous
the_people_of_jiminny
Vasil Vasilev
Nikolay Ivanov
Galya Dimitrova
Aneliya Angelova
,
Nikolay Yankov
,
Steliyan Georgiev
Stoyan Tanev
Stefka Stoyanova
Ves
Aneliya Angelova
James Graham
Lukas Kovalik
you
Toast
Jira Cloud
Messages
Messages
Add canvas
Add canvas
Files
Files
Pins
Pins
Add and Edit Channel Tabs
Canvas
List
Folder
Jump to date
Vasil Vasilev
Apr 28th at 4:51:31 PM
4:51 PM
a, ти искаш в amazon да добавим ключ за достъп до QAi ?
Apr 28th at 4:51:38 PM
4:51
Вес се грижи за тея неща
Apr 28th at 4:52:06 PM
4:52
дори не съм сигурен дали тоя ключ не трябва да бъде в CircleCI при билда на имиджа
Apr 28th at 4:52:10 PM
4:52
т.е.
Apr 28th at 4:52:12 PM
4:52
пак не знам
Lukas Kovalik
Apr 28th at 4:53:41 PM
4:53 PM
ок, ще питам Вес, мерси
Vasil Vasilev
Apr 28th at 5:00:16 PM
5:00 PM
моля
Jump to date
Vasil Vasilev
Today at 2:52:43 PM
2:52 PM
Лукаш, привет
Today at 2:52:48 PM
2:52
хвърли моля те едно око тука
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:52:49 PM
2:52
https://github.com/jiminny/app/pull/12059
https://github.com/jiminny/app/pull/12059
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:53:03 PM
2:53
опитвам се да оптимизирам процеса по индексиране на активитита за ЕС
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:54:16 PM
2:54
идеята е да намаля паметта която се ползва за да се генерира един бач от 100 активитита
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:54:35 PM
2:54
и после да увелича размера на бачовете, за да имаме по малко blocking операции в ЕС, като реиндексира
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 4:12:58 PM
4:12 PM
здрасти, изглежда ок, но когато го минах и през gemini ми даде един warning.
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:13:17 PM
4:13
Switch
cursor()
to
lazyById(250)
. It preserves the single-loop, generator-style code in the new version while restoring proper batched eager loading (avoiding N+1 on
getIndexableAttributes()
) and releasing the DB connection between chunks (avoiding long-held PDO connections during ES/Sentry calls).
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Vasil Vasilev
Today at 4:40:06 PM
4:40 PM
хм, интересна идея
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:41:03 PM
4:41
ще го проверя
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:41:17 PM
4:41
така или иначе в понеделник ще иде на прод, днес не ми се рискува
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
loading…
SlackFileEditViewGoHistoryWindowHelpLukás Koválik's No...ProGPHubspot API calls+n Home1000TestDailyAgents+ New agentWorkspace* Quick NoteWorkJira ticketView of SprintDailyPlanSprintStefka 1-1TododevEvaluationKnowledgera IdeasPrivateE Home viewsIntegration-appWork KnowledgeWork Knowledgetesting keyboard4Todo2 New chat x03 Hubspot / Hubspot API callsCritical Findings1. Line 1313 - rawsearchApi()->doSearch()- matchExSresponse = Sthis->client->getNewInstance()->crm(• Goes completely around the Client wrapper - no 429• Uses the search rate limit bucket• Can be replaced with $this->client->search('contacts"2. Line 920-923 — companies()->searchByDomain() - m$hsAccounts = $this->client->getInstance()->compai• Uses v1 SDK's searchByDomainwhich calls a search e• No 429 protection• Cannot be trivially replaced with client->search() (diffePress 'space' for Al or 'l' for commands40QHomeDMsActivityFilesLater...MoreED→Jiminny... v# conrusion-clnic# curiosity_lab# engineering# general# jiminny-bg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi...• Direct messagese. Vasil Vasilevo Nikolay IvanovGalya DimitrovaAneliya Angelova, ...2 Stoyan Tanev €ã. Stefka StoyanovaC Vese. Aneliya Angelovado James GrahamLukas Kovalik y... O::: AppsToalJira Cloud100% CFri 8 May 17:23:27Describe what you are looking forVasil Vasilev6 0MessagesAdd canvasлукаш, привет@ Files< Pins+Todayхвърли моля те смгукаhttps://github.com/jiminny/app/pull/12059опитвам се да оптимизирам процеса поиндексиране на активитита за ЕСидеята е да намаля паметта която се ползва зада се генерира един бач от 100 активититаи после да увелича размера на бачовете, за даимаме по малко blocking операции в ЕС, катореиндексираLukas Kovalik 4:12 PMздрасти, изглежда ок, но когато го минах и презgemini ми даде един warning.Switch cursor() to lazyById(250) . It preservesthe single-loop, generator-style code in the newversion while restoring proper batched eagerloading (avoiding N+1 ongetIndexableAttributes() ) and releasing the DBconnection between chunks (avoiding long-heldPDO connections during ES/Sentry calls).Vasil Vasilev 4:40 PMхм, интересна идеяще го проверятака или иначе в понеделник ще иде на прод,днес не ми се рискуваMessage Vasil Vasilev+Aa..•...
|
Slack
|
Vasil Vasilev (DM) - Jiminny Inc - 3 new items - S Vasil Vasilev (DM) - Jiminny Inc - 3 new items - Slack...
|
NULL
|
10142
|
|
10141
|
Switch workspaces… (Jiminny Inc) Has new messages
Switch workspaces… (Jiminny Inc) Has new messages
Home
Home
DMs
DMs
Activity
Activity
Files
Files
Later
Later
More…
More
Unreads
Threads
Huddles
Drafts & sent
1
Directories
jiminny-x-integration-app
platform-inner-team
ai-chapter
alerts
backend
bugs
confusion-clinic
curiosity_lab
engineering
general
jiminny-bg
platform-tickets
product_launches
random
releases
sofia-office
support
thank-yous
the_people_of_jiminny
Vasil Vasilev
Nikolay Ivanov
Galya Dimitrova
Aneliya Angelova
,
Nikolay Yankov
,
Steliyan Georgiev
Stoyan Tanev
Stefka Stoyanova
Ves
Aneliya Angelova
James Graham
Lukas Kovalik
you
Toast
Jira Cloud
Messages
Messages
Add canvas
Add canvas
Files
Files
Pins
Pins
Add and Edit Channel Tabs
Canvas
List
Folder
Jump to date
Vasil Vasilev
Apr 28th at 4:51:31 PM
4:51 PM
a, ти искаш в amazon да добавим ключ за достъп до QAi ?
Apr 28th at 4:51:38 PM
4:51
Вес се грижи за тея неща
Apr 28th at 4:52:06 PM
4:52
дори не съм сигурен дали тоя ключ не трябва да бъде в CircleCI при билда на имиджа
Apr 28th at 4:52:10 PM
4:52
т.е.
Apr 28th at 4:52:12 PM
4:52
пак не знам
Lukas Kovalik
Apr 28th at 4:53:41 PM
4:53 PM
ок, ще питам Вес, мерси
Vasil Vasilev
Apr 28th at 5:00:16 PM
5:00 PM
моля
Jump to date
Vasil Vasilev
Today at 2:52:43 PM
2:52 PM
Лукаш, привет
Today at 2:52:48 PM
2:52
хвърли моля те едно око тука
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:52:49 PM
2:52
https://github.com/jiminny/app/pull/12059
https://github.com/jiminny/app/pull/12059
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:53:03 PM
2:53
опитвам се да оптимизирам процеса по индексиране на активитита за ЕС
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:54:16 PM
2:54
идеята е да намаля паметта която се ползва за да се генерира един бач от 100 активитита
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:54:35 PM
2:54
и после да увелича размера на бачовете, за да имаме по малко blocking операции в ЕС, като реиндексира
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 4:12:58 PM
4:12 PM
здрасти, изглежда ок, но когато го минах и през gemini ми даде един warning.
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:13:17 PM
4:13
Switch
cursor()
to
lazyById(250)
. It preserves the single-loop, generator-style code in the new version while restoring proper batched eager loading (avoiding N+1 on
getIndexableAttributes()
) and releasing the DB connection between chunks (avoiding long-held PDO connections during ES/Sentry calls).
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Vasil Vasilev
Today at 4:40:06 PM
4:40 PM
хм, интересна идея
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:41:03 PM
4:41
ще го проверя
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:41:17 PM
4:41
така или иначе в понеделник ще иде на прод, днес не ми се рискува
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
loading…
PhostorimcodeFV faVsco.js?9 JY-20725-handle-HS-search-rate-limiProledey(© RemoteCrmobjectmanif © HubspotSyncStrategybase.png€ ResponseNormalize.pheCachedcrmservicebecorator.onpsyncrielaAction.ong© SyncRelatedActivityMar© MatchActivityCrmData.php© CrmActivityService.phgc) MatchermDatc wednooksynebalchrrov O IntegrationAppdosearchx 5 Cc WTIY:>D Accessors> Api• contiaO DTOW) FiltersM.lobsclass service excenas baseservice znpcemencs903904 Cpubuic tunccion macchbybomaln scring saomain, tinc suserla = nulu: rarrayProspectSearchStrateg)ServiceTraitsC) DataClient.oho© DecorateActivity.php© LocalSearch.phpelocalSearchinterface.of© RemoteSearch.php(C) Service.phpv Ml isteners913© ConvertLeadActivities.p© PurgeLookupCache.php> D MetadataD Migration[ Pipedrive915917>C FieldsC OpportunityMatcher> @ OpportunitySyncStrated921›_ Prospectsearchstrateay>W ServiceTraits925(c) Client.phpc) [EMAIL]) FieldDefinitions.onvC) PavloadBuilder.ohv929930(C) Profile, ohoC) @uervBuilder.ohoC) @uerv.andler.ohoC) @uerviterator nhol9331934(C) @uervRecults.nhn© Service.php(C) SvncRatchRedicServicescompanyname = soomarn'Try to find a company matchina their emall domain.ScompanyProperties = ['hs avatar filemanader key!.try 1ShsAccounts = Sthis->clientl->getInstance->comnaniesol->ceanchRvlomain(ScomnanvName ScomnanvPronenties)•} catch (Throwable $e) {Sthis->logger->info('[HubSpot] Search failed', ['error' => $e->getMessage()D):return nulbSaccount = null:I/ If there are multiple accounts. don'+ quess.we'll ask laterif count(ShsAccounts->data->results) zz= 10 <Persist this remote obiect.Saccount = Sthis->svncAccount(ShsAccounts->data->results10l->comoanvid0•M Traite© BaseClient.php© BaseService.php(C CachodGrm CorvicaDacoratSdata = Sthis->conventcrmlatald contact: niin Saccount, Susentd).© CountryCodeResolver.php4) CrmActivitvProviderintegraneturn I emntvlannav filten(Sdata)) ? Sdata • null-rilo May 1/:23.20© ProspectCache.phpB7B48 MMSSATATl HI=custom.log ^4 SF (jiminny@localhost]4 HS_local (jiminny@localhost]# console [PKou.# console leu)# console [slAGiNg)[2026-05-07 14:21:15] local.INF0: [Hubspot] DEBUG Getting headers {"neaders".?"Uace":L"Inu,or May 2020 14.21.15 6Ml"Jn"Transter-Encod1nq":"chunked")."Connection":"keep-alive""CF-Ray" : ["9f80deb8db60dc3a-SOF"],"Strict-Transport-Secur1ty":"max-aqe=31536008* 1ncLudeSubDomains: preload")nacceot-encodino""server-timing": ["hcid;desc=\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\","x-hubspot-correlation-id":["019e02d0-6fd8-7812-bdba-885b7ccb3ee3"],"So+-Cookie"." c+hm-Stlirtd0aXVr.kSandas6hzVVKhzTn0BidvMaheCtm0V-1778163675-1.0.107-May-26 14:51:15 GMT; domain=.hubapi.com; Http0nly; Secure; SameSite=None"],"Renont-To".f"*"endpoints\":[{"unl".httns:la.nel.cloudflane.com./nenon+W/v42c=NVA1cVTPQfVm32anS0#xVF/sd2RN\"group\":\"cf-nel\","max_age\":604800}"]|"NEL": ["1success_traccion.0.01rreportto. "cr-nel,"max age":604800}"]"Server": ["cloudflare"]}} {"correlation_1d":"95256555-ec78-4541-b9za-adta/Sb6Yeab"."trace_10":C/AD8565-905t-4604-9405-0e5b551e5545CascadeHubspot Rate LimitindAskJiminnyReportActivityServiceTest -Hubspot Rate Limit ReInvestigating Rate LinNew CascadeHubspot CRM Call Re- 11I1Actions/SyncArchivedProfilesAction.phpCallVia executeRequest()?Rate Limitapp/Services/Activity/HubSpot/Service.phpThis service uses Sthis=›crmService (the CRM Service.oho))- it makes no direct HubSpot APl calls itselt. All calls delegate through crmservice-›aetcal10, crmService->searchCallsForPeriod(), crmService->syncOpportunity(), crmService->parseRecords() .Critical Findings1. Line 1313 - raw searchApi→>doSearch - matchExactlyByParticipantinService.po:#Service.oho:1313)Sresponse = sthis->cuient->aetNewinstance->crmo->contactso-searchAoi->doSearchSoavload):• Goes comoletelv around the Client wraoper — no 429 handlina, no Ratel imitFxcention. no rate limit awareness•Uses the search rate limit bucket• Can be replaced with $this->client-›search('contacts', $payload) - same endpoint, same result, adds 429 protection,tine 020.022-comnandoctl.sconrchRuhorninfl_matchRuDomain/).• Service.php:920-923ShsAccounts = $this->client->getInstance()->companies()->searchByDomain(ScompanyName, ScompanyProperties):• Uses v1 SDK's searchByDomain which calls a search endooint — hits the search rate limit bucket• No 429 protection• Cannot be trivially replaced with client-›search() (different endpoint/format), but could be wrapped in executeRequest ()2.detdnnortunitvRvldhac executeReauestcommented out.• Client.php:238-239$deal = Sthis->executeRequest(fn () => $this->getNewInstance()->crm()->deals()->basicApi()->getById(• Deliberatelv disabled _ this means sinale deal fetches in HubsootSingleSvncStrateav also aet no 429 protection.Ask anvthina (&4L)Tnl "896-20UITE.Rfo 4 spaces...
|
Slack
|
Vasil Vasilev (DM) - Jiminny Inc - 3 new items - S Vasil Vasilev (DM) - Jiminny Inc - 3 new items - Slack...
|
NULL
|
10141
|
|
10140
|
Switch workspaces… (Jiminny Inc) Has new messages
Switch workspaces… (Jiminny Inc) Has new messages
Home
Home
DMs
DMs
Activity
Activity
Files
Files
Later
Later
More…
More
Unreads
Threads
Huddles
Drafts & sent
1
Directories
jiminny-x-integration-app
platform-inner-team
ai-chapter
alerts
backend
bugs
confusion-clinic
curiosity_lab
engineering
general
jiminny-bg
platform-tickets
product_launches
random
releases
sofia-office
support
thank-yous
the_people_of_jiminny
Vasil Vasilev
Nikolay Ivanov
Galya Dimitrova
Aneliya Angelova
,
Nikolay Yankov
,
Steliyan Georgiev
Stoyan Tanev
Stefka Stoyanova
Ves
Aneliya Angelova
James Graham
Lukas Kovalik
you
Toast
Jira Cloud
Messages
Messages
Add canvas
Add canvas
Files
Files
Pins
Pins
Add and Edit Channel Tabs
Canvas
List
Folder
Jump to date
Vasil Vasilev
Apr 28th at 4:51:31 PM
4:51 PM
a, ти искаш в amazon да добавим ключ за достъп до QAi ?
Apr 28th at 4:51:38 PM
4:51
Вес се грижи за тея неща
Apr 28th at 4:52:06 PM
4:52
дори не съм сигурен дали тоя ключ не трябва да бъде в CircleCI при билда на имиджа
Apr 28th at 4:52:10 PM
4:52
т.е.
Apr 28th at 4:52:12 PM
4:52
пак не знам
Lukas Kovalik
Apr 28th at 4:53:41 PM
4:53 PM
ок, ще питам Вес, мерси
Vasil Vasilev
Apr 28th at 5:00:16 PM
5:00 PM
моля
Jump to date
Vasil Vasilev
Today at 2:52:43 PM
2:52 PM
Лукаш, привет
Today at 2:52:48 PM
2:52
хвърли моля те едно око тука
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
SlackFileEditViewGoHistoryWindowHelpLukás Koválik's No...ProGPHubspot API calls+n Home1000TestDailyAgents+ New agentWorkspace* Quick NoteWorkJira ticketView of SprintDailyPlanSprintStefka 1-1TododevEvaluationKnowledgera IdeasPrivateE Home viewsIntegration-appWork KnowledgeWork Knowledgetesting keyboard4Todo2 New chat x03 Hubspot / Hubspot API callsCritical Findings1. Line 1313 - rawsearchApi()->doSearch()- matchExlSresponse = Sthis->client->getNewInstance()->crm(• Goes completely around the Client wrapper - no 429• Uses the search rate limit bucket• Can be replaced with $this->client->search('contacts"2. Line 920-923 — companies()->searchByDomain() - m$hsAccounts = $this->client->getInstance()->compai• Uses v1 SDK's searchByDomainwhich calls a search e• No 429 protection• Cannot be trivially replaced with client->search() (diffePress 'space' for Al or 'l' for commands40QHomeDMsActivityFilesLater...MoreED→Jiminny... v# conrusion-clnic# curiosity_lab# engineering# general# jiminny-bg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi...• Direct messagese. Vasil Vasilevo Nikolay IvanovGalya DimitrovaAneliya Angelova, ...2 Stoyan Tanev €ã. Stefka StoyanovaC Vese. Aneliya Angelovado James GrahamLukas Kovalik y... O::: AppsToalJira Cloud100% CFri 8 May 17:22:55Describe what you are looking forVasil Vasilev6 0MessagesAdd canvasлукаш, привет@ Files< Pins+Todayхвърли моля те смгукаhttps://github.com/jiminny/app/pull/12059опитвам се да оптимизирам процеса поиндексиране на активитита за ЕСидеята е да намаля паметта която се ползва зада се генерира един бач от 100 активититаи после да увелича размера на бачовете, за даимаме по малко blocking операции в ЕС, катореиндексираLukas Kovalik 4:12 PMздрасти, изглежда ок, но когато го минах и презgemini ми даде един warning.Switch cursor() to lazyById(250) . It preservesthe single-loop, generator-style code in the newversion while restoring proper batched eagerloading (avoiding N+1 ongetIndexableAttributes() ) and releasing the DBconnection between chunks (avoiding long-heldPDO connections during ES/Sentry calls).Vasil Vasilev 4:40 PMхм, интересна идеяще го проверятака или иначе в понеделник ще иде на прод,днес не ми се рискуваMessage Vasil Vasilev+Aa..•...
|
Slack
|
Vasil Vasilev (DM) - Jiminny Inc - 3 new items - S Vasil Vasilev (DM) - Jiminny Inc - 3 new items - Slack...
|
NULL
|
10140
|
|
10139
|
Switch workspaces… (Jiminny Inc) Has new messages
Switch workspaces… (Jiminny Inc) Has new messages
Home
Home
DMs
DMs
Activity
Activity
Files
Files
Later
Later
More…
More
Unreads
Threads
Huddles
Drafts & sent
1
Directories
jiminny-x-integration-app
platform-inner-team
ai-chapter
alerts
backend
bugs
confusion-clinic
curiosity_lab
engineering
general
jiminny-bg
platform-tickets
product_launches
random
releases
sofia-office
support
thank-yous
the_people_of_jiminny
Vasil Vasilev
Nikolay Ivanov
Galya Dimitrova
Aneliya Angelova
,
Nikolay Yankov
,
Steliyan Georgiev
Stoyan Tanev
Stefka Stoyanova
Ves
Aneliya Angelova
James Graham
Lukas Kovalik
you
Toast
Jira Cloud
Messages
Messages
Add canvas
Add canvas
Files
Files
Pins
Pins
Add and Edit Channel Tabs
Canvas
List
Folder
Jump to date
Vasil Vasilev
Apr 28th at 4:51:31 PM
4:51 PM
a, ти искаш в amazon да добавим ключ за достъп до QAi ?
Apr 28th at 4:51:38 PM
4:51
Вес се грижи за тея неща
Apr 28th at 4:52:06 PM
4:52
дори не съм сигурен дали тоя ключ не трябва да бъде в CircleCI при билда на имиджа
Apr 28th at 4:52:10 PM
4:52
т.е.
Apr 28th at 4:52:12 PM
4:52
пак не знам
Lukas Kovalik
Apr 28th at 4:53:41 PM
4:53 PM
ок, ще питам Вес, мерси
Vasil Vasilev
Apr 28th at 5:00:16 PM
5:00 PM
моля
Jump to date
Vasil Vasilev
Today at 2:52:43 PM
2:52 PM
Лукаш, привет
Today at 2:52:48 PM
2:52
хвърли моля те едно око тука
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:52:49 PM
2:52
https://github.com/jiminny/app/pull/12059
https://github.com/jiminny/app/pull/12059
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:53:03 PM
2:53
опитвам се да оптимизирам процеса по индексиране на активитита за ЕС
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:54:16 PM
2:54
идеята е да намаля паметта която се ползва за да се генерира един бач от 100 активитита
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:54:35 PM
2:54
и после да увелича размера на бачовете, за да имаме по малко blocking операции в ЕС, като реиндексира
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 4:12:58 PM
4:12 PM
здрасти, изглежда ок, но когато го минах и през gemini ми даде един warning.
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:13:17 PM
4:13
Switch
cursor()
to
lazyById(250)
. It preserves the single-loop, generator-style code in the new version while restoring proper batched eager loading (avoiding N+1 on
getIndexableAttributes()
) and releasing the DB connection between chunks (avoiding long-held PDO connections during ES/Sentry calls).
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Vasil Vasilev
Today at 4:40:06 PM
4:40 PM
хм, интересна идея
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:41:03 PM
4:41
ще го проверя
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:41:17 PM
4:41
така или иначе в понеделник ще иде на прод, днес не ми се рискува
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
loading…
PhostorimcodeFV faVsco.js?9 JY-20725-handle-HS-search-rate-limiProledey(© RemoteCrmobjectmanif © HubspotSyncStrategybase.png€ ResponseNormalize.pheCachedcrmservicebecorator.onpsyncrielaAction.ong© SyncRelatedActivityMar© MatchActivityCrmData.php© CrmActivityService.phgc) MatchermDatc wednooksynebalchrrov O IntegrationAppdosearchx 5 Cc WTIY:>D Accessors> Api• contiaO DTOW) FiltersM.lobsclass service excenas baseservice znpcemencs903904 Cpubuic tunccion macchbybomaln scring saomain, tinc suserla = nulu: rarrayProspectSearchStrateg)ServiceTraitsC) DataClient.oho© DecorateActivity.php© LocalSearch.phpelocalSearchinterface.of© RemoteSearch.php(C) Service.phpv Ml isteners913© ConvertLeadActivities.p© PurgeLookupCache.php> D MetadataD Migration[ Pipedrive915917>C Fields0 OpportunityMatcher> @ OpportunitySyncStrated921›_ Prospectsearchstrateay>W ServiceTraits925(c) Client.phpc) [EMAIL]) FieldDefinitions.onvC) PavloadBuilder.ohv929930(C) Profile, ohoC) @uervBuilder.ohoC) @uerv.andler.ohoC) @uerviterator nhol9331934(C) @uervRecults.nhn© Service.php(C) SvncRatchRedicServicescompanyname = soomarn'Try to find a company matchina their emall domain.ScompanyProperties = ['hs avatar filemanader key!.try 1ShsAccounts = Sthis->clientl->getInstance->comnaniesol->ceanchRvlomain(ScomnanvName ScomnanvPronenties)•} catch (Throwable $e) {Sthis->logger->info('[HubSpot] Search failed', ['error' => $e->getMessage()D):return nulbSaccount = null:I/ If there are multiple accounts. don'+ quess.we'll ask laterif count(ShsAccounts->data->results) zz= 10 <Persist this remote obiect.Saccount = Sthis->svncAccount(ShsAccounts->data->results10l->comoanvid0•M Traite© BaseClient.php© BaseService.php(C CachodGrm CorvicaDacoratSdata = Sthis->conventcrmlatald contact: niin Saccount, Susentd).© CountryCodeResolver.php4) CrmActivitvProviderintegraneturn I emntvlannav filten(Sdata)) ? Sdata • null-rilo May 1/:22:04© ProspectCache.phpB7B48 MMSSATATl HI=custom.log ^A SF (jiminny@localhost]4 HS_local (jiminny@localhost]# console [PKou.# console leu)# console [slAGiNg)[2026-05-07 14:21:15] local.INF0: [Hubspot] DEBUG Getting headers {"neaders".?"Uace":L"Inu,or May 2020 14.21.15 6Ml"Jn"Transter-Encod1nq":"chunked")."Connection":"keep-alive""CF-Ray" : ["9f80deb8db60dc3a-SOF"],"Strict-Transport-Secur1ty":"max-aqe=31536008* 1ncLudeSubDomains: preload")nacceot-encodino""server-timing": ["hcid;desc=\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\","x-hubspot-correlation-id":["019e02d0-6fd8-7812-bdba-885b7ccb3ee3"],"So+-Cookie"." c+hm-Stlirtd0aXVr.kSandas6hzVVKhzTn0BidvMaheCtm0V-1778163675-1.0.107-May-26 14:51:15 GMT; domain=.hubapi.com; Http0nly; Secure; SameSite=None"],"Renont-To".f"*"endpoints\":[{"unl".httns:la.nel.cloudflane.com./nenon+W/v42c=NVA1cVTPQfVm32anS0#xVF/sd2RN\"group\":\"cf-nel\","max_age\":604800}"]|"NEL": ["1success_traccion.0.01rreportto. "cr-nel,"max age":604800}"]"Server": ["cloudflare"]}} {"correlation_1d":"95256555-ec78-4541-b9za-adta/Sb6Yeab"."trace_10":C/AD8565-905t-4604-9405-0e5b551e5545CascadeHubspot Rate LimitindAskJiminnyReportActivityServiceTest -Hubspot Rate Limit ReInvestigating Rate LinNew CascadeHubspot CRM Call Re- 11I1Actions/SyncArchivedProfilesAction.phpCallVia executeRequest()?Rate Limitapp/Services/Activity/HubSpot/Service.phpThis service uses Sthis=›crmService (the CRM Service.oho))- it makes no direct HubSpot APl calls itselt. All calls delegate through crmservice-›aetcal10, crmService->searchCallsForPeriod(), crmService->syncOpportunity(), crmService->parseRecords() .Critical Findings1. Line 1313 - raw searchApi→>doSearch - matchExactlyByParticipantinService.po:#Service.oho:1313)Sresponse = sthis->cuient->aetNewinstance->crmo->contactso-searchAoi->doSearchSoavload):• Goes comoletelv around the Client wraoper — no 429 handlina, no Ratel imitFxcention. no rate limit awareness•Uses the search rate limit bucket• Can be replaced with $this->client-›search('contacts', $payload) - same endpoint, same result, adds 429 protection,tine 020.022-comnandoctl.sconrchRuhorninfl_matchRuDomain/).• Service.php:920-923ShsAccounts = $this->client->getInstance()->companies()->searchByDomain(ScompanyName, ScompanyProperties):• Uses v1 SDK's searchByDomain which calls a search endooint — hits the search rate limit bucket• No 429 protection• Cannot be trivially replaced with client-›search() (different endpoint/format), but could be wrapped in executeRequest ()2.detdnnortunitvRvldhac executeReauestcommented out.• Client.php:238-239$deal = Sthis->executeRequest(fn () => $this->getNewInstance()->crm()->deals()->basicApi()->getById(• Deliberatelv disabled _ this means sinale deal fetches in HubsootSingleSvncStrateav also aet no 429 protection.Ask anvthina (&4L)Tnl "896-20UITE.Rfo 4 spaces...
|
Slack
|
Vasil Vasilev (DM) - Jiminny Inc - 3 new items - S Vasil Vasilev (DM) - Jiminny Inc - 3 new items - Slack...
|
NULL
|
10139
|
|
10138
|
Switch workspaces… (Jiminny Inc) Has new messages
Switch workspaces… (Jiminny Inc) Has new messages
Home
Home
DMs
DMs
Activity
Activity
Files
Files
Later
Later
More…
More
Unreads
Threads
Huddles
Drafts & sent
1
Directories
jiminny-x-integration-app
platform-inner-team
ai-chapter
alerts
backend
bugs
confusion-clinic
curiosity_lab
engineering
general
jiminny-bg
platform-tickets
product_launches
random
releases
sofia-office
support
thank-yous
the_people_of_jiminny
Vasil Vasilev
Nikolay Ivanov
Galya Dimitrova
Aneliya Angelova
,
Nikolay Yankov
,
Steliyan Georgiev
Stoyan Tanev
Stefka Stoyanova
Ves
Aneliya Angelova
James Graham
Lukas Kovalik
you
Toast
Jira Cloud
Messages
Messages
Add canvas
Add canvas
Files
Files
Pins
Pins
Add and Edit Channel Tabs
Canvas
List
Folder
Jump to date
Vasil Vasilev
Apr 28th at 4:51:31 PM
4:51 PM
a, ти искаш в amazon да добавим ключ за достъп до QAi ?
Apr 28th at 4:51:38 PM
4:51
Вес се грижи за тея неща
Apr 28th at 4:52:06 PM
4:52
дори не съм сигурен дали тоя ключ не трябва да бъде в CircleCI при билда на имиджа
Apr 28th at 4:52:10 PM
4:52
т.е.
Apr 28th at 4:52:12 PM
4:52
пак не знам
Lukas Kovalik
Apr 28th at 4:53:41 PM
4:53 PM
ок, ще питам Вес, мерси
Vasil Vasilev
Apr 28th at 5:00:16 PM
5:00 PM
моля
Jump to date
Vasil Vasilev
Today at 2:52:43 PM
2:52 PM
Лукаш, привет
Today at 2:52:48 PM
2:52
хвърли моля те едно око тука
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:52:49 PM
2:52
https://github.com/jiminny/app/pull/12059
https://github.com/jiminny/app/pull/12059
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:53:03 PM
2:53
опитвам се да оптимизирам процеса по индексиране на активитита за ЕС
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:54:16 PM
2:54
идеята е да намаля паметта която се ползва за да се генерира един бач от 100 активитита
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:54:35 PM
2:54
и после да увелича размера на бачовете, за да имаме по малко blocking операции в ЕС, като реиндексира
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 4:12:58 PM
4:12 PM
здрасти, изглежда ок, но когато го минах и през gemini ми даде един warning.
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:13:17 PM
4:13
Switch
cursor()
to
lazyById(250)
. It preserves the single-loop, generator-style code in the new version while restoring proper batched eager loading (avoiding N+1 on
getIndexableAttributes()
) and releasing the DB connection between chunks (avoiding long-held PDO connections during ES/Sentry calls).
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Vasil Vasilev
Today at 4:40:06 PM
4:40 PM
хм, интересна идея
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:41:03 PM
4:41
ще го проверя
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:41:17 PM
4:41
така или иначе в понеделник ще иде на прод, днес не ми се рискува
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
loading…
SlackFileEditViewGoHistoryWindowHelpLukás Koválik's No...ProGPHubspot API calls+n Home1000TestDailyAgents+ New agentWorkspace* Quick NoteWorkJira ticketView of SprintDailyPlanSprintStefka 1-1TododevEvaluationKnowledgera IdeasPrivateE Home viewsIntegration-appWork KnowledgeWork Knowledgetesting keyboard4Todo2 New chat x03 Hubspot / Hubspot API callsCritical Findings1. Line 1313 - rawsearchApi()->doSearch()- matchExSresponse = Sthis->client->getNewInstance()->crm(• Goes completely around the Client wrapper - no 429• Uses the search rate limit bucket• Can be replaced with $this->client->search('contacts"2. Line 920-923 — companies()->searchByDomain() - m$hsAccounts = $this->client->getInstance()->compai• Uses v1 SDK's searchByDomainwhich calls a search e• No 429 protection• Cannot be trivially replaced with client->search() (diffePress 'space' for Al or 'l' for commands40QHomeDMsActivityFilesLater...MoreED→Jiminny... v# conrusion-clnic# curiosity_lab# engineering# general# jiminny-bg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi...• Direct messagese. Vasil Vasilevo Nikolay IvanovGalya DimitrovaAneliya Angelova, ...2 Stoyan Tanev €ã. Stefka StoyanovaC Vese. Aneliya Angelovado James GrahamLukas Kovalik y... O::: AppsToalJira Cloud100% CFri 8 May 17:22:22Describe what you are looking forVasil Vasilev6 0MessagesAdd canvasлукаш, привет@ Files< Pins+Todayхвърли моля те смгукаhttps://github.com/jiminny/app/pull/12059опитвам се да оптимизирам процеса поиндексиране на активитита за ЕСидеята е да намаля паметта която се ползва зада се генерира един бач от 100 активититаи после да увелича размера на бачовете, за даимаме по малко blocking операции в ЕС, катореиндексираLukas Kovalik 4:12 PMздрасти, изглежда ок, но когато го минах и презgemini ми даде един warning.Switch cursor() to lazyById(250) . It preservesthe single-loop, generator-style code in the newversion while restoring proper batched eagerloading (avoiding N+1 ongetIndexableAttributes() ) and releasing the DBconnection between chunks (avoiding long-heldPDO connections during ES/Sentry calls).Vasil Vasilev 4:40 PMхм, интересна идеяще го проверятака или иначе в понеделник ще иде на прод,днес не ми се рискуваMessage Vasil Vasilev+Aa..•...
|
Slack
|
Vasil Vasilev (DM) - Jiminny Inc - 3 new items - S Vasil Vasilev (DM) - Jiminny Inc - 3 new items - Slack...
|
NULL
|
10138
|
|
10137
|
Switch workspaces… (Jiminny Inc) Has new messages
Switch workspaces… (Jiminny Inc) Has new messages
Home
Home
DMs
DMs
Activity
Activity
Files
Files
Later
Later
More…
More
Unreads
Threads
Huddles
Drafts & sent
1
Directories
jiminny-x-integration-app
platform-inner-team
ai-chapter
alerts
backend
bugs
confusion-clinic
curiosity_lab
engineering
general
jiminny-bg
platform-tickets
product_launches
random
releases
sofia-office
support
thank-yous
the_people_of_jiminny
Vasil Vasilev
Nikolay Ivanov
Galya Dimitrova
Aneliya Angelova
,
Nikolay Yankov
,
Steliyan Georgiev
Stoyan Tanev
Stefka Stoyanova
Ves
Aneliya Angelova
James Graham
Lukas Kovalik
you
Toast
Jira Cloud
Messages
Messages
Add canvas
Add canvas
Files
Files
Pins
Pins
Add and Edit Channel Tabs
Canvas
List
Folder
Jump to date
Vasil Vasilev
Apr 28th at 4:51:31 PM
4:51 PM
a, ти искаш в amazon да добавим ключ за достъп до QAi ?
Apr 28th at 4:51:38 PM
4:51
Вес се грижи за тея неща
Apr 28th at 4:52:06 PM
4:52
дори не съм сигурен дали тоя ключ не трябва да бъде в CircleCI при билда на имиджа
Apr 28th at 4:52:10 PM
4:52
т.е.
Apr 28th at 4:52:12 PM
4:52
пак не знам
Lukas Kovalik
Apr 28th at 4:53:41 PM
4:53 PM
ок, ще питам Вес, мерси
Vasil Vasilev
Apr 28th at 5:00:16 PM
5:00 PM
моля
Jump to date
Vasil Vasilev
Today at 2:52:43 PM
2:52 PM
Лукаш, привет
Today at 2:52:48 PM
2:52
хвърли моля те едно око тука
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:52:49 PM
2:52
https://github.com/jiminny/app/pull/12059
https://github.com/jiminny/app/pull/12059
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:53:03 PM
2:53
опитвам се да оптимизирам процеса по индексиране на активитита за ЕС
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:54:16 PM
2:54
идеята е да намаля паметта която се ползва за да се генерира един бач от 100 активитита
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:54:35 PM
2:54
и после да увелича размера на бачовете, за да имаме по малко blocking операции в ЕС, като реиндексира
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 4:12:58 PM
4:12 PM
здрасти, изглежда ок, но когато го минах и през gemini ми даде един warning.
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:13:17 PM
4:13
Switch
cursor()
to
lazyById(250)
. It preserves the single-loop, generator-style code in the new version while restoring proper batched eager loading (avoiding N+1 on
getIndexableAttributes()
) and releasing the DB connection between chunks (avoiding long-held PDO connections during ES/Sentry calls).
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Vasil Vasilev
Today at 4:40:06 PM
4:40 PM
хм, интересна идея
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:41:03 PM
4:41
ще го проверя
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:41:17 PM
4:41
така или иначе в понеделник ще иде на прод, днес не ми се рискува
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
loading…
PhostorimcodeFV faVsco.js?9 JY-20725-handle-HS-search-rate-limiProledey(© RemoteCrmobjectmanif © HubspotSyncStrategybase.png€ ResponseNormalize.pheCachedcrmservicebecorator.onpsyncrielaAction.ong© SyncRelatedActivityMar© MatchActivityCrmData.php© CrmActivityService.phgc) MatchermDatc wednooksynebalchrrov O IntegrationAppdosearchx 5 Cc WTIY:>D Accessors> Api• contiaO DTOW) FiltersM.lobsclass service excenas baseservice znpcemencs903904 Cpubuic tunccion macchbybomaln scring saomain, tinc suserla = nulu: rarrayProspectSearchStrateg)ServiceTraitsC) DataClient.oho© DecorateActivity.php© LocalSearch.phpelocalSearchinterface.of© RemoteSearch.php(C) Service.phpv Ml isteners913© ConvertLeadActivities.p© PurgeLookupCache.php> D MetadataD Migration[ Pipedrive915917>C Fields0 OpportunityMatcher> @ OpportunitySyncStrated921›_ Prospectsearchstrateay>W ServiceTraits925(c) Client.phpc) [EMAIL]) FieldDefinitions.onvC) PavloadBuilder.ohv929930(C) Profile, ohoC) @uervBuilder.ohoC) @uerv.andler.ohoC) @uerviterator nhol9331934(C) @uervRecults.nhn© Service.php(C) SvncRatchRedicServicescompanyname = soomarn'Try to find a company matchina their emall domain.ScompanyProperties = ['hs avatar filemanader key!.try 1ShsAccounts = Sthis->clientl->getInstance->comnaniesol->ceanchRvlomain(ScomnanvName ScomnanvPronenties)•} catch (Throwable $e) {Sthis->logger->info('[HubSpot] Search failed', ['error' => $e->getMessage()D):return nulbSaccount = null:I/ If there are multiple accounts. don'+ quess.we'll ask laterif count(ShsAccounts->data->results) zz= 10 <Persist this remote obiect.Saccount = Sthis->svncAccount(ShsAccounts->data->results10l->comoanvid0•M Traite© BaseClient.php© BaseService.php(C CachodGrm CorvicaDacoratSdata = Sthis->conventcrmlatald contact: niin Saccount, Susentd).© CountryCodeResolver.php4) CrmActivitvProviderintegraneturn I emntvlannav filten(Sdata)) ? Sdata • null-riio May 1/-LL-L4© ProspectCache.phpB7B48 MMSSATATl HI=custom.log ^A SF (jiminny@localhost]4 HS_local (jiminny@localhost]# console [PKou.# console leu)# console [slAGiNg)[2026-05-07 14:21:15] local.INF0: [Hubspot] DEBUG Getting headers {"neaders".?"Uace":L"Inu,or May 2020 14.21.15 6Ml"Jn"Transter-Encod1nq":"chunked")."Connection":"keep-alive""CF-Ray" : ["9f80deb8db60dc3a-SOF"],"Strict-Transport-Secur1ty":"max-aqe=31536008* 1ncLudeSubDomains: preload")nacceot-encodino""server-timing": ["hcid;desc=\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\","x-hubspot-correlation-id":["019e02d0-6fd8-7812-bdba-885b7ccb3ee3"],"So+-Cookie"." c+hm-Stlirtd0aXVr.kSandas6hzVVKhzTn0BidvMaheCtm0V-1778163675-1.0.107-May-26 14:51:15 GMT; domain=.hubapi.com; Http0nly; Secure; SameSite=None"],"Renont-To".f"*"endpoints\":[{"unl".httns:la.nel.cloudflane.com./nenon+W/v42c=NVA1cVTPQfVm32anS0#xVF/sd2RN\"group\":\"cf-nel\","max_age\":604800}"]|"NEL": ["1success_traccion.0.01rreportto. "cr-nel,"max age":604800}"]"Server": ["cloudflare"]}} {"correlation_1d":"95256555-ec78-4541-b9za-adta/Sb6Yeab"."trace_10":C/AD8565-905t-4604-9405-0e5b551e5545CascadeHubspot Rate LimitindAskJiminnyReportActivityServiceTest -Hubspot Rate Limit ReInvestigating Rate LinNew CascadeHubspot CRM Call Re- 11I1Actions/SyncArchivedProfilesAction.phpCallVia executeRequest()?Rate Limitapp/Services/Activity/HubSpot/Service.phpThis service uses Sthis=›crmService (the CRM Service.oho))- it makes no direct HubSpot APl calls itselt. All calls delegate through crmservice-›aetcal10, crmService->searchCallsForPeriod(), crmService->syncOpportunity(), crmService->parseRecords() .Critical Findings1. Line 1313 - raw searchApi→>doSearch - matchExactlyByParticipantinService.po:#Service.oho:1313)Sresponse = sthis->cuient->aetNewinstance->crmo->contactso-searchAoi->doSearchSoavload):• Goes comoletelv around the Client wraoper — no 429 handlina, no Ratel imitFxcention. no rate limit awareness•Uses the search rate limit bucket• Can be replaced with $this->client-›search('contacts', $payload) - same endpoint, same result, adds 429 protection,tine 020.022-comnandoctl.sconrchRuhorninfl_matchRuDomain/).• Service.php:920-923ShsAccounts = $this->client->getInstance()->companies()->searchByDomain(ScompanyName, ScompanyProperties):• Uses v1 SDK's searchByDomain which calls a search endooint — hits the search rate limit bucket• No 429 protection• Cannot be trivially replaced with client-›search() (different endpoint/format), but could be wrapped in executeRequest ()2.detdnnortunitvRvldhac executeReauestcommented out.• Client.php:238-239$deal = Sthis->executeRequest(fn () => $this->getNewInstance()->crm()->deals()->basicApi()->getById(• Deliberatelv disabled _ this means sinale deal fetches in HubsootSingleSvncStrateav also aet no 429 protection.Ask anvthina (&4L)Tnl "896-20UITE.Rfo 4 spaces...
|
Slack
|
Vasil Vasilev (DM) - Jiminny Inc - 3 new items - S Vasil Vasilev (DM) - Jiminny Inc - 3 new items - Slack...
|
NULL
|
10137
|
|
10136
|
Switch workspaces… (Jiminny Inc) Has new messages
Switch workspaces… (Jiminny Inc) Has new messages
Home
Home
DMs
DMs
Activity
Activity
Files
Files
Later
Later
More…
More
Unreads
Threads
Huddles
Drafts & sent
1
Directories
jiminny-x-integration-app
platform-inner-team
ai-chapter
alerts
backend
bugs
confusion-clinic
curiosity_lab
engineering
general
jiminny-bg
platform-tickets
product_launches
random
releases
sofia-office
support
thank-yous
the_people_of_jiminny
Vasil Vasilev
Nikolay Ivanov
Galya Dimitrova
Aneliya Angelova
,
Nikolay Yankov
,
Steliyan Georgiev
Stoyan Tanev
Stefka Stoyanova
Ves
Aneliya Angelova
James Graham
Lukas Kovalik
you
Toast
Jira Cloud
Messages
Messages
Add canvas
Add canvas
Files
Files
Pins
Pins
Add and Edit Channel Tabs
Canvas
List
Folder
Jump to date
Vasil Vasilev
Apr 28th at 4:51:31 PM
4:51 PM
a, ти искаш в amazon да добавим ключ за достъп до QAi ?
Apr 28th at 4:51:38 PM
4:51
Вес се грижи за тея неща
Apr 28th at 4:52:06 PM
4:52
дори не съм сигурен дали тоя ключ не трябва да бъде в CircleCI при билда на имиджа
Apr 28th at 4:52:10 PM
4:52
т.е.
Apr 28th at 4:52:12 PM
4:52
пак не знам
Lukas Kovalik
Apr 28th at 4:53:41 PM
4:53 PM
ок, ще питам Вес, мерси
Vasil Vasilev
Apr 28th at 5:00:16 PM
5:00 PM
моля
Jump to date
Vasil Vasilev
Today at 2:52:43 PM
2:52 PM
Лукаш, привет
Today at 2:52:48 PM
2:52
хвърли моля те едно око тука
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:52:49 PM
2:52
https://github.com/jiminny/app/pull/12059
https://github.com/jiminny/app/pull/12059
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:53:03 PM
2:53
опитвам се да оптимизирам процеса по индексиране на активитита за ЕС
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:54:16 PM
2:54
идеята е да намаля паметта която се ползва за да се генерира един бач от 100 активитита
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:54:35 PM
2:54
и после да увелича размера на бачовете, за да имаме по малко blocking операции в ЕС, като реиндексира
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 4:12:58 PM
4:12 PM
здрасти, изглежда ок, но когато го минах и през gemini ми даде един warning.
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:13:17 PM
4:13
Switch
cursor()
to
lazyById(250)
. It preserves the single-loop, generator-style code in the new version while restoring proper batched eager loading (avoiding N+1 on
getIndexableAttributes()
) and releasing the DB connection between chunks (avoiding long-held PDO connections during ES/Sentry calls).
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Vasil Vasilev
Today at 4:40:06 PM
4:40 PM
хм, интересна идея
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:41:03 PM
4:41
SlackFileEditViewGoHistoryWindowHelpLukás Koválik's No...ProGPHubspot API calls+n Home1000TestDailyAgents+ New agentWorkspace* Quick NoteWorkJira ticketView of SprintDailyPlanSprintStefka 1-1TododevEvaluationKnowledgera IdeasPrivateE Home viewsIntegration-appWork KnowledgeWork Knowledgetesting keyboard4Todo2 New chat x03 Hubspot / Hubspot API callsCritical Findings1. Line 1313 - rawsearchApi()->doSearch()- matchExSresponse = Sthis->client->getNewInstance()->crm(• Goes completely around the Client wrapper - no 429• Uses the search rate limit bucket• Can be replaced with $this->client->search('contacts"2. Line 920-923 — companies()->searchByDomain() - m$hsAccounts = $this->client->getInstance()->compai• Uses v1 SDK's searchByDomainwhich calls a search e• No 429 protection• Cannot be trivially replaced with client->search() (diffePress 'space' for Al or 'l' for commands40QHomeDMsActivityFilesLater...MoreED→Jiminny... v# conrusion-clnic# curiosity_lab# engineering# general# jiminny-bg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi...• Direct messagese. Vasil Vasilevo Nikolay IvanovGalya DimitrovaAneliya Angelova, ...2 Stoyan Tanev €ã. Stefka StoyanovaC Vese. Aneliya Angelovado James GrahamLukas Kovalik y... O::: AppsToalJira Cloud100% CFri 8 May 17:21:51Describe what you are looking forVasil Vasilev6 0MessagesAdd canvasлукаш, привет@ Files< Pins+Todayхвърли моля те смгукаhttps://github.com/jiminny/app/pull/12059опитвам се да оптимизирам процеса поиндексиране на активитита за ЕСидеята е да намаля паметта която се ползва зада се генерира един бач от 100 активититаи после да увелича размера на бачовете, за даимаме по малко blocking операции в ЕС, катореиндексираLukas Kovalik 4:12 PMздрасти, изглежда ок, но когато го минах и презgemini ми даде един warning.Switch cursor() to lazyById(250) . It preservesthe single-loop, generator-style code in the newversion while restoring proper batched eagerloading (avoiding N+1 ongetIndexableAttributes() ) and releasing the DBconnection between chunks (avoiding long-heldPDO connections during ES/Sentry calls).Vasil Vasilev 4:40 PMхм, интересна идеяще го проверятака или иначе в понеделник ще иде на прод,днес не ми се рискуваMessage Vasil Vasilev+Aa..•...
|
Slack
|
Vasil Vasilev (DM) - Jiminny Inc - 3 new items - S Vasil Vasilev (DM) - Jiminny Inc - 3 new items - Slack...
|
NULL
|
10136
|
|
10135
|
Switch workspaces… (Jiminny Inc) Has new messages
Switch workspaces… (Jiminny Inc) Has new messages
Home
Home
DMs
DMs
Activity
Activity
Files
Files
Later
Later
More…
More
Unreads
Threads
Huddles
Drafts & sent
1
Directories
jiminny-x-integration-app
platform-inner-team
ai-chapter
alerts
backend
bugs
confusion-clinic
curiosity_lab
engineering
general
jiminny-bg
platform-tickets
product_launches
random
releases
sofia-office
support
thank-yous
the_people_of_jiminny
Vasil Vasilev
Nikolay Ivanov
Galya Dimitrova
Aneliya Angelova
,
Nikolay Yankov
,
Steliyan Georgiev
Stoyan Tanev
Stefka Stoyanova
Ves
Aneliya Angelova
James Graham
Lukas Kovalik
you
Toast
Jira Cloud
Messages
Messages
Add canvas
Add canvas
Files
Files
Pins
Pins
Add and Edit Channel Tabs
Canvas
List
Folder
Jump to date
Vasil Vasilev
Apr 28th at 4:51:31 PM
4:51 PM
a, ти искаш в amazon да добавим ключ за достъп до QAi ?
Apr 28th at 4:51:38 PM
4:51
Вес се грижи за тея неща
Apr 28th at 4:52:06 PM
4:52
дори не съм сигурен дали тоя ключ не трябва да бъде в CircleCI при билда на имиджа
Apr 28th at 4:52:10 PM
4:52
т.е.
Apr 28th at 4:52:12 PM
4:52
пак не знам
Lukas Kovalik
Apr 28th at 4:53:41 PM
4:53 PM
ок, ще питам Вес, мерси
Vasil Vasilev
Apr 28th at 5:00:16 PM
5:00 PM
моля
Jump to date
Vasil Vasilev
Today at 2:52:43 PM
2:52 PM
Лукаш, привет
Today at 2:52:48 PM
2:52
хвърли моля те едно око тука
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:52:49 PM
2:52
https://github.com/jiminny/app/pull/12059
https://github.com/jiminny/app/pull/12059
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:53:03 PM
2:53
опитвам се да оптимизирам процеса по индексиране на активитита за ЕС
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:54:16 PM
2:54
идеята е да намаля паметта която се ползва за да се генерира един бач от 100 активитита
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:54:35 PM
2:54
и после да увелича размера на бачовете, за да имаме по малко blocking операции в ЕС, като реиндексира
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 4:12:58 PM
4:12 PM
здрасти, изглежда ок, но когато го минах и през gemini ми даде един warning.
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:13:17 PM
4:13
Switch
cursor()
to
lazyById(250)
. It preserves the single-loop, generator-style code in the new version while restoring proper batched eager loading (avoiding N+1 on
getIndexableAttributes()
) and releasing the DB connection between chunks (avoiding long-held PDO connections during ES/Sentry calls).
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Vasil Vasilev
Today at 4:40:06 PM
4:40 PM
хм, интересна идея
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:41:03 PM
4:41
ще го проверя
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:41:17 PM
4:41
така или иначе в понеделник ще иде на прод, днес не ми се рискува
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
loading…
PhostorimcodeFV faVsco.js?9 JY-20725-handle-HS-search-rate-limiProledey(© RemoteCrmobjectmanif © HubspotSyncStrategybase.png€ ResponseNormalize.phrCachedcrmservicebecorator.onp© syncrielaAction.ong© SyncRelatedActivityMar© MatchActivityCrmData.php© CrmActivityService.phgc) MatchermDatc wednooksynebalchrrov O IntegrationAppdosearchx 5 Cc wTIY:>D Accessors>© Api• contiaO DTOW) FiltersM.lobsclass service excenas baseservice znpcemencs903904 Cpubuic tunccion macchbybomaln scring saomain, tinc suserla = nulu: rarrayProspectSearchStrateg)ServiceTraitsC) DataClient.oho© DecorateActivity.php© LocalSearch.phpelocalSearchinterface.of© RemoteSearch.php(C) Service.phpv Ml isteners913© ConvertLeadActivities.p© PurgeLookupCache.php> D MetadataD Migration[ Pipedrive915917>C FieldsC OpportunityMatcher> @ OpportunitySyncStrated921›_ Prospectsearchstrateay>W ServiceTraits925(c) Client.phpc) [EMAIL]) FieldDefinitions.onvC) PavloadBuilder.ohv929930(C) Profile, ohoC) @uervBuilder.ohoC) @uerv.andler.ohoC) @uerviterator nhol9331934(C) @uervRecults.nhn© Service.php(C) SvncRatchRedicServicescompanyname = soomarn'Try to find a company matchina their emall domain.ScompanyProperties = ['hs avatar filemanader key!.try 1ShsAccounts = Sthis->clientl->getInstance->comnaniesol->ceanchRvlomain(ScomnanvName ScomnanvPronenties)•} catch (Throwable $e) {Sthis->logger->info('[HubSpot] Search failed', ['error' => $e->getMessage()D):return nulbSaccount = null:I/ If there are multiple accounts. don'+ quess.we'll ask laterif count(ShsAccounts->data->results) zz= 10 <Persist this remote obiect.Saccount = Sthis->svncAccount(ShsAccounts->data->results10l->comoanvid0•M Traite© BaseClient.php© BaseService.php(C CachodGrm CorvicaDacoratSdata = Sthis->conventcrmlatald contact: niin Saccount, Susentd).© CountryCodeResolver.php4) CrmActivitvProviderintegraneturn I emntvlannav filten(Sdata)) ? Sdata • null-rilo May 1/:21:00© ProspectCache.phpB7B48 MMSSATATl HI=custom.log ^A SF (jiminny@localhost]4 HS_local [jiminny@localhost]# console [PKou.# console leu)# console [slAGiNg)[2026-05-07 14:21:15] local.INF0: [Hubspot] DEBUG Getting headers {"neaders".?"Uace":L"Inu,or May 2020 14.21.15 6Ml"Jn"Transter-Encod1nq":"chunked")."Connection":"keep-alive""CF-Ray" : ["9f80deb8db60dc3a-SOF"],"Strict-Transport-Secur1ty":"max-aqe=31536008* 1ncLudeSubDomains: preload")nacceot-encodino""server-timing": ["hcid;desc=\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\","x-hubspot-correlation-id":["019e02d0-6fd8-7812-bdba-885b7ccb3ee3"],"So+-Cookie"." c+hm-Stlirtd0aXVr.kSandas6hzVVKhzTn0BidvMaheCtm0V-1778163675-1.0.107-May-26 14:51:15 GMT; domain=.hubapi.com; Http0nly; Secure; SameSite=None"],"Renont-To".f"*"endpoints\":[{"unl".httns:la.nel.cloudflane.com./nenon+W/v42c=NVA1cVTPQfVm32anS0#xVF/sd2RN\"group\":\"cf-nel\","max_age\":604800}"]|"NEL":["{success_traccion.0.01rreportto. "cr-nel,"max age":604800}"]"Server": ["cloudflare"]}} {"correlation_1d":"95256555-ec78-4541-b9za-adta/Sb6Yeab"."trace_10":C/AD8565-905t-4604-9405-0e5b551e5545CascadeHubspot Rate LimitindHubspot Rate Limit ReInvestigating Rate LinNew CascadeHubspot CRM Call ReActions/SyncArchivedProfilesAction.phpCallVia executeRequest()?Rate Limitapp/Services/Activity/HubSpot/Service.phpThis service uses Sthis=›crmService (the CRM Service.oho))- it makes no direct HubSpot APl calls itselt. All calls delegate through crmservice-›aetcal10, crmService->searchCallsForPeriod(), crmService->syncOpportunity(), crmService->parseRecords() .Critical Findings1. Line 1313 - raw searchApi→>doSearch - matchExactlyByParticipantinService.po:#Service.oho:1313)Sresponse = sthis->cuient->aetNewinstance->crmo->contactso-searchAoi->doSearchSoavload):• Goes comoletelv around the Client wraoper — no 429 handlina, no Ratel imitFxcention. no rate limit awareness•Uses the search rate limit bucket• Can be replaced with $this->client-›search('contacts', $payload) - same endpoint, same result, adds 429 protection,tine 020.022-comnandoctl.sconrchRuhorninfl_matchRuDomain/).• Service.php:920-923ShsAccounts = $this->client->getInstance()->companies()->searchByDomain(ScompanyName, ScompanyProperties):• Uses v1 SDK's searchByDomain which calls a search endooint — hits the search rate limit bucket• No 429 protection• Cannot be trivially replaced with client-›search() (different endpoint/format), but could be wrapped in executeRequest ()2.detdnnortunitvRvldhac executeReauestcommented out.• Client.php:238-239$deal = Sthis->executeRequest(fn () => $this->getNewInstance()->crm()->deals()->basicApi()->getById(• Deliberatelv disabled _ this means sinale deal fetches in HubsootSingleSvncStrateav also aet no 429 protection.Ask anvthina (&4L)Tnl "896-20UITE.Rfo 4 spaces...
|
Slack
|
Vasil Vasilev (DM) - Jiminny Inc - 3 new items - S Vasil Vasilev (DM) - Jiminny Inc - 3 new items - Slack...
|
NULL
|
10135
|
|
10134
|
Switch workspaces… (Jiminny Inc) Has new messages
Switch workspaces… (Jiminny Inc) Has new messages
Home
Home
DMs
DMs
Activity
Activity
Files
Files
Later
Later
More…
More
Unreads
Threads
Huddles
Drafts & sent
1
Directories
jiminny-x-integration-app
platform-inner-team
ai-chapter
alerts
backend
bugs
confusion-clinic
curiosity_lab
engineering
general
jiminny-bg
platform-tickets
product_launches
random
releases
sofia-office
support
thank-yous
the_people_of_jiminny
Vasil Vasilev
Nikolay Ivanov
Galya Dimitrova
Aneliya Angelova
,
Nikolay Yankov
,
Steliyan Georgiev
Stoyan Tanev
Stefka Stoyanova
Ves
Aneliya Angelova
James Graham
Lukas Kovalik
you
Toast
Jira Cloud
Messages
Messages
Add canvas
Add canvas
Files
Files
Pins
Pins
Add and Edit Channel Tabs
Canvas
List
Folder
Jump to date
Vasil Vasilev
Apr 28th at 4:51:31 PM
4:51 PM
a, ти искаш в amazon да добавим ключ за достъп до QAi ?
Apr 28th at 4:51:38 PM
4:51
Вес се грижи за тея неща
Apr 28th at 4:52:06 PM
4:52
дори не съм сигурен дали тоя ключ не трябва да бъде в CircleCI при билда на имиджа
Apr 28th at 4:52:10 PM
4:52
т.е.
Apr 28th at 4:52:12 PM
4:52
пак не знам
Lukas Kovalik
Apr 28th at 4:53:41 PM
4:53 PM
ок, ще питам Вес, мерси
Vasil Vasilev
Apr 28th at 5:00:16 PM
5:00 PM
моля
Jump to date
Vasil Vasilev
Today at 2:52:43 PM
2:52 PM
Лукаш, привет
Today at 2:52:48 PM
2:52
хвърли моля те едно око тука
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:52:49 PM
2:52
https://github.com/jiminny/app/pull/12059
https://github.com/jiminny/app/pull/12059
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:53:03 PM
2:53
опитвам се да оптимизирам процеса по индексиране на активитита за ЕС
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:54:16 PM
2:54
идеята е да намаля паметта която се ползва за да се генерира един бач от 100 активитита
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:54:35 PM
2:54
и после да увелича размера на бачовете, за да имаме по малко blocking операции в ЕС, като реиндексира
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 4:12:58 PM
4:12 PM
здрасти, изглежда ок, но когато го минах и през gemini ми даде един warning.
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:13:17 PM
4:13
Switch
cursor()
to
lazyById(250)
. It preserves the single-loop, generator-style code in the new version while restoring proper batched eager loading (avoiding N+1 on
getIndexableAttributes()
) and releasing the DB connection between chunks (avoiding long-held PDO connections during ES/Sentry calls).
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Vasil Vasilev
Today at 4:40:06 PM
4:40 PM
хм, интересна идея
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:41:03 PM
4:41
ще го проверя
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:41:17 PM
4:41
така или иначе в понеделник ще иде на прод, днес не ми се рискува
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
loading…
SlackFileEditViewGoHistoryWindowHelpLukás Koválik's No...ProGPHubspot API calls+n Home1000TestDailyAgents+ New agentWorkspace* Quick NoteWorkJira ticketView of SprintDailyPlanSprintStefka 1-1TododevEvaluationKnowledgera IdeasPrivateE Home viewsIntegration-appWork KnowledgeWork Knowledgetesting keyboard4Todo2 New chat x03 Hubspot / Hubspot API callsCritical Findings1. Line 1313 - rawsearchApi()->doSearch()- matchExSresponse = $this->client->getNewInstance()->crm(• Goes completely around the Client wrapper - no 429• Uses the search rate limit bucket• Can be replaced with $this->client->search('contacts"2. Line 920-923 — companies()->searchByDomain() - m$hsAccounts = $this->client->getInstance()->compai• Uses v1 SDK's searchByDomain which calls a search €• No 429 protection• Cannot be trivially replaced with client->search() (diffePress 'space' for Al or 'l' for commands40QHomeDMsActivityFilesLater...MoreED→Jiminny... v# conrusion-clnic# curiosity_lab# engineering# general# jiminny-bg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi...• Direct messagese. Vasil Vasilevo Nikolay IvanovGalya DimitrovaAneliya Angelova, ...2 Stoyan Tanev €ã. Stefka StoyanovaC. Vese. Aneliya Angelovado James GrahamLukas Kovalik y... O::: AppsToalJira Cloud100% CFri 8 May 17:21:19Describe what you are looking forVasil Vasilev6 0MessagesAdd canvasлукаш, привет@ Files< Pins+Todayхвърли моля те с.-гукаhttps://github.com/jiminny/app/pull/12059опитвам се да оптимизирам процеса поиндексиране на активитита за ЕСидеята е да намаля паметта която се ползва зада се генерира един бач от 100 активититаи после да увелича размера на бачовете, за даимаме по малко blocking операции в ЕС, катореиндексираLukas Kovalik 4:12 PMздрасти, изглежда ок, но когато го минах и презgemini ми даде един warning.Switch cursor() to lazyById(250) . It preservesthe single-loop, generator-style code in the newversion while restoring proper batched eagerloading (avoiding N+1 ongetIndexableAttributes() ) and releasing the DBconnection between chunks (avoiding long-heldPDO connections during ES/Sentry calls).Vasil Vasilev 4:40 PMхм, интересна идеяще го проверятака или иначе в понеделник ще иде на прод,днес не ми се рискуваMessage Vasil Vasilev+Aa..•...
|
Slack
|
Vasil Vasilev (DM) - Jiminny Inc - 3 new items - S Vasil Vasilev (DM) - Jiminny Inc - 3 new items - Slack...
|
NULL
|
10134
|
|
10133
|
Switch workspaces… (Jiminny Inc) Has new messages
Switch workspaces… (Jiminny Inc) Has new messages
Home
Home
DMs
DMs
Activity
Activity
Files
Files
Later
Later
More…
More
Unreads
Threads
Huddles
Drafts & sent
1
Directories
jiminny-x-integration-app
platform-inner-team
ai-chapter
alerts
backend
bugs
confusion-clinic
curiosity_lab
engineering
general
jiminny-bg
platform-tickets
product_launches
random
releases
sofia-office
support
thank-yous
the_people_of_jiminny
Vasil Vasilev
Nikolay Ivanov
Galya Dimitrova
Aneliya Angelova
,
Nikolay Yankov
,
Steliyan Georgiev
Stoyan Tanev
Stefka Stoyanova
Ves
Aneliya Angelova
James Graham
Lukas Kovalik
you
Toast
Jira Cloud
Messages
Messages
Add canvas
Add canvas
Files
Files
Pins
Pins
Add and Edit Channel Tabs
Canvas
List
Folder
Jump to date
Vasil Vasilev
Apr 28th at 4:51:31 PM
4:51 PM
a, ти искаш в amazon да добавим ключ за достъп до QAi ?
Apr 28th at 4:51:38 PM
4:51
Вес се грижи за тея неща
Apr 28th at 4:52:06 PM
4:52
дори не съм сигурен дали тоя ключ не трябва да бъде в CircleCI при билда на имиджа
Apr 28th at 4:52:10 PM
4:52
т.е.
Apr 28th at 4:52:12 PM
4:52
пак не знам
Lukas Kovalik
Apr 28th at 4:53:41 PM
4:53 PM
ок, ще питам Вес, мерси
Vasil Vasilev
Apr 28th at 5:00:16 PM
5:00 PM
моля
Jump to date
Vasil Vasilev
Today at 2:52:43 PM
2:52 PM
Лукаш, привет
Today at 2:52:48 PM
2:52
хвърли моля те едно око тука
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:52:49 PM
2:52
https://github.com/jiminny/app/pull/12059
https://github.com/jiminny/app/pull/12059
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:53:03 PM
2:53
опитвам се да оптимизирам процеса по индексиране на активитита за ЕС
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:54:16 PM
2:54
идеята е да намаля паметта която се ползва за да се генерира един бач от 100 активитита
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:54:35 PM
2:54
и после да увелича размера на бачовете, за да имаме по малко blocking операции в ЕС, като реиндексира
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 4:12:58 PM
4:12 PM
здрасти, изглежда ок, но когато го минах и през gemini ми даде един warning.
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:13:17 PM
4:13
Switch
cursor()
to
lazyById(250)
. It preserves the single-loop, generator-style code in the new version while restoring proper batched eager loading (avoiding N+1 on
getIndexableAttributes()
) and releasing the DB connection between chunks (avoiding long-held PDO connections during ES/Sentry calls).
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Vasil Vasilev
Today at 4:40:06 PM
4:40 PM
хм, интересна идея
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:41:03 PM
4:41
ще го проверя
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:41:17 PM
4:41
така или иначе в понеделник ще иде на прод, днес не ми се рискува
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
loading…
PhostorimcodeFV faVsco.js?9 JY-20725-handle-HS-search-rate-limiProledey(© RemoteCrmobjectmanif © HubspotSyncStrategybase.png€ ResponseNormalize.pheCachedcrmservicebecorator.onpsyncrielaAction.ong© SyncRelatedActivityMar© MatchActivityCrmData.php© CrmActivityService.phgc) MatchermDatc wednooksynebalchrrov O IntegrationAppdosearchx 5 Cc WTIY:>D Accessors> Api• contiaO DTOW) FiltersM.lobsclass service excenas baseservice znpcemencs903904 Cpubuic tunccion macchbybomaln scring saomain, tinc suserla = nulu: rarrayProspectSearchStrateg)ServiceTraitsC) DataClient.oho© DecorateActivity.php© LocalSearch.phpelocalSearchinterface.of© RemoteSearch.php(C) Service.phpv Ml isteners913© ConvertLeadActivities.p© PurgeLookupCache.php> D MetadataD Migration[ Pipedrive915917>C Fields0 OpportunityMatcher> @ OpportunitySyncStrated921›_ Prospectsearchstrateay>W ServiceTraits925(c) Client.phpc) [EMAIL]) FieldDefinitions.onvC) PavloadBuilder.ohv929930(C) Profile, ohoC) @uervBuilder.ohoC) @uerv.andler.ohoC) @uerviterator nhol9331934(C) @uervRecults.nhn© Service.php(C) SvncRatchRedicServicescompanyname = soomarn'Try to find a company matchina their emall domain.ScompanyProperties = ['hs avatar filemanader key!.try 1ShsAccounts = Sthis->clientl->getInstance->comnaniesol->ceanchRvlomain(ScomnanvName ScomnanvPronenties)•} catch (Throwable $e) {Sthis->logger->info('[HubSpot] Search failed', ['error' => $e->getMessage()D):return nulbSaccount = null:I/ If there are multiple accounts. don'+ quess.we'll ask laterif count(ShsAccounts->data->results) zz= 10 <Persist this remote obiect.Saccount = Sthis->svncAccount(ShsAccounts->data->results10l->comoanvid0•M Traite© BaseClient.php© BaseService.php(C CachodGrm CorvicaDacoratSdata = Sthis->conventcrmlatald contact: niin Saccount, Susentd).© CountryCodeResolver.php4) CrmActivitvProviderintegraneturn I emntvlannav filten(Sdata)) ? Sdata • null-rho May 1/21-10© ProspectCache.phpB7B48 MMSSATATl HI=custom.log ^A SF (jiminny@localhost]4 HS_local (jiminny@localhost]# console [PKou.# console leu)# console [slAGiNg)[2026-05-07 14:21:15] local.INF0: [Hubspot] DEBUG Getting headers {"neaders".?"Uace":L"Inu,or May 2020 14.21.15 6Ml"Jn"Transter-Encod1nq":"chunked")."Connection":"keep-alive""CF-Ray" : ["9f80deb8db60dc3a-SOF"],"Strict-Transport-Secur1ty":"max-aqe=31536008* 1ncLudeSubDomains: preload")nacceot-encodino""server-timing": ["hcid;desc=\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\","x-hubspot-correlation-id":["019e02d0-6fd8-7812-bdba-885b7ccb3ee3"],"So+-Cookie"." c+hm-Stlirtd0aXVr.kSandas6hzVVKhzTn0BidvMaheCtm0V-1778163675-1.0.107-May-26 14:51:15 GMT; domain=.hubapi.com; Http0nly; Secure; SameSite=None"],"Renont-To".f"*"endpoints\":[{"unl".httns:la.nel.cloudflane.com./nenon+W/v42c=NVA1cVTPQfVm32anS0#xVF/sd2RN\"group\":\"cf-nel\","max_age\":604800}"]|"NEL": ["1success_traccion.0.01rreportto. "cr-nel,"max age":604800}"]"Server": ["cloudflare"]}} {"correlation_1d":"95256555-ec78-4541-b9za-adta/Sb6Yeab"."trace_10":C/AD8565-905t-4604-9405-0e5b551e5545CascadeHubspot Rate LimitindAskJiminnyReportActivityServiceTest -Hubspot Rate Limit ReInvestigating Rate LinNew CascadeHubspot CRM Call Re- 11I1Actions/SyncArchivedProfilesAction.phpCallVia executeRequest()?Rate Limitapp/Services/Activity/HubSpot/Service.phpThis service uses Sthis=›crmService (the CRM Service.oho))- it makes no direct HubSpot APl calls itselt. All calls delegate through crmservice-›aetcal10, crmService->searchCallsForPeriod(), crmService->syncOpportunity(), crmService->parseRecords() .Critical Findings1. Line 1313 - raw searchApi→>doSearch - matchExactlyByParticipantinService.po:#Service.oho:1313)Sresponse = sthis->cuient->aetNewinstance->crmo->contactso-searchAoi->doSearchSoavload):• Goes comoletelv around the Client wraoper — no 429 handlina, no Ratel imitFxcention. no rate limit awareness•Uses the search rate limit bucket• Can be replaced with $this->client-›search('contacts', $payload) - same endpoint, same result, adds 429 protection,tine 020.022-comnandoctl.sconrchRuhorninfl_matchRuDomain/).• Service.php:920-923ShsAccounts = $this->client->getInstance()->companies()->searchByDomain(ScompanyName, ScompanyProperties):• Uses v1 SDK's searchByDomain which calls a search endooint — hits the search rate limit bucket• No 429 protection• Cannot be trivially replaced with client-›search() (different endpoint/format), but could be wrapped in executeRequest ()2.detdnnortunitvRvldhac executeReauestcommented out.• Client.php:238-239$deal = Sthis->executeRequest(fn () => $this->getNewInstance()->crm()->deals()->basicApi()->getById(• Deliberatelv disabled _ this means sinale deal fetches in HubsootSingleSvncStrateav also aet no 429 protection.Ask anvthina (&4L)Tnl "896-20UITE.Rfo 4 spaces...
|
Slack
|
Vasil Vasilev (DM) - Jiminny Inc - 3 new items - S Vasil Vasilev (DM) - Jiminny Inc - 3 new items - Slack...
|
NULL
|
10133
|
|
10132
|
Switch workspaces… (Jiminny Inc) Has new messages
Switch workspaces… (Jiminny Inc) Has new messages
Home
Home
DMs
DMs
Activity
Activity
Files
Files
Later
Later
More…
More
Unreads
Threads
Huddles
Drafts & sent
1
Directories
jiminny-x-integration-app
platform-inner-team
ai-chapter
alerts
backend
bugs
confusion-clinic
curiosity_lab
engineering
general
jiminny-bg
platform-tickets
product_launches
random
releases
sofia-office
support
thank-yous
the_people_of_jiminny
Vasil Vasilev
Nikolay Ivanov
Galya Dimitrova
Aneliya Angelova
,
Nikolay Yankov
,
Steliyan Georgiev
Stoyan Tanev
Stefka Stoyanova
Ves
Aneliya Angelova
James Graham
Lukas Kovalik
you
Toast
Jira Cloud
Messages
Messages
Add canvas
Add canvas
Files
Files
Pins
Pins
Add and Edit Channel Tabs
Canvas
List
Folder
Jump to date
Vasil Vasilev
Apr 28th at 4:51:31 PM
4:51 PM
a, ти искаш в amazon да добавим ключ за достъп до QAi ?
Apr 28th at 4:51:38 PM
4:51
Вес се грижи за тея неща
Apr 28th at 4:52:06 PM
4:52
дори не съм сигурен дали тоя ключ не трябва да бъде в CircleCI при билда на имиджа
Apr 28th at 4:52:10 PM
4:52
т.е.
Apr 28th at 4:52:12 PM
4:52
пак не знам
Lukas Kovalik
Apr 28th at 4:53:41 PM
4:53 PM
ок, ще питам Вес, мерси
Vasil Vasilev
Apr 28th at 5:00:16 PM
5:00 PM
моля
Jump to date
Vasil Vasilev
Today at 2:52:43 PM
2:52 PM
Лукаш, привет
Today at 2:52:48 PM
2:52
хвърли моля те едно око тука
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:52:49 PM
2:52
https://github.com/jiminny/app/pull/12059
https://github.com/jiminny/app/pull/12059
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:53:03 PM
2:53
опитвам се да оптимизирам процеса по индексиране на активитита за ЕС
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:54:16 PM
2:54
идеята е да намаля паметта която се ползва за да се генерира един бач от 100 активитита
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:54:35 PM
2:54
и после да увелича размера на бачовете, за да имаме по малко blocking операции в ЕС, като реиндексира
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 4:12:58 PM
4:12 PM
здрасти, изглежда ок, но когато го минах и през gemini ми даде един warning.
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:13:17 PM
4:13
Switch
cursor()
SlackFileEditViewGoHistoryWindowHelpLukás Koválik's No...ProGPHubspot API calls+n Home1000TestDailyAgents+ New agentWorkspace* Quick NoteWorkJira ticketView of SprintDailyPlanSprintStefka 1-1TododevEvaluationKnowledgera IdeasPrivateE Home viewsIntegration-appWork KnowledgeWork Knowledgetesting keyboard4Todo2 New chat x03 Hubspot / Hubspot API callsCritical Findings1. Line 1313 - rawsearchApi()->doSearch()- matchExSresponse = Sthis->client->getNewInstance()->crm(• Goes completely around the Client wrapper - no 429• Uses the search rate limit bucket• Can be replaced with $this->client->search('contacts"2. Line 920-923 — companies()->searchByDomain() - m$hsAccounts = $this->client->getInstance()->compai• Uses v1 SDK's searchByDomainwhich calls a search e• No 429 protection• Cannot be trivially replaced with client->search() (diffePress 'space' for Al or 'l' for commands40QHomeDMsActivityFilesLater...MoreED→Jiminny... v# conrusion-clnic# curiosity_lab# engineering# general# jiminny-bg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi...• Direct messagese. Vasil Vasilevo Nikolay IvanovGalya DimitrovaAneliya Angelova, ...2 Stoyan Tanev €ã. Stefka StoyanovaC Vese. Aneliya Angelovado James GrahamLukas Kovalik y... O::: AppsToalJira Cloud100% CFri 8 May 17:20:47Describe what you are looking forVasil Vasilev6 0MessagesAdd canvasлукаш, привет@ Files< Pins+Todayхвърли моля те смгукаhttps://github.com/jiminny/app/pull/12059опитвам се да оптимизирам процеса поиндексиране на активитита за ЕСидеята е да намаля паметта която се ползва зада се генерира един бач от 100 активититаи после да увелича размера на бачовете, за даимаме по малко blocking операции в ЕС, катореиндексираLukas Kovalik 4:12 PMздрасти, изглежда ок, но когато го минах и презgemini ми даде един warning.Switch cursor() to lazyById(250) . It preservesthe single-loop, generator-style code in the newversion while restoring proper batched eagerloading (avoiding N+1 ongetIndexableAttributes() ) and releasing the DBconnection between chunks (avoiding long-heldPDO connections during ES/Sentry calls).Vasil Vasilev 4:40 PMхм, интересна идеяще го проверятака или иначе в понеделник ще иде на прод,днес не ми се рискуваMessage Vasil Vasilev+Aa..•...
|
Slack
|
Vasil Vasilev (DM) - Jiminny Inc - 3 new items - S Vasil Vasilev (DM) - Jiminny Inc - 3 new items - Slack...
|
NULL
|
10132
|
|
10131
|
Switch workspaces… (Jiminny Inc) Has new messages
Switch workspaces… (Jiminny Inc) Has new messages
Home
Home
DMs
DMs
Activity
Activity
Files
Files
Later
Later
More…
More
Unreads
Threads
Huddles
Drafts & sent
1
Directories
jiminny-x-integration-app
platform-inner-team
ai-chapter
alerts
backend
bugs
confusion-clinic
curiosity_lab
engineering
general
jiminny-bg
platform-tickets
product_launches
random
releases
sofia-office
support
thank-yous
the_people_of_jiminny
Vasil Vasilev
Nikolay Ivanov
Galya Dimitrova
Aneliya Angelova
,
Nikolay Yankov
,
Steliyan Georgiev
Stoyan Tanev
Stefka Stoyanova
Ves
Aneliya Angelova
James Graham
Lukas Kovalik
you
Toast
Jira Cloud
Messages
Messages
Add canvas
Add canvas
Files
Files
Pins
Pins
Add and Edit Channel Tabs
Canvas
List
Folder
Jump to date
Vasil Vasilev
Apr 28th at 4:51:31 PM
4:51 PM
a, ти искаш в amazon да добавим ключ за достъп до QAi ?
Apr 28th at 4:51:38 PM
4:51
Вес се грижи за тея неща
Apr 28th at 4:52:06 PM
4:52
дори не съм сигурен дали тоя ключ не трябва да бъде в CircleCI при билда на имиджа
Apr 28th at 4:52:10 PM
4:52
т.е.
Apr 28th at 4:52:12 PM
4:52
пак не знам
Lukas Kovalik
Apr 28th at 4:53:41 PM
4:53 PM
ок, ще питам Вес, мерси
Vasil Vasilev
Apr 28th at 5:00:16 PM
5:00 PM
моля
Jump to date
Vasil Vasilev
Today at 2:52:43 PM
2:52 PM
Лукаш, привет
Today at 2:52:48 PM
2:52
хвърли моля те едно око тука
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:52:49 PM
2:52
https://github.com/jiminny/app/pull/12059
https://github.com/jiminny/app/pull/12059
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:53:03 PM
2:53
опитвам се да оптимизирам процеса по индексиране на активитита за ЕС
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:54:16 PM
2:54
идеята е да намаля паметта която се ползва за да се генерира един бач от 100 активитита
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:54:35 PM
2:54
и после да увелича размера на бачовете, за да имаме по малко blocking операции в ЕС, като реиндексира
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 4:12:58 PM
4:12 PM
здрасти, изглежда ок, но когато го минах и през gemini ми даде един warning.
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:13:17 PM
4:13
Switch
cursor()
to
lazyById(250)
. It preserves the single-loop, generator-style code in the new version while restoring proper batched eager loading (avoiding N+1 on
getIndexableAttributes()
) and releasing the DB connection between chunks (avoiding long-held PDO connections during ES/Sentry calls).
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Vasil Vasilev
Today at 4:40:06 PM
4:40 PM
хм, интересна идея
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:41:03 PM
4:41
ще го проверя
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:41:17 PM
4:41
така или иначе в понеделник ще иде на прод, днес не ми се рискува
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
loading…
PhostorimcodeFV faVsco.js?9 JY-20725-handle-HS-search-rate-limiProledey(© RemoteCrmobjectmanif © HubspotSyncStrategybase.png€ ResponseNormalize.phrCachedcrmservicebecorator.onpsyncrielaAction.ong© SyncRelatedActivityMar© MatchActivityCrmData.php© CrmActivityService.phgc) MatchermDatc wednooksynebalchrrov O IntegrationAppdosearchx 5 Cc wTIY:>D Accessors>© Api• contiaO DTOW) FiltersM.lobsclass service excenas baseservice znpcemencs903904 Cpubuic tunccion macchbybomaln scring saomain, tinc suserla = nulu: rarrayProspectSearchStrateg)ServiceTraitsC) DataClient.oho© DecorateActivity.php© LocalSearch.phpelocalSearchinterface.of909© RemoteSearch.php(C) Service.phpv Ml isteners913© ConvertLeadActivities.p© PurgeLookupCache.php> D MetadataD Migration[ Pipedrive915917>C FieldsC OpportunityMatcher> @ OpportunitySyncStrated921›_ Prospectsearchstrateay>W ServiceTraits925(c) Client.phpc) [EMAIL]) FieldDefinitions.onvC) PavloadBuilder.ohv929930(C) Profile, ohoC) @uervBuilder.ohoC) @uerv.andler.ohoC) @uerviterator nhol9331934(C) @uervRecults.nhn© Service.php(C) SvncRatchRedicServicescompanyname = soomarn'Try to find a company matchina their emall domain.ScompanyProperties = ['hs avatar filemanader key!.try 1ShsAccounts = Sthis->clientl->getInstance->comnaniesol->ceanchRvlomain(ScomnanvName ScomnanvPronenties)•} catch (Throwable $e) {Sthis->logger->info('[HubSpot] Search failed', ['error' => $e->getMessage()D):return nulbSaccount = null:I/ If there are multiple accounts. don'+ quess.we'll ask laterif count(ShsAccounts->data->results) zz= 10 <Persist this remote obiect.Saccount = Sthis->svncAccount(ShsAccounts->data->results10l->comoanvid0•M Traite© BaseClient.php© BaseService.php(C CachodGrm CorvicaDacoratSdata = Sthis->conventcrmlatald contact: niin Saccount, Susentd).© CountryCodeResolver.php4) CrmActivitvProviderintegraneturn I emntvlannav filten(Sdata)) ? Sdata • null-ril o May 1/:20.40© ProspectCache.php=custom.log ^A SF (jiminny@localhost]4 HS_local [jiminny@localhost]# console [PKou.# console leu)# console [slAGiNg)[2026-05-07 14:21:15] local.INF0: [Hubspot] DEBUG Getting headers {"neaders".?"Uace":L"Inu,or May 2020 14.21.15 6Ml"Jn"Transter-Encod1nq":"chunked")."Connection":"keep-alive""CF-Ray" : ["9f80deb8db60dc3a-SOF"],"Strict-Transport-Secur1ty":"max-aqe=31536008* 1ncLudeSubDomains: preload")nacceot-encodino""server-timing": ["hcid;desc=\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\","x-hubspot-correlation-id":["019e02d0-6fd8-7812-bdba-885b7ccb3ee3"],"So+-Cookie"." c+hm-Stlirtd0aXVr.kSandas6hzVVKhzTn0BidvMaheCtm0V-1778163675-1.0.107-May-26 14:51:15 GMT; domain=.hubapi.com; Http0nly; Secure; SameSite=None"],"Renont-To".f"*"endpoints\":[{"unl".httns:la.nel.cloudflane.com./nenon+W/v42c=NVA1cVTPQfVm32anS0#xVF/sd2RN\"group\":\"cf-nel\","max_age\":604800}"]|"NEL":["{success_traccion.0.01rreportto. "cr-nel,"max age":604800}"]"Server": ["cloudflare"]}} {"correlation_1d":"95256555-ec78-4541-b9za-adta/Sb6Yeab"."trace_10":C/AD8565-905t-4604-9405-0e5b551e5545CascadeHubspot Rate LimitindAskJiminnyReportActivityServiceTest -Hubspot Rate Limit ReInvestigating Rate LinNew CascadeHubspot CRM Call ReActions/SyncArchivedProfilesAction.phpCallVia executeRequest()?Rate Limitapp/Services/Activity/HubSpot/Service.phpThis service uses Sthis=›crmService (the CRM Service.oho))- it makes no direct HubSpot APl calls itselt. All calls delegate through crmservice-›aetcal10, crmService->searchCallsForPeriod(), crmService->syncOpportunity(), crmService->parseRecords() .Critical Findings1. Line 1313 - raw searchApi→>doSearch - matchExactlyByParticipantinService.po:#Service.oho:1313)Sresponse = sthis->cuient->aetNewinstance->crmo->contactso-searchAoi->doSearchSoavload):• Goes comoletelv around the Client wraoper — no 429 handlina, no Ratel imitFxcention. no rate limit awareness•Uses the search rate limit bucket• Can be replaced with $this->client-›search('contacts', $payload) - same endpoint, same result, adds 429 protection,tine 020.022-comnandoctl.sconrchRuhorninfl_matchRuDomain/).• Service.php:920-923ShsAccounts = $this->client->getInstance()->companies()->searchByDomain(ScompanyName, ScompanyProperties):• Uses v1 SDK's searchByDomain which calls a search endooint — hits the search rate limit bucket• No 429 protection• Cannot be trivially replaced with client-›search() (different endpoint/format), but could be wrapped in executeRequest ()2.detdnnortunitvRvldhac executeReauestcommented out.• Client.php:238-239$deal = Sthis->executeRequest(fn () => $this->getNewInstance()->crm()->deals()->basicApi()->getById(• Deliberatelv disabled _ this means sinale deal fetches in HubsootSingleSvncStrateav also aet no 429 protection.Ask anvthina (&4L)Tnl "896-20UITE.Rfo 4 spaces...
|
Slack
|
Vasil Vasilev (DM) - Jiminny Inc - 3 new items - S Vasil Vasilev (DM) - Jiminny Inc - 3 new items - Slack...
|
NULL
|
10131
|
|
10130
|
Switch workspaces… (Jiminny Inc) Has new messages
Switch workspaces… (Jiminny Inc) Has new messages
Home
Home
DMs
DMs
Activity
Activity
Files
Files
Later
Later
More…
More
Unreads
Threads
Huddles
Drafts & sent
1
Directories
jiminny-x-integration-app
platform-inner-team
ai-chapter
alerts
backend
bugs
confusion-clinic
curiosity_lab
engineering
general
jiminny-bg
platform-tickets
product_launches
random
releases
sofia-office
support
thank-yous
the_people_of_jiminny
Vasil Vasilev
Nikolay Ivanov
Galya Dimitrova
Aneliya Angelova
,
Nikolay Yankov
,
Steliyan Georgiev
Stoyan Tanev
Stefka Stoyanova
Ves
Aneliya Angelova
James Graham
Lukas Kovalik
you
Toast
Jira Cloud
Messages
Messages
Add canvas
Add canvas
Files
Files
Pins
Pins
Add and Edit Channel Tabs
Canvas
List
Folder
Jump to date
Vasil Vasilev
Apr 28th at 4:51:31 PM
4:51 PM
a, ти искаш в amazon да добавим ключ за достъп до QAi ?
Apr 28th at 4:51:38 PM
4:51
Вес се грижи за тея неща
Apr 28th at 4:52:06 PM
4:52
дори не съм сигурен дали тоя ключ не трябва да бъде в CircleCI при билда на имиджа
Apr 28th at 4:52:10 PM
4:52
т.е.
Apr 28th at 4:52:12 PM
4:52
пак не знам
Lukas Kovalik
Apr 28th at 4:53:41 PM
4:53 PM
ок, ще питам Вес, мерси
Vasil Vasilev
Apr 28th at 5:00:16 PM
5:00 PM
моля
Jump to date
Vasil Vasilev
Today at 2:52:43 PM
2:52 PM
Лукаш, привет
Today at 2:52:48 PM
2:52
хвърли моля те едно око тука
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:52:49 PM
2:52
https://github.com/jiminny/app/pull/12059
https://github.com/jiminny/app/pull/12059
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:53:03 PM
2:53
опитвам се да оптимизирам процеса по индексиране на активитита за ЕС
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:54:16 PM
2:54
идеята е да намаля паметта която се ползва за да се генерира един бач от 100 активитита
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:54:35 PM
2:54
и после да увелича размера на бачовете, за да имаме по малко blocking операции в ЕС, като реиндексира
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 4:12:58 PM
4:12 PM
здрасти, изглежда ок, но когато го минах и през gemini ми даде един warning.
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:13:17 PM
4:13
Switch
cursor()
to
lazyById(250)
. It preserves the single-loop, generator-style code in the new version while restoring proper batched eager loading (avoiding N+1 on
getIndexableAttributes()
) and releasing the DB connection between chunks (avoiding long-held PDO connections during ES/Sentry calls).
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Vasil Vasilev
Today at 4:40:06 PM
4:40 PM
хм, интересна идея
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:41:03 PM
4:41
ще го проверя
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:41:17 PM
4:41
така или иначе в понеделник ще иде на прод, днес не ми се рискува
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
loading…
SlackFileEditViewGoHistoryWindowHelpLukás Koválik's No...ProGPHubspot API calls+n Home1000TestDailyAgents+ New agentWorkspace* Quick NoteWorkJira ticketView of SprintDailyPlanSprintStefka 1-1TododevEvaluationKnowledgera IdeasPrivateE Home viewsIntegration-appWork KnowledgeWork Knowledgetesting keyboard4Todo2 New chat x03 Hubspot / Hubspot API callsCritical Findings1. Line 1313 - rawsearchApi()->doSearch()- matchExlSresponse = Sthis->client->getNewInstance()->crm(• Goes completely around the Client wrapper - no 429• Uses the search rate limit bucket• Can be replaced with $this->client->search('contacts"2. Line 920-923 — companies()->searchByDomain() - m$hsAccounts = $this->client->getInstance()->compai• Uses v1 SDK's searchByDomainwhich calls a search e• No 429 protection• Cannot be trivially replaced with client->search() (diffePress 'space' for Al or 'l' for commands40QHomeDMsActivityFilesLater...MoreED→Jiminny... v# conrusion-clnic# curiosity_lab# engineering# general# jiminny-bg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi...• Direct messagese. Vasil Vasilevo Nikolay IvanovGalya DimitrovaAneliya Angelova, ...2 Stoyan Tanev €ã. Stefka StoyanovaC Vese. Aneliya Angelovado James GrahamLukas Kovalik y... O::: AppsToalJira Cloud100% CFri 8 May 17:20:15Describe what you are looking forVasil Vasilev6 0MessagesAdd canvasлукаш, привет@ Files< Pins+Todayхвърли моля те смгукаhttps://github.com/jiminny/app/pull/12059опитвам се да оптимизирам процеса поиндексиране на активитита за ЕСидеята е да намаля паметта която се ползва зада се генерира един бач от 100 активититаи после да увелича размера на бачовете, за даимаме по малко blocking операции в ЕС, катореиндексираLukas Kovalik 4:12 PMздрасти, изглежда ок, но когато го минах и презgemini ми даде един warning.Switch cursor() to lazyById(250) . It preservesthe single-loop, generator-style code in the newversion while restoring proper batched eagerloading (avoiding N+1 ongetIndexableAttributes() ) and releasing the DBconnection between chunks (avoiding long-heldPDO connections during ES/Sentry calls).Vasil Vasilev 4:40 PMхм, интересна идеяще го проверятака или иначе в понеделник ще иде на прод,днес не ми се рискуваMessage Vasil Vasilev+Aa..•...
|
Slack
|
Vasil Vasilev (DM) - Jiminny Inc - 3 new items - S Vasil Vasilev (DM) - Jiminny Inc - 3 new items - Slack...
|
NULL
|
10130
|
|
10129
|
Switch workspaces… (Jiminny Inc) Has new messages
Switch workspaces… (Jiminny Inc) Has new messages
Home
Home
DMs
DMs
Activity
Activity
Files
Files
Later
Later
More…
More
Unreads
Threads
Huddles
Drafts & sent
1
Directories
jiminny-x-integration-app
platform-inner-team
ai-chapter
alerts
backend
bugs
confusion-clinic
curiosity_lab
engineering
general
jiminny-bg
platform-tickets
product_launches
random
releases
sofia-office
support
thank-yous
the_people_of_jiminny
Vasil Vasilev
Nikolay Ivanov
Galya Dimitrova
Aneliya Angelova
,
Nikolay Yankov
,
Steliyan Georgiev
Stoyan Tanev
PhostorimcodeFV faVsco.js?9 JY-20725-handle-HS-search-rate-limiProledey(© RemoteCrmobjectmanif © HubspotSyncStrategybase.png€ ResponseNormalize.phrCachedcrmservicebecorator.onpsyncrielaAction.ong© SyncRelatedActivityMar© MatchActivityCrmData.php© CrmActivityService.phgc) MatchermDatc wednooksynebalchrrov O IntegrationAppdosearchx 5 Cc wTIY:>D Accessors>© Api• contiaO DTOW) FiltersM.lobsclass service excenas baseservice znpcemencs903904 Cpubuic tunccion macchbybomaln scring saomain, tinc suserla = nulu: rarrayProspectSearchStrateg)ServiceTraitsC) DataClient.oho© DecorateActivity.php© LocalSearch.phpelocalSearchinterface.of© RemoteSearch.php(C) Service.phpv Ml isteners913© ConvertLeadActivities.p© PurgeLookupCache.php> D MetadataD Migration[ Pipedrive915917>C FieldsC OpportunityMatcher> @ OpportunitySyncStrated921›_ Prospectsearchstrateay>W ServiceTraits925(c) Client.phpc) [EMAIL]) FieldDefinitions.onvC) PavloadBuilder.ohv929930(C) Profile, ohoC) @uervBuilder.ohoC) @uerv.andler.ohoC) @uerviterator nhol9331934(C) @uervRecults.nhn© Service.php(C) SvncRatchRedicServicescompanyname = soomarn'Try to find a company matchina their emall domain.ScompanyProperties = ['hs avatar filemanader key!.try 1ShsAccounts = Sthis->clientl->getInstance->comnaniesol->ceanchRvlomain(ScomnanvName ScomnanvPronenties)•} catch (Throwable $e) {Sthis->logger->info('[HubSpot] Search failed', ['error' => $e->getMessage()D):return nulbSaccount = null:I/ If there are multiple accounts. don'+ quess.we'll ask laterif count(ShsAccounts->data->results) zz= 10 <Persist this remote obiect.Saccount = Sthis->svncAccount(ShsAccounts->data->results10l->comoanvid0•M Traite© BaseClient.php© BaseService.php(C CachodGrm CorvicaDacoratSdata = Sthis->conventcrmlatald contact: niin Saccount, Susentd).© CountryCodeResolver.php4) CrmActivitvProviderintegraneturn I emntvlannav filten(Sdata)) ? Sdata • null-rilo May 1/:20.14© ProspectCache.php=custom.log ^A SF (jiminny@localhost]4 HS_local [jiminny@localhost]# console [PKou.# console leu)# console [slAGiNg)[2026-05-07 14:21:15] local.INF0: [Hubspot] DEBUG Getting headers {"neaders".?"Uace":L"Inu,or May 2020 14.21.15 6Ml"Jn"Transter-Encod1nq":"chunked")."Connection":"keep-alive""CF-Ray" : ["9f80deb8db60dc3a-SOF"],"Strict-Transport-Secur1ty":"max-aqe=31536008* 1ncLudeSubDomains: preload")nacceot-encodino""server-timing": ["hcid;desc=\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\","x-hubspot-correlation-id":["019e02d0-6fd8-7812-bdba-885b7ccb3ee3"],"So+-Cookie"." c+hm-Stlirtd0aXVr.kSandas6hzVVKhzTn0BidvMaheCtm0V-1778163675-1.0.107-May-26 14:51:15 GMT; domain=.hubapi.com; Http0nly; Secure; SameSite=None"],"Renont-To".f"*"endpoints\":[{"unl".httns:la.nel.cloudflane.com./nenon+W/v42c=NVA1cVTPQfVm32anS0#xVF/sd2RN\"group\":\"cf-nel\","max_age\":604800}"]|"NEL":["{success_traccion.0.01rreportto. "cr-nel,"max age":604800}"]"Server": ["cloudflare"]}} {"correlation_1d":"95256555-ec78-4541-b9za-adta/Sb6Yeab"."trace_10":C/AD8565-905t-4604-9405-0e5b551e5545CascadeHubspot Rate LimitindAskJiminnyReportActivityServiceTest -Hubspot Rate Limit ReInvestigating Rate LinNew CascadeHubspot CRM Call ReActions/SyncArchivedProfilesAction.phpCallVia executeRequest()?Rate Limitapp/Services/Activity/HubSpot/Service.phpThis service uses Sthis=›crmService (the CRM Service.oho))- it makes no direct HubSpot APl calls itselt. All calls delegate through crmservice-›aetcal10, crmService->searchCallsForPeriod(), crmService->syncOpportunity(), crmService->parseRecords() .Critical Findings1. Line 1313 - raw searchApi→>doSearch - matchExactlyByParticipantinService.po:#Service.oho:1313)Sresponse = sthis->cuient->aetNewinstance->crmo->contactso-searchAoi->doSearchSoavload):• Goes comoletelv around the Client wraoper — no 429 handlina, no Ratel imitFxcention. no rate limit awareness•Uses the search rate limit bucket• Can be replaced with $this->client-›search('contacts', $payload) - same endpoint, same result, adds 429 protection,tine 020.022-comnandoctl.sconrchRuhorninfl_matchRuDomain/).• Service.php:920-923ShsAccounts = $this->client->getInstance()->companies()->searchByDomain(ScompanyName, ScompanyProperties):• Uses v1 SDK's searchByDomain which calls a search endooint — hits the search rate limit bucket• No 429 protection• Cannot be trivially replaced with client-›search() (different endpoint/format), but could be wrapped in executeRequest ()2.detdnnortunitvRvldhac executeReauestcommented out.• Client.php:238-239$deal = Sthis->executeRequest(fn () => $this->getNewInstance()->crm()->deals()->basicApi()->getById(• Deliberatelv disabled _ this means sinale deal fetches in HubsootSingleSvncStrateav also aet no 429 protection.Ask anvthina (&4L)Tnl "896-20UITE.Rfo 4 spaces...
|
Slack
|
Vasil Vasilev (DM) - Jiminny Inc - 3 new items - S Vasil Vasilev (DM) - Jiminny Inc - 3 new items - Slack...
|
NULL
|
10129
|
|
10128
|
Switch workspaces… (Jiminny Inc) Has new messages
Switch workspaces… (Jiminny Inc) Has new messages
Home
Home
DMs
DMs
Activity
Activity
Files
Files
Later
Later
More…
More
Unreads
Threads
Huddles
Drafts & sent
1
Directories
jiminny-x-integration-app
platform-inner-team
ai-chapter
alerts
backend
bugs
confusion-clinic
curiosity_lab
engineering
general
jiminny-bg
platform-tickets
product_launches
random
releases
sofia-office
support
thank-yous
the_people_of_jiminny
Vasil Vasilev
Nikolay Ivanov
Galya Dimitrova
Aneliya Angelova
,
Nikolay Yankov
,
Steliyan Georgiev
Stoyan Tanev
Stefka Stoyanova
Ves
Aneliya Angelova
James Graham
Lukas Kovalik
you
Toast
Jira Cloud
Messages
Messages
Add canvas
Add canvas
Files
Files
Pins
Pins
Add and Edit Channel Tabs
Canvas
List
Folder
Jump to date
Vasil Vasilev
Apr 28th at 4:51:31 PM
4:51 PM
a, ти искаш в amazon да добавим ключ за достъп до QAi ?
Apr 28th at 4:51:38 PM
4:51
Вес се грижи за тея неща
Apr 28th at 4:52:06 PM
4:52
дори не съм сигурен дали тоя ключ не трябва да бъде в CircleCI при билда на имиджа
Apr 28th at 4:52:10 PM
4:52
т.е.
Apr 28th at 4:52:12 PM
4:52
пак не знам
Lukas Kovalik
Apr 28th at 4:53:41 PM
4:53 PM
ок, ще питам Вес, мерси
Vasil Vasilev
Apr 28th at 5:00:16 PM
5:00 PM
моля
Jump to date
Vasil Vasilev
Today at 2:52:43 PM
2:52 PM
Лукаш, привет
Today at 2:52:48 PM
2:52
хвърли моля те едно око тука
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:52:49 PM
2:52
https://github.com/jiminny/app/pull/12059
https://github.com/jiminny/app/pull/12059
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:53:03 PM
2:53
опитвам се да оптимизирам процеса по индексиране на активитита за ЕС
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:54:16 PM
2:54
идеята е да намаля паметта която се ползва за да се генерира един бач от 100 активитита
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:54:35 PM
2:54
и после да увелича размера на бачовете, за да имаме по малко blocking операции в ЕС, като реиндексира
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 4:12:58 PM
4:12 PM
здрасти, изглежда ок, но когато го минах и през gemini ми даде един warning.
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:13:17 PM
4:13
Switch
cursor()
to
lazyById(250)
. It preserves the single-loop, generator-style code in the new version while restoring proper batched eager loading (avoiding N+1 on
getIndexableAttributes()
) and releasing the DB connection between chunks (avoiding long-held PDO connections during ES/Sentry calls).
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Vasil Vasilev
Today at 4:40:06 PM
4:40 PM
хм, интересна идея
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:41:03 PM
4:41
ще го проверя
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:41:17 PM
4:41
така или иначе в понеделник ще иде на прод, днес не ми се рискува
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
loading…
SlackFileEditViewGoHistoryWindowHelpLukás Koválik's No...ProGPHubspot API calls+n Home1000TestDailyAgents+ New agentWorkspace* Quick NoteWorkJira ticketView of SprintDailyPlanSprintStefka 1-1TododevEvaluationKnowledgera IdeasPrivateE Home viewsIntegration-appWork KnowledgeWork Knowledgetesting keyboard4Todo2 New chat x03 Hubspot / Hubspot API callsCritical Findings1. Line 1313 - rawsearchApi()->doSearch()- matchExlSresponse = Sthis->client->getNewInstance()->crm(• Goes completely around the Client wrapper - no 429• Uses the search rate limit bucket• Can be replaced with $this->client->search('contacts"2. Line 920-923 — companies()->searchByDomain() - m$hsAccounts = $this->client->getInstance()->compai• Uses v1 SDK's searchByDomainwhich calls a search e• No 429 protection• Cannot be trivially replaced with client->search() (diffePress 'space' for Al or 'l' for commands40QHomeDMsActivityFilesLater...MoreED→Jiminny... v# conrusion-clnic# curiosity_lab# engineering# general# jiminny-bg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi...• Direct messagese. Vasil Vasilevo Nikolay IvanovGalya DimitrovaAneliya Angelova, ...2 Stoyan Tanev €ã. Stefka StoyanovaC Vese. Aneliya Angelovado James GrahamLukas Kovalik y... O::: AppsToalJira Cloud100% CFri 8 May 17:19:43Describe what you are looking forVasil Vasilev6 0MessagesAdd canvasлукаш, привет@ Files< Pins+Todayхвърли моля те смгукаhttps://github.com/jiminny/app/pull/12059опитвам се да оптимизирам процеса поиндексиране на активитита за ЕСидеята е да намаля паметта която се ползва зада се генерира един бач от 100 активититаи после да увелича размера на бачовете, за даимаме по малко blocking операции в ЕС, катореиндексираLukas Kovalik 4:12 PMздрасти, изглежда ок, но когато го минах и презgemini ми даде един warning.Switch cursor() to lazyById(250) . It preservesthe single-loop, generator-style code in the newversion while restoring proper batched eagerloading (avoiding N+1 ongetIndexableAttributes() ) and releasing the DBconnection between chunks (avoiding long-heldPDO connections during ES/Sentry calls).Vasil Vasilev 4:40 PMхм, интересна идеяще го проверятака или иначе в понеделник ще иде на прод,днес не ми се рискуваMessage Vasil Vasilev+Aa..•...
|
Slack
|
Vasil Vasilev (DM) - Jiminny Inc - 3 new items - S Vasil Vasilev (DM) - Jiminny Inc - 3 new items - Slack...
|
NULL
|
10128
|
|
10127
|
Switch workspaces… (Jiminny Inc) Has new messages
Switch workspaces… (Jiminny Inc) Has new messages
Home
Home
DMs
DMs
Activity
Activity
Files
Files
Later
Later
More…
More
Unreads
Threads
Huddles
Drafts & sent
1
Directories
jiminny-x-integration-app
platform-inner-team
ai-chapter
alerts
backend
bugs
confusion-clinic
curiosity_lab
engineering
general
jiminny-bg
platform-tickets
product_launches
random
releases
sofia-office
support
thank-yous
the_people_of_jiminny
Vasil Vasilev
Nikolay Ivanov
Galya Dimitrova
Aneliya Angelova
,
Nikolay Yankov
,
Steliyan Georgiev
Stoyan Tanev
Stefka Stoyanova
Ves
Aneliya Angelova
James Graham
Lukas Kovalik
you
Toast
Jira Cloud
Messages
Messages
Add canvas
Add canvas
Files
Files
Pins
Pins
Add and Edit Channel Tabs
Canvas
List
Folder
Jump to date
Vasil Vasilev
Apr 28th at 4:51:31 PM
4:51 PM
a, ти искаш в amazon да добавим ключ за достъп до QAi ?
Apr 28th at 4:51:38 PM
4:51
Вес се грижи за тея неща
Apr 28th at 4:52:06 PM
4:52
дори не съм сигурен дали тоя ключ не трябва да бъде в CircleCI при билда на имиджа
Apr 28th at 4:52:10 PM
4:52
т.е.
Apr 28th at 4:52:12 PM
4:52
пак не знам
Lukas Kovalik
Apr 28th at 4:53:41 PM
4:53 PM
ок, ще питам Вес, мерси
Vasil Vasilev
Apr 28th at 5:00:16 PM
5:00 PM
моля
Jump to date
Vasil Vasilev
Today at 2:52:43 PM
2:52 PM
Лукаш, привет
Today at 2:52:48 PM
2:52
хвърли моля те едно око тука
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:52:49 PM
2:52
https://github.com/jiminny/app/pull/12059
https://github.com/jiminny/app/pull/12059
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:53:03 PM
2:53
опитвам се да оптимизирам процеса по индексиране на активитита за ЕС
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:54:16 PM
2:54
идеята е да намаля паметта която се ползва за да се генерира един бач от 100 активитита
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:54:35 PM
2:54
и после да увелича размера на бачовете, за да имаме по малко blocking операции в ЕС, като реиндексира
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 4:12:58 PM
4:12 PM
здрасти, изглежда ок, но когато го минах и през gemini ми даде един warning.
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:13:17 PM
4:13
Switch
cursor()
to
lazyById(250)
. It preserves the single-loop, generator-style code in the new version while restoring proper batched eager loading (avoiding N+1 on
getIndexableAttributes()
) and releasing the DB connection between chunks (avoiding long-held PDO connections during ES/Sentry calls).
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Vasil Vasilev
Today at 4:40:06 PM
4:40 PM
хм, интересна идея
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:41:03 PM
4:41
ще го проверя
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:41:17 PM
4:41
така или иначе в понеделник ще иде на прод, днес не ми се рискува
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
loading…
PhostorimcodeFV faVsco.js?9 JY-20725-handle-HS-search-rate-limiProledey(© RemoteCrmobjectmanif © HubspotSyncStrategybase.png€ ResponseNormalize.pheCachedcrmservicebecorator.onpsyncrielaAction.ong© SyncRelatedActivityMar© MatchActivityCrmData.php© CrmActivityService.phgc) MatchermDatc wednooksynebalchrrov O IntegrationAppdosearchx 5 Cc WTIY:>D Accessors> Api• contiaO DTOW) FiltersM.lobsclass service excenas baseservice znpcemencs903904 Cpubuic tunccion macchbybomaln scring saomain, tinc suserla = nulu: rarrayProspectSearchStrateg)ServiceTraitsC) DataClient.oho© DecorateActivity.php© LocalSearch.phpelocalSearchinterface.of© RemoteSearch.php(C) Service.phpv Ml isteners913© ConvertLeadActivities.p© PurgeLookupCache.php> D MetadataD Migration[ Pipedrive915917>C FieldsC OpportunityMatcher> @ OpportunitySyncStrated921›_ Prospectsearchstrateay>W ServiceTraits925(c) Client.phpc) [EMAIL]) FieldDefinitions.onvC) PavloadBuilder.ohv929930(C) Profile, ohoC) @uervBuilder.ohoC) @uerv.andler.ohoC) @uerviterator nhol9331934(C) @uervRecults.nhn© Service.php(C) SvncRatchRedicServicescompanyname = soomarn'Try to find a company matchina their emall domain.ScompanyProperties = ['hs avatar filemanader key!.try 1ShsAccounts = Sthis->clientl->getInstance->comnaniesol->ceanchRvlomain(ScomnanvName ScomnanvPronenties)•} catch (Throwable $e) {Sthis->logger->info('[HubSpot] Search failed', ['error' => $e->getMessage()D):return nulbSaccount = null:I/ If there are multiple accounts. don'+ quess.we'll ask laterif count(ShsAccounts->data->results) zz= 10 <Persist this remote obiect.Saccount = Sthis->svncAccount(ShsAccounts->data->results10l->comoanvid0•M Traite© BaseClient.php© BaseService.php(C CachodGrm CorvicaDacoratSdata = Sthis->conventcrmlatald contact: niin Saccount, Susentd).© CountryCodeResolver.php4) CrmActivitvProviderintegraneturn I emntvlannav filten(Sdata)) ? Sdata • null-ril o May 1/.19.4© ProspectCache.phpB7B48 MMSSATATl HI=custom.log ^4 SF (jiminny@localhost]4 HS_local (jiminny@localhost]# console [PKou.# console leu)# console [slAGiNg)[2026-05-07 14:21:15] local.INF0: [Hubspot] DEBUG Getting headers {"neaders".?"Uace":L"Inu,or May 2020 14.21.15 6Ml"Jn"Transter-Encod1nq":"chunked")."Connection":"keep-alive""CF-Ray" : ["9f80deb8db60dc3a-SOF"],"Strict-Transport-Secur1ty":"max-aqe=31536008* 1ncLudeSubDomains: preload")nacceot-encodino""server-timing": ["hcid;desc=\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\","x-hubspot-correlation-id":["019e02d0-6fd8-7812-bdba-885b7ccb3ee3"],"So+-Cookie"." c+hm-Stlirtd0aXVr.kSandas6hzVVKhzTn0BidvMaheCtm0V-1778163675-1.0.107-May-26 14:51:15 GMT; domain=.hubapi.com; Http0nly; Secure; SameSite=None"],"Renont-To".f"*"endpoints\":[{"unl".httns:la.nel.cloudflane.com./nenon+W/v42c=NVA1cVTPQfVm32anS0#xVF/sd2RN\"group\":\"cf-nel\","max_age\":604800}"]|"NEL": ["1success_traccion.0.01rreportto. "cr-nel,"max age":604800}"]"Server": ["cloudflare"]}} {"correlation_1d":"95256555-ec78-4541-b9za-adta/Sb6Yeab"."trace_10":C/AD8565-905t-4604-9405-0e5b551e5545CascadeHubspot Rate LimitindAskJiminnyReportActivityServiceTest -Hubspot Rate Limit ReInvestigating Rate LinNew CascadeHubspot CRM Call Re- 11I1Actions/SyncArchivedProfilesAction.phpCallVia executeRequest()?Rate Limitapp/Services/Activity/HubSpot/Service.phpThis service uses Sthis=›crmService (the CRM Service.oho))- it makes no direct HubSpot APl calls itselt. All calls delegate through crmservice-›aetcal10, crmService->searchCallsForPeriod(), crmService->syncOpportunity(), crmService->parseRecords() .Critical Findings1. Line 1313 - raw searchApi→>doSearch - matchExactlyByParticipantinService.po:#Service.oho:1313)Sresponse = sthis->cuient->aetNewinstance->crmo->contactso-searchAoi->doSearchSoavload):• Goes comoletelv around the Client wraoper — no 429 handlina, no Ratel imitFxcention. no rate limit awareness•Uses the search rate limit bucket• Can be replaced with $this->client-›search('contacts', $payload) - same endpoint, same result, adds 429 protection,tine 020.022-comnandoctl.sconrchRuhorninfl_matchRuDomain/).• Service.php:920-923ShsAccounts = $this->client->getInstance()->companies()->searchByDomain(ScompanyName, ScompanyProperties):• Uses v1 SDK's searchByDomain which calls a search endooint — hits the search rate limit bucket• No 429 protection• Cannot be trivially replaced with client-›search() (different endpoint/format), but could be wrapped in executeRequest ()2.detdnnortunitvRvldhac executeReauestcommented out.• Client.php:238-239$deal = Sthis->executeRequest(fn () => $this->getNewInstance()->crm()->deals()->basicApi()->getById(• Deliberatelv disabled _ this means sinale deal fetches in HubsootSingleSvncStrateav also aet no 429 protection.Ask anvthina (&4L)Tnl "896-20UITE.Rfo 4 spaces...
|
Slack
|
Vasil Vasilev (DM) - Jiminny Inc - 3 new items - S Vasil Vasilev (DM) - Jiminny Inc - 3 new items - Slack...
|
NULL
|
10127
|
|
10126
|
Switch workspaces… (Jiminny Inc) Has new messages
Switch workspaces… (Jiminny Inc) Has new messages
Home
Home
DMs
DMs
Activity
Activity
Files
Files
Later
Later
More…
More
Unreads
Threads
Huddles
Drafts & sent
1
Directories
jiminny-x-integration-app
platform-inner-team
ai-chapter
alerts
backend
bugs
confusion-clinic
curiosity_lab
engineering
general
jiminny-bg
platform-tickets
product_launches
random
releases
sofia-office
support
thank-yous
the_people_of_jiminny
Vasil Vasilev
Nikolay Ivanov
Galya Dimitrova
Aneliya Angelova
,
Nikolay Yankov
,
Steliyan Georgiev
Stoyan Tanev
Stefka Stoyanova
Ves
Aneliya Angelova
James Graham
Lukas Kovalik
you
Toast
Jira Cloud
Messages
Messages
Add canvas
Add canvas
Files
Files
Pins
Pins
Add and Edit Channel Tabs
Canvas
List
Folder
Jump to date
Vasil Vasilev
Apr 28th at 4:51:31 PM
4:51 PM
a, ти искаш в amazon да добавим ключ за достъп до QAi ?
SlackFileEditViewGoHistoryWindowHelpLukás Koválik's No...ProGPHubspot API calls+n Home1000TestDailyAgents+ New agentWorkspace* Quick NoteWorkJira ticketView of SprintDailyPlanSprintStefka 1-1TododevEvaluationKnowledgera IdeasPrivateE Home viewsIntegration-appWork KnowledgeWork Knowledgetesting keyboard4Todo2 New chat x03 Hubspot / Hubspot API callsCritical Findings1. Line 1313 - rawsearchApi()->doSearch()- matchExlSresponse = Sthis->client->getNewInstance()->crm(• Goes completely around the Client wrapper - no 429• Uses the search rate limit bucket• Can be replaced with $this->client->search('contacts"2. Line 920-923 — companies()->searchByDomain() - m$hsAccounts = $this->client->getInstance()->compai• Uses v1 SDK's searchByDomainwhich calls a search e• No 429 protection• Cannot be trivially replaced with client->search() (diffePress 'space' for Al or 'l' for commands40QHomeDMsActivityFilesLater...MoreED→Jiminny... v# conrusion-clnic# curiosity_lab# engineering# general# jiminny-bg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi...• Direct messagese. Vasil Vasilevo Nikolay Ivanov®. Galya DimitrovaAneliya Angelova, ...2 Stoyan Tanev €ã. Stefka StoyanovaC Vese. Aneliya Angelova& James GrahamLukas Kovalik y... O::: AppsToalJira Cloud100% CFri 8 May 17:19:11Describe what you are looking forVasil Vasilev6 0MessagesAdd canvasлукаш, привет@ Files< Pins+Todayхвърли моля те смгукаhttps://github.com/jiminny/app/pull/12059опитвам се да оптимизирам процеса поиндексиране на активитита за ЕСидеята е да намаля паметта която се ползва зада се генерира един бач от 100 активититаи после да увелича размера на бачовете, за даимаме по малко blocking операции в ЕС, катореиндексираLukas Kovalik 4:12 PMздрасти, изглежда ок, но когато го минах и презgemini ми даде един warning.Switch cursor() to lazyById(250) . It preservesthe single-loop, generator-style code in the newversion while restoring proper batched eagerloading (avoiding N+1 ongetIndexableAttributes() ) and releasing the DBconnection between chunks (avoiding long-heldPDO connections during ES/Sentry calls).Vasil Vasilev 4:40 PMхм, интересна идеяще го проверятака или иначе в понеделник ще иде на прод,днес не ми се рискуваMessage Vasil Vasilev+Aa..•...
|
Slack
|
Vasil Vasilev (DM) - Jiminny Inc - 3 new items - S Vasil Vasilev (DM) - Jiminny Inc - 3 new items - Slack...
|
NULL
|
10126
|
|
10125
|
Switch workspaces… (Jiminny Inc) Has new messages
Switch workspaces… (Jiminny Inc) Has new messages
Home
Home
DMs
DMs
Activity
Activity
Files
Files
Later
Later
More…
More
Unreads
Threads
Huddles
Drafts & sent
1
Directories
jiminny-x-integration-app
platform-inner-team
ai-chapter
alerts
backend
bugs
confusion-clinic
curiosity_lab
engineering
general
jiminny-bg
platform-tickets
product_launches
random
releases
sofia-office
support
thank-yous
the_people_of_jiminny
Vasil Vasilev
Nikolay Ivanov
Galya Dimitrova
Aneliya Angelova
,
Nikolay Yankov
,
Steliyan Georgiev
Stoyan Tanev
Stefka Stoyanova
Ves
Aneliya Angelova
James Graham
Lukas Kovalik
you
Toast
Jira Cloud
Messages
Messages
Add canvas
Add canvas
Files
Files
Pins
Pins
Add and Edit Channel Tabs
Canvas
List
Folder
Jump to date
Vasil Vasilev
Apr 28th at 4:51:31 PM
4:51 PM
a, ти искаш в amazon да добавим ключ за достъп до QAi ?
Apr 28th at 4:51:38 PM
4:51
Вес се грижи за тея неща
Apr 28th at 4:52:06 PM
4:52
дори не съм сигурен дали тоя ключ не трябва да бъде в CircleCI при билда на имиджа
Apr 28th at 4:52:10 PM
4:52
т.е.
Apr 28th at 4:52:12 PM
4:52
пак не знам
Lukas Kovalik
Apr 28th at 4:53:41 PM
4:53 PM
ок, ще питам Вес, мерси
Vasil Vasilev
Apr 28th at 5:00:16 PM
5:00 PM
моля
Jump to date
Vasil Vasilev
Today at 2:52:43 PM
2:52 PM
Лукаш, привет
Today at 2:52:48 PM
2:52
хвърли моля те едно око тука
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:52:49 PM
2:52
https://github.com/jiminny/app/pull/12059
https://github.com/jiminny/app/pull/12059
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:53:03 PM
2:53
опитвам се да оптимизирам процеса по индексиране на активитита за ЕС
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:54:16 PM
2:54
идеята е да намаля паметта която се ползва за да се генерира един бач от 100 активитита
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:54:35 PM
2:54
и после да увелича размера на бачовете, за да имаме по малко blocking операции в ЕС, като реиндексира
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 4:12:58 PM
4:12 PM
здрасти, изглежда ок, но когато го минах и през gemini ми даде един warning.
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:13:17 PM
4:13
Switch
cursor()
to
lazyById(250)
. It preserves the single-loop, generator-style code in the new version while restoring proper batched eager loading (avoiding N+1 on
getIndexableAttributes()
) and releasing the DB connection between chunks (avoiding long-held PDO connections during ES/Sentry calls).
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Vasil Vasilev
Today at 4:40:06 PM
4:40 PM
хм, интересна идея
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:41:03 PM
4:41
ще го проверя
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:41:17 PM
4:41
така или иначе в понеделник ще иде на прод, днес не ми се рискува
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
loading…
PhostorimcodeFV faVsco.js?9 JY-20725-handle-HS-search-rate-limiProledey(© RemoteCrmobjectmanif © HubspotSyncStrategybase.png€ ResponseNormalize.pheCachedcrmservicebecorator.onpsyncrielaAction.ong© SyncRelatedActivityMar© MatchActivityCrmData.php© CrmActivityService.phgc) MatchermDatc wednooksynebalchrrov O IntegrationAppdosearchx 5 Cc WTIY:>D Accessors> Api• contiaO DTOW) FiltersM.lobsclass service excenas baseservice znpcemencs903904 Cpubuic tunccion macchbybomaln scring saomain, tinc suserla = nulu: rarrayProspectSearchStrateg)ServiceTraitsC) DataClient.oho© DecorateActivity.php© LocalSearch.phpelocalSearchinterface.of© RemoteSearch.php(C) Service.phpv Ml isteners913© ConvertLeadActivities.p© PurgeLookupCache.php> D MetadataD Migration[ Pipedrive915917>C Fields0 OpportunityMatcher> @ OpportunitySyncStrated921›_ Prospectsearchstrateay>W ServiceTraits925(c) Client.phpc) [EMAIL]) FieldDefinitions.onvC) PavloadBuilder.ohv929930(C) Profile, ohoC) @uervBuilder.ohoC) @uerv.andler.ohoC) @uerviterator nhol9331934(C) @uervRecults.nhn© Service.php(C) SvncRatchRedicServicescompanyname = soomarn'Try to find a company matchina their emall domain.ScompanyProperties = ['hs avatar filemanader key!.try 1ShsAccounts = Sthis->clientl->getInstance->comnaniesol->ceanchRvlomain(ScomnanvName ScomnanvPronenties)•} catch (Throwable $e) {Sthis->logger->info('[HubSpot] Search failed', ['error' => $e->getMessage()D):return nulbSaccount = null:I/ If there are multiple accounts. don'+ quess.we'll ask laterif count(ShsAccounts->data->results) zz= 10 <Persist this remote obiect.Saccount = Sthis->svncAccount(ShsAccounts->data->results10l->comoanvid0•M Traite© BaseClient.php© BaseService.php(C CachodGrm CorvicaDacoratSdata = Sthis->conventcrmlatald contact: niin Saccount, Susentd).© CountryCodeResolver.php4) CrmActivitvProviderintegraneturn I emntvlannav filten(Sdata)) ? Sdata • null-rilo May 1/.19.01© ProspectCache.phpB7B48 MMSSATATl HI=custom.log ^A SF (jiminny@localhost]4 HS_local (jiminny@localhost]# console [PKou.# console leu)# console [slAGiNg)[2026-05-07 14:21:15] local.INF0: [Hubspot] DEBUG Getting headers {"neaders".?"Uace":L"Inu,or May 2020 14.21.15 6Ml"Jn"Transter-Encod1nq":"chunked")."Connection":"keep-alive""CF-Ray" : ["9f80deb8db60dc3a-SOF"],"Strict-Transport-Secur1ty":"max-aqe=31536008* 1ncLudeSubDomains: preload")nacceot-encodino""server-timing": ["hcid;desc=\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\","x-hubspot-correlation-id":["019e02d0-6fd8-7812-bdba-885b7ccb3ee3"],"So+-Cookie"." c+hm-Stlirtd0aXVr.kSandas6hzVVKhzTn0BidvMaheCtm0V-1778163675-1.0.107-May-26 14:51:15 GMT; domain=.hubapi.com; Http0nly; Secure; SameSite=None"],"Renont-To".f"*"endpoints\":[{"unl".httns:la.nel.cloudflane.com./nenon+W/v42c=NVA1cVTPQfVm32anS0#xVF/sd2RN\"group\":\"cf-nel\","max_age\":604800}"]|"NEL": ["1success_traccion.0.01rreportto. "cr-nel,"max age":604800}"]"Server": ["cloudflare"]}} {"correlation_1d":"95256555-ec78-4541-b9za-adta/Sb6Yeab"."trace_10":C/AD8565-905t-4604-9405-0e5b551e5545CascadeHubspot Rate LimitindAskJiminnyReportActivityServiceTest -Hubspot Rate Limit ReInvestigating Rate LinNew CascadeHubspot CRM Call Re- 11I1Actions/SyncArchivedProfilesAction.phpCallVia executeRequest()?Rate Limitapp/Services/Activity/HubSpot/Service.phpThis service uses Sthis=›crmService (the CRM Service.oho))- it makes no direct HubSpot APl calls itselt. All calls delegate through crmservice-›aetcal10, crmService->searchCallsForPeriod(), crmService->syncOpportunity(), crmService->parseRecords() .Critical Findings1. Line 1313 - raw searchApi→>doSearch - matchExactlyByParticipantinService.po:#Service.oho:1313)Sresponse = sthis->cuient->aetNewinstance->crmo->contactso-searchAoi->doSearchSoavload):• Goes comoletelv around the Client wraoper — no 429 handlina, no Ratel imitFxcention. no rate limit awareness•Uses the search rate limit bucket• Can be replaced with $this->client-›search('contacts', $payload) - same endpoint, same result, adds 429 protection,tine 020.022-comnandoctl.sconrchRuhorninfl_matchRuDomain/).• Service.php:920-923ShsAccounts = $this->client->getInstance()->companies()->searchByDomain(ScompanyName, ScompanyProperties):• Uses v1 SDK's searchByDomain which calls a search endooint — hits the search rate limit bucket• No 429 protection• Cannot be trivially replaced with client-›search() (different endpoint/format), but could be wrapped in executeRequest ()2.detdnnortunitvRvldhac executeReauestcommented out.• Client.php:238-239$deal = Sthis->executeRequest(fn () => $this->getNewInstance()->crm()->deals()->basicApi()->getById(• Deliberatelv disabled _ this means sinale deal fetches in HubsootSingleSvncStrateav also aet no 429 protection.Ask anvthina (&4L)Tnl "896-20UITE.Rfo 4 spaces...
|
Slack
|
Vasil Vasilev (DM) - Jiminny Inc - 3 new items - S Vasil Vasilev (DM) - Jiminny Inc - 3 new items - Slack...
|
NULL
|
10125
|
|
10124
|
Switch workspaces… (Jiminny Inc) Has new messages
Switch workspaces… (Jiminny Inc) Has new messages
Home
Home
DMs
DMs
Activity
Activity
Files
Files
Later
Later
More…
More
Unreads
Threads
Huddles
Drafts & sent
1
Directories
jiminny-x-integration-app
platform-inner-team
ai-chapter
alerts
backend
bugs
confusion-clinic
curiosity_lab
engineering
general
jiminny-bg
platform-tickets
product_launches
random
releases
sofia-office
support
thank-yous
the_people_of_jiminny
Vasil Vasilev
Nikolay Ivanov
Galya Dimitrova
Aneliya Angelova
,
Nikolay Yankov
,
Steliyan Georgiev
Stoyan Tanev
Stefka Stoyanova
Ves
Aneliya Angelova
James Graham
Lukas Kovalik
you
Toast
Jira Cloud
Messages
Messages
Add canvas
Add canvas
Files
Files
Pins
Pins
Add and Edit Channel Tabs
Canvas
List
Folder
Jump to date
Vasil Vasilev
Apr 28th at 4:51:31 PM
4:51 PM
a, ти искаш в amazon да добавим ключ за достъп до QAi ?
Apr 28th at 4:51:38 PM
4:51
Вес се грижи за тея неща
Apr 28th at 4:52:06 PM
4:52
дори не съм сигурен дали тоя ключ не трябва да бъде в CircleCI при билда на имиджа
Apr 28th at 4:52:10 PM
4:52
т.е.
Apr 28th at 4:52:12 PM
4:52
пак не знам
Lukas Kovalik
Apr 28th at 4:53:41 PM
4:53 PM
ок, ще питам Вес, мерси
Vasil Vasilev
Apr 28th at 5:00:16 PM
5:00 PM
моля
Jump to date
Vasil Vasilev
Today at 2:52:43 PM
2:52 PM
Лукаш, привет
Today at 2:52:48 PM
2:52
хвърли моля те едно око тука
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:52:49 PM
2:52
https://github.com/jiminny/app/pull/12059
https://github.com/jiminny/app/pull/12059
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:53:03 PM
2:53
опитвам се да оптимизирам процеса по индексиране на активитита за ЕС
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:54:16 PM
2:54
идеята е да намаля паметта която се ползва за да се генерира един бач от 100 активитита
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:54:35 PM
2:54
и после да увелича размера на бачовете, за да имаме по малко blocking операции в ЕС, като реиндексира
SlackFileEditViewGoHistoryWindowHelpLukás Koválik's No...ProGPHubspot API calls+n Home1000TestDailyAgents+ New agentWorkspace* Quick NoteWorkJira ticketView of SprintDailyPlanSprintStefka 1-1TododevEvaluationKnowledgera IdeasPrivateE Home viewsIntegration-appWork KnowledgeWork Knowledgetesting keyboard4Todo2 New chat x03 Hubspot / Hubspot API callsCritical Findings1. Line 1313 - rawsearchApi()->doSearch()- matchExlSresponse = Sthis->client->getNewInstance()->crm(• Goes completely around the Client wrapper - no 429• Uses the search rate limit bucket• Can be replaced with $this->client->search('contacts"2. Line 920-923 — companies()->searchByDomain() - m$hsAccounts = $this->client->getInstance()->compai• Uses v1 SDK's searchByDomainwhich calls a search e• No 429 protection• Cannot be trivially replaced with client->search() (diffePress 'space' for Al or 'l' for commands40QHomeDMsActivityFilesLater...MoreED→Jiminny... v# conrusion-clnic# curiosity_lab# engineering# general# jiminny-bg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi...• Direct messagese. Vasil Vasilevo Nikolay IvanovGalya DimitrovaAneliya Angelova, ...2 Stoyan Tanev €ã. Stefka StoyanovaC Vese. Aneliya Angelova& James GrahamLukas Kovalik y... O::: AppsToalJira Cloud100% CFri 8 May 17:18:36Describe what you are looking forVasil Vasilev6 0MessagesAdd canvasлукаш, привет@ Files< Pins+Todayхвърли моля те смгукаhttps://github.com/jiminny/app/pull/12059опитвам се да оптимизирам процеса поиндексиране на активитита за ЕСидеята е да намаля паметта която се ползва зада се генерира един бач от 100 активититаи после да увелича размера на бачовете, за даимаме по малко blocking операции в ЕС, катореиндексираLukas Kovalik 4:12 PMздрасти, изглежда ок, но когато го минах и презgemini ми даде един warning.Switch cursor() to lazyById(250) . It preservesthe single-loop, generator-style code in the newversion while restoring proper batched eagerloading (avoiding N+1 ongetIndexableAttributes() ) and releasing the DBconnection between chunks (avoiding long-heldPDO connections during ES/Sentry calls).Vasil Vasilev 4:40 PMхм, интересна идеяще го проверятака или иначе в понеделник ще иде на прод,днес не ми се рискуваMessage Vasil Vasilev+Aa..•...
|
Slack
|
Vasil Vasilev (DM) - Jiminny Inc - 3 new items - S Vasil Vasilev (DM) - Jiminny Inc - 3 new items - Slack...
|
NULL
|
10124
|
|
10123
|
Switch workspaces… (Jiminny Inc) Has new messages
Switch workspaces… (Jiminny Inc) Has new messages
Home
Home
DMs
DMs
Activity
Activity
Files
Files
Later
Later
More…
More
Unreads
Threads
Huddles
Drafts & sent
1
Directories
jiminny-x-integration-app
platform-inner-team
ai-chapter
alerts
backend
bugs
confusion-clinic
curiosity_lab
engineering
general
jiminny-bg
platform-tickets
product_launches
random
releases
sofia-office
support
thank-yous
the_people_of_jiminny
Vasil Vasilev
Nikolay Ivanov
Galya Dimitrova
Aneliya Angelova
,
Nikolay Yankov
,
Steliyan Georgiev
Stoyan Tanev
Stefka Stoyanova
Ves
Aneliya Angelova
James Graham
Lukas Kovalik
you
Toast
Jira Cloud
Messages
Messages
Add canvas
Add canvas
Files
Files
Pins
Pins
Add and Edit Channel Tabs
Canvas
List
Folder
Jump to date
Vasil Vasilev
Apr 28th at 4:51:31 PM
4:51 PM
a, ти искаш в amazon да добавим ключ за достъп до QAi ?
Apr 28th at 4:51:38 PM
4:51
Вес се грижи за тея неща
Apr 28th at 4:52:06 PM
4:52
дори не съм сигурен дали тоя ключ не трябва да бъде в CircleCI при билда на имиджа
Apr 28th at 4:52:10 PM
4:52
т.е.
Apr 28th at 4:52:12 PM
4:52
пак не знам
Lukas Kovalik
Apr 28th at 4:53:41 PM
4:53 PM
ок, ще питам Вес, мерси
Vasil Vasilev
Apr 28th at 5:00:16 PM
5:00 PM
моля
Jump to date
Vasil Vasilev
Today at 2:52:43 PM
2:52 PM
Лукаш, привет
Today at 2:52:48 PM
2:52
хвърли моля те едно око тука
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:52:49 PM
2:52
https://github.com/jiminny/app/pull/12059
https://github.com/jiminny/app/pull/12059
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:53:03 PM
2:53
опитвам се да оптимизирам процеса по индексиране на активитита за ЕС
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:54:16 PM
2:54
идеята е да намаля паметта която се ползва за да се генерира един бач от 100 активитита
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:54:35 PM
2:54
и после да увелича размера на бачовете, за да имаме по малко blocking операции в ЕС, като реиндексира
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 4:12:58 PM
4:12 PM
здрасти, изглежда ок, но когато го минах и през gemini ми даде един warning.
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:13:17 PM
4:13
Switch
cursor()
to
lazyById(250)
. It preserves the single-loop, generator-style code in the new version while restoring proper batched eager loading (avoiding N+1 on
getIndexableAttributes()
) and releasing the DB connection between chunks (avoiding long-held PDO connections during ES/Sentry calls).
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Vasil Vasilev
Today at 4:40:06 PM
4:40 PM
хм, интересна идея
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:41:03 PM
4:41
ще го проверя
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:41:17 PM
4:41
така или иначе в понеделник ще иде на прод, днес не ми се рискува
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
loading…
PhostorimcodeFV faVsco.js?9 JY-20725-handle-HS-search-rate-limiProledey(© RemoteCrmobjectmanif © HubspotSyncStrategybase.png€ ResponseNormalize.pheCachedcrmservicebecorator.onpsyncrielaAction.ong© SyncRelatedActivityMar© MatchActivityCrmData.php© CrmActivityService.phgc) MatchermDatc wednooksynebalchrrov O IntegrationAppdosearchx 5 Cc WTIY:>D Accessors> Api• contiaO DTOW) FiltersM.lobsclass service excenas baseservice znpcemencs903904 Cpubuic tunccion macchbybomaln scring saomain, tinc suserla = nulu: rarrayProspectSearchStrateg)ServiceTraitsC) DataClient.oho© DecorateActivity.php© LocalSearch.phpelocalSearchinterface.of© RemoteSearch.php(C) Service.phpv Ml isteners913© ConvertLeadActivities.p© PurgeLookupCache.php> D MetadataD Migration[ Pipedrive915917>C Fields0 OpportunityMatcher> @ OpportunitySyncStrated921›_ Prospectsearchstrateay>W ServiceTraits925(c) Client.phpc) [EMAIL]) FieldDefinitions.onvC) PavloadBuilder.ohv929930(C) Profile, ohoC) @uervBuilder.ohoC) @uerv.andler.ohoC) @uerviterator nhol9331934(C) @uervRecults.nhn© Service.php(C) SvncRatchRedicServicescompanyname = soomarn'Try to find a company matchina their emall domain.ScompanyProperties = ['hs avatar filemanader key!.try 1ShsAccounts = Sthis->clientl->getInstance->comnaniesol->ceanchRvlomain(ScomnanvName ScomnanvPronenties)•} catch (Throwable $e) {Sthis->logger->info('[HubSpot] Search failed', ['error' => $e->getMessage()D):return nulbSaccount = null:I/ If there are multiple accounts. don'+ quess.we'll ask laterif count(ShsAccounts->data->results) zz= 10 <Persist this remote obiect.Saccount = Sthis->svncAccount(ShsAccounts->data->results10l->comoanvid0•M Traite© BaseClient.php© BaseService.php(C CachodGrm CorvicaDacoratSdata = Sthis->conventcrmlatald contact: niin Saccount, Susentd).© CountryCodeResolver.php4) CrmActivitvProviderintegraneturn I emntvlannav filten(Sdata)) ? Sdata • null-rilo May 1/:10.32© ProspectCache.phpB7B48 MMSSATATl HI=custom.log ^A SF (jiminny@localhost]4 HS_local (jiminny@localhost]# console [PKou.# console leu)# console [slAGiNg)[2026-05-07 14:21:15] local.INF0: [Hubspot] DEBUG Getting headers {"neaders".?"Uace":L"Inu,or May 2020 14.21.15 6Ml"Jn"Transter-Encod1nq":"chunked")."Connection":"keep-alive""CF-Ray" : ["9f80deb8db60dc3a-SOF"],"Strict-Transport-Secur1ty":"max-aqe=31536008* 1ncLudeSubDomains: preload")nacceot-encodino""server-timing": ["hcid;desc=\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\","x-hubspot-correlation-id":["019e02d0-6fd8-7812-bdba-885b7ccb3ee3"],"So+-Cookie"." c+hm-Stlirtd0aXVr.kSandas6hzVVKhzTn0BidvMaheCtm0V-1778163675-1.0.107-May-26 14:51:15 GMT; domain=.hubapi.com; Http0nly; Secure; SameSite=None"],"Renont-To".f"*"endpoints\":[{"unl".httns:la.nel.cloudflane.com./nenon+W/v42c=NVA1cVTPQfVm32anS0#xVF/sd2RN\"group\":\"cf-nel\","max_age\":604800}"]|"NEL": ["1success_traccion.0.01rreportto. "cr-nel,"max age":604800}"]"Server": ["cloudflare"]}} {"correlation_1d":"95256555-ec78-4541-b9za-adta/Sb6Yeab"."trace_10":C/AD8565-905t-4604-9405-0e5b551e5545CascadeHubspot Rate LimitindAskJiminnyReportActivityServiceTest -Hubspot Rate Limit ReInvestigating Rate LinNew CascadeHubspot CRM Call Re- 11I1Actions/SyncArchivedProfilesAction.phpCallVia executeRequest()?Rate Limitapp/Services/Activity/HubSpot/Service.phpThis service uses Sthis=›crmService (the CRM Service.oho))- it makes no direct HubSpot APl calls itselt. All calls delegate through crmservice-›aetcal10, crmService->searchCallsForPeriod(), crmService->syncOpportunity(), crmService->parseRecords() .Critical Findings1. Line 1313 - raw searchApi→>doSearch - matchExactlyByParticipantinService.po:#Service.oho:1313)Sresponse = sthis->cuient->aetNewinstance->crmo->contactso-searchAoi->doSearchSoavload):• Goes comoletelv around the Client wraoper — no 429 handlina, no Ratel imitFxcention. no rate limit awareness•Uses the search rate limit bucket• Can be replaced with $this->client-›search('contacts', $payload) - same endpoint, same result, adds 429 protection,tine 020.022-comnandoctl.sconrchRuhorninfl_matchRuDomain/).• Service.php:920-923ShsAccounts = $this->client->getInstance()->companies()->searchByDomain(ScompanyName, ScompanyProperties):• Uses v1 SDK's searchByDomain which calls a search endooint — hits the search rate limit bucket• No 429 protection• Cannot be trivially replaced with client-›search() (different endpoint/format), but could be wrapped in executeRequest ()2.detdnnortunitvRvldhac executeReauestcommented out.• Client.php:238-239$deal = Sthis->executeRequest(fn () => $this->getNewInstance()->crm()->deals()->basicApi()->getById(• Deliberatelv disabled _ this means sinale deal fetches in HubsootSingleSvncStrateav also aet no 429 protection.Ask anvthina (&4L)Tnl "896-20UITE.Rfo 4 spaces...
|
Slack
|
Vasil Vasilev (DM) - Jiminny Inc - 3 new items - S Vasil Vasilev (DM) - Jiminny Inc - 3 new items - Slack...
|
NULL
|
10123
|
|
10122
|
Switch workspaces… (Jiminny Inc) Has new messages
Switch workspaces… (Jiminny Inc) Has new messages
Home
Home
DMs
DMs
Activity
Activity
Files
Files
Later
Later
More…
More
Unreads
Threads
Huddles
Drafts & sent
1
Directories
jiminny-x-integration-app
platform-inner-team
ai-chapter
alerts
backend
bugs
confusion-clinic
curiosity_lab
engineering
general
jiminny-bg
platform-tickets
product_launches
random
releases
sofia-office
support
thank-yous
the_people_of_jiminny
Vasil Vasilev
Nikolay Ivanov
Galya Dimitrova
Aneliya Angelova
,
Nikolay Yankov
,
Steliyan Georgiev
Stoyan Tanev
Stefka Stoyanova
Ves
Aneliya Angelova
James Graham
Lukas Kovalik
you
Toast
Jira Cloud
Messages
Messages
Add canvas
Add canvas
Files
Files
Pins
Pins
Add and Edit Channel Tabs
Canvas
List
Folder
Jump to date
Vasil Vasilev
Apr 28th at 4:51:31 PM
4:51 PM
a, ти искаш в amazon да добавим ключ за достъп до QAi ?
Apr 28th at 4:51:38 PM
4:51
Вес се грижи за тея неща
Apr 28th at 4:52:06 PM
4:52
дори не съм сигурен дали тоя ключ не трябва да бъде в CircleCI при билда на имиджа
Apr 28th at 4:52:10 PM
4:52
т.е.
Apr 28th at 4:52:12 PM
4:52
пак не знам
Lukas Kovalik
Apr 28th at 4:53:41 PM
4:53 PM
ок, ще питам Вес, мерси
Vasil Vasilev
Apr 28th at 5:00:16 PM
5:00 PM
моля
Jump to date
Vasil Vasilev
Today at 2:52:43 PM
2:52 PM
Лукаш, привет
Today at 2:52:48 PM
2:52
хвърли моля те едно око тука
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:52:49 PM
2:52
https://github.com/jiminny/app/pull/12059
https://github.com/jiminny/app/pull/12059
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:53:03 PM
2:53
опитвам се да оптимизирам процеса по индексиране на активитита за ЕС
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:54:16 PM
2:54
идеята е да намаля паметта която се ползва за да се генерира един бач от 100 активитита
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 2:54:35 PM
2:54
и после да увелича размера на бачовете, за да имаме по малко blocking операции в ЕС, като реиндексира
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 4:12:58 PM
4:12 PM
здрасти, изглежда ок, но когато го минах и през gemini ми даде един warning.
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:13:17 PM
4:13
Switch
cursor()
to
lazyById(250)
. It preserves the single-loop, generator-style code in the new version while restoring proper batched eager loading (avoiding N+1 on
getIndexableAttributes()
) and releasing the DB connection between chunks (avoiding long-held PDO connections during ES/Sentry calls).
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Vasil Vasilev
Today at 4:40:06 PM
4:40 PM
хм, интересна идея
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:41:03 PM
4:41
ще го проверя
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 4:41:17 PM
4:41
така или иначе в понеделник ще иде на прод, днес не ми се рискува
React with white_check_mark
React with eyes
React with raised_hands
SlackFileEditViewGoHistoryWindowHelpLukás Koválik's No...ProGPHubspot API calls+n Home1000TestDailyAgents+ New agentWorkspace* Quick NoteWorkJira ticketView of SprintDailyPlanSprintStefka 1-1TododevEvaluationKnowledgera IdeasPrivateE Home viewsIntegration-appWork KnowledgeWork Knowledgetesting keyboard4Todo2 New chat x03 Hubspot / Hubspot API callsCritical Findings1. Line 1313 - rawsearchApi()->doSearch()- matchExlSresponse = Sthis->client->getNewInstance()->crm(• Goes completely around the Client wrapper - no 429• Uses the search rate limit bucket• Can be replaced with $this->client->search('contacts"2. Line 920-923 — companies()->searchByDomain() - m$hsAccounts = $this->client->getInstance()->compai• Uses v1 SDK's searchByDomainwhich calls a search e• No 429 protection• Cannot be trivially replaced with client->search() (diffePress 'space' for Al or 'l' for commands40QHomeDMsActivityFilesLater...MoreED→Jiminny... v# conrusion-clnic# curiosity_lab# engineering# general# jiminny-bg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi...• Direct messagese. Vasil Vasilevo Nikolay IvanovGalya DimitrovaAneliya Angelova, ...2 Stoyan Tanev €ã. Stefka StoyanovaC Vese. Aneliya Angelova& James GrahamLukas Kovalik y... O::: AppsToalJira Cloud100% CFri 8 May 17:18:04Describe what you are looking forVasil Vasilev6 0MessagesAdd canvasлукаш, привет@ Files< Pins+Todayхвърли моля те смгукаhttps://github.com/jiminny/app/pull/12059опитвам се да оптимизирам процеса поиндексиране на активитита за ЕСидеята е да намаля паметта която се ползва зада се генерира един бач от 100 активититаи после да увелича размера на бачовете, за даимаме по малко blocking операции в ЕС, катореиндексираLukas Kovalik 4:12 PMздрасти, изглежда ок, но когато го минах и презgemini ми даде един warning.Switch cursor() to lazyById(250) . It preservesthe single-loop, generator-style code in the newversion while restoring proper batched eagerloading (avoiding N+1 ongetIndexableAttributes() ) and releasing the DBconnection between chunks (avoiding long-heldPDO connections during ES/Sentry calls).Vasil Vasilev 4:40 PMхм, интересна идеяще го проверятака или иначе в понеделник ще иде на прод,днес не ми се рискуваMessage Vasil Vasilev+Aa..•...
|
Slack
|
Vasil Vasilev (DM) - Jiminny Inc - 3 new items - S Vasil Vasilev (DM) - Jiminny Inc - 3 new items - Slack...
|
NULL
|
10122
|