-1
const generatePropertyAmenities = async (property) => {
  let result = [];
  property.amenities.map(async (res, key) => {
    /**
     * Get the amenities type id, creates it if it doesn't exist
     * const type_existed_before: defines if the type already existed
     */
    let type_id = null;
    const type_existed_before = await strapi
      .query("amenities-categories")
      .findOne({ name: res.type.trim() });
    if (type_existed_before) type_id = type_existed_before.id;
    else
      type_id = await strapi
        .query("amenities-categories")
        .create({ name: res.type }).id;

    res.items.map(async (amenity) => {
      const amenity_exists = await strapi
        .query("amenities")
        .findOne({ name: amenity.name.trim() });
      if (amenity_exists) {
        // console.log(amenity_exists)
        if (
          !type_existed_before ||
          (type_existed_before &&
            !amenity_exists.amenities_categories.find((x) => x === type_id))
        ) {
          await strapi.query("amenities").update(
            { id: amenity_exists.id },
            {
              amenities_categories: [
                ...amenity_exists.amenities_categories,
                type_id,
              ],
            }
          );
        }
        result = [...result, amenity_exists.id];
      } else {
        result = [
          ...result,
          await strapi
            .query("amenities")
            .create({
              name: amenity.name.trim(),
              amenities_categories: [type_id],
            }).id,
        ];
      }
    });
  });
  console.log(result);
  return result;
};

result is always empty, am I missing something here ? I really don't see what I'm doing wrong. I checked everything, amenity_exists.id is correct, everything seems correct but something is not I really need some help here guys

Ishloum
  • 1
  • 2
  • probably because of the async, see e.g. https://eloquentjavascript.net/11_async.html – mb21 Aug 02 '21 at 16:19
  • If you're not going to use the return value of `.map()` then you shouldn't be using `.map()` in the first place. `.map()` doesn't care about callbacks with asynchronous actions (or `async`/`await`). [How to return the response from an asynchronous call](https://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-asynchronous-call) – Andreas Aug 02 '21 at 16:23
  • You're both right it's exactly the problem – Ishloum Aug 02 '21 at 16:33

2 Answers2

0

Ok so I managed to make it work, I don't think I can explain why and how exactly it works I may need some explanations from you guys, but here's my fix:

const generatePropertyAmenities = async (property) => {

  const getAmenityCategoryId = (item) =>
    new Promise(async (resolve, reject) => {
      const type_existed_before = await strapi
        .query("amenities-categories")
        .findOne({ name: item.type.trim() });
      if (type_existed_before)
        resolve({
          type_id: type_existed_before.id,
          type_existed_before: false,
        });
      else
        resolve({
          type_id: await strapi
            .query("amenities-categories")
            .create({ name: item.type }).id,
          type_existed_before: false,
        });
    });

  const getAmenity = (amenity, type_id, type_existed_before) =>
    new Promise(async (resolve, reject) => {
      const amenity_exists = await strapi
        .query("amenities")
        .findOne({ name: amenity.name.trim() });
      if (amenity_exists) {
        // console.log(amenity_exists)
        if (
          !type_existed_before ||
          (type_existed_before &&
            !amenity_exists.amenities_categories.find((x) => x === type_id))
        ) {
          await strapi.query("amenities").update(
            { id: amenity_exists.id },
            {
              amenities_categories: [
                ...amenity_exists.amenities_categories,
                type_id,
              ],
            }
          );
        }
        resolve(amenity_exists.id);
      } else {
        resolve(
          await strapi.query("amenities").create({
            name: amenity.name.trim(),
            amenities_categories: [type_id],
          }).id
        );
      }
    });

  const createArrayOfAmenities = () =>
    new Promise(async (resolve, reject) => {
      let ret = [];
      for (let index = 0; index < property.amenities.length; index++) {
        const element = property.amenities[index];
        let { type_id, type_existed_before } = await getAmenityCategoryId(
          element
        );
        for (let k = 0; k < element.items.length; k++) {
          const amenity = element.items[k];
          ret = [
            ...ret,
            await getAmenity(amenity, type_id, type_existed_before),
          ];
        }
      }
      resolve(ret)
    });

  return await createArrayOfAmenities();
};
Ishloum
  • 1
  • 2
-1

Try

await res.items.map(async ...
Wakeel
  • 4,272
  • 2
  • 13
  • 14