Skip to content

Commit 7f4d190

Browse files
committed
Refactor create_item method to include base_url and exist_ok parameters
1 parent b4f0227 commit 7f4d190

File tree

4 files changed

+33
-19
lines changed

4 files changed

+33
-19
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
2121

2222
### Fixed
2323

24+
- Refactored `create_item` and `update_item` methods to share unified logic, ensuring consistent conflict detection, validation, and database operations.
25+
2426
## [v4.0.0] - 2025-04-23
2527

2628
### Added

stac_fastapi/core/stac_fastapi/core/core.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -720,10 +720,12 @@ async def create_item(
720720

721721
return f"Successfully added {success} Items. {attempted - success} errors occurred."
722722
else:
723-
item = await self.database.async_prep_create_item(
724-
item=item, base_url=base_url
723+
await self.database.create_item(
724+
item,
725+
refresh=kwargs.get("refresh", False),
726+
base_url=base_url,
727+
exist_ok=False,
725728
)
726-
await self.database.create_item(item, refresh=kwargs.get("refresh", False))
727729
return ItemSerializer.db_to_stac(item, base_url)
728730

729731
@overrides
@@ -750,8 +752,10 @@ async def update_item(
750752
now = datetime_type.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ")
751753
item["properties"]["updated"] = now
752754

753-
await self.database.check_collection_exists(collection_id)
754-
await self.database.create_item(item, refresh=kwargs.get("refresh", False))
755+
# await self.database.check_collection_exists(collection_id)
756+
await self.database.create_item(
757+
item, refresh=kwargs.get("refresh", False), base_url=base_url, exist_ok=True
758+
)
755759

756760
return ItemSerializer.db_to_stac(item, base_url)
757761

stac_fastapi/elasticsearch/stac_fastapi/elasticsearch/database_logic.py

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -842,7 +842,13 @@ def bulk_sync_prep_create_item(
842842
logger.debug(f"Item {item['id']} prepared successfully.")
843843
return prepped_item
844844

845-
async def create_item(self, item: Item, refresh: bool = False):
845+
async def create_item(
846+
self,
847+
item: Item,
848+
refresh: bool = False,
849+
base_url: str = "",
850+
exist_ok: bool = False,
851+
):
846852
"""Database logic for creating one item.
847853
848854
Args:
@@ -858,18 +864,16 @@ async def create_item(self, item: Item, refresh: bool = False):
858864
# todo: check if collection exists, but cache
859865
item_id = item["id"]
860866
collection_id = item["collection"]
861-
es_resp = await self.client.index(
867+
item = await self.async_prep_create_item(
868+
item=item, base_url=base_url, exist_ok=exist_ok
869+
)
870+
await self.client.index(
862871
index=index_alias_by_collection_id(collection_id),
863872
id=mk_item_id(item_id, collection_id),
864873
document=item,
865874
refresh=refresh,
866875
)
867876

868-
if (meta := es_resp.get("meta")) and meta.get("status") == 409:
869-
raise ConflictError(
870-
f"Item {item_id} in collection {collection_id} already exists"
871-
)
872-
873877
async def delete_item(
874878
self, item_id: str, collection_id: str, refresh: bool = False
875879
):

stac_fastapi/opensearch/stac_fastapi/opensearch/database_logic.py

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -861,7 +861,13 @@ def bulk_sync_prep_create_item(
861861
logger.debug(f"Item {item['id']} prepared successfully.")
862862
return prepped_item
863863

864-
async def create_item(self, item: Item, refresh: bool = False):
864+
async def create_item(
865+
self,
866+
item: Item,
867+
refresh: bool = False,
868+
base_url: str = "",
869+
exist_ok: bool = False,
870+
):
865871
"""Database logic for creating one item.
866872
867873
Args:
@@ -877,18 +883,16 @@ async def create_item(self, item: Item, refresh: bool = False):
877883
# todo: check if collection exists, but cache
878884
item_id = item["id"]
879885
collection_id = item["collection"]
880-
es_resp = await self.client.index(
886+
item = await self.async_prep_create_item(
887+
item=item, base_url=base_url, exist_ok=exist_ok
888+
)
889+
await self.client.index(
881890
index=index_alias_by_collection_id(collection_id),
882891
id=mk_item_id(item_id, collection_id),
883892
body=item,
884893
refresh=refresh,
885894
)
886895

887-
if (meta := es_resp.get("meta")) and meta.get("status") == 409:
888-
raise ConflictError(
889-
f"Item {item_id} in collection {collection_id} already exists"
890-
)
891-
892896
async def delete_item(
893897
self, item_id: str, collection_id: str, refresh: bool = False
894898
):

0 commit comments

Comments
 (0)