Files
no-copy-frontend/src/app/actions/fileUpload.ts
T

280 lines
6.0 KiB
TypeScript
Raw Normal View History

2025-12-23 18:56:48 +07:00
'use server'
2025-12-26 17:56:57 +07:00
import { API_BASE_URL } from '@/app/actions/definitions';
2025-12-26 14:03:57 +07:00
import { getSessionData } from '@/app/actions/session';
2026-02-04 16:10:16 +07:00
import { FormState } from '@/app/actions/auth';
import { unknown } from 'zod';
2025-12-23 18:56:48 +07:00
interface initMessageBody {
file_name: string,
file_type: string,
extension: string,
file_size: number | string,
action?: string,
2026-02-25 20:04:34 +07:00
token?: string,
2026-03-04 19:21:44 +07:00
convertTo?: string | undefined | null
2025-12-23 18:56:48 +07:00
}
2026-02-17 19:20:04 +07:00
export async function fileUpload(messageBody: initMessageBody, convertTo?: string | null | undefined) {
2025-12-23 18:56:48 +07:00
const token = await getSessionData('token');
if (!token) {
return;
}
const message = messageBody;
2026-01-28 18:53:08 +07:00
message.action = 'init';
2025-12-23 18:56:48 +07:00
message.token = token;
2026-02-25 20:04:34 +07:00
if (convertTo && convertTo !== 'reject') {
message.convertTo = convertTo;
}
2026-02-17 17:58:32 +07:00
// нужно будет добавить свойство convertTo в тело запроса он может прийти со значением reject тогда конвертировать не нужно.
// console.log(convertTo);
2026-02-17 14:43:26 +07:00
2025-12-23 18:56:48 +07:00
try {
const response = await fetch(`${API_BASE_URL}/api/v1/data`, {
method: 'POST',
body: JSON.stringify({
version: 1,
msg_id: 20004,
message_body: message
}),
headers: {
2026-01-28 18:53:08 +07:00
'Content-Type': 'application/json',
'Accept': 'application/json'
2025-12-23 18:56:48 +07:00
}
});
if (response.ok) {
let parsed = await response.json() as {
message_desc: string,
message_body: {
upload_id: string,
total_chunks: number,
chunk_size: number,
status: string
},
message_code: string
};
if (parsed.message_desc === 'Operation successful') {
return parsed.message_body;
} else {
throw parsed;
}
} else {
throw (`${response.status}`);
}
} catch (error) {
return error;
}
}
export async function cancelUpload(udloadId: string) {
try {
const response = await fetch(`${API_BASE_URL}/api/v1/data`, {
method: 'POST',
body: JSON.stringify({
version: 1,
msg_id: 20004,
message_body: {
2026-01-28 18:53:08 +07:00
action: 'cancel',
2025-12-23 18:56:48 +07:00
upload_id: udloadId,
}
}),
headers: {
2026-01-28 18:53:08 +07:00
'Content-Type': 'application/json',
'Accept': 'application/json'
2025-12-23 18:56:48 +07:00
}
});
if (response.ok) {
let parsed = await response.json() as {
message_code: string,
message_desc: string,
message_body: {
upload_id: string,
message: string
}
};
if (parsed.message_desc === 'Upload cancelled successfully') {
return parsed.message_body;
} else {
throw parsed;
}
} else {
throw (`${response.status}`);
}
} catch (error) {
return error;
}
}
2026-02-04 16:10:16 +07:00
export type ChunkResponse = {
errorMesage: string | null
fileId?: string
};
export async function chunkUpload(formData: FormData, itPrivate?: boolean): Promise<ChunkResponse> {
console.log('chunkUpload');
2025-12-23 18:56:48 +07:00
try {
const url = itPrivate
? `${API_BASE_URL}/api/v1/private/files/chunk`
: `${API_BASE_URL}/api/v1/files/chunk`;
const response = await fetch(url, {
2025-12-23 18:56:48 +07:00
method: 'POST',
body: formData
});
2025-12-26 22:16:22 +07:00
2025-12-24 15:41:06 +07:00
if (response.ok) {
let parsed = await response.json();
2026-02-21 22:11:43 +07:00
console.log(parsed);
2025-12-24 15:41:06 +07:00
2026-02-04 16:10:16 +07:00
if (parsed.message_code === 0) {
return {
errorMesage: null,
fileId: parsed.message_body.file_id
}
} else if (parsed.message_desc === 'Duplicate file upload') {
2026-02-21 22:11:43 +07:00
throw 'error-duplicate-file'
2026-02-04 16:10:16 +07:00
} else if (parsed.message_desc === 'Failed to upload chunk: Failed to upload chunk: User not have tokens for protect') {
throw 'user-not-have-tokens-for-protect'
2026-02-21 22:11:43 +07:00
} else if (parsed.message_desc === 'Failed to upload chunk: Failed to upload chunk: Failed to upload chunk: .wav file not have RIFF header') {
throw 'error-upload-chunk-wav-file-not-have-riff'
2025-12-24 15:41:06 +07:00
} else {
2026-02-21 22:11:43 +07:00
throw 'error-uploading-file'
2025-12-24 15:41:06 +07:00
}
} else {
2026-02-21 22:11:43 +07:00
throw 'error-uploading-file'
2026-02-04 16:10:16 +07:00
}
} catch (error: unknown) {
if (error) {
2026-02-21 22:11:43 +07:00
const typedError = error as string;
2026-02-04 16:10:16 +07:00
return {
errorMesage: typedError
};
} else {
return {
2026-02-21 22:11:43 +07:00
errorMesage: 'error-uploading-file'
2026-02-04 16:10:16 +07:00
};
2025-12-24 15:41:06 +07:00
}
}
}
export async function checkChunkStatus(upload_id: string) {
try {
const response = await fetch(`${API_BASE_URL}/api/v1/data`, {
method: 'POST',
body: JSON.stringify({
version: 1,
msg_id: 20004,
message_body: {
action: 'chunks',
upload_id
}
}),
headers: {
2026-01-28 18:53:08 +07:00
'Content-Type': 'application/json',
'Accept': 'application/json'
2025-12-24 15:41:06 +07:00
}
});
2025-12-23 18:56:48 +07:00
if (response.ok) {
let parsed = await response.json();
if (parsed.message_desc === 'Upload cancelled successfully') {
return parsed.message_body;
} else {
throw parsed;
}
} else {
throw (`${response.status}`);
}
2025-12-24 15:41:06 +07:00
} catch (error) {
return error
}
}
export async function getAllowedFilesExtensions(type: string) {
try {
const response = await fetch(`${API_BASE_URL}/api/v1/data`, {
method: 'POST',
body: JSON.stringify({
version: 1,
msg_id: 20004,
message_body: {
action: 'file_extension',
file_type: type
}
}),
headers: {
2026-01-28 18:53:08 +07:00
'Content-Type': 'application/json',
'Accept': 'application/json'
2025-12-24 15:41:06 +07:00
}
});
if (response.ok) {
let parsed = await response.json();
if (parsed.message_desc === 'Operation successful') {
2025-12-25 15:31:24 +07:00
return parsed.message_body;
2025-12-24 15:41:06 +07:00
} else {
throw parsed;
}
} else {
throw (`${response.status}`);
}
2025-12-23 18:56:48 +07:00
} catch (error) {
return error
}
2026-03-04 19:21:44 +07:00
}
export async function checkOperationPrice(action: string, filesCount: number, fileType: string) {
const token = await getSessionData('token');
try {
const response = await fetch(`${API_BASE_URL}/api/v1/data`, {
method: 'POST',
body: JSON.stringify({
version: 1,
msg_id: 30008,
message_body: {
auth_token: token,
action: action,
file_type: fileType,
count_files: filesCount
}
}),
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
});
if (response.ok) {
let parsed = await response.json();
if (parsed.message_code === 0) {
return parsed.message_body;
} else {
throw parsed;
}
} else {
throw (`${response.status}`);
}
} catch (error) {
return {
cost: 0,
success: false,
tokens_count: 0,
error: 'error'
}
}
2025-12-23 18:56:48 +07:00
}