Backend performance & data access
Node & GraphQL API Modernization
Resolver and data-access improvements that reduced redundant work across campaign, budget and audience APIs.
Business problem
The challenge
N+1 queries, oversized selections, legacy service calls and unnecessary resolver work slowed product workflows.
Technical solution
Our approach
Request-aware GraphQL resolvers, batched/cached loaders and targeted database access.
- 01
Find the bottlenecks
Used Datadog and Grafana to investigate resolver timing and N+1 behavior. Reduced frontend field selections and unnecessary API requests.
- 02
Reduce repeated work
Replaced legacy SHAPI reads with DataLoaders, batched and cached related rows, invalidated caches after writes, simplified nested loops and parallelized independent operations.
- 03
Query only what is needed
Added pagination/filtering, selective database fields and GraphQL-selection-aware row/count queries. Migrated Sequelize models to TypeScript and hardened cross-advertiser record access.
Results & impact
Project outcomes
Resolver and data-access improvements that reduced redundant work across campaign, budget and audience APIs.
Reported API performance improvement
Resume and project notes report the improvement across API modernization work.
Related-data access
Loaders reduce repeated database and downstream-service requests.
Visual assets
How the workflow fits together
Node & GraphQL API Modernization
flowchart TD A["Requested GraphQL fields"] --> B["Selection-aware resolvers"] B --> C["Batch and cache loaders"] C --> D["Targeted SQL or service calls"] D --> E["Requested results"]
Tech stack
Technology and ownership.
Backend and frontend query optimization across GaryQL and its product consumers. Percentage outcomes are reported in the resume and project notes.