Skip to content

Commit 66931d9

Browse files
authored
feat: migrate data to first user (#26)
* refactor: use /api for auth routes * fix: use user id instead of username * feat: migrate data to first user on register
1 parent 86bf225 commit 66931d9

File tree

11 files changed

+91
-75
lines changed

11 files changed

+91
-75
lines changed

api/models/User.js

Lines changed: 12 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ const userSchema = mongoose.Schema(
2424
username: {
2525
type: String,
2626
lowercase: true,
27-
unique: true,
2827
required: [true, "can't be blank"],
2928
match: [/^[a-zA-Z0-9_]+$/, 'is invalid'],
3029
index: true
@@ -121,42 +120,18 @@ userSchema.methods.generateToken = function () {
121120
return token;
122121
};
123122

124-
// userSchema.methods.generateRefreshToken = function () {
125-
// const refreshToken = jwt.sign(
126-
// {
127-
// id: this._id,
128-
// username: this.username,
129-
// provider: this.provider,
130-
// email: this.email
131-
// },
132-
// refreshSecret,
133-
// { expiresIn: eval(process.env.REFRESH_TOKEN_EXPIRY) }
134-
// );
135-
// log({
136-
// title: 'Generate Refresh Token',
137-
// parameters: [
138-
// { name: 'refreshToken', value: refreshToken },
139-
// { name: 'user', value: this.user }
140-
// ]
141-
// });
142-
// return refreshToken;
143-
// };
144-
145-
userSchema.methods.registerUser = (newUser, callback) => {
146-
log({
147-
title: 'Register User',
148-
parameters: [{ name: 'newUser', value: newUser }]
149-
});
150-
bcrypt.genSalt(10, (err, salt) => {
151-
bcrypt.hash(newUser.password, salt, (errh, hash) => {
152-
if (err) {
153-
console.log(err);
154-
}
155-
// set pasword to hash
156-
newUser.password = hash;
157-
newUser.save(callback);
158-
});
159-
});
123+
userSchema.methods.generateRefreshToken = function () {
124+
const refreshToken = jwt.sign(
125+
{
126+
id: this._id,
127+
username: this.username,
128+
provider: this.provider,
129+
email: this.email
130+
},
131+
refreshSecret,
132+
{ expiresIn: eval(process.env.REFRESH_TOKEN_EXPIRY) }
133+
);
134+
return refreshToken;
160135
};
161136

162137
userSchema.methods.comparePassword = function (candidatePassword, callback) {

api/server/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ const projectPath = path.join(__dirname, '..', '..', 'client');
3838
}
3939

4040
// api endpoint
41-
app.use('/auth', routes.auth);
41+
app.use('/api/auth', routes.auth);
4242
app.use('/api/search', routes.search);
4343
app.use('/api/ask', routes.ask);
4444
app.use('/api/messages', routes.messages);

api/server/routes/ask/askBingAI.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ router.post('/', requireJwtAuth, async (req, res) => {
6363

6464
if (!overrideParentMessageId) {
6565
await saveMessage(userMessage);
66-
await saveConvo(req.user.username, {
66+
await saveConvo(req.user.id, {
6767
...userMessage,
6868
...endpointOption,
6969
conversationId,
@@ -206,7 +206,7 @@ const ask = async ({
206206
conversationUpdate.invocationId = response.invocationId;
207207
}
208208

209-
await saveConvo(req.user.username, conversationUpdate);
209+
await saveConvo(req.user.id, conversationUpdate);
210210
conversationId = newConversationId;
211211

212212
// STEP3 update the user message
@@ -219,9 +219,9 @@ const ask = async ({
219219
userMessageId = newUserMassageId;
220220

221221
sendMessage(res, {
222-
title: await getConvoTitle(req.user.username, conversationId),
222+
title: await getConvoTitle(req.user.id, conversationId),
223223
final: true,
224-
conversation: await getConvo(req.user.username, conversationId),
224+
conversation: await getConvo(req.user.id, conversationId),
225225
requestMessage: userMessage,
226226
responseMessage: responseMessage
227227
});
@@ -230,7 +230,7 @@ const ask = async ({
230230
if (userParentMessageId == '00000000-0000-0000-0000-000000000000') {
231231
const title = await titleConvo({ endpoint: endpointOption?.endpoint, text, response: responseMessage });
232232

233-
await saveConvo(req.user.username, {
233+
await saveConvo(req.user.id, {
234234
conversationId: conversationId,
235235
title
236236
});

api/server/routes/ask/askChatGPTBrowser.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ router.post('/', requireJwtAuth, async (req, res) => {
5050

5151
if (!overrideParentMessageId) {
5252
await saveMessage(userMessage);
53-
await saveConvo(req.user.username, {
53+
await saveConvo(req.user.id, {
5454
...userMessage,
5555
...endpointOption,
5656
conversationId,
@@ -169,7 +169,7 @@ const ask = async ({
169169
};
170170
}
171171

172-
await saveConvo(req.user.username, conversationUpdate);
172+
await saveConvo(req.user.id, conversationUpdate);
173173
conversationId = newConversationId;
174174

175175
// STEP3 update the user message
@@ -182,9 +182,9 @@ const ask = async ({
182182
userMessageId = newUserMassageId;
183183

184184
sendMessage(res, {
185-
title: await getConvoTitle(req.user.username, conversationId),
185+
title: await getConvoTitle(req.user.id, conversationId),
186186
final: true,
187-
conversation: await getConvo(req.user.username, conversationId),
187+
conversation: await getConvo(req.user.id, conversationId),
188188
requestMessage: userMessage,
189189
responseMessage: responseMessage
190190
});
@@ -193,7 +193,7 @@ const ask = async ({
193193
if (userParentMessageId == '00000000-0000-0000-0000-000000000000') {
194194
// const title = await titleConvo({ endpoint: endpointOption?.endpoint, text, response: responseMessage });
195195
const title = await response.details.title;
196-
await saveConvo(req.user.username, {
196+
await saveConvo(req.user.id, {
197197
conversationId: conversationId,
198198
title
199199
});

api/server/routes/ask/askOpenAI.js

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ router.post('/', requireJwtAuth, async (req, res) => {
7575

7676
if (!overrideParentMessageId) {
7777
await saveMessage(userMessage);
78-
await saveConvo(req.user.username, {
78+
await saveConvo(req.user.id, {
7979
...userMessage,
8080
...endpointOption,
8181
conversationId,
@@ -160,9 +160,9 @@ const ask = async ({
160160
await addToCache({ endpoint: 'openAI', endpointOption, userMessage, responseMessage });
161161

162162
return {
163-
title: await getConvoTitle(req.user.username, conversationId),
163+
title: await getConvoTitle(req.user.id, conversationId),
164164
final: true,
165-
conversation: await getConvo(req.user.username, conversationId),
165+
conversation: await getConvo(req.user.id, conversationId),
166166
requestMessage: userMessage,
167167
responseMessage: responseMessage
168168
};
@@ -226,7 +226,7 @@ const ask = async ({
226226
};
227227
}
228228

229-
await saveConvo(req.user.username, conversationUpdate);
229+
await saveConvo(req.user.id, conversationUpdate);
230230
conversationId = newConversationId;
231231

232232
// STEP3 update the user message
@@ -239,17 +239,17 @@ const ask = async ({
239239
userMessageId = newUserMassageId;
240240

241241
sendMessage(res, {
242-
title: await getConvoTitle(req.user.username, conversationId),
242+
title: await getConvoTitle(req.user.id, conversationId),
243243
final: true,
244-
conversation: await getConvo(req.user.username, conversationId),
244+
conversation: await getConvo(req.user.id, conversationId),
245245
requestMessage: userMessage,
246246
responseMessage: responseMessage
247247
});
248248
res.end();
249249

250250
if (userParentMessageId == '00000000-0000-0000-0000-000000000000') {
251251
const title = await titleConvo({ endpoint: endpointOption?.endpoint, text, response: responseMessage });
252-
await saveConvo(req.user.username, {
252+
await saveConvo(req.user.id, {
253253
conversationId: conversationId,
254254
title
255255
});

api/server/routes/convos.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,12 @@ const requireJwtAuth = require('../../middleware/requireJwtAuth');
66

77
router.get('/', requireJwtAuth, async (req, res) => {
88
const pageNumber = req.query.pageNumber || 1;
9-
res.status(200).send(await getConvosByPage(req.user.username, pageNumber));
9+
res.status(200).send(await getConvosByPage(req.user.id, pageNumber));
1010
});
1111

1212
router.get('/:conversationId', requireJwtAuth, async (req, res) => {
1313
const { conversationId } = req.params;
14-
const convo = await getConvo(req.user.username, conversationId);
14+
const convo = await getConvo(req.user.id, conversationId);
1515

1616
if (convo) res.status(200).send(convo.toObject());
1717
else res.status(404).end();
@@ -31,7 +31,7 @@ router.post('/clear', requireJwtAuth, async (req, res) => {
3131
}
3232

3333
try {
34-
const dbResponse = await deleteConvos(req.user.username, filter);
34+
const dbResponse = await deleteConvos(req.user.id, filter);
3535
res.status(201).send(dbResponse);
3636
} catch (error) {
3737
console.error(error);
@@ -43,7 +43,7 @@ router.post('/update', requireJwtAuth, async (req, res) => {
4343
const update = req.body.arg;
4444

4545
try {
46-
const dbResponse = await saveConvo(req.user.username, update);
46+
const dbResponse = await saveConvo(req.user.id, update);
4747
res.status(201).send(dbResponse);
4848
} catch (error) {
4949
console.error(error);

api/server/routes/presets.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ const crypto = require('crypto');
55
const requireJwtAuth = require('../../middleware/requireJwtAuth');
66

77
router.get('/', requireJwtAuth, async (req, res) => {
8-
const presets = (await getPresets(req.user.username)).map((preset) => {
8+
const presets = (await getPresets(req.user.id)).map((preset) => {
99
return preset.toObject();
1010
});
1111
res.status(200).send(presets);
@@ -17,9 +17,9 @@ router.post('/', requireJwtAuth, async (req, res) => {
1717
update.presetId = update?.presetId || crypto.randomUUID();
1818

1919
try {
20-
await savePreset(req.user.username, update);
20+
await savePreset(req.user.id, update);
2121

22-
const presets = (await getPresets(req.user.username)).map((preset) => {
22+
const presets = (await getPresets(req.user.id)).map((preset) => {
2323
return preset.toObject();
2424
});
2525
res.status(201).send(presets);
@@ -38,9 +38,9 @@ router.post('/delete', requireJwtAuth, async (req, res) => {
3838
console.log('delete preset filter', filter);
3939

4040
try {
41-
await deletePresets(req.user.username, filter);
41+
await deletePresets(req.user.id, filter);
4242

43-
const presets = (await getPresets(req.user.username)).map(preset => preset.toObject());
43+
const presets = (await getPresets(req.user.id)).map(preset => preset.toObject());
4444

4545
// console.log('delete preset response', presets);
4646
res.status(201).send(presets);

api/server/routes/search.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ router.get('/sync', async function (req, res) {
1717

1818
router.get('/', requireJwtAuth, async function (req, res) {
1919
try {
20-
let user = req.user.username;
20+
let user = req.user.id;
2121
user = user ?? null;
2222
const { q } = req.query;
2323
const pageNumber = req.query.pageNumber || 1;

api/server/services/auth.service.js

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ const bcrypt = require('bcrypt');
66
const DebugControl = require('../../utils/debug.js');
77
const Joi = require('joi');
88
const { registerSchema } = require('../../strategies/validators');
9+
const migrateDataToFirstUser = require('../../utils/migrateDataToFirstUser');
910

1011
function log({ title, parameters }) {
1112
DebugControl.log.functionName(title);
@@ -76,14 +77,18 @@ const registerUser = async (user) => {
7677
return response;
7778
}
7879

80+
//determine if this is the first registered user (not counting anonymous_user)
81+
const isFirstRegisteredUser = await User.countDocuments({}) === 0;
82+
7983
try {
8084
const newUser = await new User({
8185
provider: 'email',
8286
email,
8387
password,
8488
username,
8589
name,
86-
avatar: null
90+
avatar: null,
91+
role: isFirstRegisteredUser ? 'ADMIN' : 'USER',
8792
});
8893

8994
// todo: implement refresh token
@@ -99,6 +104,11 @@ const registerUser = async (user) => {
99104
newUser.save();
100105
});
101106
});
107+
console.log('newUser', newUser)
108+
if (isFirstRegisteredUser) {
109+
migrateDataToFirstUser(newUser);
110+
// console.log(migrate);
111+
}
102112
response = { status: 200, user: newUser };
103113
return response;
104114
} catch (err) {
@@ -176,6 +186,7 @@ const resetPassword = async (userId, token, password) => {
176186
return { message: 'Password reset was successful' };
177187
};
178188

189+
179190
module.exports = {
180191
// signup,
181192
registerUser,

api/utils/migrateDataToFirstUser.js

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
const Conversation = require('../models/schema/convoSchema');
2+
const Preset = require('../models/schema/presetSchema');
3+
4+
const migrateConversations = async (userId) => {
5+
try {
6+
return await Conversation.updateMany({ user: null }, { $set: { user: userId }}).exec();
7+
} catch (error) {
8+
console.log(error);
9+
return { message: 'Error saving conversation' };
10+
}
11+
}
12+
13+
const migratePresets = async (userId) => {
14+
try {
15+
return await Preset.updateMany({ user: null }, { $set: { user: userId }}).exec();
16+
} catch (error) {
17+
console.log(error);
18+
return { message: 'Error saving conversation' };
19+
}
20+
}
21+
22+
const migrateDataToFirstUser = async (user) => {
23+
const conversations = await migrateConversations(user.id);
24+
console.log(conversations);
25+
const presets = await migratePresets(user.id);
26+
console.log(presets);
27+
}
28+
29+
30+
module.exports = migrateDataToFirstUser;

0 commit comments

Comments
 (0)