google-signin

This commit is contained in:
harshithnrao 2025-03-29 20:07:22 +05:30
parent a293cdc04c
commit dab3b9dc61
18 changed files with 361 additions and 96 deletions

288
package-lock.json generated
View File

@ -16,6 +16,7 @@
"@nestjs/jwt": "^11.0.0",
"@nestjs/passport": "^11.0.5",
"@nestjs/platform-express": "^10.0.0",
"@nestjs/platform-socket.io": "^10.4.15",
"@nestjs/swagger": "^8.1.1",
"@nestjs/typeorm": "^10.0.1",
"@nestjs/websockets": "^10.4.15",
@ -25,6 +26,8 @@
"moment": "^2.30.1",
"nodemailer": "^6.9.9",
"otp-generator": "^4.0.1",
"passport": "^0.7.0",
"passport-google-oauth20": "^2.0.0",
"passport-jwt": "^4.0.1",
"pg": "^8.14.1",
"reflect-metadata": "^0.1.14",
@ -45,6 +48,7 @@
"@types/node": "^20.10.6",
"@types/nodemailer": "^6.4.14",
"@types/passport": "^1.0.17",
"@types/passport-google-oauth20": "^2.0.16",
"@types/passport-jwt": "^4.0.1",
"@types/supertest": "^2.0.12",
"@types/validator": "^13.11.7",
@ -1797,12 +1801,6 @@
}
}
},
"node_modules/@nestjs/common/node_modules/tslib": {
"version": "2.8.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
"license": "0BSD"
},
"node_modules/@nestjs/config": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/@nestjs/config/-/config-3.3.0.tgz",
@ -1856,12 +1854,6 @@
}
}
},
"node_modules/@nestjs/core/node_modules/tslib": {
"version": "2.8.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
"license": "0BSD"
},
"node_modules/@nestjs/jwt": {
"version": "11.0.0",
"resolved": "https://registry.npmjs.org/@nestjs/jwt/-/jwt-11.0.0.tgz",
@ -1926,11 +1918,24 @@
"@nestjs/core": "^10.0.0"
}
},
"node_modules/@nestjs/platform-express/node_modules/tslib": {
"version": "2.8.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
"license": "0BSD"
"node_modules/@nestjs/platform-socket.io": {
"version": "10.4.15",
"resolved": "https://registry.npmjs.org/@nestjs/platform-socket.io/-/platform-socket.io-10.4.15.tgz",
"integrity": "sha512-KZAxNEADPwoORixh3NJgGYWMVGORVPKeTqjD7hbF8TPDLKWWxru9yasBQwEz2/wXH/WgpkQbbaYwx4nUjCIVpw==",
"license": "MIT",
"dependencies": {
"socket.io": "4.8.1",
"tslib": "2.8.1"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/nest"
},
"peerDependencies": {
"@nestjs/common": "^10.0.0",
"@nestjs/websockets": "^10.0.0",
"rxjs": "^7.1.0"
}
},
"node_modules/@nestjs/schematics": {
"version": "10.2.3",
@ -1983,12 +1988,13 @@
}
},
"node_modules/@nestjs/testing": {
"version": "10.3.0",
"resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-10.3.0.tgz",
"integrity": "sha512-8DM+bw1qASCvaEnoHUQhypCOf54+G5R21MeFBMvnSk5DtKaWVZuzDP2GjLeYCpTH19WeP6LrrjHv3rX2LKU02A==",
"version": "10.4.15",
"resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-10.4.15.tgz",
"integrity": "sha512-eGlWESkACMKti+iZk1hs6FUY/UqObmMaa8HAN9JLnaYkoLf1Jeh+EuHlGnfqo/Rq77oznNLIyaA3PFjrFDlNUg==",
"dev": true,
"license": "MIT",
"dependencies": {
"tslib": "2.6.2"
"tslib": "2.8.1"
},
"funding": {
"type": "opencollective",
@ -2010,16 +2016,17 @@
}
},
"node_modules/@nestjs/typeorm": {
"version": "10.0.1",
"resolved": "https://registry.npmjs.org/@nestjs/typeorm/-/typeorm-10.0.1.tgz",
"integrity": "sha512-YVFYL7D25VAVp5/G+KLXIgsRfYomA+VaFZBpm2rtwrrBOmkXNrxr7kuI2bBBO/Xy4kKBDe6wbvIVVFeEA7/ngA==",
"version": "10.0.2",
"resolved": "https://registry.npmjs.org/@nestjs/typeorm/-/typeorm-10.0.2.tgz",
"integrity": "sha512-H738bJyydK4SQkRCTeh1aFBxoO1E9xdL/HaLGThwrqN95os5mEyAtK7BLADOS+vldP4jDZ2VQPLj4epWwRqCeQ==",
"license": "MIT",
"dependencies": {
"uuid": "9.0.1"
},
"peerDependencies": {
"@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0",
"@nestjs/core": "^8.0.0 || ^9.0.0 || ^10.0.0",
"reflect-metadata": "^0.1.13",
"reflect-metadata": "^0.1.13 || ^0.2.0",
"rxjs": "^7.2.0",
"typeorm": "^0.3.0"
}
@ -2047,12 +2054,6 @@
}
}
},
"node_modules/@nestjs/websockets/node_modules/tslib": {
"version": "2.8.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
"license": "0BSD"
},
"node_modules/@nodelib/fs.scandir": {
"version": "2.1.5",
"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
@ -2434,6 +2435,16 @@
"@types/node": "*"
}
},
"node_modules/@types/oauth": {
"version": "0.9.6",
"resolved": "https://registry.npmjs.org/@types/oauth/-/oauth-0.9.6.tgz",
"integrity": "sha512-H9TRCVKBNOhZZmyHLqFt9drPM9l+ShWiqqJijU1B8P3DX3ub84NjxDuy+Hjrz+fEca5Kwip3qPMKNyiLgNJtIA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/node": "*"
}
},
"node_modules/@types/passport": {
"version": "1.0.17",
"resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.17.tgz",
@ -2444,6 +2455,18 @@
"@types/express": "*"
}
},
"node_modules/@types/passport-google-oauth20": {
"version": "2.0.16",
"resolved": "https://registry.npmjs.org/@types/passport-google-oauth20/-/passport-google-oauth20-2.0.16.tgz",
"integrity": "sha512-ayXK2CJ7uVieqhYOc6k/pIr5pcQxOLB6kBev+QUGS7oEZeTgIs1odDobXRqgfBPvXzl0wXCQHftV5220czZCPA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/express": "*",
"@types/passport": "*",
"@types/passport-oauth2": "*"
}
},
"node_modules/@types/passport-jwt": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/@types/passport-jwt/-/passport-jwt-4.0.1.tgz",
@ -2455,6 +2478,18 @@
"@types/passport-strategy": "*"
}
},
"node_modules/@types/passport-oauth2": {
"version": "1.4.17",
"resolved": "https://registry.npmjs.org/@types/passport-oauth2/-/passport-oauth2-1.4.17.tgz",
"integrity": "sha512-ODiAHvso6JcWJ6ZkHHroVp05EHGhqQN533PtFNBkg8Fy5mERDqsr030AX81M0D69ZcaMvhF92SRckEk2B0HYYg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/express": "*",
"@types/oauth": "*",
"@types/passport": "*"
}
},
"node_modules/@types/passport-strategy": {
"version": "0.2.38",
"resolved": "https://registry.npmjs.org/@types/passport-strategy/-/passport-strategy-0.2.38.tgz",
@ -3381,6 +3416,15 @@
"node": "^4.5.0 || >= 5.9"
}
},
"node_modules/base64url": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz",
"integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==",
"license": "MIT",
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/binary-extensions": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
@ -7579,6 +7623,12 @@
"node": ">=8"
}
},
"node_modules/oauth": {
"version": "0.10.2",
"resolved": "https://registry.npmjs.org/oauth/-/oauth-0.10.2.tgz",
"integrity": "sha512-JtFnB+8nxDEXgNyniwz573xxbKSOu3R8D40xQKqcjwJ2CDkYqUDI53o6IuzDJBx60Z8VKCm271+t8iFjakrl8Q==",
"license": "MIT"
},
"node_modules/object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
@ -7808,7 +7858,6 @@
"resolved": "https://registry.npmjs.org/passport/-/passport-0.7.0.tgz",
"integrity": "sha512-cPLl+qZpSc+ireUvt+IzqbED1cHHkDoVYMo30jbJIdOOjQ1MQYZBPiNvmi8UM6lJuOpTPXJGZQk0DtC4y61MYQ==",
"license": "MIT",
"peer": true,
"dependencies": {
"passport-strategy": "1.x.x",
"pause": "0.0.1",
@ -7822,6 +7871,18 @@
"url": "https://github.com/sponsors/jaredhanson"
}
},
"node_modules/passport-google-oauth20": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/passport-google-oauth20/-/passport-google-oauth20-2.0.0.tgz",
"integrity": "sha512-KSk6IJ15RoxuGq7D1UKK/8qKhNfzbLeLrG3gkLZ7p4A6DBCcv7xpyQwuXtWdpyR0+E0mwkpjY1VfPOhxQrKzdQ==",
"license": "MIT",
"dependencies": {
"passport-oauth2": "1.x.x"
},
"engines": {
"node": ">= 0.4.0"
}
},
"node_modules/passport-jwt": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/passport-jwt/-/passport-jwt-4.0.1.tgz",
@ -7832,6 +7893,26 @@
"passport-strategy": "^1.0.0"
}
},
"node_modules/passport-oauth2": {
"version": "1.8.0",
"resolved": "https://registry.npmjs.org/passport-oauth2/-/passport-oauth2-1.8.0.tgz",
"integrity": "sha512-cjsQbOrXIDE4P8nNb3FQRCCmJJ/utnFKEz2NX209f7KOHPoX18gF7gBzBbLLsj2/je4KrgiwLLGjf0lm9rtTBA==",
"license": "MIT",
"dependencies": {
"base64url": "3.x.x",
"oauth": "0.10.x",
"passport-strategy": "1.x.x",
"uid2": "0.0.x",
"utils-merge": "1.x.x"
},
"engines": {
"node": ">= 0.4.0"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/jaredhanson"
}
},
"node_modules/passport-strategy": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz",
@ -7914,8 +7995,7 @@
"node_modules/pause": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz",
"integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==",
"peer": true
"integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg=="
},
"node_modules/pg": {
"version": "8.14.1",
@ -9849,9 +9929,10 @@
}
},
"node_modules/tslib": {
"version": "2.6.2",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
"integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="
"version": "2.8.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
"license": "0BSD"
},
"node_modules/type-check": {
"version": "0.4.0",
@ -10111,6 +10192,12 @@
"node": ">=8"
}
},
"node_modules/uid2": {
"version": "0.0.4",
"resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.4.tgz",
"integrity": "sha512-IevTus0SbGwQzYh3+fRsAMTVVPOoIVufzacXcHPmdlle1jUpq7BRL+mw3dgeLanvGZdwwbWhRV6XrcFNdBmjWA==",
"license": "MIT"
},
"node_modules/undefsafe": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz",
@ -11943,13 +12030,6 @@
"iterare": "1.2.1",
"tslib": "2.8.1",
"uid": "2.0.2"
},
"dependencies": {
"tslib": {
"version": "2.8.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="
}
}
},
"@nestjs/config": {
@ -11973,13 +12053,6 @@
"path-to-regexp": "3.3.0",
"tslib": "2.8.1",
"uid": "2.0.2"
},
"dependencies": {
"tslib": {
"version": "2.8.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="
}
}
},
"@nestjs/jwt": {
@ -12013,13 +12086,15 @@
"express": "4.21.2",
"multer": "1.4.4-lts.1",
"tslib": "2.8.1"
},
"dependencies": {
"tslib": {
"version": "2.8.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="
}
}
},
"@nestjs/platform-socket.io": {
"version": "10.4.15",
"resolved": "https://registry.npmjs.org/@nestjs/platform-socket.io/-/platform-socket.io-10.4.15.tgz",
"integrity": "sha512-KZAxNEADPwoORixh3NJgGYWMVGORVPKeTqjD7hbF8TPDLKWWxru9yasBQwEz2/wXH/WgpkQbbaYwx4nUjCIVpw==",
"requires": {
"socket.io": "4.8.1",
"tslib": "2.8.1"
}
},
"@nestjs/schematics": {
@ -12049,18 +12124,18 @@
}
},
"@nestjs/testing": {
"version": "10.3.0",
"resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-10.3.0.tgz",
"integrity": "sha512-8DM+bw1qASCvaEnoHUQhypCOf54+G5R21MeFBMvnSk5DtKaWVZuzDP2GjLeYCpTH19WeP6LrrjHv3rX2LKU02A==",
"version": "10.4.15",
"resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-10.4.15.tgz",
"integrity": "sha512-eGlWESkACMKti+iZk1hs6FUY/UqObmMaa8HAN9JLnaYkoLf1Jeh+EuHlGnfqo/Rq77oznNLIyaA3PFjrFDlNUg==",
"dev": true,
"requires": {
"tslib": "2.6.2"
"tslib": "2.8.1"
}
},
"@nestjs/typeorm": {
"version": "10.0.1",
"resolved": "https://registry.npmjs.org/@nestjs/typeorm/-/typeorm-10.0.1.tgz",
"integrity": "sha512-YVFYL7D25VAVp5/G+KLXIgsRfYomA+VaFZBpm2rtwrrBOmkXNrxr7kuI2bBBO/Xy4kKBDe6wbvIVVFeEA7/ngA==",
"version": "10.0.2",
"resolved": "https://registry.npmjs.org/@nestjs/typeorm/-/typeorm-10.0.2.tgz",
"integrity": "sha512-H738bJyydK4SQkRCTeh1aFBxoO1E9xdL/HaLGThwrqN95os5mEyAtK7BLADOS+vldP4jDZ2VQPLj4epWwRqCeQ==",
"requires": {
"uuid": "9.0.1"
}
@ -12073,13 +12148,6 @@
"iterare": "1.2.1",
"object-hash": "3.0.0",
"tslib": "2.8.1"
},
"dependencies": {
"tslib": {
"version": "2.8.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="
}
}
},
"@nodelib/fs.scandir": {
@ -12432,6 +12500,15 @@
"@types/node": "*"
}
},
"@types/oauth": {
"version": "0.9.6",
"resolved": "https://registry.npmjs.org/@types/oauth/-/oauth-0.9.6.tgz",
"integrity": "sha512-H9TRCVKBNOhZZmyHLqFt9drPM9l+ShWiqqJijU1B8P3DX3ub84NjxDuy+Hjrz+fEca5Kwip3qPMKNyiLgNJtIA==",
"dev": true,
"requires": {
"@types/node": "*"
}
},
"@types/passport": {
"version": "1.0.17",
"resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.17.tgz",
@ -12441,6 +12518,17 @@
"@types/express": "*"
}
},
"@types/passport-google-oauth20": {
"version": "2.0.16",
"resolved": "https://registry.npmjs.org/@types/passport-google-oauth20/-/passport-google-oauth20-2.0.16.tgz",
"integrity": "sha512-ayXK2CJ7uVieqhYOc6k/pIr5pcQxOLB6kBev+QUGS7oEZeTgIs1odDobXRqgfBPvXzl0wXCQHftV5220czZCPA==",
"dev": true,
"requires": {
"@types/express": "*",
"@types/passport": "*",
"@types/passport-oauth2": "*"
}
},
"@types/passport-jwt": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/@types/passport-jwt/-/passport-jwt-4.0.1.tgz",
@ -12451,6 +12539,17 @@
"@types/passport-strategy": "*"
}
},
"@types/passport-oauth2": {
"version": "1.4.17",
"resolved": "https://registry.npmjs.org/@types/passport-oauth2/-/passport-oauth2-1.4.17.tgz",
"integrity": "sha512-ODiAHvso6JcWJ6ZkHHroVp05EHGhqQN533PtFNBkg8Fy5mERDqsr030AX81M0D69ZcaMvhF92SRckEk2B0HYYg==",
"dev": true,
"requires": {
"@types/express": "*",
"@types/oauth": "*",
"@types/passport": "*"
}
},
"@types/passport-strategy": {
"version": "0.2.38",
"resolved": "https://registry.npmjs.org/@types/passport-strategy/-/passport-strategy-0.2.38.tgz",
@ -13129,6 +13228,11 @@
"resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz",
"integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog=="
},
"base64url": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz",
"integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A=="
},
"binary-extensions": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
@ -16169,6 +16273,11 @@
"path-key": "^3.0.0"
}
},
"oauth": {
"version": "0.10.2",
"resolved": "https://registry.npmjs.org/oauth/-/oauth-0.10.2.tgz",
"integrity": "sha512-JtFnB+8nxDEXgNyniwz573xxbKSOu3R8D40xQKqcjwJ2CDkYqUDI53o6IuzDJBx60Z8VKCm271+t8iFjakrl8Q=="
},
"object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
@ -16331,13 +16440,20 @@
"version": "0.7.0",
"resolved": "https://registry.npmjs.org/passport/-/passport-0.7.0.tgz",
"integrity": "sha512-cPLl+qZpSc+ireUvt+IzqbED1cHHkDoVYMo30jbJIdOOjQ1MQYZBPiNvmi8UM6lJuOpTPXJGZQk0DtC4y61MYQ==",
"peer": true,
"requires": {
"passport-strategy": "1.x.x",
"pause": "0.0.1",
"utils-merge": "^1.0.1"
}
},
"passport-google-oauth20": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/passport-google-oauth20/-/passport-google-oauth20-2.0.0.tgz",
"integrity": "sha512-KSk6IJ15RoxuGq7D1UKK/8qKhNfzbLeLrG3gkLZ7p4A6DBCcv7xpyQwuXtWdpyR0+E0mwkpjY1VfPOhxQrKzdQ==",
"requires": {
"passport-oauth2": "1.x.x"
}
},
"passport-jwt": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/passport-jwt/-/passport-jwt-4.0.1.tgz",
@ -16347,6 +16463,18 @@
"passport-strategy": "^1.0.0"
}
},
"passport-oauth2": {
"version": "1.8.0",
"resolved": "https://registry.npmjs.org/passport-oauth2/-/passport-oauth2-1.8.0.tgz",
"integrity": "sha512-cjsQbOrXIDE4P8nNb3FQRCCmJJ/utnFKEz2NX209f7KOHPoX18gF7gBzBbLLsj2/je4KrgiwLLGjf0lm9rtTBA==",
"requires": {
"base64url": "3.x.x",
"oauth": "0.10.x",
"passport-strategy": "1.x.x",
"uid2": "0.0.x",
"utils-merge": "1.x.x"
}
},
"passport-strategy": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz",
@ -16407,8 +16535,7 @@
"pause": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz",
"integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==",
"peer": true
"integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg=="
},
"pg": {
"version": "8.14.1",
@ -17749,9 +17876,9 @@
}
},
"tslib": {
"version": "2.6.2",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
"integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="
"version": "2.8.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="
},
"type-check": {
"version": "0.4.0",
@ -17866,6 +17993,11 @@
"@lukeed/csprng": "^1.0.0"
}
},
"uid2": {
"version": "0.0.4",
"resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.4.tgz",
"integrity": "sha512-IevTus0SbGwQzYh3+fRsAMTVVPOoIVufzacXcHPmdlle1jUpq7BRL+mw3dgeLanvGZdwwbWhRV6XrcFNdBmjWA=="
},
"undefsafe": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz",

