Skip to content

Commit

Permalink
feature(user should follow each other):user should follow each other
Browse files Browse the repository at this point in the history
user should follow each other
[finishes #166841021]
  • Loading branch information
Cavdy committed Jul 4, 2019
1 parent 2b8b3d8 commit 106589f
Show file tree
Hide file tree
Showing 12 changed files with 516 additions and 3 deletions.
30 changes: 29 additions & 1 deletion src/controllers/auth.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ const {
const {
sendResetToken,
resendToken,
resetPassword
resetPassword,
mockToken
} = AuthServices;

/**
Expand Down Expand Up @@ -102,6 +103,33 @@ class AuthController {
return err;
}
}

/**
* Mock
* @constructor
* @param {*} req - req
* @param {*} res - res
*/
static async mockToken(req, res) {
try {
const {
statusCode,
errorMessage,
successMessage
} = await mockToken(req.generate);

const response = await statusChecker(
req,
res,
statusCode,
errorMessage,
successMessage
);
return response;
} catch (err) {
return err;
}
}
}

export default AuthController;
79 changes: 79 additions & 0 deletions src/controllers/user.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
import UserServices from '../services/user';
import statusCheckerHelper from '../helpers/statusChecker';

const {
statusChecker
} = statusCheckerHelper;

const {
followUser,
unFollowUser
} = UserServices;

/**
* User Controller
* @constructor
*/
class UserController {
/**
* User Follow
* @constructor
* @param {*} req - req
* @param {*} res - res
*/
static async followUser(req, res) {
try {
const {
userId
} = req.params;
const {
statusCode,
errorMessage,
successMessage
} = await followUser(req.authorizedData, userId);

const response = await statusChecker(
req,
res,
statusCode,
errorMessage,
successMessage
);
return response;
} catch (err) {
return err;
}
}

/**
* Un Follow User
* @constructor
* @param {*} req - req
* @param {*} res - res
*/
static async unFollowUser(req, res) {
try {
const {
userId
} = req.params;
const {
statusCode,
errorMessage,
successMessage
} = await unFollowUser(req.authorizedData, userId);

const response = await statusChecker(
req,
res,
statusCode,
errorMessage,
successMessage
);
return response;
} catch (err) {
return err;
}
}
}

export default UserController;
47 changes: 47 additions & 0 deletions src/db/migrations/20190703220825-create-follow.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
module.exports = {
up: (queryInterface, Sequelize) => {
return queryInterface.createTable('Follows', {
id: {
allowNull: false,
autoIncrement: true,
primaryKey: true,
type: Sequelize.INTEGER
},
userId: {
type: Sequelize.INTEGER,
allowNull: false,
required: true,
references: {
model: 'Users',
key: 'id',
as: 'user'
},
onUpdate: 'cascade',
onDelete: 'cascade'
},
followId: {
type: Sequelize.INTEGER,
allowNull: false,
required: true,
references: {
model: 'Users',
key: 'id',
as: 'user'
},
onUpdate: 'cascade',
onDelete: 'cascade'
},
createdAt: {
allowNull: false,
type: Sequelize.DATE
},
updatedAt: {
allowNull: false,
type: Sequelize.DATE
}
});
},
down: (queryInterface, Sequelize) => {
return queryInterface.dropTable('Follows');
}
};
17 changes: 17 additions & 0 deletions src/db/models/follow.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
module.exports = (sequelize, DataTypes) => {
const Follow = sequelize.define('Follow', {
followId: {
type: DataTypes.STRING,
required: true
},
}, {});
Follow.associate = (models) => {
// associations can be defined here
Follow.belongsTo(models.User, {
foreignKey: 'id',
onDelete: 'CASCADE',
onUpdate: 'CASCADE'
});
};
return Follow;
};
4 changes: 4 additions & 0 deletions src/db/models/user.js
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,10 @@ module.exports = (sequelize, DataTypes) => {
foreignKey: 'user_id',
as: 'user_articles'
});
User.hasMany(models.Follow, {
foreignKey: 'userId',
as: 'follows'
});
};
return User;
};
3 changes: 2 additions & 1 deletion src/middleware/tokenGenerator.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@ class TokenGenerator {
*/
static tokenGenerate(req, res, next) {
const payload = {
token: 'token'
token: 'token',
id: 2
};
jwt.sign(payload,
process.env.GENERATE_SECRET, {
Expand Down
6 changes: 5 additions & 1 deletion src/routes/auth.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@ const router = express.Router();
const {
sendResetToken,
resendToken,
resetPassword
resetPassword,
mockToken
} = AuthController;


Expand All @@ -17,5 +18,8 @@ router.post('/resendToken', resendToken);
router.post('/resetpassword',
generateToken.verifyToken,
resetPassword);
router.post('/mockToken',
generateToken.tokenGenerate,
mockToken);

export default router;
19 changes: 19 additions & 0 deletions src/routes/user.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import express from 'express';
import UserController from '../controllers/user';
import generateToken from '../middleware/tokenGenerator';

const router = express.Router();
const {
followUser,
unFollowUser
} = UserController;


router.post('/follow/:userId',
generateToken.verifyToken,
followUser);
router.post('/unfollow/:userId',
generateToken.verifyToken,
unFollowUser);

export default router;
2 changes: 2 additions & 0 deletions src/server.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import config from './db/config/config';

// IMPORT ROUTES
import AuthRoute from './routes/auth';
import UserRoute from './routes/user';

const { isProduction, port } = config;

Expand Down Expand Up @@ -98,6 +99,7 @@ app.get('/', (req, res) => {

// APP ROUTES
app.use('/api/auth', AuthRoute);
app.use('/api/user', UserRoute);

// production error handler
// no stacktraces leaked to user
Expand Down
19 changes: 19 additions & 0 deletions src/services/auth.js
Original file line number Diff line number Diff line change
Expand Up @@ -200,6 +200,25 @@ class AuthServices {
return err;
}
}

/**
* MOCK TOKEN
* @constructor
* @param {*} token - query
*/
static mockToken(token) {
let statusCode = '',
successMessage = '';
const errorMessage = '';

statusCode = 200;
successMessage = token;
return {
statusCode,
errorMessage,
successMessage
};
}
}

export default AuthServices;
Loading

0 comments on commit 106589f

Please sign in to comment.