show grantee and rank info in tokens list

This commit is contained in:
Hazelnoot 2025-06-21 10:04:41 -04:00
parent fe53c16b23
commit 23e69eccbb
5 changed files with 86 additions and 18 deletions

View file

@ -5,9 +5,10 @@
import { Inject, Injectable } from '@nestjs/common';
import { Endpoint } from '@/server/api/endpoint-base.js';
import type { AccessTokensRepository } from '@/models/_.js';
import type { AccessTokensRepository, SharedAccessTokensRepository } from '@/models/_.js';
import { DI } from '@/di-symbols.js';
import { IdService } from '@/core/IdService.js';
import { UserEntityService } from '@/core/entities/UserEntityService.js';
export const meta = {
requireCredential: true,
@ -46,6 +47,19 @@ export const meta = {
type: 'string',
},
},
grantees: {
type: 'array',
optional: false,
items: {
ref: 'UserLite',
},
},
rank: {
type: 'string',
optional: false,
nullable: true,
enum: ['admin', 'mod', 'user'],
},
},
},
},
@ -71,6 +85,10 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
@Inject(DI.accessTokensRepository)
private accessTokensRepository: AccessTokensRepository,
@Inject(DI.sharedAccessTokensRepository)
private readonly sharedAccessTokenRepository: SharedAccessTokensRepository,
private readonly userEntityService: UserEntityService,
private idService: IdService,
) {
super(meta, paramDef, async (ps, me) => {
@ -88,13 +106,26 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
const tokens = await query.getMany();
return await Promise.all(tokens.map(token => ({
id: token.id,
name: token.name ?? token.app?.name,
createdAt: this.idService.parse(token.id).date.toISOString(),
lastUsedAt: token.lastUsedAt?.toISOString(),
permission: token.app ? token.app.permission : token.permission,
})));
return await Promise.all(tokens.map(async token => {
// TODO inline this table into a column w/ GIN index
const sharedTokens = await this.sharedAccessTokenRepository.find({
where: { accessTokenId: token.id },
relations: { grantee: true },
});
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
const grantees = await this.userEntityService.packMany(sharedTokens.map(t => t.grantee!), me);
return {
id: token.id,
name: token.name ?? token.app?.name,
createdAt: this.idService.parse(token.id).date.toISOString(),
lastUsedAt: token.lastUsedAt?.toISOString(),
permission: token.app ? token.app.permission : token.permission,
rank: token.rank,
grantees,
};
}));
});
}
}