HEX
Server: Apache/2.4.52 (Ubuntu)
System: Linux spn-python 5.15.0-89-generic #99-Ubuntu SMP Mon Oct 30 20:42:41 UTC 2023 x86_64
User: arjun (1000)
PHP: 8.1.2-1ubuntu2.20
Disabled: NONE
Upload Files
File: //home/arjun/projects/good-life-be/api/Questions/service.js
import axios from 'axios';
import SubCategory from '../../models/SubCategory.js';
import BadRequest from '../../helper/exception/badRequest.js';
import EventCount from '../../models/eventsCount.js';
import FormData from '../../models/formDataModel.js';
import NewQuestion from '../../models/newQuestions.js';
import NewSubQuestion from '../../models/newSubQuestions.js';
import TempFormData from '../../models/TempFormData.js';
import User from '../../models/User.js';
import Event from '../../models/Event.js';

export const getFormDataApi = async (queryData) => {
  const { subcategoryId, categoryId } = queryData;
  const whereClause = {};

  if (subcategoryId) whereClause.sub_category_id = subcategoryId;
  if (categoryId) whereClause.category_id = categoryId;

  // Fetch the main questions
  const questions = await NewQuestion.findAll({
    where: whereClause,
    include: [
      {
        model: SubCategory,
        as: 'subCategory',
        attributes: ['id', 'name'],
      },
      {
        model: NewSubQuestion,
        as: 'subQuestions', // This will fetch sub-questions for each main question
        separate: true,
        include: [
          {
            model: NewSubQuestion,
            as: 'parentQuestion', // Parent-child relationship
            attributes: ['id', 'question'],
          },
        ],
        order: [['order', 'ASC']],
      },
    ],
    order: [['createdAt', 'ASC']],
  });

  return questions;
};

export const postQuestions = async (data, user) => {
  let jsonData = { json_data: [] };

  const tempFormData = await TempFormData.findAll({
    where: { user_id: user },
    raw: true,
  });

  tempFormData.map((item) => {
    jsonData.json_data = [...jsonData.json_data, ...item.user_data.json_data];
    return null;
  });

  const uniqueResponsesMap = new Map(
    jsonData.json_data.map((response) => [response.questionId, response])
  );

  // Convert Map values back to array and filter the required fields
  const filteredResponses = Array.from(uniqueResponsesMap.values()).map(
    (value) => value
  );

  jsonData.json_data = filteredResponses;

  if (typeof jsonData === 'string') {
    jsonData = JSON.parse(jsonData);
    data = jsonData;
  } else {
    data = jsonData;
  }

  try {
    await Event.destroy({
      where: { user_id: user },
    });

    const EventCountData = await EventCount.findOne({
      where: { user_id: user },
      attributes: ['count', 'eventStatus'],
    });
    if (!EventCountData) {
      await EventCount.create({
        user_id: user,
        count: 0,
        eventStatus: 'pending',
      });
    } else {
      await EventCount.update(
        { count: 0, eventStatus: 'pending' },
        { where: { user_id: user } }
      );
    }

    await User.update(
      {
        eventStatus: 'pending',
      },
      { where: { id: user } }
    );

    const existingFormData = await FormData.findOne({
      where: { user_id: user },
      raw: true,
    });

    if (!existingFormData) {
      await FormData.create({
        user_id: user,
        userData: data,
      });
    }

    const response = await axios.post(
      'https://calendar-devapi.spericorn.com/api/json-response/',
      (data)
    );

    if (!response.data) {
      throw new Error('Empty response received');
    }

    const formDataPayload = {
      user_id: user,
      Data: response.data,
      userData: data,
    };

    const existingFormDataAgain = await FormData.findOne({
      where: { user_id: user },
      raw: true,
    });

    if (existingFormDataAgain) {
      await FormData.update(
        { Data: response.data },
        { where: { user_id: user } }
      );
    } else {
      await FormData.create(formDataPayload);
    }
    return JSON.stringify(data);
  } catch (err) {
    // await FormData.create({
    //   user_id: user,
    //   userData: data,
    // });
    await EventCount.update(
      { count: 0, eventStatus: 'active' },
      { where: { user_id: user } }
    );
    throw new BadRequest(err.response?.data?.Message || 'An error occurred');
  }
};

