Add registration endpoint with validation and attempt to add JWT authentication
This commit is contained in:
parent
aa6f3f51de
commit
ee2d7b4838
5 changed files with 421 additions and 37 deletions
306
backend/package-lock.json
generated
306
backend/package-lock.json
generated
|
@ -8,6 +8,8 @@
|
||||||
"name": "szakdolgozat-backend",
|
"name": "szakdolgozat-backend",
|
||||||
"version": "0.0.1",
|
"version": "0.0.1",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@loopback/authentication": "^7.3.4",
|
||||||
|
"@loopback/authentication-jwt": "^0.9.4",
|
||||||
"@loopback/boot": "^3.4.4",
|
"@loopback/boot": "^3.4.4",
|
||||||
"@loopback/core": "^2.18.0",
|
"@loopback/core": "^2.18.0",
|
||||||
"@loopback/repository": "^3.7.3",
|
"@loopback/repository": "^3.7.3",
|
||||||
|
@ -644,6 +646,45 @@
|
||||||
"node": ">=8"
|
"node": ">=8"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@loopback/authentication": {
|
||||||
|
"version": "7.3.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/@loopback/authentication/-/authentication-7.3.4.tgz",
|
||||||
|
"integrity": "sha512-Ck6ggwiIkTI9Vu3YjQhKHCueuSE/NWYq3ILWF5ToloPDEITaHK5Tr8q/DM3mqM2gASz3OQeTQ28zbGrq5mMzbQ==",
|
||||||
|
"dependencies": {
|
||||||
|
"@loopback/security": "^0.5.4",
|
||||||
|
"@types/express": "^4.17.13",
|
||||||
|
"@types/lodash": "^4.14.175",
|
||||||
|
"lodash": "^4.17.21",
|
||||||
|
"tslib": "^2.3.1"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": "^10.16 || 12 || 14 || 16"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"@loopback/core": "^2.18.0",
|
||||||
|
"@loopback/rest": "^10.1.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@loopback/authentication-jwt": {
|
||||||
|
"version": "0.9.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/@loopback/authentication-jwt/-/authentication-jwt-0.9.4.tgz",
|
||||||
|
"integrity": "sha512-rjunIpqGbjY983k6NcP+K2SB1RZZoLMGbR9xqG3oAVLkWN4ss9Vhb+nylDJEtGzLT1Bvi4cJyeuaZgbZhviZ9g==",
|
||||||
|
"dependencies": {
|
||||||
|
"@loopback/security": "^0.5.4",
|
||||||
|
"@types/bcryptjs": "2.4.2",
|
||||||
|
"bcryptjs": "^2.4.3",
|
||||||
|
"debug": "^4.3.2",
|
||||||
|
"jsonwebtoken": "^8.5.1"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": "^10.16 || 12 || 14 || 16"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"@loopback/authentication": "^7.3.4",
|
||||||
|
"@loopback/core": "^2.18.0",
|
||||||
|
"@loopback/rest": "^10.1.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@loopback/boot": {
|
"node_modules/@loopback/boot": {
|
||||||
"version": "3.4.4",
|
"version": "3.4.4",
|
||||||
"resolved": "https://registry.npmjs.org/@loopback/boot/-/boot-3.4.4.tgz",
|
"resolved": "https://registry.npmjs.org/@loopback/boot/-/boot-3.4.4.tgz",
|
||||||
|
@ -944,6 +985,21 @@
|
||||||
"@loopback/rest": "^10.1.0"
|
"@loopback/rest": "^10.1.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@loopback/security": {
|
||||||
|
"version": "0.5.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/@loopback/security/-/security-0.5.4.tgz",
|
||||||
|
"integrity": "sha512-9pgs790AtKCQPTNa+FYQZqHZpuF22XZKTPzK9C/WmUoClF5BGvjPbXwJVOMJPYmgjZIeB0dONWiq+QlIvdcSOw==",
|
||||||
|
"dependencies": {
|
||||||
|
"debug": "^4.3.2",
|
||||||
|
"tslib": "^2.3.1"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": "^10.16 || 12 || 14 || 16"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"@loopback/core": "^2.18.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@loopback/service-proxy": {
|
"node_modules/@loopback/service-proxy": {
|
||||||
"version": "3.2.4",
|
"version": "3.2.4",
|
||||||
"resolved": "https://registry.npmjs.org/@loopback/service-proxy/-/service-proxy-3.2.4.tgz",
|
"resolved": "https://registry.npmjs.org/@loopback/service-proxy/-/service-proxy-3.2.4.tgz",
|
||||||
|
@ -1061,6 +1117,11 @@
|
||||||
"integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==",
|
"integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"node_modules/@types/bcryptjs": {
|
||||||
|
"version": "2.4.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/bcryptjs/-/bcryptjs-2.4.2.tgz",
|
||||||
|
"integrity": "sha512-LiMQ6EOPob/4yUL66SZzu6Yh77cbzJFYll+ZfaPiPPFswtIlA/Fs1MzdKYA7JApHU49zQTbJGX3PDmCpIdDBRQ=="
|
||||||
|
},
|
||||||
"node_modules/@types/body-parser": {
|
"node_modules/@types/body-parser": {
|
||||||
"version": "1.19.1",
|
"version": "1.19.1",
|
||||||
"resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.1.tgz",
|
"resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.1.tgz",
|
||||||
|
@ -1166,6 +1227,11 @@
|
||||||
"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz",
|
"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz",
|
||||||
"integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ=="
|
"integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ=="
|
||||||
},
|
},
|
||||||
|
"node_modules/@types/lodash": {
|
||||||
|
"version": "4.14.177",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.177.tgz",
|
||||||
|
"integrity": "sha512-0fDwydE2clKe9MNfvXHBHF9WEahRuj+msTuQqOmAApNORFvhMYZKNGGJdCzuhheVjMps/ti0Ak/iJPACMaevvw=="
|
||||||
|
},
|
||||||
"node_modules/@types/mime": {
|
"node_modules/@types/mime": {
|
||||||
"version": "1.3.2",
|
"version": "1.3.2",
|
||||||
"resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz",
|
"resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz",
|
||||||
|
@ -1663,6 +1729,11 @@
|
||||||
"node": ">=0.10"
|
"node": ">=0.10"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/bcryptjs": {
|
||||||
|
"version": "2.4.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz",
|
||||||
|
"integrity": "sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms="
|
||||||
|
},
|
||||||
"node_modules/bignumber.js": {
|
"node_modules/bignumber.js": {
|
||||||
"version": "9.0.0",
|
"version": "9.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz",
|
||||||
|
@ -1813,6 +1884,11 @@
|
||||||
"url": "https://opencollective.com/browserslist"
|
"url": "https://opencollective.com/browserslist"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"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": {
|
"node_modules/buffer-from": {
|
||||||
"version": "1.1.2",
|
"version": "1.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
|
||||||
|
@ -2260,6 +2336,14 @@
|
||||||
"integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==",
|
"integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"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": {
|
"node_modules/ee-first": {
|
||||||
"version": "1.1.1",
|
"version": "1.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
|
||||||
|
@ -3925,12 +4009,60 @@
|
||||||
"graceful-fs": "^4.1.6"
|
"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/just-extend": {
|
"node_modules/just-extend": {
|
||||||
"version": "4.2.1",
|
"version": "4.2.1",
|
||||||
"resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz",
|
"resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz",
|
||||||
"integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==",
|
"integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"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/lcid": {
|
"node_modules/lcid": {
|
||||||
"version": "3.1.1",
|
"version": "3.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/lcid/-/lcid-3.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/lcid/-/lcid-3.1.1.tgz",
|
||||||
|
@ -3987,12 +4119,47 @@
|
||||||
"integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=",
|
"integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"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.merge": {
|
"node_modules/lodash.merge": {
|
||||||
"version": "4.6.2",
|
"version": "4.6.2",
|
||||||
"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
|
"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
|
||||||
"integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
|
"integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
|
||||||
"dev": true
|
"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/lodash.truncate": {
|
"node_modules/lodash.truncate": {
|
||||||
"version": "4.4.2",
|
"version": "4.4.2",
|
||||||
"resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
|
"resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
|
||||||
|
@ -7348,6 +7515,30 @@
|
||||||
"integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==",
|
"integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"@loopback/authentication": {
|
||||||
|
"version": "7.3.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/@loopback/authentication/-/authentication-7.3.4.tgz",
|
||||||
|
"integrity": "sha512-Ck6ggwiIkTI9Vu3YjQhKHCueuSE/NWYq3ILWF5ToloPDEITaHK5Tr8q/DM3mqM2gASz3OQeTQ28zbGrq5mMzbQ==",
|
||||||
|
"requires": {
|
||||||
|
"@loopback/security": "^0.5.4",
|
||||||
|
"@types/express": "^4.17.13",
|
||||||
|
"@types/lodash": "^4.14.175",
|
||||||
|
"lodash": "^4.17.21",
|
||||||
|
"tslib": "^2.3.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"@loopback/authentication-jwt": {
|
||||||
|
"version": "0.9.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/@loopback/authentication-jwt/-/authentication-jwt-0.9.4.tgz",
|
||||||
|
"integrity": "sha512-rjunIpqGbjY983k6NcP+K2SB1RZZoLMGbR9xqG3oAVLkWN4ss9Vhb+nylDJEtGzLT1Bvi4cJyeuaZgbZhviZ9g==",
|
||||||
|
"requires": {
|
||||||
|
"@loopback/security": "^0.5.4",
|
||||||
|
"@types/bcryptjs": "2.4.2",
|
||||||
|
"bcryptjs": "^2.4.3",
|
||||||
|
"debug": "^4.3.2",
|
||||||
|
"jsonwebtoken": "^8.5.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
"@loopback/boot": {
|
"@loopback/boot": {
|
||||||
"version": "3.4.4",
|
"version": "3.4.4",
|
||||||
"resolved": "https://registry.npmjs.org/@loopback/boot/-/boot-3.4.4.tgz",
|
"resolved": "https://registry.npmjs.org/@loopback/boot/-/boot-3.4.4.tgz",
|
||||||
|
@ -7564,6 +7755,15 @@
|
||||||
"tslib": "^2.3.1"
|
"tslib": "^2.3.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"@loopback/security": {
|
||||||
|
"version": "0.5.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/@loopback/security/-/security-0.5.4.tgz",
|
||||||
|
"integrity": "sha512-9pgs790AtKCQPTNa+FYQZqHZpuF22XZKTPzK9C/WmUoClF5BGvjPbXwJVOMJPYmgjZIeB0dONWiq+QlIvdcSOw==",
|
||||||
|
"requires": {
|
||||||
|
"debug": "^4.3.2",
|
||||||
|
"tslib": "^2.3.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
"@loopback/service-proxy": {
|
"@loopback/service-proxy": {
|
||||||
"version": "3.2.4",
|
"version": "3.2.4",
|
||||||
"resolved": "https://registry.npmjs.org/@loopback/service-proxy/-/service-proxy-3.2.4.tgz",
|
"resolved": "https://registry.npmjs.org/@loopback/service-proxy/-/service-proxy-3.2.4.tgz",
|
||||||
|
@ -7663,6 +7863,11 @@
|
||||||
"integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==",
|
"integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"@types/bcryptjs": {
|
||||||
|
"version": "2.4.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/bcryptjs/-/bcryptjs-2.4.2.tgz",
|
||||||
|
"integrity": "sha512-LiMQ6EOPob/4yUL66SZzu6Yh77cbzJFYll+ZfaPiPPFswtIlA/Fs1MzdKYA7JApHU49zQTbJGX3PDmCpIdDBRQ=="
|
||||||
|
},
|
||||||
"@types/body-parser": {
|
"@types/body-parser": {
|
||||||
"version": "1.19.1",
|
"version": "1.19.1",
|
||||||
"resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.1.tgz",
|
"resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.1.tgz",
|
||||||
|
@ -7776,6 +7981,11 @@
|
||||||
"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz",
|
"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz",
|
||||||
"integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ=="
|
"integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ=="
|
||||||
},
|
},
|
||||||
|
"@types/lodash": {
|
||||||
|
"version": "4.14.177",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.177.tgz",
|
||||||
|
"integrity": "sha512-0fDwydE2clKe9MNfvXHBHF9WEahRuj+msTuQqOmAApNORFvhMYZKNGGJdCzuhheVjMps/ti0Ak/iJPACMaevvw=="
|
||||||
|
},
|
||||||
"@types/mime": {
|
"@types/mime": {
|
||||||
"version": "1.3.2",
|
"version": "1.3.2",
|
||||||
"resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz",
|
"resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz",
|
||||||
|
@ -8150,6 +8360,11 @@
|
||||||
"resolved": "https://registry.npmjs.org/bcp47/-/bcp47-1.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/bcp47/-/bcp47-1.1.2.tgz",
|
||||||
"integrity": "sha1-NUvjMH/9CEM6ePXh4glYRfifx/4="
|
"integrity": "sha1-NUvjMH/9CEM6ePXh4glYRfifx/4="
|
||||||
},
|
},
|
||||||
|
"bcryptjs": {
|
||||||
|
"version": "2.4.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz",
|
||||||
|
"integrity": "sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms="
|
||||||
|
},
|
||||||
"bignumber.js": {
|
"bignumber.js": {
|
||||||
"version": "9.0.0",
|
"version": "9.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz",
|
||||||
|
@ -8271,6 +8486,11 @@
|
||||||
"picocolors": "^1.0.0"
|
"picocolors": "^1.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"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": {
|
"buffer-from": {
|
||||||
"version": "1.1.2",
|
"version": "1.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
|
||||||
|
@ -8633,6 +8853,14 @@
|
||||||
"integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==",
|
"integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"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": {
|
"ee-first": {
|
||||||
"version": "1.1.1",
|
"version": "1.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
|
||||||
|
@ -9896,12 +10124,55 @@
|
||||||
"universalify": "^2.0.0"
|
"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=="
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"just-extend": {
|
"just-extend": {
|
||||||
"version": "4.2.1",
|
"version": "4.2.1",
|
||||||
"resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz",
|
"resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz",
|
||||||
"integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==",
|
"integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"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"
|
||||||
|
}
|
||||||
|
},
|
||||||
"lcid": {
|
"lcid": {
|
||||||
"version": "3.1.1",
|
"version": "3.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/lcid/-/lcid-3.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/lcid/-/lcid-3.1.1.tgz",
|
||||||
|
@ -9946,12 +10217,47 @@
|
||||||
"integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=",
|
"integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"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.merge": {
|
"lodash.merge": {
|
||||||
"version": "4.6.2",
|
"version": "4.6.2",
|
||||||
"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
|
"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
|
||||||
"integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
|
"integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
|
||||||
"dev": true
|
"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="
|
||||||
|
},
|
||||||
"lodash.truncate": {
|
"lodash.truncate": {
|
||||||
"version": "4.4.2",
|
"version": "4.4.2",
|
||||||
"resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
|
"resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
|
||||||
|
|
|
@ -41,7 +41,7 @@
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": ""
|
"url": ""
|
||||||
},
|
},
|
||||||
"author": "NorbiPeti <szatmari.norbert.peter@gmail.com>",
|
"author": "Szatmári Norbert Péter <Szatmari.Norbert.Peter@gstud.u-szeged.hu>",
|
||||||
"license": "",
|
"license": "",
|
||||||
"files": [
|
"files": [
|
||||||
"README.md",
|
"README.md",
|
||||||
|
@ -50,6 +50,8 @@
|
||||||
"!*/__tests__"
|
"!*/__tests__"
|
||||||
],
|
],
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@loopback/authentication": "^7.3.4",
|
||||||
|
"@loopback/authentication-jwt": "^0.9.4",
|
||||||
"@loopback/boot": "^3.4.4",
|
"@loopback/boot": "^3.4.4",
|
||||||
"@loopback/core": "^2.18.0",
|
"@loopback/core": "^2.18.0",
|
||||||
"@loopback/repository": "^3.7.3",
|
"@loopback/repository": "^3.7.3",
|
||||||
|
|
|
@ -9,6 +9,9 @@ import {RestApplication} from '@loopback/rest';
|
||||||
import {ServiceMixin} from '@loopback/service-proxy';
|
import {ServiceMixin} from '@loopback/service-proxy';
|
||||||
import path from 'path';
|
import path from 'path';
|
||||||
import {MySequence} from './sequence';
|
import {MySequence} from './sequence';
|
||||||
|
import {AuthenticationComponent} from '@loopback/authentication';
|
||||||
|
import {JWTAuthenticationComponent, UserServiceBindings} from '@loopback/authentication-jwt';
|
||||||
|
import {DatabaseDataSource} from './datasources';
|
||||||
|
|
||||||
export {ApplicationConfig};
|
export {ApplicationConfig};
|
||||||
|
|
||||||
|
@ -30,6 +33,11 @@ export class SzakdolgozatBackendApplication extends BootMixin(
|
||||||
});
|
});
|
||||||
this.component(RestExplorerComponent);
|
this.component(RestExplorerComponent);
|
||||||
|
|
||||||
|
// Authentication
|
||||||
|
this.component(AuthenticationComponent);
|
||||||
|
this.component(JWTAuthenticationComponent);
|
||||||
|
this.dataSource(DatabaseDataSource, UserServiceBindings.DATASOURCE_NAME)
|
||||||
|
|
||||||
this.projectRoot = __dirname;
|
this.projectRoot = __dirname;
|
||||||
// Customize @loopback/boot Booter Conventions here
|
// Customize @loopback/boot Booter Conventions here
|
||||||
this.bootOptions = {
|
this.bootOptions = {
|
||||||
|
|
|
@ -1,50 +1,107 @@
|
||||||
import {
|
import {Count, CountSchema, Filter, FilterExcludingWhere, MODEL_PROPERTIES_KEY, repository, Where,} from '@loopback/repository';
|
||||||
Count,
|
import {del, get, getModelSchemaRef, param, patch, post, put, requestBody, response,} from '@loopback/rest';
|
||||||
CountSchema,
|
|
||||||
Filter,
|
|
||||||
FilterExcludingWhere,
|
|
||||||
repository,
|
|
||||||
Where,
|
|
||||||
} from '@loopback/repository';
|
|
||||||
import {
|
|
||||||
post,
|
|
||||||
param,
|
|
||||||
get,
|
|
||||||
getModelSchemaRef,
|
|
||||||
patch,
|
|
||||||
put,
|
|
||||||
del,
|
|
||||||
requestBody,
|
|
||||||
response,
|
|
||||||
} from '@loopback/rest';
|
|
||||||
import {User} from '../models';
|
import {User} from '../models';
|
||||||
import {UserRepository} from '../repositories';
|
import {UserRepository} from '../repositories';
|
||||||
|
import {
|
||||||
|
Credentials,
|
||||||
|
MyUserService,
|
||||||
|
TokenServiceBindings,
|
||||||
|
UserServiceBindings
|
||||||
|
} from '@loopback/authentication-jwt';
|
||||||
|
import {inject, MetadataInspector} from '@loopback/core';
|
||||||
|
import {TokenService} from '@loopback/authentication';
|
||||||
|
import {SecurityBindings, UserProfile} from '@loopback/security';
|
||||||
|
import {genSalt, hash} from 'bcryptjs';
|
||||||
|
import _ from 'lodash';
|
||||||
|
import {UserRepository as UserRepo} from '@loopback/authentication-jwt';
|
||||||
|
|
||||||
export class UserController {
|
export class UserController {
|
||||||
constructor(
|
constructor(
|
||||||
|
@inject(TokenServiceBindings.TOKEN_SERVICE)
|
||||||
|
public jwtService: TokenService,
|
||||||
|
@inject(UserServiceBindings.USER_SERVICE)
|
||||||
|
public userService: MyUserService,
|
||||||
|
@inject(SecurityBindings.USER, {optional: true})
|
||||||
|
public user: UserProfile,
|
||||||
|
@repository(UserRepo)
|
||||||
|
public userRepository : UserRepo,
|
||||||
@repository(UserRepository)
|
@repository(UserRepository)
|
||||||
public userRepository : UserRepository,
|
public userDataRepository : UserRepository,
|
||||||
) {}
|
) {}
|
||||||
|
|
||||||
|
static includeToExclude(values: (keyof User)[]): (keyof User)[] {
|
||||||
|
const metadata = MetadataInspector.getAllPropertyMetadata(MODEL_PROPERTIES_KEY, User);
|
||||||
|
if (metadata) {
|
||||||
|
return _.without(Object.keys(metadata), ...values) as (keyof User)[];
|
||||||
|
}
|
||||||
|
else throw new Error("No property metadata found");
|
||||||
|
}
|
||||||
|
|
||||||
@post('/users')
|
@post('/users')
|
||||||
@response(200, {
|
@response(200, {
|
||||||
description: 'User model instance',
|
description: 'User model instance',
|
||||||
content: {'application/json': {schema: getModelSchemaRef(User)}},
|
content: {'application/json': {schema: getModelSchemaRef(User, {exclude: ['password']})}},
|
||||||
})
|
})
|
||||||
async create(
|
async register(
|
||||||
@requestBody({
|
@requestBody({
|
||||||
content: {
|
content: {
|
||||||
'application/json': {
|
'application/json': {
|
||||||
schema: getModelSchemaRef(User, {
|
schema: getModelSchemaRef(User, {
|
||||||
title: 'NewUser',
|
title: 'Registration request',
|
||||||
exclude: ['id'],
|
exclude: ['id', 'role']
|
||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
user: Omit<User, 'id'>,
|
request: Pick<User, 'email' | 'name' | 'password'>,
|
||||||
): Promise<User> {
|
): Promise<User> {
|
||||||
return this.userRepository.create(user);
|
const password = await hash(request.password, await genSalt());
|
||||||
|
const user = {
|
||||||
|
email: request.email,
|
||||||
|
name: request.name,
|
||||||
|
password: password,
|
||||||
|
role: 'student'
|
||||||
|
} as User;
|
||||||
|
return this.userDataRepository.create(user);
|
||||||
|
}
|
||||||
|
|
||||||
|
@post('/users/login', {
|
||||||
|
responses: {
|
||||||
|
'200': {
|
||||||
|
description: 'Token',
|
||||||
|
content: {
|
||||||
|
'application/json': {
|
||||||
|
schema: {
|
||||||
|
type: 'object',
|
||||||
|
properties: {
|
||||||
|
token: {
|
||||||
|
type: 'string',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
async login(
|
||||||
|
@requestBody({
|
||||||
|
description: 'The input of login function',
|
||||||
|
required: true,
|
||||||
|
content: {
|
||||||
|
'application/json': {
|
||||||
|
schema: getModelSchemaRef(User, {exclude: ['id', 'role', 'name']})
|
||||||
|
},
|
||||||
|
}}) credentials: Credentials,
|
||||||
|
): Promise<{token: string}> {
|
||||||
|
// ensure the user exists, and the password is correct
|
||||||
|
const user = await this.userService.verifyCredentials(credentials);
|
||||||
|
// convert a User object into a UserProfile object (reduced set of properties)
|
||||||
|
const userProfile = this.userService.convertToUserProfile(user);
|
||||||
|
|
||||||
|
// create a JSON Web Token based on the user profile
|
||||||
|
const token = await this.jwtService.generateToken(userProfile);
|
||||||
|
return {token};
|
||||||
}
|
}
|
||||||
|
|
||||||
@get('/users/count')
|
@get('/users/count')
|
||||||
|
@ -55,7 +112,7 @@ export class UserController {
|
||||||
async count(
|
async count(
|
||||||
@param.where(User) where?: Where<User>,
|
@param.where(User) where?: Where<User>,
|
||||||
): Promise<Count> {
|
): Promise<Count> {
|
||||||
return this.userRepository.count(where);
|
return this.userDataRepository.count(where);
|
||||||
}
|
}
|
||||||
|
|
||||||
@get('/users')
|
@get('/users')
|
||||||
|
@ -73,7 +130,7 @@ export class UserController {
|
||||||
async find(
|
async find(
|
||||||
@param.filter(User) filter?: Filter<User>,
|
@param.filter(User) filter?: Filter<User>,
|
||||||
): Promise<User[]> {
|
): Promise<User[]> {
|
||||||
return this.userRepository.find(filter);
|
return this.userDataRepository.find(filter);
|
||||||
}
|
}
|
||||||
|
|
||||||
@patch('/users')
|
@patch('/users')
|
||||||
|
@ -92,7 +149,7 @@ export class UserController {
|
||||||
user: User,
|
user: User,
|
||||||
@param.where(User) where?: Where<User>,
|
@param.where(User) where?: Where<User>,
|
||||||
): Promise<Count> {
|
): Promise<Count> {
|
||||||
return this.userRepository.updateAll(user, where);
|
return this.userDataRepository.updateAll(user, where);
|
||||||
}
|
}
|
||||||
|
|
||||||
@get('/users/{id}')
|
@get('/users/{id}')
|
||||||
|
@ -108,7 +165,7 @@ export class UserController {
|
||||||
@param.path.number('id') id: number,
|
@param.path.number('id') id: number,
|
||||||
@param.filter(User, {exclude: 'where'}) filter?: FilterExcludingWhere<User>
|
@param.filter(User, {exclude: 'where'}) filter?: FilterExcludingWhere<User>
|
||||||
): Promise<User> {
|
): Promise<User> {
|
||||||
return this.userRepository.findById(id, filter);
|
return this.userDataRepository.findById(id, filter);
|
||||||
}
|
}
|
||||||
|
|
||||||
@patch('/users/{id}')
|
@patch('/users/{id}')
|
||||||
|
@ -126,7 +183,7 @@ export class UserController {
|
||||||
})
|
})
|
||||||
user: User,
|
user: User,
|
||||||
): Promise<void> {
|
): Promise<void> {
|
||||||
await this.userRepository.updateById(id, user);
|
await this.userDataRepository.updateById(id, user);
|
||||||
}
|
}
|
||||||
|
|
||||||
@put('/users/{id}')
|
@put('/users/{id}')
|
||||||
|
@ -137,7 +194,7 @@ export class UserController {
|
||||||
@param.path.number('id') id: number,
|
@param.path.number('id') id: number,
|
||||||
@requestBody() user: User,
|
@requestBody() user: User,
|
||||||
): Promise<void> {
|
): Promise<void> {
|
||||||
await this.userRepository.replaceById(id, user);
|
await this.userDataRepository.replaceById(id, user);
|
||||||
}
|
}
|
||||||
|
|
||||||
@del('/users/{id}')
|
@del('/users/{id}')
|
||||||
|
@ -145,6 +202,6 @@ export class UserController {
|
||||||
description: 'User DELETE success',
|
description: 'User DELETE success',
|
||||||
})
|
})
|
||||||
async deleteById(@param.path.number('id') id: number): Promise<void> {
|
async deleteById(@param.path.number('id') id: number): Promise<void> {
|
||||||
await this.userRepository.deleteById(id);
|
await this.userDataRepository.deleteById(id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,26 +12,37 @@ export class User extends Entity {
|
||||||
@property({
|
@property({
|
||||||
type: 'string',
|
type: 'string',
|
||||||
required: true,
|
required: true,
|
||||||
|
jsonSchema: {
|
||||||
|
pattern: /[A-Za-z0-9.+_-]+@[A-Za-z.-_]*(u-szeged.hu)|(szte.hu)/.source
|
||||||
|
}
|
||||||
})
|
})
|
||||||
email: string;
|
email: string;
|
||||||
|
|
||||||
@property({
|
@property({
|
||||||
type: 'string',
|
type: 'string',
|
||||||
required: true,
|
required: true,
|
||||||
|
jsonSchema: {
|
||||||
|
pattern: /([A-Za-z-.]+ )+[A-Za-z-.]+/.source
|
||||||
|
}
|
||||||
})
|
})
|
||||||
name: string;
|
name: string;
|
||||||
|
|
||||||
@property({
|
@property({
|
||||||
type: 'string',
|
type: 'string',
|
||||||
required: true,
|
required: true,
|
||||||
|
jsonSchema: {
|
||||||
|
minLength: 8,
|
||||||
|
maxLength: 255
|
||||||
|
},
|
||||||
|
hidden: true
|
||||||
})
|
})
|
||||||
password: string;
|
password: string;
|
||||||
|
|
||||||
@property({
|
@property({
|
||||||
type: 'object',
|
type: 'string',
|
||||||
required: true,
|
required: true,
|
||||||
})
|
})
|
||||||
role: object;
|
role: 'admin' | 'teacher' | 'student';
|
||||||
|
|
||||||
|
|
||||||
constructor(data?: Partial<User>) {
|
constructor(data?: Partial<User>) {
|
||||||
|
|
Loading…
Reference in a new issue