Как «коротко» организовать генерацию slug если этот slug уже занят?

При обновлении Категории на сайте, метод Update
Я хочу генерировать slug (url), но если такой slug уже занят, то добавлять к названию цифру 1, если занят, то цифру 2 и так далее...

Мой код работает не корректно при повторном update да и длинный очень, кажется усложнил я.
Если дадите пример как организовать генерацию слага если он уже занят буду благодарен.

async update(id: string, dto: UpdateCategoriesPostDto) {
    const existsPostCat = await this.CategoriesPostModel.findById(id).exec();

    if (existsPostCat) {
      //сгенерировать слаг
      let generateSlug = cyrillicToTranslit({ preset: 'ru' })
        .transform(`${dto.name}`, '_')
        .toLowerCase();

      //если слаг менялся, то ищем есть ли уже такой
      if (existsPostCat.slug !== dto.slug) {
        //проверить слаг на уникальность
        let oldSlug = await this.CategoriesPostModel.findOne({
          slug: generateSlug,
        }).exec();
        if (oldSlug) {
          let counter = 1;
          while (oldSlug) {
            counter++;

            generateSlug = `${generateSlug}${counter}`;

            oldSlug = await this.CategoriesPostModel.findOne({
              slug: generateSlug,
            }).exec();
          }
        }
      }

      const currentCat = await this.CategoriesPostModel.findByIdAndUpdate(
        id,
        {
          name: dto.name,
          slug: generateSlug,
          description: dto.description,
        },
        {
          new: true,
        },
      );
      return currentCat;
    } else {
      throw new NotFoundException(CATEGORY_NOT_FOUNd_ERROR);
    }
  }
  • Вопрос задан
  • 88 просмотров
Решения вопроса 1
kellas
@kellas
веб-разработчик
Генерируй сразу 100 шт slug + ещё один, в котором в конце timestamp вместо цифры.
Далее вытаскивай из базы документы с этими сгенерированными slug.
Считай разницу массивов, сгенерированных слагов и тех что есть в базе, потом бери первый не занятый slug
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы