/**
* pgh token commands
*
* Subcommands: create, list, revoke, test
*/
import { table, jsonOut, log, error } from '../output.js'
export async function tokenCommand (client, sub, args, flags) {
switch (sub) {
case 'create':
return tokenCreate(client, args[0] || flags.username, flags)
case 'list':
case 'ls':
return tokenList(client, flags)
case 'revoke':
return tokenRevoke(client, args[0], flags)
case 'test':
return tokenTest(client, flags)
default:
tokenHelp()
}
}
async function tokenCreate (client, username, flags) {
if (!username) error('Usage: pgh token create <username> [--description ...] [--permissions ...]')
const body = { username }
if (flags.user) body.userId = flags.user
if (flags.description) body.description = flags.description
if (flags.permissions) body.permissions = flags.permissions.split(',')
if (flags.repos) body.repos = flags.repos.split(',')
if (flags.expires) body.expiresAt = flags.expires
const data = await client.post('/api/admin/tokens', body)
if (flags.json) {
jsonOut(data)
return
}
log(`Token created for ${username}:`)
log(``)
log(` ${data.token}`)
log(``)
log(`Save this token - it cannot be shown again.`)
log(`Hash: ${data.tokenHash}`)
}
async function tokenList (client, flags) {
const data = await client.get('/api/admin/tokens')
if (flags.json) {
jsonOut(data)
return
}
if (!data.tokens || data.tokens.length === 0) {
log('No tokens found.')
return
}
table(data.tokens, [
{ key: 'hashPrefix', label: 'HASH', width: 16 },
{ key: 'username', label: 'USERNAME', width: 20 },
{ key: 'description', label: 'DESCRIPTION', width: 25 },
{ key: 'usageCount', label: 'USES' }
])
}
async function tokenRevoke (client, hash, flags) {
if (!hash) error('Usage: pgh token revoke <hash>')
const data = await client.del(`/api/admin/tokens/${encodeURIComponent(hash)}`)
if (flags.json) {
jsonOut(data)
return
}
log('Token revoked.')
}
async function tokenTest (client, flags) {
try {
await client.get('/api/repos')
log('Token valid.')
} catch {
error('Token invalid or expired.')
}
}
export function tokenHelp () {
log(`Usage: pgh token <subcommand> [args] [flags]
Subcommands:
create <username> Create a new token
list List all tokens
revoke <hash> Revoke a token by hash
test Test if current token is valid
Flags:
--username NAME Username for the token
--description TEXT Token description
--permissions LIST Comma-separated permissions (default: read)
--repos LIST Comma-separated repos (default: *)
--expires DATE Expiration date
--json Output as JSON`)
}