Skip to content

Commit 63b90f2

Browse files
committed
feat: change arg format of update mutations
the old format encouraged sending unnecessary data and did not guard against bugs from sending extra data
1 parent 310f18a commit 63b90f2

3 files changed

Lines changed: 46 additions & 10 deletions

File tree

src/project/projectService.ts

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ import * as terrasoApi from 'terraso-client-shared/terrasoApi/api';
2828
import {
2929
collapseConnectionEdges,
3030
collapseFields,
31+
UpdateArg,
32+
updateArgToInput,
3133
} from 'terraso-client-shared/terrasoApi/utils';
3234

3335
const collapseProjectFields = collapseFields<ProjectDataFragment, Project>({
@@ -91,7 +93,9 @@ export const addProject = (project: ProjectAddMutationInput) => {
9193
.then(resp => collapseProjectFields(resp.addProject.project));
9294
};
9395

94-
export const updateProject = (project: ProjectUpdateMutationInput) => {
96+
export const updateProject = (
97+
update: UpdateArg<ProjectUpdateMutationInput>,
98+
) => {
9599
const query = graphql(`
96100
mutation updateProject($input: ProjectUpdateMutationInput!) {
97101
updateProject(input: $input) {
@@ -104,20 +108,23 @@ export const updateProject = (project: ProjectUpdateMutationInput) => {
104108
`);
105109

106110
return terrasoApi
107-
.requestGraphQL(query, { input: project })
111+
.requestGraphQL(query, updateArgToInput(update))
108112
.then(resp => collapseProjectFields(resp.updateProject.project!));
109113
};
110114

111115
export const deleteProject = (project: ProjectDeleteMutationInput) => {
112116
const query = graphql(`
113117
mutation deleteProject($input: ProjectDeleteMutationInput!) {
114118
deleteProject(input: $input) {
119+
project {
120+
id
121+
}
115122
errors
116123
}
117124
}
118125
`);
119126

120127
return terrasoApi
121-
.requestGraphQL(query, { input: { id: project.id } })
122-
.then(_ => project.id);
128+
.requestGraphQL(query, { input: project })
129+
.then(({ deleteProject: { project } }) => project.id);
123130
};

src/site/siteService.ts

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,16 @@ import { graphql } from 'terraso-client-shared/graphqlSchema';
2020
import type {
2121
SiteAddMutationInput,
2222
SiteDataFragment,
23+
SiteDeleteMutationInput,
2324
SiteUpdateMutationInput,
2425
} from 'terraso-client-shared/graphqlSchema/graphql';
2526
import type { Site } from 'terraso-client-shared/site/siteSlice';
2627
import * as terrasoApi from 'terraso-client-shared/terrasoApi/api';
27-
import { collapseConnectionEdges } from 'terraso-client-shared/terrasoApi/utils';
28+
import {
29+
collapseConnectionEdges,
30+
UpdateArg,
31+
updateArgToInput,
32+
} from 'terraso-client-shared/terrasoApi/utils';
2833

2934
const collapseSiteFields = (site: SiteDataFragment): Site => {
3035
const { project, owner, ...rest } = site;
@@ -117,7 +122,7 @@ export const addSite = (site: SiteAddMutationInput) => {
117122
.then(resp => collapseSiteFields(resp.addSite.site));
118123
};
119124

120-
export const updateSite = (site: SiteUpdateMutationInput) => {
125+
export const updateSite = (update: UpdateArg<SiteUpdateMutationInput>) => {
121126
const query = graphql(`
122127
mutation updateSite($input: SiteUpdateMutationInput!) {
123128
updateSite(input: $input) {
@@ -130,20 +135,23 @@ export const updateSite = (site: SiteUpdateMutationInput) => {
130135
`);
131136

132137
return terrasoApi
133-
.requestGraphQL(query, { input: site })
138+
.requestGraphQL(query, updateArgToInput(update))
134139
.then(resp => collapseSiteFields(resp.updateSite.site!));
135140
};
136141

137-
export const deleteSite = (site: Site) => {
142+
export const deleteSite = (site: SiteDeleteMutationInput) => {
138143
const query = graphql(`
139144
mutation deleteSite($input: SiteDeleteMutationInput!) {
140145
deleteSite(input: $input) {
146+
site {
147+
id
148+
}
141149
errors
142150
}
143151
}
144152
`);
145153

146154
return terrasoApi
147-
.requestGraphQL(query, { input: { id: site.id } })
148-
.then(_ => site.id);
155+
.requestGraphQL(query, { input: site })
156+
.then(({ deleteSite: { site } }) => site.id);
149157
};

src/terrasoApi/utils.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,27 @@
1515
* along with this program. If not, see https://www.gnu.org/licenses/.
1616
*/
1717

18+
type Resolve<T> = T extends Function ? T : { [K in keyof T]: T[K] };
19+
20+
export type UpdateArg<T extends { id: string }> = Resolve<{
21+
id: string;
22+
update: Resolve<Omit<T, 'id'>>;
23+
}>;
24+
25+
export const updateArgToInput = <T extends { id: string }>({
26+
id,
27+
update,
28+
}: UpdateArg<T>) => {
29+
if ('id' in update) {
30+
throw Error(`
31+
update arguments should not contain IDs!
32+
are you accidentally passing the entire model object into the
33+
update arg instead of just the fields you need to update?
34+
`);
35+
}
36+
return { input: { ...update, id } };
37+
};
38+
1839
export const collapseConnectionEdges = <T>(connection: {
1940
edges: { node: T }[];
2041
}): T[] => {

0 commit comments

Comments
 (0)