1515
1616
1717@router .get ('/{id}' , response_model = Any )
18- def get_data_by_id (id : UUID , table : str = None , levels : int = 1 , all : bool = False ,
18+ def get_data_by_id (id : UUID , table : str = None , levels : int = 1 , all_data : bool = False ,
1919 session : Session = Depends (get_db_session )):
2020 engine = session .get_bind ()
2121 metadata_obj = MetaData ()
@@ -36,14 +36,15 @@ def get_data_by_id(id: UUID, table: str = None, levels: int = 1, all: bool = Fal
3636 result = session .execute (query ).first ()
3737 if result :
3838 for root , _ , files in os .walk (os .path .join (os .path .dirname (__file__ ), '..' , 'models' )):
39+
3940 if f'{ table } .blueprint.json' in files :
4041 # Resolve model from table
4142 bp = Blueprint .from_json (os .path .join (root , table ))
4243 model = resolve_model (bp )
4344
4445 # Get top level data
4546 parent_alias = aliased (model )
46- if all :
47+ if all_data :
4748 #Fetches parent and all children to bottom
4849 parent_alias = aliased (model )
4950 return jsonable_encoder ((
@@ -76,3 +77,68 @@ def get_data_by_id(id: UUID, table: str = None, levels: int = 1, all: bool = Fal
7677 break
7778 return jsonable_encoder (top )
7879 raise HTTPException (status_code = 404 , detail = f"Could not find ID { id } " )
80+
81+
82+ @router .post ('/' , response_model = Any )
83+ def create_entity (entity : dict , return_all : bool = False , session : Session = Depends (get_db_session )):
84+ def create_entity_recursive (entity , is_toplevel , session ):
85+ try :
86+ table = entity ['type' ].rsplit ('/' )[1 ]
87+ except AttributeError :
88+ HTTPException (status_code = 400 , detail = f"Invalid input, BP should be available as attribute: type" )
89+ for root , _ , files in os .walk (os .path .join (os .path .dirname (__file__ ), '..' , 'models' )):
90+ if f'{ table } .blueprint.json' in files :
91+ # Resolve model from table
92+ bp = Blueprint .from_json (os .path .join (root , table ))
93+ model = resolve_model (bp )
94+
95+ data_table = {}
96+ children = []
97+ children_rel_names = []
98+ data = dict ()
99+ for key , value in entity .items ():
100+ attr = [attr for attr in bp .attributes if attr .name == key ][0 ]
101+ if attr .name == 'type' :
102+ continue
103+ if attr .attributeType .lower () in ["string" , "integer" , "number" , "float" , "boolean" , "foreign_key" , "type" ,
104+ "core:blueprintattribute" ]:
105+ if hasattr (attr , 'dimensions' ) and attr .dimensions == '*' :
106+ data_table [key ] = value
107+ else :
108+ data [key ] = value
109+ else :
110+ if isinstance (value , list ):
111+ children .extend (value )
112+ [children_rel_names .append (key ) for _ in value ]
113+ elif isinstance (value , dict ):
114+ children .append (value )
115+ children_rel_names .append (key )
116+ else :
117+ raise NotImplementedError (f'Type { type (value )} not supported yet' )
118+
119+ obj_in_data = jsonable_encoder (data )
120+ db_obj = model (** obj_in_data )
121+ for child , rel_name in zip (children , children_rel_names ):
122+ child_obj = create_entity_recursive (child , False , session )
123+ getattr (db_obj , rel_name ).append (child_obj )
124+
125+ for key , value in data_table .items ():
126+ data_table_model = resolve_model (bp , key )
127+ data_table_objects = [data_table_model (data = item ) for item in value ]
128+ getattr (db_obj , key ).extend (data_table_objects )
129+
130+ session .add (db_obj )
131+ session .commit ()
132+ session .refresh (db_obj )
133+ if is_toplevel :
134+ return jsonable_encoder (db_obj )
135+ else :
136+ return db_obj
137+
138+ HTTPException (status_code = 404 , detail = f"Could not find Blueprint { table } " )
139+ new_obj = create_entity_recursive (entity , True , session )
140+ #Re-use get_endpoint to fetch all nested objects
141+ if return_all :
142+ new_id = create_entity_recursive (entity , True , session )['id' ]
143+ return get_data_by_id (id = new_id , all_data = True , session = session )
144+ return new_obj
0 commit comments