Skip to main content

API Routes

Overview

All routes are registered in /src/routes/index.ts and mounted under the root path. Each route module exports an Express Router that defines endpoints for a specific domain.

Route Registration Pattern

// src/routes/index.ts
import { Router } from 'express';
import authRoutes from './auth.routes';
import userRoutes from './user.routes';
// ... other imports

const router = Router();

// Health check (no auth required)
router.get('/health', (_req, res) => {
res.json({ status: 'ok', timestamp: new Date().toISOString() });
});

// Mount all route modules
router.use('/auth', authRoutes);
router.use('/users', userRoutes);
router.use('/books', bookRoutes);
// ... etc

export default router;

Route Modules

Authentication (/auth)

File: src/routes/auth.routes.ts

Handles user authentication and session management.

MethodEndpointAuthDescription
POST/auth/guestNoneCreate guest user account
POST/auth/signupNoneRegister new user account
POST/auth/loginNoneLogin with email/password
POST/auth/refreshNoneRefresh access token
POST/auth/migrate-guestRequiredMigrate guest to full account
POST/auth/logoutRequiredLogout and revoke token

Users (/users)

File: src/routes/user.routes.ts

User profile and settings management.

MethodEndpointAuthDescription
GET/users/meRequiredGet current user profile
PATCH/users/meRequiredUpdate user profile
GET/users/:usernameOptionalGet public profile by username
POST/users/home-storeRequiredSet home store
POST/users/push-tokenRequiredRegister FCM push token

User Preferences (/user-preferences)

File: src/routes/user-preferences.routes.ts

MethodEndpointAuthDescription
GET/user-preferencesRequiredGet user preferences
PATCH/user-preferencesRequiredUpdate preferences

Books (/books)

File: src/routes/book.routes.ts

Book catalog and metadata.

MethodEndpointAuthDescription
GET/books?q={query}OptionalSearch books by title/author/ISBN
GET/books/:idOptionalGet book details by ID
GET/books/isbn/:isbnOptionalGet book by ISBN
GET/books/:id/availabilityRequiredCheck availability at stores
GET/books/:id/linesOptionalGet lines (posts) for a book
GET/books/:id/reviewsOptionalGet reviews for a book

Wishlists (/wishlists)

File: src/routes/wishlist.routes.ts

User wishlist management.

MethodEndpointAuthDescription
GET/wishlistsRequiredGet user's wishlists
POST/wishlistsRequiredCreate new wishlist
GET/wishlists/:idRequiredGet wishlist details
PATCH/wishlists/:idRequiredUpdate wishlist
DELETE/wishlists/:idRequiredDelete wishlist
POST/wishlists/:id/itemsRequiredAdd book to wishlist
DELETE/wishlists/:id/items/:itemIdRequiredRemove book from wishlist
PATCH/wishlists/:id/items/:itemIdRequiredUpdate wishlist item

Stores (/stores)

File: src/routes/store.routes.ts

Bookstore management and discovery.

MethodEndpointAuthDescription
GET/storesOptionalList/search stores
POST/storesRequiredCreate new store
GET/stores/:idOptionalGet store details
PATCH/stores/:idOwnerUpdate store settings
GET/stores/:id/inventoryOptionalGet store inventory
POST/stores/:id/followRequiredFollow store
DELETE/stores/:id/followRequiredUnfollow store

Store Subscriptions (/stores)

File: src/routes/store-subscription.routes.ts

WEB-ONLY - Bookstore subscription billing (mounted under /stores).

MethodEndpointAuthDescription
POST/stores/:storeId/subscription/checkoutOwnerCreate Stripe checkout session
POST/stores/:storeId/subscription/portalOwnerCreate customer portal session
GET/stores/:storeId/subscription/statusOwnerGet subscription status

Inventory

File: src/routes/inventory.routes.ts

Store inventory management and Square OAuth (mounted at root /).

MethodEndpointAuthDescription
POST/stores/:storeId/inventoryStore AccessAdd inventory item
PATCH/inventory/:idStore AccessUpdate inventory item
DELETE/inventory/:idStore AccessDelete inventory item
GET/square/authRequiredGet Square OAuth URL
GET/square/callbackNoneSquare OAuth callback
POST/square/sync/:storeIdStore AccessTrigger manual sync

