Skip to content

Commit 0cf1194

Browse files
authored
feat(api): target crud operations (#6758)
1 parent 60981bd commit 0cf1194

37 files changed

+1166
-991
lines changed

.changeset/bright-geckos-compare.md

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
---
2+
'hive': major
3+
---
4+
5+
Add target management fields to the public GraphQL API schema.
6+
7+
This includes the following fields and related types/fields:
8+
9+
- `Mutation.updateTargetConditionalBreakingChangeConfiguration`
10+
- `Mutation.updateTargetSlug`
11+
- `Mutation.updateTargetDangerousChangeClassification`
12+
- `Mutation.createTarget`
13+
- `Mutation.deleteTarget`
14+
- `Mutation.createCdnAccessToken`
15+
- `Mutation.deleteCdnAccessToken`
16+
- `Target.conditionalBreakingChangeConfiguration`
17+
- `Target.failDiffOnDangerousChange`
18+
- `Target.cdnAccessTokens`
19+
- `Organization.availableOrganizationAccessTokenPermissionGroups`
20+
21+
**BREAKING CHANGE** This renames existing types and fields within the private GraphQL schema.

integration-tests/testkit/flow.ts

Lines changed: 9 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,13 @@ import type {
2424
SchemaCheckInput,
2525
SchemaDeleteInput,
2626
SchemaPublishInput,
27-
SetTargetValidationInput,
2827
TargetSelectorInput,
2928
UpdateBaseSchemaInput,
3029
UpdateMemberRoleInput,
3130
UpdateOrganizationSlugInput,
3231
UpdateProjectSlugInput,
32+
UpdateTargetConditionalBreakingChangeConfigurationInput,
3333
UpdateTargetSlugInput,
34-
UpdateTargetValidationSettingsInput,
3534
} from './gql/graphql';
3635
import { execute } from './graphql';
3736

@@ -910,39 +909,8 @@ export function deleteSchema(
910909
});
911910
}
912911

