# API Extensions - Media Items
### Update File by Metadata & Locator
**Scenarios**:
- [x] Update a media item that doesn't exist
- byLocator: `"Cannot read property 'id' of null"`
- byMetadata: `"No candidate entities found for key: files_entity_caption,Global,hellooooooo. Please ensure your entity exists and the attribute used for the lookup is of type String"`
- [x] Update a media item that is archived
- byLocator: updates the file as told. same does `updateFile`
- byMetadata: updates the file as told. same does `updateFile`
- [x] Update a media item that is trashed
- byLocator: `"Cannot read property 'id' of null"`
- byMetadata: trashed files don't have metadata info, can't use mutation
- [x] Add extra languages (1 or 2) and fill in metadata fields on each
- [x] Update a file's entity type, fill in some fields, attach it to a title, update its parent and add it to a virtual folder when the file is unattached.
- [x] Update a file's entity type, fill in some fields, attach it to a title, update its parent and add it to a virtual folder when the file is already attached to a different title.
- error: "Using a virtual folder from another title is not allowed."
- https://ateliere.atlassian.net/browse/CD-10860 - zypline issue
- [x] Update a file with an incompatible entity type
- error: `"Can't use entityType with baseSubType 'image' for file with type 'caption'!"`
- [x] Add the file to a title when it's unasigned.
- [x] Update just the title when the file is attached to a different title
- [x] Update when multiple titles satisfy `titleMetadataLookup`
- error: `"Multiple candidates found for key: api_extension_entity,Global,hello"`
- [x] Move the file from a virtual folder in a different virtual folder of the same title
- [x] Use a virtual folder that is part of a different title
- error: `"Using a virtual folder from another title is not allowed."`
- [x] Update with a title that doesn't exist
- error: `"No candidate entities found for key: api_extension_entity,Global,hellooooo"`
- [x] Update with a virtual folder that doesn't exist
- error: `"No candidate entities found for virtualFolderName: test-auto2\n and titleMetadataLookup: {\"entityTypeName\":\"api_extension_entity\",\"lookupField\":{\"name\":\"Global\",\"value\":\"hello\"}}"`
- [x] Update the parent when the file doesn't have a parent already set
- [x] Update the parent when the file already has a parent set
- [x] Update when multiple files satisfy the `parentMetadataLookup`
- error: `"Multiple candidates found for key: files_entity_caption,Global,hello"`
_______________
### Delete File by Metadata & Locator
**Scenarios**:
- [x] Delete a file that is not attached to any title
- byLocator: ``{
"data": {
"deleteFileByLocator": {
"filename": "CODA_Parcel1_1_minute-PRORES-1920-1080.mov",
"status": "permanently_deleted",
"locatorUrl": "s3://tf-s3-ownzones-arrakis/testautomation/uploads/CODA_Parcel1_1_minute-PRORES-1920-1080.mov"
}
}
}
- byMetadata: ``{
"data": {
"deleteFileByMetadata": [
{
"filename": "CODA_Parcel4_1_minute-PRORES-1920-1080.mov",
"status": "permanently_deleted"
}
]
}
}``
- [x] Delete a file that is attached to a title
- byLocator:`` {
"data": {
"deleteFileByLocator": {
"filename": "Matrix_Parcel3_1_minute-PRORES-1920-1080.mov",
"status": "permanently_deleted",
"locatorUrl": "s3://tf-s3-ownzones-arrakis/testautomation/uploads/Matrix_Parcel3_1_minute-PRORES-1920-1080.mov"
}
}
}
- byMetadata: ``{
"data": {
"deleteFileByMetadata": [
{
"filename": "TEST_Parcel1_1_minute-PRORES-1920-1080.mov",
"status": "permanently_deleted"
}
]
}
}``
- [x] Delete a file that is attached to a title and it is Archived
- byLocator:``{
"data": {
"deleteFileByLocator": {
"filename": "Parcel21_1_minute-PRORES-1920-1080.mov",
"status": "permanently_deleted",
"locatorUrl": "s3://tf-s3-ownzones-arrakis/testautomation/uploads/Parcel21_1_minute-PRORES-1920-1080.mov"
}
}
}``
- byMetadata: ``{
"data": {
"deleteFileByMetadata": [
{
"filename": "Matrix_Parcel3_1_minute-PRORES-1920-1080.mov",
"status": "permanently_deleted"
}
]
}
}``
- [x] Delete a media item that doesn't exist
- byLocator: ``{
"errors": [
{
"message": "Cannot read property 'id' of null"
}
],
"data": {
"deleteFileByLocator": null
}
}``
- byMetadata: ``{
"data": {
"deleteFileByMetadata": []
}
}``
- [x] Delete a media that is "Trashed"
- byLocator:`` {
"errors": [
{
"message": "Cannot read property 'id' of null"
}
],
"data": {
"deleteFileByLocator": null
}
}``
- byMetadata:`` {
"data": {
"deleteFileByMetadata": []
}
}``
- [x] Delete a media with "physicalDelete": false
- byLocator: ``{
"data": {
"deleteFileByLocator": {
"filename": "TEST_Parcel1_1_minute-PRORES-1920-1080.mov",
"status": "trashed",
"locatorUrl": "s3://tf-s3-ownzones-arrakis/testautomation/uploads/TEST_Parcel1_1_minute-PRORES-1920-1080.mov"
}
}
}``
- byMetadata: ``{
"data": {
"deleteFileByMetadata": [
{
"filename": "TEST_Parcel1_1_minute-PRORES-1920-1080.mov",
"status": "trashed"
}
]
}
}``
- [x] Delete a media with an invalid "key"
- byLocator: ``{
"errors": [
{
"message": "Cannot read property 'id' of null"
}
],
"data": {
"deleteFileByLocator": null
}
}``
- [x] Delete a media with an invalid "url"
- ByLocator: ``{
"errors": [
{
"message": "Cannot read property 'id' of null"
}
],
"data": {
"deleteFileByLocator": null
}
}``
- [x] Delete a media with an invalid "type"
- byLocator: `Variable "$_v1_fileLocator" got invalid value { key: "testautomation/uploads/TEST_Parcel1_1_minute-PRORES-1920-1080.mov", url: "s3:/tf-s3-ownzones-arrakis/testautomation/uploads/TEST_Parcel1_1_minute-PRORES-1920-1080.mov", type: "3FileLocator", bucket: "tf-s3-ownzones-arrakis"
}; Expected type FileLocatorInput.
Invalid value "3FileLocator" at "value.type": Expected type FileLocatorType. Did you mean S3FileLocator, FsFileLocator, HttpFileLocator, or TransferFileLocator?``
- [x] Delete a media with an invalid "bucket"
- ByLocator: ``{
"errors": [
{
"message": "Cannot read property 'id' of null"
}
],
"data": {
"deleteFileByLocator": null
}
}``
_______________
### Tag/Untag
**Scenarios**:
- **bulkUpdateFilesByMetadata**
- [x] Add a tag that matches the file type
- update: error "column \"values\" does not exist" - with @nick
- tag is added but query returns `"filename": null`, and `"designation": null`. same does `bulkUpsertFiles`
- [x] Pass an entityTypeName that doesn't exist or it's not set on any file
- error: "Cannot read property 'baseEntities' of undefined" - to recheck after bugfix
- new error: "No candidate entities found for key: dasdas,Global,hi. Please ensure your entity exists and the attribute used for the lookup is of type String"
- [x] Update multiple files with different tags
- [x] Update a file with a tag that doesn't exist
- https://ateliere.atlassian.net/browse/CD-10864
- [ ] Update the same file with multiple tags
- ads just one. same does `bulkUpsertFiles`
- should error for duplicate entries - recheck after deploy
- [x] Add a tag that doesn't match the file type
- adds it anyway but marks with Invalid Tag! - same after merge with master, same on bulkUpsertFiles
- [x] Update both tag and entity type
- **createFileFileDesignationEdgeByMetadata** & **createFileFileDesignationEdgeByLocator**
- [x] Pass entityName empty or non existing
- `"No candidate entities found for key: bgbfgfhg,Global,hi. Please ensure your entity exists and the attribute used for the lookup is of type String"`
- [x] Add a tag that matches the file type
- tag is added but query returns "designation": null in fileDesignations.edges. [zypline issue]
- won't delete already existing tags, will just add another one
- [x] Update a file with a tag that doesn’t exist
- `"FileDesignation with name: designationsFeaturessss was not found on organization: c8b2d689-90b5-4a81-8dfc-5ae0aff74f1e!"`
- [x] Add a tag that doesn't match the file type
- adds it anyway but marks with Invalid Tag!
- **deleteFileFileDesignationEdgeByMetadata** & **deleteFileFileDesignationEdgeByLocator**
- [x] Remove a tag that is not on the file but exists
- byMetadata: `"Error: The specified FileFileDesignation was not found."`
- byLocator: `"Error: The specified FileFileDesignation was not found."`
- [x] Remove a tag that doesn't exist
- byMetadata: `"FileDesignation with name: designationsFeaturess was not found on organization: c8b2d689-90b5-4a81-8dfc-5ae0aff74f1e!"`
- byLocator: `"FileDesignation with name: designationsFeaturess was not found on organization: c8b2d689-90b5-4a81-8dfc-5ae0aff74f1e!"`
- [x] Remove a tag when the file has only one tag
- [x] Remove a tag when the file has multiple tags
- [x] Remove a tag then remove it again
- `"Error: The specified FileFileDesignation was not found."`
- [x] Remove an invalid tag (add an invalid tag first)
- [x] Remove a tag from multiple files (byMetadata only)
_______________
### Archive File by Metadata & Locator
**Scenarios**:
- [x] Archive a media item that is unasigned
- byMetadata: ``{
"data": {
"archiveFileByMetadata": [
{
"filename": "Chloe_api_extensions.mov",
"properties": {
"status": null,
"type": null
},
"archiveWorkflow": {
"status": "pending"
},
"status": "archive_started"
}
]
}
}``
- byLocator: ``{
"data": {
"archiveFileByLocator": {
"filename": "Chloe_api_extensions_child.scc",
"properties": null,
"archiveWorkflow": {
"status": "pending"
},
"status": "archive_started",
"storageClass": null
}
}
}``
- [x] Archive a media item assigned to a title
- byMetadata:
`` "data": {
"archiveFileByMetadata": [
{
"filename": "TEST_Parcel1_1_minute-PRORES-1920-1080.mov",
"properties": {
"status": null,
"type": null
},
"archiveWorkflow": {
"status": "pending"
},
"status": "archive_started"
}
]
}
}``
- byLocator:`` {
"data": {
"archiveFileByLocator": {
"filename": "Chloe_api_extensions.mov_0.jpg",
"properties": {
"status": null,
"type": null
},
"archiveWorkflow": {
"status": "pending"
},
"status": "archive_started",
"storageClass": null
}
}
}``
- [x] Archive a media item of different types: .mov, ,jpg, .srt etc.
- byMetadata:``{
"data": {
"archiveFileByMetadata": [
{
"filename": "Chloe_api_extensions.srt",
"properties": null,
"archiveWorkflow": {
"status": "pending"
},
"status": "archive_started"
}
]
}
}`
{
"data": {
"archiveFileByMetadata": [
{
"filename": "image_api_extensions.jpg",
"properties": {
"status": null,
"type": null
},
"archiveWorkflow": {
"status": "pending"
},
"status": "archive_started"
}
]
}
}``
- byLocator: ``{
"data": {
"archiveFileByLocator": {
"filename": "test-auto-17-5440-4652-890f-7a9c4c612b43_j2k__video.mxf",
"properties": {
"status": null,
"type": null
},
"archiveWorkflow": {
"status": "pending"
},
"status": "archive_started",
"storageClass": "GLACIER"
}
}
}``
- [x] Archive a media item from a different organisation
- byMetadata: to retest after deploy
- byLocator:`` {
"errors": [
{
"message": "The file with the id:'a33ff0d4-7f62-407a-82ae-446b37853623' was not found."
}
],
"data": {
"archiveFileByLocator": null
}
}``
- [x] Archive a media item which doesn't exist in Connect
- byMetadata: to retest after deploy
- byLocator: ``{
"errors": [
{
"message": "Cannot read property 'id' of null"
}
],
"data": {
"archiveFileByLocator": null
}
}``
- [x] Archive a media item which is already in archived status
- ByMetadata: https://ateliere.atlassian.net/browse/CD-10867
- byLocator:
same behaviour as above
_______________
### Restore Archived File by Metadata & Locator
**Scenarios**:
- [x] Restore a media item that is unasigned
- byMetadata:``{
"data": {
"restoreArchivedFileByMetadata": [
{
"filename": "Chloe_api_extensions.mov",
"properties": {
"status": null,
"type": null
},
"archiveWorkflow": {
"status": "completed"
},
"status": "restore_started",
"storageClass": "GLACIER"
}
]
}
}``
- byLocator:
- [x] Restore a media item that is assigned to a title
- byMetadata:
- byLocator:
- [x] Restore a media item of different types: .mov, ,jpg, .srt etc.
- byMetadata:
- byLocator:
- [x] Restore a media item from a different organisation
- byMetadata:`"message": "Cannot read property 'id' of null"`
- byLocator:`"message": "Cannot read property 'id' of null"`
- [x] Restore a media item which doesn't exist in Connect
- byMetadata: ``"message": "Cannot read property 'id' of null"``
- byLocator: `"message": "Cannot read property 'id' of null"``
- [x] Restore a media item which is not archived
- byMetadata: ``"message": "The file with the id:'4c01f371-621e-4f84-9a27-b1cff24ea954' is not archived."``
- byLocator: ` "message": "The file with the id:'d55b90f2-0b12-4ab0-b58e-f2404d487778' is not archived."`
- [x] Restore a media by its "restoreType": "Expedited(1-5 minutes)"
- byMetadata:
- byLocator:
- [x] Restore a media by its "restoreType": "Bulk(5-12h)"
- byMetadata:
- byLocator:
- [x] Restore a media by its "restoreType": "Standard(3-5h)"
- byMetadata:
- byLocator:
_______________
### Restore File from Trash by Locator
**Scenarios**:
- [x] Restore a trashed file
- [x] Restore a media item that doesn't exist
- `"Cannot read property 'id' of null"`
- [x] Restore a file that is not trashed
- will reingest the file. same does current mutation `restoreFileFromTrash`
- try this with an Archived file
----------------
### Read file
- [x] Have multiple files that match the query and make sure all of them are returned (in different statuses: ingest completed, restore started, archived)
`{
"data": {
"fileByMetadata": [
{
"filename": "bug_jobs.png",
"status": "ingest_completed",
"entityType": {
"name": "files_entity_image"
},
"customFields": [
{
"locale": null,
"values": [
{
"id": "9cc3a086-9a54-4427-89aa-ee888257be38",
"value": "hi"
}
]
},
{
"locale": "en-US",
"values": [
{
"id": "22a386a7-891b-4ebd-9662-408690415591",
"value": "get query"
},
{
"id": "fe376509-ea88-477e-9113-9c21cdecd849",
"value": false
}
]
}
]
},
{
"filename": "image_api_extensions.jpg",
"status": "restore_started",
"entityType": {
"name": "files_entity_image"
},
"customFields": [
{
"locale": null,
"values": [
{
"id": "b8617383-702c-402e-b8d0-215352ba6635",
"value": "hello"
}
]
},
{
"locale": "en-US",
"values": [
{
"id": "80b4a19d-014d-4214-8664-aa863fa2ae53",
"value": false
},
{
"id": "f42887f6-101b-4f01-b912-0cc40fb72dee",
"value": "get query"
}
]
}
]
},
{
"filename": "Chloe_api_extensions.mov_0.jpg",
"status": "ingest_completed",
"entityType": {
"name": "files_entity_image"
},
"customFields": [
{
"locale": "en-US",
"values": [
{
"id": "b19ac5c8-a62f-4a16-9cb0-f5d8f7c8a00a",
"value": false
},
{
"id": "7a50a36c-14a9-4c10-bc4c-ddf684e8f564",
"value": "get query"
}
]
}
]
},
{
"filename": "searchservice-002.png",
"status": "restore_started",
"entityType": {
"name": "files_entity_image"
},
"customFields": [
{
"locale": "en-US",
"values": [
{
"id": "664734c1-62f3-4102-abf6-a9294497ed07",
"value": false
},
{
"id": "93577d48-fade-47af-9eeb-8011b05b0409",
"value": "get query"
}
]
}
]
},
{
"filename": "test-auto_automation_1635874492523.jpg",
"status": "archived",
"entityType": {
"name": "files_entity_image"
},
"customFields": [
{
"locale": "en-US",
"values": [
{
"id": "8d36a513-93e1-4095-a4a6-9b62fe2c9f50",
"value": "get query"
},
{
"id": "cfc39736-f0cf-4e0d-9dcf-0515dc6e9769",
"value": false
}
]
}
]
}
]
}
}`
- [x] Test single file can be returned
- [x] No files are returned when none match the query
` "message": "No candidate entities found for key: raluca api test,String,1000. Please ensure your entity exists and the attribute used for the lookup is of type String"`