Merge branch 'dev' of https://repositorio.acatlan.unam.mx/CIDWA/pcpuma_unam_api into saavedra
This commit is contained in:
commit
a1954a5fd5
@ -1,8 +1,8 @@
|
||||
INSERT INTO institucion (institucion, logo) VALUES ("Facultad de Arquitectura", "url");
|
||||
INSERT INTO institucion (institucion, logo) VALUES ("FES Acatlán", "url");
|
||||
INSERT INTO institucion (institucion, logo) VALUES ("Facultad de Arquitectura", "url");
|
||||
|
||||
INSERT INTO carrera (carrera, id_institucion) VALUES ("Matemáticas Aplicadas y Computación", 2);
|
||||
INSERT INTO carrera (carrera, id_institucion) VALUES ("Arquitectura", 1);
|
||||
INSERT INTO carrera (carrera, id_institucion) VALUES ("Matemáticas Aplicadas y Computación", 1);
|
||||
INSERT INTO carrera (carrera, id_institucion) VALUES ("Arquitectura", 2);
|
||||
|
||||
INSERT INTO status (status) VALUES ("Activo");
|
||||
INSERT INTO status (status) VALUES ("Apartado");
|
||||
|
315
package-lock.json
generated
315
package-lock.json
generated
@ -12,12 +12,16 @@
|
||||
"@nestjs/common": "^8.0.0",
|
||||
"@nestjs/config": "^2.0.0",
|
||||
"@nestjs/core": "^8.0.0",
|
||||
"@nestjs/jwt": "^8.0.0",
|
||||
"@nestjs/passport": "^8.2.1",
|
||||
"@nestjs/platform-express": "^8.0.0",
|
||||
"@nestjs/typeorm": "^8.0.3",
|
||||
"bcrypt": "^5.0.1",
|
||||
"class-transformer": "^0.5.1",
|
||||
"class-validator": "^0.13.2",
|
||||
"mysql2": "^2.3.3",
|
||||
"passport": "^0.5.2",
|
||||
"passport-jwt": "^4.0.0",
|
||||
"reflect-metadata": "^0.1.13",
|
||||
"rimraf": "^3.0.2",
|
||||
"rxjs": "^7.2.0",
|
||||
@ -1490,6 +1494,27 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@nestjs/jwt": {
|
||||
"version": "8.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@nestjs/jwt/-/jwt-8.0.0.tgz",
|
||||
"integrity": "sha512-fz2LQgYY2zmuD8S+8UE215anwKyXlnB/1FwJQLVR47clNfMeFMK8WCxmn6xdPhF5JKuV1crO6FVabb1qWzDxqQ==",
|
||||
"dependencies": {
|
||||
"@types/jsonwebtoken": "8.5.4",
|
||||
"jsonwebtoken": "8.5.1"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@nestjs/common": "^6.0.0 || ^7.0.0 || ^8.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@nestjs/passport": {
|
||||
"version": "8.2.1",
|
||||
"resolved": "https://registry.npmjs.org/@nestjs/passport/-/passport-8.2.1.tgz",
|
||||
"integrity": "sha512-HXEKMLX1x865+lsJB4srwKHBciDNAhWY1Ha+xbxYRbk7J5leGDoHJAmeqe+Wb3NDn5nkboggLV87t0q2mbYc8w==",
|
||||
"peerDependencies": {
|
||||
"@nestjs/common": "^6.0.0 || ^7.0.0 || ^8.0.0",
|
||||
"passport": "^0.4.0 || ^0.5.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@nestjs/platform-express": {
|
||||
"version": "8.4.3",
|
||||
"resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-8.4.3.tgz",
|
||||
@ -1934,6 +1959,14 @@
|
||||
"integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=",
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/@types/jsonwebtoken": {
|
||||
"version": "8.5.4",
|
||||
"resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.4.tgz",
|
||||
"integrity": "sha512-4L8msWK31oXwdtC81RmRBAULd0ShnAHjBuKT9MRQpjP0piNrZdXyTRcKY9/UIfhGeKIT4PvF5amOOUbbT/9Wpg==",
|
||||
"dependencies": {
|
||||
"@types/node": "*"
|
||||
}
|
||||
},
|
||||
"node_modules/@types/mime": {
|
||||
"version": "1.3.2",
|
||||
"resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz",
|
||||
@ -1943,8 +1976,7 @@
|
||||
"node_modules/@types/node": {
|
||||
"version": "16.11.26",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.26.tgz",
|
||||
"integrity": "sha512-GZ7bu5A6+4DtG7q9GsoHXy3ALcgeIHP4NnL0Vv2wu0uUB/yQex26v0tf6/na1mm0+bS9Uw+0DFex7aaKr2qawQ==",
|
||||
"dev": true
|
||||
"integrity": "sha512-GZ7bu5A6+4DtG7q9GsoHXy3ALcgeIHP4NnL0Vv2wu0uUB/yQex26v0tf6/na1mm0+bS9Uw+0DFex7aaKr2qawQ=="
|
||||
},
|
||||
"node_modules/@types/parse-json": {
|
||||
"version": "4.0.0",
|
||||
@ -3001,6 +3033,11 @@
|
||||
"ieee754": "^1.1.13"
|
||||
}
|
||||
},
|
||||
"node_modules/buffer-equal-constant-time": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
|
||||
"integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk="
|
||||
},
|
||||
"node_modules/buffer-from": {
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
|
||||
@ -3765,6 +3802,14 @@
|
||||
"node": ">=12"
|
||||
}
|
||||
},
|
||||
"node_modules/ecdsa-sig-formatter": {
|
||||
"version": "1.0.11",
|
||||
"resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
|
||||
"integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
|
||||
"dependencies": {
|
||||
"safe-buffer": "^5.0.1"
|
||||
}
|
||||
},
|
||||
"node_modules/ee-first": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
|
||||
@ -6407,6 +6452,54 @@
|
||||
"graceful-fs": "^4.1.6"
|
||||
}
|
||||
},
|
||||
"node_modules/jsonwebtoken": {
|
||||
"version": "8.5.1",
|
||||
"resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz",
|
||||
"integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==",
|
||||
"dependencies": {
|
||||
"jws": "^3.2.2",
|
||||
"lodash.includes": "^4.3.0",
|
||||
"lodash.isboolean": "^3.0.3",
|
||||
"lodash.isinteger": "^4.0.4",
|
||||
"lodash.isnumber": "^3.0.3",
|
||||
"lodash.isplainobject": "^4.0.6",
|
||||
"lodash.isstring": "^4.0.1",
|
||||
"lodash.once": "^4.0.0",
|
||||
"ms": "^2.1.1",
|
||||
"semver": "^5.6.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=4",
|
||||
"npm": ">=1.4.28"
|
||||
}
|
||||
},
|
||||
"node_modules/jsonwebtoken/node_modules/semver": {
|
||||
"version": "5.7.1",
|
||||
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
|
||||
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
|
||||
"bin": {
|
||||
"semver": "bin/semver"
|
||||
}
|
||||
},
|
||||
"node_modules/jwa": {
|
||||
"version": "1.4.1",
|
||||
"resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
|
||||
"integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==",
|
||||
"dependencies": {
|
||||
"buffer-equal-constant-time": "1.0.1",
|
||||
"ecdsa-sig-formatter": "1.0.11",
|
||||
"safe-buffer": "^5.0.1"
|
||||
}
|
||||
},
|
||||
"node_modules/jws": {
|
||||
"version": "3.2.2",
|
||||
"resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",
|
||||
"integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",
|
||||
"dependencies": {
|
||||
"jwa": "^1.4.1",
|
||||
"safe-buffer": "^5.0.1"
|
||||
}
|
||||
},
|
||||
"node_modules/kleur": {
|
||||
"version": "3.0.3",
|
||||
"resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
|
||||
@ -6475,6 +6568,36 @@
|
||||
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
|
||||
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
|
||||
},
|
||||
"node_modules/lodash.includes": {
|
||||
"version": "4.3.0",
|
||||
"resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
|
||||
"integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8="
|
||||
},
|
||||
"node_modules/lodash.isboolean": {
|
||||
"version": "3.0.3",
|
||||
"resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
|
||||
"integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY="
|
||||
},
|
||||
"node_modules/lodash.isinteger": {
|
||||
"version": "4.0.4",
|
||||
"resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
|
||||
"integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M="
|
||||
},
|
||||
"node_modules/lodash.isnumber": {
|
||||
"version": "3.0.3",
|
||||
"resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
|
||||
"integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w="
|
||||
},
|
||||
"node_modules/lodash.isplainobject": {
|
||||
"version": "4.0.6",
|
||||
"resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
|
||||
"integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs="
|
||||
},
|
||||
"node_modules/lodash.isstring": {
|
||||
"version": "4.0.1",
|
||||
"resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
|
||||
"integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE="
|
||||
},
|
||||
"node_modules/lodash.memoize": {
|
||||
"version": "4.1.2",
|
||||
"resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
|
||||
@ -6487,6 +6610,11 @@
|
||||
"integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/lodash.once": {
|
||||
"version": "4.1.1",
|
||||
"resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
|
||||
"integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w="
|
||||
},
|
||||
"node_modules/log-symbols": {
|
||||
"version": "4.1.0",
|
||||
"resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
|
||||
@ -7211,6 +7339,39 @@
|
||||
"node": ">= 0.8"
|
||||
}
|
||||
},
|
||||
"node_modules/passport": {
|
||||
"version": "0.5.2",
|
||||
"resolved": "https://registry.npmjs.org/passport/-/passport-0.5.2.tgz",
|
||||
"integrity": "sha512-w9n/Ot5I7orGD4y+7V3EFJCQEznE5RxHamUxcqLT2QoJY0f2JdN8GyHonYFvN0Vz+L6lUJfVhrk2aZz2LbuREw==",
|
||||
"dependencies": {
|
||||
"passport-strategy": "1.x.x",
|
||||
"pause": "0.0.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/jaredhanson"
|
||||
}
|
||||
},
|
||||
"node_modules/passport-jwt": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/passport-jwt/-/passport-jwt-4.0.0.tgz",
|
||||
"integrity": "sha512-BwC0n2GP/1hMVjR4QpnvqA61TxenUMlmfNjYNgK0ZAs0HK4SOQkHcSv4L328blNTLtHq7DbmvyNJiH+bn6C5Mg==",
|
||||
"dependencies": {
|
||||
"jsonwebtoken": "^8.2.0",
|
||||
"passport-strategy": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/passport-strategy": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz",
|
||||
"integrity": "sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ=",
|
||||
"engines": {
|
||||
"node": ">= 0.4.0"
|
||||
}
|
||||
},
|
||||
"node_modules/path-exists": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
|
||||
@ -7257,6 +7418,11 @@
|
||||
"node": ">=8"
|
||||
}
|
||||
},
|
||||
"node_modules/pause": {
|
||||
"version": "0.0.1",
|
||||
"resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz",
|
||||
"integrity": "sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10="
|
||||
},
|
||||
"node_modules/picocolors": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
|
||||
@ -10657,6 +10823,21 @@
|
||||
"uuid": "8.3.2"
|
||||
}
|
||||
},
|
||||
"@nestjs/jwt": {
|
||||
"version": "8.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@nestjs/jwt/-/jwt-8.0.0.tgz",
|
||||
"integrity": "sha512-fz2LQgYY2zmuD8S+8UE215anwKyXlnB/1FwJQLVR47clNfMeFMK8WCxmn6xdPhF5JKuV1crO6FVabb1qWzDxqQ==",
|
||||
"requires": {
|
||||
"@types/jsonwebtoken": "8.5.4",
|
||||
"jsonwebtoken": "8.5.1"
|
||||
}
|
||||
},
|
||||
"@nestjs/passport": {
|
||||
"version": "8.2.1",
|
||||
"resolved": "https://registry.npmjs.org/@nestjs/passport/-/passport-8.2.1.tgz",
|
||||
"integrity": "sha512-HXEKMLX1x865+lsJB4srwKHBciDNAhWY1Ha+xbxYRbk7J5leGDoHJAmeqe+Wb3NDn5nkboggLV87t0q2mbYc8w==",
|
||||
"requires": {}
|
||||
},
|
||||
"@nestjs/platform-express": {
|
||||
"version": "8.4.3",
|
||||
"resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-8.4.3.tgz",
|
||||
@ -11023,6 +11204,14 @@
|
||||
"integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=",
|
||||
"dev": true
|
||||
},
|
||||
"@types/jsonwebtoken": {
|
||||
"version": "8.5.4",
|
||||
"resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.4.tgz",
|
||||
"integrity": "sha512-4L8msWK31oXwdtC81RmRBAULd0ShnAHjBuKT9MRQpjP0piNrZdXyTRcKY9/UIfhGeKIT4PvF5amOOUbbT/9Wpg==",
|
||||
"requires": {
|
||||
"@types/node": "*"
|
||||
}
|
||||
},
|
||||
"@types/mime": {
|
||||
"version": "1.3.2",
|
||||
"resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz",
|
||||
@ -11032,8 +11221,7 @@
|
||||
"@types/node": {
|
||||
"version": "16.11.26",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.26.tgz",
|
||||
"integrity": "sha512-GZ7bu5A6+4DtG7q9GsoHXy3ALcgeIHP4NnL0Vv2wu0uUB/yQex26v0tf6/na1mm0+bS9Uw+0DFex7aaKr2qawQ==",
|
||||
"dev": true
|
||||
"integrity": "sha512-GZ7bu5A6+4DtG7q9GsoHXy3ALcgeIHP4NnL0Vv2wu0uUB/yQex26v0tf6/na1mm0+bS9Uw+0DFex7aaKr2qawQ=="
|
||||
},
|
||||
"@types/parse-json": {
|
||||
"version": "4.0.0",
|
||||
@ -11844,6 +12032,11 @@
|
||||
"ieee754": "^1.1.13"
|
||||
}
|
||||
},
|
||||
"buffer-equal-constant-time": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
|
||||
"integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk="
|
||||
},
|
||||
"buffer-from": {
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
|
||||
@ -12438,6 +12631,14 @@
|
||||
"resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-8.0.2.tgz",
|
||||
"integrity": "sha512-vKKAk+VOzAWOV/dPIeSYqhgC/TQY+6L6Ibkzfsr8xd1stdBsTuGu9asCOXgbYbBeS+f2Y6lqqEuw7riOA+xEUQ=="
|
||||
},
|
||||
"ecdsa-sig-formatter": {
|
||||
"version": "1.0.11",
|
||||
"resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
|
||||
"integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
|
||||
"requires": {
|
||||
"safe-buffer": "^5.0.1"
|
||||
}
|
||||
},
|
||||
"ee-first": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
|
||||
@ -14436,6 +14637,49 @@
|
||||
"universalify": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"jsonwebtoken": {
|
||||
"version": "8.5.1",
|
||||
"resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz",
|
||||
"integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==",
|
||||
"requires": {
|
||||
"jws": "^3.2.2",
|
||||
"lodash.includes": "^4.3.0",
|
||||
"lodash.isboolean": "^3.0.3",
|
||||
"lodash.isinteger": "^4.0.4",
|
||||
"lodash.isnumber": "^3.0.3",
|
||||
"lodash.isplainobject": "^4.0.6",
|
||||
"lodash.isstring": "^4.0.1",
|
||||
"lodash.once": "^4.0.0",
|
||||
"ms": "^2.1.1",
|
||||
"semver": "^5.6.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"semver": {
|
||||
"version": "5.7.1",
|
||||
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
|
||||
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
|
||||
}
|
||||
}
|
||||
},
|
||||
"jwa": {
|
||||
"version": "1.4.1",
|
||||
"resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
|
||||
"integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==",
|
||||
"requires": {
|
||||
"buffer-equal-constant-time": "1.0.1",
|
||||
"ecdsa-sig-formatter": "1.0.11",
|
||||
"safe-buffer": "^5.0.1"
|
||||
}
|
||||
},
|
||||
"jws": {
|
||||
"version": "3.2.2",
|
||||
"resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",
|
||||
"integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",
|
||||
"requires": {
|
||||
"jwa": "^1.4.1",
|
||||
"safe-buffer": "^5.0.1"
|
||||
}
|
||||
},
|
||||
"kleur": {
|
||||
"version": "3.0.3",
|
||||
"resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
|
||||
@ -14489,6 +14733,36 @@
|
||||
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
|
||||
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
|
||||
},
|
||||
"lodash.includes": {
|
||||
"version": "4.3.0",
|
||||
"resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
|
||||
"integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8="
|
||||
},
|
||||
"lodash.isboolean": {
|
||||
"version": "3.0.3",
|
||||
"resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
|
||||
"integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY="
|
||||
},
|
||||
"lodash.isinteger": {
|
||||
"version": "4.0.4",
|
||||
"resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
|
||||
"integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M="
|
||||
},
|
||||
"lodash.isnumber": {
|
||||
"version": "3.0.3",
|
||||
"resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
|
||||
"integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w="
|
||||
},
|
||||
"lodash.isplainobject": {
|
||||
"version": "4.0.6",
|
||||
"resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
|
||||
"integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs="
|
||||
},
|
||||
"lodash.isstring": {
|
||||
"version": "4.0.1",
|
||||
"resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
|
||||
"integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE="
|
||||
},
|
||||
"lodash.memoize": {
|
||||
"version": "4.1.2",
|
||||
"resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
|
||||
@ -14501,6 +14775,11 @@
|
||||
"integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
|
||||
"dev": true
|
||||
},
|
||||
"lodash.once": {
|
||||
"version": "4.1.1",
|
||||
"resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
|
||||
"integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w="
|
||||
},
|
||||
"log-symbols": {
|
||||
"version": "4.1.0",
|
||||
"resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
|
||||
@ -15063,6 +15342,29 @@
|
||||
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
|
||||
"integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
|
||||
},
|
||||
"passport": {
|
||||
"version": "0.5.2",
|
||||
"resolved": "https://registry.npmjs.org/passport/-/passport-0.5.2.tgz",
|
||||
"integrity": "sha512-w9n/Ot5I7orGD4y+7V3EFJCQEznE5RxHamUxcqLT2QoJY0f2JdN8GyHonYFvN0Vz+L6lUJfVhrk2aZz2LbuREw==",
|
||||
"requires": {
|
||||
"passport-strategy": "1.x.x",
|
||||
"pause": "0.0.1"
|
||||
}
|
||||
},
|
||||
"passport-jwt": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/passport-jwt/-/passport-jwt-4.0.0.tgz",
|
||||
"integrity": "sha512-BwC0n2GP/1hMVjR4QpnvqA61TxenUMlmfNjYNgK0ZAs0HK4SOQkHcSv4L328blNTLtHq7DbmvyNJiH+bn6C5Mg==",
|
||||
"requires": {
|
||||
"jsonwebtoken": "^8.2.0",
|
||||
"passport-strategy": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"passport-strategy": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz",
|
||||
"integrity": "sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ="
|
||||
},
|
||||
"path-exists": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
|
||||
@ -15097,6 +15399,11 @@
|
||||
"integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
|
||||
"dev": true
|
||||
},
|
||||
"pause": {
|
||||
"version": "0.0.1",
|
||||
"resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz",
|
||||
"integrity": "sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10="
|
||||
},
|
||||
"picocolors": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
|
||||
|
@ -24,12 +24,16 @@
|
||||
"@nestjs/common": "^8.0.0",
|
||||
"@nestjs/config": "^2.0.0",
|
||||
"@nestjs/core": "^8.0.0",
|
||||
"@nestjs/jwt": "^8.0.0",
|
||||
"@nestjs/passport": "^8.2.1",
|
||||
"@nestjs/platform-express": "^8.0.0",
|
||||
"@nestjs/typeorm": "^8.0.3",
|
||||
"bcrypt": "^5.0.1",
|
||||
"class-transformer": "^0.5.1",
|
||||
"class-validator": "^0.13.2",
|
||||
"mysql2": "^2.3.3",
|
||||
"passport": "^0.5.2",
|
||||
"passport-jwt": "^4.0.0",
|
||||
"reflect-metadata": "^0.1.13",
|
||||
"rimraf": "^3.0.2",
|
||||
"rxjs": "^7.2.0",
|
||||
|
@ -45,20 +45,22 @@ import { TipoCarrito } from './institucion-tipo-carrito/entity/tipo-carrito.enti
|
||||
import { TipoEntrada } from './tipo-entrada/entity/tipo-entrada.entity';
|
||||
import { TipoUsuario } from './tipo-usuario/entity/tipo-usuario.entity';
|
||||
import { Usuario } from './usuario/entity/usuario.entity';
|
||||
import { AuthModule } from './auth/auth.module';
|
||||
import { BcryptModule } from './bcrypt/bcrypt.module';
|
||||
|
||||
@Module({
|
||||
imports: [
|
||||
ConfigModule.forRoot({ isGlobal: true }),
|
||||
TypeOrmModule.forRootAsync({
|
||||
inject: [ConfigService],
|
||||
useFactory: (config: ConfigService) => {
|
||||
useFactory: (configService: ConfigService) => {
|
||||
return {
|
||||
type: 'mariadb',
|
||||
host: config.get<string>('DB_HOST'),
|
||||
database: config.get<string>('DB'),
|
||||
username: config.get<string>('DB_USER'),
|
||||
password: config.get<string>('DB_PASSWORD'),
|
||||
port: config.get<number>('DB_PORT'),
|
||||
host: configService.get<string>('DB_HOST'),
|
||||
database: configService.get<string>('DB'),
|
||||
username: configService.get<string>('DB_USER'),
|
||||
password: configService.get<string>('DB_PASSWORD'),
|
||||
port: Number(configService.get<string>('DB_PORT')),
|
||||
synchronize: true,
|
||||
entities: [
|
||||
Carrera,
|
||||
@ -88,6 +90,7 @@ import { Usuario } from './usuario/entity/usuario.entity';
|
||||
};
|
||||
},
|
||||
}),
|
||||
AuthModule,
|
||||
CarreraModule,
|
||||
CarreraProgramaModule,
|
||||
CarritoModule,
|
||||
@ -107,6 +110,7 @@ import { Usuario } from './usuario/entity/usuario.entity';
|
||||
TipoUsuarioModule,
|
||||
UsuarioModule,
|
||||
InstitucionTipoCarritoModule,
|
||||
BcryptModule,
|
||||
],
|
||||
})
|
||||
export class AppModule {}
|
||||
|
18
src/auth/auth.controller.spec.ts
Normal file
18
src/auth/auth.controller.spec.ts
Normal file
@ -0,0 +1,18 @@
|
||||
import { Test, TestingModule } from '@nestjs/testing';
|
||||
import { AuthController } from './auth.controller';
|
||||
|
||||
describe('AuthController', () => {
|
||||
let controller: AuthController;
|
||||
|
||||
beforeEach(async () => {
|
||||
const module: TestingModule = await Test.createTestingModule({
|
||||
controllers: [AuthController],
|
||||
}).compile();
|
||||
|
||||
controller = module.get<AuthController>(AuthController);
|
||||
});
|
||||
|
||||
it('should be defined', () => {
|
||||
expect(controller).toBeDefined();
|
||||
});
|
||||
});
|
24
src/auth/auth.controller.ts
Normal file
24
src/auth/auth.controller.ts
Normal file
@ -0,0 +1,24 @@
|
||||
import { Body, Controller, Post } from '@nestjs/common';
|
||||
import { AuthService } from './auth.service';
|
||||
import { AuthLoginOperadorDto } from './dto/auth-login-operador.dto';
|
||||
import { AuthLoginUsuarioDto } from './dto/auth-login-usuario.dto';
|
||||
|
||||
@Controller('auth')
|
||||
export class AuthController {
|
||||
constructor(private authService: AuthService) {}
|
||||
|
||||
@Post('login_operador')
|
||||
loginOperador(@Body() body: AuthLoginOperadorDto) {
|
||||
return this.authService.loginOperador(
|
||||
Number(body.id_institucion),
|
||||
Number(body.id_modulo),
|
||||
body.operador,
|
||||
body.password,
|
||||
);
|
||||
}
|
||||
|
||||
@Post('login_usuario')
|
||||
loginUsuario(@Body() body: AuthLoginUsuarioDto) {
|
||||
return this.authService.loginUsuario(body.usuario, body.password);
|
||||
}
|
||||
}
|
33
src/auth/auth.module.ts
Normal file
33
src/auth/auth.module.ts
Normal file
@ -0,0 +1,33 @@
|
||||
import { ConfigService } from '@nestjs/config';
|
||||
import { Module } from '@nestjs/common';
|
||||
import { JwtModule } from '@nestjs/jwt';
|
||||
import { PassportModule } from '@nestjs/passport';
|
||||
import { AuthController } from './auth.controller';
|
||||
import { AuthService } from './auth.service';
|
||||
import { BcryptModule } from '../bcrypt/bcrypt.module';
|
||||
import { JwtStrategyService } from './strategy/jwt-strategy.service';
|
||||
import { ModuloModule } from '../modulo/modulo.module';
|
||||
import { OperadorModule } from '../operador/operador.module';
|
||||
import { UsuarioModule } from '../usuario/usuario.module';
|
||||
|
||||
@Module({
|
||||
imports: [
|
||||
PassportModule.register({ defaultStrategy: 'jwt' }),
|
||||
JwtModule.registerAsync({
|
||||
inject: [ConfigService],
|
||||
useFactory: (configService: ConfigService) => {
|
||||
return {
|
||||
secret: configService.get<string>('AUTH_SECRETKEY'),
|
||||
signOptions: { expiresIn: '30s' },
|
||||
};
|
||||
},
|
||||
}),
|
||||
BcryptModule,
|
||||
ModuloModule,
|
||||
OperadorModule,
|
||||
UsuarioModule,
|
||||
],
|
||||
controllers: [AuthController],
|
||||
providers: [AuthService, JwtStrategyService],
|
||||
})
|
||||
export class AuthModule {}
|
18
src/auth/auth.service.spec.ts
Normal file
18
src/auth/auth.service.spec.ts
Normal file
@ -0,0 +1,18 @@
|
||||
import { Test, TestingModule } from '@nestjs/testing';
|
||||
import { AuthService } from './auth.service';
|
||||
|
||||
describe('AuthService', () => {
|
||||
let service: AuthService;
|
||||
|
||||
beforeEach(async () => {
|
||||
const module: TestingModule = await Test.createTestingModule({
|
||||
providers: [AuthService],
|
||||
}).compile();
|
||||
|
||||
service = module.get<AuthService>(AuthService);
|
||||
});
|
||||
|
||||
it('should be defined', () => {
|
||||
expect(service).toBeDefined();
|
||||
});
|
||||
});
|
77
src/auth/auth.service.ts
Normal file
77
src/auth/auth.service.ts
Normal file
@ -0,0 +1,77 @@
|
||||
import {
|
||||
ConflictException,
|
||||
Injectable,
|
||||
UnauthorizedException,
|
||||
} from '@nestjs/common';
|
||||
import { JwtService } from '@nestjs/jwt';
|
||||
import { BcryptService } from '../bcrypt/bcrypt.service';
|
||||
import { ModuloService } from '../modulo/modulo.service';
|
||||
import { OperadorService } from '../operador/operador.service';
|
||||
import { UsuarioService } from '../usuario/usuario.service';
|
||||
import { JwtPayload } from './dto/jwt-payload';
|
||||
|
||||
@Injectable()
|
||||
export class AuthService {
|
||||
constructor(
|
||||
private bcryptService: BcryptService,
|
||||
private jwtService: JwtService,
|
||||
private moduloService: ModuloService,
|
||||
private operadorService: OperadorService,
|
||||
private usuarioService: UsuarioService,
|
||||
) {}
|
||||
|
||||
validate() {}
|
||||
|
||||
loginUsuario(usuario: string, password: string) {
|
||||
return this.usuarioService.findByUsuario(usuario).then((usuario) => {
|
||||
if (!this.bcryptService.comparar(password, usuario.password))
|
||||
throw new UnauthorizedException(
|
||||
'Usuario y/o password incorrectos, trata de nuevo.',
|
||||
);
|
||||
|
||||
const payload: JwtPayload = {
|
||||
id_usuario: usuario.id_usuario,
|
||||
id_tipo_usuario: usuario.tipoUsuario.id_tipo_usuario,
|
||||
};
|
||||
|
||||
return { usuario, token: this.jwtService.sign(payload) };
|
||||
});
|
||||
}
|
||||
|
||||
async loginOperador(
|
||||
id_institucion: number,
|
||||
id_modulo: number,
|
||||
operador: string,
|
||||
password: string,
|
||||
) {
|
||||
const modulo = await this.moduloService.findById(id_modulo);
|
||||
|
||||
return this.operadorService
|
||||
.findByOperador(id_institucion, operador)
|
||||
.then((operador) => {
|
||||
if (!this.bcryptService.comparar(password, operador.password))
|
||||
throw new UnauthorizedException(
|
||||
'Usuario y/o password incorrectos, trata de nuevo.',
|
||||
);
|
||||
if (!operador.activo)
|
||||
throw new UnauthorizedException(
|
||||
'Esta cuenta se encuentra desactivada.',
|
||||
);
|
||||
if (
|
||||
modulo.institucion.id_institucion !=
|
||||
operador.institucion.id_institucion
|
||||
)
|
||||
throw new ConflictException(
|
||||
'El módulo seleccionado no pertenece a la misma institución al la que pertenece el operador.',
|
||||
);
|
||||
|
||||
const payload: JwtPayload = {
|
||||
id_operador: operador.id_operador,
|
||||
id_tipo_usuario: operador.tipoUsuario.id_tipo_usuario,
|
||||
id_modulo: modulo.id_modulo,
|
||||
};
|
||||
|
||||
return { operador, token: this.jwtService.sign(payload) };
|
||||
});
|
||||
}
|
||||
}
|
15
src/auth/dto/auth-login-operador.dto.ts
Normal file
15
src/auth/dto/auth-login-operador.dto.ts
Normal file
@ -0,0 +1,15 @@
|
||||
import { IsInt, IsString } from 'class-validator';
|
||||
|
||||
export class AuthLoginOperadorDto {
|
||||
@IsInt()
|
||||
id_institucion: string;
|
||||
|
||||
@IsInt()
|
||||
id_modulo: string;
|
||||
|
||||
@IsString()
|
||||
operador: string;
|
||||
|
||||
@IsString()
|
||||
password: string;
|
||||
}
|
@ -1,6 +1,6 @@
|
||||
import { IsNumberString, IsString } from 'class-validator';
|
||||
|
||||
export class UsuarioLoginDto {
|
||||
export class AuthLoginUsuarioDto {
|
||||
@IsNumberString()
|
||||
usuario: string;
|
||||
|
9
src/auth/dto/jwt-payload.ts
Normal file
9
src/auth/dto/jwt-payload.ts
Normal file
@ -0,0 +1,9 @@
|
||||
export class JwtPayload {
|
||||
id_tipo_usuario: number;
|
||||
|
||||
id_usuario?: number;
|
||||
|
||||
id_operador?: number;
|
||||
|
||||
id_modulo?: number;
|
||||
}
|
20
src/auth/strategy/jwt-strategy.service.ts
Normal file
20
src/auth/strategy/jwt-strategy.service.ts
Normal file
@ -0,0 +1,20 @@
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { ConfigService } from '@nestjs/config';
|
||||
import { PassportStrategy } from '@nestjs/passport';
|
||||
import { Strategy, ExtractJwt } from 'passport-jwt';
|
||||
import { JwtPayload } from '../dto/jwt-payload';
|
||||
|
||||
@Injectable()
|
||||
export class JwtStrategyService extends PassportStrategy(Strategy) {
|
||||
constructor(private configService: ConfigService) {
|
||||
super({
|
||||
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
|
||||
secretOrKey: configService.get<string>('AUTH_SECRETKEY'),
|
||||
});
|
||||
}
|
||||
|
||||
validate(payload: JwtPayload) {
|
||||
console.log(payload);
|
||||
return true;
|
||||
}
|
||||
}
|
8
src/bcrypt/bcrypt.module.ts
Normal file
8
src/bcrypt/bcrypt.module.ts
Normal file
@ -0,0 +1,8 @@
|
||||
import { Module } from '@nestjs/common';
|
||||
import { BcryptService } from './bcrypt.service';
|
||||
|
||||
@Module({
|
||||
providers: [BcryptService],
|
||||
exports: [BcryptService],
|
||||
})
|
||||
export class BcryptModule {}
|
18
src/bcrypt/bcrypt.service.spec.ts
Normal file
18
src/bcrypt/bcrypt.service.spec.ts
Normal file
@ -0,0 +1,18 @@
|
||||
import { Test, TestingModule } from '@nestjs/testing';
|
||||
import { BcryptService } from './bcrypt.service';
|
||||
|
||||
describe('BcryptService', () => {
|
||||
let service: BcryptService;
|
||||
|
||||
beforeEach(async () => {
|
||||
const module: TestingModule = await Test.createTestingModule({
|
||||
providers: [BcryptService],
|
||||
}).compile();
|
||||
|
||||
service = module.get<BcryptService>(BcryptService);
|
||||
});
|
||||
|
||||
it('should be defined', () => {
|
||||
expect(service).toBeDefined();
|
||||
});
|
||||
});
|
20
src/bcrypt/bcrypt.service.ts
Normal file
20
src/bcrypt/bcrypt.service.ts
Normal file
@ -0,0 +1,20 @@
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { ConfigService } from '@nestjs/config';
|
||||
import * as bcrypt from 'bcrypt';
|
||||
|
||||
@Injectable()
|
||||
export class BcryptService {
|
||||
constructor(private configService: ConfigService) {}
|
||||
|
||||
encriptar(password: string) {
|
||||
const salt = bcrypt.genSaltSync(
|
||||
Number(this.configService.get<string>('SALT_ROUNDS')),
|
||||
);
|
||||
|
||||
return bcrypt.hashSync(password, salt);
|
||||
}
|
||||
|
||||
comparar(password: string, passwordDb: string) {
|
||||
return bcrypt.compareSync(password, passwordDb);
|
||||
}
|
||||
}
|
@ -8,5 +8,6 @@ import { Carrera } from './entity/carrera.entity';
|
||||
imports: [TypeOrmModule.forFeature([Carrera])],
|
||||
controllers: [CarreraController],
|
||||
providers: [CarreraService],
|
||||
exports: [CarreraService],
|
||||
})
|
||||
export class CarreraModule {}
|
||||
|
@ -9,5 +9,6 @@ import { InstitucionModule } from '../institucion/institucion.module';
|
||||
imports: [TypeOrmModule.forFeature([Modulo]), InstitucionModule],
|
||||
controllers: [ModuloController],
|
||||
providers: [ModuloService],
|
||||
exports: [ModuloService],
|
||||
})
|
||||
export class ModuloModule {}
|
||||
|
@ -51,16 +51,21 @@ export class ModuloService {
|
||||
});
|
||||
}
|
||||
|
||||
async update(attrs: Partial<Modulo>) {
|
||||
const modulo = await this.findById(attrs.id_modulo);
|
||||
|
||||
return this.repository
|
||||
.findOne({ modulo: attrs.modulo, institucion: modulo.institucion })
|
||||
update(attrs: Partial<Modulo>) {
|
||||
return this.findById(attrs.id_modulo)
|
||||
.then(async (modulo) => {
|
||||
if (attrs.modulo)
|
||||
await this.repository
|
||||
.findOne({
|
||||
modulo: attrs.modulo,
|
||||
institucion: modulo.institucion,
|
||||
})
|
||||
.then((existeModulo) => {
|
||||
if (existeModulo)
|
||||
throw new ConflictException(
|
||||
'Ya existe un módulo con este nombre, intente con otro nombre.',
|
||||
);
|
||||
});
|
||||
Object.assign(modulo, attrs);
|
||||
return this.repository.save(modulo);
|
||||
})
|
||||
|
@ -1,9 +0,0 @@
|
||||
import { IsNumberString, IsString } from 'class-validator';
|
||||
|
||||
export class OperadorLoginDto {
|
||||
@IsNumberString()
|
||||
operador: string;
|
||||
|
||||
@IsString()
|
||||
password: string;
|
||||
}
|
@ -8,9 +8,9 @@ export class OperadorUpdateDto {
|
||||
@IsOptional()
|
||||
activo?: boolean;
|
||||
|
||||
@IsString()
|
||||
@IsOptional()
|
||||
operador?: string;
|
||||
// @IsString()
|
||||
// @IsOptional()
|
||||
// operador?: string;
|
||||
|
||||
@IsString()
|
||||
@IsOptional()
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { IsString } from 'class-validator';
|
||||
import { IsNumberString } from 'class-validator';
|
||||
|
||||
export class OperadorDto {
|
||||
@IsString()
|
||||
operador: string;
|
||||
@IsNumberString()
|
||||
id_operador: string;
|
||||
}
|
||||
|
@ -25,11 +25,15 @@ export class Operador {
|
||||
@Column({ type: String, nullable: false, length: 60 })
|
||||
password: string;
|
||||
|
||||
@ManyToOne(() => Institucion, (institucion) => institucion.operadores)
|
||||
@ManyToOne(() => Institucion, (institucion) => institucion.operadores, {
|
||||
eager: true,
|
||||
})
|
||||
@JoinColumn({ name: 'id_institucion' })
|
||||
institucion: Institucion;
|
||||
|
||||
@ManyToOne(() => TipoUsuario, (tipoUsuario) => tipoUsuario.operadores)
|
||||
@ManyToOne(() => TipoUsuario, (tipoUsuario) => tipoUsuario.operadores, {
|
||||
eager: true,
|
||||
})
|
||||
@JoinColumn({ name: 'id_tipo_usuario' })
|
||||
tipoUsuario: TipoUsuario;
|
||||
|
||||
|
@ -1,7 +1,6 @@
|
||||
import { Body, Controller, Get, Post, Put, Query } from '@nestjs/common';
|
||||
import { OperadorService } from './operador.service';
|
||||
import { OperadorCreateDto } from './dto/operador-create.dto';
|
||||
import { OperadorLoginDto } from './dto/operador-login.dto';
|
||||
import { OperadorOperadoresDto } from './dto/operador-operadores.dto';
|
||||
import { OperadorUpdateDto } from './dto/operador-update.dto';
|
||||
import { OperadorDto } from './dto/operador.dto';
|
||||
@ -18,14 +17,9 @@ export class OperadorController {
|
||||
);
|
||||
}
|
||||
|
||||
@Post('login')
|
||||
login(@Body() body: OperadorLoginDto) {
|
||||
return this.operadorService.login(body.operador, body.password);
|
||||
}
|
||||
|
||||
@Get('operador')
|
||||
operador(@Query() query: OperadorDto) {
|
||||
return this.operadorService.findByOperador(query.operador);
|
||||
return this.operadorService.findById(Number(query.id_operador));
|
||||
}
|
||||
|
||||
@Get('operadores')
|
||||
|
@ -3,16 +3,19 @@ import { TypeOrmModule } from '@nestjs/typeorm';
|
||||
import { OperadorController } from './operador.controller';
|
||||
import { OperadorService } from './operador.service';
|
||||
import { Operador } from './entity/operador.entity';
|
||||
import { InstitucionModule } from 'src/institucion/institucion.module';
|
||||
import { TipoUsuarioModule } from 'src/tipo-usuario/tipo-usuario.module';
|
||||
import { BcryptModule } from '../bcrypt/bcrypt.module';
|
||||
import { InstitucionModule } from '../institucion/institucion.module';
|
||||
import { TipoUsuarioModule } from '../tipo-usuario/tipo-usuario.module';
|
||||
|
||||
@Module({
|
||||
imports: [
|
||||
TypeOrmModule.forFeature([Operador]),
|
||||
BcryptModule,
|
||||
InstitucionModule,
|
||||
TipoUsuarioModule,
|
||||
],
|
||||
controllers: [OperadorController],
|
||||
providers: [OperadorService],
|
||||
exports: [OperadorService],
|
||||
})
|
||||
export class OperadorModule {}
|
||||
|
@ -2,11 +2,12 @@ import {
|
||||
ConflictException,
|
||||
Injectable,
|
||||
NotFoundException,
|
||||
UnauthorizedException,
|
||||
} from '@nestjs/common';
|
||||
import { InjectRepository } from '@nestjs/typeorm';
|
||||
import { Repository } from 'typeorm';
|
||||
import { Operador } from './entity/operador.entity';
|
||||
import { Institucion } from '../institucion/entity/institucion.entity';
|
||||
import { BcryptService } from 'src/bcrypt/bcrypt.service';
|
||||
import { InstitucionService } from 'src/institucion/institucion.service';
|
||||
import { TipoUsuarioService } from 'src/tipo-usuario/tipo-usuario.service';
|
||||
|
||||
@ -14,22 +15,23 @@ import { TipoUsuarioService } from 'src/tipo-usuario/tipo-usuario.service';
|
||||
export class OperadorService {
|
||||
constructor(
|
||||
@InjectRepository(Operador) private repository: Repository<Operador>,
|
||||
private isnstitucionService: InstitucionService,
|
||||
private bcryptService: BcryptService,
|
||||
private institucionService: InstitucionService,
|
||||
private tipoUsuarioService: TipoUsuarioService,
|
||||
) {}
|
||||
|
||||
async create(id_institucion: number, operador: string, password: string) {
|
||||
const institucion = await this.isnstitucionService.findById(id_institucion);
|
||||
const institucion = await this.institucionService.findById(id_institucion);
|
||||
const tipoUsuario = await this.tipoUsuarioService.findById(4);
|
||||
|
||||
return this.repository
|
||||
.findOne({ operador, institucion })
|
||||
.then((existeOperador) => {
|
||||
.then(async (existeOperador) => {
|
||||
if (existeOperador)
|
||||
throw new ConflictException(
|
||||
'Ya existe un operador con ese nombre, intente de nuevo.',
|
||||
);
|
||||
/* Encriptar password */
|
||||
password = this.bcryptService.encriptar(password);
|
||||
return this.repository.save(
|
||||
this.repository.create({
|
||||
institucion,
|
||||
@ -47,13 +49,15 @@ export class OperadorService {
|
||||
id_institucion?: string;
|
||||
operador?: string;
|
||||
}) {
|
||||
const busqueda: any = {};
|
||||
const busqueda: { operador?: string; institucion?: Institucion } = {};
|
||||
const institucion = filtros.id_institucion
|
||||
? await this.isnstitucionService.findById(Number(filtros.id_institucion))
|
||||
? await this.institucionService.findById(Number(filtros.id_institucion))
|
||||
: null;
|
||||
|
||||
/* buscar like */
|
||||
if (filtros.operador) busqueda.operador = filtros.operador;
|
||||
if (filtros.id_institucion) busqueda.institucion = institucion;
|
||||
if (institucion) busqueda.institucion = institucion;
|
||||
/* falta página */
|
||||
return this.repository.find(busqueda);
|
||||
}
|
||||
|
||||
@ -64,26 +68,21 @@ export class OperadorService {
|
||||
});
|
||||
}
|
||||
|
||||
findByOperador(operador: string) {
|
||||
return this.repository.findOne({ operador }).then((operador) => {
|
||||
if (!operador) throw new NotFoundException('No existe este operador');
|
||||
findByOperador(id_institucion: number, operador: string) {
|
||||
return this.institucionService
|
||||
.findById(id_institucion)
|
||||
.then((institucion) => this.repository.findOne({ institucion, operador }))
|
||||
.then((operador) => {
|
||||
if (!operador) throw new NotFoundException('No existe este operador.');
|
||||
return operador;
|
||||
});
|
||||
}
|
||||
|
||||
login(operador: string, password: string) {
|
||||
return this.findByOperador(operador).then((operador) => {
|
||||
if (operador.password !== password)
|
||||
throw new UnauthorizedException('Contraseña incorrecta.');
|
||||
/* Crear JWT y regresarlo */
|
||||
return operador;
|
||||
});
|
||||
}
|
||||
|
||||
async update(attrs: Partial<Operador>) {
|
||||
update(attrs: Partial<Operador>) {
|
||||
return this.findById(attrs.id_operador)
|
||||
.then((operador) => {
|
||||
/* encriptar password */
|
||||
if (attrs.password)
|
||||
attrs.password = this.bcryptService.encriptar(attrs.password);
|
||||
Object.assign(operador, attrs);
|
||||
return this.repository.save(operador);
|
||||
})
|
||||
|
@ -2,5 +2,5 @@ import { IsNumberString } from 'class-validator';
|
||||
|
||||
export class UsuarioDto {
|
||||
@IsNumberString()
|
||||
usuario: string;
|
||||
id_usuario: string;
|
||||
}
|
||||
|
@ -22,10 +22,10 @@ export class Usuario {
|
||||
@Column({ type: Boolean, nullable: false, default: false })
|
||||
multa: boolean;
|
||||
|
||||
@Column({ type: String, nullable: false, length: 60 })
|
||||
@Column({ type: String, nullable: true, length: 60 })
|
||||
password: string;
|
||||
|
||||
@Column({ type: String, nullable: false, length: 10 })
|
||||
@Column({ type: String, nullable: true, length: 10 })
|
||||
telefono: string;
|
||||
|
||||
@Column({ type: String, nullable: false, length: 10 })
|
||||
@ -39,7 +39,9 @@ export class Usuario {
|
||||
@JoinColumn({ name: 'id_institucion' })
|
||||
institucion: Institucion;
|
||||
|
||||
@ManyToOne(() => TipoUsuario, (tipoUsuario) => tipoUsuario.usuarios)
|
||||
@ManyToOne(() => TipoUsuario, (tipoUsuario) => tipoUsuario.usuarios, {
|
||||
eager: true,
|
||||
})
|
||||
@JoinColumn({ name: 'id_tipo_usuario' })
|
||||
tipoUsuario: TipoUsuario;
|
||||
|
||||
|
@ -1,11 +1,19 @@
|
||||
import { Body, Controller, Get, Post, Put, Query } from '@nestjs/common';
|
||||
import {
|
||||
Body,
|
||||
Controller,
|
||||
Get,
|
||||
Post,
|
||||
Put,
|
||||
Query,
|
||||
UseGuards,
|
||||
} from '@nestjs/common';
|
||||
import { UsuarioService } from './usuario.service';
|
||||
import { UsuarioEscolaresDto } from './dto/usuario-escolares.dto';
|
||||
import { UsuarioLoginDto } from './dto/usuario-login.dto';
|
||||
import { UsuarioRegistrarDto } from './dto/usuario-registrar.dto';
|
||||
import { UsuarioUpdateDto } from './dto/usuario-update.dto';
|
||||
import { UsuarioUsuariosDto } from './dto/usuario-usuarios.dto';
|
||||
import { UsuarioDto } from './dto/usuario.dto';
|
||||
import { AuthGuard } from '@nestjs/passport';
|
||||
|
||||
@Controller('usuario')
|
||||
export class UsuarioController {
|
||||
@ -15,27 +23,25 @@ export class UsuarioController {
|
||||
@Get('escolares')
|
||||
escolares(@Query() query: UsuarioEscolaresDto) {}
|
||||
|
||||
@Post('login')
|
||||
login(@Body() body: UsuarioLoginDto) {
|
||||
return this.usuarioService.login(body.usuario, body.password);
|
||||
}
|
||||
|
||||
@Post('registrar')
|
||||
registrar(@Body() body: UsuarioRegistrarDto) {
|
||||
return this.usuarioService.registrar(body.id_usuario, body.telefono);
|
||||
}
|
||||
|
||||
@Put()
|
||||
@UseGuards(AuthGuard('jwt'))
|
||||
update(@Body() body: UsuarioUpdateDto) {
|
||||
return this.usuarioService.update(body);
|
||||
}
|
||||
|
||||
@Get('usuario')
|
||||
@UseGuards(AuthGuard('jwt'))
|
||||
usuario(@Query() query: UsuarioDto) {
|
||||
return this.usuarioService.findByUsuario(query.usuario);
|
||||
return this.usuarioService.findById(Number(query.id_usuario));
|
||||
}
|
||||
|
||||
@Get('usuarios')
|
||||
@UseGuards(AuthGuard('jwt'))
|
||||
usuarios(@Query() query: UsuarioUsuariosDto) {
|
||||
return this.usuarioService.findAll(query);
|
||||
}
|
||||
|
@ -1,18 +1,25 @@
|
||||
import { Module } from '@nestjs/common';
|
||||
import { PassportModule } from '@nestjs/passport';
|
||||
import { TypeOrmModule } from '@nestjs/typeorm';
|
||||
import { UsuarioController } from './usuario.controller';
|
||||
import { UsuarioService } from './usuario.service';
|
||||
import { Usuario } from './entity/usuario.entity';
|
||||
import { BcryptModule } from '../bcrypt/bcrypt.module';
|
||||
// import { CarreraModule } from '../carrera/carrera.module';
|
||||
import { InstitucionModule } from '../institucion/institucion.module';
|
||||
import { TipoUsuarioModule } from '../tipo-usuario/tipo-usuario.module';
|
||||
|
||||
@Module({
|
||||
imports: [
|
||||
PassportModule.register({ defaultStrategy: 'jwt' }),
|
||||
TypeOrmModule.forFeature([Usuario]),
|
||||
BcryptModule,
|
||||
// CarreraModule,
|
||||
InstitucionModule,
|
||||
TipoUsuarioModule,
|
||||
],
|
||||
controllers: [UsuarioController],
|
||||
providers: [UsuarioService],
|
||||
exports: [UsuarioService],
|
||||
})
|
||||
export class UsuarioModule {}
|
||||
|
@ -1,11 +1,16 @@
|
||||
import {
|
||||
ConflictException,
|
||||
Injectable,
|
||||
NotFoundException,
|
||||
UnauthorizedException,
|
||||
} from '@nestjs/common';
|
||||
import { InjectRepository } from '@nestjs/typeorm';
|
||||
import { Repository } from 'typeorm';
|
||||
import { Usuario } from './entity/usuario.entity';
|
||||
import { Carrera } from '../carrera/entity/carrera.entity';
|
||||
import { Institucion } from '../institucion/entity/institucion.entity';
|
||||
import { TipoUsuario } from '../tipo-usuario/entity/tipo-usuario.entity';
|
||||
import { BcryptService } from '../bcrypt/bcrypt.service';
|
||||
// import { CarreraService } from '../carrera/carrera.service';
|
||||
import { InstitucionService } from '../institucion/institucion.service';
|
||||
import { TipoUsuarioService } from '../tipo-usuario/tipo-usuario.service';
|
||||
|
||||
@ -13,6 +18,8 @@ import { TipoUsuarioService } from '../tipo-usuario/tipo-usuario.service';
|
||||
export class UsuarioService {
|
||||
constructor(
|
||||
@InjectRepository(Usuario) private repository: Repository<Usuario>,
|
||||
private bcryptService: BcryptService,
|
||||
// private carreraService: CarreraService,
|
||||
private institucionService: InstitucionService,
|
||||
private tipoUsuarioService: TipoUsuarioService,
|
||||
) {}
|
||||
@ -24,14 +31,31 @@ export class UsuarioService {
|
||||
id_tipo_usuario?: string;
|
||||
usuario?: string;
|
||||
}) {
|
||||
const busqueda: {
|
||||
carrera?: Carrera;
|
||||
institucion?: Institucion;
|
||||
tipoUsuario?: TipoUsuario;
|
||||
usuario?: string;
|
||||
} = {};
|
||||
const institucion = filtros.id_institucion
|
||||
? this.institucionService.findById(Number(filtros.id_institucion))
|
||||
? await this.institucionService.findById(Number(filtros.id_institucion))
|
||||
: null;
|
||||
const tipoUsuario = filtros.id_tipo_usuario
|
||||
? this.tipoUsuarioService.findById(Number(filtros.id_tipo_usuario))
|
||||
? await this.tipoUsuarioService.findById(Number(filtros.id_tipo_usuario))
|
||||
: null;
|
||||
const updtae = {};
|
||||
/* Terminar cuando se tengan las fuinciones faltantes */
|
||||
// const carrera = filtros.id_carrera
|
||||
// ? await this.carreraService.findById(Number(filtros.id_carrera))
|
||||
// : null;
|
||||
|
||||
/* buscar like */
|
||||
if (filtros.usuario) busqueda.usuario = filtros.usuario;
|
||||
if (institucion) busqueda.institucion = institucion;
|
||||
if (tipoUsuario) busqueda.tipoUsuario = tipoUsuario;
|
||||
// if (carrera) busqueda.carrera = carrera;
|
||||
/* falta página */
|
||||
console.log(busqueda);
|
||||
return this.repository.find(busqueda);
|
||||
}
|
||||
|
||||
findById(id_usuario: number) {
|
||||
@ -48,30 +72,56 @@ export class UsuarioService {
|
||||
});
|
||||
}
|
||||
|
||||
login(usuario: string, password: string) {
|
||||
return this.findByUsuario(usuario).then((usuario) => {
|
||||
if (password !== usuario.password)
|
||||
throw new UnauthorizedException('Contraseña incorrecta.');
|
||||
/* Crear JWT y regresarlo */
|
||||
return usuario;
|
||||
});
|
||||
generarPassword = () => {
|
||||
const length = 8;
|
||||
const charset =
|
||||
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
|
||||
const n = charset.length;
|
||||
let password = '';
|
||||
|
||||
for (let i = 0; i < length; i++)
|
||||
password += charset.charAt(Math.floor(Math.random() * n));
|
||||
return password;
|
||||
};
|
||||
|
||||
passwordReset(id_usuario: number) {
|
||||
const password = this.generarPassword();
|
||||
|
||||
return this.findById(id_usuario)
|
||||
.then((usuario) => {
|
||||
if (!usuario.password)
|
||||
throw new ConflictException('No existe este usuario.');
|
||||
usuario.password = this.bcryptService.encriptar(password);
|
||||
/* Mandar correo con contraseña */
|
||||
return this.repository.save(usuario);
|
||||
})
|
||||
.then((_) => ({
|
||||
message: 'Se reseteo correctamente la constraseña del usuario.',
|
||||
}));
|
||||
}
|
||||
|
||||
registrar(id_usuario: number, telefono: string) {
|
||||
const password = this.generarPassword();
|
||||
|
||||
return this.findById(id_usuario)
|
||||
.then((usuario) => {
|
||||
if (usuario.password)
|
||||
throw new ConflictException(
|
||||
'Ya fue registrado este número de cuenta.',
|
||||
);
|
||||
usuario.telefono = telefono;
|
||||
/* crear contraseña, encriptarla y mandarla por correo */
|
||||
usuario.password = 'hola';
|
||||
usuario.password = this.bcryptService.encriptar(password);
|
||||
/* Mandar correo con contraseña */
|
||||
return this.repository.save(usuario);
|
||||
})
|
||||
.then((_) => ({ message: 'Se creo correctamente un usuario.' }));
|
||||
}
|
||||
|
||||
async update(attrs: Partial<Usuario>) {
|
||||
update(attrs: Partial<Usuario>) {
|
||||
return this.findById(attrs.id_usuario)
|
||||
.then((usuario) => {
|
||||
/* crear y encriptar password en caso de cambio de password */
|
||||
if (!usuario.password)
|
||||
throw new ConflictException('No existe este usuario.');
|
||||
Object.assign(usuario, attrs);
|
||||
return this.repository.save(usuario);
|
||||
})
|
||||
|
Loading…
Reference in New Issue
Block a user