View File

@ -30,6 +30,7 @@
"@nestjs/jwt": "^11.0.0",
"@nestjs/passport": "^11.0.5",
"@nestjs/platform-express": "^10.0.0",
"@nestjs/platform-socket.io": "^10.4.15",
"@nestjs/swagger": "^8.1.1",
"@nestjs/typeorm": "^10.0.1",
"@nestjs/websockets": "^10.4.15",
@ -39,6 +40,8 @@
"moment": "^2.30.1",
"nodemailer": "^6.9.9",
"otp-generator": "^4.0.1",
"passport": "^0.7.0",
"passport-google-oauth20": "^2.0.0",
"passport-jwt": "^4.0.1",
"pg": "^8.14.1",
"reflect-metadata": "^0.1.14",
@ -59,6 +62,7 @@
"@types/node": "^20.10.6",
"@types/nodemailer": "^6.4.14",
"@types/passport": "^1.0.17",
"@types/passport-google-oauth20": "^2.0.16",
"@types/passport-jwt": "^4.0.1",
"@types/supertest": "^2.0.12",
"@types/validator": "^13.11.7",

View File

@ -57,4 +57,8 @@ export class AppConfigService {
getSwaggerConfig(){
return configMaster[this.defaultEnv].swaggerConfig;
}
getGoogleOauthConfig(){
return configMaster[this.defaultEnv].googleOauthConfig;
}
}

