Skip to content
This repository was archived by the owner on Feb 18, 2026. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 45 additions & 9 deletions src/actions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -86,42 +86,66 @@ 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();
}
}

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();
}
}
Expand Down Expand Up @@ -156,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();
}
}
Expand Down
12 changes: 12 additions & 0 deletions src/effects.ts
Original file line number Diff line number Diff line change
Expand Up @@ -94,13 +94,15 @@ export class NgrxJsonApiEffects implements OnDestroy {
jsonApiData: response.body,
query: payload.query,
},
action.queryId,
action.zoneId
)
),
catchError(error =>
of(
new ApiPostFailAction(
this.toErrorPayload(payload.query, error),
action.queryId,
action.zoneId
)
)
Expand All @@ -122,13 +124,15 @@ export class NgrxJsonApiEffects implements OnDestroy {
jsonApiData: response.body,
query: payload.query,
},
action.queryId,
action.zoneId
)
),
catchError(error =>
of(
new ApiPatchFailAction(
this.toErrorPayload(payload.query, error),
action.queryId,
action.zoneId
)
)
Expand Down Expand Up @@ -262,13 +266,15 @@ export class NgrxJsonApiEffects implements OnDestroy {
jsonApiData: data,
query: payload.query,
},
action.queryId,
action.zoneId
)
),
catchError(error =>
of(
new ApiDeleteFailAction(
this.toErrorPayload(payload.query, error),
action.queryId,
action.zoneId
)
)
Expand Down Expand Up @@ -340,13 +346,15 @@ export class NgrxJsonApiEffects implements OnDestroy {
jsonApiData: response.body,
query: payload.query,
},
null,
zoneId
)
),
catchError(error =>
of(
new ApiPostFailAction(
this.toErrorPayload(payload.query, error),
null,
zoneId
)
)
Expand All @@ -364,13 +372,15 @@ export class NgrxJsonApiEffects implements OnDestroy {
jsonApiData: response.body,
query: payload.query,
},
null,
zoneId
)
),
catchError(error =>
of(
new ApiPatchFailAction(
this.toErrorPayload(payload.query, error),
null,
zoneId
)
)
Expand All @@ -388,13 +398,15 @@ export class NgrxJsonApiEffects implements OnDestroy {
jsonApiData: response.body,
query: payload.query,
},
null,
zoneId
)
),
catchError(error =>
of(
new ApiDeleteFailAction(
this.toErrorPayload(payload.query, error),
null,
zoneId
)
)
Expand Down
33 changes: 32 additions & 1 deletion src/reducers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -109,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;
Expand All @@ -128,6 +134,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;
Expand All @@ -149,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;
Expand All @@ -157,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,
}),
Expand All @@ -181,6 +197,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;
Expand All @@ -205,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;
Expand All @@ -217,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;
Expand Down
41 changes: 35 additions & 6 deletions src/services.ts
Original file line number Diff line number Diff line change
Expand Up @@ -193,15 +193,24 @@ export class NgrxJsonApiZoneService {
*
* @param resource
*/
public patchResource(options: PatchResourceOptions) {
public patchResource(options: PatchResourceOptions): Observable<QueryResult> {
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);
});
}

/**
Expand All @@ -222,33 +231,53 @@ export class NgrxJsonApiZoneService {
*
* @param resource
*/
public postResource(options: PostResourceOptions) {
public postResource(options: PostResourceOptions): Observable<QueryResult> {
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))
.finally(() => {
this.removeQuery(queryId);
});
}

/**
* Marks the given resource for deletion.
*
* @param resourceId
*/
public deleteResource(options: DeleteResourceOptions) {
public deleteResource(
options: DeleteResourceOptions
): Observable<QueryResult> {
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);
});
}

/**
Expand Down
Loading