import {
listProductHuntIntegrationNames,
listUserSecretNames,
parseAuthInput,
resolveIntegrationName,
resolveSecretName,
} from './auth.ts'
import {
DEFAULT_CLIENT_SECRET_SECRET,
PRODUCTHUNT_CALLBACK_URL,
PRODUCTHUNT_REQUIRED_HOST,
accessTokenSetupUrl,
clientSecretSetupUrl,
oauthConnectUrl,
reconnectUrl,
} from './setup.ts'
import type { ProductHuntAuthInput } from './types.ts'
import { requireRecord } from './types.ts'
export type ProductHuntAccountsInfo = {
integrationName: string
secretName: string
preferredAuth: 'oauth' | 'token' | null
oauthConnected: boolean
tokenSaved: boolean
connectUrl: string
reconnectUrl: string
accessTokenUrl: string
clientSecretUrl: string
callbackUrl: string
requiredHost: string
}
/**
* Resolve Product Hunt integration/secret names and report what is connected.
*/
export async function accounts(input: ProductHuntAuthInput = {}): Promise<ProductHuntAccountsInfo> {
const integrationName = resolveIntegrationName(input)
const secretName = resolveSecretName(input)
const [secrets, integrations] = await Promise.all([
listUserSecretNames(),
listProductHuntIntegrationNames(),
])
const oauthConnected = integrations.includes(integrationName)
const tokenSaved = secrets.has(secretName)
let preferredAuth: ProductHuntAccountsInfo['preferredAuth'] = null
if (input.auth === 'oauth' && oauthConnected) preferredAuth = 'oauth'
else if (input.auth === 'token' && tokenSaved) preferredAuth = 'token'
else if (oauthConnected) preferredAuth = 'oauth'
else if (tokenSaved) preferredAuth = 'token'
return {
integrationName,
secretName,
preferredAuth,
oauthConnected,
tokenSaved,
connectUrl: oauthConnectUrl(integrationName),
reconnectUrl: reconnectUrl(integrationName),
accessTokenUrl: accessTokenSetupUrl(secretName),
clientSecretUrl: clientSecretSetupUrl(
integrationName === 'producthunt'
? DEFAULT_CLIENT_SECRET_SECRET
: `${DEFAULT_CLIENT_SECRET_SECRET}-${integrationName.replace(/^producthunt-/, '')}`,
),
callbackUrl: PRODUCTHUNT_CALLBACK_URL,
requiredHost: PRODUCTHUNT_REQUIRED_HOST,
}
}
/**
* Resolve Product Hunt integration/secret names and report what is connected.
* @example
* import accounts from 'kody:@kody/producthunt/accounts'
* const info = await accounts()
*/
export default async function accountsEntrypoint(
params: ProductHuntAuthInput & Record<string, unknown> = {},
) {
const input = requireRecord(params, 'accounts')
return accounts(parseAuthInput(input))
}