improved typing, renamed functions for clarity

This commit is contained in:
dswbx
2025-02-14 11:04:50 +01:00
parent c4e505582b
commit f0bdb3a75e
2 changed files with 26 additions and 31 deletions

View File

@@ -43,18 +43,6 @@ describe("MediaApi", () => {
expect(api.getUploadHeaders().get("Authorization")).toBe("Bearer token"); expect(api.getUploadHeaders().get("Authorization")).toBe("Bearer token");
}); });
it("should upload file directly", async () => {
const name = "image.png";
const file = await Bun.file(`${assetsPath}/${name}`);
// @ts-ignore tests
const api = new MediaApi({}, mockedBackend.request);
const result = await api.uploadFile(file as any, name);
expect(result.name).toBe(name);
expect(result.is_file).toBe(true);
expect(result.size).toBe(file.size);
});
it("should get file: native", async () => { it("should get file: native", async () => {
const name = "image.png"; const name = "image.png";
const path = `${assetsTmpPath}/${name}`; const path = `${assetsTmpPath}/${name}`;
@@ -67,24 +55,24 @@ describe("MediaApi", () => {
await file.delete(); await file.delete();
}); });
it("getFile", async () => { it("download", async () => {
// @ts-ignore tests // @ts-ignore tests
const api = new MediaApi({}, mockedBackend.request); const api = new MediaApi({}, mockedBackend.request);
const name = "image.png"; const name = "image.png";
const file = await api.getFile(name); const file = await api.download(name);
expect(isFile(file)).toBe(true); expect(isFile(file)).toBe(true);
expect(file.size).toBeGreaterThan(0); expect(file.size).toBeGreaterThan(0);
expect(file.type).toBe("image/png"); expect(file.type).toBe("image/png");
expect(file.name).toContain(name); expect(file.name).toContain(name);
}); });
it("getFileResponse", async () => { it("getFile", async () => {
// @ts-ignore tests // @ts-ignore tests
const api = new MediaApi({}, mockedBackend.request); const api = new MediaApi({}, mockedBackend.request);
const name = "image.png"; const name = "image.png";
const res = await api.getFileResponse(name); const res = await api.getFile(name);
expect(res.ok).toBe(true); expect(res.ok).toBe(true);
// make sure it's a normal api request as usual // make sure it's a normal api request as usual
expect(res.res.ok).toBe(true); expect(res.res.ok).toBe(true);
@@ -143,7 +131,13 @@ describe("MediaApi", () => {
await matches(api.upload(response, "response.png"), "response.png"); await matches(api.upload(response, "response.png"), "response.png");
} }
// upload via readable // upload via readable from bun
await matches(await api.upload(file.stream(), "readable.png"), "readable.png"); await matches(await api.upload(file.stream(), "readable.png"), "readable.png");
// upload via readable from response
{
const response = (await mockedBackend.request(url)) as Response;
await matches(await api.upload(response.body!, "readable.png"), "readable.png");
}
}); });
}); });

View File

@@ -1,3 +1,4 @@
import type { FileListObject } from "media";
import { type BaseModuleApiOptions, ModuleApi, type PrimaryFieldType } from "modules/ModuleApi"; import { type BaseModuleApiOptions, ModuleApi, type PrimaryFieldType } from "modules/ModuleApi";
import type { FileWithPath } from "ui/elements/media/file-selector"; import type { FileWithPath } from "ui/elements/media/file-selector";
@@ -10,34 +11,34 @@ export class MediaApi extends ModuleApi<MediaApiOptions> {
}; };
} }
getFiles() { listFiles() {
return this.get(["files"]); return this.get<FileListObject[]>(["files"]);
} }
getFileResponse(filename: string) { getFile(filename: string) {
return this.get(["file", filename], undefined, { return this.get<ReadableStream<Uint8Array>>(["file", filename], undefined, {
headers: { headers: {
Accept: "*/*" Accept: "*/*"
} }
}); });
} }
async getFile(filename: string): Promise<Blob> {
const { res } = await this.getFileResponse(filename);
if (!res.ok || !res.body) {
throw new Error("Failed to fetch file");
}
return await res.blob();
}
async getFileStream(filename: string): Promise<ReadableStream<Uint8Array>> { async getFileStream(filename: string): Promise<ReadableStream<Uint8Array>> {
const { res } = await this.getFileResponse(filename); const { res } = await this.getFile(filename);
if (!res.ok || !res.body) { if (!res.ok || !res.body) {
throw new Error("Failed to fetch file"); throw new Error("Failed to fetch file");
} }
return res.body; return res.body;
} }
async download(filename: string): Promise<File> {
const { res } = await this.getFile(filename);
if (!res.ok || !res.body) {
throw new Error("Failed to fetch file");
}
return (await res.blob()) as File;
}
getFileUploadUrl(file: FileWithPath): string { getFileUploadUrl(file: FileWithPath): string {
return this.getUrl(`/upload/${file.path}`); return this.getUrl(`/upload/${file.path}`);
} }
@@ -52,7 +53,7 @@ export class MediaApi extends ModuleApi<MediaApiOptions> {
}); });
} }
uploadFile(body: File | ReadableStream, filename?: string) { protected uploadFile(body: File | ReadableStream, filename?: string) {
let type: string = "application/octet-stream"; let type: string = "application/octet-stream";
let name: string = filename || ""; let name: string = filename || "";
try { try {