Skip to content

Commit f716a6f

Browse files
committed
feat: support write conflict options for SDKs
JS and CLI will be added when available
1 parent b4710a2 commit f716a6f

File tree

2 files changed

+88
-25
lines changed

2 files changed

+88
-25
lines changed

docs/content/getting-started/update-tuples.mdx

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -257,11 +257,17 @@ For example, if you want to ensure `user:anne` has `reader` access to `document:
257257
object: 'document:Z'
258258
},
259259
]}
260-
writeOptions={{
261-
on_duplicate: 'ignore',
260+
conflictOptions={{
261+
onDuplicateWrites: 'ignore',
262262
}}
263263
skipSetup={true}
264264
allowedLanguages={[
265+
// SupportedLanguage.JS_SDK,
266+
SupportedLanguage.GO_SDK,
267+
SupportedLanguage.DOTNET_SDK,
268+
SupportedLanguage.PYTHON_SDK,
269+
SupportedLanguage.JAVA_SDK,
270+
// SupportedLanguage.CLI,
265271
SupportedLanguage.CURL,
266272
]}
267273
/>
@@ -281,13 +287,19 @@ Similarly, you can use `on_missing: "ignore"` when deleting tuples that might no
281287
object: 'document:Z'
282288
},
283289
]}
284-
deleteOptions={{
285-
on_missing: 'ignore',
290+
conflictOptions={{
291+
onMissingDeletes: 'ignore',
286292
}}
287293
expectedResponse={{
288294
data: {},
289295
}}
290296
allowedLanguages={[
297+
// SupportedLanguage.JS_SDK,
298+
SupportedLanguage.GO_SDK,
299+
SupportedLanguage.DOTNET_SDK,
300+
SupportedLanguage.PYTHON_SDK,
301+
SupportedLanguage.JAVA_SDK,
302+
// SupportedLanguage.CLI,
291303
SupportedLanguage.CURL,
292304
]}
293305
/>

src/components/Docs/SnippetViewer/WriteRequestViewer.tsx

Lines changed: 72 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
import { getFilteredAllowedLangs, SupportedLanguage, DefaultAuthorizationModelId } from './SupportedLanguage';
2-
import { defaultOperationsViewer } from './DefaultTabbedViewer';
31
import assertNever from 'assert-never/index';
42
import { RelationshipCondition } from '@components/Docs/RelationshipTuples';
3+
import { getFilteredAllowedLangs, SupportedLanguage, DefaultAuthorizationModelId } from './SupportedLanguage';
4+
import { defaultOperationsViewer } from './DefaultTabbedViewer';
55

66
interface RelationshipTuple {
77
user: string;
@@ -25,11 +25,9 @@ interface WriteRequestViewerOpts {
2525
isDelete?: boolean;
2626
skipSetup?: boolean;
2727
allowedLanguages?: SupportedLanguage[];
28-
writeOptions?: {
29-
on_duplicate?: 'error' | 'ignore';
30-
};
31-
deleteOptions?: {
32-
on_missing?: 'error' | 'ignore';
28+
conflictOptions?: {
29+
onDuplicateWrites?: 'error' | 'ignore';
30+
onMissingDeletes?: 'error' | 'ignore';
3331
};
3432
}
3533

@@ -88,8 +86,8 @@ ${
8886
return cleanTuple;
8987
}),
9088
};
91-
if (opts.writeOptions?.on_duplicate) {
92-
requestBody.writes.on_duplicate = opts.writeOptions.on_duplicate;
89+
if (opts.conflictOptions?.onDuplicateWrites) {
90+
requestBody.writes.on_duplicate = opts.conflictOptions.onDuplicateWrites;
9391
}
9492
}
9593

@@ -101,8 +99,8 @@ ${
10199
return cleanTuple;
102100
}),
103101
};
104-
if (opts.deleteOptions?.on_missing) {
105-
requestBody.deletes.on_missing = opts.deleteOptions.on_missing;
102+
if (opts.conflictOptions?.onMissingDeletes) {
103+
requestBody.deletes.on_missing = opts.conflictOptions.onMissingDeletes;
106104
}
107105
}
108106

@@ -209,9 +207,19 @@ await fgaClient.write({
209207
}`;
210208

