From aa7278eeb214ca6aabf965d6bf1d2fd70ef068e8 Mon Sep 17 00:00:00 2001 From: Behzad-rabiei Date: Sun, 26 Jan 2025 09:30:14 +0100 Subject: [PATCH 01/13] chore: update togethercrew.dev/db package --- package-lock.json | 123 +++++----------------------------------------- package.json | 4 +- 2 files changed, 14 insertions(+), 113 deletions(-) diff --git a/package-lock.json b/package-lock.json index b50280d4..08fd5f30 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,8 +14,8 @@ "@notionhq/client": "^2.2.3", "@sentry/node": "^7.50.0", "@temporalio/client": "^1.11.3", - "@togethercrew.dev/db": "^3.0.79", - "@togethercrew.dev/tc-messagebroker": "^0.0.50", + "@togethercrew.dev/db": "^3.2.0", + "@togethercrew.dev/tc-messagebroker": "^0.0.13", "@types/express-session": "^1.17.7", "@types/morgan": "^1.9.5", "babel-jest": "^29.3.1", @@ -3658,9 +3658,9 @@ "dev": true }, "node_modules/@togethercrew.dev/db": { - "version": "3.0.79", - "resolved": "https://registry.npmjs.org/@togethercrew.dev/db/-/db-3.0.79.tgz", - "integrity": "sha512-l3CWsmnXZTwHs50/oN0bT+UCxJJSsKjGlgOYwJADQY8+bk3gz7kKTfSE7d8Jc873bVUO54kEfPLHI1/NjzArng==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@togethercrew.dev/db/-/db-3.2.0.tgz", + "integrity": "sha512-6EDg0Z1XbAiguzNZ/WmGy3kePOzvtwaEe5tsxylsgOqstViZZg9eb9jFK8RkvcaW+uVQdVmhWuEUhGJnk8e7Mg==", "license": "ISC", "dependencies": { "discord.js": "^14.7.1", @@ -3672,108 +3672,15 @@ } }, "node_modules/@togethercrew.dev/tc-messagebroker": { - "version": "0.0.50", - "resolved": "https://registry.npmjs.org/@togethercrew.dev/tc-messagebroker/-/tc-messagebroker-0.0.50.tgz", - "integrity": "sha512-e+XfCJJaGXiQDaytENYWydH78WQgMKEuFyrA4vRC3CQH0phmyqlx63AHhi59HHsSkjZJuO7ObhENIRgWNGqjrA==", + "version": "0.0.13", + "resolved": "https://registry.npmjs.org/@togethercrew.dev/tc-messagebroker/-/tc-messagebroker-0.0.13.tgz", + "integrity": "sha512-q5TnrNkQrXOyfySLtTMPzhqM3hAr0m5efzLtQW+3YgzAH6s4NYeCa+zCT4KAp3RDmMxn2z7QBcPMbbz0jki4Nw==", "license": "ISC", "dependencies": { "@types/amqplib": "^0.10.1", - "@types/uuid": "^9.0.1", - "amqplib": "^0.10.3", - "mongoose": "^7.1.1", - "uuid": "^9.0.0" - } - }, - "node_modules/@togethercrew.dev/tc-messagebroker/node_modules/bson": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/bson/-/bson-5.5.1.tgz", - "integrity": "sha512-ix0EwukN2EpC0SRWIj/7B5+A6uQMQy6KMREI9qQqvgpkV2frH63T0UDVd1SYedL6dNCmDBYB3QtXi4ISk9YT+g==", - "license": "Apache-2.0", - "engines": { - "node": ">=14.20.1" - } - }, - "node_modules/@togethercrew.dev/tc-messagebroker/node_modules/mongodb": { - "version": "5.9.2", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-5.9.2.tgz", - "integrity": "sha512-H60HecKO4Bc+7dhOv4sJlgvenK4fQNqqUIlXxZYQNbfEWSALGAwGoyJd/0Qwk4TttFXUOHJ2ZJQe/52ScaUwtQ==", - "license": "Apache-2.0", - "dependencies": { - "bson": "^5.5.0", - "mongodb-connection-string-url": "^2.6.0", - "socks": "^2.7.1" - }, - "engines": { - "node": ">=14.20.1" - }, - "optionalDependencies": { - "@mongodb-js/saslprep": "^1.1.0" - }, - "peerDependencies": { - "@aws-sdk/credential-providers": "^3.188.0", - "@mongodb-js/zstd": "^1.0.0", - "kerberos": "^1.0.0 || ^2.0.0", - "mongodb-client-encryption": ">=2.3.0 <3", - "snappy": "^7.2.2" - }, - "peerDependenciesMeta": { - "@aws-sdk/credential-providers": { - "optional": true - }, - "@mongodb-js/zstd": { - "optional": true - }, - "kerberos": { - "optional": true - }, - "mongodb-client-encryption": { - "optional": true - }, - "snappy": { - "optional": true - } + "amqplib": "^0.10.3" } }, - "node_modules/@togethercrew.dev/tc-messagebroker/node_modules/mongoose": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-7.8.3.tgz", - "integrity": "sha512-eFnbkKgyVrICoHB6tVJ4uLanS7d5AIo/xHkEbQeOv6g2sD7gh/1biRwvFifsmbtkIddQVNr3ROqHik6gkknN3g==", - "license": "MIT", - "dependencies": { - "bson": "^5.5.0", - "kareem": "2.5.1", - "mongodb": "5.9.2", - "mpath": "0.9.0", - "mquery": "5.0.0", - "ms": "2.1.3", - "sift": "16.0.1" - }, - "engines": { - "node": ">=14.20.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mongoose" - } - }, - "node_modules/@togethercrew.dev/tc-messagebroker/node_modules/mquery": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/mquery/-/mquery-5.0.0.tgz", - "integrity": "sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==", - "license": "MIT", - "dependencies": { - "debug": "4.x" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@togethercrew.dev/tc-messagebroker/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, "node_modules/@tokenizer/token": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", @@ -4141,12 +4048,6 @@ "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==", "dev": true }, - "node_modules/@types/uuid": { - "version": "9.0.8", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", - "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==", - "license": "MIT" - }, "node_modules/@types/validator": { "version": "13.7.17", "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.7.17.tgz", @@ -10447,9 +10348,9 @@ } }, "node_modules/mongoose": { - "version": "6.13.5", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.13.5.tgz", - "integrity": "sha512-podJEaIF/5N2mQymkyyUzN2NeL/68MOyYjf3O0zsgCU2B2Omnhg6NhGHVavt9ZH/VxOrwKE9XphbuHDFK+T06g==", + "version": "6.13.8", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.13.8.tgz", + "integrity": "sha512-JHKco/533CyVrqCbyQsnqMpLn8ZCiKrPDTd2mvo2W7ygIvhygWjX2wj+RPjn6upZZgw0jC6U51RD7kUsyK8NBg==", "license": "MIT", "dependencies": { "bson": "^4.7.2", diff --git a/package.json b/package.json index cc0627ff..93b32834 100644 --- a/package.json +++ b/package.json @@ -28,8 +28,8 @@ "@notionhq/client": "^2.2.3", "@sentry/node": "^7.50.0", "@temporalio/client": "^1.11.3", - "@togethercrew.dev/db": "^3.0.79", - "@togethercrew.dev/tc-messagebroker": "^0.0.50", + "@togethercrew.dev/db": "^3.2.0", + "@togethercrew.dev/tc-messagebroker": "^0.0.13", "@types/express-session": "^1.17.7", "@types/morgan": "^1.9.5", "babel-jest": "^29.3.1", From 620203a4c1544473c8af0ed418b929051613b215 Mon Sep 17 00:00:00 2001 From: Behzad-rabiei Date: Mon, 27 Jan 2025 08:45:36 +0100 Subject: [PATCH 02/13] chore: update togethercrew.dev/db package --- package-lock.json | 305 +++++++++++++++++++++++++++++++++++++++------- package.json | 4 +- 2 files changed, 264 insertions(+), 45 deletions(-) diff --git a/package-lock.json b/package-lock.json index 08fd5f30..430e8fc6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,7 +14,7 @@ "@notionhq/client": "^2.2.3", "@sentry/node": "^7.50.0", "@temporalio/client": "^1.11.3", - "@togethercrew.dev/db": "^3.2.0", + "@togethercrew.dev/db": "^3.2.3", "@togethercrew.dev/tc-messagebroker": "^0.0.13", "@types/express-session": "^1.17.7", "@types/morgan": "^1.9.5", @@ -40,7 +40,7 @@ "moment": "^2.29.4", "moment-timezone": "^0.5.40", "mongodb": "^4.12.1", - "mongoose": "^6.7.5", + "mongoose": "^8.9.5", "morgan": "^1.10.0", "neo4j-driver": "^5.9.0", "node-fetch": "^2.6.7", @@ -2427,10 +2427,10 @@ "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==" }, "node_modules/@mongodb-js/saslprep": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.0.tgz", - "integrity": "sha512-Xfijy7HvfzzqiOAhAepF4SGN5e9leLkMvg/OPOF97XemjfVCYN/oWa75wnkc6mltMSTwY+XlbhWgUOJmkFspSw==", - "optional": true, + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.9.tgz", + "integrity": "sha512-tVkljjeEaAhCqTzajSdgbQ6gE6f3oneVwa3iXR6csiEwXXOFsiC6Uh9iAjAhXPtqa/XMDHWjjeNH/77m/Yq2dw==", + "license": "MIT", "dependencies": { "sparse-bitfield": "^3.0.3" } @@ -3658,9 +3658,9 @@ "dev": true }, "node_modules/@togethercrew.dev/db": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@togethercrew.dev/db/-/db-3.2.0.tgz", - "integrity": "sha512-6EDg0Z1XbAiguzNZ/WmGy3kePOzvtwaEe5tsxylsgOqstViZZg9eb9jFK8RkvcaW+uVQdVmhWuEUhGJnk8e7Mg==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/@togethercrew.dev/db/-/db-3.2.3.tgz", + "integrity": "sha512-V2NqrrXyuJKornzhAfZymWYATp6KkjXrMxNPgb0c7LCsIo+tRLlqqQIkwYt5htI9ujBP5bemgtYHYykhQhWdpA==", "license": "ISC", "dependencies": { "discord.js": "^14.7.1", @@ -3671,6 +3671,75 @@ "validator": "^13.7.0" } }, + "node_modules/@togethercrew.dev/db/node_modules/kareem": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.5.1.tgz", + "integrity": "sha512-7jFxRVm+jD+rkq3kY0iZDJfsO2/t4BBPeEb2qKn2lR/9KhuksYk5hxzfRYWMPV8P/x2d0kHD306YyWLzjjH+uA==", + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@togethercrew.dev/db/node_modules/mongoose": { + "version": "6.13.8", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.13.8.tgz", + "integrity": "sha512-JHKco/533CyVrqCbyQsnqMpLn8ZCiKrPDTd2mvo2W7ygIvhygWjX2wj+RPjn6upZZgw0jC6U51RD7kUsyK8NBg==", + "license": "MIT", + "dependencies": { + "bson": "^4.7.2", + "kareem": "2.5.1", + "mongodb": "4.17.2", + "mpath": "0.9.0", + "mquery": "4.0.3", + "ms": "2.1.3", + "sift": "16.0.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mongoose" + } + }, + "node_modules/@togethercrew.dev/db/node_modules/mongoose-unique-validator": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mongoose-unique-validator/-/mongoose-unique-validator-3.1.0.tgz", + "integrity": "sha512-UsBBlFapip8gc8x1h+nLWnkOy+GTy9Z+zmTyZ35icLV3EoLIVz180vJzepfMM9yBy2AJh+maeuoM8CWtqejGUg==", + "license": "MIT", + "dependencies": { + "lodash.foreach": "^4.1.0", + "lodash.get": "^4.0.2", + "lodash.merge": "^4.6.2" + }, + "peerDependencies": { + "mongoose": "^6.0.0" + } + }, + "node_modules/@togethercrew.dev/db/node_modules/mquery": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-4.0.3.tgz", + "integrity": "sha512-J5heI+P08I6VJ2Ky3+33IpCdAvlYGTSUjwTPxkAr8i8EoduPMBX2OY/wa3IKZIQl7MU4SbFk8ndgSKyB/cl1zA==", + "license": "MIT", + "dependencies": { + "debug": "4.x" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@togethercrew.dev/db/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/@togethercrew.dev/db/node_modules/sift": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/sift/-/sift-16.0.1.tgz", + "integrity": "sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ==", + "license": "MIT" + }, "node_modules/@togethercrew.dev/tc-messagebroker": { "version": "0.0.13", "resolved": "https://registry.npmjs.org/@togethercrew.dev/tc-messagebroker/-/tc-messagebroker-0.0.13.tgz", @@ -4444,6 +4513,20 @@ "node": ">=0.4.0" } }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -7218,6 +7301,21 @@ "node": ">= 0.4.0" } }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", @@ -9488,9 +9586,10 @@ } }, "node_modules/kareem": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.5.1.tgz", - "integrity": "sha512-7jFxRVm+jD+rkq3kY0iZDJfsO2/t4BBPeEb2qKn2lR/9KhuksYk5hxzfRYWMPV8P/x2d0kHD306YyWLzjjH+uA==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.6.3.tgz", + "integrity": "sha512-C3iHfuGUXK2u8/ipq9LfjFfXFxAZMQJJq7vLS45r3D9Y2xQ/m4S8zaR4zMLFWh9AsNPXmcFfUDhTEO8UIC/V6Q==", + "license": "Apache-2.0", "engines": { "node": ">=12.0.0" } @@ -9619,7 +9718,8 @@ "node_modules/lodash.foreach": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", - "integrity": "sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==" + "integrity": "sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==", + "license": "MIT" }, "node_modules/lodash.get": { "version": "4.4.2", @@ -9929,8 +10029,7 @@ "node_modules/memory-pager": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", - "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", - "optional": true + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==" }, "node_modules/merge-descriptors": { "version": "1.0.3", @@ -10348,38 +10447,131 @@ } }, "node_modules/mongoose": { - "version": "6.13.8", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.13.8.tgz", - "integrity": "sha512-JHKco/533CyVrqCbyQsnqMpLn8ZCiKrPDTd2mvo2W7ygIvhygWjX2wj+RPjn6upZZgw0jC6U51RD7kUsyK8NBg==", + "version": "8.9.5", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.9.5.tgz", + "integrity": "sha512-SPhOrgBm0nKV3b+IIHGqpUTOmgVL5Z3OO9AwkFEmvOZznXTvplbomstCnPOGAyungtRXE5pJTgKpKcZTdjeESg==", "license": "MIT", "dependencies": { - "bson": "^4.7.2", - "kareem": "2.5.1", - "mongodb": "4.17.2", + "bson": "^6.10.1", + "kareem": "2.6.3", + "mongodb": "~6.12.0", "mpath": "0.9.0", - "mquery": "4.0.3", + "mquery": "5.0.0", "ms": "2.1.3", - "sift": "16.0.1" + "sift": "17.1.3" }, "engines": { - "node": ">=12.0.0" + "node": ">=16.20.1" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/mongoose" } }, - "node_modules/mongoose-unique-validator": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mongoose-unique-validator/-/mongoose-unique-validator-3.1.0.tgz", - "integrity": "sha512-UsBBlFapip8gc8x1h+nLWnkOy+GTy9Z+zmTyZ35icLV3EoLIVz180vJzepfMM9yBy2AJh+maeuoM8CWtqejGUg==", + "node_modules/mongoose/node_modules/@types/whatwg-url": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-11.0.5.tgz", + "integrity": "sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==", + "license": "MIT", "dependencies": { - "lodash.foreach": "^4.1.0", - "lodash.get": "^4.0.2", - "lodash.merge": "^4.6.2" + "@types/webidl-conversions": "*" + } + }, + "node_modules/mongoose/node_modules/bson": { + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/bson/-/bson-6.10.1.tgz", + "integrity": "sha512-P92xmHDQjSKPLHqFxefqMxASNq/aWJMEZugpCjf+AF/pgcUpMMQCg7t7+ewko0/u8AapvF3luf/FoehddEK+sA==", + "license": "Apache-2.0", + "engines": { + "node": ">=16.20.1" + } + }, + "node_modules/mongoose/node_modules/gaxios": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-5.1.3.tgz", + "integrity": "sha512-95hVgBRgEIRQQQHIbnxBXeHbW4TqFk4ZDJW7wmVtvYar72FdhRIo1UGOLS2eRAKCPEdPBWu+M7+A33D9CdX9rA==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "extend": "^3.0.2", + "https-proxy-agent": "^5.0.0", + "is-stream": "^2.0.0", + "node-fetch": "^2.6.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/mongoose/node_modules/gcp-metadata": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.3.0.tgz", + "integrity": "sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "gaxios": "^5.0.0", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/mongoose/node_modules/mongodb": { + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.12.0.tgz", + "integrity": "sha512-RM7AHlvYfS7jv7+BXund/kR64DryVI+cHbVAy9P61fnb1RcWZqOW1/Wj2YhqMCx+MuYhqTRGv7AwHBzmsCKBfA==", + "license": "Apache-2.0", + "dependencies": { + "@mongodb-js/saslprep": "^1.1.9", + "bson": "^6.10.1", + "mongodb-connection-string-url": "^3.0.0" + }, + "engines": { + "node": ">=16.20.1" }, "peerDependencies": { - "mongoose": "^6.0.0" + "@aws-sdk/credential-providers": "^3.188.0", + "@mongodb-js/zstd": "^1.1.0 || ^2.0.0", + "gcp-metadata": "^5.2.0", + "kerberos": "^2.0.1", + "mongodb-client-encryption": ">=6.0.0 <7", + "snappy": "^7.2.2", + "socks": "^2.7.1" + }, + "peerDependenciesMeta": { + "@aws-sdk/credential-providers": { + "optional": true + }, + "@mongodb-js/zstd": { + "optional": true + }, + "gcp-metadata": { + "optional": true + }, + "kerberos": { + "optional": true + }, + "mongodb-client-encryption": { + "optional": true + }, + "snappy": { + "optional": true + }, + "socks": { + "optional": true + } + } + }, + "node_modules/mongoose/node_modules/mongodb-connection-string-url": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.2.tgz", + "integrity": "sha512-rMO7CGo/9BFwyZABcKAWL8UJwH/Kc2x0g72uhDWzG48URRax5TCIcJ7Rc3RZqffZzO/Gwff/jyKwCU9TN8gehA==", + "license": "Apache-2.0", + "dependencies": { + "@types/whatwg-url": "^11.0.2", + "whatwg-url": "^14.1.0 || ^13.0.0" } }, "node_modules/mongoose/node_modules/ms": { @@ -10387,6 +10579,31 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, + "node_modules/mongoose/node_modules/tr46": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", + "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/mongoose/node_modules/whatwg-url": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.1.0.tgz", + "integrity": "sha512-jlf/foYIKywAt3x/XWKZ/3rz8OSJPiWktjmk891alJUEjiVxKX9LEO92qH3hv4aJ0mN3MWPvGMCy8jQi95xK4w==", + "license": "MIT", + "dependencies": { + "tr46": "^5.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/morgan": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", @@ -10435,14 +10652,15 @@ } }, "node_modules/mquery": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/mquery/-/mquery-4.0.3.tgz", - "integrity": "sha512-J5heI+P08I6VJ2Ky3+33IpCdAvlYGTSUjwTPxkAr8i8EoduPMBX2OY/wa3IKZIQl7MU4SbFk8ndgSKyB/cl1zA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-5.0.0.tgz", + "integrity": "sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==", + "license": "MIT", "dependencies": { "debug": "4.x" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" } }, "node_modules/ms": { @@ -11365,9 +11583,10 @@ "dev": true }, "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", "engines": { "node": ">=6" } @@ -12113,9 +12332,10 @@ } }, "node_modules/sift": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/sift/-/sift-16.0.1.tgz", - "integrity": "sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ==" + "version": "17.1.3", + "resolved": "https://registry.npmjs.org/sift/-/sift-17.1.3.tgz", + "integrity": "sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==", + "license": "MIT" }, "node_modules/signal-exit": { "version": "3.0.7", @@ -12292,7 +12512,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", - "optional": true, "dependencies": { "memory-pager": "^1.0.2" } diff --git a/package.json b/package.json index 93b32834..03a1346a 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "@notionhq/client": "^2.2.3", "@sentry/node": "^7.50.0", "@temporalio/client": "^1.11.3", - "@togethercrew.dev/db": "^3.2.0", + "@togethercrew.dev/db": "^3.2.3", "@togethercrew.dev/tc-messagebroker": "^0.0.13", "@types/express-session": "^1.17.7", "@types/morgan": "^1.9.5", @@ -54,7 +54,7 @@ "moment": "^2.29.4", "moment-timezone": "^0.5.40", "mongodb": "^4.12.1", - "mongoose": "^6.7.5", + "mongoose": "^8.9.5", "morgan": "^1.10.0", "neo4j-driver": "^5.9.0", "node-fetch": "^2.6.7", From 66917eb77d1c33e2b6e87361c55af3815d63dbb2 Mon Sep 17 00:00:00 2001 From: Behzad-rabiei Date: Mon, 27 Jan 2025 10:04:30 +0100 Subject: [PATCH 03/13] chore: update togethercrew.dev/db package --- package-lock.json | 339 ++++++++++++++++------------------------------ package.json | 4 +- 2 files changed, 115 insertions(+), 228 deletions(-) diff --git a/package-lock.json b/package-lock.json index 430e8fc6..96cd2986 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,7 @@ "@sentry/node": "^7.50.0", "@temporalio/client": "^1.11.3", "@togethercrew.dev/db": "^3.2.3", - "@togethercrew.dev/tc-messagebroker": "^0.0.13", + "@togethercrew.dev/tc-messagebroker": "^0.0.50", "@types/express-session": "^1.17.7", "@types/morgan": "^1.9.5", "babel-jest": "^29.3.1", @@ -40,7 +40,7 @@ "moment": "^2.29.4", "moment-timezone": "^0.5.40", "mongodb": "^4.12.1", - "mongoose": "^8.9.5", + "mongoose": "^6.13.8", "morgan": "^1.10.0", "neo4j-driver": "^5.9.0", "node-fetch": "^2.6.7", @@ -2431,6 +2431,7 @@ "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.9.tgz", "integrity": "sha512-tVkljjeEaAhCqTzajSdgbQ6gE6f3oneVwa3iXR6csiEwXXOFsiC6Uh9iAjAhXPtqa/XMDHWjjeNH/77m/Yq2dw==", "license": "MIT", + "optional": true, "dependencies": { "sparse-bitfield": "^3.0.3" } @@ -3671,37 +3672,6 @@ "validator": "^13.7.0" } }, - "node_modules/@togethercrew.dev/db/node_modules/kareem": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.5.1.tgz", - "integrity": "sha512-7jFxRVm+jD+rkq3kY0iZDJfsO2/t4BBPeEb2qKn2lR/9KhuksYk5hxzfRYWMPV8P/x2d0kHD306YyWLzjjH+uA==", - "license": "Apache-2.0", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@togethercrew.dev/db/node_modules/mongoose": { - "version": "6.13.8", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.13.8.tgz", - "integrity": "sha512-JHKco/533CyVrqCbyQsnqMpLn8ZCiKrPDTd2mvo2W7ygIvhygWjX2wj+RPjn6upZZgw0jC6U51RD7kUsyK8NBg==", - "license": "MIT", - "dependencies": { - "bson": "^4.7.2", - "kareem": "2.5.1", - "mongodb": "4.17.2", - "mpath": "0.9.0", - "mquery": "4.0.3", - "ms": "2.1.3", - "sift": "16.0.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mongoose" - } - }, "node_modules/@togethercrew.dev/db/node_modules/mongoose-unique-validator": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/mongoose-unique-validator/-/mongoose-unique-validator-3.1.0.tgz", @@ -3716,40 +3686,97 @@ "mongoose": "^6.0.0" } }, - "node_modules/@togethercrew.dev/db/node_modules/mquery": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/mquery/-/mquery-4.0.3.tgz", - "integrity": "sha512-J5heI+P08I6VJ2Ky3+33IpCdAvlYGTSUjwTPxkAr8i8EoduPMBX2OY/wa3IKZIQl7MU4SbFk8ndgSKyB/cl1zA==", + "node_modules/@togethercrew.dev/tc-messagebroker": { + "version": "0.0.50", + "resolved": "https://registry.npmjs.org/@togethercrew.dev/tc-messagebroker/-/tc-messagebroker-0.0.50.tgz", + "integrity": "sha512-e+XfCJJaGXiQDaytENYWydH78WQgMKEuFyrA4vRC3CQH0phmyqlx63AHhi59HHsSkjZJuO7ObhENIRgWNGqjrA==", + "license": "ISC", + "dependencies": { + "@types/amqplib": "^0.10.1", + "@types/uuid": "^9.0.1", + "amqplib": "^0.10.3", + "mongoose": "^7.1.1", + "uuid": "^9.0.0" + } + }, + "node_modules/@togethercrew.dev/tc-messagebroker/node_modules/bson": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/bson/-/bson-5.5.1.tgz", + "integrity": "sha512-ix0EwukN2EpC0SRWIj/7B5+A6uQMQy6KMREI9qQqvgpkV2frH63T0UDVd1SYedL6dNCmDBYB3QtXi4ISk9YT+g==", + "license": "Apache-2.0", + "engines": { + "node": ">=14.20.1" + } + }, + "node_modules/@togethercrew.dev/tc-messagebroker/node_modules/mongodb": { + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-5.9.2.tgz", + "integrity": "sha512-H60HecKO4Bc+7dhOv4sJlgvenK4fQNqqUIlXxZYQNbfEWSALGAwGoyJd/0Qwk4TttFXUOHJ2ZJQe/52ScaUwtQ==", + "license": "Apache-2.0", + "dependencies": { + "bson": "^5.5.0", + "mongodb-connection-string-url": "^2.6.0", + "socks": "^2.7.1" + }, + "engines": { + "node": ">=14.20.1" + }, + "optionalDependencies": { + "@mongodb-js/saslprep": "^1.1.0" + }, + "peerDependencies": { + "@aws-sdk/credential-providers": "^3.188.0", + "@mongodb-js/zstd": "^1.0.0", + "kerberos": "^1.0.0 || ^2.0.0", + "mongodb-client-encryption": ">=2.3.0 <3", + "snappy": "^7.2.2" + }, + "peerDependenciesMeta": { + "@aws-sdk/credential-providers": { + "optional": true + }, + "@mongodb-js/zstd": { + "optional": true + }, + "kerberos": { + "optional": true + }, + "mongodb-client-encryption": { + "optional": true + }, + "snappy": { + "optional": true + } + } + }, + "node_modules/@togethercrew.dev/tc-messagebroker/node_modules/mongoose": { + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-7.8.6.tgz", + "integrity": "sha512-1oVPRHvcmPVwk/zeSTEzayzQEVeYQM1D5zrkLsttfNNB7pPRUmkKeFu6gpbvyEswOuZLrWJjqB8kSTY+k2AZOA==", "license": "MIT", "dependencies": { - "debug": "4.x" + "bson": "^5.5.0", + "kareem": "2.5.1", + "mongodb": "5.9.2", + "mpath": "0.9.0", + "mquery": "5.0.0", + "ms": "2.1.3", + "sift": "16.0.1" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.20.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mongoose" } }, - "node_modules/@togethercrew.dev/db/node_modules/ms": { + "node_modules/@togethercrew.dev/tc-messagebroker/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, - "node_modules/@togethercrew.dev/db/node_modules/sift": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/sift/-/sift-16.0.1.tgz", - "integrity": "sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ==", - "license": "MIT" - }, - "node_modules/@togethercrew.dev/tc-messagebroker": { - "version": "0.0.13", - "resolved": "https://registry.npmjs.org/@togethercrew.dev/tc-messagebroker/-/tc-messagebroker-0.0.13.tgz", - "integrity": "sha512-q5TnrNkQrXOyfySLtTMPzhqM3hAr0m5efzLtQW+3YgzAH6s4NYeCa+zCT4KAp3RDmMxn2z7QBcPMbbz0jki4Nw==", - "license": "ISC", - "dependencies": { - "@types/amqplib": "^0.10.1", - "amqplib": "^0.10.3" - } - }, "node_modules/@tokenizer/token": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", @@ -4117,6 +4144,12 @@ "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==", "dev": true }, + "node_modules/@types/uuid": { + "version": "9.0.8", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", + "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==", + "license": "MIT" + }, "node_modules/@types/validator": { "version": "13.7.17", "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.7.17.tgz", @@ -4513,20 +4546,6 @@ "node": ">=0.4.0" } }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -7301,21 +7320,6 @@ "node": ">= 0.4.0" } }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", @@ -9586,9 +9590,9 @@ } }, "node_modules/kareem": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.6.3.tgz", - "integrity": "sha512-C3iHfuGUXK2u8/ipq9LfjFfXFxAZMQJJq7vLS45r3D9Y2xQ/m4S8zaR4zMLFWh9AsNPXmcFfUDhTEO8UIC/V6Q==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.5.1.tgz", + "integrity": "sha512-7jFxRVm+jD+rkq3kY0iZDJfsO2/t4BBPeEb2qKn2lR/9KhuksYk5hxzfRYWMPV8P/x2d0kHD306YyWLzjjH+uA==", "license": "Apache-2.0", "engines": { "node": ">=12.0.0" @@ -10029,7 +10033,8 @@ "node_modules/memory-pager": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", - "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==" + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "optional": true }, "node_modules/merge-descriptors": { "version": "1.0.3", @@ -10447,131 +10452,37 @@ } }, "node_modules/mongoose": { - "version": "8.9.5", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.9.5.tgz", - "integrity": "sha512-SPhOrgBm0nKV3b+IIHGqpUTOmgVL5Z3OO9AwkFEmvOZznXTvplbomstCnPOGAyungtRXE5pJTgKpKcZTdjeESg==", + "version": "6.13.8", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.13.8.tgz", + "integrity": "sha512-JHKco/533CyVrqCbyQsnqMpLn8ZCiKrPDTd2mvo2W7ygIvhygWjX2wj+RPjn6upZZgw0jC6U51RD7kUsyK8NBg==", "license": "MIT", "dependencies": { - "bson": "^6.10.1", - "kareem": "2.6.3", - "mongodb": "~6.12.0", + "bson": "^4.7.2", + "kareem": "2.5.1", + "mongodb": "4.17.2", "mpath": "0.9.0", - "mquery": "5.0.0", + "mquery": "4.0.3", "ms": "2.1.3", - "sift": "17.1.3" + "sift": "16.0.1" }, "engines": { - "node": ">=16.20.1" + "node": ">=12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/mongoose" } }, - "node_modules/mongoose/node_modules/@types/whatwg-url": { - "version": "11.0.5", - "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-11.0.5.tgz", - "integrity": "sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==", + "node_modules/mongoose/node_modules/mquery": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-4.0.3.tgz", + "integrity": "sha512-J5heI+P08I6VJ2Ky3+33IpCdAvlYGTSUjwTPxkAr8i8EoduPMBX2OY/wa3IKZIQl7MU4SbFk8ndgSKyB/cl1zA==", "license": "MIT", "dependencies": { - "@types/webidl-conversions": "*" - } - }, - "node_modules/mongoose/node_modules/bson": { - "version": "6.10.1", - "resolved": "https://registry.npmjs.org/bson/-/bson-6.10.1.tgz", - "integrity": "sha512-P92xmHDQjSKPLHqFxefqMxASNq/aWJMEZugpCjf+AF/pgcUpMMQCg7t7+ewko0/u8AapvF3luf/FoehddEK+sA==", - "license": "Apache-2.0", - "engines": { - "node": ">=16.20.1" - } - }, - "node_modules/mongoose/node_modules/gaxios": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-5.1.3.tgz", - "integrity": "sha512-95hVgBRgEIRQQQHIbnxBXeHbW4TqFk4ZDJW7wmVtvYar72FdhRIo1UGOLS2eRAKCPEdPBWu+M7+A33D9CdX9rA==", - "license": "Apache-2.0", - "optional": true, - "peer": true, - "dependencies": { - "extend": "^3.0.2", - "https-proxy-agent": "^5.0.0", - "is-stream": "^2.0.0", - "node-fetch": "^2.6.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/mongoose/node_modules/gcp-metadata": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.3.0.tgz", - "integrity": "sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==", - "license": "Apache-2.0", - "optional": true, - "peer": true, - "dependencies": { - "gaxios": "^5.0.0", - "json-bigint": "^1.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/mongoose/node_modules/mongodb": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.12.0.tgz", - "integrity": "sha512-RM7AHlvYfS7jv7+BXund/kR64DryVI+cHbVAy9P61fnb1RcWZqOW1/Wj2YhqMCx+MuYhqTRGv7AwHBzmsCKBfA==", - "license": "Apache-2.0", - "dependencies": { - "@mongodb-js/saslprep": "^1.1.9", - "bson": "^6.10.1", - "mongodb-connection-string-url": "^3.0.0" + "debug": "4.x" }, "engines": { - "node": ">=16.20.1" - }, - "peerDependencies": { - "@aws-sdk/credential-providers": "^3.188.0", - "@mongodb-js/zstd": "^1.1.0 || ^2.0.0", - "gcp-metadata": "^5.2.0", - "kerberos": "^2.0.1", - "mongodb-client-encryption": ">=6.0.0 <7", - "snappy": "^7.2.2", - "socks": "^2.7.1" - }, - "peerDependenciesMeta": { - "@aws-sdk/credential-providers": { - "optional": true - }, - "@mongodb-js/zstd": { - "optional": true - }, - "gcp-metadata": { - "optional": true - }, - "kerberos": { - "optional": true - }, - "mongodb-client-encryption": { - "optional": true - }, - "snappy": { - "optional": true - }, - "socks": { - "optional": true - } - } - }, - "node_modules/mongoose/node_modules/mongodb-connection-string-url": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.2.tgz", - "integrity": "sha512-rMO7CGo/9BFwyZABcKAWL8UJwH/Kc2x0g72uhDWzG48URRax5TCIcJ7Rc3RZqffZzO/Gwff/jyKwCU9TN8gehA==", - "license": "Apache-2.0", - "dependencies": { - "@types/whatwg-url": "^11.0.2", - "whatwg-url": "^14.1.0 || ^13.0.0" + "node": ">=12.0.0" } }, "node_modules/mongoose/node_modules/ms": { @@ -10579,31 +10490,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, - "node_modules/mongoose/node_modules/tr46": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", - "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", - "license": "MIT", - "dependencies": { - "punycode": "^2.3.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/mongoose/node_modules/whatwg-url": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.1.0.tgz", - "integrity": "sha512-jlf/foYIKywAt3x/XWKZ/3rz8OSJPiWktjmk891alJUEjiVxKX9LEO92qH3hv4aJ0mN3MWPvGMCy8jQi95xK4w==", - "license": "MIT", - "dependencies": { - "tr46": "^5.0.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=18" - } - }, "node_modules/morgan": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", @@ -12332,9 +12218,9 @@ } }, "node_modules/sift": { - "version": "17.1.3", - "resolved": "https://registry.npmjs.org/sift/-/sift-17.1.3.tgz", - "integrity": "sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==", + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/sift/-/sift-16.0.1.tgz", + "integrity": "sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ==", "license": "MIT" }, "node_modules/signal-exit": { @@ -12512,6 +12398,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", + "optional": true, "dependencies": { "memory-pager": "^1.0.2" } diff --git a/package.json b/package.json index 03a1346a..7457546a 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "@sentry/node": "^7.50.0", "@temporalio/client": "^1.11.3", "@togethercrew.dev/db": "^3.2.3", - "@togethercrew.dev/tc-messagebroker": "^0.0.13", + "@togethercrew.dev/tc-messagebroker": "^0.0.50", "@types/express-session": "^1.17.7", "@types/morgan": "^1.9.5", "babel-jest": "^29.3.1", @@ -54,7 +54,7 @@ "moment": "^2.29.4", "moment-timezone": "^0.5.40", "mongodb": "^4.12.1", - "mongoose": "^8.9.5", + "mongoose": "^6.13.8", "morgan": "^1.10.0", "neo4j-driver": "^5.9.0", "node-fetch": "^2.6.7", From 3bfdbe41c27e4c140475e68ef96d4e5a8d53a1d5 Mon Sep 17 00:00:00 2001 From: Behzad-rabiei Date: Mon, 27 Jan 2025 10:05:20 +0100 Subject: [PATCH 04/13] refactor: modify Discord authentication logic to support the new user schema --- src/controllers/auth.controller.ts | 50 +++++++------------- src/services/discord/auth.service.ts | 52 +++++++++++++++++++++ src/services/discord/index.ts | 4 +- src/services/user.service.ts | 70 +++++++++++++++++++++++++++- 4 files changed, 138 insertions(+), 38 deletions(-) create mode 100644 src/services/discord/auth.service.ts diff --git a/src/controllers/auth.controller.ts b/src/controllers/auth.controller.ts index 015e505d..96681e4a 100644 --- a/src/controllers/auth.controller.ts +++ b/src/controllers/auth.controller.ts @@ -2,11 +2,13 @@ import { Request, Response } from 'express'; import httpStatus from 'http-status'; import querystring from 'querystring'; +import { PlatformNames } from '@togethercrew.dev/db'; + import config from '../config'; import logger from '../config/logger'; import { discord, generateState } from '../config/oAtuh2'; import { ISessionRequest } from '../interfaces'; -import { authService, discordServices, tokenService, userService } from '../services'; +import { authService, discordServices, tokenService } from '../services'; import { catchAsync } from '../utils'; const discordAuthorize = catchAsync(async function (req: ISessionRequest, res: Response) { @@ -18,47 +20,27 @@ const discordAuthorize = catchAsync(async function (req: ISessionRequest, res: R }); const discordAuthorizeCallback = catchAsync(async function (req: ISessionRequest, res: Response) { - const STATUS_CODE_SINGIN = 1001; - const STATUS_CODE_LOGIN = 1002; - const STATUS_CODE_ERROR = 1003; - const code = req.query.code as string; - const returnedState = req.query.state as string; - const storedState = req.session.state; - let statusCode = STATUS_CODE_LOGIN; try { - if (!code || !returnedState || returnedState !== storedState) { - throw new Error('Invalid code or state mismatch'); - } - const discordOathCallback = await discordServices.coreService.exchangeCode( + const code = req.query.code as string; + const returnedState = req.query.state as string; + const storedState = req.session.state; + const provider = PlatformNames.Discord; + + const redirectUrl = await discordServices.authService.handleOAuthCallback(provider, { code, - config.oAuth2.discord.callbackURI.authorize, - ); - const discordUser = await discordServices.coreService.getUserFromDiscordAPI(discordOathCallback.access_token); - let user = await userService.getUserByFilter({ discordId: discordUser.id }); + state: returnedState, + storedState, + }); - if (!user) { - user = await userService.createUser({ discordId: discordUser.id }); - statusCode = STATUS_CODE_SINGIN; - } - tokenService.saveDiscordOAuth2Tokens(user.id, discordOathCallback); - const tokens = await tokenService.generateAuthTokens(user); - const params = { - statusCode: statusCode, - accessToken: tokens.access.token, - accessExp: tokens.access.expires.toString(), - refreshToken: tokens.refresh.token, - refreshExp: tokens.refresh.expires.toString(), - }; - const query = querystring.stringify(params); - res.redirect(`${config.frontend.url}/callback?` + query); + res.redirect(redirectUrl); } catch (err) { - logger.error({ err }, 'Failed to authorize discord account'); + logger.error({ err }, 'Failed to authorize Discord account'); const params = { - statusCode: STATUS_CODE_ERROR, + statusCode: 1003, }; const query = querystring.stringify(params); - res.redirect(`${config.frontend.url}/callback?` + query); + res.redirect(`${config.frontend.url}/callback?${query}`); } }); diff --git a/src/services/discord/auth.service.ts b/src/services/discord/auth.service.ts new file mode 100644 index 00000000..6d889644 --- /dev/null +++ b/src/services/discord/auth.service.ts @@ -0,0 +1,52 @@ +import querystring from 'querystring'; + +import { PlatformNames } from '@togethercrew.dev/db'; + +import config from '../../config'; +import tokenService from '../token.service'; +import userService from '../user.service'; +import coreService from './core.service'; + +const STATUS_CODE_SIGNIN = 1001; +const STATUS_CODE_LOGIN = 1002; + +interface OAuthCallbackParams { + code: string; + state: string; + storedState: string; +} + +const handleOAuthCallback = async (provider: PlatformNames, params: OAuthCallbackParams) => { + const { code, state: returnedState, storedState } = params; + let statusCode = STATUS_CODE_LOGIN; + + if (!code || !returnedState || returnedState !== storedState) { + throw new Error('Invalid code or state mismatch'); + } + + const oauthCallbackData = await coreService.exchangeCode(code, config.oAuth2.discord.callbackURI.authorize); + const discordUser = await coreService.getUserFromDiscordAPI(oauthCallbackData.access_token); + + const userId = discordUser.id; + let user = await userService.getUserByIdentity(provider, userId); + if (!user) { + user = await userService.createUserWithIdentity(provider, userId); + statusCode = STATUS_CODE_SIGNIN; + } + tokenService.saveDiscordOAuth2Tokens(user.id, oauthCallbackData); + const tokens = await tokenService.generateAuthTokens(user); + const paramsToRedirect = { + statusCode: statusCode, + accessToken: tokens.access.token, + accessExp: tokens.access.expires.toString(), + refreshToken: tokens.refresh.token, + refreshExp: tokens.refresh.expires.toString(), + }; + + const query = querystring.stringify(paramsToRedirect); + return `${config.frontend.url}/callback?${query}`; +}; + +export default { + handleOAuthCallback, +}; diff --git a/src/services/discord/index.ts b/src/services/discord/index.ts index df343a41..c4ff668d 100644 --- a/src/services/discord/index.ts +++ b/src/services/discord/index.ts @@ -1,13 +1,13 @@ import channelService from './channel.service'; import roleService from './role.service'; import guildMemberService from './guildMember.service'; -// import guildService from './guild.service'; import coreService from './core.service'; +import authService from './auth.service'; export default { channelService, roleService, guildMemberService, - // guildService, coreService, + authService, }; diff --git a/src/services/user.service.ts b/src/services/user.service.ts index ad0a548e..d8a4efe4 100644 --- a/src/services/user.service.ts +++ b/src/services/user.service.ts @@ -1,6 +1,8 @@ -import { HydratedDocument, Types } from 'mongoose'; import httpStatus from 'http-status'; -import { User, IUser } from '@togethercrew.dev/db'; +import { HydratedDocument, Types } from 'mongoose'; + +import { IIdentity, IUser, PlatformNames, User } from '@togethercrew.dev/db'; + import ApiError from '../utils/ApiError'; /** @@ -88,6 +90,67 @@ const addCommunityToUserById = async (userId: Types.ObjectId, communityId: Types return user; }; +/** + * Get user by provider and providerId + * @param {string} provider - The authentication provider (e.g., 'discord') + * @param {string} providerId - The unique ID from the provider + * @returns {Promise | null>} + */ +const getUserByIdentity = async (provider: string, providerId: string): Promise | null> => { + return User.findOne({ + identities: { + $elemMatch: { provider, id: providerId }, + }, + }); +}; + +/** + * Create a user with a specific identity + * @param {string} provider - The authentication provider (e.g., 'discord') + * @param {string} providerId - The unique ID from the provider + * @param {Partial} additionalData - Any additional user data + * @returns {Promise>} + */ +const createUserWithIdentity = async ( + provider: PlatformNames, + userId: string, + additionalData: Partial = {}, +): Promise> => { + const userBody: IUser = { + identities: [ + { + provider, + id: userId, + }, + ], + ...additionalData, + }; + return createUser(userBody); +}; + +/** + * Add a new identity to an existing user + * @param {Types.ObjectId} userId + * @param {IIdentity} identity + * @returns {Promise>} + */ +const addIdentityToUser = async (userId: Types.ObjectId, identity: IIdentity): Promise> => { + const user = await User.findById(userId); + if (!user) { + throw new ApiError(httpStatus.NOT_FOUND, 'User not found'); + } + + const existingIdentity = user.identities.find((id) => id.provider === identity.provider && id.id === identity.id); + + if (existingIdentity) { + throw new ApiError(httpStatus.BAD_REQUEST, 'Identity already exists for this user'); + } + + user.identities.push(identity); + await user.save(); + return user; +}; + export default { createUser, getUserById, @@ -96,4 +159,7 @@ export default { updateUserById, deleteUserById, addCommunityToUserById, + getUserByIdentity, + createUserWithIdentity, + addIdentityToUser, }; From c0cfda130453fdc7bd9e5fd438647125d2775621 Mon Sep 17 00:00:00 2001 From: Behzad-rabiei Date: Mon, 27 Jan 2025 14:37:49 +0100 Subject: [PATCH 05/13] feat: implement telegram auth api --- src/app.ts | 20 +++++--- src/config/index.ts | 4 ++ src/controllers/auth.controller.ts | 32 +++++++----- src/interfaces/Telegram.interface.ts | 10 ++++ src/interfaces/index.ts | 1 + src/public/index.html | 41 ++++++++++++++++ src/routes/v1/auth.route.ts | 2 +- src/services/discord/auth.service.ts | 6 +-- src/services/telegram/auth.service.ts | 71 +++++++++++++++++++++++++++ src/services/telegram/index.ts | 2 + 10 files changed, 165 insertions(+), 24 deletions(-) create mode 100644 src/interfaces/Telegram.interface.ts create mode 100644 src/public/index.html create mode 100644 src/services/telegram/auth.service.ts diff --git a/src/app.ts b/src/app.ts index 5b440a11..2a23a8c6 100644 --- a/src/app.ts +++ b/src/app.ts @@ -1,17 +1,19 @@ +import compression from 'compression'; +import cors from 'cors'; import express, { Application } from 'express'; +import session from 'express-session'; import helmet from 'helmet'; -import compression from 'compression'; +import httpStatus from 'http-status'; import passport from 'passport'; +import path from 'path'; + +import { bullBoardServerAdapter } from './bullmq'; +import config from './config'; +import morgan from './config/morgan'; import { jwtStrategy } from './config/passport'; -import cors from 'cors'; -import httpStatus from 'http-status'; import { error, sentry } from './middlewares'; -import { ApiError } from './utils'; import routes from './routes/v1'; -import morgan from './config/morgan'; -import config from './config'; -import session from 'express-session'; -import { bullBoardServerAdapter } from './bullmq'; +import { ApiError } from './utils'; const app: Application = express(); @@ -44,6 +46,8 @@ app.use( }), ); +app.use(express.static(path.join(__dirname, 'public'))); + // jwt authentication app.use(passport.initialize()); passport.use('jwt', jwtStrategy); diff --git a/src/config/index.ts b/src/config/index.ts index 8a700549..3915b1dd 100644 --- a/src/config/index.ts +++ b/src/config/index.ts @@ -13,6 +13,7 @@ const envVarsSchema = Joi.object() RABBIT_PORT: Joi.string().required().description('RabbitMQ port'), RABBIT_USER: Joi.string().required().description('RabbitMQ username'), RABBIT_PASSWORD: Joi.string().required().description('RabbitMQ password'), + TELEGRAM_BOT_TOKEN: Joi.string().required().description('Telegram bot token'), DISCORD_CLIENT_ID: Joi.string().required().description('Discord clinet id'), DISCORD_CLIENT_SECRET: Joi.string().required().description('Discord clinet secret'), DISCORD_BOT_TOKEN: Joi.string().required().description('Discord bot token'), @@ -134,6 +135,9 @@ export default { connect: envVars.NOTION_CONNECT_CALLBACK_URI, }, }, + telegram: { + botToken: envVars.TELEGRAM_BOT_TOKEN, + }, }, jwt: { secret: envVars.JWT_SECRET, diff --git a/src/controllers/auth.controller.ts b/src/controllers/auth.controller.ts index 96681e4a..95118d5c 100644 --- a/src/controllers/auth.controller.ts +++ b/src/controllers/auth.controller.ts @@ -2,13 +2,11 @@ import { Request, Response } from 'express'; import httpStatus from 'http-status'; import querystring from 'querystring'; -import { PlatformNames } from '@togethercrew.dev/db'; - import config from '../config'; import logger from '../config/logger'; import { discord, generateState } from '../config/oAtuh2'; -import { ISessionRequest } from '../interfaces'; -import { authService, discordServices, tokenService } from '../services'; +import { ISessionRequest, TelegramCallbackParams } from '../interfaces'; +import { authService, discordServices, telegramService, tokenService } from '../services'; import { catchAsync } from '../utils'; const discordAuthorize = catchAsync(async function (req: ISessionRequest, res: Response) { @@ -24,9 +22,7 @@ const discordAuthorizeCallback = catchAsync(async function (req: ISessionRequest const code = req.query.code as string; const returnedState = req.query.state as string; const storedState = req.session.state; - const provider = PlatformNames.Discord; - - const redirectUrl = await discordServices.authService.handleOAuthCallback(provider, { + const redirectUrl = await discordServices.authService.handleOAuthCallback({ code, state: returnedState, storedState, @@ -35,7 +31,6 @@ const discordAuthorizeCallback = catchAsync(async function (req: ISessionRequest res.redirect(redirectUrl); } catch (err) { logger.error({ err }, 'Failed to authorize Discord account'); - const params = { statusCode: 1003, }; @@ -44,6 +39,23 @@ const discordAuthorizeCallback = catchAsync(async function (req: ISessionRequest } }); +const telegramAuthorizeCallback = catchAsync(async function (req: Request, res: Response) { + try { + const params: TelegramCallbackParams = req.query as unknown as TelegramCallbackParams; + + const redirectUrl = await telegramService.authService.handleOAuthCallback(params); + res.redirect(redirectUrl); + } catch (err) { + logger.error({ err }, 'Failed to authorize Telegram account'); + + const params = { + statusCode: 1012, + }; + const query = querystring.stringify(params); + res.redirect(`${config.frontend.url}/callback?${query}`); + } +}); + const logout = catchAsync(async function (req: Request, res: Response) { const { refreshToken } = req.body; await authService.logout(refreshToken); @@ -60,10 +72,6 @@ const generateToken = catchAsync(async function (req: Request, res: Response) { res.send(token); }); -const telegramAuthorizeCallback = catchAsync(async function (req: Request, res: Response) { - console.log(req.body, req.query, req.params); - res.send('Hi'); -}); export default { discordAuthorize, discordAuthorizeCallback, diff --git a/src/interfaces/Telegram.interface.ts b/src/interfaces/Telegram.interface.ts new file mode 100644 index 00000000..0a6e4632 --- /dev/null +++ b/src/interfaces/Telegram.interface.ts @@ -0,0 +1,10 @@ +export interface TelegramCallbackParams { + id: string; + first_name?: string; + last_name?: string; + username?: string; + photo_url?: string; + auth_date: string; + hash: string; + [key: string]: string | undefined; +} diff --git a/src/interfaces/index.ts b/src/interfaces/index.ts index 5f276a5d..6a61a131 100644 --- a/src/interfaces/index.ts +++ b/src/interfaces/index.ts @@ -6,3 +6,4 @@ export * from './Guild.interface'; export * from './Twitter.interface'; export * from './Role.interface'; export * from './Airflow.interface'; +export * from './Telegram.interface'; diff --git a/src/public/index.html b/src/public/index.html new file mode 100644 index 00000000..36a29ee9 --- /dev/null +++ b/src/public/index.html @@ -0,0 +1,41 @@ + + + + + + Telegram Login + + + +
+

