diff --git a/.DS_Store b/.DS_Store index cf78951..c4f6317 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/day1/models/index.js b/day1/models/index.js index 39f447f..8c44682 100644 --- a/day1/models/index.js +++ b/day1/models/index.js @@ -12,6 +12,7 @@ const fs = require('fs'); const path = require('path'); let Sequelize = require('sequelize'); const basename = path.basename(__filename); +const { DataTypes } = require('sequelize'); const config = { DB_DATABASE: 'mysql', DB_USERNAME: 'root', @@ -52,7 +53,7 @@ fs.readdirSync(__dirname) return file.indexOf('.') !== 0 && file !== basename && file.slice(-3) === '.js'; }) .forEach((file) => { - var model = sequelize['import'](path.join(__dirname, file)); + var model = require(path.join(__dirname, file))(sequelize, DataTypes); db[model.name] = model; }); diff --git a/day10/models/index.js b/day10/models/index.js index 39f447f..8c44682 100644 --- a/day10/models/index.js +++ b/day10/models/index.js @@ -12,6 +12,7 @@ const fs = require('fs'); const path = require('path'); let Sequelize = require('sequelize'); const basename = path.basename(__filename); +const { DataTypes } = require('sequelize'); const config = { DB_DATABASE: 'mysql', DB_USERNAME: 'root', @@ -52,7 +53,7 @@ fs.readdirSync(__dirname) return file.indexOf('.') !== 0 && file !== basename && file.slice(-3) === '.js'; }) .forEach((file) => { - var model = sequelize['import'](path.join(__dirname, file)); + var model = require(path.join(__dirname, file))(sequelize, DataTypes); db[model.name] = model; }); diff --git a/day13/models/index.js b/day13/models/index.js index 39f447f..8c44682 100644 --- a/day13/models/index.js +++ b/day13/models/index.js @@ -12,6 +12,7 @@ const fs = require('fs'); const path = require('path'); let Sequelize = require('sequelize'); const basename = path.basename(__filename); +const { DataTypes } = require('sequelize'); const config = { DB_DATABASE: 'mysql', DB_USERNAME: 'root', @@ -52,7 +53,7 @@ fs.readdirSync(__dirname) return file.indexOf('.') !== 0 && file !== basename && file.slice(-3) === '.js'; }) .forEach((file) => { - var model = sequelize['import'](path.join(__dirname, file)); + var model = require(path.join(__dirname, file))(sequelize, DataTypes); db[model.name] = model; }); diff --git a/day14/README.md b/day14/README.md index 704b74b..d415b5c 100644 --- a/day14/README.md +++ b/day14/README.md @@ -1,4 +1,4 @@ -# node_task_2 +# day 14 1. Clone repo to your own github 2. Read the configuration.json diff --git a/day15/README.md b/day15/README.md index e69de29..504941a 100644 --- a/day15/README.md +++ b/day15/README.md @@ -0,0 +1,11 @@ +# day 15 + +## Instructions + +- setup project +- clone to your github +- Open figma file https://www.figma.com/file/Zr1EutaLsykPcADfC3el7r/ai-marketing-site-sample?node-id=0%3A1 +- Need you to finish the site by end of day both mobile and desktop responsive +- Use bootstrap 4 +- CSS should be clean, not using inline style CSS but proper classes +- deploy site using github pages https://www.codecademy.com/articles/f1-u3-github-pages diff --git a/day16/README.md b/day16/README.md index e69de29..c95ccdc 100644 --- a/day16/README.md +++ b/day16/README.md @@ -0,0 +1,13 @@ +# day 16 + +## Instructions + +- setup project +- clone to your github + +1. Read http://fabricjs.com/articles/ +2. Look at Background page image. Make this page using fabricjs. We dont need icon above the menu names. Choose 10 random default colors. If color clicked, the canvas color changes to it. Clicking on download button down the canvas. +3. Look at text page image. Clicking on text menu open the left menu to add an h1 tag, h6 tag or paragraph tag. Clicking one of these add the default text in center of canvas. Clicking on default text can edit. You can move the text around. The 60 dropdown is to set the font size. The trash icon is to delete the text +4. Look at image page image. You will call https://picsum.photos/v2/list with ajax to load images on left panel. Clicking on an image in left panel put the image in center of canvas. Clicking on trash icon will delete the image +5. Need to be done by end of day +6. Deploy code to github pages so Client can see it diff --git a/day16/background page.png b/day16/background page.png new file mode 100644 index 0000000..b04b794 Binary files /dev/null and b/day16/background page.png differ diff --git a/day16/image page.png b/day16/image page.png new file mode 100644 index 0000000..5001427 Binary files /dev/null and b/day16/image page.png differ diff --git a/day16/shape page.png b/day16/shape page.png new file mode 100644 index 0000000..f237fc6 Binary files /dev/null and b/day16/shape page.png differ diff --git a/day16/text page.png b/day16/text page.png new file mode 100644 index 0000000..53882ac Binary files /dev/null and b/day16/text page.png differ diff --git a/day17/README.md b/day17/README.md index e69de29..6777c34 100644 --- a/day17/README.md +++ b/day17/README.md @@ -0,0 +1,8 @@ +# day 17 + +## Instructions + +- setup project +- clone to your github +- Make the frontend for this project https://www.figma.com/file/iaKhmTAN28YiYXAOZAr9rN/Scheduler-Task?node-id=0%3A1 +- timezones are generated dynamically diff --git a/day17/app.js b/day17/app.js new file mode 100644 index 0000000..97a1728 --- /dev/null +++ b/day17/app.js @@ -0,0 +1,44 @@ +var createError = require('http-errors'); +var express = require('express'); +var path = require('path'); +var cookieParser = require('cookie-parser'); +var logger = require('morgan'); + +var indexRouter = require('./routes/index'); +var usersRouter = require('./routes/users'); + +const db = require("./models"); +var cors = require("cors"); + +var app = express(); +app.set("db", db); +// view engine setup +app.set('views', path.join(__dirname, 'views')); +app.set('view engine', 'jade'); +app.use(cors()); +app.use(logger('dev')); +app.use(express.json()); +app.use(express.urlencoded({ extended: false })); +app.use(cookieParser()); +app.use(express.static(path.join(__dirname, 'public'))); + +app.use('/', indexRouter); +app.use('/users', usersRouter); + +// catch 404 and forward to error handler +app.use(function (req, res, next) { + next(createError(404)); +}); + +// error handler +app.use(function (err, req, res, next) { + // set locals, only providing error in development + res.locals.message = err.message; + res.locals.error = req.app.get('env') === 'development' ? err : {}; + + // render the error page + res.status(err.status || 500); + res.render('error'); +}); + +module.exports = app; diff --git a/day17/bin/www b/day17/bin/www new file mode 100755 index 0000000..cd1a62f --- /dev/null +++ b/day17/bin/www @@ -0,0 +1,90 @@ +#!/usr/bin/env node + +/** + * Module dependencies. + */ + +var app = require('../app'); +var debug = require('debug')('day-1:server'); +var http = require('http'); + +/** + * Get port from environment and store in Express. + */ + +var port = normalizePort(process.env.PORT || '3000'); +app.set('port', port); + +/** + * Create HTTP server. + */ + +var server = http.createServer(app); + +/** + * Listen on provided port, on all network interfaces. + */ + +server.listen(port); +server.on('error', onError); +server.on('listening', onListening); + +/** + * Normalize a port into a number, string, or false. + */ + +function normalizePort(val) { + var port = parseInt(val, 10); + + if (isNaN(port)) { + // named pipe + return val; + } + + if (port >= 0) { + // port number + return port; + } + + return false; +} + +/** + * Event listener for HTTP server "error" event. + */ + +function onError(error) { + if (error.syscall !== 'listen') { + throw error; + } + + var bind = typeof port === 'string' + ? 'Pipe ' + port + : 'Port ' + port; + + // handle specific listen errors with friendly messages + switch (error.code) { + case 'EACCES': + console.error(bind + ' requires elevated privileges'); + process.exit(1); + break; + case 'EADDRINUSE': + console.error(bind + ' is already in use'); + process.exit(1); + break; + default: + throw error; + } +} + +/** + * Event listener for HTTP server "listening" event. + */ + +function onListening() { + var addr = server.address(); + var bind = typeof addr === 'string' + ? 'pipe ' + addr + : 'port ' + addr.port; + debug('Listening on ' + bind); +} diff --git a/day17/models/index.js b/day17/models/index.js new file mode 100644 index 0000000..8c44682 --- /dev/null +++ b/day17/models/index.js @@ -0,0 +1,69 @@ +'use strict'; +/*Powered By: Manaknightdigital Inc. https://manaknightdigital.com/ Year: 2020*/ +/** + * Sequelize File + * @copyright 2020 Manaknightdigital Inc. + * @link https://manaknightdigital.com + * @license Proprietary Software licensing + * @author Ryan Wong + * + */ +const fs = require('fs'); +const path = require('path'); +let Sequelize = require('sequelize'); +const basename = path.basename(__filename); +const { DataTypes } = require('sequelize'); +const config = { + DB_DATABASE: 'mysql', + DB_USERNAME: 'root', + DB_PASSWORD: 'root', + DB_ADAPTER: 'mysql', + DB_NAME: 'day_1', + DB_HOSTNAME: 'localhost', + DB_PORT: 3306, +}; + +let db = {}; + +let sequelize = new Sequelize(config.DB_DATABASE, config.DB_USERNAME, config.DB_PASSWORD, { + dialect: config.DB_ADAPTER, + username: config.DB_USERNAME, + password: config.DB_PASSWORD, + database: config.DB_NAME, + host: config.DB_HOSTNAME, + port: config.DB_PORT, + logging: console.log, + timezone: '-04:00', + pool: { + maxConnections: 1, + minConnections: 0, + maxIdleTime: 100, + }, + define: { + timestamps: false, + underscoredAll: true, + underscored: true, + }, +}); + +// sequelize.sync({ force: true }); + +fs.readdirSync(__dirname) + .filter((file) => { + return file.indexOf('.') !== 0 && file !== basename && file.slice(-3) === '.js'; + }) + .forEach((file) => { + var model = require(path.join(__dirname, file))(sequelize, DataTypes); + db[model.name] = model; + }); + +Object.keys(db).forEach((modelName) => { + if (db[modelName].associate) { + db[modelName].associate(db); + } +}); + +db.sequelize = sequelize; +db.Sequelize = Sequelize; + +module.exports = db; \ No newline at end of file diff --git a/day17/models/location.js b/day17/models/location.js new file mode 100644 index 0000000..7f430bb --- /dev/null +++ b/day17/models/location.js @@ -0,0 +1,26 @@ +module.exports = (sequelize, DataTypes) => { + const location = sequelize.define( + "location", + { + id: { + type: DataTypes.INTEGER, + primaryKey: true, + autoIncrement: true, + }, + name: DataTypes.STRING, + created_at: DataTypes.DATEONLY, + updated_at: DataTypes.DATE, + }, + { + timestamps: true, + freezeTableName: true, + tableName: "location", + }, + { + underscoredAll: false, + underscored: false, + } + ); + + return location; +}; \ No newline at end of file diff --git a/day17/package.json b/day17/package.json new file mode 100644 index 0000000..219c20e --- /dev/null +++ b/day17/package.json @@ -0,0 +1,19 @@ +{ + "name": "day-1", + "version": "0.0.0", + "private": true, + "scripts": { + "start": "node ./bin/www" + }, + "dependencies": { + "cookie-parser": "~1.4.4", + "cors": "^2.8.5", + "debug": "~2.6.9", + "express": "~4.16.1", + "http-errors": "~1.6.3", + "jade": "~1.11.0", + "morgan": "~1.9.1", + "mysql2": "^2.3.3", + "sequelize": "^6.15.1" + } +} diff --git a/day17/public/stylesheets/style.css b/day17/public/stylesheets/style.css new file mode 100644 index 0000000..9453385 --- /dev/null +++ b/day17/public/stylesheets/style.css @@ -0,0 +1,8 @@ +body { + padding: 50px; + font: 14px "Lucida Grande", Helvetica, Arial, sans-serif; +} + +a { + color: #00B7FF; +} diff --git a/day17/routes/index.js b/day17/routes/index.js new file mode 100644 index 0000000..ecca96a --- /dev/null +++ b/day17/routes/index.js @@ -0,0 +1,9 @@ +var express = require('express'); +var router = express.Router(); + +/* GET home page. */ +router.get('/', function(req, res, next) { + res.render('index', { title: 'Express' }); +}); + +module.exports = router; diff --git a/day17/routes/users.js b/day17/routes/users.js new file mode 100644 index 0000000..623e430 --- /dev/null +++ b/day17/routes/users.js @@ -0,0 +1,9 @@ +var express = require('express'); +var router = express.Router(); + +/* GET users listing. */ +router.get('/', function(req, res, next) { + res.send('respond with a resource'); +}); + +module.exports = router; diff --git a/day17/services/ValidationService.js b/day17/services/ValidationService.js new file mode 100644 index 0000000..bf60bc8 --- /dev/null +++ b/day17/services/ValidationService.js @@ -0,0 +1,85 @@ +const { Validator, addCustomMessages } = require('node-input-validator'); + +// {fieldName:message} eg:{email:"Invalid Email", password:"Password too short"} +const formatValidationError = (error) => { + const formatted = Object.entries(error) + .map(([key, value]) => ({ + field: key, + message: value.message, + })) + .reduce((accumulator, currentValue) => { + if (!accumulator[currentValue]) { + accumulator[currentValue.field] = currentValue.message; + } + return accumulator; + }, {}); + return formatted; +}; + +module.exports = { + /** + * Input Validator middleware for controller + * @param {object} validationObject object defining body fields and its validation types eg:{email:required|email} + * @param {object} _extendMessages object defining message to throw on validation error eg: {"email.required":"Email is required","email.email":"Invalid email"} + * + */ + validateInput: (validationObject = {}, _extendMessages = {}) => async ( + req, + res, + next, + ) => { + const validation = new Validator(req.body, validationObject); + addCustomMessages(_extendMessages); + + try { + const isValid = await validation.check(); + if (!isValid) { + req.validationError = formatValidationError(validation.errors); + } + return next(); + } catch (error) { + req.validationError = error.message; + return next(); + } + }, + + handleValidationErrorForViews: ( + req, + res, + viewModel, + viewPath = '/', + fieldsStoreKey, + defaultValue = {}, + ) => { + const validationError = req.validationError; + + if (validationError) { + // Remembers fields if validation error occurs + Object.entries(defaultValue).forEach(([key, value]) => { + viewModel[fieldsStoreKey][key] = value; + }); + + if (typeof validationError === 'string') { + viewModel.error = validationError; + } else { + viewModel.validationError = req.validationError; + } + return res.render(viewPath, viewModel); + } + }, + + handleValidationErrorForAPI: (req, res, next) => { + const validationError = req.validationError; + + if (validationError) { + let error; + if (typeof validationError === 'string') { + error = validationError; + } else { + error = req.validationError; + } + return res.json({ success: false, error }); + } + next(); + }, +}; diff --git a/day17/views/error.jade b/day17/views/error.jade new file mode 100644 index 0000000..51ec12c --- /dev/null +++ b/day17/views/error.jade @@ -0,0 +1,6 @@ +extends layout + +block content + h1= message + h2= error.status + pre #{error.stack} diff --git a/day17/views/index.jade b/day17/views/index.jade new file mode 100644 index 0000000..3d63b9a --- /dev/null +++ b/day17/views/index.jade @@ -0,0 +1,5 @@ +extends layout + +block content + h1= title + p Welcome to #{title} diff --git a/day17/views/layout.jade b/day17/views/layout.jade new file mode 100644 index 0000000..15af079 --- /dev/null +++ b/day17/views/layout.jade @@ -0,0 +1,7 @@ +doctype html +html + head + title= title + link(rel='stylesheet', href='/stylesheets/style.css') + body + block content diff --git a/day18/README.md b/day18/README.md index e69de29..defef71 100644 --- a/day18/README.md +++ b/day18/README.md @@ -0,0 +1,3 @@ +# day 18 + +Continue day 17 if not done diff --git a/day19/README.md b/day19/README.md index e69de29..737087e 100644 --- a/day19/README.md +++ b/day19/README.md @@ -0,0 +1,9 @@ +# day 18 + +## Instructions + +- setup project +- clone to your github +- create table schedule(times booked off by clients), availability (hours user is available) +- Make the api /api/v1/schedule that save the appointment to the database table schedule +- Make api /api/v1/booked that return available times excluding schedule. Use this api to show the times in calendar diff --git a/day19/app.js b/day19/app.js new file mode 100644 index 0000000..97a1728 --- /dev/null +++ b/day19/app.js @@ -0,0 +1,44 @@ +var createError = require('http-errors'); +var express = require('express'); +var path = require('path'); +var cookieParser = require('cookie-parser'); +var logger = require('morgan'); + +var indexRouter = require('./routes/index'); +var usersRouter = require('./routes/users'); + +const db = require("./models"); +var cors = require("cors"); + +var app = express(); +app.set("db", db); +// view engine setup +app.set('views', path.join(__dirname, 'views')); +app.set('view engine', 'jade'); +app.use(cors()); +app.use(logger('dev')); +app.use(express.json()); +app.use(express.urlencoded({ extended: false })); +app.use(cookieParser()); +app.use(express.static(path.join(__dirname, 'public'))); + +app.use('/', indexRouter); +app.use('/users', usersRouter); + +// catch 404 and forward to error handler +app.use(function (req, res, next) { + next(createError(404)); +}); + +// error handler +app.use(function (err, req, res, next) { + // set locals, only providing error in development + res.locals.message = err.message; + res.locals.error = req.app.get('env') === 'development' ? err : {}; + + // render the error page + res.status(err.status || 500); + res.render('error'); +}); + +module.exports = app; diff --git a/day19/bin/www b/day19/bin/www new file mode 100755 index 0000000..cd1a62f --- /dev/null +++ b/day19/bin/www @@ -0,0 +1,90 @@ +#!/usr/bin/env node + +/** + * Module dependencies. + */ + +var app = require('../app'); +var debug = require('debug')('day-1:server'); +var http = require('http'); + +/** + * Get port from environment and store in Express. + */ + +var port = normalizePort(process.env.PORT || '3000'); +app.set('port', port); + +/** + * Create HTTP server. + */ + +var server = http.createServer(app); + +/** + * Listen on provided port, on all network interfaces. + */ + +server.listen(port); +server.on('error', onError); +server.on('listening', onListening); + +/** + * Normalize a port into a number, string, or false. + */ + +function normalizePort(val) { + var port = parseInt(val, 10); + + if (isNaN(port)) { + // named pipe + return val; + } + + if (port >= 0) { + // port number + return port; + } + + return false; +} + +/** + * Event listener for HTTP server "error" event. + */ + +function onError(error) { + if (error.syscall !== 'listen') { + throw error; + } + + var bind = typeof port === 'string' + ? 'Pipe ' + port + : 'Port ' + port; + + // handle specific listen errors with friendly messages + switch (error.code) { + case 'EACCES': + console.error(bind + ' requires elevated privileges'); + process.exit(1); + break; + case 'EADDRINUSE': + console.error(bind + ' is already in use'); + process.exit(1); + break; + default: + throw error; + } +} + +/** + * Event listener for HTTP server "listening" event. + */ + +function onListening() { + var addr = server.address(); + var bind = typeof addr === 'string' + ? 'pipe ' + addr + : 'port ' + addr.port; + debug('Listening on ' + bind); +} diff --git a/day19/models/index.js b/day19/models/index.js new file mode 100644 index 0000000..8c44682 --- /dev/null +++ b/day19/models/index.js @@ -0,0 +1,69 @@ +'use strict'; +/*Powered By: Manaknightdigital Inc. https://manaknightdigital.com/ Year: 2020*/ +/** + * Sequelize File + * @copyright 2020 Manaknightdigital Inc. + * @link https://manaknightdigital.com + * @license Proprietary Software licensing + * @author Ryan Wong + * + */ +const fs = require('fs'); +const path = require('path'); +let Sequelize = require('sequelize'); +const basename = path.basename(__filename); +const { DataTypes } = require('sequelize'); +const config = { + DB_DATABASE: 'mysql', + DB_USERNAME: 'root', + DB_PASSWORD: 'root', + DB_ADAPTER: 'mysql', + DB_NAME: 'day_1', + DB_HOSTNAME: 'localhost', + DB_PORT: 3306, +}; + +let db = {}; + +let sequelize = new Sequelize(config.DB_DATABASE, config.DB_USERNAME, config.DB_PASSWORD, { + dialect: config.DB_ADAPTER, + username: config.DB_USERNAME, + password: config.DB_PASSWORD, + database: config.DB_NAME, + host: config.DB_HOSTNAME, + port: config.DB_PORT, + logging: console.log, + timezone: '-04:00', + pool: { + maxConnections: 1, + minConnections: 0, + maxIdleTime: 100, + }, + define: { + timestamps: false, + underscoredAll: true, + underscored: true, + }, +}); + +// sequelize.sync({ force: true }); + +fs.readdirSync(__dirname) + .filter((file) => { + return file.indexOf('.') !== 0 && file !== basename && file.slice(-3) === '.js'; + }) + .forEach((file) => { + var model = require(path.join(__dirname, file))(sequelize, DataTypes); + db[model.name] = model; + }); + +Object.keys(db).forEach((modelName) => { + if (db[modelName].associate) { + db[modelName].associate(db); + } +}); + +db.sequelize = sequelize; +db.Sequelize = Sequelize; + +module.exports = db; \ No newline at end of file diff --git a/day19/models/location.js b/day19/models/location.js new file mode 100644 index 0000000..7f430bb --- /dev/null +++ b/day19/models/location.js @@ -0,0 +1,26 @@ +module.exports = (sequelize, DataTypes) => { + const location = sequelize.define( + "location", + { + id: { + type: DataTypes.INTEGER, + primaryKey: true, + autoIncrement: true, + }, + name: DataTypes.STRING, + created_at: DataTypes.DATEONLY, + updated_at: DataTypes.DATE, + }, + { + timestamps: true, + freezeTableName: true, + tableName: "location", + }, + { + underscoredAll: false, + underscored: false, + } + ); + + return location; +}; \ No newline at end of file diff --git a/day19/package.json b/day19/package.json new file mode 100644 index 0000000..219c20e --- /dev/null +++ b/day19/package.json @@ -0,0 +1,19 @@ +{ + "name": "day-1", + "version": "0.0.0", + "private": true, + "scripts": { + "start": "node ./bin/www" + }, + "dependencies": { + "cookie-parser": "~1.4.4", + "cors": "^2.8.5", + "debug": "~2.6.9", + "express": "~4.16.1", + "http-errors": "~1.6.3", + "jade": "~1.11.0", + "morgan": "~1.9.1", + "mysql2": "^2.3.3", + "sequelize": "^6.15.1" + } +} diff --git a/day19/public/stylesheets/style.css b/day19/public/stylesheets/style.css new file mode 100644 index 0000000..9453385 --- /dev/null +++ b/day19/public/stylesheets/style.css @@ -0,0 +1,8 @@ +body { + padding: 50px; + font: 14px "Lucida Grande", Helvetica, Arial, sans-serif; +} + +a { + color: #00B7FF; +} diff --git a/day19/routes/index.js b/day19/routes/index.js new file mode 100644 index 0000000..ecca96a --- /dev/null +++ b/day19/routes/index.js @@ -0,0 +1,9 @@ +var express = require('express'); +var router = express.Router(); + +/* GET home page. */ +router.get('/', function(req, res, next) { + res.render('index', { title: 'Express' }); +}); + +module.exports = router; diff --git a/day19/routes/users.js b/day19/routes/users.js new file mode 100644 index 0000000..623e430 --- /dev/null +++ b/day19/routes/users.js @@ -0,0 +1,9 @@ +var express = require('express'); +var router = express.Router(); + +/* GET users listing. */ +router.get('/', function(req, res, next) { + res.send('respond with a resource'); +}); + +module.exports = router; diff --git a/day19/services/ValidationService.js b/day19/services/ValidationService.js new file mode 100644 index 0000000..bf60bc8 --- /dev/null +++ b/day19/services/ValidationService.js @@ -0,0 +1,85 @@ +const { Validator, addCustomMessages } = require('node-input-validator'); + +// {fieldName:message} eg:{email:"Invalid Email", password:"Password too short"} +const formatValidationError = (error) => { + const formatted = Object.entries(error) + .map(([key, value]) => ({ + field: key, + message: value.message, + })) + .reduce((accumulator, currentValue) => { + if (!accumulator[currentValue]) { + accumulator[currentValue.field] = currentValue.message; + } + return accumulator; + }, {}); + return formatted; +}; + +module.exports = { + /** + * Input Validator middleware for controller + * @param {object} validationObject object defining body fields and its validation types eg:{email:required|email} + * @param {object} _extendMessages object defining message to throw on validation error eg: {"email.required":"Email is required","email.email":"Invalid email"} + * + */ + validateInput: (validationObject = {}, _extendMessages = {}) => async ( + req, + res, + next, + ) => { + const validation = new Validator(req.body, validationObject); + addCustomMessages(_extendMessages); + + try { + const isValid = await validation.check(); + if (!isValid) { + req.validationError = formatValidationError(validation.errors); + } + return next(); + } catch (error) { + req.validationError = error.message; + return next(); + } + }, + + handleValidationErrorForViews: ( + req, + res, + viewModel, + viewPath = '/', + fieldsStoreKey, + defaultValue = {}, + ) => { + const validationError = req.validationError; + + if (validationError) { + // Remembers fields if validation error occurs + Object.entries(defaultValue).forEach(([key, value]) => { + viewModel[fieldsStoreKey][key] = value; + }); + + if (typeof validationError === 'string') { + viewModel.error = validationError; + } else { + viewModel.validationError = req.validationError; + } + return res.render(viewPath, viewModel); + } + }, + + handleValidationErrorForAPI: (req, res, next) => { + const validationError = req.validationError; + + if (validationError) { + let error; + if (typeof validationError === 'string') { + error = validationError; + } else { + error = req.validationError; + } + return res.json({ success: false, error }); + } + next(); + }, +}; diff --git a/day19/views/error.jade b/day19/views/error.jade new file mode 100644 index 0000000..51ec12c --- /dev/null +++ b/day19/views/error.jade @@ -0,0 +1,6 @@ +extends layout + +block content + h1= message + h2= error.status + pre #{error.stack} diff --git a/day19/views/index.jade b/day19/views/index.jade new file mode 100644 index 0000000..3d63b9a --- /dev/null +++ b/day19/views/index.jade @@ -0,0 +1,5 @@ +extends layout + +block content + h1= title + p Welcome to #{title} diff --git a/day19/views/layout.jade b/day19/views/layout.jade new file mode 100644 index 0000000..15af079 --- /dev/null +++ b/day19/views/layout.jade @@ -0,0 +1,7 @@ +doctype html +html + head + title= title + link(rel='stylesheet', href='/stylesheets/style.css') + body + block content diff --git a/day2/models/index.js b/day2/models/index.js index 39f447f..8c44682 100644 --- a/day2/models/index.js +++ b/day2/models/index.js @@ -12,6 +12,7 @@ const fs = require('fs'); const path = require('path'); let Sequelize = require('sequelize'); const basename = path.basename(__filename); +const { DataTypes } = require('sequelize'); const config = { DB_DATABASE: 'mysql', DB_USERNAME: 'root', @@ -52,7 +53,7 @@ fs.readdirSync(__dirname) return file.indexOf('.') !== 0 && file !== basename && file.slice(-3) === '.js'; }) .forEach((file) => { - var model = sequelize['import'](path.join(__dirname, file)); + var model = require(path.join(__dirname, file))(sequelize, DataTypes); db[model.name] = model; }); diff --git a/day20/README.md b/day20/README.md index e69de29..35ff058 100644 --- a/day20/README.md +++ b/day20/README.md @@ -0,0 +1 @@ +Continue day 19 if not done diff --git a/day3/models/index.js b/day3/models/index.js index 39f447f..8c44682 100644 --- a/day3/models/index.js +++ b/day3/models/index.js @@ -12,6 +12,7 @@ const fs = require('fs'); const path = require('path'); let Sequelize = require('sequelize'); const basename = path.basename(__filename); +const { DataTypes } = require('sequelize'); const config = { DB_DATABASE: 'mysql', DB_USERNAME: 'root', @@ -52,7 +53,7 @@ fs.readdirSync(__dirname) return file.indexOf('.') !== 0 && file !== basename && file.slice(-3) === '.js'; }) .forEach((file) => { - var model = sequelize['import'](path.join(__dirname, file)); + var model = require(path.join(__dirname, file))(sequelize, DataTypes); db[model.name] = model; }); diff --git a/day4/models/index.js b/day4/models/index.js index 39f447f..8c44682 100644 --- a/day4/models/index.js +++ b/day4/models/index.js @@ -12,6 +12,7 @@ const fs = require('fs'); const path = require('path'); let Sequelize = require('sequelize'); const basename = path.basename(__filename); +const { DataTypes } = require('sequelize'); const config = { DB_DATABASE: 'mysql', DB_USERNAME: 'root', @@ -52,7 +53,7 @@ fs.readdirSync(__dirname) return file.indexOf('.') !== 0 && file !== basename && file.slice(-3) === '.js'; }) .forEach((file) => { - var model = sequelize['import'](path.join(__dirname, file)); + var model = require(path.join(__dirname, file))(sequelize, DataTypes); db[model.name] = model; }); diff --git a/day5/models/index.js b/day5/models/index.js index 39f447f..8c44682 100644 --- a/day5/models/index.js +++ b/day5/models/index.js @@ -12,6 +12,7 @@ const fs = require('fs'); const path = require('path'); let Sequelize = require('sequelize'); const basename = path.basename(__filename); +const { DataTypes } = require('sequelize'); const config = { DB_DATABASE: 'mysql', DB_USERNAME: 'root', @@ -52,7 +53,7 @@ fs.readdirSync(__dirname) return file.indexOf('.') !== 0 && file !== basename && file.slice(-3) === '.js'; }) .forEach((file) => { - var model = sequelize['import'](path.join(__dirname, file)); + var model = require(path.join(__dirname, file))(sequelize, DataTypes); db[model.name] = model; }); diff --git a/day6/models/index.js b/day6/models/index.js index 39f447f..8c44682 100644 --- a/day6/models/index.js +++ b/day6/models/index.js @@ -12,6 +12,7 @@ const fs = require('fs'); const path = require('path'); let Sequelize = require('sequelize'); const basename = path.basename(__filename); +const { DataTypes } = require('sequelize'); const config = { DB_DATABASE: 'mysql', DB_USERNAME: 'root', @@ -52,7 +53,7 @@ fs.readdirSync(__dirname) return file.indexOf('.') !== 0 && file !== basename && file.slice(-3) === '.js'; }) .forEach((file) => { - var model = sequelize['import'](path.join(__dirname, file)); + var model = require(path.join(__dirname, file))(sequelize, DataTypes); db[model.name] = model; }); diff --git a/day7/models/index.js b/day7/models/index.js index 39f447f..8c44682 100644 --- a/day7/models/index.js +++ b/day7/models/index.js @@ -12,6 +12,7 @@ const fs = require('fs'); const path = require('path'); let Sequelize = require('sequelize'); const basename = path.basename(__filename); +const { DataTypes } = require('sequelize'); const config = { DB_DATABASE: 'mysql', DB_USERNAME: 'root', @@ -52,7 +53,7 @@ fs.readdirSync(__dirname) return file.indexOf('.') !== 0 && file !== basename && file.slice(-3) === '.js'; }) .forEach((file) => { - var model = sequelize['import'](path.join(__dirname, file)); + var model = require(path.join(__dirname, file))(sequelize, DataTypes); db[model.name] = model; }); diff --git a/day8/models/index.js b/day8/models/index.js index 39f447f..8c44682 100644 --- a/day8/models/index.js +++ b/day8/models/index.js @@ -12,6 +12,7 @@ const fs = require('fs'); const path = require('path'); let Sequelize = require('sequelize'); const basename = path.basename(__filename); +const { DataTypes } = require('sequelize'); const config = { DB_DATABASE: 'mysql', DB_USERNAME: 'root', @@ -52,7 +53,7 @@ fs.readdirSync(__dirname) return file.indexOf('.') !== 0 && file !== basename && file.slice(-3) === '.js'; }) .forEach((file) => { - var model = sequelize['import'](path.join(__dirname, file)); + var model = require(path.join(__dirname, file))(sequelize, DataTypes); db[model.name] = model; }); diff --git a/day9/models/index.js b/day9/models/index.js index 39f447f..8c44682 100644 --- a/day9/models/index.js +++ b/day9/models/index.js @@ -12,6 +12,7 @@ const fs = require('fs'); const path = require('path'); let Sequelize = require('sequelize'); const basename = path.basename(__filename); +const { DataTypes } = require('sequelize'); const config = { DB_DATABASE: 'mysql', DB_USERNAME: 'root', @@ -52,7 +53,7 @@ fs.readdirSync(__dirname) return file.indexOf('.') !== 0 && file !== basename && file.slice(-3) === '.js'; }) .forEach((file) => { - var model = sequelize['import'](path.join(__dirname, file)); + var model = require(path.join(__dirname, file))(sequelize, DataTypes); db[model.name] = model; });