webstudio/server/src/features/datasets/domain/create_dataset_scenario.ts
2024-05-03 21:30:18 +03:00

68 lines
2.7 KiB
TypeScript

import { ObjectId } from "mongoose";
import { CallbackStrategyWithValidationModel, ResponseBase } from "../../../core/controllers/http_controller";
import { Result } from "../../../core/helpers/result";
import { TypedEvent } from "../../../core/helpers/typed_event";
import { EXEC_EVENT, ExecError, SpawnError } from "../../../core/models/exec_error_model";
import { ExecutorResult } from "../../../core/models/executor_result";
import { SearchOneDataBaseModelUseCase } from "../../../core/usecases/search_database_model_usecase";
import { IProjectModel, ProjectDBModel } from "../../_projects/models/project_database_model";
import { DatasetDBModel } from "../models/dataset_database_model";
import { DatasetValidationModel, ProcessStatus } from "../models/dataset_validation_model";
export class ProcessWatcherAndDatabaseUpdateService<A> extends TypedEvent<
Result<ExecError | SpawnError, ExecutorResult>
> {
databaseId: ObjectId;
model: A;
constructor(databaseId: ObjectId, model: A) {
super();
this.databaseId = databaseId;
this.model = model;
this.on((event) => this.lister(event));
}
lister(event: Result<ExecError | SpawnError, ExecutorResult>) {
event.fold(
async (success) => {
if (success.event == EXEC_EVENT.END) {
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-expect-error
const dbModel = await this.model.findById(this.databaseId);
if (dbModel !== null) {
dbModel.local_path;
dbModel.processStatus = ProcessStatus.END;
dbModel.processLogs = success.data;
await dbModel.save();
}
}
},
async (error) => {
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-expect-error
const dbModel = await this.model.findById(this.databaseId);
if (dbModel !== null) {
dbModel.processStatus = ProcessStatus.ERROR;
dbModel.processLogs = error.message;
await dbModel.save();
}
}
);
}
}
export class CreateDataSetScenario extends CallbackStrategyWithValidationModel<DatasetValidationModel> {
validationModel: DatasetValidationModel;
call = async (model: DatasetValidationModel): ResponseBase => {
return (
await new SearchOneDataBaseModelUseCase<IProjectModel>(ProjectDBModel).call({ isActive: true }, "no active projects")
).map(async (project) => {
model.processStatus = ProcessStatus.NEW;
model.local_path = project.rootDir;
model.projectId = project._id;
const d = new DatasetDBModel();
Object.assign(d, model);
await d.save();
return Result.ok("create dataset ok");
});
};
}