# Database Schema Design

### User Collection
Here we'll save the user related data. In future, we'll either save settings info here itself or a new collection will be made
```json
{
_id: ObjectId() // userId
name: string // full name
email: string
image: string?
role: string // [user, admin]
emailVerified: timestamp
}
```
### Course Collection
To save details about the whole course (might be uploaded from admin panel)
```json
{
_id: ObjectId() // couseId
name: string // course title (ex: MongoDB Basics)
brief: string // course description/brief
modules: [...moduleIds]
statistics: {
rating: float,
completitionRate: float,
price: float,
lastUpdated: timestamp
}
cardImageUrl: string
bannerImageUrl: string
draft: boolean
createdBy: ObjectId()
}
```
### Module Collection
Different modules that can be added in a particular course
```json
{
title: string // module title (ex: logical operators)
learn: string // markdown (all material related to that module, would remain common between it's problems)
problems: [...problemIds]
}
```
### Problem Collection
Each individual problem will be added here
```json
{
_id: ObjectId() // problemId
title: string // problem title
desc: string // (markdown) problem statement/description
type: string // enum of MONGODB_FIND, MONGODB_AGGREGATE, ...
difficulty: string // enum of easy/medium/hard
draft: boolean
createdBy: ObjectId()
}
```
### Submission Collection
Each submission for a problem by a user will be recorded here
```json
{
_id: ObjectId() // submissionId
userId: ObjectId()
problemId: ObjectId()
code: string // code submission
result: string // maybe log or output something
status: string // enum of NOT_ATTEMPTED, IN_QUEUE, INCORRECT, ACCEPTED
submittedAt: timestamp // time of submission
}
```
## TODO/Future
- Subscription Model (need to discuss)
- Review Model (rating/comments/testimonial)
- Compatible with other lang/framework
- Leaderboard model