Skip to content

Commit b39b0fe

Browse files
committed
wrap inserts in transaction
1 parent 29554d5 commit b39b0fe

1 file changed

Lines changed: 29 additions & 12 deletions

File tree

packages/models/src/user/index.js

Lines changed: 29 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,17 @@
33
const { v4: uuidv4 } = require('uuid');
44
const invariant = require('tiny-invariant');
55

6-
const { userTable, passwordTable } = require('../../schema/schema');
6+
const { userTable, passwordTable, profileTable } = require('../../schema/schema');
77
const { db } = require('../drizzle');
88
const { createProfile } = require('../profile/profile');
99
const { eq } = require('drizzle-orm');
1010
const ModelError = require('../modelError');
1111
const { checkPassword, validatePassword, passwordHasher } = require('../password/utils');
12+
const IsEmail = require('isemail');
13+
14+
const userNameRequirementsText = 'Parameter name must consist of at least 3 and up to 40 alphanumerics (a-zA-Z0-9), dot (.), dash (-), underscore (_) and spaces.';
15+
const nameValidRegex =
16+
/^[^~`!@#$%^&*()+=£{}[\]|\\:;"'<>,?/\n\r\t\s][^~`!@#$%^&*()+=£{}[\]|\\:;"'<>,?/\n\r\t]{1,39}[^~`!@#$%^&*()+=£{}[\]|\\:;"'<>,?/\n\r\t\s]$/;
1217

1318
const validateField = function validateField (field, expr, msg) {
1419
try {
@@ -53,29 +58,41 @@ const findUserByEmailAndRole = async function findUserByEmailAndRole ({
5358
const createUser = async function createUser (name, email, password, language) {
5459

5560
validateField('name', name.length > 0, 'Name is required');
61+
validateField(
62+
'name',
63+
name.length > 3 && name.length < 40,
64+
userNameRequirementsText
65+
);
66+
validateField('name', nameValidRegex.test(name), userNameRequirementsText);
67+
validateField('email', IsEmail.validate(email), 'Email is required');
5668
validateField('password', validatePassword(password), 'Password must be at least 8 characters');
5769

58-
try {
59-
// TODO: Wrap this in a transaction
60-
const hashedPassword = await passwordHasher(password);
61-
const user = await db
70+
const hashedPassword = await passwordHasher(password);
71+
72+
const user = await db.transaction(async (tx) => {
73+
const user = await tx
6274
.insert(userTable)
6375
.values({ name, email, language })
6476
.returning();
6577

66-
await db.insert(passwordTable).values({
78+
await tx.insert(passwordTable).values({
6779
hash: hashedPassword,
6880
userId: user[0].id
6981
});
7082

71-
await createProfile(user[0]);
83+
await tx.insert(profileTable).values({
84+
username: name,
85+
public: false,
86+
userId: user[0].id
87+
});
7288

73-
// TODO: Only return specific fields
7489
return user[0];
75-
} catch (error) {
76-
console.log(error);
77-
throw error;
78-
}
90+
});
91+
92+
// Delete not needed properties
93+
delete user.emailConfirmationToken;
94+
95+
return user;
7996
};
8097

8198
const destroyUser = async function destroyUser (user) {

0 commit comments

Comments
 (0)