From 10ccbdb0e5ad27e9980bf68bae4451f956f1ddc1 Mon Sep 17 00:00:00 2001 From: "Xunnamius (Romulus)" Date: Thu, 1 Jun 2023 19:38:32 -0700 Subject: [PATCH] refactor: 560/565 of all tests passing --- src/backend/index.ts | 62 +++++++++++-------- .../pages/[pageName]/sessions/[session_id].ts | 2 +- .../pages/[pageName]/sessions/index.ts | 2 +- test/backend/unit-backend.test.ts | 12 ++++ 4 files changed, 50 insertions(+), 28 deletions(-) diff --git a/src/backend/index.ts b/src/backend/index.ts index fec3b1e..fb53eab 100644 --- a/src/backend/index.ts +++ b/src/backend/index.ts @@ -549,27 +549,7 @@ export async function createUser({ // * At this point, we can finally trust this data is valid and not malicious try { - const infoDb = db.collection('info'); - const pagesDb = db.collection('pages'); - await usersDb.insertOne(newUser); - const promisedUpdate = infoDb.updateOne({}, { $inc: { users: 1 } }); - - if (data.type === 'blogger') { - await Promise.all([ - infoDb.updateOne({}, { $inc: { blogs: 1, pages: 1 } }), - pagesDb.insertOne({ - __provenance, - _id: new ObjectId(), - blog_id: newUser._id, - createdAt: Date.now(), - totalViews: 0, - ...defaultHomePage - }) - ]); - } - - await promisedUpdate; } catch (error) { /* istanbul ignore else */ if ( @@ -584,6 +564,25 @@ export async function createUser({ throw error; } + const infoDb = db.collection('info'); + const promises: Promise[] = [infoDb.updateOne({}, { $inc: { users: 1 } })]; + + // TODO: this should be implemented as a transaction + if (data.type === 'blogger') { + promises.push( + infoDb.updateOne({}, { $inc: { blogs: 1, pages: 1 } }), + db.collection('pages').insertOne({ + __provenance, + _id: new ObjectId(), + blog_id: newUser._id, + createdAt: Date.now(), + totalViews: 0, + ...defaultHomePage + }) + ); + } + + await Promise.all(promises); return toPublicUser(newUser); } @@ -649,12 +648,7 @@ export async function createPage({ // * At this point, we can finally trust this data is valid and not malicious try { - const infoDb = db.collection('info'); - - await Promise.all([ - infoDb.updateOne({}, { $inc: { pages: 1 } }), - pagesDb.insertOne(newPage) - ]); + await pagesDb.insertOne(newPage); } catch (error) { /* istanbul ignore else */ if (error instanceof MongoServerError && error.code == 11_000) { @@ -665,6 +659,7 @@ export async function createPage({ throw error; } + await db.collection('info').updateOne({}, { $inc: { pages: 1 } }); return toPublicPage(newPage); } @@ -731,6 +726,21 @@ export async function updateUser({ throw new ValidationError(ErrorMessage.UnknownField(restKeys[0])); } + // ? Key update requires salt update and vice-versa + if (!!key !== !!salt) { + const { USER_SALT_LENGTH: maxSaltLength, USER_KEY_LENGTH: maxKeyLength } = + getEnv(); + + throw new ValidationError( + ErrorMessage.InvalidStringLength( + !!key ? 'salt' : 'key', + !!key ? maxSaltLength : maxKeyLength, + null, + 'hexadecimal' + ) + ); + } + const db = await getDb({ name: 'app' }); const usersDb = db.collection('users'); diff --git a/src/pages/api/v1/blogs/[blogName]/pages/[pageName]/sessions/[session_id].ts b/src/pages/api/v1/blogs/[blogName]/pages/[pageName]/sessions/[session_id].ts index d081be9..95afa13 100644 --- a/src/pages/api/v1/blogs/[blogName]/pages/[pageName]/sessions/[session_id].ts +++ b/src/pages/api/v1/blogs/[blogName]/pages/[pageName]/sessions/[session_id].ts @@ -31,7 +31,7 @@ export default withMiddleware( { descriptor: metadata.descriptor, options: { - allowedContentTypes: { PUT: ['application/json', 'none'], DELETE: 'none' }, + allowedContentTypes: ['application/json', 'none'], allowedMethods: ['PUT', 'DELETE'], apiVersion: '1' } diff --git a/src/pages/api/v1/blogs/[blogName]/pages/[pageName]/sessions/index.ts b/src/pages/api/v1/blogs/[blogName]/pages/[pageName]/sessions/index.ts index 84b2c69..86478dc 100644 --- a/src/pages/api/v1/blogs/[blogName]/pages/[pageName]/sessions/index.ts +++ b/src/pages/api/v1/blogs/[blogName]/pages/[pageName]/sessions/index.ts @@ -40,7 +40,7 @@ export default withMiddleware( { descriptor: metadata.descriptor, options: { - allowedContentTypes: { POST: ['application/json', 'none'], GET: 'none' }, + allowedContentTypes: ['application/json', 'none'], allowedMethods: ['GET', 'POST'], apiVersion: '1' } diff --git a/test/backend/unit-backend.test.ts b/test/backend/unit-backend.test.ts index 98c7eae..a5ed3bb 100644 --- a/test/backend/unit-backend.test.ts +++ b/test/backend/unit-backend.test.ts @@ -702,6 +702,7 @@ describe('::createUser', () => { { email: 'valid@email.address', salt: '0'.repeat(saltLength), + // * Not hexadecimal key: 'x'.repeat(keyLength) }, ErrorMessage.InvalidStringLength('key', keyLength, null, 'hexadecimal') @@ -1417,9 +1418,20 @@ describe('::updateUser', () => { ErrorMessage.InvalidStringLength('key', keyLength, null, 'hexadecimal') ], [ + // * Not hexadecimal { key: 'x'.repeat(keyLength) }, ErrorMessage.InvalidStringLength('key', keyLength, null, 'hexadecimal') ], + // * Key must always be paired with salt and vice-versa + [ + { key: 'a'.repeat(keyLength) }, + ErrorMessage.InvalidStringLength('salt', saltLength, null, 'hexadecimal') + ], + // * Key must always be paired with salt and vice-versa + [ + { salt: 'a'.repeat(saltLength) }, + ErrorMessage.InvalidStringLength('key', keyLength, null, 'hexadecimal') + ], [{ banned: 'true' as unknown as boolean }, ErrorMessage.UnknownField('banned')], [{ banned: null as unknown as boolean }, ErrorMessage.UnknownField('banned')], [{ data: 1 } as PatchUser, ErrorMessage.UnknownField('data')],