33import os
44from typing import List , Optional
55
6+ from elasticsearch import Elasticsearch
67from bson import ObjectId
78from fastapi import APIRouter , HTTPException , Depends
89from fastapi import Form
2627 patch_metadata ,
2728 MetadataDelete ,
2829)
30+ from app .search .connect import insert_record , update_record , delete_document_by_id
2931
3032router = APIRouter ()
3133
@@ -80,6 +82,7 @@ async def add_dataset_metadata(
8082 dataset_id : str ,
8183 user = Depends (get_current_user ),
8284 db : MongoClient = Depends (dependencies .get_db ),
85+ es : Elasticsearch = Depends (dependencies .get_elasticsearchclient ),
8386):
8487 """Attach new metadata to a dataset. The body must include a contents field with the JSON metadata, and either a
8588 context JSON-LD object, context_url, or definition (name of a metadata definition) to be valid.
@@ -110,6 +113,18 @@ async def add_dataset_metadata(
110113 new_metadata = await db ["metadata" ].insert_one (md .to_mongo ())
111114 found = await db ["metadata" ].find_one ({"_id" : new_metadata .inserted_id })
112115 metadata_out = MetadataOut .from_mongo (found )
116+
117+ # Add an entry to the metadata index
118+ doc = {
119+ "resource_id" : dataset_id ,
120+ "resource_type" : "dataset" ,
121+ "created" : metadata_out .created .utcnow (),
122+ "creator" : user .email ,
123+ "contents" : metadata_out .contents ,
124+ "context_url" : metadata_out .context_url ,
125+ "context" : metadata_out .context ,
126+ }
127+ insert_record (es , "metadata" , doc , metadata_out .id )
113128 return metadata_out
114129
115130
@@ -119,6 +134,7 @@ async def replace_dataset_metadata(
119134 dataset_id : str ,
120135 user = Depends (get_current_user ),
121136 db : MongoClient = Depends (dependencies .get_db ),
137+ es : Elasticsearch = Depends (dependencies .get_elasticsearchclient ),
122138):
123139 """Update metadata. Any fields provided in the contents JSON will be added or updated in the metadata. If context or
124140 agent should be changed, use PUT.
@@ -159,6 +175,9 @@ async def replace_dataset_metadata(
159175 )
160176 found = await db ["metadata" ].find_one ({"_id" : md ["_id" ]})
161177 metadata_out = MetadataOut .from_mongo (found )
178+ # Update entry to the metadata index
179+ doc = {"doc" : {"contents" : metadata_out ["contents" ]}}
180+ update_record (es , "metadata" , doc , metadata_out ["_id" ])
162181 return metadata_out
163182 else :
164183 raise HTTPException (status_code = 404 , detail = f"Dataset { dataset_id } not found" )
@@ -170,6 +189,7 @@ async def update_dataset_metadata(
170189 dataset_id : str ,
171190 user = Depends (get_current_user ),
172191 db : MongoClient = Depends (dependencies .get_db ),
192+ es : Elasticsearch = Depends (dependencies .get_elasticsearchclient ),
173193):
174194 """Update metadata. Any fields provided in the contents JSON will be added or updated in the metadata. If context or
175195 agent should be changed, use PUT.
@@ -227,7 +247,7 @@ async def update_dataset_metadata(
227247
228248 if (md := await db ["metadata" ].find_one (query )) is not None :
229249 # TODO: Refactor this with permissions checks etc.
230- result = await patch_metadata (md , contents , db )
250+ result = await patch_metadata (md , contents , db , es )
231251 return result
232252 else :
233253 raise HTTPException (
@@ -278,6 +298,7 @@ async def delete_dataset_metadata(
278298 dataset_id : str ,
279299 user = Depends (get_current_user ),
280300 db : MongoClient = Depends (dependencies .get_db ),
301+ es : Elasticsearch = Depends (dependencies .get_elasticsearchclient ),
281302):
282303 if (
283304 dataset := await db ["datasets" ].find_one ({"_id" : ObjectId (dataset_id )})
@@ -327,5 +348,7 @@ async def delete_dataset_metadata(
327348 raise HTTPException (
328349 status_code = 404 , detail = f"No metadata found with that criteria"
329350 )
351+ # delete from elasticsearch
352+ delete_document_by_id (es , "metadata" , str (metadata_in .id ))
330353 else :
331354 raise HTTPException (status_code = 404 , detail = f"Dataset { dataset_id } not found" )
0 commit comments