403Webshell
Server IP : 80.87.202.40  /  Your IP : 216.73.216.169
Web Server : Apache
System : Linux rospirotorg.ru 5.14.0-539.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Dec 5 22:26:13 UTC 2024 x86_64
User : bitrix ( 600)
PHP Version : 8.2.27
Disable Function : NONE
MySQL : OFF |  cURL : ON |  WGET : ON |  Perl : ON |  Python : OFF |  Sudo : ON |  Pkexec : ON
Directory :  /home/bitrix/ext_www/cvetdv.ru/bitrix/js/im/v2/model/src/files/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/cvetdv.ru/bitrix/js/im/v2/model/src/files/files.js
import { Type, type JsonObject } from 'main.core';
import { BuilderModel } from 'ui.vue3.vuex';
import { Logger } from 'im.v2.lib.logger';
import { Core } from 'im.v2.application.core';
import { FileStatus } from 'im.v2.const';
import { Utils } from 'im.v2.lib.utils';

import type { ImModelFile } from 'im.v2.model';

type FilesState = {
	collection: {
		[fileId: string]: ImModelFile
	},
	temporaryFilesMap: Map<number, string>,
};

export class FilesModel extends BuilderModel
{
	getName(): string
	{
		return 'files';
	}

	getState(): FilesState
	{
		return {
			collection: {},
			temporaryFilesMap: new Map(),
		};
	}

	getElementState(): ImModelFile
	{
		return {
			id: 0,
			chatId: 0,
			name: 'File is deleted',
			date: new Date(),
			type: 'file',
			extension: '',
			icon: 'empty',
			size: 0,
			image: false,
			status: FileStatus.done,
			progress: 100,
			authorId: 0,
			authorName: '',
			urlPreview: '',
			urlShow: '',
			urlDownload: '',
			viewerAttrs: null,
		};
	}

	getGetters(): JsonObject
	{
		return {
			/** @function files/get */
			get: (state: FilesState, getters) => (fileId: number, getTemporary = false): ?ImModelFile => {
				if (!fileId)
				{
					return null;
				}

				if (!getTemporary && !state.collection[fileId])
				{
					return null;
				}

				const file: ?ImModelFile = state.collection[fileId];
				const hasMappedTemporaryFile: boolean = getters.hasMappedTemporaryFile({ serverFileId: fileId });
				if (file && hasMappedTemporaryFile)
				{
					const temporaryFile: ImModelFile = getters.getMappedTemporaryFile({ serverFileId: fileId });

					return {
						...file,
						urlPreview: temporaryFile.urlPreview,
						urlShow: temporaryFile.urlShow,
					};
				}

				return file;
			},
			/** @function files/isInCollection */
			isInCollection: (state: FilesState) => (payload: {fileId: number | string}): boolean => {
				const { fileId } = payload;

				return Boolean(state.collection[fileId]);
			},
			/** @function files/hasMappedTemporaryFile */
			hasMappedTemporaryFile: (state: FilesState) => (payload: {serverFileId: number | string}): boolean => {
				if (state.temporaryFilesMap.has(payload.serverFileId))
				{
					const temporaryFileId: string = state.temporaryFilesMap.get(payload.serverFileId);

					return Object.hasOwn(state.collection, temporaryFileId);
				}

				return false;
			},
			/** @function files/getMappedTemporaryFile */
			getMappedTemporaryFile: (state: FilesState) => (payload: {serverFileId: number}): ?ImModelFile => {
				const { serverFileId } = payload;

				if (state.temporaryFilesMap.has(serverFileId))
				{
					const temporaryFileId: string = state.temporaryFilesMap.get(serverFileId);

					return state.collection[temporaryFileId];
				}

				return null;
			},
		};
	}

	getActions(): JsonObject
	{
		return {
			/** @function files/add */
			add: (store, payload: Object) => {
				const preparedFile = { ...this.getElementState(), ...this.validate(payload) };

				store.commit('add', { files: [preparedFile] });
			},
			/** @function files/set */
			set: (store, ...payload: Array<JsonObject>) => {
				const files: Array<ImModelFile> = payload.flat().map((file) => {
					return { ...this.getElementState(), ...this.validate(file) };
				});

				store.commit('add', { files });
			},
			/** @function files/update */
			update: (store, payload) => {
				const { id, fields } = payload;
				const existingItem = store.state.collection[id];
				if (!existingItem)
				{
					return false;
				}

				store.commit('update', {
					id,
					fields: this.validate(fields),
				});

				return true;
			},
			/** @function files/updateWithId */
			updateWithId: (store, payload: {id: string | number, fields: Object}) => {
				const { id, fields } = payload;
				if (!store.state.collection[id])
				{
					return;
				}

				store.commit('updateWithId', {
					id,
					fields: this.validate(fields),
				});
			},
			/** @function files/delete */
			delete: (store, payload: {id: string | number}) => {
				const { id } = payload;
				if (!store.state.collection[id])
				{
					return;
				}

				store.commit('delete', { id });
			},
			/** @function files/setTemporaryFileMapping */
			setTemporaryFileMapping: (store, payload: {serverFileId: number, temporaryFileId: string}) => {
				store.commit('setTemporaryFileMapping', payload);
			},
		};
	}

