From 926a0c1aa675024b99889217e5fd28107b6145bf Mon Sep 17 00:00:00 2001 From: Yuki Kawamoto Date: Tue, 24 Apr 2018 20:40:22 +0900 Subject: [PATCH 1/5] create query from postResource --- src/actions.ts | 18 +++++++++++++++--- src/effects.ts | 4 ++++ src/reducers.ts | 12 ++++++++++++ src/services.ts | 10 ++++++++-- 4 files changed, 39 insertions(+), 5 deletions(-) diff --git a/src/actions.ts b/src/actions.ts index 3825de1..ec2b5a0 100644 --- a/src/actions.ts +++ b/src/actions.ts @@ -86,21 +86,33 @@ export class ApiApplyFailAction extends NgrxJsonApiAction { export class ApiPostInitAction extends NgrxJsonApiAction { readonly type = NgrxJsonApiActionTypes.API_POST_INIT; - constructor(public payload: Resource, public zoneId: string) { + constructor( + public payload: Resource, + public queryId: string, + public zoneId: string + ) { super(); } } export class ApiPostSuccessAction extends NgrxJsonApiAction { readonly type = NgrxJsonApiActionTypes.API_POST_SUCCESS; - constructor(public payload: Payload, public zoneId: string) { + constructor( + public payload: Payload, + public queryId: string, + public zoneId: string + ) { super(); } } export class ApiPostFailAction extends NgrxJsonApiAction { readonly type = NgrxJsonApiActionTypes.API_POST_FAIL; - constructor(public payload: Payload, public zoneId: string) { + constructor( + public payload: Payload, + public queryId: string, + public zoneId: string + ) { super(); } } diff --git a/src/effects.ts b/src/effects.ts index 787f607..6ffac9d 100644 --- a/src/effects.ts +++ b/src/effects.ts @@ -94,6 +94,7 @@ export class NgrxJsonApiEffects implements OnDestroy { jsonApiData: response.body, query: payload.query, }, + action.queryId, action.zoneId ) ), @@ -101,6 +102,7 @@ export class NgrxJsonApiEffects implements OnDestroy { of( new ApiPostFailAction( this.toErrorPayload(payload.query, error), + action.queryId, action.zoneId ) ) @@ -340,6 +342,7 @@ export class NgrxJsonApiEffects implements OnDestroy { jsonApiData: response.body, query: payload.query, }, + null, zoneId ) ), @@ -347,6 +350,7 @@ export class NgrxJsonApiEffects implements OnDestroy { of( new ApiPostFailAction( this.toErrorPayload(payload.query, error), + null, zoneId ) ) diff --git a/src/reducers.ts b/src/reducers.ts index e54b688..b283d17 100644 --- a/src/reducers.ts +++ b/src/reducers.ts @@ -86,9 +86,11 @@ export function NgrxJsonApiZoneReducer( false, true ); + let query = { queryId: action.queryId }; newZone = { ...zone, data: updatedData, + queries: updateQueryParams(zone.queries, query), isCreating: zone.isCreating + 1, }; return newZone; @@ -128,6 +130,11 @@ export function NgrxJsonApiZoneReducer( newZone = { ...zone, data: updateStoreDataFromPayload(zone.data, action.payload.jsonApiData), + queries: updateQueryResults( + zone.queries, + action.queryId, + action.payload.jsonApiData + ), isCreating: zone.isCreating - 1, }; return newZone; @@ -181,6 +188,11 @@ export function NgrxJsonApiZoneReducer( action.payload.query, action.payload.jsonApiData ), + queries: updateQueryErrors( + zone.queries, + action.queryId, + action.payload.jsonApiData + ), isCreating: zone.isCreating - 1, }; return newZone; diff --git a/src/services.ts b/src/services.ts index a58c251..b291575 100644 --- a/src/services.ts +++ b/src/services.ts @@ -222,15 +222,21 @@ export class NgrxJsonApiZoneService { * * @param resource */ - public postResource(options: PostResourceOptions) { + public postResource(options: PostResourceOptions): Observable { let resource = options.resource; let toRemote = _.isUndefined(options.toRemote) ? false : options.toRemote; + const queryId = uuid(); if (toRemote) { - this.store.dispatch(new ApiPostInitAction(resource, this.zoneId)); + this.store.dispatch( + new ApiPostInitAction(resource, queryId, this.zoneId) + ); } else { this.store.dispatch(new PostStoreResourceAction(resource, this.zoneId)); } + return this.store + .let(selectNgrxJsonApiZone(this.zoneId)) + .let(selectOneQueryResult(queryId)); } /** From 7570b5362e5571d72ec017a26732593b7fd01443 Mon Sep 17 00:00:00 2001 From: Yuki Kawamoto Date: Fri, 25 May 2018 14:41:56 +0900 Subject: [PATCH 2/5] do not throw error when query.id is null --- src/utils.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/utils.ts b/src/utils.ts index 35c5d79..9ca3290 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -446,7 +446,8 @@ export const updateResourceErrorsForQuery = ( query: Query, document: Document ): NgrxJsonApiStoreData => { - if (!query.type || !query.id || document.data instanceof Array) { + // id can be nullify when queryType is POST + if (!query.type || query.id === undefined || document.data instanceof Array) { throw new Error('invalid parameters'); } return updateResourceErrors( From 26e07394a1511cad2fd248b45342775cfa0e8477 Mon Sep 17 00:00:00 2001 From: Yuki Kawamoto Date: Mon, 28 May 2018 16:14:17 +0900 Subject: [PATCH 3/5] removeQuery on final of postResource --- src/services.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/services.ts b/src/services.ts index b291575..f34cafc 100644 --- a/src/services.ts +++ b/src/services.ts @@ -236,7 +236,10 @@ export class NgrxJsonApiZoneService { } return this.store .let(selectNgrxJsonApiZone(this.zoneId)) - .let(selectOneQueryResult(queryId)); + .let(selectOneQueryResult(queryId)) + .finally(() => { + this.removeQuery(queryId); + }); } /** From 87c929354a7705745d79b6130f2711c6b1d7ea12 Mon Sep 17 00:00:00 2001 From: Yuki Kawamoto Date: Fri, 29 Jun 2018 16:19:10 +0900 Subject: [PATCH 4/5] create query from patch/delete resource --- src/actions.ts | 36 ++++++++++++++++++++++++++++++------ src/effects.ts | 8 ++++++++ src/reducers.ts | 21 ++++++++++++++++++++- src/services.ts | 28 ++++++++++++++++++++++++---- src/utils.ts | 8 +++++++- 5 files changed, 89 insertions(+), 12 deletions(-) diff --git a/src/actions.ts b/src/actions.ts index ec2b5a0..8ad79d1 100644 --- a/src/actions.ts +++ b/src/actions.ts @@ -119,21 +119,33 @@ export class ApiPostFailAction extends NgrxJsonApiAction { export class ApiDeleteInitAction extends NgrxJsonApiAction { readonly type = NgrxJsonApiActionTypes.API_DELETE_INIT; - constructor(public payload: ResourceIdentifier, public zoneId: string) { + constructor( + public payload: ResourceIdentifier, + public queryId: string, + public zoneId: string + ) { super(); } } export class ApiDeleteSuccessAction extends NgrxJsonApiAction { readonly type = NgrxJsonApiActionTypes.API_DELETE_SUCCESS; - constructor(public payload: Payload, public zoneId: string) { + constructor( + public payload: Payload, + public queryId: string, + public zoneId: string + ) { super(); } } export class ApiDeleteFailAction extends NgrxJsonApiAction { readonly type = NgrxJsonApiActionTypes.API_DELETE_FAIL; - constructor(public payload: Payload, public zoneId: string) { + constructor( + public payload: Payload, + public queryId: string, + public zoneId: string + ) { super(); } } @@ -168,21 +180,33 @@ export class ApiRollbackAction extends NgrxJsonApiAction { export class ApiPatchInitAction extends NgrxJsonApiAction { readonly type = NgrxJsonApiActionTypes.API_PATCH_INIT; - constructor(public payload: Resource, public zoneId: string) { + constructor( + public payload: Resource, + public queryId: string, + public zoneId: string + ) { super(); } } export class ApiPatchSuccessAction extends NgrxJsonApiAction { readonly type = NgrxJsonApiActionTypes.API_PATCH_SUCCESS; - constructor(public payload: Payload, public zoneId: string) { + constructor( + public payload: Payload, + public queryId: string, + public zoneId: string + ) { super(); } } export class ApiPatchFailAction extends NgrxJsonApiAction { readonly type = NgrxJsonApiActionTypes.API_PATCH_FAIL; - constructor(public payload: Payload, public zoneId: string) { + constructor( + public payload: Payload, + public queryId: string, + public zoneId: string + ) { super(); } } diff --git a/src/effects.ts b/src/effects.ts index 6ffac9d..63dbd77 100644 --- a/src/effects.ts +++ b/src/effects.ts @@ -124,6 +124,7 @@ export class NgrxJsonApiEffects implements OnDestroy { jsonApiData: response.body, query: payload.query, }, + action.queryId, action.zoneId ) ), @@ -131,6 +132,7 @@ export class NgrxJsonApiEffects implements OnDestroy { of( new ApiPatchFailAction( this.toErrorPayload(payload.query, error), + action.queryId, action.zoneId ) ) @@ -264,6 +266,7 @@ export class NgrxJsonApiEffects implements OnDestroy { jsonApiData: data, query: payload.query, }, + action.queryId, action.zoneId ) ), @@ -271,6 +274,7 @@ export class NgrxJsonApiEffects implements OnDestroy { of( new ApiDeleteFailAction( this.toErrorPayload(payload.query, error), + action.queryId, action.zoneId ) ) @@ -368,6 +372,7 @@ export class NgrxJsonApiEffects implements OnDestroy { jsonApiData: response.body, query: payload.query, }, + null, zoneId ) ), @@ -375,6 +380,7 @@ export class NgrxJsonApiEffects implements OnDestroy { of( new ApiPatchFailAction( this.toErrorPayload(payload.query, error), + null, zoneId ) ) @@ -392,6 +398,7 @@ export class NgrxJsonApiEffects implements OnDestroy { jsonApiData: response.body, query: payload.query, }, + null, zoneId ) ), @@ -399,6 +406,7 @@ export class NgrxJsonApiEffects implements OnDestroy { of( new ApiDeleteFailAction( this.toErrorPayload(payload.query, error), + null, zoneId ) ) diff --git a/src/reducers.ts b/src/reducers.ts index b283d17..8bf4fde 100644 --- a/src/reducers.ts +++ b/src/reducers.ts @@ -111,17 +111,21 @@ export function NgrxJsonApiZoneReducer( false, false ); + let query = { queryId: action.queryId }; newZone = { ...zone, data: updatedData, + queries: updateQueryParams(zone.queries, query), isUpdating: zone.isUpdating + 1, }; return newZone; } case NgrxJsonApiActionTypes.API_DELETE_INIT: { + let query = { queryId: action.queryId }; newZone = { ...zone, data: updateResourceState(zone.data, action.payload, 'DELETED'), + queries: updateQueryParams(zone.queries, query), isDeleting: zone.isDeleting + 1, }; return newZone; @@ -156,6 +160,11 @@ export function NgrxJsonApiZoneReducer( newZone = { ...zone, data: updateStoreDataFromPayload(zone.data, action.payload.jsonApiData), + queries: updateQueryResults( + zone.queries, + action.queryId, + action.payload.jsonApiData + ), isUpdating: zone.isUpdating - 1, }; return newZone; @@ -164,7 +173,7 @@ export function NgrxJsonApiZoneReducer( newZone = { ...zone, data: deleteStoreResources(zone.data, action.payload.query), - queries: updateQueriesForDeletedResource(zone.queries, { + queries: updateQueriesForDeletedResource(zone.queries, action.queryId, { id: action.payload.query.id, type: action.payload.query.type, }), @@ -217,6 +226,11 @@ export function NgrxJsonApiZoneReducer( action.payload.query, action.payload.jsonApiData ), + queries: updateQueryErrors( + zone.queries, + action.queryId, + action.payload.jsonApiData + ), isUpdating: zone.isUpdating - 1, }; return newZone; @@ -229,6 +243,11 @@ export function NgrxJsonApiZoneReducer( action.payload.query, action.payload.jsonApiData ), + queries: updateQueryErrors( + zone.queries, + action.queryId, + action.payload.jsonApiData + ), isDeleting: zone.isDeleting - 1, }; return newZone; diff --git a/src/services.ts b/src/services.ts index f34cafc..4b1bff6 100644 --- a/src/services.ts +++ b/src/services.ts @@ -193,15 +193,24 @@ export class NgrxJsonApiZoneService { * * @param resource */ - public patchResource(options: PatchResourceOptions) { + public patchResource(options: PatchResourceOptions): Observable { let resource = options.resource; let toRemote = _.isUndefined(options.toRemote) ? false : options.toRemote; + const queryId = uuid(); if (toRemote) { - this.store.dispatch(new ApiPatchInitAction(resource, this.zoneId)); + this.store.dispatch( + new ApiPatchInitAction(resource, queryId, this.zoneId) + ); } else { this.store.dispatch(new PatchStoreResourceAction(resource, this.zoneId)); } + return this.store + .let(selectNgrxJsonApiZone(this.zoneId)) + .let(selectOneQueryResult(queryId)) + .finally(() => { + this.removeQuery(queryId); + }); } /** @@ -247,17 +256,28 @@ export class NgrxJsonApiZoneService { * * @param resourceId */ - public deleteResource(options: DeleteResourceOptions) { + public deleteResource( + options: DeleteResourceOptions + ): Observable { let resourceId = options.resourceId; let toRemote = _.isUndefined(options.toRemote) ? false : options.toRemote; + const queryId = uuid(); if (toRemote) { - this.store.dispatch(new ApiDeleteInitAction(resourceId, this.zoneId)); + this.store.dispatch( + new ApiDeleteInitAction(resourceId, queryId, this.zoneId) + ); } else { this.store.dispatch( new DeleteStoreResourceAction(resourceId, this.zoneId) ); } + return this.store + .let(selectNgrxJsonApiZone(this.zoneId)) + .let(selectOneQueryResult(queryId)) + .finally(() => { + this.removeQuery(queryId); + }); } /** diff --git a/src/utils.ts b/src/utils.ts index 9ca3290..f7873ac 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -421,9 +421,15 @@ export const updateStoreResource = ( export const updateQueriesForDeletedResource = ( state: NgrxJsonApiStoreQueries, + queryId: string, deletedId: ResourceIdentifier ): NgrxJsonApiStoreQueries => { - let newState: NgrxJsonApiStoreQueries = state; + const document = { data: deletedId }; + let newState: NgrxJsonApiStoreQueries = this.updateQueryResults( + state, + queryId, + document + ); for (let queryId in state) { if (state.hasOwnProperty(queryId)) { let queryState = state[queryId]; From 55ebb90ba071c9332a45a66f0e49fce3058a0aab Mon Sep 17 00:00:00 2001 From: Yuki Kawamoto Date: Thu, 5 Jul 2018 09:29:42 +0900 Subject: [PATCH 5/5] fix build --- src/utils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils.ts b/src/utils.ts index f7873ac..b200c94 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -425,7 +425,7 @@ export const updateQueriesForDeletedResource = ( deletedId: ResourceIdentifier ): NgrxJsonApiStoreQueries => { const document = { data: deletedId }; - let newState: NgrxJsonApiStoreQueries = this.updateQueryResults( + let newState: NgrxJsonApiStoreQueries = updateQueryResults( state, queryId, document