Skip to content
Hacker news-inspired forum app built with TypeScript & DDD from solidbook.io.
TypeScript CSS Other
Branch: master
Clone or download
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
.vscode Basic login flow working. Oct 5, 2019
dist Backend voting and comment logic completed. Oct 11, 2019
public Made it not look terrible on mobile. Oct 12, 2019
scripts/db Hooked up express API. Oct 3, 2019
src Remove unnecessary imports. Oct 15, 2019
.env.template Users subdomain, login and register pages Oct 4, 2019
.gitignore Basic login flow working. Oct 5, 2019
.sequelizerc
LICENCE.md Rename LISCENCE.md to LICENCE.md Oct 12, 2019
README.md
jest.config.js Got Jest setup for testing the forum domain models. Oct 6, 2019
nodemon.json
package-lock.json Add a script to start both. Oct 15, 2019
package.json Add a script to start both. Oct 15, 2019
tsconfig.json Don't build test files? Tryna get this heroku build to work. Oct 10, 2019

README.md

DDDForum.com

A SOLID hackernews-inspired forum site built with TypeScript using the clean architecture and DDD best practices.

About

DDDForum.com is the application that we build in solidbook.io - The Software Design and Architecture Handbook.

Demo

You can visit the site here.

Note: It's currently deployed on free tier Heroku, which has some undesirable side-effects like shutting off the server during periods of inactivity. So if it's down for you, refresh a couple of times. Thinking about migrating this to a serverless architecture later on.

Built with

Backend

  • Sequelize - The ORM for Node.js
  • Express.js - Lightweight webserver
  • Redis - For holding onto JWT tokens and refresh tokens

Frontend

Architecture

We built this based on the Clean Architecture, SOLID principles, and Domain-Driven Design best practices using TypeScript.

Clean architecture

There's obviously a lot that went into building this from front to back.

The Clean Architecture is a way to reason about where different types of application logic belongs.

Frame 8 (1)

There's a lot more to learn about the clean architecture, but for now- just know that it's a way to really separate the concerns of everything that goes into building complex enterprise applications. You'll never see any infrastructure-related code alongside domain layer code.

The clean architecture, when combined with Domain-Driven Design, is very powerful :)

In DDD, we build applications on top of a number of subdomains.

Subdomains

A subdomain is a cohesive unit of code that represents exactly one core concept and is responsible for a specific set of concerns in an application architecture. For example, every appliciation has a users subdomain. That's responsible for users, identity & access management, authentication, authorization, etc. Sometimes you don't want to build that yourself. Sometimes you can go with an off-the-shelf solution like Auth0. But there are subdomains in your application that you cannot simply outsource. These are the family jewels; the thing that's actually novel about your app. This is the subdomain that no one (except you) can code. Know why? Because only you have the domain knowledge to build it exactly the way that it should be built. You understand the domain.

In DDDForum, we have 2 subdomains: The users subdomain and the forum subdomain.

Frame 3 (1)

Each subdomain has a:

  • domain layer: where the highest-level policy, domain objects, and domain rules belong (user, email, etc)
  • application layer: where the use cases / features that utilize domain objects belong (createUser, login, etc)
  • adapter layer: where we define abstractions so that application layer code can interact with infrastructure layer concepts, without actually requiring on infrastructure (because that would break the dependency rule). Here we write things like IUserRepo - repository adapter, IJWTTokenService - an abstraction of a cache (redis) that manages tokens, etc.
  • infrastructure layer: where we create concrete implementations of the abstractions from the adapter layer so that they can be spun up at runtime thanks to the power of polymorhpism :) (more on this later).

If you haven't already, I recommend you read this article on use cases and subdomains.

Let's identify some of the actual concepts that exist in each subdomain.

users subdomain

In the users subdomain, we're only concerned with concepts that are related to authentication, roles, etc. Here are a few examples of classes and concepts that exist at each layer.

forum subdomain

In the forum subdomain, we're only concerned with concepts that have to do with building a forum. You won't see any domain concepts from the user in forum. In the forum subdomain, the concept most equivalent to a user, is a member.

Here are a few examples of concepts from the forum subdomain.

  • domain layer: member, comment, post, postVote, commentVote, commentVotesChanged
  • application layer: replyToComment, getMemberByUserName, upvotePost, downvotePost
  • adapter layer: ICommentRepo, IPostRepo, IMemberRepo
  • infrastructure layer: SequelizeCommentRepo, SequelizePostRepo, SequelizeMemberRepo

License

This project is licensed under the ISC License - see the LICENSE.md file for details

You can’t perform that action at this time.