Changeset View
Changeset View
Standalone View
Standalone View
keyserver/src/uploads/uploads.js
// @flow | // @flow | ||||
import type { $Request, $Response, Middleware } from 'express'; | import type { $Request, $Response, Middleware } from 'express'; | ||||
import invariant from 'invariant'; | import invariant from 'invariant'; | ||||
import multer from 'multer'; | import multer from 'multer'; | ||||
import { Readable } from 'stream'; | import { Readable } from 'stream'; | ||||
import t from 'tcomb'; | |||||
import type { | import type { | ||||
UploadMediaMetadataRequest, | |||||
UploadMultimediaResult, | UploadMultimediaResult, | ||||
UploadDeletionRequest, | UploadDeletionRequest, | ||||
Dimensions, | Dimensions, | ||||
} from 'lib/types/media-types.js'; | } from 'lib/types/media-types.js'; | ||||
import { ServerError } from 'lib/utils/errors.js'; | import { ServerError } from 'lib/utils/errors.js'; | ||||
import { tShape } from 'lib/utils/validation-utils.js'; | |||||
import { validateAndConvert } from './media-utils.js'; | import { getMediaType, validateAndConvert } from './media-utils.js'; | ||||
import type { UploadInput } from '../creators/upload-creator.js'; | |||||
import createUploads from '../creators/upload-creator.js'; | import createUploads from '../creators/upload-creator.js'; | ||||
import { deleteUpload } from '../deleters/upload-deleters.js'; | import { deleteUpload } from '../deleters/upload-deleters.js'; | ||||
import { | import { | ||||
fetchUpload, | fetchUpload, | ||||
fetchUploadChunk, | fetchUploadChunk, | ||||
getUploadSize, | getUploadSize, | ||||
} from '../fetchers/upload-fetchers.js'; | } from '../fetchers/upload-fetchers.js'; | ||||
import type { MulterRequest } from '../responders/handlers.js'; | import type { MulterRequest } from '../responders/handlers.js'; | ||||
import type { Viewer } from '../session/viewer.js'; | import type { Viewer } from '../session/viewer.js'; | ||||
import { validateInput } from '../utils/validation-utils.js'; | |||||
const upload = multer(); | const upload = multer(); | ||||
const multerProcessor: Middleware<> = upload.array('multimedia'); | const multerProcessor: Middleware<> = upload.array('multimedia'); | ||||
type MultimediaUploadResult = { | type MultimediaUploadResult = { | ||||
results: UploadMultimediaResult[], | results: UploadMultimediaResult[], | ||||
}; | }; | ||||
async function multimediaUploadResponder( | async function multimediaUploadResponder( | ||||
▲ Show 20 Lines • Show All 51 Lines • ▼ Show 20 Lines | ): Promise<MultimediaUploadResult> { | ||||
const uploadInfos = validationResults.filter(Boolean); | const uploadInfos = validationResults.filter(Boolean); | ||||
if (uploadInfos.length === 0) { | if (uploadInfos.length === 0) { | ||||
throw new ServerError('invalid_parameters'); | throw new ServerError('invalid_parameters'); | ||||
} | } | ||||
const results = await createUploads(viewer, uploadInfos); | const results = await createUploads(viewer, uploadInfos); | ||||
return { results }; | return { results }; | ||||
} | } | ||||
const uploadMediaMetadataInputValidator = tShape({ | |||||
filename: t.String, | |||||
width: t.Number, | |||||
height: t.Number, | |||||
blobHolder: t.String, | |||||
encryptionKey: t.String, | |||||
mimeType: t.String, | |||||
loop: t.maybe(t.Boolean), | |||||
}); | |||||
async function uploadMediaMetadataResponder( | |||||
viewer: Viewer, | |||||
input: any, | |||||
): Promise<UploadMultimediaResult> { | |||||
const request: UploadMediaMetadataRequest = input; | |||||
await validateInput(viewer, uploadMediaMetadataInputValidator, input); | |||||
const mediaType = getMediaType(request.mimeType); | |||||
if (!mediaType) { | |||||
throw new ServerError('invalid_parameters'); | |||||
} | |||||
const { filename, blobHolder, encryptionKey, mimeType, width, height, loop } = | |||||
request; | |||||
const uploadInfo: UploadInput = { | |||||
name: filename, | |||||
mime: mimeType, | |||||
mediaType, | |||||
content: { storage: 'blob_service', blobHolder }, | |||||
encryptionKey, | |||||
dimensions: { width, height }, | |||||
loop: loop ?? false, | |||||
}; | |||||
const [result] = await createUploads(viewer, [uploadInfo]); | |||||
return result; | |||||
} | |||||
async function uploadDownloadResponder( | async function uploadDownloadResponder( | ||||
viewer: Viewer, | viewer: Viewer, | ||||
req: $Request, | req: $Request, | ||||
res: $Response, | res: $Response, | ||||
): Promise<void> { | ): Promise<void> { | ||||
const { uploadID, secret } = req.params; | const { uploadID, secret } = req.params; | ||||
if (!uploadID || !secret) { | if (!uploadID || !secret) { | ||||
throw new ServerError('invalid_parameters'); | throw new ServerError('invalid_parameters'); | ||||
▲ Show 20 Lines • Show All 63 Lines • ▼ Show 20 Lines | ): Promise<void> { | ||||
await deleteUpload(viewer, id); | await deleteUpload(viewer, id); | ||||
} | } | ||||
export { | export { | ||||
multerProcessor, | multerProcessor, | ||||
multimediaUploadResponder, | multimediaUploadResponder, | ||||
uploadDownloadResponder, | uploadDownloadResponder, | ||||
uploadDeletionResponder, | uploadDeletionResponder, | ||||
uploadMediaMetadataResponder, | |||||
}; | }; |