create.ts•2.4 kB
import type { PrismaConfigInternal } from '@prisma/config'
import { Command } from '@prisma/internals'
import { argOrThrow, getOptionalParameter, getRequiredParameterOrThrow } from '../_lib/cli/parameters'
import { messages } from '../_lib/messages'
import { requestOrThrow } from '../_lib/pdp'
import { getTokenOrThrow, platformParameters } from '../_lib/utils'
export class Create implements Command {
  public static new() {
    return new Create()
  }
  public async parse(argv: string[], _config: PrismaConfigInternal): Promise<string | Error> {
    const args = argOrThrow(argv, {
      ...platformParameters.workspace,
      '--name': String,
      '-n': '--name',
    })
    const workspaceId = getRequiredParameterOrThrow(args, ['--workspace', '-w'])
    const displayName = getOptionalParameter(args, ['--name', '-n'])
    const project = await createProjectOrThrow({
      token: await getTokenOrThrow(args),
      workspaceId,
      displayName,
    })
    return messages.resourceCreated(project)
  }
}
export const createProjectOrThrow = async (input: {
  token: string
  workspaceId: string
  displayName?: string
  environmentDisplayName?: string
  allowRemoteDatabases?: boolean
  ppgRegion?: string
}) => {
  const { token, ...mutationInput } = input
  const { projectCreate } = await requestOrThrow<
    {
      projectCreate: {
        __typename: string
        id: string
        createdAt: string
        displayName: string
        environmentDisplayName: string
        allowRemoteDatabases: boolean
        ppgRegion: string
        defaultEnvironment: {
          id: string
          displayName: string
        }
      }
    },
    {
      workspaceId: string
      displayName?: string
      environmentDisplayName?: string
      allowRemoteDatabases?: boolean
      ppgRegion?: string
    }
  >({
    token,
    body: {
      query: /* graphql */ `
        mutation ($input: MutationProjectCreateInput!) {
          projectCreate(input: $input) {
            __typename
            ...on Error {
              message
            }
            ...on Project {
              id
              createdAt
              displayName
              defaultEnvironment {
                id
                displayName
              }
            }
          }
        }
      `,
      variables: {
        input: mutationInput,
      },
    },
  })
  return projectCreate
}