From 330a9c8e3a91f7d12da4656b9799932748de9207 Mon Sep 17 00:00:00 2001 From: Domagoj Kriskovic Date: Wed, 8 Nov 2023 14:29:03 +0100 Subject: [PATCH] Store ODC form results in onboardingDataCollection (#15609) * registration/onboarding page * show only if in split test group * rate limiter, skip errors * fix storybook logo * remove skip payload * fix typos * prettier * store ODC form results in onboardingDataCollection * add userId * prettier * pick what properties should be stored * remove unused props * remove userId index * update user profile * update user profile * use setOp * added test * remove userId from schema * clean after user delete * mock unit test * limit to 255 chars * updatedAt field * prettier * firstName, lastName as separate vars * move subscribe at the end * check if user exists GitOrigin-RevId: 6d76927e97b5f4ed664ffb9b8806b3516c77eb9b --- .../OnboardingDataCollectionManager.js | 45 +++++++++++++++++++ .../web/app/src/Features/User/UserDeleter.js | 2 + .../web/app/src/infrastructure/mongodb.js | 3 ++ .../src/models/OnboardingDataCollection.js | 24 ++++++++++ .../test/unit/src/User/UserDeleterTests.js | 6 +++ 5 files changed, 80 insertions(+) create mode 100644 services/web/app/src/Features/OnboardingDataCollection/OnboardingDataCollectionManager.js create mode 100644 services/web/app/src/models/OnboardingDataCollection.js diff --git a/services/web/app/src/Features/OnboardingDataCollection/OnboardingDataCollectionManager.js b/services/web/app/src/Features/OnboardingDataCollection/OnboardingDataCollectionManager.js new file mode 100644 index 0000000000..32e09b283b --- /dev/null +++ b/services/web/app/src/Features/OnboardingDataCollection/OnboardingDataCollectionManager.js @@ -0,0 +1,45 @@ +const { + OnboardingDataCollection, +} = require('../../models/OnboardingDataCollection') +const OError = require('@overleaf/o-error') + +async function getOnboardingDataCollection(userId) { + try { + return await OnboardingDataCollection.findOne({ _id: userId }).exec() + } catch (error) { + throw OError.tag(error, 'Failed to get OnboardingDataCollection') + } +} + +async function upsertOnboardingDataCollection({ + userId, + firstName, + lastName, + usedLatex, + primaryOccupation, + updatedAt, +}) { + const odc = await OnboardingDataCollection.findOneAndUpdate( + { _id: userId }, + { + firstName, + lastName, + usedLatex, + primaryOccupation, + updatedAt, + }, + { upsert: true } + ) + + return odc +} + +function deleteOnboardingDataCollection(id) { + return OnboardingDataCollection.deleteOne({ _id: id }) +} + +module.exports = { + getOnboardingDataCollection, + upsertOnboardingDataCollection, + deleteOnboardingDataCollection, +} diff --git a/services/web/app/src/Features/User/UserDeleter.js b/services/web/app/src/Features/User/UserDeleter.js index 1edde4e4b9..40b269d248 100644 --- a/services/web/app/src/Features/User/UserDeleter.js +++ b/services/web/app/src/Features/User/UserDeleter.js @@ -15,6 +15,7 @@ const UserSessionsManager = require('./UserSessionsManager') const InstitutionsAPI = require('../Institutions/InstitutionsAPI') const Modules = require('../../infrastructure/Modules') const Errors = require('../Errors/Errors') +const OnboardingDataCollectionManager = require('../OnboardingDataCollection/OnboardingDataCollectionManager') module.exports = { deleteUser: callbackify(deleteUser), @@ -72,6 +73,7 @@ async function expireDeletedUser(userId) { }).exec() await Feedback.deleteMany({ userId }).exec() + await OnboardingDataCollectionManager.deleteOnboardingDataCollection(userId) deletedUser.user = undefined deletedUser.deleterData.deleterIpAddress = undefined diff --git a/services/web/app/src/infrastructure/mongodb.js b/services/web/app/src/infrastructure/mongodb.js index f48c125cd3..a4e95fe8ec 100644 --- a/services/web/app/src/infrastructure/mongodb.js +++ b/services/web/app/src/infrastructure/mongodb.js @@ -81,6 +81,9 @@ async function setupDb() { db.userAuditLogEntries = internalDb.collection('userAuditLogEntries') db.users = internalDb.collection('users') db.userstubs = internalDb.collection('userstubs') + db.onboardingDataCollection = internalDb.collection( + 'onboardingDataCollection' + ) } async function getCollectionNames() { diff --git a/services/web/app/src/models/OnboardingDataCollection.js b/services/web/app/src/models/OnboardingDataCollection.js new file mode 100644 index 0000000000..e54b8254eb --- /dev/null +++ b/services/web/app/src/models/OnboardingDataCollection.js @@ -0,0 +1,24 @@ +const mongoose = require('../infrastructure/Mongoose') +const { Schema } = mongoose + +const OnboardingDataCollectionSchema = new Schema( + { + firstName: { type: String, default: null }, + lastName: { type: String, default: null }, + primaryOccupation: { type: String, default: null }, + usedLatex: { type: String, default: null }, + updatedAt: { type: Date, default: Date.now }, + }, + { + collection: 'onboardingDataCollection', + minimize: false, + } +) + +module.exports = { + OnboardingDataCollection: mongoose.model( + 'OnboardingDataCollection', + OnboardingDataCollectionSchema + ), + OnboardingDataCollectionSchema, +} diff --git a/services/web/test/unit/src/User/UserDeleterTests.js b/services/web/test/unit/src/User/UserDeleterTests.js index 146faa0967..5f96dc36f9 100644 --- a/services/web/test/unit/src/User/UserDeleterTests.js +++ b/services/web/test/unit/src/User/UserDeleterTests.js @@ -96,6 +96,10 @@ describe('UserDeleter', function () { deleteMany: sinon.stub().returns({ exec: sinon.stub().resolves() }), } + this.OnboardingDataCollectionManager = { + deleteOnboardingDataCollection: sinon.stub().resolves(), + } + this.UserDeleter = SandboxedModule.require(modulePath, { requires: { '../../models/User': { User }, @@ -113,6 +117,8 @@ describe('UserDeleter', function () { UserAuditLogEntry: this.UserAuditLogEntry, }, '../../infrastructure/Modules': this.Modules, + '../OnboardingDataCollection/OnboardingDataCollectionManager': + this.OnboardingDataCollectionManager, }, }) })