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