сервисы / репозитории и принципы SOLID - PullRequest
0 голосов
/ 06 августа 2020

Здравствуйте, у меня есть вопрос. У меня следующий вопрос:

отдел может быть создан с 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;
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...