|  | 
| 3 | 3 | import asyncio | 
| 4 | 4 | import logging | 
| 5 | 5 | from base64 import urlsafe_b64decode, urlsafe_b64encode | 
|  | 6 | +from collections.abc import Iterable | 
| 6 | 7 | from copy import deepcopy | 
| 7 |  | -from typing import Any, Dict, Iterable, List, Optional, Tuple, Type | 
|  | 8 | +from typing import Any, Dict, List, Optional, Tuple, Type | 
| 8 | 9 | 
 | 
| 9 | 10 | import attr | 
| 10 | 11 | import orjson | 
| @@ -679,14 +680,21 @@ async def async_prep_create_item( | 
| 679 | 680 | 
 | 
| 680 | 681 |         """ | 
| 681 | 682 |         await self.check_collection_exists(collection_id=item["collection"]) | 
|  | 683 | +        alias = index_alias_by_collection_id(item["collection"]) | 
|  | 684 | +        doc_id = mk_item_id(item["id"], item["collection"]) | 
| 682 | 685 | 
 | 
| 683 |  | -        if not exist_ok and await self.client.exists( | 
| 684 |  | -            index=index_alias_by_collection_id(item["collection"]), | 
| 685 |  | -            id=mk_item_id(item["id"], item["collection"]), | 
| 686 |  | -        ): | 
| 687 |  | -            raise ConflictError( | 
| 688 |  | -                f"Item {item['id']} in collection {item['collection']} already exists" | 
| 689 |  | -            ) | 
|  | 686 | +        if not exist_ok: | 
|  | 687 | +            alias_exists = await self.client.indices.exists_alias(name=alias) | 
|  | 688 | + | 
|  | 689 | +            if alias_exists: | 
|  | 690 | +                alias_info = await self.client.indices.get_alias(name=alias) | 
|  | 691 | +                indices = list(alias_info.keys()) | 
|  | 692 | + | 
|  | 693 | +                for index in indices: | 
|  | 694 | +                    if await self.client.exists(index=index, id=doc_id): | 
|  | 695 | +                        raise ConflictError( | 
|  | 696 | +                            f"Item {item['id']} in collection {item['collection']} already exists" | 
|  | 697 | +                        ) | 
| 690 | 698 | 
 | 
| 691 | 699 |         return self.item_serializer.stac_to_db(item, base_url) | 
| 692 | 700 | 
 | 
| @@ -903,7 +911,6 @@ async def json_patch_item( | 
| 903 | 911 |                 "add", | 
| 904 | 912 |                 "replace", | 
| 905 | 913 |             ]: | 
| 906 |  | - | 
| 907 | 914 |                 if operation.path == "collection" and collection_id != operation.value: | 
| 908 | 915 |                     await self.check_collection_exists(collection_id=operation.value) | 
| 909 | 916 |                     new_collection_id = operation.value | 
| @@ -957,8 +964,8 @@ async def json_patch_item( | 
| 957 | 964 |                     "script": { | 
| 958 | 965 |                         "lang": "painless", | 
| 959 | 966 |                         "source": ( | 
| 960 |  | -                            f"""ctx._id = ctx._id.replace('{collection_id}', '{new_collection_id}');"""  # noqa: E702 | 
| 961 |  | -                            f"""ctx._source.collection = '{new_collection_id}';"""  # noqa: E702 | 
|  | 967 | +                            f"""ctx._id = ctx._id.replace('{collection_id}', '{new_collection_id}');""" | 
|  | 968 | +                            f"""ctx._source.collection = '{new_collection_id}';""" | 
| 962 | 969 |                         ), | 
| 963 | 970 |                     }, | 
| 964 | 971 |                 }, | 
| @@ -1180,7 +1187,7 @@ async def update_collection( | 
| 1180 | 1187 |                     "source": {"index": f"{ITEMS_INDEX_PREFIX}{collection_id}"}, | 
| 1181 | 1188 |                     "script": { | 
| 1182 | 1189 |                         "lang": "painless", | 
| 1183 |  | -                        "source": f"""ctx._id = ctx._id.replace('{collection_id}', '{collection["id"]}'); ctx._source.collection = '{collection["id"]}' ;""",  # noqa: E702 | 
|  | 1190 | +                        "source": f"""ctx._id = ctx._id.replace('{collection_id}', '{collection["id"]}'); ctx._source.collection = '{collection["id"]}' ;""", | 
| 1184 | 1191 |                     }, | 
| 1185 | 1192 |                 }, | 
| 1186 | 1193 |                 wait_for_completion=True, | 
|  | 
0 commit comments