Generate the model
To generate the model, invoke nrp-cli model compile <model-name>.
This will parse and validate the metadata file and generate invenio source files.
Model structure
In invenio, model consists of multiple python (and non-python files) that have to work together and stay consistent when changes are introduced. These files (and classes) are:
Resource layer (http):
resources/config.py- defines the URL of the model, content negotiation
 
resources/resource.py- parses the HTTP request and calls the service layer to handle it
 - modify this file if you want to add your own endpoints
 
Service layer (business logic):
services/config.pycontain the definition of:- the primary url of the model (TODO unify this with resources, not done in invenio)
 - permission policies for the service (referenced from config, defined in 
permissions.py) - Marshmallow schema that will be used for deposit validation (referenced from config, defined in 
schema.py) - Search options - what can be searched, ordered, aggregated (referenced from config, defined in 
search.pyandfacets.py) - Extension points (components) to plug into the standard CRUD processing without rewriting service
 - link to record layer
 
services/service.py- implements the business layer of the model
 - the standard CRUD+search is already contained
 - you might add specialized methods here (and call them from the resource layer if they should be accessible via API)
 
Record layer (data access):
jsonschemas/**- json schema of the metadatamappings/**- definition of elasticsearch mappings (json similar to json schema, but not the same)api.py- defines the Record class to store the metadatadumper.py- contains code that is used when storing the metadata and retrieving them from OpenSearchmodels.py- contains the low-level SQLAlchemy access to the database
Top-level
config.py- default configurationext.py- flask registration code for the modelviews.py- registration of the API endpointproxies.py- defines flask proxies to use the service/resource from another model