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, }, }) })