Skip to content

Commit

Permalink
refactor build:view to use graphql
Browse files Browse the repository at this point in the history
  • Loading branch information
dsokal committed Mar 22, 2021
1 parent 406c816 commit a1df341
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 143 deletions.
65 changes: 3 additions & 62 deletions packages/eas-cli/src/commands/build/list.ts
Original file line number Diff line number Diff line change
@@ -1,24 +1,15 @@
import { getConfig } from '@expo/config';
import { Command, flags } from '@oclif/command';
import chalk from 'chalk';
import { print } from 'graphql';
import gql from 'graphql-tag';
import ora from 'ora';

import { BuildStatus, RequestedPlatform } from '../../build/types';
import { formatGraphQLBuild } from '../../build/utils/formatBuild';
import { graphqlClient, withErrorHandlingAsync } from '../../graphql/client';
import {
AppPlatform,
GetAllBuildsForAppQuery,
GetAllBuildsForAppQueryVariables,
BuildStatus as GraphQLBuildStatus,
} from '../../graphql/generated';
import { BuildFragmentNode } from '../../graphql/types/Build';
import { AppPlatform, BuildStatus as GraphQLBuildStatus } from '../../graphql/generated';
import { BuildQuery } from '../../graphql/queries/BuildQuery';
import Log from '../../log';
import {
findProjectRootAsync,
getProjectAccountNameAsync,
getProjectFullNameAsync,
getProjectIdAsync,
} from '../../project/projectUtils';
Expand Down Expand Up @@ -58,13 +49,11 @@ export default class BuildList extends Command {
const spinner = ora().start('Fetching the build list for the project…');

try {
const buildsQueryResult = await getAllBuildsForAppAsync({
appId: projectId,
const builds = await BuildQuery.allForAppAsync(projectId, {
limit,
platform,
status: graphqlBuildStatus,
});
const builds = buildsQueryResult.app?.byId.builds ?? [];

if (builds.length) {
if (platform || graphqlBuildStatus) {
Expand Down Expand Up @@ -115,51 +104,3 @@ const toGraphQLBuildStatus = (buildStatus: BuildStatus): GraphQLBuildStatus | un
return GraphQLBuildStatus.Canceled;
}
};

async function getAllBuildsForAppAsync({
appId,
platform,
status,
limit,
offset = 0,
}: {
appId: string;
limit: number;
platform?: AppPlatform;
status?: GraphQLBuildStatus;
offset?: number;
}): Promise<GetAllBuildsForAppQuery> {
return await withErrorHandlingAsync(
graphqlClient
.query<GetAllBuildsForAppQuery, GetAllBuildsForAppQueryVariables>(
gql`
query GetAllBuildsForApp(
$appId: String!
$offset: Int!
$limit: Int!
$status: BuildStatus
$platform: AppPlatform
) {
app {
byId(appId: $appId) {
id
builds(offset: $offset, limit: $limit, status: $status, platform: $platform) {
id
...BuildFragment
}
}
}
}
${print(BuildFragmentNode)}
`,
{
appId,
platform,
status,
limit,
offset,
}
)
.toPromise()
);
}
65 changes: 20 additions & 45 deletions packages/eas-cli/src/commands/build/view.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,13 @@
import { getConfig } from '@expo/config';
import { Command } from '@oclif/command';
import { HTTPError } from 'got';
import ora from 'ora';

import { apiClient } from '../../api';
import { Build } from '../../build/types';
import { formatBuild } from '../../build/utils/formatBuild';
import { formatGraphQLBuild } from '../../build/utils/formatBuild';
import { BuildFragment } from '../../graphql/generated';
import { BuildQuery } from '../../graphql/queries/BuildQuery';
import Log from '../../log';
import {
findProjectRootAsync,
getProjectAccountNameAsync,
getProjectFullNameAsync,
getProjectIdAsync,
} from '../../project/projectUtils';
Expand All @@ -25,33 +23,22 @@ export default class BuildView extends Command {
const projectDir = (await findProjectRootAsync()) ?? process.cwd();
const { exp } = getConfig(projectDir, { skipSDKVersionRequirement: true });
const projectId = await getProjectIdAsync(exp);
const accountName = await getProjectAccountNameAsync(exp);
const projectName = await getProjectFullNameAsync(exp);

const spinner = ora().start('Fetching the build…');

try {
let build: Build;
let build: BuildFragment;

if (buildId == null) {
const response = await apiClient.get<{ data: { builds: Build[] } }>(
`projects/${projectId}/builds`,
{
searchParams: { limit: 1 },
responseType: 'json',
}
);

build = response.body.data.builds[0];
if (buildId) {
build = await BuildQuery.byIdAsync(buildId);
} else {
const response = await apiClient.get<{ data: Build }>(
`projects/${projectId}/builds/${buildId}`,
{
responseType: 'json',
}
);

build = response.body.data;
const builds = await BuildQuery.allForAppAsync(projectId, { limit: 1 });
if (builds.length === 0) {
spinner.fail(`Couldn't find any builds for the project ${projectName}`);
return;
}
build = builds[0];
}

if (buildId) {
Expand All @@ -60,29 +47,17 @@ export default class BuildView extends Command {
spinner.succeed(`Showing the last build for the project ${projectName}`);
}

Log.log(`\n${formatBuild(build, { accountName })}`);
} catch (e) {
const error = e as HTTPError;

if (error.response.statusCode === 400) {
if (buildId) {
spinner.fail(
`Couldn't find a build for the project ${projectName} matching the id ${buildId}`
);
} else {
spinner.fail(`Couldn't find any builds for the project ${projectName}`);
}
Log.log(`\n${formatGraphQLBuild(build)}`);
} catch (err) {
if (buildId) {
spinner.fail(`Something went wrong and we couldn't fetch the build with id ${buildId}`);
} else {
if (buildId) {
spinner.fail(`Something went wrong and we couldn't fetch the build with id ${buildId}`);
} else {
spinner.fail(
`Something went wrong and we couldn't fetch the last build for the project ${projectName}`
);
}
spinner.fail(
`Something went wrong and we couldn't fetch the last build for the project ${projectName}`
);
}

throw error;
throw err;
}
}
}
73 changes: 37 additions & 36 deletions packages/eas-cli/src/graphql/queries/BuildQuery.ts
Original file line number Diff line number Diff line change
@@ -1,41 +1,45 @@
import { print } from 'graphql';
import gql from 'graphql-tag';

import { graphqlClient, withErrorHandlingAsync } from '../client';
import {
AppPlatform,
Build,
BuildFragment,
BuildStatus,
BuildsByIdQuery,
BuildsForAppQuery,
BuildsByIdQueryVariables,
GetAllBuildsForAppQuery,
GetAllBuildsForAppQueryVariables,
PendingBuildsForAccountAndPlatformQuery,
PendingBuildsForAccountAndPlatformQueryVariables,
} from '../generated';
import { BuildFragmentNode } from '../types/Build';

type Filters = Partial<Pick<Build, 'platform' | 'status'>> & {
type Filters = {
platform?: AppPlatform;
status?: BuildStatus;
offset?: number;
limit?: number;
};

type BuildQueryResult = Pick<Build, 'id' | 'platform' | 'artifacts' | 'status' | 'createdAt'>;
type PendingBuildQueryResult = Pick<Build, 'id' | 'platform'>;

const BuildQuery = {
async byIdAsync(buildId: string): Promise<BuildQueryResult> {
export const BuildQuery = {
async byIdAsync(buildId: string): Promise<BuildFragment> {
const data = await withErrorHandlingAsync(
graphqlClient
.query<BuildsByIdQuery>(
.query<BuildsByIdQuery, BuildsByIdQueryVariables>(
gql`
query BuildsByIdQuery($buildId: ID!) {
builds {
byId(buildId: $buildId) {
id
platform
status
createdAt
artifacts {
buildUrl
}
...BuildFragment
}
}
}
${print(BuildFragmentNode)}
`,
{ buildId }
)
Expand All @@ -45,44 +49,40 @@ const BuildQuery = {
return data.builds.byId;
},

async allForAppAsync(appId: string, filters?: Filters): Promise<BuildQueryResult[]> {
async allForAppAsync(
appId: string,
{ limit = 10, offset = 0, status, platform }: Filters
): Promise<BuildFragment[]> {
const data = await withErrorHandlingAsync(
graphqlClient
.query<BuildsForAppQuery>(
.query<GetAllBuildsForAppQuery, GetAllBuildsForAppQueryVariables>(
// TODO: Change $appId: String! to ID! when fixed server-side schema
gql`
query BuildsForAppQuery(
query GetAllBuildsForApp(
$appId: String!
$limit: Int
$offset: Int
$platform: AppPlatform
$offset: Int!
$limit: Int!
$status: BuildStatus
$platform: AppPlatform
) {
builds {
allForApp(
appId: $appId
limit: $limit
offset: $offset
platform: $platform
status: $status
) {
app {
byId(appId: $appId) {
id
platform
status
createdAt
artifacts {
buildUrl
builds(offset: $offset, limit: $limit, status: $status, platform: $platform) {
id
...BuildFragment
}
}
}
}
${print(BuildFragmentNode)}
`,
{ ...filters, appId }
{ appId, offset, limit, status, platform }
)
.toPromise()
);

return data.builds.allForApp as BuildQueryResult[];
return data.app?.byId.builds ?? [];
},

async getPendingBuildIdAsync(
Expand All @@ -91,7 +91,10 @@ const BuildQuery = {
): Promise<PendingBuildQueryResult | null> {
const data = await withErrorHandlingAsync(
graphqlClient
.query<PendingBuildsForAccountAndPlatformQuery>(
.query<
PendingBuildsForAccountAndPlatformQuery,
PendingBuildsForAccountAndPlatformQueryVariables
>(
gql`
query PendingBuildsForAccountAndPlatform(
$accountName: String!
Expand Down Expand Up @@ -133,5 +136,3 @@ const BuildQuery = {
return pendingBuilds.length > 0 ? pendingBuilds[0] : null;
},
};

export { BuildQuery };

0 comments on commit a1df341

Please sign in to comment.