211209
return `
212-
options := ClientWriteOptions{
213-
AuthorizationModelId: PtrString("${modelId}"),
214-
}
210+
options := ClientWriteOptions{${modelId ? `\n AuthorizationModelId: openfga.PtrString("${modelId}"),` : ''}${
211+
opts.conflictOptions
212+
? `\n Conflict: ClientWriteConflictOptions{${
213+
opts.conflictOptions.onDuplicateWrites
214+
? `\n OnDuplicateWrites: CLIENT_WRITE_REQUEST_ON_DUPLICATE_WRITES_${opts.conflictOptions.onDuplicateWrites.toUpperCase()},`
215+
: ''
216+
}${
217+
opts.conflictOptions.onMissingDeletes
218+
? `\n OnMissingDeletes: CLIENT_WRITE_REQUEST_ON_MISSING_DELETES_${opts.conflictOptions.onMissingDeletes.toUpperCase()},`
219+
: ''
220+
}\n},`
221+
: ''
222+
}\n}
215223
216224
body := ClientWriteRequest{${opts.relationshipTuples ? writes : ''}${opts.deleteRelationshipTuples ? deletes : ''}
217225
}
@@ -274,8 +282,23 @@ ${deleteTuples}
274282
}`;
275283
const separator = `${opts.deleteRelationshipTuples && opts.relationshipTuples ? ',\n ' : ''}`;
276284
return `
277-
var options = new ClientWriteOptions {
278-
AuthorizationModelId = "${modelId}",
285+
var options = new ClientWriteOptions {${modelId ? `\n AuthorizationModelId = ${modelId},` : ''}${
286+
opts.conflictOptions
287+
? `
288+
Conflict = new ConflictOptions {${
289+
opts.conflictOptions.onDuplicateWrites
290+
? `
291+
OnDuplicateWrites = OnDuplicateWrites.${opts.conflictOptions.onDuplicateWrites.charAt(0).toUpperCase() + opts.conflictOptions.onDuplicateWrites.slice(1)},`
292+
: ''
293+
}${
294+
opts.conflictOptions.onMissingDeletes
295+
? `
296+
OnMissingDeletes = OnMissingDeletes.${opts.conflictOptions.onMissingDeletes.charAt(0).toUpperCase() + opts.conflictOptions.onMissingDeletes.slice(1)}`
297+
: ''
298+
}
299+
}`
300+
: ''
301+
}
279302
};
280303
var body = new ClientWriteRequest() {
281304
${opts.relationshipTuples ? writes : ''}${separator}${opts.deleteRelationshipTuples ? deletes : ''},
@@ -327,9 +350,23 @@ ${_description ? ` # ${_description}\n ` :
327350
const deletes = ` deletes=[${deleteTuples}
328351
],`;
329352

330-
return `options = {
331-
"authorization_model_id": "${modelId}"
332-
}
353+
return `options = {${modelId ? `\n "authorization_model_id": "${modelId}"` : ''}${
354+
opts.conflictOptions
355+
? `,
356+
"conflict": ConflictOptions(${
357+
opts.conflictOptions.onDuplicateWrites
358+
? `
359+
on_duplicate_writes=ClientWriteRequestOnDuplicateWrites.${opts.conflictOptions.onDuplicateWrites.toUpperCase()},`
360+
: ''
361+
}${
362+
opts.conflictOptions.onMissingDeletes
363+
? `
364+
on_missing_deletes=ClientWriteRequestOnMissingDeletes.${opts.conflictOptions.onMissingDeletes.toUpperCase()}`
365+
: ''
366+
}
367+
)`
368+
: ''
369+
}\n}
333370
body = ClientWriteRequest(
334371
${opts.relationshipTuples ? writes : ''}${opts.deleteRelationshipTuples ? deletes : ''}
335372
)
@@ -423,8 +460,22 @@ ${opts.deleteRelationshipTuples ? deletes : ''}`;
423460
.deletes(List.of(${deleteTuples}
424461
))`;
425462

426-
return `var options = new ClientWriteOptions()
427-
.authorizationModelId("${modelId}");
463+
return `var options = new ClientWriteOptions()${
464+
modelId
465+
? `
466+
.authorizationModelId("${modelId}")`
467+
: ''
468+
}${
469+
opts.conflictOptions?.onDuplicateWrites
470+
? `
471+
.onDuplicate(WriteRequestWrites.OnDuplicateEnum.${opts.conflictOptions.onDuplicateWrites.toUpperCase()})`
472+
: ''
473+
}${
474+
opts.conflictOptions?.onMissingDeletes
475+
? `
476+
.onMissing(WriteRequestDeletes.OnMissingEnum.${opts.conflictOptions.onMissingDeletes.toUpperCase()})`
477+
: ''
478+
};
428479
429480
var body = new ClientWriteRequest()${opts.relationshipTuples ? writes : ' '}${
430481
opts.deleteRelationshipTuples ? deletes : ''

0 commit comments

Comments
 (0)