39 lines
1.6 KiB
TypeScript
39 lines
1.6 KiB
TypeScript
import { request, requestBlob, requestForm, withQuery } from '../core/httpClient';
|
|
import type { FileObject } from '../types';
|
|
import { assertUploadFileSize } from '@/utils/fileUpload';
|
|
import { clearSession, dispatchSessionEvent, hasRecentUserActivity, readSession, redirectToPortalLogin } from '../session';
|
|
import { readErrorBody } from '../core/httpClient';
|
|
|
|
export const adminFilesApi = {
|
|
uploadFileObject: async (file: File, body: { purpose: string; prefix?: string }, tenantId?: string) => {
|
|
assertUploadFileSize(file);
|
|
const form = new FormData();
|
|
form.set('file', file);
|
|
form.set('purpose', body.purpose);
|
|
if (body.prefix) {
|
|
form.set('prefix', body.prefix);
|
|
}
|
|
const headers = new Headers();
|
|
const session = readSession('admin');
|
|
if (session && hasRecentUserActivity()) headers.set('x-session-activity', 'user');
|
|
if (tenantId) {
|
|
headers.set('x-tenant-id', tenantId);
|
|
}
|
|
const response = await fetch('/api/admin/files/upload', { method: 'POST', headers, body: form, credentials: 'same-origin' });
|
|
if (response.status === 401 && session) {
|
|
const error = await readErrorBody(response.clone());
|
|
if (error.code === 'SESSION_LOCKED') {
|
|
dispatchSessionEvent('admin', 'locked', { message: error.message });
|
|
} else {
|
|
clearSession('admin');
|
|
dispatchSessionEvent('admin', 'logout', { code: error.code, message: error.message });
|
|
redirectToPortalLogin('admin');
|
|
}
|
|
}
|
|
if (!response.ok) {
|
|
throw new Error(await response.text());
|
|
}
|
|
return response.json() as Promise<FileObject>;
|
|
},
|
|
};
|