Track your progress for all your courses
Deployed application: TrackMates
The product helps the users to track the progress in all their courses from different vendors in one place, along with additional features like checking friends' progress
erDiagram
users {
int id PK
dateTime created_at
dateTime updated_at
citext email
text password_hash
text password_salt
}
user_details {
int id PK
dateTime created_at
dateTime updated_at
int user_id FK
varchar first_name
varchar last_name
varchar nickname
enum sex
int avatar_file_id FK
}
courses {
int id PK
dateTime created_at
dateTime updated_at
varchar url
varchar title
varchar description
varchar image
varchar vendor_course_id
int vendor_id FK
}
courses_to_users {
int id PK
dateTime created_at
dateTime updated_at
int course_id FK
int user_id FK
}
vendors {
int id PK
dateTime created_at
dateTime updated_at
varchar name
varchar key
varchar url
}
course_sections {
int id PK
dateTime created_at
dateTime updated_at
int course_id FK
varchar title
}
section_statuses {
int id PK
dateTime created_at
dateTime updated_at
int course_section_id FK
int user_id FK
enum status
}
friends {
int id PK
dateTime created_at
dateTime updated_at
int follower_id FK
int following_idFK
}
files {
int id PK
dateTime created_at
dateTime updated_at
varchar url
enum content_type
}
chats {
int id PK
dateTime created_at
dateTime updated_at
int first_user_id FK
int second_user_id FK
}
chat_messages {
int id PK
dateTime created_at
dateTime updated_at
int sender_user_id FK
int chat_id FK
enum status
text text
}
notifications {
int id PK
dateTime created_at
dateTime updated_at
int receiver_user_id FK
int user_id FK
int action_id
enum status
enum type
}
activities {
int id PK
dateTime created_at
dateTime updated_at
enum type
int action_id
int user_id FK
text payload
}
activity_likes {
int id PK
dateTime created_at
dateTime updated_at
int activity_id FK
int user_id FK
}
comments {
int id PK
dateTime created_at
dateTime update_at
text text
int user_id FK
int activity_id FK
}
groups {
int id PK
dateTime created_at
dateTime updated_at
varchar key UK
varchar name UK
}
permissions {
int id PK
dateTime created_at
dateTime updated_at
varchar key UK
varchar name UK
}
groups_to_permissions {
int id PK
dateTime created_at
dateTime updated_at
int group_id FK
int permission_id FK
}
users_to_groups {
int id PK
dateTime created_at
dateTime updated_at
int group_id FK
int user_id FK
}
subscriptions {
int id PK
dateTime created_at
dateTime updated_at
dateTime expires_at
}
users ||--|| user_details : user_id
user_details ||--|| files : avatar_file_id
user_details ||--|| subscriptions : subscription_id
users ||--|{ friends : follower_id
users ||--|{ friends : following_id
users ||--|{ chats : first_user_id
users ||--|{ chats : second_user_id
chats ||--|{ chat_messages : chat_id
users ||--|{ chat_messages : sender_user_id
users ||--|{ courses_to_users : user_id
courses ||--|{ courses_to_users : course_id
courses ||--|| vendors : vendor_id
course_sections }|--|| courses : course_id
section_statuses }|--|| course_sections : course_section_id
section_statuses }|--|| users : user_id
activities }|--|| users : user_id
users ||--|{ activity_likes : user_id
activities ||--|{ activity_likes : activity_id
comments }|--|| activities : activity_id
comments }|--|| users : user_id
users ||--|{ notifications : receiver_user_id
users ||--|{ notifications : user_id
groups ||--|{ groups_to_permissions : group_id
permissions ||--|{ groups_to_permissions : permission_id
users ||--|{ users_to_groups : user_id
groups ||--|{ users_to_groups : group_id
graph TD
User
Web["Web"]
WebApp
Route53
ELB["Elastic Load Balancer (ELB)"]
EC2["Amazon EC2 Instance (NodeJS)"]
DB["Database (Amazon RDS)"]
S3["Amazon S3"]
NodeJS["NodeJS API"]
OpenAI["OpenAI API"]
Udemy["Udemy API"]
Stripe["Stripe API"]
User -->|Connects to| Web
User -->|Connects to| WebApp
Web -->|Connects to| Route53
WebApp -->|Connects to| Route53
Route53 -->|Sends traffic to| ELB
ELB -->|Sends traffic to| EC2
EC2 -->|Connects to| DB
EC2 -->|Connects to| S3
EC2 -->|Uses| NodeJS
EC2 -->|Connects to| OpenAI
EC2 -->|Connects to| Udemy
EC2 -->|Connects to| Stripe
assets - static assets (images, global styles)
libs - shared libraries and utilities
2.1 components - plain react components
2.2 enums
2.3 helpers
2.4 hooks
2.5 modules - separate features or functionalities
2.6 types
modules - separate app features or functionalities
pages - app pages
db - database data (migrations, seeds)
libs - shared libraries and utilities
2.1 enums
2.2 exceptions
2.3 helpers
2.4 modules - separate features or functionalities
2.5 types
modules - separate app features or functionalities
As we are already using js on both frontend and backend it would be useful to share some contracts and code between them.
You should use .env.example files as a reference.
Install dependencies: npm install
.
Install pre-commit hooks: npx simple-git-hooks
. This hook is used to verify code style on commit.
Run database. You can run it by installing postgres on your computer.
Apply migrations: npm run migrate:dev -w apps/backend
Run backend: npm run start:dev -w apps/backend
Run frontend: npm run start:dev -w apps/frontend
<type>: <ticket-title> <project-prefix>-<issue-number>
For the full list of types check Conventional Commits
Examples:
feat: add dashboard screen tm-123
<issue-number>-<type>-<short-desc>
Examples:
123-feat-add-dashboard
12-feat-add-user-flow
34-fix-user-flow
We use Conventional Commits to handle commit messages
<type>: <description> <project-prefix>-<issue-number>
Examples:
feat: add dashboard component tm-45
fix: update dashboard card size tm-212
CI/CD implemented using GitHub Actions