experience.js 3.98 KB
"use strict";
const utils = require("@strapi/utils");
const { ApplicationError, ValidationError } = utils.errors;
/**
 * experience controller
 */

const { createCoreController } = require("@strapi/strapi").factories;

module.exports = createCoreController("api::experience.experience", () => ({
  async create(ctx) {
    // Validations
    if (!ctx.request.body.data.vendor) {
      throw new ValidationError("Vendor is a mandatory field.");
    }
    if (!ctx.request.body.data.pincode) {
      throw new ValidationError("Pincode is a mandatory field.");
    }
    if (!ctx.request.body.data.subCategory) {
      throw new ValidationError("Subcategory is a mandatory field");
    }
    const months = ctx.request.body.data.months;
    if (!months || !months.length > 0) {
      throw new ValidationError("Months is a required field.");
    }
    let monthsIds = [];
    for (let index = 0; index < months.length; index++) {
      const element = months[index];
      const singleMonth = await strapi
        .query("api::master-month.master-month")
        .findOne({
          where: {
            name: element.value,
          },
        });
      // console.log("singleMonth", singleMonth);
      monthsIds = [...monthsIds, singleMonth.id]
    }

    const subCategory = await strapi.query("api::sub-categorie.sub-categorie").findOne({
      where: {
        name: {
          $eq: ctx.request.body.data.subCategory
        }
      }
    })

    const repeatedActivities = await strapi
      .query("api::experience.experience")
      .findOne({
        where: {
          $and: [
            { name: ctx.request.body.data.name },
            { vendor: ctx.request.body.data.vendor.id },
          ],
        },
      });

    if (repeatedActivities) {
      throw new ValidationError(
        "Activity with the same name already exists, please rename the activity."
      );
    }
    // Create Activity
    const activity = await strapi.entityService.create(
      "api::experience.experience",
      {
        data: {
          name: ctx.request.body.data.name,
          description: ctx.request.body.data.description,
          pricePerPerson: ctx.request.body.data.pricePerPerson,
          address: ctx.request.body.data.address,
          masterPincode: ctx.request.body.data.pincode.id,
          minimumDuration: ctx.request.body.data.minimumDuration,
          maximumDuration: ctx.request.body.data.maximumDuration,
          ageLowerLimit: ctx.request.body.data.ageLowerLimit,
          ageNotes: ctx.request.body.data.ageNotes,
          phoneNumber: ctx.request.body.data.phoneNumber,
          minGroupSize: ctx.request.body.data.minGroupSize,
          maxGroupSize: ctx.request.body.data.maxGroupSize,
          activityType: ctx.request.body.data.activityType,
          link: ctx.request.body.data.link,
          cancellationPolicy: ctx.request.body.data.cancellationPolicy,
          vendor: ctx.request.body.data.vendor.id,
          subCategory: subCategory.id,
          masterMonths: monthsIds,
          giftSomeone: ctx.request.body.data.giftSomeone
        },
      }
    );

    // [{day: "monday", fromTime: "10:20:00", toTime: "18:30:00"}, {day: "tuesday", fromTime: "09:30:00", toTime: "20:00:00"}]

    const timeSlotsArray = ctx.request.body.data.timeSlots;
    if (!timeSlotsArray || !timeSlotsArray.length > 0) {
      throw new ValidationError("No time slots given.");
    }
    let timeSlotIds = [];
    for (let index = 0; index < timeSlotsArray.length; index++) {
      const element = timeSlotsArray[index];

      const timeSlotEntry = await strapi.entityService.create(
        "api::time-slot.time-slot",
        {
          data: {
            masterDay: element.day.id,
            start: element.fromTime,
            end: element.toTime,
            experience: activity.id,
          },
        }
      );
      timeSlotIds = [...timeSlotIds, timeSlotEntry];
    }

    ctx.send({
      success: true,
      message: "Activity Created",
      data: { ...activity, timeSlots: { ...timeSlotIds } },
    });
  },
}));