Orders (/orders)

File: src/routes/order.routes.ts

Order management for customers and stores.

MethodEndpointAuthDescription
GET/ordersRequiredGet user's orders
GET/orders/:idRequiredGet order details
POST/orders/:id/cancelRequiredCancel order
GET/stores/:storeId/ordersStore AccessGet store orders
PATCH/stores/:storeId/orders/:idStore AccessUpdate order status

Checkout (/checkout)

File: src/routes/checkout.routes.ts

Order checkout flow.

MethodEndpointAuthDescription
POST/checkout/create-payment-intentRequiredCreate Stripe PaymentIntent
POST/checkout/confirm-orderRequiredConfirm order after payment

Cart (/cart)

File: src/routes/cart.routes.ts

Shopping cart operations (in-memory, no persistence).

MethodEndpointAuthDescription
POST/cart/validateRequiredValidate cart items
POST/cart/calculateRequiredCalculate totals with tax/shipping

Point of Sale (/pos)

File: src/routes/pos.routes.ts

In-store POS operations.

MethodEndpointAuthDescription
POST/pos/salesStore StaffCreate POS sale
GET/pos/salesStore StaffGet store sales
GET/pos/sales/:idStore StaffGet sale details

Trade Credit (/trade-credit)

File: src/routes/trade-credit.routes.ts

Store credit and trade-in operations.

MethodEndpointAuthDescription
GET/trade-credit/balance/:storeIdRequiredGet credit balance
POST/trade-credit/trade-inStore StaffProcess trade-in
GET/trade-credit/transactions/:storeIdRequiredGet transaction history

Lines (/lines)

File: src/routes/line.routes.ts

Social posts (lines) for books.

MethodEndpointAuthDescription
POST/linesRequiredCreate line
GET/lines/:idOptionalGet line details
DELETE/lines/:idRequiredDelete own line
POST/lines/:id/likeRequiredLike line
DELETE/lines/:id/likeRequiredUnlike line
POST/lines/:id/repliesRequiredReply to line
GET/lines/:id/repliesOptionalGet line replies

Reviews (/reviews)

File: src/routes/review.routes.ts

Book reviews and ratings.

MethodEndpointAuthDescription
POST/reviewsRequiredCreate review
GET/reviews/:idOptionalGet review
PATCH/reviews/:idRequiredUpdate own review
DELETE/reviews/:idRequiredDelete own review
POST/reviews/:id/likeRequiredLike review
DELETE/reviews/:id/likeRequiredUnlike review

Notes (/notes)

File: src/routes/note.routes.ts

Personal book notes (private).

MethodEndpointAuthDescription
GET/notesRequiredGet user's notes
POST/notesRequiredCreate note
GET/notes/:idRequiredGet note
PATCH/notes/:idRequiredUpdate note
DELETE/notes/:idRequiredDelete note

Follow (/follows)

File: src/routes/follow.routes.ts

Social following system.

MethodEndpointAuthDescription
POST/followsRequiredFollow user
DELETE/follows/:userIdRequiredUnfollow user
GET/follows/followersRequiredGet followers list
GET/follows/followingRequiredGet following list

Feed (/feed)

File: src/routes/feed.routes.ts

Activity feed (lines from followed users).

MethodEndpointAuthDescription
GET/feedRequiredGet personalized feed

File: src/routes/search.routes.ts

Global search across multiple entities.

MethodEndpointAuthDescription
GET/search?q={query}&type={type}OptionalSearch books, stores, users

Clubs (/clubs)

File: src/routes/club.routes.ts

Book club management.

MethodEndpointAuthDescription
GET/clubsOptionalList clubs
POST/clubsRequiredCreate club
GET/clubs/:idOptionalGet club details
PATCH/clubs/:idHostUpdate club
DELETE/clubs/:idHostDelete club
POST/clubs/:id/joinRequiredJoin club
POST/clubs/:id/leaveRequiredLeave club
POST/clubs/:id/booksHostAdd book to club

Challenges (/challenges)

File: src/routes/challenge.routes.ts

Reading challenges.

