import makeAutoObservable from "mobx-store-inheritance"; import { DataSetRepository } from "./dataset_repository"; import { UiErrorState } from "../../core/store/base_store"; import { HttpError } from "../../core/repository/http_repository"; import { Asset, Assets, DataSetModel, IDatasetModel, ProcessStatus } from "./dataset_model"; import { message } from "antd"; import { UUID } from "../all_projects/data/project_repository"; import { SocketRepository, socketRepository } from "../../core/repository/socket_repository"; export enum DrawersDataset { NewDataset = "Новый датасет", FormBuilderDrawer = "Редактировать датасет", } export interface Drawer { name: string; status: boolean; } export class DataSetStore extends UiErrorState { dataSetRepository: DataSetRepository; assets?: Assets; datasets?: IDatasetModel[]; activeProject: UUID; dataSetModel = DataSetModel.empty(); drawers: Drawer[]; socketRepository: SocketRepository; constructor() { super(); this.socketRepository = socketRepository; this.dataSetRepository = new DataSetRepository(); this.drawers = Object.entries(DrawersDataset).map((k, v) => { return { name: k.at(1) ?? "", status: false, }; }); makeAutoObservable(this); socketRepository.on((e) => { if (e.event === "realtime") { if (e.payload !== undefined && e.payload.value !== undefined && e.payload.value.id !== undefined) { this.updateDatasetStatus(String(e.payload.value.id), ProcessStatus.END); } if (e.payload !== undefined && e.payload.error !== undefined && e.payload.error.id !== undefined) { this.updateDatasetStatus(String(e.payload.error.id), ProcessStatus.ERROR); } } }); } updateDatasetStatus(id: string, status: ProcessStatus) { this.datasets = this.datasets?.map((el) => { if (el._id.isEqual(id)) { el.processStatus = status; } return el; }); } openEmptyCard() { this.dataSetModel = DataSetModel.empty(); this.editDrawer(DrawersDataset.NewDataset, true); } setNewDatasetName(e: string): void { this.dataSetModel.name = e; } setSkillSelected(el: string): void { this.dataSetModel.datasetType = el; } skillIsSelected(el: string): boolean { return el === this.dataSetModel.datasetType; } assetStatus(name: string): boolean { return this.dataSetModel.dataSetObjects.includes(name); } datasetCheckBox(asset: Asset): void { if (this.assetStatus(asset.name)) { this.dataSetModel.dataSetObjects = this.dataSetModel.dataSetObjects.filter((el) => !el.isEqual(asset.name)); } else { this.dataSetModel.dataSetObjects.push(asset.name); } } editDrawer(drawerName: DrawersDataset, status: boolean): void { this.drawers = this.drawers.map((el) => { if (el.name === drawerName) { el.status = status; } return el; }); } editDataset(id: string) { this.dataSetModel = DataSetModel.fromIDatasetModel(this.datasets?.find((el) => el._id === id) as IDatasetModel); this.editDrawer(DrawersDataset.NewDataset, true); } deleteDataset = async (id: string) => { (await this.dataSetRepository.deleteDataset(id)).fold( async () => { message.success("датасет удален"); await this.getDatasets(); }, async (e) => message.error(e.message) ); }; runProcess = async (id: string): Promise => { (await this.dataSetRepository.isRunningProcess()).fold( async (s) => { (await this.dataSetRepository.execDatasetProcess(id)).fold( () => { this.updateDatasetStatus(id,ProcessStatus.RUN) message.success("Процесс запущен"); }, (e) => message.error(e.message) ); }, async (e) => message.error(e.message) ); }; errorHandingStrategy = (error: HttpError) => { message.error(error.message); }; saveDataset(): void { this.dataSetModel.project = this.activeProject.id; this.dataSetModel.isValid().fold( async () => { if (this.dataSetModel.isNew) { (await this.dataSetRepository.saveDataSet(this.dataSetModel)).fold( async () => { message.success("Датасет сохранен"); await this.getDatasets(); }, async (error) => message.error(error.message) ); } else { (await this.dataSetRepository.editDataset(this.dataSetModel)).fold( async () => { message.success("Настройки датасета измнены"); await this.getDatasets(); }, async (error) => message.error(error.message) ); } }, async (error) => message.error(error) ); } init = async () => { await this.mapOk("assets", this.dataSetRepository.getAssetsActiveProject()); await this.getDatasets(); await this.mapOk("activeProject", this.dataSetRepository.getActiveProjectId()); }; getDatasets = async () => { await this.mapOk("datasets", this.dataSetRepository.getDatasetsActiveProject()); }; }