Skip to content
Closed
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
16 changes: 9 additions & 7 deletions openfga_sdk/client/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -543,19 +543,21 @@ async def _write_with_transaction(
kwargs = options_to_kwargs(options)
conflict_options = options_to_conflict_info(options)

# Set conflict options on the body if provided
# Extract conflict options to pass to the tuple key methods
on_duplicate = None
on_missing = None
if conflict_options:
if conflict_options.on_duplicate_writes:
body.on_duplicate = conflict_options.on_duplicate_writes.value
on_duplicate = conflict_options.on_duplicate_writes.value
if conflict_options.on_missing_deletes:
body.on_missing = conflict_options.on_missing_deletes.value
on_missing = conflict_options.on_missing_deletes.value

writes_tuple_keys = None
deletes_tuple_keys = None
if body.writes_tuple_keys:
writes_tuple_keys = body.writes_tuple_keys
if body.deletes_tuple_keys:
deletes_tuple_keys = body.deletes_tuple_keys
if body.writes:
writes_tuple_keys = body.writes_tuple_keys(on_duplicate=on_duplicate)
if body.deletes:
deletes_tuple_keys = body.deletes_tuple_keys(on_missing=on_missing)

await self._api.write(
WriteRequest(
Expand Down
50 changes: 12 additions & 38 deletions openfga_sdk/client/models/write_request.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,9 @@ def __init__(
self,
writes: list[ClientTuple] | None = None,
deletes: list[ClientTuple] | None = None,
on_duplicate: str | None = None,
on_missing: str | None = None,
) -> None:
self._writes = writes
self._deletes = deletes
self._on_duplicate = on_duplicate
self._on_missing = on_missing

@property
def writes(self) -> list[ClientTuple] | None:
Expand Down Expand Up @@ -60,36 +56,9 @@ def deletes(self, value: list[ClientTuple] | None) -> None:
"""
self._deletes = value

@property
def on_duplicate(self) -> str | None:
"""
Return on_duplicate
"""
return self._on_duplicate

@on_duplicate.setter
def on_duplicate(self, value: str | None) -> None:
"""
Set on_duplicate
"""
self._on_duplicate = value

@property
def on_missing(self) -> str | None:
"""
Return on_missing
"""
return self._on_missing

@on_missing.setter
def on_missing(self, value: str | None) -> None:
"""
Set on_missing
"""
self._on_missing = value

@property
def writes_tuple_keys(self) -> WriteRequestWrites | None:
def writes_tuple_keys(
self, on_duplicate: str | None = None
) -> WriteRequestWrites | None:
"""
Return the writes as tuple keys
"""
Expand All @@ -101,10 +70,13 @@ def writes_tuple_keys(self) -> WriteRequestWrites | None:
if keys is None:
return None

return WriteRequestWrites(tuple_keys=keys, on_duplicate=self._on_duplicate)
if on_duplicate is not None:
return WriteRequestWrites(tuple_keys=keys, on_duplicate=on_duplicate)
return WriteRequestWrites(tuple_keys=keys)

@property
def deletes_tuple_keys(self) -> WriteRequestDeletes | None:
def deletes_tuple_keys(
self, on_missing: str | None = None
) -> WriteRequestDeletes | None:
"""
Return the delete as tuple keys
"""
Expand All @@ -116,4 +88,6 @@ def deletes_tuple_keys(self) -> WriteRequestDeletes | None:
if keys is None:
return None

return WriteRequestDeletes(tuple_keys=keys, on_missing=self._on_missing)
if on_missing is not None:
return WriteRequestDeletes(tuple_keys=keys, on_missing=on_missing)
return WriteRequestDeletes(tuple_keys=keys)
16 changes: 9 additions & 7 deletions openfga_sdk/sync/client/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -543,19 +543,21 @@ def _write_with_transaction(
kwargs = options_to_kwargs(options)
conflict_options = options_to_conflict_info(options)

# Set conflict options on the body if provided
# Extract conflict options to pass to the tuple key methods
on_duplicate = None
on_missing = None
if conflict_options:
if conflict_options.on_duplicate_writes:
body.on_duplicate = conflict_options.on_duplicate_writes.value
on_duplicate = conflict_options.on_duplicate_writes.value
if conflict_options.on_missing_deletes:
body.on_missing = conflict_options.on_missing_deletes.value
on_missing = conflict_options.on_missing_deletes.value

writes_tuple_keys = None
deletes_tuple_keys = None
if body.writes_tuple_keys:
writes_tuple_keys = body.writes_tuple_keys
if body.deletes_tuple_keys:
deletes_tuple_keys = body.deletes_tuple_keys
if body.writes:
writes_tuple_keys = body.writes_tuple_keys(on_duplicate=on_duplicate)
if body.deletes:
deletes_tuple_keys = body.deletes_tuple_keys(on_missing=on_missing)

self._api.write(
WriteRequest(
Expand Down
59 changes: 42 additions & 17 deletions test/client/client_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -1026,7 +1026,8 @@ async def test_write(self, mock_request):
"relation": "reader",
"user": "user:81684243-9356-4421-8fbf-a4f8d36aa31d",
},
]
],
"on_duplicate": "error",
},
"authorization_model_id": "01G5JAVJ41T49E9TT3SKVS7X1J",
},
Expand Down Expand Up @@ -1071,7 +1072,10 @@ async def test_delete(self, mock_request):
"relation": "reader",
"user": "user:81684243-9356-4421-8fbf-a4f8d36aa31b",
}
]
],
"on_missing": "error",
"on_missing": "error",
"on_missing": "error",
},
"authorization_model_id": "01G5JAVJ41T49E9TT3SKVS7X1J",
},
Expand Down Expand Up @@ -1171,7 +1175,8 @@ async def test_write_batch(self, mock_request):
"relation": "reader",
"user": "user:81684243-9356-4421-8fbf-a4f8d36aa31b",
}
]
],
"on_duplicate": "error"
},
"authorization_model_id": "01G5JAVJ41T49E9TT3SKVS7X1J",
},
Expand All @@ -1192,7 +1197,8 @@ async def test_write_batch(self, mock_request):
"relation": "reader",
"user": "user:81684243-9356-4421-8fbf-a4f8d36aa31c",
}
]
],
"on_duplicate": "error"
},
"authorization_model_id": "01G5JAVJ41T49E9TT3SKVS7X1J",
},
Expand All @@ -1213,7 +1219,8 @@ async def test_write_batch(self, mock_request):
"relation": "reader",
"user": "user:81684243-9356-4421-8fbf-a4f8d36aa31d",
}
]
],
"on_duplicate": "error"
},
"authorization_model_id": "01G5JAVJ41T49E9TT3SKVS7X1J",
},
Expand Down Expand Up @@ -1313,7 +1320,8 @@ async def test_write_batch_min_parallel(self, mock_request):
"relation": "reader",
"user": "user:81684243-9356-4421-8fbf-a4f8d36aa31b",
}
]
],
"on_duplicate": "error"
},
"authorization_model_id": "01G5JAVJ41T49E9TT3SKVS7X1J",
},
Expand All @@ -1334,7 +1342,8 @@ async def test_write_batch_min_parallel(self, mock_request):
"relation": "reader",
"user": "user:81684243-9356-4421-8fbf-a4f8d36aa31c",
}
]
],
"on_duplicate": "error"
},
"authorization_model_id": "01G5JAVJ41T49E9TT3SKVS7X1J",
},
Expand All @@ -1355,7 +1364,8 @@ async def test_write_batch_min_parallel(self, mock_request):
"relation": "reader",
"user": "user:81684243-9356-4421-8fbf-a4f8d36aa31d",
}
]
],
"on_duplicate": "error"
},
"authorization_model_id": "01G5JAVJ41T49E9TT3SKVS7X1J",
},
Expand Down Expand Up @@ -1459,7 +1469,8 @@ async def test_write_batch_larger_chunk(self, mock_request):
"relation": "reader",
"user": "user:81684243-9356-4421-8fbf-a4f8d36aa31c",
},
]
],
"on_duplicate": "error"
},
"authorization_model_id": "01G5JAVJ41T49E9TT3SKVS7X1J",
},
Expand All @@ -1480,7 +1491,8 @@ async def test_write_batch_larger_chunk(self, mock_request):
"relation": "reader",
"user": "user:81684243-9356-4421-8fbf-a4f8d36aa31d",
}
]
],
"on_duplicate": "error"
},
"authorization_model_id": "01G5JAVJ41T49E9TT3SKVS7X1J",
},
Expand Down Expand Up @@ -1594,7 +1606,8 @@ async def test_write_batch_failed(self, mock_request):
"relation": "reader",
"user": "user:81684243-9356-4421-8fbf-a4f8d36aa31b",
}
]
],
"on_duplicate": "error"
},
"authorization_model_id": "01G5JAVJ41T49E9TT3SKVS7X1J",
},
Expand All @@ -1615,7 +1628,8 @@ async def test_write_batch_failed(self, mock_request):
"relation": "reader",
"user": "user:81684243-9356-4421-8fbf-a4f8d36aa31c",
}
]
],
"on_duplicate": "error"
},
"authorization_model_id": "01G5JAVJ41T49E9TT3SKVS7X1J",
},
Expand All @@ -1636,7 +1650,8 @@ async def test_write_batch_failed(self, mock_request):
"relation": "reader",
"user": "user:81684243-9356-4421-8fbf-a4f8d36aa31d",
}
]
],
"on_duplicate": "error"
},
"authorization_model_id": "01G5JAVJ41T49E9TT3SKVS7X1J",
},
Expand Down Expand Up @@ -1690,7 +1705,9 @@ async def test_delete_batch(self, mock_request):
"relation": "reader",
"user": "user:81684243-9356-4421-8fbf-a4f8d36aa31b",
}
]
],
"on_missing": "error",
"on_missing": "error"
},
"authorization_model_id": "01G5JAVJ41T49E9TT3SKVS7X1J",
},
Expand Down Expand Up @@ -1753,7 +1770,8 @@ async def test_write_tuples(self, mock_request):
"relation": "reader",
"user": "user:81684243-9356-4421-8fbf-a4f8d36aa31d",
},
]
],
"on_duplicate": "error"
},
"authorization_model_id": "01G5JAVJ41T49E9TT3SKVS7X1J",
},
Expand Down Expand Up @@ -1816,7 +1834,9 @@ async def test_delete_tuples(self, mock_request):
"relation": "reader",
"user": "user:81684243-9356-4421-8fbf-a4f8d36aa31d",
},
]
],
"on_missing": "error",
"on_missing": "error"
},
"authorization_model_id": "01G5JAVJ41T49E9TT3SKVS7X1J",
},
Expand Down Expand Up @@ -1872,7 +1892,8 @@ async def test_write_batch_unauthorized(self, mock_request):
"relation": "reader",
"object": "document:2021-budget",
}
]
],
"on_duplicate": "error"
},
"authorization_model_id": "01G5JAVJ41T49E9TT3SKVS7X1J",
},
Expand Down Expand Up @@ -4076,6 +4097,8 @@ async def test_write_with_conflict_options_ignore_missing_deletes(
"user": "user:81684243-9356-4421-8fbf-a4f8d36aa31b",
},
],
"on_missing": "error",
"on_missing": "error",
"on_missing": "ignore",
},
"authorization_model_id": "01G5JAVJ41T49E9TT3SKVS7X1J",
Expand Down Expand Up @@ -4153,6 +4176,8 @@ async def test_write_with_conflict_options_both(self, mock_request):
"user": "user:81684243-9356-4421-8fbf-a4f8d36aa31c",
},
],
"on_missing": "error",
"on_missing": "error",
"on_missing": "ignore",
},
"authorization_model_id": "01G5JAVJ41T49E9TT3SKVS7X1J",
Expand Down
Loading
Loading