Здравствуйте, у меня есть вопрос. У меня следующий вопрос:
отдел может быть создан с NULL значением сотрудника (manager_id), но отдел не может быть создан, если отдел с таким именем уже существует
это моя служба:
public async createDepartamentService(
data: createDepartament,
): Promise<Departament | undefined> {
//joi Schema
const schema = createDepartamentSchema;
//validateSchema
const checkFields = validateAndFormat(data, schema, 'Departament');
//if found errors on schema throw new unprocessable_entity error
if (checkFields) {
throw new errors.UNPROCESSABLE_ENTITY({ errors: checkFields });
}
//verify if manager exists
//verify if departament_name already exists
const validate = async () => {
let Errors: IError[] = []
const departament = await this.departamentRepository.findByName(data.departament_name)
const Manager = data.manager_id ? await this.employeeRepository
.findById(data.manager_id) : null;
if (departament) {
Errors.push({ code: 'already_exists', resource: 'Departament', field: `departament_name` })
}
if (!Manager && Manager !== null) {
Errors.push({ code: 'unprocessable', resource: 'Departament', field: `manager_id` })
}
if (Errors.length > 0) {
throw new errors.UNPROCESSABLE_ENTITY({ errors: Errors });
}
};
await validate();
//create Departament;
const Departament = this.departamentRepository.create(data);
return Departament;
}
в этой функции у меня есть другая функция, которая проверяет, есть ли сотрудник и отдел, а затем возвращает ошибки или продолжит, если я добавлю эти ошибки, возвращается в моя функция репозитория была бы неправильной или она не соответствовала бы принципам SOLID?
сейчас мой репозиторий:
сотрудник репозитория, найденный по идентификатору
public async findById(id: string): Promise<Employee | undefined> {
const employee = await this.ormRepository.findOne({ where: { id } });
return employee;
}
поиск отдела репозитория по имени
public async findByName(name: string): Promise<Departament | undefined> {
const departament = this.ormRepository.findOne({ where: { departament_name: name } })
return departament;
}
У меня есть сомнения, следует ли мой код принципам solid, могу ли я улучшить его по отношению к if, или я должен перенести эту обработку ошибок из моей службы в свой контроллер или в свой репозиторий
, как это в моем отделе репозитория
findOrCreate на моем Departa Репозиторий
public async findOrCreate(data: createDepartament) {
let Errors: IError[] = []
const hasDepartament = await this.ormRepository.findOne({ where: { departament_name: data.departament_name } })
const hasEmployee = data.manager_id ? await this.employeeRepository.findById(data.manager_id) : null;
const validate = () => {
if (hasDepartament) {
Errors.push({ code: 'already_exists', resource: 'Departament', field: `departament_name` })
}
if (!hasEmployee && hasEmployee !== null) {
Errors.push({ code: 'unprocessable', resource: 'Departament', field: `manager_id` })
}
if (Errors.length > 0) {
throw new errors.UNPROCESSABLE_ENTITY({ errors: Errors });
}
};
validate();
const Departament = this.ormRepository.create({ departament_name: data.departament_name, manager_id: data.manager_id ? data.departament_name : null })
await this.ormRepository.save(Departament);
return Departament
}
и поэтому я мог абстрагироваться от своей службы: Служба:
public async createDepartamentService(
data: createDepartament,
): Promise<Departament | undefined> {
//joi Schema
const schema = createDepartamentSchema;
//validateSchema
const checkFields = validateAndFormat(data, schema, 'Departament');
//if found errors on schema throw new unprocessable_entity error
if (checkFields) {
throw new errors.UNPROCESSABLE_ENTITY({ errors: checkFields });
}
const Departament = await this.departamentRepository.findOrCreate(data);
return Departament;
}