Files
lislgosms/src/api/admin/files.api.ts
T

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>;
},
};