import { Context, Router } from "https://deno.land/x/oak/mod.ts"; import { FileService } from "./fileservice.ts"; import { readerFromStreamReader } from "https://deno.land/std@0.189.0/streams/mod.ts"; import { asyncIterableToArray } from "./utils.ts"; import { StringReader } from "https://deno.land/std@0.178.0/io/string_reader.ts"; import { isReader } from "https://deno.land/x/oak@v12.5.0/util.ts"; import { createMockNext } from "https://deno.land/x/oak@v12.1.0/testing.ts"; type Handler = (ctx: Context) => void; function listFileHandlerFactory(fileService: FileService): Handler { return async (ctx: Context) => { ctx.response.type = "application/json"; ctx.response.body = await asyncIterableToArray(fileService.list()); }; } function createFileHandlerFactory(fileService: FileService): Handler { return async (ctx: Context) => { const untypedCtx: any = ctx; ctx.response.body = 'This is a post'; const path = untypedCtx.request.url.searchParams.get('path'); const reqBody = await ctx.request.body({ type: "stream" }).value; const reader = readerFromStreamReader(reqBody.getReader()) fileService.createFromReader(path, reader); }; } function getFileHandlerFactory(fileService: FileService): Handler { return async (ctx: Context) => { const untypedCtx: any = ctx; const fileId = untypedCtx.params.file_id; const reader = await fileService.getBodyAsReader(fileId); if(reader == null){ ctx.response.status = 404; return; } ctx.response.status = 200; ctx.response.body = reader; ctx.response.type = "text/plain"; // ctx.send(reader) }; } export function buildAPI(router: Router, fileService: FileService): Router { router.get('/files', listFileHandlerFactory(fileService)); router.get('/files/:file_id', getFileHandlerFactory(fileService)); router.post('/files', createFileHandlerFactory(fileService)); return router; }