Skip to content

Built for people who want to own their automations. Join the waitlist for an invite.

Package listing

@kody/producthunt

src/accounts.ts

82 lines · 2.4 KB · TypeScript
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))
}