Skip to content
Snippets Groups Projects
Commit 5b940ac1 authored by Ignacio Otero's avatar Ignacio Otero
Browse files

Merge con feature/users

parents e6815e5b 8ff3c5ad
No related branches found
No related tags found
No related merge requests found
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.down = exports.up = void 0;
const up = (queryInterface, Sequelize) => queryInterface.createTable('Users', {
id: {
type: Sequelize.INTEGER,
allowNull: false,
autoIncrement: true,
primaryKey: true,
},
name: {
type: Sequelize.STRING,
allowNull: true,
validate: {
notEmpty: true,
len: [3, 40],
},
},
email: {
type: Sequelize.STRING,
allowNull: false,
unique: true,
validate: {
isEmail: true,
max: 60,
},
},
organization: {
type: Sequelize.STRING,
allowNull: false,
validate: {
notEmpty: true,
max: 50,
},
},
password: {
type: Sequelize.STRING,
allowNull: false,
},
type: {
type: Sequelize.INTEGER,
allowNull: false,
},
token: {
type: Sequelize.STRING,
allowNull: true,
},
status: {
type: Sequelize.INTEGER,
allowNull: false,
},
active: {
type: Sequelize.BOOLEAN,
allowNull: false,
defaultValue: true,
},
createdAt: {
type: Sequelize.DATE,
allowNull: false,
},
updatedAt: {
type: Sequelize.DATE,
allowNull: true,
},
createdBy: {
type: Sequelize.INTEGER,
allowNull: false,
},
updatedBy: {
type: Sequelize.INTEGER,
allowNull: true,
},
deletedAt: {
type: Sequelize.DATE,
allowNull: true,
},
});
exports.up = up;
const down = (queryInterface, Sequelize) => queryInterface.dropTable('Users');
exports.down = down;
//# sourceMappingURL=20200817181233-create-users.migration.js.map
\ No newline at end of file
{"version":3,"file":"20200817181233-create-users.migration.js","sourceRoot":"","sources":["../../src/migrations/20200817181233-create-users.migration.ts"],"names":[],"mappings":";;;AAAO,MAAM,EAAE,GAAG,CAAC,cAAmB,EAAE,SAAc,EAAE,EAAE,CAAC,cAAc,CAAC,WAAW,CAAC,OAAO,EAAE;IAC7F,EAAE,EAAE;QACF,IAAI,EAAE,SAAS,CAAC,OAAO;QACvB,SAAS,EAAE,KAAK;QAChB,aAAa,EAAE,IAAI;QACnB,UAAU,EAAE,IAAI;KACjB;IACD,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS,CAAC,MAAM;QACtB,SAAS,EAAE,IAAI;QACf,QAAQ,EAAE;YACR,QAAQ,EAAE,IAAI;YACd,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;SACb;KACF;IACD,KAAK,EAAE;QACL,IAAI,EAAE,SAAS,CAAC,MAAM;QACtB,SAAS,EAAE,KAAK;QAChB,MAAM,EAAE,IAAI;QACZ,QAAQ,EAAE;YACR,OAAO,EAAE,IAAI;YACb,GAAG,EAAE,EAAE;SACR;KACF;IACD,YAAY,EAAE;QACZ,IAAI,EAAE,SAAS,CAAC,MAAM;QACtB,SAAS,EAAE,KAAK;QAChB,QAAQ,EAAE;YACR,QAAQ,EAAE,IAAI;YACd,GAAG,EAAE,EAAE;SACR;KACF;IACD,QAAQ,EAAE;QACR,IAAI,EAAE,SAAS,CAAC,MAAM;QACtB,SAAS,EAAE,KAAK;KACjB;IACD,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS,CAAC,OAAO;QACvB,SAAS,EAAE,KAAK;KACjB;IACD,KAAK,EAAE;QACL,IAAI,EAAE,SAAS,CAAC,MAAM;QACtB,SAAS,EAAE,IAAI;KAChB;IACD,MAAM,EAAE;QACN,IAAI,EAAE,SAAS,CAAC,OAAO;QACvB,SAAS,EAAE,KAAK;KACjB;IACD,MAAM,EAAE;QACN,IAAI,EAAE,SAAS,CAAC,OAAO;QACvB,SAAS,EAAE,KAAK;QAChB,YAAY,EAAE,IAAI;KACnB;IACD,SAAS,EAAE;QACT,IAAI,EAAE,SAAS,CAAC,IAAI;QACpB,SAAS,EAAE,KAAK;KACjB;IACD,SAAS,EAAE;QACT,IAAI,EAAE,SAAS,CAAC,IAAI;QACpB,SAAS,EAAE,IAAI;KAChB;IACD,SAAS,EAAE;QACT,IAAI,EAAE,SAAS,CAAC,OAAO;QACvB,SAAS,EAAE,KAAK;KACjB;IACD,SAAS,EAAE;QACT,IAAI,EAAE,SAAS,CAAC,OAAO;QACvB,SAAS,EAAE,IAAI;KAChB;IACD,SAAS,EAAE;QACT,IAAI,EAAE,SAAS,CAAC,IAAI;QACpB,SAAS,EAAE,IAAI;KAChB;CACF,CAAC,CAAC;AAzEU,QAAA,EAAE,MAyEZ;AAEI,MAAM,IAAI,GAAG,CAAC,cAAmB,EAAE,SAAc,EAAE,EAAE,CAAC,cAAc,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;AAAlF,QAAA,IAAI,QAA8E"}
\ No newline at end of file
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.User = void 0;
const users_model_1 = require("./users.model");
Object.defineProperty(exports, "User", { enumerable: true, get: function () { return users_model_1.User; } });
//# sourceMappingURL=index.model.js.map
\ No newline at end of file
{"version":3,"file":"index.model.js","sourceRoot":"","sources":["../../src/models/index.model.ts"],"names":[],"mappings":";;;AAAA,+CAAqC;AAGnC,qFAHO,kBAAI,OAGP"}
\ No newline at end of file
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.User = void 0;
const sequelize_1 = require("sequelize");
const index_enum_1 = require("../enums/index.enum");
const environments = __importStar(require("../config/config"));
const current = process.env.NODE_ENV || 'development';
const config = environments[current];
const sequelize = new sequelize_1.Sequelize(config.database, config.username, config.password, config);
class User extends sequelize_1.Model {
toJSON() {
const values = Object.assign({}, this.get());
delete values.password;
delete values.updatedAt;
delete values.createdBy;
delete values.updatedBy;
delete values.deletedAt;
return values;
}
}
exports.User = User;
User.init({
id: {
type: sequelize_1.DataTypes.INTEGER,
allowNull: false,
primaryKey: true,
autoIncrement: true,
},
name: {
type: sequelize_1.DataTypes.STRING(255),
allowNull: true,
validate: {
notEmpty: true,
len: [3, 40],
},
},
email: {
type: sequelize_1.DataTypes.STRING(255),
allowNull: false,
unique: true,
validate: {
isEmail: true,
max: 60,
},
},
organization: {
type: sequelize_1.DataTypes.STRING(255),
allowNull: false,
validate: {
notEmpty: true,
max: 50,
},
},
password: {
type: sequelize_1.DataTypes.STRING(255),
allowNull: false,
},
type: {
type: sequelize_1.DataTypes.INTEGER,
allowNull: false,
},
token: {
type: sequelize_1.DataTypes.STRING(255),
allowNull: true,
},
status: {
type: sequelize_1.DataTypes.INTEGER,
allowNull: false,
validate: {
isIn: {
args: [[
String(index_enum_1.status.pending),
String(index_enum_1.status.approved),
String(index_enum_1.status.rejected),
]],
msg: 'invalid status',
},
},
},
active: {
type: sequelize_1.DataTypes.BOOLEAN,
allowNull: false,
defaultValue: true,
},
createdAt: {
type: sequelize_1.DataTypes.DATE,
allowNull: false,
},
updatedAt: {
type: sequelize_1.DataTypes.DATE,
allowNull: true,
},
createdBy: {
type: sequelize_1.DataTypes.INTEGER,
allowNull: false,
},
updatedBy: {
type: sequelize_1.DataTypes.INTEGER,
allowNull: true,
},
deletedAt: {
type: sequelize_1.DataTypes.DATE,
allowNull: true,
},
}, {
sequelize,
modelName: 'User',
});
//# sourceMappingURL=users.model.js.map
\ No newline at end of file
{"version":3,"file":"users.model.js","sourceRoot":"","sources":["../../src/models/users.model.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const express_1 = require("express");
const Controllers_1 = require("./Controllers");
const router = (0, express_1.Router)();
router.get('/', (req, res) => {
res.send('Hey! This is REPP API, you can go to /api-docs to learn more!');
});
router.use('/users', Controllers_1.UserController);
exports.default = router;
//# sourceMappingURL=routes.js.map
\ No newline at end of file
{"version":3,"file":"routes.js","sourceRoot":"","sources":["../src/routes.ts"],"names":[],"mappings":";;AAAA,qCAAoD;AACpD,+CAA+C;AAE/C,MAAM,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAC;AAExB,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAY,EAAE,GAAa,EAAQ,EAAE;IACpD,GAAG,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;AAC5E,CAAC,CAAC,CAAC;AAEH,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,4BAAc,CAAC,CAAC;AAErC,kBAAe,MAAM,CAAC"}
\ No newline at end of file
......@@ -140,6 +140,16 @@ const active = async (req: Request, res: Response): Promise<Response> => {
}
};
const login = async (req: Request, res: Response): Promise<Response> => {
try {
const logged: User = await UserService.login(req.body);
return res.status(200).send(logged);
} catch (error) {
const e = error as Error;
return res.status(400).json({ error: e.message });
}
};
router.route('/')
.get(listAll)
.post(create);
......@@ -178,4 +188,7 @@ router.route('/:id/admin')
router.route('/:id/client')
.put(removeAdminPermission);
router.route('/login')
.post(login);
export default router;
......@@ -4,7 +4,7 @@ import { profiles, status } from '../enums/index.enum';
import Paginator from '../interfaces/paginator.interface';
import { User } from '../models/users.model';
import { UserCreateDTO, UserDTO } from '../DTOs/UserDTO';
import { UserCreateDTO, UserLoginDTO } from '../DTOs/UserDTO';
const listPending = async (limit: number, offset: number,
search: string): Promise<Paginator<User>> => {
......@@ -393,6 +393,31 @@ const active = async (userId: number): Promise<User> => User.findOne({
throw new Error('find user error');
});
const login = async (userDTO: UserLoginDTO): Promise<User> => User.findOne({
attributes: [
'id', 'name', 'email', 'organization', 'password',
'type', 'status', 'active', 'createdAt',
],
where: {
email: userDTO.email,
status: status.approved,
active: true,
},
}).then((user: User) => {
if (!user) {
throw new Error('user not found');
} else if (user && bcrypt.compareSync(userDTO.password, String(user.get('password')))) {
return user;
} else {
console.log('auth failed, credentials:', userDTO);
throw new Error('auth failed');
}
}).catch((error: Error) => {
console.log(error);
console.log('credentials:', userDTO);
throw new Error('find user error');
});
export default {
listAll,
listPending,
......@@ -407,4 +432,5 @@ export default {
active,
giveAdminPermission,
removeAdminPermission,
login,
};
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment