Skip to content

Commit

Permalink
Finished project ver 1.0.0
Browse files Browse the repository at this point in the history
  • Loading branch information
chhinsras committed May 19, 2018
1 parent e79158f commit 22a2f10
Show file tree
Hide file tree
Showing 58 changed files with 1,057 additions and 2,247 deletions.
61 changes: 61 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,31 @@

### init git repository

```
1. Create .gitignore
2. git init
3. git add .
4. git commit -am 'Your message'
5. git remote add origin https://github.com/chhinsras/vidjod.git (Set the new remote)
6. git remote -v (verifies the new remote URL)
7. git pull --rebase origin master
8. git push origin master
```

### project dependencies

```
1. npm install -g nodemon (auto restart server)
2. npm install --save express
3. npm install --save express-handlebar (template engine)
4. npm install --save mongoose (Database middleware working with MongoDB)
5. npm install --save body-parser (handle HTTP POST request in express.js, it extreact entire body portion of incoming request stream and expoeses it on req.body)
6. npm install --save method-override (to use put HTTP, this must be declared on top)
7. npm install --save express-session ( working with session)
8. npm intsall --save connect-flash (showing flash message)
9. npm install --save bcryptjs (hashing password)
10.npm install --save passport (middleware working with login)
11.npm install --save passport-local (local strategy)
```

### Create Handlebar
Expand All @@ -26,3 +45,45 @@ app.set("view engine", "handlebars");
- views/layouts/main.handlebars (HTML Body View)
- views/partials/_navbar.handlebars (Partial Body / Navgiation Bar)
```

### Create Local Mongo DB

```
1. Download and Install MongoDB
2. sudo mkdir -p /data/db ( Create database directory locally)
3. sudo chmod -R go+w /data/db ( Danger for production, /data/db is owned by root user, change mode to your current user)
4.
```

### Router

```
1. Create routers folder
2. Bring Model into specific route
// Load Models
require("../models/Idea");
const Idea = mongoose.model("ideas");
3. Load all routes into app.js
// Load Router
const ideas = require("./routes/ideas");
const users = require("./routes/users");
4. Use route inside app.js
// Use routes
app.use("/ideas", ideas);
app.use("/users", users);
```

### Create Public Folder for Project

```
1. Create public folder (public/css, public/img, public/js)
2. Bring path module into app.js (path is core node module)
3. Create static folder inside app.js
// Static Folder
app.use(express.static(path.join(__dirname, "public")));
4. Use assets
{{!-- public static assets folder, no need to put full address --}}
<img src="/img/logo.png" />
```

### Using Hash Password (bcryptjs)
66 changes: 66 additions & 0 deletions app.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,73 @@
const express = require("express");
const methodOverride = require("method-override");
const path = require("path");
const exphbs = require("express-handlebars");
const mongoose = require("mongoose");
const bodyParser = require("body-parser");
const passport = require("passport");

const flash = require("connect-flash");
const session = require("express-session");

const app = express();

// Load routes
const ideas = require("./routes/ideas");
const users = require("./routes/users");

// Passport config
require("./config/passport")(passport);

// get rid of global promise warining
mongoose.Promise = global.Promise;

// Connect to DB
const dbUrl = "mongodb://localhost/vidjot-dev";
mongoose
.connect(dbUrl)
.then(() => console.log("MongoDB connected"))
.catch(err => console.log(err));

// express handlebar middleware
app.engine("handlebars", exphbs({ defaultLayout: "main" }));
app.set("view engine", "handlebars");

// body parser middleware
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

// Static Folder
app.use(express.static(path.join(__dirname, "public")));

// method override middleware
app.use(methodOverride("_method"));

// Express session middleware
app.use(
session({
secret: "secret",
resave: true,
saveUninitialized: true
// cookie: { secure: true }
})
);

// Passport middleware (must put after express session middleware)
app.use(passport.initialize());
app.use(passport.session());

// Connect flash middleware
app.use(flash());

// Global Varaible
app.use((req, res, next) => {
res.locals.success_msg = req.flash("success_msg");
res.locals.error_msg = req.flash("error_msg");
res.locals.error = req.flash("error");
res.locals.user = req.user || null;
next();
});

// Index route
app.get("/", (req, res) => {
const title = "Vidjot Title";
Expand All @@ -17,5 +79,9 @@ app.get("/about", (req, res) => {
res.render("about");
});

// Use routes
app.use("/ideas", ideas);
app.use("/users", users);

const port = 5000;
app.listen(port, () => console.log(`Server running on port ${port}`));
41 changes: 41 additions & 0 deletions config/passport.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
const LocalStrategy = require("passport-local").Strategy;
const mongoose = require("mongoose");
const bcrypt = require("bcryptjs");

// Load user model
const User = mongoose.model("users");

module.exports = passport => {
passport.use(
new LocalStrategy(
{
usernameField: "email"
},
(email, password, done) => {
User.findOne({ email }).then(user => {
if (!user) {
return done(null, false, { message: "No user found" });
}
// Match Password
bcrypt.compare(password, user.password, (err, isMatch) => {
if (err) throw err;
if (isMatch) {
return done(null, user);
} else {
return done(null, false, { message: "Password incorrect" });
}
});
});
}
)
);
passport.serializeUser(function(user, done) {
done(null, user.id);
});

passport.deserializeUser(function(id, done) {
User.findById(id, function(err, user) {
done(err, user);
});
});
};
10 changes: 10 additions & 0 deletions helpers/auth.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
module.exports = {
ensureAuthenticated: function(req, res, next) {
if (req.isAuthenticated()) {
return next();
} else {
req.flash("error_msg", "Not authorized");
res.redirect("/users/login");
}
}
};
24 changes: 24 additions & 0 deletions models/Idea.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
const moongose = require("mongoose");
const Schema = moongose.Schema;

// Create Schema
const IdeaSchema = new Schema({
title: {
type: String,
required: true
},
detail: {
type: String,
required: true
},
userId: {
type: String,
required: true
},
date: {
type: Date,
default: Date.now
}
});

moongose.model("ideas", IdeaSchema);
24 changes: 24 additions & 0 deletions models/User.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
const moongose = require("mongoose");
const Schema = moongose.Schema;

// Create Schema
const UserSchema = new Schema({
name: {
type: String,
required: true
},
email: {
type: String,
required: true
},
password: {
type: String,
required: true
},
date: {
type: Date,
default: Date.now
}
});

moongose.model("users", UserSchema);
20 changes: 20 additions & 0 deletions node_modules/body-parser/HISTORY.md

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

49 changes: 28 additions & 21 deletions node_modules/body-parser/README.md

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit 22a2f10

Please sign in to comment.