fix auth error when deleting user in db

This commit is contained in:
Hongbo Wu
2022-07-08 11:59:55 +08:00
parent 1b9d22cb6f
commit de803ebbd5
4 changed files with 28 additions and 25 deletions

View File

@ -329,11 +329,15 @@ class UserModel extends DataModel<UserData, CreateSet, UpdateSet> {
}
@logMethod
deleteUser(
async delete(
userId: string,
tx: Knex.Transaction
tx?: Knex.Transaction
): Promise<UserData | { error: DataModelError }> {
return super.delete(userId, tx)
if (tx) {
return super.delete(userId, tx)
}
return this.kx.transaction((tx) => super.delete(userId, tx))
}
}

View File

@ -306,7 +306,7 @@ export const createArticleResolver = authorized<
let uploadFileUrlOverride = ''
if (uploadFileId) {
const uploadFileData = await authTrx(async (tx) => {
return await models.uploadFile.setFileUploadComplete(uploadFileId, tx)
return models.uploadFile.setFileUploadComplete(uploadFileId, tx)
})
if (!uploadFileData || !uploadFileData.id || !uploadFileData.fileName) {
return pageError(

View File

@ -38,7 +38,6 @@ import { validateUsername } from '../../utils/usernamePolicy'
import * as jwt from 'jsonwebtoken'
import { createUser } from '../../services/create_user'
import { comparePassword, hashPassword } from '../../utils/auth'
import type { UserData } from '../../datalayer/user/model'
import { deletePagesByParam } from '../../elastic/pages'
export const updateUserResolver = authorized<
@ -366,9 +365,8 @@ export const deleteAccountResolver = authorized<
DeleteAccountSuccess,
DeleteAccountError,
MutationDeleteAccountArgs
>(async (_, { userID }, { models, claims, log, authTrx, pubsub }) => {
>(async (_, { userID }, { models, claims, log, pubsub }) => {
const user = await models.user.get(userID)
if (!user) {
return {
errorCodes: [DeleteAccountErrorCode.UserNotFound],
@ -381,13 +379,6 @@ export const deleteAccountResolver = authorized<
}
}
const deleteUserResult = await authTrx((tx) =>
models.user.deleteUser(claims.uid, tx)
)
// delete this user's pages in elastic
await deletePagesByParam({ userId: userID }, { uid: userID, pubsub })
log.info('Deleting a user account', {
userID,
labels: {
@ -397,11 +388,17 @@ export const deleteAccountResolver = authorized<
},
})
if ((deleteUserResult as UserData).id !== undefined) {
return { userID }
} else {
const deletedUser = await models.user.delete(userID)
if ('error' in deletedUser) {
log.error('Error deleting user account', deletedUser.error)
return {
errorCodes: [DeleteAccountErrorCode.Forbidden],
errorCodes: [DeleteAccountErrorCode.UserNotFound],
}
}
// delete this user's pages in elastic
await deletePagesByParam({ userId: userID }, { uid: userID, pubsub })
return { userID }
})

View File

@ -1,4 +1,4 @@
import { createTestUser } from '../db'
import { createTestUser, deleteTestUser } from '../db'
import { graphqlRequest, request } from '../util'
import * as chai from 'chai'
import { expect } from 'chai'
@ -13,12 +13,10 @@ const deleteAccountRequest = async (authToken: string, userId: string) => {
const mutation = `
mutation {
deleteAccount(
input: {
userId: "${userId}",
}
userID: "${userId}",
) {
... on DeleteAccountSuccess {
userId
userID
}
... on DeleteAccountError {
errorCodes
@ -30,7 +28,7 @@ const deleteAccountRequest = async (authToken: string, userId: string) => {
}
describe('the deleteAccount API', () => {
const username = 'fakeUser'
const username = 'newFakeUser'
let authToken: string
let user: User
@ -44,6 +42,10 @@ describe('the deleteAccount API', () => {
authToken = res.body.authToken
})
after(async () => {
await deleteTestUser(username)
})
context('deleting a user that exists', () => {
it('should return a unauthorized error if authToken is invalid', async () => {
const res = await deleteAccountRequest('invalid-auth-token', user.id)
@ -54,7 +56,7 @@ describe('the deleteAccount API', () => {
it('should return the user id after a successful user deletion', async () => {
const res = await deleteAccountRequest(authToken, user.id)
expect(res.body.data.deleteAccount.userId).to.eql(user.id)
expect(res.body.data.deleteAccount.userID).to.eql(user.id)
})
})