Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions modules/access_tokens_guard/token_providers/db.ts
Original file line number Diff line number Diff line change
Expand Up @@ -320,6 +320,29 @@ export class DbAccessTokensProvider<
return affectedRows as unknown as number
}

/**
* Delete all tokens for a given user
*
* @param user - The user instance to delete tokens for
*
* @example
* const deletedCount = await provider.deleteAll(user)
* console.log('Deleted tokens:', deletedCount)
*/
async deleteAll(user: InstanceType<TokenableModel>): Promise<number> {
this.#ensureIsPersisted(user)

const queryClient = await this.getDb()
const affectedRows = await queryClient
.query<number>()
.from(this.table)
.where({ tokenable_id: user.$primaryKeyValue, type: this.type })
.del()
.exec()

return affectedRows as unknown as number
}

/**
* Returns all the tokens for a given user
*
Expand Down
37 changes: 37 additions & 0 deletions tests/access_tokens/token_providers/db.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -722,6 +722,43 @@ test.group('Access tokens provider | DB | all', () => {
})
})

test.group('Access tokens provider | DB | deleteAll', () => {
test('delete all tokens', async ({ assert }) => {
const db = await createDatabase()
await createTables(db)

class User extends BaseModel {
@column({ isPrimary: true })
declare id: number

@column()
declare username: string

@column()
declare email: string

@column()
declare password: string

static authTokens = DbAccessTokensProvider.forModel(User)
}

const user = await User.create({
email: 'virk@adonisjs.com',
username: 'virk',
password: 'secret',
})

await User.authTokens.create(user, ['*'], { expiresIn: '20 mins', name: 'List projects' })
await User.authTokens.create(user)
timeTravel(21 * 60)
const numberOfDeletedTokens = await User.authTokens.deleteAll(user)

assert.equal(numberOfDeletedTokens, 2)
assert.isEmpty(await User.authTokens.all(user))
})
})

test.group('Access tokens provider | DB | invalidate', () => {
test('delete token identified by publicly shared token', async ({ assert }) => {
const db = await createDatabase()
Expand Down