def get_bundle_record_with_id(bundle_id): """ Returns a record given bundle_id """ expand = True if flask.request.args.get("expand") == "true" else False ret = blueprint.index_driver.get_with_nonstrict_prefix(bundle_id) ret = bundle_to_drs(ret, expand=expand, is_content=False) return flask.jsonify(ret), 200
def post_bundle(): """ Create a new bundle """ auth.authorize("create", ["/services/indexd/bundles"]) try: jsonschema.validate(flask.request.json, BUNDLE_SCHEMA) except jsonschema.ValidationError as err: raise UserError(err) name = flask.request.json.get("name") bundles = flask.request.json.get("bundles") bundle_id = flask.request.json.get("bundle_id") size = flask.request.json.get("size") if flask.request.json.get("size") else 0 description = ( flask.request.json.get("description") if flask.request.json.get("description") else "" ) version = ( flask.request.json.get("version") if flask.request.json.get("version") else "" ) aliases = ( flask.request.json.get("aliases") if flask.request.json.get("aliases") else [] ) if len(bundles) == 0: raise UserError("Bundle data required.") if len(bundles) != len(set(bundles)): raise UserError("Duplicate GUID in bundles.") if bundle_id in bundles: raise UserError("Bundle refers to itself.") bundle_data = [] checksums = [] # TODO: Remove this after updating to jsonschema>=3.0.0 if flask.request.json.get("checksums"): hashes = { checksum["type"]: checksum["checksum"] for checksum in flask.request.json.get("checksums") } validate_hashes(**hashes) # get bundles/records that already exists and add it to bundle_data for bundle in bundles: data = get_index_record(bundle)[0] data = data.json size += data["size"] if not flask.request.json.get("size") else 0 checksums.append(get_checksum(data)) data = bundle_to_drs(data, expand=True, is_content=True) bundle_data.append(data) checksum = ( flask.request.json.get("checksums") if flask.request.json.get("checksums") else [compute_checksum(checksums)] ) ret = blueprint.index_driver.add_bundle( bundle_id=bundle_id, name=name, size=size, bundle_data=json.dumps(bundle_data), checksum=json.dumps(checksum), description=description, version=version, aliases=json.dumps(aliases), ) return flask.jsonify({"bundle_id": ret[0], "name": ret[1], "contents": ret[2]}), 200