@@ -317,6 +317,39 @@ def get(self, dataset):
317317 error_code = result .get ('error_code' ) or 404
318318 api .abort (error_code , result ['error' ])
319319
320+ @api .doc ('create' )
321+ @api .response (405 , 'Dataset not creatable' )
322+ @api .response (422 , 'Feature validation failed' , feature_validation_response )
323+ @api .expect (geojson_feature_request )
324+ @api .marshal_with (geojson_feature , code = 201 )
325+ @optional_auth
326+ def post (self , dataset ):
327+ """Create a new dataset feature
328+
329+ Create new dataset feature from a GeoJSON Feature and return it as a
330+ GeoJSON Feature.
331+ """
332+ translator = Translator (app , request )
333+
334+ if request .is_json :
335+ # parse request data (NOTE: catches invalid JSON)
336+ feature = api .payload
337+ if isinstance (feature , dict ):
338+ data_service = data_service_handler ()
339+
340+ result = data_service .create (
341+ get_identity (), translator , dataset , feature )
342+ if 'error' not in result :
343+ return result ['feature' ], 201
344+ else :
345+ error_code = result .get ('error_code' ) or 404
346+ error_details = result .get ('error_details' ) or {}
347+ api .abort (error_code , result ['error' ], ** error_details )
348+ else :
349+ api .abort (400 , translator .tr ("error.json_is_not_an_object" ))
350+ else :
351+ api .abort (400 , translator .tr ("error.request_data_is_not_json" ))
352+
320353
321354@api .route ('/<path:dataset>/extent' )
322355@api .response (400 , 'Bad request' )
0 commit comments