From d2fe0231f69712dc68978308212469b86c04011c Mon Sep 17 00:00:00 2001 From: Yuri Mazursky Date: Mon, 27 Jan 2025 11:58:03 +0000 Subject: [PATCH 01/12] feat: add bulk actions v2 support --- lib/adapters/REST/endpoints/bulk-action.ts | 62 +++++++++++++--------- lib/common-types.ts | 15 +++--- lib/entities/bulk-action.ts | 53 ++++++++++++++++-- 3 files changed, 94 insertions(+), 36 deletions(-) diff --git a/lib/adapters/REST/endpoints/bulk-action.ts b/lib/adapters/REST/endpoints/bulk-action.ts index cc63d1542f..a7cfbb0173 100644 --- a/lib/adapters/REST/endpoints/bulk-action.ts +++ b/lib/adapters/REST/endpoints/bulk-action.ts @@ -5,6 +5,9 @@ import type { BulkActionPublishPayload, BulkActionUnpublishPayload, BulkActionValidatePayload, + PublishBulkActionV2Payload, + UnpublishBulkActionV2Payload, + ValidateBulkActionV2Payload, } from '../../../entities/bulk-action' import type { RestEndpoint } from '../types' import * as raw from './raw' @@ -19,38 +22,47 @@ export const get: RestEndpoint<'BulkAction', 'get'> = ( ) } -export const publish: RestEndpoint<'BulkAction', 'publish'> = ( +type PublishPayload = BulkActionPublishPayload | PublishBulkActionV2Payload<'add'> +type UnpublishPayload = BulkActionUnpublishPayload | UnpublishBulkActionV2Payload +type ValidatePayload = BulkActionValidatePayload | ValidateBulkActionV2Payload<'add'> + +export async function publish(http: AxiosInstance, params: GetSpaceEnvironmentParams, payload: BulkActionPublishPayload): Promise> +export async function publish(http: AxiosInstance, params: GetSpaceEnvironmentParams, payload: PublishBulkActionV2Payload<'add'>): Promise>> +export async function publish( http: AxiosInstance, params: GetSpaceEnvironmentParams, - payload: BulkActionPublishPayload -): Promise> => { - return raw.post( - http, - `/spaces/${params.spaceId}/environments/${params.environmentId}/bulk_actions/publish`, - payload - ) + payload: PublishPayload, +): Promise> { + const url = 'action' in payload && payload.action === 'publish' + ? `/spaces/${params.spaceId}/environments/${params.environmentId}/bulk_actions` + : `/spaces/${params.spaceId}/environments/${params.environmentId}/bulk_actions/publish` + + return raw.post(http, url, payload) } -export const unpublish: RestEndpoint<'BulkAction', 'unpublish'> = ( +export async function unpublish(http: AxiosInstance, params: GetSpaceEnvironmentParams, payload: BulkActionUnpublishPayload): Promise> +export async function unpublish(http: AxiosInstance, params: GetSpaceEnvironmentParams, payload: UnpublishBulkActionV2Payload): Promise> +export async function unpublish( http: AxiosInstance, params: GetSpaceEnvironmentParams, - payload: BulkActionUnpublishPayload -): Promise> => { - return raw.post( - http, - `/spaces/${params.spaceId}/environments/${params.environmentId}/bulk_actions/unpublish`, - payload - ) -} + payload: UnpublishPayload +): Promise> { + const url = 'action' in payload && payload.action === 'unpublish' + ? `/spaces/${params.spaceId}/environments/${params.environmentId}/bulk_actions` + : `/spaces/${params.spaceId}/environments/${params.environmentId}/bulk_actions/unpublish` -export const validate: RestEndpoint<'BulkAction', 'validate'> = ( + return raw.post(http, url, payload) +} +export async function validate(http: AxiosInstance, params: GetSpaceEnvironmentParams, payload: BulkActionValidatePayload): Promise> +export async function validate(http: AxiosInstance, params: GetSpaceEnvironmentParams, payload: ValidateBulkActionV2Payload<'add'>): Promise>> +export async function validate( http: AxiosInstance, params: GetSpaceEnvironmentParams, - payload: BulkActionValidatePayload -): Promise> => { - return raw.post( - http, - `/spaces/${params.spaceId}/environments/${params.environmentId}/bulk_actions/validate`, - payload - ) + payload: ValidatePayload +): Promise> { + const url = 'action' in payload && payload.action === 'validate' + ? `/spaces/${params.spaceId}/environments/${params.environmentId}/bulk_actions` + : `/spaces/${params.spaceId}/environments/${params.environmentId}/bulk_actions/validate` + + return raw.post(http, url, payload) } diff --git a/lib/common-types.ts b/lib/common-types.ts index 1fdb7b4645..076cb38f68 100644 --- a/lib/common-types.ts +++ b/lib/common-types.ts @@ -41,6 +41,9 @@ import type { BulkActionPublishPayload, BulkActionUnpublishPayload, BulkActionValidatePayload, + PublishBulkActionV2Payload, + UnpublishBulkActionV2Payload, + ValidateBulkActionV2Payload, } from './entities/bulk-action' import type { CommentProps, @@ -1141,18 +1144,18 @@ export type MRActions = { } publish: { params: GetSpaceEnvironmentParams - payload: BulkActionPublishPayload - return: BulkActionProps + payload: BulkActionPublishPayload | PublishBulkActionV2Payload<'add'> + return: BulkActionProps> } unpublish: { params: GetSpaceEnvironmentParams - payload: BulkActionUnpublishPayload - return: BulkActionProps + payload: BulkActionUnpublishPayload | UnpublishBulkActionV2Payload + return: BulkActionProps } validate: { params: GetSpaceEnvironmentParams - payload: BulkActionValidatePayload - return: BulkActionProps + payload: BulkActionValidatePayload | ValidateBulkActionV2Payload<'add'> + return: BulkActionProps> } } Comment: { diff --git a/lib/entities/bulk-action.ts b/lib/entities/bulk-action.ts index ca697c513b..5ced9b211c 100644 --- a/lib/entities/bulk-action.ts +++ b/lib/entities/bulk-action.ts @@ -69,6 +69,49 @@ export interface BulkActionPublishPayload extends MakeRequestPayload { } } +interface AddFieldsEntity | VersionedLink> { + entity: L + add?: { + fields: Record<'*', string[]> + } +} + +interface RemoveFieldsEntity | VersionedLink> { + entity: L + remove?: { + fields: Record<'*', string[]> + } +} +type BulkActionEntity | VersionedLink> = { + entity: L +} + +export interface PublishBulkActionV2Payload { + action: 'publish' + entities: PublishActionType extends 'remove' + ? RemoveFieldsEntity>[] + : AddFieldsEntity>[] +} + +export interface ValidateBulkActionV2Payload { + action: 'validate' + entities: PublishActionType extends 'remove' + ? RemoveFieldsEntity>[] + : AddFieldsEntity>[] +} + +export interface UnpublishBulkActionV2Payload { + action: 'unpublish' + entities: BulkActionEntity>[] +} + +export type BulkActionV2Payload = + | PublishBulkActionV2Payload<'add'> + | PublishBulkActionV2Payload<'remove'> + | UnpublishBulkActionV2Payload + | ValidateBulkActionV2Payload<'add'> + | ValidateBulkActionV2Payload<'remove'> + export type BulkActionSysProps = { id: string type: 'BulkAction' @@ -81,7 +124,7 @@ export type BulkActionSysProps = { } /** The object returned by the BulkActions API */ -export interface BulkActionProps { +export interface BulkActionProps { sys: BulkActionSysProps action: BulkActionType /** original payload when BulkAction was created */ @@ -120,7 +163,7 @@ function createBulkActionApi(makeRequest: MakeRequest) { params, }).then((bulkAction) => wrapBulkAction(makeRequest, bulkAction)) }, - async waitProcessing( + async waitProcessing( options?: AsyncActionProcessingOptions ): Promise> { return pollAsyncActionStatus>(async () => this.get(), options) @@ -128,7 +171,7 @@ function createBulkActionApi(makeRequest: MakeRequest) { } } -export interface BulkAction +export interface BulkAction extends BulkActionProps, BulkActionApiMethods, DefaultElements> {} @@ -139,9 +182,9 @@ export interface BulkAction * @param data - Raw BulkAction data * @return Wrapped BulkAction data */ -export function wrapBulkAction( +export function wrapBulkAction( makeRequest: MakeRequest, - data: BulkActionProps + data: BulkActionProps ): BulkAction { const bulkAction = toPlainObject(copy(data)) const bulkActionWithApiMethods = enhanceWithMethods( From 01b28d010dee5ef6554ef22095487e55b5f2ae48 Mon Sep 17 00:00:00 2001 From: Yuri Mazursky Date: Mon, 27 Jan 2025 12:02:05 +0000 Subject: [PATCH 02/12] chore: update payload types --- lib/plain/common-types.ts | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/lib/plain/common-types.ts b/lib/plain/common-types.ts index 69ec942cb2..e636fc407f 100644 --- a/lib/plain/common-types.ts +++ b/lib/plain/common-types.ts @@ -36,6 +36,9 @@ import type { BulkActionPublishPayload, BulkActionUnpublishPayload, BulkActionValidatePayload, + PublishBulkActionV2Payload, + UnpublishBulkActionV2Payload, + ValidateBulkActionV2Payload, } from '../entities/bulk-action' import type { ContentTypeProps, CreateContentTypeProps } from '../entities/content-type' import type { CreateEntryProps, EntryProps, EntryReferenceProps } from '../entities/entry' @@ -213,16 +216,16 @@ export type PlainClientAPI = { get(params: GetBulkActionParams): Promise> publish( params: GetSpaceEnvironmentParams, - payload: BulkActionPublishPayload - ): Promise> + payload: BulkActionPublishPayload | PublishBulkActionV2Payload<'add'> + ): Promise>> unpublish( params: GetSpaceEnvironmentParams, - payload: BulkActionUnpublishPayload - ): Promise> + payload: BulkActionUnpublishPayload | UnpublishBulkActionV2Payload + ): Promise> validate( params: GetSpaceEnvironmentParams, - payload: BulkActionValidatePayload - ): Promise> + payload: BulkActionValidatePayload | ValidateBulkActionV2Payload<'add'> + ): Promise>> } comment: CommentPlainClientAPI concept: ConceptPlainClientAPI From 1f7395678399afe248febd427fe15e1bd17fd210 Mon Sep 17 00:00:00 2001 From: Yuri Mazursky Date: Tue, 28 Jan 2025 11:56:18 +0000 Subject: [PATCH 03/12] fix: add separate methods for v2 bulk actions --- lib/adapters/REST/endpoints/bulk-action.ts | 99 +++++++++++++++------- lib/common-types.ts | 36 ++++++-- lib/plain/common-types.ts | 26 ++++-- lib/plain/plain-client.ts | 4 + 4 files changed, 122 insertions(+), 43 deletions(-) diff --git a/lib/adapters/REST/endpoints/bulk-action.ts b/lib/adapters/REST/endpoints/bulk-action.ts index a7cfbb0173..40a7178585 100644 --- a/lib/adapters/REST/endpoints/bulk-action.ts +++ b/lib/adapters/REST/endpoints/bulk-action.ts @@ -22,47 +22,84 @@ export const get: RestEndpoint<'BulkAction', 'get'> = ( ) } -type PublishPayload = BulkActionPublishPayload | PublishBulkActionV2Payload<'add'> -type UnpublishPayload = BulkActionUnpublishPayload | UnpublishBulkActionV2Payload -type ValidatePayload = BulkActionValidatePayload | ValidateBulkActionV2Payload<'add'> - -export async function publish(http: AxiosInstance, params: GetSpaceEnvironmentParams, payload: BulkActionPublishPayload): Promise> -export async function publish(http: AxiosInstance, params: GetSpaceEnvironmentParams, payload: PublishBulkActionV2Payload<'add'>): Promise>> -export async function publish( +export const publish: RestEndpoint<'BulkAction', 'publish'> = ( http: AxiosInstance, params: GetSpaceEnvironmentParams, - payload: PublishPayload, -): Promise> { - const url = 'action' in payload && payload.action === 'publish' - ? `/spaces/${params.spaceId}/environments/${params.environmentId}/bulk_actions` - : `/spaces/${params.spaceId}/environments/${params.environmentId}/bulk_actions/publish` + payload: BulkActionPublishPayload, +): Promise> => { + return raw.post( + http, + `/spaces/${params.spaceId}/environments/${params.environmentId}/bulk_actions/publish`, + payload + ) +} - return raw.post(http, url, payload) +export const unpublish: RestEndpoint<'BulkAction', 'unpublish'> = ( + http: AxiosInstance, + params: GetSpaceEnvironmentParams, + payload: BulkActionUnpublishPayload +): Promise> => { + return raw.post( + http, + `/spaces/${params.spaceId}/environments/${params.environmentId}/bulk_actions/unpublish`, + payload + ) } -export async function unpublish(http: AxiosInstance, params: GetSpaceEnvironmentParams, payload: BulkActionUnpublishPayload): Promise> -export async function unpublish(http: AxiosInstance, params: GetSpaceEnvironmentParams, payload: UnpublishBulkActionV2Payload): Promise> -export async function unpublish( +export const validate: RestEndpoint<'BulkAction', 'validate'> = ( http: AxiosInstance, params: GetSpaceEnvironmentParams, - payload: UnpublishPayload -): Promise> { - const url = 'action' in payload && payload.action === 'unpublish' - ? `/spaces/${params.spaceId}/environments/${params.environmentId}/bulk_actions` - : `/spaces/${params.spaceId}/environments/${params.environmentId}/bulk_actions/unpublish` + payload: BulkActionValidatePayload +): Promise> => { + return raw.post( + http, + `/spaces/${params.spaceId}/environments/${params.environmentId}/bulk_actions/validate`, + payload + ) +} - return raw.post(http, url, payload) +export const getV2: RestEndpoint<'BulkAction', 'getV2'> = ( + http: AxiosInstance, + params: GetBulkActionParams +) => { + return raw.get( + http, + `/spaces/${params.spaceId}/environments/${params.environmentId}/bulk_actions/${params.bulkActionId}` + ) } -export async function validate(http: AxiosInstance, params: GetSpaceEnvironmentParams, payload: BulkActionValidatePayload): Promise> -export async function validate(http: AxiosInstance, params: GetSpaceEnvironmentParams, payload: ValidateBulkActionV2Payload<'add'>): Promise>> -export async function validate( + +export const publishV2: RestEndpoint<'BulkAction', 'publishV2'> = ( http: AxiosInstance, params: GetSpaceEnvironmentParams, - payload: ValidatePayload -): Promise> { - const url = 'action' in payload && payload.action === 'validate' - ? `/spaces/${params.spaceId}/environments/${params.environmentId}/bulk_actions` - : `/spaces/${params.spaceId}/environments/${params.environmentId}/bulk_actions/validate` + payload: PublishBulkActionV2Payload<'add'>, +): Promise>> => { + return raw.post( + http, + `/spaces/${params.spaceId}/environments/${params.environmentId}/bulk_actions`, + payload + ) +} - return raw.post(http, url, payload) +export const unpublishV2: RestEndpoint<'BulkAction', 'unpublishV2'> = ( + http: AxiosInstance, + params: GetSpaceEnvironmentParams, + payload: PublishBulkActionV2Payload<'remove'> | UnpublishBulkActionV2Payload, +): Promise | UnpublishBulkActionV2Payload>> => { + return raw.post( + http, + `/spaces/${params.spaceId}/environments/${params.environmentId}/bulk_actions`, + payload + ) +} + +export const validateV2: RestEndpoint<'BulkAction', 'validateV2'> = ( + http: AxiosInstance, + params: GetSpaceEnvironmentParams, + payload: ValidateBulkActionV2Payload<'add'> | ValidateBulkActionV2Payload<'remove'>, +): Promise | ValidateBulkActionV2Payload<'remove'>>> => { + return raw.post( + http, + `/spaces/${params.spaceId}/environments/${params.environmentId}/bulk_actions`, + payload + ) } diff --git a/lib/common-types.ts b/lib/common-types.ts index 076cb38f68..209c620b79 100644 --- a/lib/common-types.ts +++ b/lib/common-types.ts @@ -40,6 +40,7 @@ import type { BulkActionProps, BulkActionPublishPayload, BulkActionUnpublishPayload, + BulkActionV2Payload, BulkActionValidatePayload, PublishBulkActionV2Payload, UnpublishBulkActionV2Payload, @@ -451,6 +452,10 @@ type MRInternal = { (opts: MROpts<'BulkAction', 'publish', UA>): MRReturn<'BulkAction', 'publish'> (opts: MROpts<'BulkAction', 'unpublish', UA>): MRReturn<'BulkAction', 'unpublish'> (opts: MROpts<'BulkAction', 'validate', UA>): MRReturn<'BulkAction', 'validate'> + (opts: MROpts<'BulkAction', 'getV2', UA>): MRReturn<'BulkAction', 'getV2'> + (opts: MROpts<'BulkAction', 'publishV2', UA>): MRReturn<'BulkAction', 'publishV2'> + (opts: MROpts<'BulkAction', 'unpublishV2', UA>): MRReturn<'BulkAction', 'unpublishV2'> + (opts: MROpts<'BulkAction', 'validateV2', UA>): MRReturn<'BulkAction', 'validateV2'> (opts: MROpts<'Comment', 'get', UA>): MRReturn<'Comment', 'get'> (opts: MROpts<'Comment', 'getMany', UA>): MRReturn<'Comment', 'getMany'> @@ -1144,18 +1149,37 @@ export type MRActions = { } publish: { params: GetSpaceEnvironmentParams - payload: BulkActionPublishPayload | PublishBulkActionV2Payload<'add'> - return: BulkActionProps> + payload: BulkActionPublishPayload + return: BulkActionProps } unpublish: { params: GetSpaceEnvironmentParams - payload: BulkActionUnpublishPayload | UnpublishBulkActionV2Payload - return: BulkActionProps + payload: BulkActionUnpublishPayload + return: BulkActionProps } validate: { params: GetSpaceEnvironmentParams - payload: BulkActionValidatePayload | ValidateBulkActionV2Payload<'add'> - return: BulkActionProps> + payload: BulkActionValidatePayload + return: BulkActionProps + } + getV2: { + params: GetBulkActionParams + return: BulkActionProps + } + publishV2: { + params: GetSpaceEnvironmentParams + payload: PublishBulkActionV2Payload<'add'> + return: BulkActionProps> + } + unpublishV2: { + params: GetSpaceEnvironmentParams + payload: PublishBulkActionV2Payload<'remove'> | UnpublishBulkActionV2Payload + return: BulkActionProps | UnpublishBulkActionV2Payload> + } + validateV2: { + params: GetSpaceEnvironmentParams + payload: ValidateBulkActionV2Payload<'add'> | ValidateBulkActionV2Payload<'remove'> + return: BulkActionProps | ValidateBulkActionV2Payload<'remove'>> } } Comment: { diff --git a/lib/plain/common-types.ts b/lib/plain/common-types.ts index e636fc407f..2ecb23a60b 100644 --- a/lib/plain/common-types.ts +++ b/lib/plain/common-types.ts @@ -35,6 +35,7 @@ import type { BulkActionProps, BulkActionPublishPayload, BulkActionUnpublishPayload, + BulkActionV2Payload, BulkActionValidatePayload, PublishBulkActionV2Payload, UnpublishBulkActionV2Payload, @@ -216,16 +217,29 @@ export type PlainClientAPI = { get(params: GetBulkActionParams): Promise> publish( params: GetSpaceEnvironmentParams, - payload: BulkActionPublishPayload | PublishBulkActionV2Payload<'add'> - ): Promise>> + payload: BulkActionPublishPayload + ): Promise> unpublish( params: GetSpaceEnvironmentParams, - payload: BulkActionUnpublishPayload | UnpublishBulkActionV2Payload - ): Promise> + payload: BulkActionUnpublishPayload + ): Promise> validate( params: GetSpaceEnvironmentParams, - payload: BulkActionValidatePayload | ValidateBulkActionV2Payload<'add'> - ): Promise>> + payload: BulkActionValidatePayload + ): Promise> + getV2(params: GetBulkActionParams): Promise> + publishV2( + params: GetSpaceEnvironmentParams, + payload: PublishBulkActionV2Payload<'add'> + ): Promise>> + unpublishV2( + params: GetSpaceEnvironmentParams, + payload: PublishBulkActionV2Payload<'remove'> | UnpublishBulkActionV2Payload + ): Promise | UnpublishBulkActionV2Payload>> + validateV2( + params: GetSpaceEnvironmentParams, + payload: ValidateBulkActionV2Payload<'add'> | ValidateBulkActionV2Payload<'remove'> + ): Promise | ValidateBulkActionV2Payload<'remove'>>> } comment: CommentPlainClientAPI concept: ConceptPlainClientAPI diff --git a/lib/plain/plain-client.ts b/lib/plain/plain-client.ts index dfcbcdfd4d..cf0313e879 100644 --- a/lib/plain/plain-client.ts +++ b/lib/plain/plain-client.ts @@ -182,6 +182,10 @@ export const createPlainClient = ( publish: wrap(wrapParams, 'BulkAction', 'publish'), unpublish: wrap(wrapParams, 'BulkAction', 'unpublish'), validate: wrap(wrapParams, 'BulkAction', 'validate'), + getV2: wrap(wrapParams, 'BulkAction', 'getV2'), + publishV2: wrap(wrapParams, 'BulkAction', 'publishV2'), + unpublishV2: wrap(wrapParams, 'BulkAction', 'unpublishV2'), + validateV2: wrap(wrapParams, 'BulkAction', 'validateV2'), }, comment: { get: wrap(wrapParams, 'Comment', 'get') as PlainClientAPI['comment']['get'], From f710030f2105ac6e44091ce95557c053c81c89f2 Mon Sep 17 00:00:00 2001 From: Yuri Mazursky Date: Tue, 28 Jan 2025 20:57:39 +0000 Subject: [PATCH 04/12] fix: linting issues --- lib/adapters/REST/endpoints/bulk-action.ts | 16 ++++++++++------ lib/common-types.ts | 4 +++- lib/plain/common-types.ts | 4 +++- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/lib/adapters/REST/endpoints/bulk-action.ts b/lib/adapters/REST/endpoints/bulk-action.ts index 40a7178585..e032a597a9 100644 --- a/lib/adapters/REST/endpoints/bulk-action.ts +++ b/lib/adapters/REST/endpoints/bulk-action.ts @@ -25,7 +25,7 @@ export const get: RestEndpoint<'BulkAction', 'get'> = ( export const publish: RestEndpoint<'BulkAction', 'publish'> = ( http: AxiosInstance, params: GetSpaceEnvironmentParams, - payload: BulkActionPublishPayload, + payload: BulkActionPublishPayload ): Promise> => { return raw.post( http, @@ -71,7 +71,7 @@ export const getV2: RestEndpoint<'BulkAction', 'getV2'> = ( export const publishV2: RestEndpoint<'BulkAction', 'publishV2'> = ( http: AxiosInstance, params: GetSpaceEnvironmentParams, - payload: PublishBulkActionV2Payload<'add'>, + payload: PublishBulkActionV2Payload<'add'> ): Promise>> => { return raw.post( http, @@ -83,8 +83,10 @@ export const publishV2: RestEndpoint<'BulkAction', 'publishV2'> = ( export const unpublishV2: RestEndpoint<'BulkAction', 'unpublishV2'> = ( http: AxiosInstance, params: GetSpaceEnvironmentParams, - payload: PublishBulkActionV2Payload<'remove'> | UnpublishBulkActionV2Payload, -): Promise | UnpublishBulkActionV2Payload>> => { + payload: PublishBulkActionV2Payload<'remove'> | UnpublishBulkActionV2Payload +): Promise< + BulkActionProps | UnpublishBulkActionV2Payload> +> => { return raw.post( http, `/spaces/${params.spaceId}/environments/${params.environmentId}/bulk_actions`, @@ -95,8 +97,10 @@ export const unpublishV2: RestEndpoint<'BulkAction', 'unpublishV2'> = ( export const validateV2: RestEndpoint<'BulkAction', 'validateV2'> = ( http: AxiosInstance, params: GetSpaceEnvironmentParams, - payload: ValidateBulkActionV2Payload<'add'> | ValidateBulkActionV2Payload<'remove'>, -): Promise | ValidateBulkActionV2Payload<'remove'>>> => { + payload: ValidateBulkActionV2Payload<'add'> | ValidateBulkActionV2Payload<'remove'> +): Promise< + BulkActionProps | ValidateBulkActionV2Payload<'remove'>> +> => { return raw.post( http, `/spaces/${params.spaceId}/environments/${params.environmentId}/bulk_actions`, diff --git a/lib/common-types.ts b/lib/common-types.ts index 209c620b79..05fc5339c8 100644 --- a/lib/common-types.ts +++ b/lib/common-types.ts @@ -1179,7 +1179,9 @@ export type MRActions = { validateV2: { params: GetSpaceEnvironmentParams payload: ValidateBulkActionV2Payload<'add'> | ValidateBulkActionV2Payload<'remove'> - return: BulkActionProps | ValidateBulkActionV2Payload<'remove'>> + return: BulkActionProps< + ValidateBulkActionV2Payload<'add'> | ValidateBulkActionV2Payload<'remove'> + > } } Comment: { diff --git a/lib/plain/common-types.ts b/lib/plain/common-types.ts index 2ecb23a60b..3c45899e4f 100644 --- a/lib/plain/common-types.ts +++ b/lib/plain/common-types.ts @@ -239,7 +239,9 @@ export type PlainClientAPI = { validateV2( params: GetSpaceEnvironmentParams, payload: ValidateBulkActionV2Payload<'add'> | ValidateBulkActionV2Payload<'remove'> - ): Promise | ValidateBulkActionV2Payload<'remove'>>> + ): Promise< + BulkActionProps | ValidateBulkActionV2Payload<'remove'>> + > } comment: CommentPlainClientAPI concept: ConceptPlainClientAPI From 2ea259fb99187cbde716d0ffb24c65d735b2312f Mon Sep 17 00:00:00 2001 From: Yuri Mazursky Date: Wed, 29 Jan 2025 13:56:28 +0000 Subject: [PATCH 05/12] test: add new methods tests --- .../bulk-action-integration.test.ts | 83 ++++++++++++++++++- 1 file changed, 82 insertions(+), 1 deletion(-) diff --git a/test/integration/bulk-action-integration.test.ts b/test/integration/bulk-action-integration.test.ts index 0ff2a3ab38..c4c8e3daba 100644 --- a/test/integration/bulk-action-integration.test.ts +++ b/test/integration/bulk-action-integration.test.ts @@ -12,7 +12,7 @@ import { TestDefaults } from '../defaults' import { getDefaultSpace, initPlainClient, timeoutToCalmRateLimiting } from '../helpers' import { makeLink, makeVersionedLink } from '../utils' -describe('BulkActions Api', () => { +describe('BulkActions Api v1', () => { let testSpace: Space let testEnvironment: Environment @@ -257,3 +257,84 @@ describe('BulkActions Api', () => { }) }) }) + +describe('BulkActions Api v2 (Plain Client only)', () => { + afterAll(timeoutToCalmRateLimiting) + + const defaultParams = { + environmentId: TestDefaults.environmentId, + spaceId: TestDefaults.spaceId, + } + const plainClient = initPlainClient(defaultParams) + + it('bulkAction.publishV2', async () => { + const entry = await plainClient.entry.get({ + entryId: TestDefaults.entry.testEntryBulkActionId, + }) + + const bulkActionInProgress = await plainClient.bulkAction.publishV2(defaultParams, { + action: 'publish', + entities: [ + { + entity: makeVersionedLink('Entry', entry.sys.id, entry.sys.version), + add: { fields: { '*': ['en-US'] } }, + }, + ], + }) + + const bulkActionCompleted = await waitForBulkActionProcessing({ + ...defaultParams, + plainClient, + bulkActionId: bulkActionInProgress.sys.id, + }) + + expect(bulkActionCompleted.sys.status).toBe('succeeded') + expect(bulkActionCompleted.action).toBe('publish') + }) + + it('bulkAction.unpublishV2', async () => { + const entry = await plainClient.entry.get({ entryId: TestDefaults.entry.testEntryId }) + + const bulkActionInProgress = await plainClient.bulkAction.unpublishV2(defaultParams, { + action: 'publish', + entities: [ + { + entity: makeVersionedLink('Entry', entry.sys.id, entry.sys.version), + remove: { fields: { '*': ['en-US'] } }, + }, + ], + }) + + const bulkActionCompleted = await waitForBulkActionProcessing({ + ...defaultParams, + plainClient, + bulkActionId: bulkActionInProgress.sys.id, + }) + + expect(bulkActionCompleted.sys.status).toBe('succeeded') + expect(bulkActionCompleted.action).toBe('unpublish') + }) + + it('bulkAction.validateV2', async () => { + const entry = await plainClient.entry.get({ entryId: TestDefaults.entry.testEntryId }) + + const bulkActionInProgress = await plainClient.bulkAction.validateV2(defaultParams, { + action: 'validate', + entities: [ + { + entity: makeLink('Entry', entry.sys.id), + add: { fields: { '*': ['en-US'] } }, + }, + ], + }) + + const bulkActionCompleted = await waitForBulkActionProcessing({ + ...defaultParams, + plainClient, + bulkActionId: bulkActionInProgress.sys.id, + }) + + expect(bulkActionCompleted.sys.status).toBe('succeeded') + expect(bulkActionCompleted.action).toBe('validate') + }) +}) From c35460a524f227f328b64ecbb8b5f433aa50e6e4 Mon Sep 17 00:00:00 2001 From: Yuri Mazursky Date: Thu, 30 Jan 2025 11:08:59 +0000 Subject: [PATCH 06/12] test: adjust tests --- test/integration/bulk-action-integration.test.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/test/integration/bulk-action-integration.test.ts b/test/integration/bulk-action-integration.test.ts index c4c8e3daba..dd67fd606b 100644 --- a/test/integration/bulk-action-integration.test.ts +++ b/test/integration/bulk-action-integration.test.ts @@ -268,9 +268,7 @@ describe('BulkActions Api v2 (Plain Client only)', () => { const plainClient = initPlainClient(defaultParams) it('bulkAction.publishV2', async () => { - const entry = await plainClient.entry.get({ - entryId: TestDefaults.entry.testEntryBulkActionId, - }) + const entry = await plainClient.entry.get({ entryId: TestDefaults.entry.testEntryBulkActionId }) const bulkActionInProgress = await plainClient.bulkAction.publishV2(defaultParams, { action: 'publish', @@ -293,7 +291,7 @@ describe('BulkActions Api v2 (Plain Client only)', () => { }) it('bulkAction.unpublishV2', async () => { - const entry = await plainClient.entry.get({ entryId: TestDefaults.entry.testEntryId }) + const entry = await plainClient.entry.get({ entryId: TestDefaults.entry.testEntryBulkActionId }) const bulkActionInProgress = await plainClient.bulkAction.unpublishV2(defaultParams, { action: 'publish', @@ -316,7 +314,7 @@ describe('BulkActions Api v2 (Plain Client only)', () => { }) it('bulkAction.validateV2', async () => { - const entry = await plainClient.entry.get({ entryId: TestDefaults.entry.testEntryId }) + const entry = await plainClient.entry.get({ entryId: TestDefaults.entry.testEntryBulkActionId }) const bulkActionInProgress = await plainClient.bulkAction.validateV2(defaultParams, { action: 'validate', From 60b4409a249cbe8aab8da8fbc828ea360f2f4efe Mon Sep 17 00:00:00 2001 From: Yuri Mazursky Date: Thu, 30 Jan 2025 11:55:20 +0000 Subject: [PATCH 07/12] chore: add v2 wait method --- lib/methods/bulk-action.ts | 19 ++++++++++++++++++- .../bulk-action-integration.test.ts | 9 +++++---- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/lib/methods/bulk-action.ts b/lib/methods/bulk-action.ts index 0ea7056d4a..0090267b49 100644 --- a/lib/methods/bulk-action.ts +++ b/lib/methods/bulk-action.ts @@ -1,4 +1,4 @@ -import type { BulkActionPayload, BulkActionProps } from '../entities/bulk-action' +import type { BulkActionPayload, BulkActionProps, BulkActionV2Payload } from '../entities/bulk-action' import type { PlainClientAPI } from '../plain/common-types' import type { AsyncActionProcessingOptions } from './action' import { pollAsyncActionStatus } from './action' @@ -27,3 +27,20 @@ export async function waitForBulkActionProcessing( + { plainClient, spaceId, environmentId, bulkActionId }: PlainOptions, + options?: AsyncActionProcessingOptions +): Promise> { + return pollAsyncActionStatus( + async () => + plainClient.bulkAction.getV2({ + bulkActionId, + spaceId, + environmentId, + }), + options + ) +} diff --git a/test/integration/bulk-action-integration.test.ts b/test/integration/bulk-action-integration.test.ts index dd67fd606b..89ef6d5d99 100644 --- a/test/integration/bulk-action-integration.test.ts +++ b/test/integration/bulk-action-integration.test.ts @@ -7,10 +7,11 @@ import type { BulkActionValidatePayload, } from '../../lib/contentful-management' import type { Environment, Space } from '../../lib/contentful-management' -import { waitForBulkActionProcessing } from '../../lib/methods/bulk-action' +import { waitForBulkActionProcessing, waitForBulkActionV2Processing } from '../../lib/methods/bulk-action' import { TestDefaults } from '../defaults' import { getDefaultSpace, initPlainClient, timeoutToCalmRateLimiting } from '../helpers' import { makeLink, makeVersionedLink } from '../utils' +import { PublishBulkActionV2Payload, ValidateBulkActionV2Payload } from '../../lib/entities/bulk-action' describe('BulkActions Api v1', () => { let testSpace: Space @@ -280,7 +281,7 @@ describe('BulkActions Api v2 (Plain Client only)', () => { ], }) - const bulkActionCompleted = await waitForBulkActionProcessing({ + const bulkActionCompleted = await waitForBulkActionV2Processing>({ ...defaultParams, plainClient, bulkActionId: bulkActionInProgress.sys.id, @@ -303,7 +304,7 @@ describe('BulkActions Api v2 (Plain Client only)', () => { ], }) - const bulkActionCompleted = await waitForBulkActionProcessing({ + const bulkActionCompleted = await waitForBulkActionV2Processing>({ ...defaultParams, plainClient, bulkActionId: bulkActionInProgress.sys.id, @@ -326,7 +327,7 @@ describe('BulkActions Api v2 (Plain Client only)', () => { ], }) - const bulkActionCompleted = await waitForBulkActionProcessing({ + const bulkActionCompleted = await waitForBulkActionV2Processing({ ...defaultParams, plainClient, bulkActionId: bulkActionInProgress.sys.id, From 5e667d13a08579762f9c7914d92a76a940793b63 Mon Sep 17 00:00:00 2001 From: Yuri Mazursky Date: Thu, 30 Jan 2025 12:03:13 +0000 Subject: [PATCH 08/12] chore: fix lint errors --- lib/methods/bulk-action.ts | 6 +++++- .../bulk-action-integration.test.ts | 18 ++++++++++++++---- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/lib/methods/bulk-action.ts b/lib/methods/bulk-action.ts index 0090267b49..547f056f60 100644 --- a/lib/methods/bulk-action.ts +++ b/lib/methods/bulk-action.ts @@ -1,4 +1,8 @@ -import type { BulkActionPayload, BulkActionProps, BulkActionV2Payload } from '../entities/bulk-action' +import type { + BulkActionPayload, + BulkActionProps, + BulkActionV2Payload, +} from '../entities/bulk-action' import type { PlainClientAPI } from '../plain/common-types' import type { AsyncActionProcessingOptions } from './action' import { pollAsyncActionStatus } from './action' diff --git a/test/integration/bulk-action-integration.test.ts b/test/integration/bulk-action-integration.test.ts index 89ef6d5d99..19529752ba 100644 --- a/test/integration/bulk-action-integration.test.ts +++ b/test/integration/bulk-action-integration.test.ts @@ -7,11 +7,17 @@ import type { BulkActionValidatePayload, } from '../../lib/contentful-management' import type { Environment, Space } from '../../lib/contentful-management' -import { waitForBulkActionProcessing, waitForBulkActionV2Processing } from '../../lib/methods/bulk-action' +import { + waitForBulkActionProcessing, + waitForBulkActionV2Processing, +} from '../../lib/methods/bulk-action' import { TestDefaults } from '../defaults' import { getDefaultSpace, initPlainClient, timeoutToCalmRateLimiting } from '../helpers' import { makeLink, makeVersionedLink } from '../utils' -import { PublishBulkActionV2Payload, ValidateBulkActionV2Payload } from '../../lib/entities/bulk-action' +import { + PublishBulkActionV2Payload, + ValidateBulkActionV2Payload, +} from '../../lib/entities/bulk-action' describe('BulkActions Api v1', () => { let testSpace: Space @@ -281,7 +287,9 @@ describe('BulkActions Api v2 (Plain Client only)', () => { ], }) - const bulkActionCompleted = await waitForBulkActionV2Processing>({ + const bulkActionCompleted = await waitForBulkActionV2Processing< + PublishBulkActionV2Payload<'add'> + >({ ...defaultParams, plainClient, bulkActionId: bulkActionInProgress.sys.id, @@ -304,7 +312,9 @@ describe('BulkActions Api v2 (Plain Client only)', () => { ], }) - const bulkActionCompleted = await waitForBulkActionV2Processing>({ + const bulkActionCompleted = await waitForBulkActionV2Processing< + PublishBulkActionV2Payload<'remove'> + >({ ...defaultParams, plainClient, bulkActionId: bulkActionInProgress.sys.id, From 59bf69f39461ff5141570988b6f72fcdd815edb6 Mon Sep 17 00:00:00 2001 From: Yuri Mazursky Date: Fri, 31 Jan 2025 09:56:00 +0000 Subject: [PATCH 09/12] chore: export types --- lib/export-types.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/export-types.ts b/lib/export-types.ts index 98f64d2bbb..32b17bec70 100644 --- a/lib/export-types.ts +++ b/lib/export-types.ts @@ -80,6 +80,10 @@ export type { BulkActionType, BulkActionUnpublishPayload, BulkActionValidatePayload, + BulkActionV2Payload, + PublishBulkActionV2Payload, + UnpublishBulkActionV2Payload, + ValidateBulkActionV2Payload } from './entities/bulk-action' export type { Comment, From 0e3639bb74989b7caaf7a4e642d1552b13ee0d92 Mon Sep 17 00:00:00 2001 From: Yuri Mazursky Date: Fri, 31 Jan 2025 14:13:40 +0000 Subject: [PATCH 10/12] chore: fix linter errors --- lib/export-types.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/export-types.ts b/lib/export-types.ts index 32b17bec70..00698e85c1 100644 --- a/lib/export-types.ts +++ b/lib/export-types.ts @@ -83,7 +83,7 @@ export type { BulkActionV2Payload, PublishBulkActionV2Payload, UnpublishBulkActionV2Payload, - ValidateBulkActionV2Payload + ValidateBulkActionV2Payload, } from './entities/bulk-action' export type { Comment, From 560c415bb874cf0200ddd094d75d8fedf8487ab4 Mon Sep 17 00:00:00 2001 From: Yuri Mazursky Date: Mon, 3 Feb 2025 15:41:49 +0000 Subject: [PATCH 11/12] test: tweak unpublish test --- test/integration/bulk-action-integration.test.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/integration/bulk-action-integration.test.ts b/test/integration/bulk-action-integration.test.ts index 19529752ba..521df518c2 100644 --- a/test/integration/bulk-action-integration.test.ts +++ b/test/integration/bulk-action-integration.test.ts @@ -5,6 +5,7 @@ import type { BulkActionPublishPayload, BulkActionUnpublishPayload, BulkActionValidatePayload, + UnpublishBulkActionV2Payload, } from '../../lib/contentful-management' import type { Environment, Space } from '../../lib/contentful-management' import { @@ -303,17 +304,16 @@ describe('BulkActions Api v2 (Plain Client only)', () => { const entry = await plainClient.entry.get({ entryId: TestDefaults.entry.testEntryBulkActionId }) const bulkActionInProgress = await plainClient.bulkAction.unpublishV2(defaultParams, { - action: 'publish', + action: 'unpublish', entities: [ { - entity: makeVersionedLink('Entry', entry.sys.id, entry.sys.version), - remove: { fields: { '*': ['en-US'] } }, + entity: makeLink('Entry', entry.sys.id), }, ], }) const bulkActionCompleted = await waitForBulkActionV2Processing< - PublishBulkActionV2Payload<'remove'> + UnpublishBulkActionV2Payload >({ ...defaultParams, plainClient, From f6b9fa7f45bc2ec8fb6675fd7b289d52b241bb99 Mon Sep 17 00:00:00 2001 From: Yuri Mazursky Date: Mon, 3 Feb 2025 15:51:38 +0000 Subject: [PATCH 12/12] chore: fix prettier error --- test/integration/bulk-action-integration.test.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/test/integration/bulk-action-integration.test.ts b/test/integration/bulk-action-integration.test.ts index 521df518c2..95ca5d9a38 100644 --- a/test/integration/bulk-action-integration.test.ts +++ b/test/integration/bulk-action-integration.test.ts @@ -312,9 +312,7 @@ describe('BulkActions Api v2 (Plain Client only)', () => { ], }) - const bulkActionCompleted = await waitForBulkActionV2Processing< - UnpublishBulkActionV2Payload - >({ + const bulkActionCompleted = await waitForBulkActionV2Processing({ ...defaultParams, plainClient, bulkActionId: bulkActionInProgress.sys.id,