@sprucelabs/spruce-cli
Version:
Command line interface for building Spruce skills.
130 lines (109 loc) • 4.13 kB
text/typescript
import { buildSchema, SchemaValues } from '@sprucelabs/schema'
import { eventResponseUtil } from '@sprucelabs/spruce-event-utils'
import SpruceError from '../../../errors/SpruceError'
import actionUtil from '../../../utilities/action.utility'
import AbstractAction from '../../AbstractAction'
import { FeatureActionResponse } from '../../features.types'
import { generateSkillSummaryLines } from './RegisterAction'
const optionsSchema = buildSchema({
id: 'loginSkillAction',
description:
'If you already registered your skill but lost your env or changed environments.',
fields: {
skillSlug: {
type: 'text',
label: 'Namespace',
},
},
})
type OptionsSchema = typeof optionsSchema
type Options = SchemaValues<OptionsSchema>
export default class LoginAction extends AbstractAction<OptionsSchema> {
public optionsSchema: OptionsSchema = optionsSchema
public commandAliases = ['login.skill']
public invocationMessage = 'Logging in as skill... ⚡️'
public async execute(options: Options): Promise<FeatureActionResponse> {
const { skillSlug } = this.validateAndNormalizeOptions(options)
const person = this.Service('auth').getLoggedInPerson()
let loginResponse: FeatureActionResponse = {}
let skillResponse: FeatureActionResponse = {}
if (!person) {
this.ui.renderLine(
'You gotta login as a person before you can login as a skill.'
)
const phone = await this.ui.prompt({
type: 'phone',
label: 'Phone number',
isRequired: true,
})
loginResponse = await this.Action('person', 'login').execute({
phone,
})
}
const client = await this.connectToApi()
let [{ skills }] = await client.emitAndFlattenResponses(
'list-skills::v2020_12_25',
{
payload: {
shouldOnlyShowMine: true,
},
}
)
if (skillSlug) {
const match = skills.find((s) => s.slug === skillSlug)
if (!match) {
return {
errors: [
new SpruceError({
code: 'SKILL_NOT_FOUND',
friendlyMessage: `I couldn't find a skill that you own with the slug: ${skillSlug}`,
}),
],
}
}
skills = [match]
}
if (skills.length === 0) {
const error = new SpruceError({ code: 'NO_SKILLS_REGISTERED' })
if (error) {
return {
errors: [error],
}
}
} else if (skills.length > 1) {
const selectedSkillId = await this.ui.prompt({
type: 'select',
label: 'Which skill are we logging in as?',
isRequired: true,
options: {
choices: skills.map((s) => ({
label: s.name,
value: s.id,
})),
},
})
skills = skills.filter((s) => s.id === selectedSkillId)
}
if (skills.length === 1) {
const currentSkillResults = await client.emit(
'get-skill::v2020_12_25',
{
target: {
skillId: skills[0].id,
},
payload: {
shouldIncludeApiKey: true,
},
}
)
const { skill } =
eventResponseUtil.getFirstResponseOrThrow(currentSkillResults)
this.Service('auth').updateCurrentSkill(skill)
skillResponse.summaryLines = generateSkillSummaryLines(skill)
skillResponse.meta = {
skill,
}
}
return actionUtil.mergeActionResults(loginResponse, skillResponse)
}
}