question-and-answer website where users can create and follow topics, add questions in these topics, answer questions and like/dislike answers.
This is a question-and-answer social network website where users are able to:
Here is the ERD for this app:
A user has many topics (create)
A topic belongs to one user
=> one to many
A user has many questions (ask)
A question belongs to one user
=> one to many
A user has many answers (answer)
An answer belongs to one user
=> one to many
A topic has many questions
A question belongs to one topic
=> one to many
A question has many answers
An answer belongs to one question
=> one to many
A user can follow many topics (follow)
A topic has many followers
=> many to many
An answer has many users who like it
A user can like many answers
=> many to many
I use two way (parent & child) referencing for all relationships:
User{
_id : ObjectId
firstName : String
lastName : String
email : String
password : String
imageName : String
registrationDate: Date
topics : Topic[] //we store the topics ids
questions : Question[] //same
answers : Answer[]
topicsFollowed : Topic[]
answersLiked : Answer[]
}
Topic{
_id : ObjectId
name : String
description : String
imageName : String
creationDate : Date
user : User
questions : Question[]
usersFollowers : User[]
}
Question{
_id : ObjectId
content : String
creationDate : Date
topic : Topic
user : User
answers : Answer[]
}
Answers{
_id : ObjectId
content : String
creationDate : Date
user : User
question : Question
usersWhoLike : User[]
}
GET /users
GET /users/:id
GET /users/:id/:content (content == questions | answers | topics | topics-followed)
GET /users/register
GET /users/login
POST /users/register
POST /users/login
DELETE /users/logout
GET /topics
GET /topics/:id
GET /topics/create
POST /topics/create
GET /topics/:id/question
POST /topics/:id/question
DELETE /topics/:id //NIY
PATCH /topics/:id //NIY
POST /topics/follow-infollow //NIY
GET /questions/:id
GET /questions/:id/answer
POST /questions/:id/answer
DELETE /questions/:id //NIY
PATH /questions/:id //NIY
POST /answers/like-unlike
GET /answers/:id //NIY
DELETE /answers/:id //NIY
PATH /answers/:id //NIY
(NIY <=> Not Implemented Yet )
Clone the project & unzip it
Open the project in the terminal
Run
docker compose up
if you watch the logs you may see this error:
This is related to EOL (end of line) difference between Windows & Linux systems. If you are cloning the project in Windows Machine, change the EOL for the file mongodb-database/import-data.sh to be LF (\n).
In VSCODE you can do this easily by looking at the bottom menu when the file is opened.
Open a browser & head to http://localhost:8082 to see the content of the database (social_network_db)
you should see 4 collections (users, topics, quetions, answers), each one with some data in it.
If its not the case, refer to previous step (error may be related to EOL for the mongodb-database/import-data.sh).
Visit http://localhost:3001 to see the app running
You can log in to the website with a bunch of existing accounts:
or just create one for you instead.
To install Nodejs, visit this link https://github.com/nodesource/distributions/blob/master/README.md
Go to Debian and Ubuntu based distributions section and find the wanted Nodejs version and run the commands. For example, if you want to install Nodejs version 12, you will run:
# Using Ubuntu
curl -fsSL https://deb.nodesource.com/setup_12.x | sudo -E bash -
sudo apt-get install -y nodejs
Install MongoDB database via
sudo apt install mongodb
Start the MongoDB service via:
sudo service mongodb start
You can check if MongoDB service is active using:
sudo systemctl status mongodb
Now its time to create the database and its collections, to do this, open the mongo shell using:
mongo
From the mongo shell, run these commands one after another:
use social_network_db
db.createCollection('users')
db.createCollection('questions')
db.createCollection('answers')
db.createCollection('topics')
Download the project into the filesystem
Unzip it
Now we need to import the data into the mongodb database collections
Open a terminal & go to the downloaded project’s directory & run the following commands one after another
mongoimport --db social_network_db --collection users --drop --file ./mongodb-database/users.json --jsonArray
mongoimport --db social_network_db --collection questions --drop --file ./mongodb-database/questions.json --jsonArray
mongoimport --db social_network_db --collection answers --drop --file ./mongodb-database/answers.json --jsonArray
mongoimport --db social_network_db --collection topics --drop --file ./mongodb-database/topics.json --jsonArray
Always from the project’s directory, run
npm install
to install npm dependencies
ALways from the project’s directory, run:
npm run startdev
To run the app
go to http://locahost:3000
You can log in to the website with a bunch of existing accounts (email/password):
MongoDB/Nodejs Download & install
To download Nodejs for windows, follow the link https://nodejs.org/en/download/ and use the installer and follow the installation steps
Download MongoDB for Windows from the link https://www.mongodb.com/try/download/community
Run the .msi file to run the installation wizard (leave everything as default… default is BEST)
Create this directory structure C:\data\db
Go to MongoDB installation folder and somewhere there in the directory structure you will find a bin folder, add it to the PATH env variable .
Now we need to download The MongoDB Database Tools (colleciton of command-line utilities for working with MongoDB), to do this head to https://www.mongodb.com/try/download/database-tools?tck=docs_databasetools and download the zip file
Extract the zip under C:\ drive
under this zip, you will find a bin folder, add it to the PATH env variable
Running MongoDB server and importing the data into the database
Open cmd and run the MongoDB deamon using this command:
.\mongod.exe
Now we need to create the database and its collections, open cmd run the MongoDB client
.\mongo.exe
From the mongo shell that appears, run the following commands one after another
use social_network_db
db.createCollection('users')
db.createCollection('questions')
db.createCollection('answers')
db.createCollection('topics')
The rest of the steps to import the data and run the app are the same as in Linux