Merge pull request #137 from cloudflare/sven/forward-request-images

upload user content forwards request to Images
pull/138/head
Sven Sauleau 2023-01-18 14:48:52 +01:00 zatwierdzone przez GitHub
commit 53273c9dee
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 4AEE18F83AFDEB23
3 zmienionych plików z 27 dodań i 31 usunięć

Wyświetl plik

@ -75,7 +75,22 @@ export async function uploadHeader(file: File, config: Config): Promise<URL> {
return selectVariant(result, HEADER_VARIANT)
}
export async function uploadUserContent(file: File, config: Config): Promise<URL> {
const result = await upload(file, config)
return selectVariant(result, USER_CONTENT_VARIANT)
export async function uploadUserContent(request: Request, config: Config): Promise<URL> {
const url = `https://api.cloudflare.com/client/v4/accounts/${config.accountId}/images/v1`
const newRequest = new Request(url, request)
newRequest.headers.set('authorization', 'Bearer ' + config.apiToken)
const res = await fetch(newRequest)
if (!res.ok) {
const body = await res.text()
throw new Error(`Cloudflare Images returned ${res.status}: ${body}`)
}
const data = await res.json<APIResult<UploadResult>>()
if (!data.success) {
const body = await res.text()
throw new Error(`Cloudflare Images returned ${res.status}: ${body}`)
}
return selectVariant(data.result, USER_CONTENT_VARIANT)
}

Wyświetl plik

@ -12,8 +12,8 @@ const domain = 'cloudflare.com'
describe('Mastodon APIs', () => {
describe('media', () => {
test('upload image creates object', async () => {
globalThis.fetch = async (input: RequestInfo) => {
if (input === 'https://api.cloudflare.com/client/v4/accounts/testaccountid/images/v1') {
globalThis.fetch = async (input: any) => {
if (input.url.toString() === 'https://api.cloudflare.com/client/v4/accounts/testaccountid/images/v1') {
return new Response(
JSON.stringify({
success: true,
@ -24,7 +24,7 @@ describe('Mastodon APIs', () => {
})
)
}
throw new Error('unexpected request to ' + input)
throw new Error('unexpected request to ' + input.url)
}
const db = await makeDB()
@ -39,7 +39,7 @@ describe('Mastodon APIs', () => {
method: 'POST',
body,
})
const res = await media.handleRequest(req, db, connectedActor, CF_ACCOUNT_ID, CF_API_TOKEN)
const res = await media.handleRequestPost(req, db, connectedActor, CF_ACCOUNT_ID, CF_API_TOKEN)
assert.equal(res.status, 200)
assertJSON(res)

Wyświetl plik

@ -5,13 +5,12 @@ import * as media from 'wildebeest/backend/src/media/image'
import type { ContextData } from 'wildebeest/backend/src/types/context'
import type { MediaAttachment } from 'wildebeest/backend/src/types/media'
import type { Person } from 'wildebeest/backend/src/activitypub/actors'
import { localFormDataParse } from 'wildebeest/backend/src/utils/body'
export const onRequest: PagesFunction<Env, any, ContextData> = async ({ request, env, data }) => {
return handleRequest(request, env.DATABASE, data.connectedActor, env.CF_ACCOUNT_ID, env.CF_API_TOKEN)
export const onRequestPost: PagesFunction<Env, any, ContextData> = async ({ request, env, data }) => {
return handleRequestPost(request, env.DATABASE, data.connectedActor, env.CF_ACCOUNT_ID, env.CF_API_TOKEN)
}
export async function handleRequest(
export async function handleRequestPost(
request: Request,
db: D1Database,
connectedActor: Person,
@ -24,31 +23,13 @@ export async function handleRequest(
throw new Error('invalid request')
}
let formData = null
if (
contentType.includes('charset') &&
contentType.includes('multipart/form-data') &&
contentType.includes('boundary')
) {
formData = await localFormDataParse(request)
} else {
formData = await request.formData()
}
const domain = new URL(request.url).hostname
if (!formData.has('file')) {
return new Response('', { status: 400 })
}
const file = formData.get('file')! as any
const config = { accountId, apiToken }
const url = await media.uploadUserContent(file, config)
const url = await media.uploadUserContent(request, config)
const properties = {
url,
}
const domain = new URL(request.url).hostname
const image = await createImage(domain, db, connectedActor, properties)
console.log({ image })