diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b8ad5e8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +node_modules + +config diff --git a/app.js b/app.js new file mode 100644 index 0000000..267f214 --- /dev/null +++ b/app.js @@ -0,0 +1,32 @@ +const express = require("express"); +const app = express(); + +const bodyParser = require("body-parser"); +app.use(bodyParser.urlencoded({ extended: true })); + +const session = require("express-session"); +app.use( + session({ + secret: "12345", + resave: false, + saveUninitialized: true + }) +); + +// const session = require("cookie-session"); +// app.use(session({ +// name: 'session' +// })) +const exhbs = require("express-handlebars"); +const hbs = exhbs.create({ defaultLayout: "main" }); +app.engine("handlebars", hbs.engine); +app.set("view engine", "handlebars"); + +const vikingRoutes = require("./routes"); +app.use('/', vikingRoutes); + + + +app.listen(3000, () => { + console.log("I'm listening"); +}); diff --git a/config/config.json b/config/config.json new file mode 100644 index 0000000..9a23407 --- /dev/null +++ b/config/config.json @@ -0,0 +1,19 @@ +{ + "development": { + "username": "postgres", + "password": "password", + "database": "database_development", + "host": "127.0.0.1", + "dialect": "postgres" + }, + "test": { + "username": "postgres", + "password": "password", + "database": "database_test", + "host": "127.0.0.1", + "dialect": "postgres" + }, + "production": { + "dialect": "postgres" + } +} diff --git a/migrations/20170807171419-create-profile.js b/migrations/20170807171419-create-profile.js new file mode 100644 index 0000000..f2e6174 --- /dev/null +++ b/migrations/20170807171419-create-profile.js @@ -0,0 +1,62 @@ +"use strict"; +module.exports = { + up: function(queryInterface, Sequelize) { + return queryInterface.createTable("Profiles", { + id: { + allowNull: false, + autoIncrement: true, + primaryKey: true, + type: Sequelize.INTEGER + }, + userid: { + type: Sequelize.INTEGER + }, + fname: { + type: Sequelize.STRING + }, + lname: { + type: Sequelize.STRING + }, + age: { + type: Sequelize.INTEGER + }, + city: { + type: Sequelize.STRING + }, + distance: { + type: Sequelize.INTEGER + }, + gender: { + type: Sequelize.STRING + }, + mstatus: { + type: Sequelize.STRING + }, + height: { + type: Sequelize.INTEGER + }, + children: { + type: Sequelize.INTEGER + }, + occupation: { + type: Sequelize.STRING + }, + education: { + type: Sequelize.STRING + }, + createdAt: { + allowNull: false, + type: Sequelize.DATE, + defaultValue: Sequelize.fn("NOW") + }, + updatedAt: { + allowNull: false, + type: Sequelize.DATE, + defaultValue: Sequelize.fn("NOW") + } + }); + }, + down: function(queryInterface, Sequelize) { + return queryInterface.dropTable("Profiles"); + } +}; diff --git a/migrations/20170807205857-create-user.js b/migrations/20170807205857-create-user.js new file mode 100644 index 0000000..e632617 --- /dev/null +++ b/migrations/20170807205857-create-user.js @@ -0,0 +1,32 @@ +'use strict'; +module.exports = { + up: function(queryInterface, Sequelize) { + return queryInterface.createTable('Users', { + id: { + allowNull: false, + autoIncrement: true, + primaryKey: true, + type: Sequelize.INTEGER + }, + email: { + type: Sequelize.STRING + }, + username: { + type: Sequelize.STRING + }, + createdAt: { + allowNull: false, + type: Sequelize.DATE, + defaultValue: Sequelize.fn("NOW") + }, + updatedAt: { + allowNull: false, + type: Sequelize.DATE, + defaultValue: Sequelize.fn("NOW") + } + }); + }, + down: function(queryInterface, Sequelize) { + return queryInterface.dropTable('Users'); + } +}; diff --git a/migrations/20170807215154-create-user.js b/migrations/20170807215154-create-user.js new file mode 100644 index 0000000..e7e8566 --- /dev/null +++ b/migrations/20170807215154-create-user.js @@ -0,0 +1,32 @@ +"use strict"; +module.exports = { + up: function(queryInterface, Sequelize) { + return queryInterface.createTable("Users", { + id: { + allowNull: false, + autoIncrement: true, + primaryKey: true, + type: Sequelize.INTEGER + }, + email: { + type: Sequelize.STRING + }, + username: { + type: Sequelize.STRING + }, + createdAt: { + allowNull: false, + type: Sequelize.DATE, + defaultValue: Sequelize.fn("NOW") + }, + updatedAt: { + allowNull: false, + type: Sequelize.DATE, + defaultValue: Sequelize.fn("NOW") + } + }); + }, + down: function(queryInterface, Sequelize) { + return queryInterface.dropTable("Users"); + } +}; diff --git a/migrations/20170807215358-create-profile.js b/migrations/20170807215358-create-profile.js new file mode 100644 index 0000000..f7ee328 --- /dev/null +++ b/migrations/20170807215358-create-profile.js @@ -0,0 +1,62 @@ +"use strict"; +module.exports = { + up: function(queryInterface, Sequelize) { + return queryInterface.createTable("Profiles", { + id: { + allowNull: false, + autoIncrement: true, + primaryKey: true, + type: Sequelize.INTEGER + }, + fname: { + type: Sequelize.STRING + }, + lname: { + type: Sequelize.STRING + }, + userid: { + type: Sequelize.INTEGER + }, + age: { + type: Sequelize.INTEGER + }, + city: { + type: Sequelize.STRING + }, + distance: { + type: Sequelize.INTEGER + }, + gender: { + type: Sequelize.STRING + }, + mstatus: { + type: Sequelize.STRING + }, + height: { + type: Sequelize.INTEGER + }, + children: { + type: Sequelize.INTEGER + }, + occupation: { + type: Sequelize.STRING + }, + education: { + type: Sequelize.STRING + }, + createdAt: { + allowNull: false, + type: Sequelize.DATE, + defaultValue: Sequelize.fn("NOW") + }, + updatedAt: { + allowNull: false, + type: Sequelize.DATE, + defaultValue: Sequelize.fn("NOW") + } + }); + }, + down: function(queryInterface, Sequelize) { + return queryInterface.dropTable("Profiles"); + } +}; diff --git a/models/index.js b/models/index.js new file mode 100644 index 0000000..7540dba --- /dev/null +++ b/models/index.js @@ -0,0 +1,36 @@ +'use strict'; + +var fs = require('fs'); +var path = require('path'); +var Sequelize = require('sequelize'); +var basename = path.basename(module.filename); +var env = process.env.NODE_ENV || 'development'; +var config = require(__dirname + '/../config/config.json')[env]; +var db = {}; + +if (config.use_env_variable) { + var sequelize = new Sequelize(process.env[config.use_env_variable]); +} else { + var sequelize = new Sequelize(config.database, config.username, config.password, config); +} + +fs + .readdirSync(__dirname) + .filter(function(file) { + return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js'); + }) + .forEach(function(file) { + var model = sequelize['import'](path.join(__dirname, file)); + db[model.name] = model; + }); + +Object.keys(db).forEach(function(modelName) { + if (db[modelName].associate) { + db[modelName].associate(db); + } +}); + +db.sequelize = sequelize; +db.Sequelize = Sequelize; + +module.exports = db; diff --git a/models/profile.js b/models/profile.js new file mode 100644 index 0000000..5271ac4 --- /dev/null +++ b/models/profile.js @@ -0,0 +1,26 @@ +"use strict"; + +const models = require("../models"); + +module.exports = function(sequelize, DataTypes) { + var Profile = sequelize.define("Profile", { + fname: DataTypes.STRING, + lname: DataTypes.STRING, + userid: DataTypes.INTEGER, + age: DataTypes.INTEGER, + city: DataTypes.STRING, + distance: DataTypes.INTEGER, + gender: DataTypes.STRING, + mstatus: DataTypes.STRING, + height: DataTypes.INTEGER, + children: DataTypes.INTEGER, + occupation: DataTypes.STRING, + education: DataTypes.STRING + }); + Profile.associate = function(models) { + Profile.belongsTo(models.User, { + foreignKey: "userid" + }); + }; + return Profile; +}; diff --git a/models/user.js b/models/user.js new file mode 100644 index 0000000..89d55a8 --- /dev/null +++ b/models/user.js @@ -0,0 +1,14 @@ +'use strict'; +module.exports = function(sequelize, DataTypes) { + var User = sequelize.define('User', { + email: DataTypes.STRING, + username: DataTypes.STRING + }, { + classMethods: { + associate: function(models) { + // associations can be defined here + } + } + }); + return User; +}; \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..7cbd60d --- /dev/null +++ b/package.json @@ -0,0 +1,39 @@ +{ + "name": "assignment_okodin", + "version": "1.0.0", + "description": "Build a dating app so Viking thunder gods can find love <3", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "start": "which nodemon > /dev/null && nodemon app.js || node app.js", + "console": "node repl.js", + "c": "node repl.js", + "seed": "sequelize db:migrate:undo:all && sequelize db:migrate && sequelize db:seed:all", + "seeds": "npm run sequelize db:migrate:undo:all && npm run sequelize db:migrate && npm run sequelize db:seed:all", + "sql": "node_modules/sequelize-cli/bin/sequelize" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/gregfilipczak/assignment_okodin.git" + }, + "author": "", + "license": "ISC", + "bugs": { + "url": "https://github.com/gregfilipczak/assignment_okodin/issues" + }, + "homepage": "https://github.com/gregfilipczak/assignment_okodin#readme", + "dependencies": { + "body-parser": "^1.17.2", + "cookie-session": "^1.3.0", + "express": "^4.15.4", + "express-method-override-get-post-support": "0.0.7", + "express-session": "^1.15.5", + "handlebars": "^4.0.10", + "method-override": "^2.3.9", + "morgan": "^1.8.2", + "morgan-toolkit": "^1.0.2", + "pg": "^6.4.1", + "pg-hstore": "^2.3.2", + "sequelize": "^4.4.2" + } +} diff --git a/repl.js b/repl.js new file mode 100644 index 0000000..f3541e6 --- /dev/null +++ b/repl.js @@ -0,0 +1,32 @@ +// Require the REPL module +// and models +var repl = require("repl").start({}); +var models = require("./models"); + +// Make the `models` object +// a global variable in the +// REPL +repl.context.models = models; + +// Make each model a global +// object in the REPL +Object.keys(models).forEach(modelName => { + repl.context[modelName] = models[modelName]; +}); + +// Provide a convenience function `lg` +// to pass to `then()` and `catch()` +// to output less verbose values for +// sequelize model query results +repl.context.lg = data => { + if (Array.isArray(data)) { + if (data.length && data[0].dataValues) { + data = data.map(item => item.dataValues); + } + } else { + if (data.dataValues) { + data = data.dataValues; + } + } + console.log(data); +}; diff --git a/routes/index.js b/routes/index.js new file mode 100644 index 0000000..6fedbd6 --- /dev/null +++ b/routes/index.js @@ -0,0 +1,100 @@ +const express = require("express"); +const router = express.Router(); +const models = require("./../models"); + +let { User, Profile } = models; +const sequelize = models.sequelize; + +let sess; + +router.get("/", (req, res) => { + res.render("home"); +}); + +router.post("/login", (req, res) => { + sess = req.session; + sess.username = req.body.username; + + res.redirect("/profile"); +}); + +// app.post('/profile', (req, res)=> { +// sess = req.session; +// sess.username = req.body.username; +// +// +// }) + +router.post("/newprofile", (req, res) => { + sess = req.session; + sess.username = req.body.username; + sess.email = req.body.email; + res.render("profileForm"); +}); + +router.post("/profileCreate", (req, res) => { + sess = req.session; + console.log(sess); + + let username; + let email; + let fname; + let lname; + let gender; + let city; + let age; + let distance; + let occupation; + let education; + let children; + let mStatus; + + let userParams = { + username: sess.username, + email: sess.email + }; + console.log(userParams); + + let profiles = req.body.profiles; + let profileParams = { + fname: profiles.fname, + lname: profiles.lname, + gender: profiles.gender, + city: profiles.city, + age: profiles.age, + distance: profiles.distance, + occupation: profiles.occupation, + education: profiles.education, + children: profiles.children, + mstatus: profiles.mstatus + }; + + sequelize.transaction(t => { + return User.findOrCreate({ + defaults: userParams, + where: { email: userParams.email }, + transaction: t + }).spread(result => { + user = result; + + profileParams.userid = user.id; + return Profile.findOrCreate({ + defaults: profileParams, + where: { userid: user.id }, + transaction: t + }) + .then(() => { + return res.render("profile", { profileParams }); + }) + .catch(e => { + return res.status(500).send(e.stack); + }); + }); + }); + + // console.log(req.body); + + // res.end("test"); +}); + +module.exports = router; diff --git a/schema.txt b/schema.txt new file mode 100644 index 0000000..eb8293f --- /dev/null +++ b/schema.txt @@ -0,0 +1,10 @@ +User: username, email, ProfileID + +Profile: fname, lname, age, city, distance, gender, mstatus, height, children - INTEGER, occupation, education + +Pets: dogs, cats, horses, other + +ProfilePets: ProfileId, PetsId + + +sequelize model:create --name User --attributes "username:string email:string profileId:integer" diff --git a/seeders/20170807215759-users.js b/seeders/20170807215759-users.js new file mode 100644 index 0000000..d6aed4e --- /dev/null +++ b/seeders/20170807215759-users.js @@ -0,0 +1,36 @@ +"use strict"; + +let models = require("./../models"); + +module.exports = { + up: function(queryInterface, Sequelize) { + /* + Add altering commands here. + Return a promise to correctly handle asynchronicity. + + Example: + return queryInterface.bulkInsert('Person', [{ + name: 'John Doe', + isBetaMember: false + }], {}); + */ + var users = []; + for (let i = 0; i < 3; i++) { + users.push({ + username: `foobar${i}`, + email: `foobar${i}@gmail.com` + }); + } + return queryInterface.bulkInsert("Users", users); + }, + + down: function(queryInterface, Sequelize) { + /* + Add reverting commands here. + Return a promise to correctly handle asynchronicity. + + Example: + return queryInterface.bulkDelete('Person', null, {}); + */ + } +}; diff --git a/seeders/20170807215810-profiles.js b/seeders/20170807215810-profiles.js new file mode 100644 index 0000000..7c6c5c5 --- /dev/null +++ b/seeders/20170807215810-profiles.js @@ -0,0 +1,45 @@ +"use strict"; + +let models = require("./../models"); + +module.exports = { + up: function(queryInterface, Sequelize) { + /* + Add altering commands here. + Return a promise to correctly handle asynchronicity. + + Example: + return queryInterface.bulkInsert('Person', [{ + name: 'John Doe', + isBetaMember: false + }], {}); + */ + var profiles = []; + for (let i = 0; i < 3; i++) { + profiles.push({ + fname: `Name${i}`, + lname: `Name${i}`, + age: i + 30, + city: `City of HomeDepot${i}`, + distance: i + 4, + mstatus: "single", + height: i + 30, + children: i, + occupation: "Vikings", + education: "Viking Code School", + userid: i + 1 + }); + } + return queryInterface.bulkInsert("Profiles", profiles); + }, + + down: function(queryInterface, Sequelize) { + /* + Add reverting commands here. + Return a promise to correctly handle asynchronicity. + + Example: + return queryInterface.bulkDelete('Person', null, {}); + */ + } +}; diff --git a/views/home.handlebars b/views/home.handlebars new file mode 100644 index 0000000..47463de --- /dev/null +++ b/views/home.handlebars @@ -0,0 +1,32 @@ + + +
+
+

