Просмотр исходного кода

Merge branch 'implement-user-tests'

sbkwgh 8 лет назад
Родитель
Сommit
a2a102500c
5 измененных файлов с 97 добавлено и 15 удалено
  1. 26 7
      lib/errors.js
  2. 17 0
      migrations/20170211214917-unnamed-migration.js
  3. 4 1
      models/user.js
  4. 0 1
      package.json
  5. 50 6
      routes/user.js

+ 26 - 7
lib/errors.js

@@ -1,4 +1,4 @@
-const Errors = {
+let Errors = {
 	unknown: 'An unknown error occured on our end. Please try again later',
 	unknown: 'An unknown error occured on our end. Please try again later',
 	accountAlreadyCreated: 'This account has already been created',
 	accountAlreadyCreated: 'This account has already been created',
 	missingParameter (param) {
 	missingParameter (param) {
@@ -15,12 +15,31 @@ const Errors = {
 	}
 	}
 }
 }
 
 
-for(var errorName in Errors) {
-	var temp = {}
-	temp.name = errorName
-	temp.message = Errors[errorName]
+let ProcessedErrors = {}
+function processErrors(errorName) {
+	let temp
+
+	if(typeof Errors[errorName] === 'function') {
+		temp = function() {
+			let message = Errors[errorName](...arguments)
+			return {
+				name: errorName,
+				message: message
+			}
+		}
+	} else {
+		temp = {}
+		temp.name = errorName
+		temp.message = Errors[errorName]
+	}
 
 
-	Errors[errorName] = temp
+	return temp
 }
 }
 
 
-module.exports = Errors
+for(var errorName in Errors) {
+	ProcessedErrors[errorName] = processErrors(errorName)
+}
+
+ProcessedErrors.VALIDATION_ERROR = 'VALIDATION_ERROR';
+
+module.exports = ProcessedErrors

+ 17 - 0
migrations/20170211214917-unnamed-migration.js

@@ -0,0 +1,17 @@
+'use strict';
+
+module.exports = {
+  up: function (queryInterface, Sequelize) {
+    return queryInterface.changeColumn('users', 'username', {
+      type: Sequelize.STRING,
+      unique: true
+    })
+  },
+
+  down: function (queryInterface, Sequelize) {
+    sequelize.query(
+      'ALTER TABLE users DROP CONSTRAINT username_unique_idx;'
+    );
+    queryInterface.removeIndex('Users', 'username_unique_idx');
+  }
+};

+ 4 - 1
models/user.js

@@ -1,6 +1,9 @@
 module.exports = (sequelize, DataTypes) => {
 module.exports = (sequelize, DataTypes) => {
 	let User = sequelize.define('User', {
 	let User = sequelize.define('User', {
-		username: DataTypes.STRING,
+		username: {
+			type: DataTypes.STRING,
+			unique: true
+		},
 		hash: DataTypes.STRING
 		hash: DataTypes.STRING
 	}, {
 	}, {
 		classMethods: {
 		classMethods: {

+ 0 - 1
package.json

@@ -13,7 +13,6 @@
     "body-parser": "^1.16.0",
     "body-parser": "^1.16.0",
     "cross-env": "^3.1.4",
     "cross-env": "^3.1.4",
     "express": "^4.14.1",
     "express": "^4.14.1",
-    "indicative": "^2.2.1",
     "mysql": "^2.13.0",
     "mysql": "^2.13.0",
     "sequelize": "^3.30.0",
     "sequelize": "^3.30.0",
     "sequelize-cli": "^2.5.1"
     "sequelize-cli": "^2.5.1"

+ 50 - 6
routes/user.js

@@ -1,16 +1,60 @@
-let indicative = require('indicative')
 let express = require('express')
 let express = require('express')
 let router = express.Router()
 let router = express.Router()
 
 
+const Errors = require('../lib/errors.js')
 let User = require('../models').User
 let User = require('../models').User
 
 
 router.post('/', async (req, res) => {
 router.post('/', async (req, res) => {
-	 let user = await User.create({
-		username: req.body.username,
-		hash: req.body.password
-	})
+	let user, validationErrors = [];
 
 
-	res.json(user.toJSON())
+	try {
+		//Validations
+		if(req.body.username === undefined) {
+			validationErrors.push(Errors.missingParameter('username'))
+		} else {
+			if(typeof req.body.username !== 'string') {
+				validationErrors.push(Errors.invalidParameterType('username', 'string'))
+			} if(req.body.username.length < 6) {
+				validationErrors.push(Errors.parameterLengthTooSmall('username', 6))
+			} if(req.body.username.length > 50) {
+				validationErrors.push(Errors.parameterLengthTooLarge('username', 50))
+			}
+		}
+
+		if(req.body.password === undefined) {
+			validationErrors.push(Errors.missingParameter('password'))
+		} else {
+			if(typeof req.body.password !== 'string') {
+				validationErrors.push(Errors.invalidParameterType('password', 'string'))
+			} if(req.body.password.length < 6) {
+				validationErrors.push(Errors.parameterLengthTooSmall('password', 6))
+			} if(req.body.password.length > 100) {
+				validationErrors.push(Errors.parameterLengthTooLarge('password', 100))
+			}
+		}
+
+		if(validationErrors.length) throw Errors.VALIDATION_ERROR
+
+		user = await User.create({
+			username: req.body.username,
+			hash: req.body.password
+		})
+
+		res.json(user.toJSON())
+	} catch (err) {
+		console.log(err)
+		if(err === Errors.VALIDATION_ERROR) {
+			res.status(400)
+			res.json({
+				errors: validationErrors
+			})
+		} else {
+			res.status(500)
+			res.json({
+				errors: [Errors.unknown]
+			})
+		}
+	}
 })
 })
 
 
 module.exports = router
 module.exports = router