import * as Errors from "../../util/errors"; import { FinalizedRequest, makeDocument } from "../../types"; import ResourceTypeRegistry from "../../ResourceTypeRegistry"; import Data from "../../types/Generic/Data"; import ResourceIdentifier from "../../types/ResourceIdentifier"; import DeleteQuery from "../../types/Query/DeleteQuery"; import RemoveFromRelationshipQuery from "../../types/Query/RemoveFromRelationshipQuery"; export default function(request: FinalizedRequest, registry: ResourceTypeRegistry, makeDoc: makeDocument) { const type = request.type; // There may not be a document, but if there is it'll have primary data. const primary = request.document && (request.document.primary as any)._data; if(request.aboutRelationship) { if(!request.id || !request.relationship) { throw new Error( "Somehow, this request was 'about a relationship' and yet didn't " + "include a resource id and a relationship name. This shouldn't happen." + "Check that your routes are passing params into the library correctly." ); } return new RemoveFromRelationshipQuery({ type: type, id: request.id, relationshipName: request.relationship, linkage: (>primary).values, returning: () => ({ status: 204 }) }); } // Bulk delete of resources const bulkDelete = !request.id; if(bulkDelete) { if(!primary) { // This is an Error, not an APIError, because an earlier check // should make it impossible and throw an APIError if it happens. throw new Error("Bulk delete without a body is not possible.") } if(primary.isSingular) { throw Errors.expectedDataArray({ detail: "You must provide an array of resource identifier objects " + "to do a bulk delete." }); } } return new DeleteQuery({ type, returning: () => ({ status: 204 }), [bulkDelete ? 'ids' : 'id']: bulkDelete ? (>primary).map((it) => it.id).values : request.id }); }