← Back to Course

Project 09: REST API + GraphQL Hybrid Service

Phase 3: Advanced Integration
Why This Project?

Many companies use both REST and GraphQL. Understanding both makes you more versatile as a developer. This project shows you when to use each approach.

GraphQL lets clients request exactly the data they need, which can reduce network traffic and make apps faster. However, REST is simpler and often better for straightforward APIs. Knowing both gives you options.

You'll learn about API performance - caching, rate limiting, and preventing N+1 queries. These are production concerns that every API developer needs to understand.

Why This Project?

GraphQL is becoming popular alongside REST. Understanding both makes you more versatile. Some companies use REST, some use GraphQL, many use both.

This project teaches you the differences. REST has multiple endpoints, GraphQL has one. REST can over-fetch data, GraphQL lets clients request exactly what they need. Learning both helps you choose the right tool.

You'll also learn caching and rate limiting, which are important for any API. These protect your server from being overwhelmed and make responses faster.

Overview

Build a service that exposes both REST and GraphQL endpoints for the same data, implementing proper caching, rate limiting, and API documentation. This project teaches you the differences between these API paradigms and when to use each approach.

Core Requirements

REST endpoints for basic CRUD operations

GraphQL endpoint with queries and mutations

Shared business logic layer used by both

Redis caching for frequently accessed data

Rate limiting (100 requests per 15 minutes)

API documentation using Swagger/OpenAPI

GraphQL Playground for testing

Authentication works with both API types

Error handling consistent across both

Data Domain

Build a blog system with Posts, Comments, Users, and Tags

Posts have many Comments and Tags

Users create Posts and Comments

Implement filtering, pagination, and searching

Learning Objectives

Understand REST vs GraphQL tradeoffs

Implement N+1 query solutions

Build efficient caching strategies

Design reusable service layers

Implement rate limiting

Document APIs professionally

Technical Challenges

Use DataLoader to solve N+1 query problem in GraphQL

Implement Redis caching with proper invalidation

Create service layer that both REST and GraphQL use

Handle authentication in GraphQL context

Implement field-level authorization in GraphQL

Set up rate limiting with express-rate-limit

Generate OpenAPI documentation from code

Helpful Resources

GraphQL Basics: graphql.org has a great introduction. Understand queries, mutations, and schemas.

Apollo Server: Apollo Server docs show how to build GraphQL APIs with Node.js.

DataLoader: Learn about DataLoader to solve the N+1 query problem in GraphQL.

Redis Caching: Redis docs show basic caching patterns. It's simple - set and get with expiration.

Rate Limiting: Look up "express-rate-limit" for protecting your API.

API Documentation: Swagger/OpenAPI docs for documenting REST APIs automatically.

Helpful Resources

GraphQL Basics: graphql.org has an introduction and tutorials. Start with "Learn GraphQL".

Apollo Server: Apollo Server docs show how to build GraphQL APIs with Node.js.

DataLoader: Look up DataLoader on GitHub. It solves the N+1 query problem.

Redis: Redis documentation for caching. Learn SET, GET, and EXPIRE commands.

Rate Limiting: Search for "express-rate-limit" npm package.

REST vs GraphQL: Search for comparison articles to understand tradeoffs.

Success Criteria

Both APIs return same data correctly

Cached responses return in under 50ms

Rate limiting blocks excessive requests

Documentation is complete and accurate

No N+1 queries in GraphQL

Cache invalidates when data changes

Hint: Build the REST API first, then add GraphQL on top. Extract shared logic into service functions that both can call. This prevents code duplication and makes maintenance easier.

Submit Your Project

Once you've completed this project, submit your GitHub repository link below: