Skip to content

Commit f5b51ec

Browse files
committed
Update info banners with organization info, and add to status command
1 parent 46a9504 commit f5b51ec

File tree

10 files changed

+157
-40
lines changed

10 files changed

+157
-40
lines changed

packages/app/src/cli/commands/app/bulk/execute.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ export default class BulkExecute extends AppLinkedCommand {
2424
const {query, appContextResult, store} = await prepareExecuteContext(flags, 'bulk execute')
2525

2626
await executeBulkOperation({
27+
organization: appContextResult.organization,
2728
remoteApp: appContextResult.remoteApp,
2829
storeFqdn: store.shopDomain,
2930
query,

packages/app/src/cli/commands/app/bulk/status.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,14 @@ export default class BulkStatus extends AppLinkedCommand {
3636

3737
if (flags.id) {
3838
await getBulkOperationStatus({
39+
organization: appContextResult.organization,
3940
storeFqdn: store.shopDomain,
4041
operationId: flags.id,
4142
remoteApp: appContextResult.remoteApp,
4243
})
4344
} else {
4445
await listBulkOperations({
46+
organization: appContextResult.organization,
4547
storeFqdn: store.shopDomain,
4648
remoteApp: appContextResult.remoteApp,
4749
})

packages/app/src/cli/commands/app/execute.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ export default class Execute extends AppLinkedCommand {
2121
const {query, appContextResult, store} = await prepareExecuteContext(flags, 'execute')
2222

2323
await executeOperation({
24+
organization: appContextResult.organization,
2425
remoteApp: appContextResult.remoteApp,
2526
storeFqdn: store.shopDomain,
2627
query,

packages/app/src/cli/services/bulk-operations/bulk-operation-status.test.ts

Lines changed: 36 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import {getBulkOperationStatus, listBulkOperations} from './bulk-operation-status.js'
22
import {GetBulkOperationByIdQuery} from '../../api/graphql/bulk-operations/generated/get-bulk-operation-by-id.js'
3-
import {OrganizationApp} from '../../models/organization.js'
3+
import {OrganizationApp, Organization, OrganizationSource} from '../../models/organization.js'
44
import {ListBulkOperationsQuery} from '../../api/graphql/bulk-operations/generated/list-bulk-operations.js'
55
import {afterEach, beforeEach, describe, expect, test, vi} from 'vitest'
66
import {ensureAuthenticatedAdminAsApp} from '@shopify/cli-kit/node/session'
@@ -12,6 +12,11 @@ vi.mock('@shopify/cli-kit/node/api/admin')
1212

1313
const storeFqdn = 'test-store.myshopify.com'
1414
const operationId = 'gid://shopify/BulkOperation/123'
15+
const mockOrganization: Organization = {
16+
id: 'test-org-id',
17+
businessName: 'Test Organization',
18+
source: OrganizationSource.BusinessPlatform,
19+
}
1520
const remoteApp = {
1621
id: '123',
1722
title: 'Test App',
@@ -38,6 +43,7 @@ describe('getBulkOperationStatus', () => {
3843
return {
3944
bulkOperation: {
4045
id: operationId,
46+
type: 'QUERY',
4147
status: 'RUNNING',
4248
errorCode: null,
4349
objectCount: 100,
@@ -60,7 +66,7 @@ describe('getBulkOperationStatus', () => {
6066
)
6167

6268
const output = mockAndCaptureOutput()
63-
await getBulkOperationStatus({storeFqdn, operationId, remoteApp})
69+
await getBulkOperationStatus({organization: mockOrganization, storeFqdn, operationId, remoteApp})
6470

6571
expect(output.output()).toContain('Bulk operation succeeded:')
6672
expect(output.output()).toContain('100 objects')
@@ -73,9 +79,10 @@ describe('getBulkOperationStatus', () => {
7379
vi.mocked(adminRequestDoc).mockResolvedValue(mockBulkOperation({status: 'RUNNING', objectCount: 500}))
7480

7581
const output = mockAndCaptureOutput()
76-
await getBulkOperationStatus({storeFqdn, operationId, remoteApp})
82+
await getBulkOperationStatus({organization: mockOrganization, storeFqdn, operationId, remoteApp})
7783

78-
expect(output.info()).toContain('Bulk operation in progress...')
84+
expect(output.info()).toContain('Checking bulk operation status.')
85+
expect(output.info()).toContain('Bulk operation in progress')
7986
expect(output.info()).toContain('500 objects')
8087
expect(output.info()).toContain('Started')
8188
})
@@ -91,7 +98,7 @@ describe('getBulkOperationStatus', () => {
9198
)
9299

93100
const output = mockAndCaptureOutput()
94-
await getBulkOperationStatus({storeFqdn, operationId, remoteApp})
101+
await getBulkOperationStatus({organization: mockOrganization, storeFqdn, operationId, remoteApp})
95102

96103
expect(output.error()).toContain('Error: ACCESS_DENIED')
97104
expect(output.error()).toContain('Finished')
@@ -102,7 +109,7 @@ describe('getBulkOperationStatus', () => {
102109
vi.mocked(adminRequestDoc).mockResolvedValue({bulkOperation: null})
103110

104111
const output = mockAndCaptureOutput()
105-
await getBulkOperationStatus({storeFqdn, operationId, remoteApp})
112+
await getBulkOperationStatus({organization: mockOrganization, storeFqdn, operationId, remoteApp})
106113

107114
expect(output.error()).toContain('Bulk operation not found.')
108115
expect(output.error()).toContain(operationId)
@@ -112,16 +119,16 @@ describe('getBulkOperationStatus', () => {
112119
vi.mocked(adminRequestDoc).mockResolvedValue(mockBulkOperation({status: 'CREATED', objectCount: 0}))
113120

114121
const output = mockAndCaptureOutput()
115-
await getBulkOperationStatus({storeFqdn, operationId, remoteApp})
122+
await getBulkOperationStatus({organization: mockOrganization, storeFqdn, operationId, remoteApp})
116123

117-
expect(output.info()).toContain('Starting...')
124+
expect(output.info()).toContain('Starting')
118125
})
119126

120127
test('renders info banner for canceled operation', async () => {
121128
vi.mocked(adminRequestDoc).mockResolvedValue(mockBulkOperation({status: 'CANCELED'}))
122129

123130
const output = mockAndCaptureOutput()
124-
await getBulkOperationStatus({storeFqdn, operationId, remoteApp})
131+
await getBulkOperationStatus({organization: mockOrganization, storeFqdn, operationId, remoteApp})
125132

126133
expect(output.info()).toContain('Bulk operation canceled.')
127134
})
@@ -131,7 +138,7 @@ describe('getBulkOperationStatus', () => {
131138
vi.mocked(adminRequestDoc).mockResolvedValue(mockBulkOperation({status: 'RUNNING'}))
132139

133140
const output = mockAndCaptureOutput()
134-
await getBulkOperationStatus({storeFqdn, operationId, remoteApp})
141+
await getBulkOperationStatus({organization: mockOrganization, storeFqdn, operationId, remoteApp})
135142

136143
expect(output.output()).toContain('Started')
137144
})
@@ -145,7 +152,7 @@ describe('getBulkOperationStatus', () => {
145152
)
146153

147154
const output = mockAndCaptureOutput()
148-
await getBulkOperationStatus({storeFqdn, operationId, remoteApp})
155+
await getBulkOperationStatus({organization: mockOrganization, storeFqdn, operationId, remoteApp})
149156

150157
expect(output.output()).toContain('Finished')
151158
})
@@ -194,7 +201,7 @@ describe('listBulkOperations', () => {
194201
)
195202

196203
const output = mockAndCaptureOutput()
197-
await listBulkOperations({storeFqdn, remoteApp})
204+
await listBulkOperations({organization: mockOrganization, storeFqdn, remoteApp})
198205

199206
const outputLinesWithoutTrailingWhitespace = output
200207
.output()
@@ -204,7 +211,17 @@ describe('listBulkOperations', () => {
204211

205212
// terminal width in test environment is quite narrow, so values in the snapshot get wrapped
206213
expect(outputLinesWithoutTrailingWhitespace).toMatchInlineSnapshot(`
207-
"ID STATUS COU DATE CREATED DATE RESULTS
214+
"╭─ info ───────────────────────────────────────────────────────────────────────╮
215+
│ │
216+
│ Listing bulk operations. │
217+
│ │
218+
│ • Organization: Test Organization │
219+
│ • App: Test App │
220+
│ • Store: test-store.myshopify.com │
221+
│ │
222+
╰──────────────────────────────────────────────────────────────────────────────╯
223+
224+
ID STATUS COU DATE CREATED DATE RESULTS
208225
T FINISHED
209226
210227
──────────────── ────── ─── ──────────── ─────────── ───────────────────────────
@@ -222,7 +239,7 @@ describe('listBulkOperations', () => {
222239
)
223240

224241
const output = mockAndCaptureOutput()
225-
await listBulkOperations({storeFqdn, remoteApp})
242+
await listBulkOperations({organization: mockOrganization, storeFqdn, remoteApp})
226243

227244
expect(output.output()).toContain('1.2M')
228245
expect(output.output()).toContain('5.5K')
@@ -242,7 +259,7 @@ describe('listBulkOperations', () => {
242259
)
243260

244261
const output = mockAndCaptureOutput()
245-
await listBulkOperations({storeFqdn, remoteApp})
262+
await listBulkOperations({organization: mockOrganization, storeFqdn, remoteApp})
246263

247264
expect(output.output()).toContain('download')
248265
expect(output.output()).toContain('partial.jsonl')
@@ -259,7 +276,7 @@ describe('listBulkOperations', () => {
259276
)
260277

261278
const output = mockAndCaptureOutput()
262-
await listBulkOperations({storeFqdn, remoteApp})
279+
await listBulkOperations({organization: mockOrganization, storeFqdn, remoteApp})
263280

264281
expect(output.output()).toContain('download')
265282
expect(output.output()).toContain('results.jsonl')
@@ -269,8 +286,9 @@ describe('listBulkOperations', () => {
269286
vi.mocked(adminRequestDoc).mockResolvedValue(mockBulkOperationsList([]))
270287

271288
const output = mockAndCaptureOutput()
272-
await listBulkOperations({storeFqdn, remoteApp})
289+
await listBulkOperations({organization: mockOrganization, storeFqdn, remoteApp})
273290

274-
expect(output.info()).toContain('no bulk operations found in the last 7 days')
291+
expect(output.info()).toContain('Listing bulk operations.')
292+
expect(output.info()).toContain('No bulk operations found in the last 7 days.')
275293
})
276294
})

packages/app/src/cli/services/bulk-operations/bulk-operation-status.ts

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ import {
44
GetBulkOperationById,
55
GetBulkOperationByIdQuery,
66
} from '../../api/graphql/bulk-operations/generated/get-bulk-operation-by-id.js'
7-
import {OrganizationApp} from '../../models/organization.js'
7+
import {formatOperationInfo} from '../graphql/common.js'
8+
import {OrganizationApp, Organization} from '../../models/organization.js'
89
import {
910
ListBulkOperations,
1011
ListBulkOperationsQuery,
@@ -21,18 +22,31 @@ import colors from '@shopify/cli-kit/node/colors'
2122
const API_VERSION = '2026-01'
2223

2324
interface GetBulkOperationStatusOptions {
25+
organization: Organization
2426
storeFqdn: string
2527
operationId: string
2628
remoteApp: OrganizationApp
2729
}
2830

2931
interface ListBulkOperationsOptions {
32+
organization: Organization
3033
storeFqdn: string
3134
remoteApp: OrganizationApp
3235
}
3336

3437
export async function getBulkOperationStatus(options: GetBulkOperationStatusOptions): Promise<void> {
35-
const {storeFqdn, operationId, remoteApp} = options
38+
const {organization, storeFqdn, operationId, remoteApp} = options
39+
40+
renderInfo({
41+
headline: 'Checking bulk operation status.',
42+
body: [
43+
{
44+
list: {
45+
items: formatOperationInfo({organization, remoteApp, storeFqdn, showVersion: false}),
46+
},
47+
},
48+
],
49+
})
3650

3751
const appSecret = remoteApp.apiSecretKeys[0]?.secret
3852
if (!appSecret) throw new BugError('No API secret keys found for app')
@@ -57,7 +71,18 @@ export async function getBulkOperationStatus(options: GetBulkOperationStatusOpti
5771
}
5872

5973
export async function listBulkOperations(options: ListBulkOperationsOptions): Promise<void> {
60-
const {storeFqdn, remoteApp} = options
74+
const {organization, storeFqdn, remoteApp} = options
75+
76+
renderInfo({
77+
headline: 'Listing bulk operations.',
78+
body: [
79+
{
80+
list: {
81+
items: formatOperationInfo({organization, remoteApp, storeFqdn, showVersion: false}),
82+
},
83+
},
84+
],
85+
})
6186

6287
const appSecret = remoteApp.apiSecretKeys[0]?.secret
6388
if (!appSecret) throw new BugError('No API secret keys found for app')
@@ -90,7 +115,7 @@ export async function listBulkOperations(options: ListBulkOperationsOptions): Pr
90115
outputNewline()
91116

92117
if (operations.length === 0) {
93-
renderInfo({body: 'no bulk operations found in the last 7 days'})
118+
renderInfo({body: 'No bulk operations found in the last 7 days.'})
94119
} else {
95120
renderTable({
96121
rows: operations,

0 commit comments

Comments
 (0)