	/* eslint-disable no-param-reassign */
	getMutations(): JsonObject
	{
		return {
			add: (state: FilesState, payload: {files: ImModelFile[]}) => {
				payload.files.forEach((file) => {
					state.collection[file.id] = file;
				});
			},
			update: (state: FilesState, payload) => {
				Object.entries(payload.fields).forEach(([key, value]) => {
					state.collection[payload.id][key] = value;
				});
			},
			updateWithId: (state: FilesState, payload: {id: number | string, fields: Object}) => {
				const { id, fields } = payload;
				const currentFile = { ...state.collection[id] };

				delete state.collection[id];
				state.collection[fields.id] = { ...currentFile, ...fields };
			},
			delete: (state: FilesState, payload: {id: number | string}) => {
				Logger.warn('Files model: delete mutation', payload);
				const { id } = payload;
				delete state.collection[id];
			},
			setTemporaryFileMapping: (state: FilesState, payload: {serverFileId: number, temporaryFileId: string}) => {
				state.temporaryFilesMap.set(payload.serverFileId, payload.temporaryFileId);
			},
		};
	}

	// eslint-disable-next-line max-lines-per-function,sonarjs/cognitive-complexity
	validate(file: Object, options = {}): ImModelFile
	{
		const result = {};

		if (Type.isNumber(file.id) || Type.isStringFilled(file.id))
		{
			result.id = file.id;
		}

		if (Type.isNumber(file.chatId) || Type.isString(file.chatId))
		{
			result.chatId = Number.parseInt(file.chatId, 10);
		}

		if (!Type.isUndefined(file.date))
		{
			result.date = Utils.date.cast(file.date);
		}

		if (Type.isString(file.type))
		{
			result.type = file.type;
		}

		if (Type.isString(file.extension))
		{
			result.extension = file.extension.toString();

			if (result.type === 'image')
			{
				result.icon = 'img';
			}
			else if (result.type === 'video')
			{
				result.icon = 'mov';
			}
			else
			{
				result.icon = Utils.file.getIconTypeByExtension(result.extension);
			}
		}

		if (Type.isString(file.name) || Type.isNumber(file.name))
		{
			result.name = file.name.toString();
		}

		if (Type.isNumber(file.size) || Type.isString(file.size))
		{
			result.size = Number.parseInt(file.size, 10);
		}

		if (Type.isBoolean(file.image))
		{
			result.image = false;
		}
		else if (Type.isPlainObject(file.image))
		{
			result.image = {
				width: 0,
				height: 0,
			};

			if (Type.isString(file.image.width) || Type.isNumber(file.image.width))
			{
				result.image.width = Number.parseInt(file.image.width, 10);
			}

			if (Type.isString(file.image.height) || Type.isNumber(file.image.height))
			{
				result.image.height = Number.parseInt(file.image.height, 10);
			}

			if (result.image.width <= 0 || result.image.height <= 0)
			{
				result.image = false;
			}
		}

		if (Type.isString(file.status) && !Type.isUndefined(FileStatus[file.status]))
		{
			result.status = file.status;
		}

		if (Type.isNumber(file.progress) || Type.isString(file.progress))
		{
			result.progress = Number.parseInt(file.progress, 10);
		}

		if (Type.isNumber(file.authorId) || Type.isString(file.authorId))
		{
			result.authorId = Number.parseInt(file.authorId, 10);
		}

		if (Type.isString(file.authorName) || Type.isNumber(file.authorName))
		{
			result.authorName = file.authorName.toString();
		}

		if (Type.isString(file.urlPreview))
		{
			if (
				!file.urlPreview
				|| file.urlPreview.startsWith('http')
				|| file.urlPreview.startsWith('bx')
				|| file.urlPreview.startsWith('file')
				|| file.urlPreview.startsWith('blob')
			)
			{
				result.urlPreview = file.urlPreview;
			}
			else
			{
				result.urlPreview = Core.getHost() + file.urlPreview;
			}
		}

		if (Type.isString(file.urlDownload))
		{
			if (
				!file.urlDownload
				|| file.urlDownload.startsWith('http')
				|| file.urlDownload.startsWith('bx')
				|| file.urlDownload.startsWith('file')
				|| file.urlDownload.startsWith('blob')
			)
			{
				result.urlDownload = file.urlDownload;
			}
			else
			{
				result.urlDownload = Core.getHost() + file.urlDownload;
			}
		}

		if (Type.isString(file.urlShow))
		{
			if (
				!file.urlShow
				|| file.urlShow.startsWith('http')
				|| file.urlShow.startsWith('bx')
				|| file.urlShow.startsWith('file')
				|| file.urlShow.startsWith('blob')
			)
			{
				result.urlShow = file.urlShow;
			}
			else
			{
				result.urlShow = Core.getHost() + file.urlShow;
			}
		}

		if (Type.isPlainObject(file.viewerAttrs))
		{
			result.viewerAttrs = file.viewerAttrs;
		}

		return result;
	}
}

Youez - 2016 - github.com/yon3zu
LinuXploit