OverviewFilesCommitsIssuesDocsReleasesPeers

pear-git / lib / cli / commands / token.js

110 lines · javascript ref:
/**
 * 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`)
}