Changeset View
Changeset View
Standalone View
Standalone View
keyserver/src/fetchers/upload-fetchers.js
// @flow | // @flow | ||||
import _keyBy from 'lodash/fp/keyBy'; | |||||
import type { Media } from 'lib/types/media-types'; | import type { Media } from 'lib/types/media-types'; | ||||
import type { MediaMessageServerDBContent } from 'lib/types/messages/media.js'; | |||||
import { ServerError } from 'lib/utils/errors'; | import { ServerError } from 'lib/utils/errors'; | ||||
import { dbQuery, SQL } from '../database/database'; | import { dbQuery, SQL } from '../database/database'; | ||||
import type { Viewer } from '../session/viewer'; | import type { Viewer } from '../session/viewer'; | ||||
import { getAndAssertCommAppURLFacts } from '../utils/urls'; | import { getAndAssertCommAppURLFacts } from '../utils/urls'; | ||||
type UploadInfo = { | type UploadInfo = { | ||||
content: Buffer, | content: Buffer, | ||||
▲ Show 20 Lines • Show All 95 Lines • ▼ Show 20 Lines | SELECT id AS uploadID, secret AS uploadSecret, | ||||
type AS uploadType, extra AS uploadExtra | type AS uploadType, extra AS uploadExtra | ||||
FROM uploads | FROM uploads | ||||
WHERE id IN (${mediaIDs}) AND uploader = ${viewer.id} AND container IS NULL | WHERE id IN (${mediaIDs}) AND uploader = ${viewer.id} AND container IS NULL | ||||
`; | `; | ||||
const [result] = await dbQuery(query); | const [result] = await dbQuery(query); | ||||
return result.map(mediaFromRow); | return result.map(mediaFromRow); | ||||
} | } | ||||
async function fetchMediaFromMediaMessageContent( | |||||
viewer: Viewer, | |||||
mediaMessageContents: $ReadOnlyArray<MediaMessageServerDBContent>, | |||||
): Promise<$ReadOnlyArray<Media>> { | |||||
const uploadIDs = []; | |||||
for (const mediaContent of mediaMessageContents) { | |||||
uploadIDs.push(mediaContent.uploadID); | |||||
if (mediaContent.type === 'video') { | |||||
uploadIDs.push(mediaContent.thumbnailUploadID); | |||||
} | |||||
} | |||||
const query = SQL` | |||||
SELECT id AS uploadID, secret AS uploadSecret, | |||||
type AS uploadType, extra AS uploadExtra | |||||
FROM uploads | |||||
WHERE id IN (${uploadIDs}) AND uploader = ${viewer.id} AND container IS NULL | |||||
`; | |||||
const [uploads] = await dbQuery(query); | |||||
const uploadMap = _keyBy('uploadID')(uploads); | |||||
const media: Media[] = []; | |||||
for (const mediaMessageContent of mediaMessageContents) { | |||||
const primaryUploadID = mediaMessageContent.uploadID; | |||||
const primaryUpload = uploadMap[primaryUploadID]; | |||||
const primaryUploadSecret = primaryUpload.uploadSecret; | |||||
const primaryUploadURI = getUploadURL(primaryUploadID, primaryUploadSecret); | |||||
const uploadExtra = JSON.parse(primaryUpload.uploadExtra); | |||||
const { width, height, loop } = uploadExtra; | |||||
const dimensions = { width, height }; | |||||
if (mediaMessageContent.type === 'photo') { | |||||
media.push({ | |||||
type: 'photo', | |||||
id: primaryUploadID, | |||||
uri: primaryUploadURI, | |||||
dimensions, | |||||
}); | |||||
continue; | |||||
} | |||||
const thumbnailUploadID = mediaMessageContent.thumbnailUploadID; | |||||
const thumbnailUpload = uploadMap[thumbnailUploadID]; | |||||
const thumbnailUploadSecret = thumbnailUpload.uploadSecret; | |||||
const thumbnailUploadURI = getUploadURL( | |||||
thumbnailUploadID, | |||||
thumbnailUploadSecret, | |||||
); | |||||
const video = { | |||||
type: 'video', | |||||
id: primaryUploadID, | |||||
uri: primaryUploadURI, | |||||
dimensions, | |||||
thumbnailID: thumbnailUploadID, | |||||
thumbnailURI: thumbnailUploadURI, | |||||
}; | |||||
media.push(loop ? { ...video, loop } : video); | |||||
} | |||||
return media; | |||||
} | |||||
export { | export { | ||||
fetchUpload, | fetchUpload, | ||||
fetchUploadChunk, | fetchUploadChunk, | ||||
getUploadSize, | getUploadSize, | ||||
getUploadURL, | getUploadURL, | ||||
mediaFromRow, | mediaFromRow, | ||||
fetchMedia, | fetchMedia, | ||||
fetchMediaFromMediaMessageContent, | |||||
}; | }; |