export const getDaysCountService = async (userId) => {
  const daysData = await EventCount.findOne({
    where: { user_id: userId },
    attributes: ['count', 'eventStatus'],
  });
  return daysData;
};

export const getUserFormDataService = async (
  userId,
  { categoryId, subcategoryId }
) => {
  if (!userId) {
    throw new BadRequest('User ID is required');
  }

  const formData = await FormData.findOne({
    where: { user_id: userId },
    attributes: ['user_id', 'userData'],
  });

  // if (!formData) {
    if (!categoryId) {
      throw new BadRequest('Category ID is required');
    }

    const tempFormData = await TempFormData.findOne({
      where: {
        user_id: userId,
        category_id: categoryId,
        sub_category_id: subcategoryId || null,
      },
      attributes: ['user_data'],
    });

    if (!tempFormData) {
      return [];
    }
    const data = { userData: tempFormData.user_data };
    return data;
  // }

  // return formData;
};

export const updateUserFormDataService = async (data, userId) => {
  let jsonData;
  const jsonDataString = data.json_data;

  if (typeof jsonDataString === 'string') {
    try {
      jsonData = JSON.parse(jsonDataString);
      data.json_data = jsonData;
    } catch (error) {
      throw new Error('Invalid JSON format in json_data');
    }
  } else {
    jsonData = jsonDataString;
    data.json_data = jsonData;
  }

  const formData = await FormData.findOne({
    where: { user_id: userId },
    attributes: ['user_id', 'userData'],
  });
  const EventCountData = await EventCount.findOne({
    where: { user_id: userId },
    attributes: ['count', 'eventStatus'],
  });
  if (!EventCountData) {
    await EventCount.create({
      user_id: userId,
      count: 0,
      eventStatus: 'pending',
    });
  } else {
    await EventCount.update(
      { count: 0, eventStatus: 'pending' },
      { where: { user_id: userId } }
    );
  }

  await User.update(
    {
      eventStatus: 'pending',
    },
    { where: { id: userId } }
  );

  if (formData) {
    await Event.destroy({
      where: { user_id: userId },
    });
  }

  if (!formData) {
    await FormData.create({
      user_id: userId,
      userData: data,
      status: 'pending',
    });
  }

  const response = await axios.post(
    'https://calendar-devapi.spericorn.com/api/json-response/',
    data
  );

  if (!response.data) {
    throw new Error('Empty response received');
  }

  await FormData.update(
    { Data: response.data, status: 'pending' },
    { where: { user_id: userId } }
  );
};

export const tempFormDataCreation = async (data, userId) => {
  const { categoryId, subcategoryId } = data;

  let jsonData;
  const jsonDataString = data.userData;

  if (typeof jsonDataString === 'string') {
    try {
      jsonData = JSON.parse(jsonDataString);
      data.userData = jsonData;
    } catch (error) {
      throw new Error('Invalid JSON format in json_data');
    }
  } else {
    jsonData = jsonDataString;
    data.userData = jsonData;
  }

  const existingTempFormData = await TempFormData.findOne({
    where: {
      user_id: userId,
      category_id: categoryId,
      sub_category_id: subcategoryId || null,
    },
  });

  if (!existingTempFormData) {
    await TempFormData.create({
      user_id: userId,
      category_id: categoryId,
      sub_category_id: subcategoryId || null,
      user_data: data.userData,
    });
  }

  if (existingTempFormData) {
    await TempFormData.update(
      { user_data: data.userData },
      {
        where: {
          user_id: userId,
          category_id: categoryId,
          sub_category_id: subcategoryId || null,
        },
      }
    );
  }
};