View File

@ -60,6 +60,12 @@
"host":"localhost",
"port":6379,
"db":0
},
"googleOauthConfig": {
"clientId":"361418022886-4d4p2v7n9tq8t4tq8t4tq8tq8tq8tq8t.apps.googleusercontent.com",
"clientSecret":"GOCSPX-2Vt7b5Oo4t4t4t4t4t4t4t4t4t4",
"callbackURL":"http://localhost:3000/auth/google-redirect",
"scope":["email","profile"]
}
}
}

View File

@ -60,6 +60,12 @@
"host":"localhost",
"port":6379,
"db":0
},
"googleOauthConfig": {
"clientId":"361418022886-4d4p2v7n9tq8t4tq8t4tq8tq8tq8tq8t.apps.googleusercontent.com",
"clientSecret":"GOCSPX-2Vt7b5Oo4t4t4t4t4t4t4t4t4t4",
"callbackURL":"http://localhost:3000/auth/google-redirect",
"scope":["email","profile"]
}
}
}

View File

@ -57,6 +57,10 @@ export class AppService {
const redisConfig = this.configService.getRedisConfig();
this.commonService.redisConfig = redisConfig;
Utility.redisConfig = redisConfig;
const googleOauthConfig = this.configService.getGoogleOauthConfig();
this.commonService.googleOauthConfig = googleOauthConfig;
Utility.googleOauthConfig = googleOauthConfig;
}
getModels() {

View File

@ -1,8 +1,9 @@
import { Body, Controller, Delete, Post, Res } from '@nestjs/common';
import { Body, Controller, Delete, Get, Post, Req, Res, UseGuards } from '@nestjs/common';
import { GenericResponse } from 'src/common/GenericResponse.model';
import { AuthService } from './auth.service';
import { Response } from 'express';
import { Request, Response } from 'express';
import { ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger';
import { GoogleOauthGuard } from 'src/google-oauth/google-oauth.guard';
@ApiTags('Auth')
@Controller('auth')
export class AuthController {
@ -100,4 +101,21 @@ export class AuthController {
}
}
//google oauth implementation
@Get()
@UseGuards(GoogleOauthGuard)
async googleLogin(@Res() res: Response) {
console.log("inside google login");
} //basically this is used to call googleLogin for login credentials
@Get('google-redirect')
@UseGuards(GoogleOauthGuard)
async googleOauthRedirect(@Req() req: Request, @Res() res: Response) {
console.log("inside google redirect");
const httpResponse = await this.authService.googleOauthRedirect(req.user);
return res.status(httpResponse.statusCode).send(httpResponse);
}
}

View File

@ -7,6 +7,7 @@ import { UserModule } from 'src/user/user.module';
import { JwtStrategy } from 'src/jwt/jwt.strategy';
import { Utility } from 'src/common/Utility';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { GoogleStrategy } from 'src/google-oauth/google.strategy';
@Module({
imports: [
@ -26,7 +27,7 @@ import { ConfigModule, ConfigService } from '@nestjs/config';
UserModule,
],
controllers: [AuthController],
providers: [AuthService, JwtStrategy],
providers: [AuthService, JwtStrategy,GoogleStrategy],
exports: [AuthService],
})
export class AuthModule {}

View File

@ -1,18 +1,20 @@
import { Injectable } from '@nestjs/common';
import { JwtService } from '@nestjs/jwt';
import { Response } from 'express';
import { Utility } from 'src/common/Utility';
import JwtPayload from 'src/jwt/jwt-payload.dto';
import RefreshToken from 'src/jwt/refresh-token.entity';
import { User } from 'src/user/user.entity';
import { UserService } from 'src/user/user.service';
import { Request } from 'express';
@Injectable()
export class AuthService {
constructor(private userService: UserService, private jwtService: JwtService) { }
private signToken(payload: any, type: 'accessToken' | 'refreshToken'): string {
console.log("yav type andre", type)
private async signToken(payload: any, type: 'accessToken' | 'refreshToken') {
const config = Utility.jwtConfig[type];
console.log("yav expiry andre", config.expiresIn)
return this.jwtService.sign(payload, {
secret: config.secretOrKey,
expiresIn: config.expiresIn,
@ -26,7 +28,7 @@ export class AuthService {
secret: config.secretOrKey,
});
} catch (error) {
console.log(`${type} token is invalid`, error);
// console.log(`${type} token is invalid`, error);
return null;
}
}
@ -37,13 +39,11 @@ export class AuthService {
async login(user: any) {
const payload: JwtPayload = { email: user.email, password: user.password };
console.log("illig bandu nilthu", payload)
const accessToken = this.signToken(payload, 'accessToken');
console.log("illig bandu nilthu", accessToken)
const refreshToken = this.signToken(payload, 'refreshToken');
await RefreshToken.create({ email: user.email, token: refreshToken });
await RefreshToken.create({ email: user.email, token: refreshToken, type: 'jwt' });
return {
access_token: accessToken,
@ -57,17 +57,17 @@ export class AuthService {
throw new Error('Invalid refresh token');
}
console.log(refreshToken);
console.log(payload);
// console.log(refreshToken);
// console.log(payload);
const user = await this.userService.findByEmail(payload.email);
if (!user) {
throw new Error('User not found');
}
console.log(user)
// console.log(user)
const accessToken = this.signToken({
email: payload.email
}, 'accessToken');
console.log(accessToken)
// console.log(accessToken)
return { access_token: accessToken };
}
@ -90,4 +90,35 @@ export class AuthService {
async logout(refreshToken: string) {
return RefreshToken.destroy({ where: { token: refreshToken } });
}
//google services
async googleOauthRedirect(user) {
console.log("user in service is",user);
if(!user.email) {
return {
statusCode: 400,
message: 'User not found'
}
}
console.log("user.email in service is",user.email);
let existingUser = await User.findOne({ where: { email: user.email } });
if(!existingUser) {
existingUser = await User.create({
email: user.email,
name: user.name,});
}
const payload = existingUser.get();
const accessToken = await this.signToken(payload, 'accessToken');
const refreshToken = await this.signToken(payload, 'refreshToken');
await RefreshToken.create({ email: payload.email, token: refreshToken, type: 'jwt' });
return {
statusCode: 200,
access_token: accessToken,
refresh_token: refreshToken
}
}
}

View File

@ -2,10 +2,12 @@ import { Module } from '@nestjs/common';
import { BookingGateway } from './booking.gateway';
import { BookingService } from './booking.service';
import { SeatService } from 'src/seat/seat.service';
import { TicketService } from 'src/ticket/ticket.service';
import { HttpModule, HttpService } from '@nestjs/axios';
@Module({
providers: [BookingGateway, BookingService],
exports: [BookingService],
imports: [SeatService]
imports: [HttpModule],
providers: [BookingService, BookingGateway, SeatService, TicketService],
exports: [BookingService, BookingGateway],
})
export class BookingGatewayModule { }

View File

@ -28,6 +28,7 @@ export class BookingGateway implements OnGatewayConnection, OnGatewayDisconnect
@SubscribeMessage('bookTciket')
async handleBookTicket(@MessageBody() ticket: Ticket) {
const response = await this.bookingService.bookTicket(ticket);
this.server.to(ticket.eventId.toString() ).emit('ticketBooked', response);
this.server.emit('ticketBooked', response);
}
@SubscribeMessage('checkSeatAvailability')
@ -37,6 +38,13 @@ export class BookingGateway implements OnGatewayConnection, OnGatewayDisconnect
this.server.emit('seatAvailability', { isAvailable });
}
@SubscribeMessage('joinRoom')
async handleJoinEvent(client: Socket,@MessageBody() data: { roomId: string }) {
client.join(data.roomId);
console.log(`Client joined room: ${data.roomId}`);
this.server.to(data.roomId).emit('clientJoinedRoom');
}
@SubscribeMessage('getBookedSeats')
async handleGetBookedSeats(@MessageBody() movieId: string) {
const bookedSeats = await this.bookingService.getBookedSeats(movieId);

View File

@ -8,7 +8,7 @@ import Seat from 'src/seat/seat.entity';
@Injectable()
export class BookingService {
constructor(
@Inject('BookingGateway') private readonly bookingGateway: BookingGateway,
// @Inject('BookingGateway') private readonly bookingGateway: BookingGateway,
private readonly seatService: SeatService,
private readonly ticketService: TicketService
) { }

View File

@ -24,4 +24,5 @@ export class Utility {
static urlConfig:any;
static vapidConfig: any;
static redisConfig: any;
static googleOauthConfig: any;
}

View File

@ -12,6 +12,7 @@ export class CommonService {
vapidConfig:any;
redisConfig:any;
swaggerConfig:any;
googleOauthConfig:any;
constructor() {
}

View File

@ -0,0 +1,12 @@
import { Injectable } from "@nestjs/common";
import { ConfigService } from "@nestjs/config";
import { AuthGuard } from "@nestjs/passport";
@Injectable()
export class GoogleOauthGuard extends AuthGuard('google') {
constructor() {
super({
// accessType: 'offline',
});
}
}

View File

@ -0,0 +1,30 @@
import { Injectable } from "@nestjs/common";
import { PassportStrategy } from "@nestjs/passport";
import { Strategy, VerifyCallback } from "passport-google-oauth20";
import { Utility } from "src/common/Utility";
@Injectable()
export class GoogleStrategy extends PassportStrategy(Strategy, 'google') {
constructor() {
super({
clientID: Utility.googleOauthConfig.clientId,
clientSecret: Utility.googleOauthConfig.clientSecret,
callbackURL: Utility.googleOauthConfig.callbackUrl,
scope: Utility.googleOauthConfig.scope,
});
}
async validate(accessToken: string, refreshToken: string, profile: any, done: VerifyCallback) {
const { name, emails } = profile;
const user = {
email: emails[0].value,
name: name.givenName,
accessToken,
refreshToken,
};
console.log("user object in validate is", user)
done(null, user);
}
}

View File

@ -11,4 +11,8 @@ export default class RefreshToken extends Model {
@ApiProperty({ type: String })
@Column({ type: DataType.TEXT })
token: string;
@ApiProperty({ type: String })
@Column({ type: DataType.TEXT })
type: string;
}

View File

@ -12,6 +12,7 @@ async function bootstrap() {
Utility.swaggerConfig = configMaster.local.swaggerConfig;
Utility.vapidConfig = configMaster.local.vapidConfig;
Utility.redisConfig = configMaster.local.redisConfig;
Utility.googleOauthConfig = configMaster.local.googleOauthConfig;
const app = await NestFactory.create(AppModule, { cors: true });