Please Log In Sir or Ma'am

+
+
+ + +
+ +
+
+
+ + +
+
+

Please Sign Up

+
+
+ + +
+
+ + +
+ +
+
+
diff --git a/views/layouts/main.handlebars b/views/layouts/main.handlebars new file mode 100644 index 0000000..a76831f --- /dev/null +++ b/views/layouts/main.handlebars @@ -0,0 +1,17 @@ + + + + + + + + + + + +
+ {{{ body }}} +
+ + + diff --git a/views/login.handlebars b/views/login.handlebars new file mode 100644 index 0000000..f6d23a2 --- /dev/null +++ b/views/login.handlebars @@ -0,0 +1,12 @@ +
+
+

Please Log In

+
+
+ + +
+ +
+
+
diff --git a/views/profile.handlebars b/views/profile.handlebars new file mode 100644 index 0000000..f36824a --- /dev/null +++ b/views/profile.handlebars @@ -0,0 +1 @@ +{{profileParams}} diff --git a/views/profileForm.handlebars b/views/profileForm.handlebars new file mode 100644 index 0000000..97759b2 --- /dev/null +++ b/views/profileForm.handlebars @@ -0,0 +1,85 @@ +
+
+

Please Sign Up

+ +
+
+ + +
+ +
+ + +
+ +
+ +
+ +
+ +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ + +
+
+