Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Слить две кроны в одну новую (https://javascript.ru/forum/misc/82324-slit-dve-krony-v-odnu-novuyu.html)

typicsort 20.04.2021 02:43

Слить две кроны в одну новую
 
Всем привет ,как правильно сделать небольшой рефакторинг этих двух триггеров в один новый?

Напрмер,есть два триггера :
1.checkUnsentOrders :
module.exports = functions.pubsub
  .schedule("0 0 12 * *")
  .timeZone("")
  .onRun(async () => {
    const startDate = startOfDate();
    const endDate = endOfDate();
    const dateBefore = dateBeforeGameDay();
    const finishedGameStatusDayBefore = [
      ...finishedGameOrdersStatusIds
    ];
    let listGameOrders = await getGameOrdersForEmailing(startDate, endDate);
    let finishGameOrdersStatus = listGameOrders.filter((order) => {
      const gameDate = DateTime.fromJSDate(order.pickupDate)
        .toJSDate();
      if (dateBefore.getDay() === gameDate.getDay()) {
        return !finishedGameStatusDayBefore.includes(order.GameStatus);
      }
      return !finishedGameOrdersStatusIds.includes(order.GameStatus);
    });
    let rows = finishGameOrdersStatus
      .map(
        (id) =>
          `</td><td>${game.id}</td></tr>`
      )
    let view = ``;
    let statusGameOrdersView = `
<style></style>
  `;
    await sentGameHtmlEmail(statusGameOrdersView);
  });

и второй gameMailUnsentOrders:

const processGamerReminderEmail = async (gamerOrders: OrderData[]) => {
  const firstOrder = _.head(gamerOrders);
  const gamerName = firstOrder
    ? firstOrder.gamerName
      ? firstOrder.gamerName
      : ""
    : "";
  const gamerId = firstOrder
    ? firstGameOrder.gamerId
      ? firstGameOrder.gamerId
      : ""
    : "";
  const gamerData = await (await gamer.doc(gamerId).get()).data();
  const gamerReminderEmail = gamerData.reminderEmail;
  if (gamerReminderEmail === "" || !gamerReminderEmail) {
    console.log(
      ` ${gamerName} reminder email is not detected`
    );
    return;
  }
  let rows = gamerOrders
    .map(
      (doc: OrderData) =>
        `...`
    )
  let view = `<table></table>
                `;
  return await sentGameHtmlEmail(
    gamerReminderEmail
  );
};
module.exports = functions.pubsub
  .schedule("0 0 12 * *")
  .timeZone("")
  .onRun(async () => {
    const startDate = startOfDate();
    const endDate = endOfDate();
    const dateBefore = dateBeforeGameDay();
    const finalizedStatusDayBefore = [
      ...finalisedOrdersStatusIds
    ];
    let listGameOrders = await getGameOrdersMailing(startDate, endDate);
    let ordersStatus = listGameOrders.filter((gameOrder) => {
      const gameDate = DateTime.fromJSDate(gameOrder.gamePDate)
      .toJSDate();
      if (dateBefore.getDay() === gameDate.getDay()) {
        return !finalizedStatusDayBefore.includes(gameOrder.gameStatus.id);
      }
      return !finalisedOrdersStatusIds.includes(gameOrder.gameStatus.id);
    });
    let orderedByGamerId = _.orderBy(
      ordersStatus.map((order) => order),
      "gamerId"
    );
    return await Promise.all(
      _.map(orderedByGamerId, (gameOrders: OrderData[]) => {
        return processGamerReminderEmail(gameOrders);
      })
    );
  });


Тоесть, обьеденить существующие кроны в этих триггерах(checkUnsentOrders и gameMailUnsentOrders) в один новый(new) .Хотел бы объединить, потому что эти два триггера вызываются в одно и тоже время. Как это правильно сделать? Может есть идеи как написать красивый метод?

typicsort 20.04.2021 11:11

:help:

typicsort 20.04.2021 22:53

Немного разобрался, кто подскажет, правильный ли ход мыслей? :

Меняем checkUnsentOrders.js :

module.exports =async () => { 
    const startDate = startOfDate();
    const endDate = endOfDate();
    const dateBefore = dateBeforeGameDay();
    const finishedGameStatusDayBefore = [
      ...finishedGameOrdersStatusIds
    ];
    let listGameOrders = await getGameOrdersForEmailing(startDate, endDate);
    let finishGameOrdersStatus = listGameOrders.filter((order) => {
      const gameDate = DateTime.fromJSDate(order.pickupDate)
        .toJSDate();
      if (dateBefore.getDay() === gameDate.getDay()) {
        return !finishedGameStatusDayBefore.includes(order.GameStatus);
      }
      return !finishedGameOrdersStatusIds.includes(order.GameStatus);
    });
    let rows = finishGameOrdersStatus
      .map(
        (id) =>
          `</td><td>${game.id}</td></tr>`
      )
    let view = ``;
    let statusGameOrdersView = `
<style></style>
  `;
    await sentGameHtmlEmail(statusGameOrdersView);
  };


и gameMailUnsentOrders.js
const processGamerReminderEmail = async (gamerOrders: OrderData[]) => {
  const firstOrder = _.head(gamerOrders);
  const gamerName = firstOrder
    ? firstOrder.gamerName
      ? firstOrder.gamerName
      : ""
    : "";
  const gamerId = firstOrder
    ? firstGameOrder.gamerId
      ? firstGameOrder.gamerId
      : ""
    : "";
  const gamerData = await (await gamer.doc(gamerId).get()).data();
  const gamerReminderEmail = gamerData.reminderEmail;
  if (gamerReminderEmail === "" || !gamerReminderEmail) {
    console.log(
      ` ${gamerName} reminder email is not detected`
    );
    return;
  }
  let rows = gamerOrders
    .map(
      (doc: OrderData) =>
        `...`
    )
  let view = `<table></table>
                `;
  return await sentGameHtmlEmail(
    gamerReminderEmail
  );
};
module.exports = async () => {
    const startDate = startOfDate();
    const endDate = endOfDate();
    const dateBefore = dateBeforeGameDay();
    const finalizedStatusDayBefore = [
      ...finalisedOrdersStatusIds
    ];
    let listGameOrders = await getGameOrdersMailing(startDate, endDate);
    let ordersStatus = listGameOrders.filter((gameOrder) => {
      const gameDate = DateTime.fromJSDate(gameOrder.gamePDate)
      .toJSDate();
      if (dateBefore.getDay() === gameDate.getDay()) {
        return !finalizedStatusDayBefore.includes(gameOrder.gameStatus.id);
      }
      return !finalisedOrdersStatusIds.includes(gameOrder.gameStatus.id);
    });
    let orderedByGamerId = _.orderBy(
      ordersStatus.map((order) => order),
      "gamerId"
    );
    return await Promise.all(
      _.map(orderedByGamerId, (gameOrders: OrderData[]) => {
        return processGamerReminderEmail(gameOrders);
      })
    );
  };


и потом в новосозданой кроне , например dailyEmails.js:
module.exports = functions.pubsub
  .schedule("0 0 12 * *")
  .timeZone("")
  .onRun(async () => {
    await checkUnsentOrders();
    await gameMailUnsentOrders();
 
 
    ]);
  });


Часовой пояс GMT +3, время: 15:04.