MethodEndpointAuthDescription
GET/challengesOptionalList challenges
POST/challengesRequiredCreate challenge
GET/challenges/:idOptionalGet challenge details
PATCH/challenges/:idHostUpdate challenge
DELETE/challenges/:idHostDelete challenge
POST/challenges/:id/joinRequiredJoin challenge
POST/challenges/:id/leaveRequiredLeave challenge

Notifications (/notifications)

File: src/routes/notification.routes.ts

User notifications.

MethodEndpointAuthDescription
GET/notificationsRequiredGet user notifications
PATCH/notifications/:id/readRequiredMark as read
POST/notifications/read-allRequiredMark all as read

Addresses (/addresses)

File: src/routes/address.routes.ts

User shipping addresses.

MethodEndpointAuthDescription
GET/addressesRequiredGet user addresses
POST/addressesRequiredCreate address
PATCH/addresses/:idRequiredUpdate address
DELETE/addresses/:idRequiredDelete address

Stock Alerts (/stock-alerts)

File: src/routes/stock-alert.routes.ts

Stock availability alerts.

MethodEndpointAuthDescription
POST/stock-alertsRequiredCreate stock alert
GET/stock-alertsRequiredGet user's alerts
DELETE/stock-alerts/:idRequiredDelete alert

Moderation

File: src/routes/moderation.routes.ts

Content moderation and user blocking (mounted at root /).

MethodEndpointAuthDescription
POST/users/:id/blockRequiredBlock user or store
DELETE/users/:id/blockRequiredUnblock user or store
POST/reportsRequiredSubmit content report
GET/admin/reportsAdminGet all reports
PATCH/admin/reports/:idAdminUpdate report status

Billing (/billing)

File: src/routes/billing.routes.ts

WEB-ONLY - Premium subscription billing via Stripe.

MethodEndpointAuthDescription
POST/billing/premium/checkoutRequiredCreate premium checkout session
GET/billing/premium/plansNoneGet available premium plans

Webhooks (/webhooks)

File: src/routes/webhook.routes.ts

Webhook handlers for external services.

MethodEndpointAuthDescription
POST/webhooks/stripeSignatureStripe webhook events
POST/webhooks/squareSignatureSquare webhook events
POST/webhooks/revenuecatSecretRevenueCat webhook events

Common Middleware Patterns

Authentication Middleware

import { authenticate, optionalAuth } from '../middleware/auth.middleware';

// Required authentication
router.get('/protected', authenticate, controller.handler);

// Optional authentication (user may or may not be logged in)
router.get('/public', optionalAuth, controller.handler);

Tier Gating Middleware

import { requireTier } from '../middleware/tier.middleware';
import { UserTier } from '@prisma/client';

// Require premium tier
router.post('/premium-feature', authenticate, requireTier(UserTier.premium), controller.handler);

Store Access Middleware

import { requireStoreAccess, requireStoreOwnership } from '../middleware/store-owner.middleware';

// Require owner or staff access
router.patch('/stores/:storeId/settings', authenticate, requireStoreAccess, controller.handler);

// Require owner only
router.delete('/stores/:storeId', authenticate, requireStoreOwnership, controller.handler);

Route Organization

Routes are organized by domain (entity type):

  • Authentication: User auth and session management
  • Core Entities: Users, Books, Stores
  • Commerce: Inventory, Orders, Checkout, Cart, POS
  • Social: Lines, Reviews, Notes, Follow, Feed
  • Programs: Clubs, Challenges
  • Support: Notifications, Addresses, Stock Alerts, Moderation
  • Integrations: Webhooks, Billing

Error Responses

All routes return consistent error responses:

{
"error": "ErrorCode",
"message": "Human-readable error message"
}

Common error codes:

  • Unauthorized (401) - Missing or invalid authentication
  • Forbidden (403) - Insufficient permissions
  • NotFound (404) - Resource not found
  • BadRequest (400) - Invalid request data
  • InternalServerError (500) - Server error

Pagination

Routes that return lists support cursor-based pagination:

GET /endpoint?cursor={cursor}&limit={limit}

Response:
{
"data": [...],
"nextCursor": "abc123",
"hasMore": true
}

Default limit: 20, Max limit: 100