kopia lustrzana https://github.com/cloudflare/wildebeest
Merge pull request #137 from cloudflare/sven/forward-request-images
upload user content forwards request to Imagespull/138/head
commit
53273c9dee
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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 })
|
||||
|
||||
|
|
Ładowanie…
Reference in New Issue