Login with Telegram

+

Click the button below to log in using your Telegram account:

+ + +
+ + diff --git a/src/routes/v1/auth.route.ts b/src/routes/v1/auth.route.ts index 625ea8d5..ffb29924 100644 --- a/src/routes/v1/auth.route.ts +++ b/src/routes/v1/auth.route.ts @@ -9,7 +9,7 @@ const router = express.Router(); // Routes router.get('/discord/authorize', authController.discordAuthorize); router.get('/discord/authorize/callback', authController.discordAuthorizeCallback); -router.get('/telegram/authorize/callback', authController.discordAuthorizeCallback); +router.get('/telegram/authorize/callback', authController.telegramAuthorizeCallback); router.post('/generate-token', auth(), validate(authValidation.generateToken), authController.generateToken); router.post('/logout', validate(authValidation.logout), authController.logout); diff --git a/src/services/discord/auth.service.ts b/src/services/discord/auth.service.ts index 6d889644..6cb119a0 100644 --- a/src/services/discord/auth.service.ts +++ b/src/services/discord/auth.service.ts @@ -16,7 +16,7 @@ interface OAuthCallbackParams { storedState: string; } -const handleOAuthCallback = async (provider: PlatformNames, params: OAuthCallbackParams) => { +const handleOAuthCallback = async (params: OAuthCallbackParams) => { const { code, state: returnedState, storedState } = params; let statusCode = STATUS_CODE_LOGIN; @@ -28,9 +28,9 @@ const handleOAuthCallback = async (provider: PlatformNames, params: OAuthCallbac const discordUser = await coreService.getUserFromDiscordAPI(oauthCallbackData.access_token); const userId = discordUser.id; - let user = await userService.getUserByIdentity(provider, userId); + let user = await userService.getUserByIdentity(PlatformNames.Discord, userId); if (!user) { - user = await userService.createUserWithIdentity(provider, userId); + user = await userService.createUserWithIdentity(PlatformNames.Discord, userId); statusCode = STATUS_CODE_SIGNIN; } tokenService.saveDiscordOAuth2Tokens(user.id, oauthCallbackData); diff --git a/src/services/telegram/auth.service.ts b/src/services/telegram/auth.service.ts new file mode 100644 index 00000000..6249a41f --- /dev/null +++ b/src/services/telegram/auth.service.ts @@ -0,0 +1,71 @@ +import crypto from 'crypto'; +import querystring from 'querystring'; + +import { PlatformNames } from '@togethercrew.dev/db'; + +import config from '../../config'; +import { TelegramCallbackParams } from '../../interfaces'; +import tokenService from '../token.service'; +import userService from '../user.service'; + +const STATUS_CODE_SIGNIN = 1010; +const STATUS_CODE_LOGIN = 1011; + +/** + * Verifies the authorization hash provided by Telegram. + * @param hash - The hash received from Telegram. + * @param dataCheckString - The data string used to calculate the hash. + * @throws Will throw an error if the calculated hash does not match the provided hash. + */ +const checkAuthorization = async (hash: string, dataCheckString: string): Promise => { + const secretKey = crypto.createHash('sha256').update(config.oAuth2.telegram.botToken).digest(); + + const hmac = crypto.createHmac('sha256', secretKey); + hmac.update(dataCheckString); + const calculatedHash = hmac.digest('hex'); + + if (calculatedHash !== hash) { + throw new Error('Data is NOT from Telegram'); + } +}; + +/** + * Handles the OAuth callback from Telegram. + * @param params - The callback parameters from Telegram. + * @returns A URL string to redirect the user to the frontend application. + */ +const handleOAuthCallback = async (params: TelegramCallbackParams): Promise => { + let statusCode = STATUS_CODE_LOGIN; + + const { hash, ...data } = params; + + const sortedKeys = Object.keys(data).sort(); + const dataCheckString = sortedKeys.map((key) => `${key}=${data[key]}`).join('\n'); + + await checkAuthorization(hash, dataCheckString); + + const userId = data.id; + let user = await userService.getUserByIdentity(PlatformNames.Telegram, userId); + + if (!user) { + user = await userService.createUserWithIdentity(PlatformNames.Telegram, userId); + statusCode = STATUS_CODE_SIGNIN; + } + + const tokens = await tokenService.generateAuthTokens(user); + + const paramsToRedirect = { + statusCode, + accessToken: tokens.access.token, + accessExp: tokens.access.expires.toString(), + refreshToken: tokens.refresh.token, + refreshExp: tokens.refresh.expires.toString(), + }; + + const query = querystring.stringify(paramsToRedirect); + return `${config.frontend.url}/callback?${query}`; +}; + +export default { + handleOAuthCallback, +}; diff --git a/src/services/telegram/index.ts b/src/services/telegram/index.ts index c1adf8fd..471f4ca1 100644 --- a/src/services/telegram/index.ts +++ b/src/services/telegram/index.ts @@ -1,3 +1,4 @@ +import authService from './auth.service'; import heatmapService from './heatmap.service'; import memberActivityService from './memberActivity.service'; import membersService from './members.service'; @@ -6,4 +7,5 @@ export default { heatmapService, memberActivityService, membersService, + authService, }; From b2f75cf17cebbfd317854df107e5757b543d4780 Mon Sep 17 00:00:00 2001 From: Behzad-rabiei Date: Mon, 27 Jan 2025 14:58:56 +0100 Subject: [PATCH 06/13] feat: update patch /platforms/:platformid route to adjust latest user schema changes --- src/controllers/platform.controller.ts | 73 +++++++++++++++----------- src/services/platform.service.ts | 53 +++++++++++++------ src/services/user.service.ts | 11 ++++ 3 files changed, 89 insertions(+), 48 deletions(-) diff --git a/src/controllers/platform.controller.ts b/src/controllers/platform.controller.ts index f7da1bc9..512af1de 100644 --- a/src/controllers/platform.controller.ts +++ b/src/controllers/platform.controller.ts @@ -1,24 +1,26 @@ import { Response } from 'express'; +import httpStatus from 'http-status'; +import querystring from 'querystring'; + +import { DatabaseManager, PlatformNames } from '@togethercrew.dev/db'; + +import config from '../config'; +import parentLogger from '../config/logger'; +import { discord, generateCodeChallenge, generateCodeVerifier, generateState, google, twitter } from '../config/oAtuh2'; +import { IAuthAndPlatform, ISessionRequest } from '../interfaces'; +import { IAuthRequest } from '../interfaces/Request.interface'; import { - platformService, - twitterService, discordServices, - googleService, - userService, - tokenService, + discourseService, githubService, + googleService, notionService, - discourseService, + platformService, + tokenService, + twitterService, + userService, } from '../services'; -import { IAuthRequest } from '../interfaces/Request.interface'; -import { catchAsync, pick, ApiError } from '../utils'; -import { generateState, generateCodeVerifier, generateCodeChallenge, twitter, discord, google } from '../config/oAtuh2'; -import { ISessionRequest, IAuthAndPlatform } from '../interfaces'; -import config from '../config'; -import httpStatus from 'http-status'; -import querystring from 'querystring'; -import parentLogger from '../config/logger'; -import { PlatformNames, DatabaseManager } from '@togethercrew.dev/db'; +import { ApiError, catchAsync, pick } from '../utils'; const logger = parentLogger.child({ module: 'PlatformController' }); @@ -321,24 +323,14 @@ const getPlatform = catchAsync(async function (req: IAuthRequest, res: Response) res.send(platform); }); const updatePlatform = catchAsync(async function (req: IAuthAndPlatform, res: Response) { - if ( - req.platform.name === PlatformNames.Discord && - req.platform.metadata?.isInProgress && - (req.body.metadata.selectedChannels || req.body.metadata.period) - ) { - throw new ApiError( - httpStatus.BAD_REQUEST, - 'Updating channels or date period is not allowed during server analysis.', - ); - } - - if (req.platform.name === PlatformNames.Discord && req.platform.metadata?.isFetchingInitialData) { - throw new ApiError( - httpStatus.BAD_REQUEST, - 'Updating channels or date periods is not allowed during the initial fetching of the server.', - ); + validatePlatformUpdate(req.platform, req.body); + if (req.platform.name === PlatformNames.Discord) { + const discordIdentity = userService.getIdentityByProvider(req.user.identities, PlatformNames.Discord); + if (discordIdentity) { + await platformService.notifyDiscordUserImportComplete(req.platform.id, discordIdentity.id); + } } - const platform = await platformService.updatePlatform(req.platform, req.body, req.user.discordId); + const platform = await platformService.updatePlatform(req.platform, req.body); res.send(platform); }); const deletePlatform = catchAsync(async function (req: IAuthAndPlatform, res: Response) { @@ -392,6 +384,23 @@ const requestAccess = catchAsync(async function (req: ISessionRequest, res: Resp res.redirect(discordUrl); } }); +const validatePlatformUpdate = (platform: IAuthAndPlatform['platform'], body: IAuthAndPlatform['body']) => { + if (platform.name !== PlatformNames.Discord) return; + + if (platform.metadata?.isInProgress && (body.metadata?.selectedChannels || body.metadata?.period)) { + throw new ApiError( + httpStatus.BAD_REQUEST, + 'Updating channels or date period is not allowed during server analysis.', + ); + } + + if (platform.metadata?.isFetchingInitialData && (body.metadata?.selectedChannels || body.metadata?.period)) { + throw new ApiError( + httpStatus.BAD_REQUEST, + 'Updating channels or date periods is not allowed during the initial fetching of the server.', + ); + } +}; export default { createPlatform, diff --git a/src/services/platform.service.ts b/src/services/platform.service.ts index 0f8ac3b2..5b96cf71 100644 --- a/src/services/platform.service.ts +++ b/src/services/platform.service.ts @@ -1,12 +1,16 @@ -import { HydratedDocument, Types, FilterQuery } from 'mongoose'; +import { Snowflake } from 'discord.js'; import httpStatus from 'http-status'; -import { Platform, IPlatform } from '@togethercrew.dev/db'; +import { FilterQuery, HydratedDocument, Types } from 'mongoose'; + +import { IPlatform, Platform, PlatformNames } from '@togethercrew.dev/db'; + +import { analyzerAction, analyzerWindow } from '../config/analyzer.statics'; +import parentLogger from '../config/logger'; import ApiError from '../utils/ApiError'; -import sagaService from './saga.service'; import discourseService from './discourse'; -import { Snowflake } from 'discord.js'; -import { analyzerAction, analyzerWindow } from '../config/analyzer.statics'; -import { PlatformNames } from '@togethercrew.dev/db'; +import sagaService from './saga.service'; + +const logger = parentLogger.child({ module: 'PlatformService' }); /** * Create a platform @@ -116,7 +120,6 @@ const updatePlatformByFilter = async ( const updatePlatform = async ( platform: HydratedDocument, updateBody: Partial, - userDiscordId?: Snowflake, ): Promise> => { if (updateBody.metadata) { updateBody.metadata = { @@ -124,15 +127,6 @@ const updatePlatform = async ( ...updateBody.metadata, }; } - if ((updateBody.metadata?.period || updateBody.metadata?.selectedChannels) && userDiscordId) { - await sagaService.createAndStartGuildSaga(platform._id, { - created: false, - discordId: userDiscordId, - message: - 'Your data import into TogetherCrew is complete! See your insights on your dashboard https://app.togethercrew.com/. If you have questions send a DM to katerinabc (Discord) or k_bc0 (Telegram).', - useFallback: true, - }); - } Object.assign(platform, updateBody); return await platform.save(); @@ -266,6 +260,32 @@ const managePlatformConnection = async ( ); }; +/** + * Sends a notification to the discord user upon successful data import. + * + * @param platformId - The ID of the platform. + * @param userDiscordId - The Discord ID of the user. + */ +const notifyDiscordUserImportComplete = async (platformId: Types.ObjectId, userDiscordId: Snowflake): Promise => { + const IMPORT_COMPLETE_MESSAGE = ` +Your data import into TogetherCrew is complete! +See your insights on your dashboard: https://app.togethercrew.com/. +If you have questions, send a DM to katerinabc (Discord) or k_bc0 (Telegram). +`; + + try { + await sagaService.createAndStartGuildSaga(platformId, { + created: false, + discordId: userDiscordId, + message: IMPORT_COMPLETE_MESSAGE.trim(), + useFallback: true, + }); + logger.info(`Notification sent to Discord ID: ${userDiscordId}`); + } catch (error) { + logger.error(error, `Failed to send notification to Discord ID: ${userDiscordId}`); + } +}; + export default { createPlatform, getPlatformById, @@ -277,4 +297,5 @@ export default { deletePlatformByFilter, managePlatformConnection, callExtractionApp, + notifyDiscordUserImportComplete, }; diff --git a/src/services/user.service.ts b/src/services/user.service.ts index d8a4efe4..2f9c5b13 100644 --- a/src/services/user.service.ts +++ b/src/services/user.service.ts @@ -151,6 +151,16 @@ const addIdentityToUser = async (userId: Types.ObjectId, identity: IIdentity): P return user; }; +/** + * Get a specific identity from a user's identities by provider. + * @param {IIdentity[]} identities - The list of user identities. + * @param {PlatformNames} provider - The provider name to search for. + * @returns {IIdentity | undefined} - The matching identity or undefined if not found. + */ +const getIdentityByProvider = (identities: IIdentity[], provider: PlatformNames): IIdentity | undefined => { + return identities.find((identity) => identity.provider === provider); +}; + export default { createUser, getUserById, @@ -162,4 +172,5 @@ export default { getUserByIdentity, createUserWithIdentity, addIdentityToUser, + getIdentityByProvider, }; From b14ce865a6f54ed79a57d8b0f93c7874cf4249ff Mon Sep 17 00:00:00 2001 From: Behzad-rabiei Date: Mon, 27 Jan 2025 15:12:23 +0100 Subject: [PATCH 07/13] feat: update the utility to handle role assignments based on the new identities schema --- src/utils/role.util.ts | 33 ++++++++++++++++++++++++++------- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/src/utils/role.util.ts b/src/utils/role.util.ts index a0497454..6efa21d9 100644 --- a/src/utils/role.util.ts +++ b/src/utils/role.util.ts @@ -1,19 +1,33 @@ -import { HydratedDocument, Types } from 'mongoose'; -import { ICommunity, IPlatform, IUser, PlatformNames, DatabaseManager } from '@togethercrew.dev/db'; -import { discordServices, platformService } from '../services'; +import { HydratedDocument } from 'mongoose'; + +import { DatabaseManager, ICommunity, IUser, PlatformNames } from '@togethercrew.dev/db'; + import { UserRole } from '../interfaces'; +import { discordServices, platformService, userService } from '../services'; + /** * Get user roles in a community * @param {HydratedDocument} user - * @param {HydratedDocument} communityId - * @returns {Promise>} + * @param {HydratedDocument} community + * @returns {Promise} */ -async function getUserRolesForCommunity(user: HydratedDocument, community: HydratedDocument) { +async function getUserRolesForCommunity( + user: HydratedDocument, + community: HydratedDocument, +): Promise { let userRoles: UserRole[] = []; + + const discordIdentity = userService.getIdentityByProvider(user.identities, PlatformNames.Discord); + if (community !== null) { if (community.users.some((id) => id.equals(user.id))) { userRoles.push('admin'); + + if (!discordIdentity) { + return userRoles; + } } + const connectedPlatformDoc = await platformService.getPlatformByFilter({ community: community.id, disconnectedAt: null, @@ -21,8 +35,13 @@ async function getUserRolesForCommunity(user: HydratedDocument, community }); if (connectedPlatformDoc !== null) { const guildConnection = await DatabaseManager.getInstance().getGuildDb(connectedPlatformDoc.metadata?.id); + + if (!discordIdentity) { + return userRoles; + } + const guildMemberDoc = await discordServices.guildMemberService.getGuildMember(guildConnection, { - discordId: user.discordId, + discordId: discordIdentity.id, }); if (community.roles) { for (let i = 0; i < community.roles?.length; i++) { From 12bb134cec54f4fdfb37b013c3f791946b68a247 Mon Sep 17 00:00:00 2001 From: Behzad-rabiei Date: Tue, 28 Jan 2025 10:32:39 +0100 Subject: [PATCH 08/13] style: format the code --- src/controllers/platform.controller.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/controllers/platform.controller.ts b/src/controllers/platform.controller.ts index 512af1de..9864fb76 100644 --- a/src/controllers/platform.controller.ts +++ b/src/controllers/platform.controller.ts @@ -327,6 +327,7 @@ const updatePlatform = catchAsync(async function (req: IAuthAndPlatform, res: Re if (req.platform.name === PlatformNames.Discord) { const discordIdentity = userService.getIdentityByProvider(req.user.identities, PlatformNames.Discord); if (discordIdentity) { + console.log(req.platform.id, discordIdentity.id); await platformService.notifyDiscordUserImportComplete(req.platform.id, discordIdentity.id); } } From 0991e9ae237df31c98a805a1c0de3f8bef6f9ac7 Mon Sep 17 00:00:00 2001 From: Behzad-rabiei Date: Tue, 28 Jan 2025 12:43:49 +0100 Subject: [PATCH 09/13] refactor: remove no needed code --- src/app.ts | 3 -- src/controllers/platform.controller.ts | 16 ++++------ src/public/index.html | 41 -------------------------- 3 files changed, 5 insertions(+), 55 deletions(-) delete mode 100644 src/public/index.html diff --git a/src/app.ts b/src/app.ts index 2a23a8c6..25105ef7 100644 --- a/src/app.ts +++ b/src/app.ts @@ -5,7 +5,6 @@ import session from 'express-session'; import helmet from 'helmet'; import httpStatus from 'http-status'; import passport from 'passport'; -import path from 'path'; import { bullBoardServerAdapter } from './bullmq'; import config from './config'; @@ -46,8 +45,6 @@ app.use( }), ); -app.use(express.static(path.join(__dirname, 'public'))); - // jwt authentication app.use(passport.initialize()); passport.use('jwt', jwtStrategy); diff --git a/src/controllers/platform.controller.ts b/src/controllers/platform.controller.ts index 9864fb76..94f63479 100644 --- a/src/controllers/platform.controller.ts +++ b/src/controllers/platform.controller.ts @@ -6,19 +6,14 @@ import { DatabaseManager, PlatformNames } from '@togethercrew.dev/db'; import config from '../config'; import parentLogger from '../config/logger'; -import { discord, generateCodeChallenge, generateCodeVerifier, generateState, google, twitter } from '../config/oAtuh2'; +import { + discord, generateCodeChallenge, generateCodeVerifier, generateState, google, twitter +} from '../config/oAtuh2'; import { IAuthAndPlatform, ISessionRequest } from '../interfaces'; import { IAuthRequest } from '../interfaces/Request.interface'; import { - discordServices, - discourseService, - githubService, - googleService, - notionService, - platformService, - tokenService, - twitterService, - userService, + discordServices, discourseService, githubService, googleService, notionService, platformService, + tokenService, twitterService, userService } from '../services'; import { ApiError, catchAsync, pick } from '../utils'; @@ -327,7 +322,6 @@ const updatePlatform = catchAsync(async function (req: IAuthAndPlatform, res: Re if (req.platform.name === PlatformNames.Discord) { const discordIdentity = userService.getIdentityByProvider(req.user.identities, PlatformNames.Discord); if (discordIdentity) { - console.log(req.platform.id, discordIdentity.id); await platformService.notifyDiscordUserImportComplete(req.platform.id, discordIdentity.id); } } diff --git a/src/public/index.html b/src/public/index.html deleted file mode 100644 index 36a29ee9..00000000 --- a/src/public/index.html +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - Telegram Login - - - -
-

