diff --git a/api/api.py b/api/api.py index e8efc3156f3761f5d69ccbde96c7d4e9ae86ed23..355e78f0713acd4820c0613acf1ef2ba5b3f84ee 100644 --- a/api/api.py +++ b/api/api.py @@ -47,8 +47,8 @@ routes = [ ]), webapp2.Route(r'/api/<cont_name:[0-9a-z]{3,24}>/<cid:[0-9a-z]{3,24}>/tags', listhandler.ListHandler, methods=['POST'], name='tags_post', defaults={'list_name': 'tags'}), webapp2.Route(r'/api/<cont_name:[0-9a-z]{3,24}>/<cid:[0-9a-z]{3,24}>/tags/<value:[^/]{3,24}>', listhandler.ListHandler, name='tags', defaults={'list_name': 'tags'}), - webapp2.Route(r'/api/<cont_name:[0-9a-z]{3,24}>/<cid:[0-9a-z]{3,24}>/file', listhandler.FileListHandler, name='files_post', methods=['POST'], defaults={'list_name': 'files'}), - webapp2.Route(r'/api/<cont_name:[0-9a-z]{3,24}>/<cid:[0-9a-z]{3,24}>/file/<filename:[^/]{3,60}>', listhandler.FileListHandler, name='files', defaults={'list_name': 'files'}), + webapp2.Route(r'/api/<cont_name:[0-9a-z]{3,24}>/<cid:[0-9a-z]{3,24}>/files', listhandler.FileListHandler, name='files_post', methods=['POST'], defaults={'list_name': 'files'}), + webapp2.Route(r'/api/<cont_name:[0-9a-z]{3,24}>/<cid:[0-9a-z]{3,24}>/files/<filename:[^/]{3,60}>', listhandler.FileListHandler, name='files', defaults={'list_name': 'files'}), webapp2.Route(r'/api/<cont_name:collections|projects>/<cid:[0-9a-z]{3,24}>/permissions', listhandler.PermissionsListHandler, name='perms_post', methods=['POST'], defaults={'list_name': 'permissions'}), webapp2.Route(r'/api/<cont_name:collections|projects>/<cid:[0-9a-z]{3,24}>/permissions/<site:[0-9a-z]{3,24}>/<_id:[\w\@\-\.]{3,60}>', listhandler.PermissionsListHandler, name='perms', defaults={ 'list_name': 'permissions'}), diff --git a/api/files.py b/api/files.py index 24917eae1a6473b528e3009c0b936682a51df3cb..c05aa79e66af5ff16f0ede96445c3c3e35490163 100644 --- a/api/files.py +++ b/api/files.py @@ -22,7 +22,7 @@ class FileRequest(object): The operations could be safely interleaved with other actions like permission checks or database updates. """ - def __init__(self, client_addr, filename, body, received_md5, metadata, tags, flavor): + def __init__(self, client_addr, filename, body, received_md5, metadata, tags): self.client_addr = client_addr self.filename = filename self.body = body @@ -31,7 +31,6 @@ class FileRequest(object): self.tags = tags self.mimetype = util.guess_mimetype(filename) self.filetype = util.guess_filetype(filename, self.mimetype) - self.flavor = flavor def save_temp_file(self, tempdir_path): self.tempdir_path = tempdir_path @@ -137,8 +136,5 @@ class FileRequest(object): except ValueError: handler.abort(400, 'invalid "metadata" parameter') body = handler.request.body_file - flavor = handler.get_param('flavor', 'data') # TODO: flavor should go away - if flavor not in ['data', 'attachment']: - handler.abort(400, 'Query must contain flavor parameter: "data" or "attachment".') md5 = handler.request.headers.get('Content-MD5') - return cls(handler.request.client_addr, filename, body, md5, metadata, tags, flavor) + return cls(handler.request.client_addr, filename, body, md5, metadata, tags) diff --git a/api/handlers/listhandler.py b/api/handlers/listhandler.py index 9e0f092ca3f466871dabbb35a888bd2c374b5c3a..cf7e4b3b9a3d09e8a6c13b7dc5f6aeec1dcdb50b 100644 --- a/api/handlers/listhandler.py +++ b/api/handlers/listhandler.py @@ -28,7 +28,9 @@ def initialize_list_configurations(): 'files': { 'storage': liststorage.ListStorage, 'permchecker': listauth.default_sublist, - 'use_oid': True + 'use_oid': True, + 'mongo_schema_file': 'mongo/file.json', + 'input_schema_file': 'input/file.json' }, 'permissions': { 'storage': liststorage.ListStorage, @@ -354,38 +356,34 @@ class FileListHandler(ListHandler): file_request.save_temp_file(tempdir_path) file_datetime = datetime.datetime.utcnow() file_properties = { - 'filename': file_request.filename, - 'filesize': file_request.filesize, - 'filehash': file_request.sha1, - 'filetype': file_request.filetype, - 'flavor': file_request.flavor, - 'mimetype': file_request.mimetype, + 'name': file_request.filename, + 'size': file_request.filesize, + 'hash': file_request.sha1, + 'type': file_request.mimetype, 'tags': file_request.tags, 'metadata': file_request.metadata, 'created': file_datetime, 'modified': file_datetime, - 'dirty': True + 'unprocessed': True } + file_properties['tags'] = file_properties.get('tags', []) dest_path = os.path.join(self.app.config['data_path'], str(_id)[-3:] + '/' + str(_id)) if not force: method = 'POST' else: filepath = os.path.join(file_request.tempdir_path, filename) for f in container['files']: - if f['filename'] == filename: - if file_request.check_identical(os.path.join(data_path, filename), f['filehash']): + if f['name'] == filename: + if file_request.check_identical(os.path.join(data_path, filename), f['hash']): log.debug('Dropping %s (identical)' % filename) os.remove(filepath) self.abort(409, 'identical file exists') else: log.debug('Replacing %s' % filename) - payload_validator(payload, 'PUT') - payload.update(file_properties) method = 'PUT' break else: method = 'POST' - payload_validator(payload, method) payload.update(file_properties) result = keycheck(mongo_validator(permchecker(storage.exec_op)))(method, _id=_id, payload=payload) diff --git a/api/schemas/input/file.json b/api/schemas/input/file.json index 4295309f089918484905b37fcd04b4e6766820d9..7ad120129d140b62a5ba515103dee7f1c9e9bf58 100644 --- a/api/schemas/input/file.json +++ b/api/schemas/input/file.json @@ -2,13 +2,6 @@ "$schema": "http://json-schema.org/draft-04/schema#", "type": "object", "properties": { - "_id": { - "maxLength": 32, - "minLength": 2, - "pattern": "^[0-9a-z][0-9a-z.@_-]{0,30}[0-9a-z]$", - "title": "ID", - "type": "string" - }, "name": { "type": "string" }, "created": {"type": "string", "format": "date-time"}, "modified": {"type": "string", "format": "date-time"}, @@ -31,6 +24,5 @@ "type": "object" } }, - "required": ["_id"], "additionalProperties": false } diff --git a/api/schemas/mongo/file.json b/api/schemas/mongo/file.json index 93aba0ed2b0237b8ce9912ea3321fd018dcea260..2645ba7c76b14ab72c3033911d8f2d9ea7d3806e 100644 --- a/api/schemas/mongo/file.json +++ b/api/schemas/mongo/file.json @@ -2,7 +2,6 @@ "$schema": "http://json-schema.org/draft-04/schema#", "type": "object", "properties": { - "_id": { "type": "string"}, "name": { "type": "string" }, "created": {}, "modified": {}, @@ -25,6 +24,6 @@ "type": "object" } }, - "required": ["_id", "user", "text"], + "required": ["name", "created", "modified", "type", "size", "hash", "unprocessed"], "additionalProperties": false } diff --git a/api/util.py b/api/util.py index 7dfb20ebfa2e6d775ab271811cc6f9746d2f7aa8..57f1d6631db7463d17f4e900e1ce0d3dde6d6830 100644 --- a/api/util.py +++ b/api/util.py @@ -54,7 +54,7 @@ def parse_file(filepath, digest): 'filehash': digest, 'modality': dataset.nims_file_domain, 'datatypes': dataset.nims_file_kinds, - 'flavor': 'data', + 'tags': ['data'], } datainfo = { 'acquisition_id': dataset.nims_acquisition_id,