Bläddra i källkod

Add ip model with n:m relation with user model, add new ip instance on login/account creation

sbkwgh 8 år sedan
förälder
incheckning
ad9fbb32cd
3 ändrade filer med 36 tillägg och 2 borttagningar
  1. 31 0
      models/ip.js
  2. 1 0
      models/user.js
  3. 4 2
      routes/user.js

+ 31 - 0
models/ip.js

@@ -0,0 +1,31 @@
+module.exports = (sequelize, DataTypes) => {
+	let Ip = sequelize.define('Ip', {
+		ip: {
+			type: DataTypes.STRING(45),
+			validate: {
+				isIP: true
+			}
+		}
+	}, {
+		classMethods: {
+			associate (models) {
+				Ip.belongsToMany(models.User, { through: 'UserIp' })
+			},
+			async createIfNotExists (ipAddress, user) {
+				 let existingIp = await Ip.findOne({
+				 	where: { ip: ipAddress },
+				 	include: [{
+				 		model: sequelize.models.User,
+						where: { id: user.id }
+				 	}]
+				 })
+
+				 if(!existingIp) {
+				 	let ip = await Ip.create({ ip: ipAddress })
+				 	await ip.addUser(user)
+				 }
+			}
+		}
+	})
+	return Ip
+}

+ 1 - 0
models/user.js

@@ -107,6 +107,7 @@ module.exports = (sequelize, DataTypes) => {
 			associate (models) {
 				User.hasMany(models.Post)
 				User.hasMany(models.Thread)
+				User.belongsToMany(models.Ip, { through: 'UserIp' })
 			},
 			includeOptions (from, limit) {
 				let models = sequelize.models

+ 4 - 2
routes/user.js

@@ -3,7 +3,7 @@ let express = require('express')
 let router = express.Router()
 
 const Errors = require('../lib/errors.js')
-let { User, Post, AdminToken, Thread, Category, Sequelize } = require('../models')
+let { User, Post, AdminToken, Thread, Category, Sequelize, Ip } = require('../models')
 let pagination = require('../lib/pagination.js')
 
 function setUserSession(req, res, username, UserId, admin) {
@@ -32,6 +32,7 @@ router.post('/', async (req, res) => {
 		}
 
 		let user = await User.create(userParams)
+		await Ip.createIfNotExists(req.ip, user)
 
 		setUserSession(req, res, user.username, user.id, userParams.admin)
 		res.json(user.toJSON())
@@ -120,8 +121,9 @@ router.post('/:username/login', async (req, res) => {
 
 		if(user) {
 			if(await user.comparePassword(req.body.password)) {
-				setUserSession(req, res, user.username, user.id, user.admin)
+				await Ip.createIfNotExists(req.ip, user)
 
+				setUserSession(req, res, user.username, user.id, user.admin)
 				res.json({
 					username: user.username,
 					admin: user.admin,