A backend API for a fictitious travel company, built to model real-world backend concerns such as relational data modeling, validation, analytics-friendly schemas, and clear service boundaries. This project focuses on designing a maintainable, well-documented REST API rather than a front-end experience.
- Designing a REST API around a non-trivial domain (users, trips, cities, activities)
- Modeling relational data with clear ownership and constraints
- Separating concerns across controllers, services, and data access layers
- Validating inputs and enforcing consistency at API boundaries
- Producing documentation that makes the system easy to understand and test
This repo represents how I approach backend systems intended to grow over time: explicit structure, predictable behavior, and tooling that supports both developers and consumers of the API.
- Node.js with TypeScript
- Express
- PostgreSQL
- Knex.js and Objection.js
- Yup for request validation
- Winston for structured logging
- Swagger UI for API documentation
- Postman for API testing
src/api– Controllers, services, DAOs, models, routes, and DTO validationsrc/config– Environment configuration, Knex, Swagger setupsrc/db– Migrations, seeds, and source datasrc/loaders– Application startup and dependency initializationsrc/docs– Swagger and Postman artifacts
The structure is designed to make responsibilities explicit and to keep business logic separate from transport and persistence concerns.
- Node.js
- PostgreSQL
git clone git@github.com:tamara-builds/adventure-life.git
cd adventure-life
npm install
cp .env.example .env
npm run migrate
npm run seed
npm run build
npm run start- Schema managed via Knex migrations
- Seed data included for local development and testing
- Reset command available for rapid iteration
npm run reset-dbInteractive Swagger documentation is available locally at:
http://localhost:<PORT>/api-docs
The API is fully documented, including request schemas, validation errors, and example responses.
- Collection file:
adventure-life.postman_collection.json - Covers all routes, validation errors, and edge cases
- Designed to support manual testing and exploration
To import, open Postman and upload the JSON file from src/docs.
The schema emphasizes normalized relationships and clear join tables to support flexible querying and future feature expansion.