Login with Telegram

-

Click the button below to log in using your Telegram account:

- - -
- - From 8c1a69aae4069b9bf637da7bbc5b58256daacbd2 Mon Sep 17 00:00:00 2001 From: Behzad-rabiei Date: Tue, 28 Jan 2025 13:09:35 +0100 Subject: [PATCH 10/13] style: format the code --- src/controllers/platform.controller.ts | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/controllers/platform.controller.ts b/src/controllers/platform.controller.ts index 94f63479..512af1de 100644 --- a/src/controllers/platform.controller.ts +++ b/src/controllers/platform.controller.ts @@ -6,14 +6,19 @@ import { DatabaseManager, PlatformNames } from '@togethercrew.dev/db'; import config from '../config'; import parentLogger from '../config/logger'; -import { - discord, generateCodeChallenge, generateCodeVerifier, generateState, google, twitter -} from '../config/oAtuh2'; +import { discord, generateCodeChallenge, generateCodeVerifier, generateState, google, twitter } from '../config/oAtuh2'; import { IAuthAndPlatform, ISessionRequest } from '../interfaces'; import { IAuthRequest } from '../interfaces/Request.interface'; import { - discordServices, discourseService, githubService, googleService, notionService, platformService, - tokenService, twitterService, userService + discordServices, + discourseService, + githubService, + googleService, + notionService, + platformService, + tokenService, + twitterService, + userService, } from '../services'; import { ApiError, catchAsync, pick } from '../utils'; From 55ce2a0ac917c2f0f7456f090e06bc50bbe69eb4 Mon Sep 17 00:00:00 2001 From: Behzad-rabiei Date: Tue, 28 Jan 2025 15:14:20 +0100 Subject: [PATCH 11/13] chore: develop migration script --- .migrate | 6 +- .../1720532975152-add-isfetchingintialdata.ts | 31 -------- ...pdate-user-documents-for-telegram-login.ts | 78 +++++++++++++++++++ 3 files changed, 81 insertions(+), 34 deletions(-) delete mode 100644 src/migrations/db/1720532975152-add-isfetchingintialdata.ts create mode 100644 src/migrations/db/1738072787796-update-user-documents-for-telegram-login.ts diff --git a/.migrate b/.migrate index 821470e6..566ba032 100644 --- a/.migrate +++ b/.migrate @@ -1,9 +1,9 @@ { - "lastRun": "1720532975152-add-isfetchingintialdata.ts", + "lastRun": "1738072787796-update-user-documents-for-telegram-login.ts", "migrations": [ { - "title": "1720532975152-add-isfetchingintialdata.ts", - "timestamp": 1720533282435 + "title": "1738072787796-update-user-documents-for-telegram-login.ts", + "timestamp": 1738073593695 } ] } \ No newline at end of file diff --git a/src/migrations/db/1720532975152-add-isfetchingintialdata.ts b/src/migrations/db/1720532975152-add-isfetchingintialdata.ts deleted file mode 100644 index b4615fd5..00000000 --- a/src/migrations/db/1720532975152-add-isfetchingintialdata.ts +++ /dev/null @@ -1,31 +0,0 @@ -import 'dotenv/config'; -import mongoose from 'mongoose'; -import config from '../../config'; -import logger from '../../config/logger'; -import { Platform, PlatformNames } from '@togethercrew.dev/db'; - -const connectToMongoDB = async () => { - try { - await mongoose.connect(config.mongoose.serverURL); - - logger.info('Connected to MongoDB!'); - } catch (error) { - logger.fatal('Failed to connect to MongoDB!'); - } -}; - -export const up = async () => { - // Connect to MongoDB - await connectToMongoDB(); - const discordPlatforms = await Platform.find({ name: PlatformNames.Discord }); - for (let i = 0; i < discordPlatforms.length; i++) { - const platform = discordPlatforms[i]; - if (platform?.metadata) { - platform.metadata.isFetchingInitialData = false; - platform.markModified('metadata'); - await platform.save(); - } - } -}; - -export const down = async () => {}; diff --git a/src/migrations/db/1738072787796-update-user-documents-for-telegram-login.ts b/src/migrations/db/1738072787796-update-user-documents-for-telegram-login.ts new file mode 100644 index 00000000..5160febb --- /dev/null +++ b/src/migrations/db/1738072787796-update-user-documents-for-telegram-login.ts @@ -0,0 +1,78 @@ +import 'dotenv/config'; + +import mongoose from 'mongoose'; + +import { PlatformNames, User } from '@togethercrew.dev/db'; + +import config from '../../config'; +import logger from '../../config/logger'; + +async function connectToMongoDB() { + try { + await mongoose.connect(config.mongoose.serverURL); + logger.info('Connected to MongoDB!'); + } catch (error) { + logger.fatal('Failed to connect to MongoDB!'); + throw error; + } +} + +export const up = async () => { + await connectToMongoDB(); + + // This single pipeline: + // 1) sets `identities` to an array containing { provider: 'discord', id: '$discordId' } + // 2) unsets the old `discordId` and `email` fields + const result = await User.updateMany( + { + discordId: { $exists: true }, + }, + [ + { + $set: { + identities: [ + { + provider: PlatformNames.Discord, + id: '$discordId', + }, + ], + }, + }, + { + $unset: ['discordId', 'email'], + }, + ], + ); + + logger.info(`Up migration: modified ${result.modifiedCount} user(s).`); + + await mongoose.connection.close(); +}; + +export const down = async () => { + await connectToMongoDB(); + + // We'll do a quick find() and loop if you want to revert, because the pipeline + // would need to parse out "discordId" from identities. + const users = await User.find({ + identities: { $exists: true, $ne: [] }, + }); + + for (const userDoc of users) { + // cast to any or .get('...') + const user: any = userDoc; + + const discordIdentity = user.identities.find((identity: any) => identity.provider === PlatformNames.Discord); + if (discordIdentity) { + user.discordId = discordIdentity.id; + } + user.identities = []; + + // If needed, re-add `email` from some backup, if you have it. + user.markModified('identities'); + await user.save(); + } + + logger.info('Down migration: successfully reverted to old schema.'); + await mongoose.connection.close(); +}; From 396b28f66de948ef90af1f8dd82245174cdd19f7 Mon Sep 17 00:00:00 2001 From: Behzad-rabiei Date: Wed, 29 Jan 2025 09:35:51 +0100 Subject: [PATCH 12/13] fix: fix bugs --- src/services/user.service.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/services/user.service.ts b/src/services/user.service.ts index 2f9c5b13..fbf584b9 100644 --- a/src/services/user.service.ts +++ b/src/services/user.service.ts @@ -93,13 +93,13 @@ const addCommunityToUserById = async (userId: Types.ObjectId, communityId: Types /** * Get user by provider and providerId * @param {string} provider - The authentication provider (e.g., 'discord') - * @param {string} providerId - The unique ID from the provider + * @param {string} userId - The unique ID from the provider * @returns {Promise | null>} */ -const getUserByIdentity = async (provider: string, providerId: string): Promise | null> => { +const getUserByIdentity = async (provider: PlatformNames, userId: string): Promise | null> => { return User.findOne({ identities: { - $elemMatch: { provider, id: providerId }, + $elemMatch: { provider, id: userId }, }, }); }; @@ -107,7 +107,7 @@ const getUserByIdentity = async (provider: string, providerId: string): Promise< /** * Create a user with a specific identity * @param {string} provider - The authentication provider (e.g., 'discord') - * @param {string} providerId - The unique ID from the provider + * @param {string} userId - The unique ID from the provider * @param {Partial} additionalData - Any additional user data * @returns {Promise>} */ From 929038c811b772b52e49a0c7f2ce450ebb95427e Mon Sep 17 00:00:00 2001 From: Behzad-rabiei Date: Wed, 29 Jan 2025 10:41:45 +0100 Subject: [PATCH 13/13] fix: fix bugs --- src/controllers/auth.controller.ts | 2 +- src/services/telegram/auth.service.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/controllers/auth.controller.ts b/src/controllers/auth.controller.ts index 95118d5c..5b8ab605 100644 --- a/src/controllers/auth.controller.ts +++ b/src/controllers/auth.controller.ts @@ -49,7 +49,7 @@ const telegramAuthorizeCallback = catchAsync(async function (req: Request, res: logger.error({ err }, 'Failed to authorize Telegram account'); const params = { - statusCode: 1012, + statusCode: 1003, }; const query = querystring.stringify(params); res.redirect(`${config.frontend.url}/callback?${query}`); diff --git a/src/services/telegram/auth.service.ts b/src/services/telegram/auth.service.ts index 6249a41f..26f8f26b 100644 --- a/src/services/telegram/auth.service.ts +++ b/src/services/telegram/auth.service.ts @@ -8,8 +8,8 @@ import { TelegramCallbackParams } from '../../interfaces'; import tokenService from '../token.service'; import userService from '../user.service'; -const STATUS_CODE_SIGNIN = 1010; -const STATUS_CODE_LOGIN = 1011; +const STATUS_CODE_SIGNIN = 1001; +const STATUS_CODE_LOGIN = 1002; /** * Verifies the authorization hash provided by Telegram.