913-
export function setTargetValidation(
914-
input: SetTargetValidationInput,
915-
access:
916-
| {
917-
token: string;
918-
}
919-
| {
920-
authToken: string;
921-
},
922-
) {
923-
return execute({
924-
document: graphql(`
925-
mutation setTargetValidation($input: SetTargetValidationInput!) {
926-
setTargetValidation(input: $input) {
927-
id
928-
validationSettings {
929-
enabled
930-
period
931-
percentage
932-
excludedClients
933-
}
934-
}
935-
}
936-
`),
937-
...access,
938-
variables: {
939-
input,
940-
},
941-
});
942-
}
943-
944912
export function updateTargetValidationSettings(
945-
input: UpdateTargetValidationSettingsInput,
913+
input: UpdateTargetConditionalBreakingChangeConfigurationInput,
946914
access:
947915
| {
948916
token: string;
@@ -953,13 +921,15 @@ export function updateTargetValidationSettings(
953921
) {
954922
return execute({
955923
document: graphql(`
956-
mutation updateTargetValidationSettings($input: UpdateTargetValidationSettingsInput!) {
957-
updateTargetValidationSettings(input: $input) {
924+
mutation updateTargetConditionalBreakingChangeConfiguration(
925+
$input: UpdateTargetConditionalBreakingChangeConfigurationInput!
926+
) {
927+
updateTargetConditionalBreakingChangeConfiguration(input: $input) {
958928
ok {
959929
target {
960930
id
961-
validationSettings {
962-
enabled
931+
conditionalBreakingChangeConfiguration {
932+
isEnabled
963933
period
964934
percentage
965935
targets {
@@ -1362,7 +1332,7 @@ export function createCdnAccess(selector: TargetSelectorInput, token: string) {
13621332
`),
13631333
token,
13641334
variables: {
1365-
input: { selector, alias: 'CDN Access Token' },
1335+
input: { target: { bySelector: selector }, alias: 'CDN Access Token' },
13661336
},
13671337
});
13681338
}

integration-tests/testkit/seed.ts

Lines changed: 41 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -44,14 +44,13 @@ import {
4444
readOperationBody,
4545
readOperationsStats,
4646
readTokenInfo,
47-
setTargetValidation,
4847
updateBaseSchema,
4948
updateMemberRole,
5049
updateTargetValidationSettings,
5150
} from './flow';
5251
import * as GraphQLSchema from './gql/graphql';
5352
import {
54-
BreakingChangeFormula,
53+
BreakingChangeFormulaType,
5554
ProjectType,
5655
SchemaPolicyInput,
5756
TargetAccessScope,
@@ -641,52 +640,64 @@ export function initSeed() {
641640
},
642641
};
643642
},
644-
async toggleTargetValidation(enabled: boolean, ttarget: TargetOverwrite = target) {
645-
const result = await setTargetValidation(
643+
async toggleTargetValidation(
644+
isEnabled: boolean,
645+
ttarget: TargetOverwrite = target,
646+
) {
647+
const result = await updateTargetValidationSettings(
646648
{
647-
enabled,
648-
organizationSlug: organization.slug,
649-
projectSlug: project.slug,
650-
targetSlug: ttarget.slug,
649+
target: {
650+
bySelector: {
651+
organizationSlug: organization.slug,
652+
projectSlug: project.slug,
653+
targetSlug: ttarget.slug,
654+
},
655+
},
656+
conditionalBreakingChangeConfiguration: {
657+
isEnabled,
658+
},
651659
},
652660
{
653661
token: ownerToken,
654662
},
655663
).then(r => r.expectNoGraphQLErrors());
656664

657-
return result;
665+
return result.updateTargetConditionalBreakingChangeConfiguration.ok!.target
666+
.conditionalBreakingChangeConfiguration;
658667
},
659668
async updateTargetValidationSettings({
660669
excludedClients,
661670
percentage,
662671
target: ttarget = target,
663672
requestCount,
664673
breakingChangeFormula,
665-
}: {
666-
excludedClients?: string[];
667-
percentage: number;
668-
requestCount?: number;
669-
breakingChangeFormula?: BreakingChangeFormula;
674+
}: GraphQLSchema.ConditionalBreakingChangeConfigurationInput & {
670675
target?: TargetOverwrite;
671676
}) {
672677
const result = await updateTargetValidationSettings(
673678
{
674-
organizationSlug: organization.slug,
675-
projectSlug: project.slug,
676-
targetSlug: ttarget.slug,
677-
excludedClients,
678-
percentage,
679-
requestCount,
680-
breakingChangeFormula,
681-
period: 2,
682-
targetIds: [target.id],
679+
target: {
680+
bySelector: {
681+
organizationSlug: organization.slug,
682+
projectSlug: project.slug,
683+
targetSlug: ttarget.slug,
684+
},
685+
},
686+
conditionalBreakingChangeConfiguration: {
687+
excludedClients,
688+
percentage,
689+
requestCount,
690+
breakingChangeFormula,
691+
period: 2,
692+
targetIds: [target.id],
693+
},
683694
},
684695
{
685696
token: ownerToken,
686697
},
687698
).then(r => r.expectNoGraphQLErrors());
688699

689-
return result.updateTargetValidationSettings;
700+
return result.updateTargetConditionalBreakingChangeConfiguration;
690701
},
691702
async compareToPreviousVersion(version: string, ttarget: TargetOverwrite = target) {
692703
return (
@@ -784,8 +795,12 @@ export function initSeed() {
784795
async createTarget(args?: { slug?: string; accessToken?: string }) {
785796
return createTarget(
786797
{
787-
organizationSlug: orgSlug,
788-
projectSlug: project.slug,
798+
project: {
799+
bySelector: {
800+
organizationSlug: orgSlug,
801+
projectSlug: project.slug,
802+
},
803+
},
789804
slug: args?.slug ?? generateUnique(),
790805
},
791806
args?.accessToken ?? ownerToken,

integration-tests/tests/api/artifacts-cdn.spec.ts

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -591,10 +591,12 @@ describe('CDN token', () => {
591591
document: DeleteCDNAccessTokenMutation,
592592
variables: {
593593
input: {
594-
selector: {
595-
organizationSlug: organization.slug,
596-
projectSlug: project.slug,
597-
targetSlug: target.slug,
594+
target: {
595+
bySelector: {
596+
organizationSlug: organization.slug,
597+
projectSlug: project.slug,
598+
targetSlug: target.slug,
599+
},
598600
},
599601
cdnAccessTokenId: paginatedResult.target!.cdnAccessTokens.edges[0].node.id,
600602
},
@@ -648,10 +650,12 @@ describe('CDN token', () => {
648650
document: DeleteCDNAccessTokenMutation,
649651
variables: {
650652
input: {
651-
selector: {
652-
organizationSlug: organization.slug,
653-
projectSlug: project.slug,
654-
targetSlug: target.slug,
653+
target: {
654+
bySelector: {
655+
organizationSlug: organization.slug,
656+
projectSlug: project.slug,
657+
targetSlug: target.slug,
658+
},
655659
},
656660
cdnAccessTokenId: paginatedResult.target!.cdnAccessTokens.edges[0].node.id,
657661
},

integration-tests/tests/api/schema/publish.spec.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -498,8 +498,12 @@ describe.each([ProjectType.Stitching, ProjectType.Federation])('$projectType', p
498498
.then(r => r.expectNoGraphQLErrors());
499499
const createTargetResult = await createTarget(
500500
{
501-
organizationSlug: organization.slug,
502-
projectSlug: project.slug,
501+
project: {
502+
bySelector: {
503+
organizationSlug: organization.slug,
504+
projectSlug: project.slug,
505+
},
506+
},
503507
slug: 'target2',
504508
},
505509
ownerToken,

integration-tests/tests/api/target/crud.spec.ts

Lines changed: 42 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,13 @@ test.concurrent(`changing a target's slug should result changing its name`, asyn
99

1010
const renameResult = await updateTargetSlug(
1111
{
12-
organizationSlug: organization.slug,
13-
projectSlug: project.slug,
14-
targetSlug: target.slug,
12+
target: {
13+
bySelector: {
14+
organizationSlug: organization.slug,
15+
projectSlug: project.slug,
16+
targetSlug: target.slug,
17+
},
18+
},
1519
slug: 'bar',
1620
},
1721
ownerToken,
@@ -32,9 +36,13 @@ test.concurrent(
3236

3337
const renameResult = await updateTargetSlug(
3438
{
35-
organizationSlug: organization.slug,
36-
projectSlug: project.slug,
37-
targetSlug: target.slug,
39+
target: {
40+
bySelector: {
41+
organizationSlug: organization.slug,
42+
projectSlug: project.slug,
43+
targetSlug: target.slug,
44+
},
45+
},
3846
slug: target.slug,
3947
},
4048
ownerToken,
@@ -62,9 +70,13 @@ test.concurrent(
6270

6371
const renameResult = await updateTargetSlug(
6472
{
65-
organizationSlug: organization.slug,
66-
projectSlug: project.slug,
67-
targetSlug: firstTarget.slug,
73+
target: {
74+
bySelector: {
75+
organizationSlug: organization.slug,
76+
projectSlug: project.slug,
77+
targetSlug: firstTarget.slug,
78+
},
79+
},
6880
slug: secondTarget.slug,
6981
},
7082
ownerToken,
@@ -90,19 +102,27 @@ test.concurrent(
90102

91103
await updateTargetSlug(
92104
{
93-
organizationSlug: organization.slug,
94-
projectSlug: project2.slug,
95-
targetSlug: target2.slug,
105+
target: {
106+
bySelector: {
107+
organizationSlug: organization.slug,
108+
projectSlug: project2.slug,
109+
targetSlug: target2.slug,
110+
},
111+
},
96112
slug: sharedSlug,
97113
},
98114
ownerToken,
99115
).then(r => r.expectNoGraphQLErrors());
100116

101117
const renameResult = await updateTargetSlug(
102118
{
103-
organizationSlug: organization.slug,
104-
projectSlug: project.slug,
105-
targetSlug: target.slug,
119+
target: {
120+
bySelector: {
121+
organizationSlug: organization.slug,
122+
projectSlug: project.slug,
123+
targetSlug: target.slug,
124+
},
125+
},
106126
slug: sharedSlug,
107127
},
108128
ownerToken,
@@ -124,9 +144,13 @@ test.concurrent(
124144

125145
const renameResult = await updateTargetSlug(
126146
{
127-
organizationSlug: organization.slug,
128-
projectSlug: project.slug,
129-
targetSlug: target.slug,
147+
target: {
148+
bySelector: {
149+
organizationSlug: organization.slug,
150+
projectSlug: project.slug,
151+
targetSlug: target.slug,
152+
},
153+
},
130154
slug: 'view',
131155
},
132156
ownerToken,

0 commit comments

Comments
 (0)