Skip to content

Commit a2efc9c

Browse files
feat: add deleteAll method on access token provider (#260)
1 parent f13c86d commit a2efc9c

File tree

2 files changed

+60
-0
lines changed
  • modules/access_tokens_guard/token_providers
  • tests/access_tokens/token_providers

2 files changed

+60
-0
lines changed

modules/access_tokens_guard/token_providers/db.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,29 @@ export class DbAccessTokensProvider<
320320
return affectedRows as unknown as number
321321
}
322322

323+
/**
324+
* Delete all tokens for a given user
325+
*
326+
* @param user - The user instance to delete tokens for
327+
*
328+
* @example
329+
* const deletedCount = await provider.deleteAll(user)
330+
* console.log('Deleted tokens:', deletedCount)
331+
*/
332+
async deleteAll(user: InstanceType<TokenableModel>): Promise<number> {
333+
this.#ensureIsPersisted(user)
334+
335+
const queryClient = await this.getDb()
336+
const affectedRows = await queryClient
337+
.query<number>()
338+
.from(this.table)
339+
.where({ tokenable_id: user.$primaryKeyValue, type: this.type })
340+
.del()
341+
.exec()
342+
343+
return affectedRows as unknown as number
344+
}
345+
323346
/**
324347
* Returns all the tokens for a given user
325348
*

tests/access_tokens/token_providers/db.spec.ts

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -722,6 +722,43 @@ test.group('Access tokens provider | DB | all', () => {
722722
})
723723
})
724724

725+
test.group('Access tokens provider | DB | deleteAll', () => {
726+
test('delete all tokens', async ({ assert }) => {
727+
const db = await createDatabase()
728+
await createTables(db)
729+
730+
class User extends BaseModel {
731+
@column({ isPrimary: true })
732+
declare id: number
733+
734+
@column()
735+
declare username: string
736+
737+
@column()
738+
declare email: string
739+
740+
@column()
741+
declare password: string
742+
743+
static authTokens = DbAccessTokensProvider.forModel(User)
744+
}
745+
746+
const user = await User.create({
747+
748+
username: 'virk',
749+
password: 'secret',
750+
})
751+
752+
await User.authTokens.create(user, ['*'], { expiresIn: '20 mins', name: 'List projects' })
753+
await User.authTokens.create(user)
754+
timeTravel(21 * 60)
755+
const numberOfDeletedTokens = await User.authTokens.deleteAll(user)
756+
757+
assert.equal(numberOfDeletedTokens, 2)
758+
assert.isEmpty(await User.authTokens.all(user))
759+
})
760+
})
761+
725762
test.group('Access tokens provider | DB | invalidate', () => {
726763
test('delete token identified by publicly shared token', async ({ assert }) => {
727764
const db = await createDatabase()

0 commit comments

Comments
 (0)