HEX
Server: Apache/2.4.52 (Ubuntu)
System: Linux ip-10-0-8-47 6.8.0-1021-aws #23~22.04.1-Ubuntu SMP Tue Dec 10 16:31:58 UTC 2024 aarch64
User: ubuntu (1000)
PHP: 8.1.2-1ubuntu2.22
Disabled: NONE
Upload Files
File: /var/www/javago_test/src/services/group/group.services.js
import sequelize from "../../config/database.config.js";
import Groups from "../../models/groups.model.js";
import moment from "moment";
import GroupMemberDB from "../../models/group_members.model.js";
import GroupCafeDB from "../../models/group_cafes.model.js";
import CafeDB from "../../models/cafes.model.js";
import User from "../../models/users.model.js";
import { Op } from "sequelize";

// create Group
export async function createGroup(groupData) {
  try {
    let storeGroupMemberObj = [];
    let storeGroupCafeObj = [];
    let result = await Groups.create(
      {
        group_name: groupData.group_name,
        created_by: groupData.user_id,
        group_code: Math.floor(100000 + Math.random() * 900000),
        group_profile: groupData.group_profile,
        is_active: 1,
        created_at: moment().unix(),
      }
    );
    if ('group_members' in groupData) {
      if (groupData.group_members.length > 0) {
        groupData.group_members.forEach((element) => {
          storeGroupMemberObj.push({
            group_id: result.id,
            user_id: element.user_id,
            created_at: moment().unix(),
          });
        });
      }
    }
    storeGroupMemberObj.push({
      group_id: result.id,
      user_id: groupData.user_id,
      created_at: moment().unix(),
    })
    await GroupMemberDB.bulkCreate(storeGroupMemberObj)
    groupData.group_cafes.forEach((element) => {
      storeGroupCafeObj.push({
        group_id: result.id,
        cafe_id: element.cafe_id,
        created_at: moment().unix(),
      });
    });
    await GroupCafeDB.bulkCreate(storeGroupCafeObj);
    return result;
  } catch (error) {
    throw new Error(error);
  }
}

//get cafe list by group id and edit time
export async function getCafeList(data) {
  try {
    if (parseInt(data.page) > 0) data.page = parseInt(data.page) - 1;
    data.page = parseInt(data.page) * 10;
    const rawQuery =
      "SELECT `cafes`.`id`, `cafes`.`address`, `cafes`.`cafe_name`,`cafes`.`banner_image`,`cafes`.`address`,`cafes`.`latitude`,`cafes`.`longitude`, ROUND(3958.8 * ACOS(COS(RADIANS(:latitude)) * COS(RADIANS(`cafes`.`latitude`)) * COS(RADIANS(:longitude) - RADIANS(`cafes`.`longitude`)) + SIN(RADIANS(:latitude)) * SIN(RADIANS(`cafes`.`latitude`))),2) AS `distance`, CASE WHEN `group_cafes`.`cafe_id` IS NOT NULL THEN 1 ELSE 0 END AS `is_selected` FROM `cafes` LEFT OUTER JOIN `group_cafes` ON `cafes`.`id` = `group_cafes`.`cafe_id` AND `group_cafes`.`group_id` = :group_id WHERE `cafes`.`is_active` = 1 AND `cafes`.`signup_completed` = 1 AND `cafes`.`profile_completed` = 1 AND `cafes`.`menu_completed` = 1 AND `cafes`.`deleted_at` = 0 ORDER BY `is_selected` DESC,`distance` ASC LIMIT :offset, :limit";
    const replacements = {
      latitude: data.latitude,
      longitude: data.longitude,
      group_id: data.group_id,
      offset: parseInt(data.page),
      limit: 10,
    };
    const rawQuery1 =
      "SELECT `cafes`.`id`, `cafes`.`cafe_name`,`cafes`.`banner_image`,`cafes`.`address`,`cafes`.`latitude`,`cafes`.`longitude`, ROUND(3958.8 * ACOS(COS(RADIANS(:latitude)) * COS(RADIANS(`cafes`.`latitude`)) * COS(RADIANS(:longitude) - RADIANS(`cafes`.`longitude`)) + SIN(RADIANS(:latitude)) * SIN(RADIANS(`cafes`.`latitude`))),2) AS `distance`, CASE WHEN `group_cafes`.`cafe_id` IS NOT NULL THEN 1 ELSE 0 END AS `is_selected` FROM `cafes` LEFT OUTER JOIN `group_cafes` ON `cafes`.`id` = `group_cafes`.`cafe_id` AND `group_cafes`.`group_id` = :group_id WHERE `cafes`.`is_active` = 1 AND `cafes`.`signup_completed` = 1 AND `cafes`.`profile_completed` = 1 AND `cafes`.`menu_completed` = 1 AND `cafes`.`deleted_at` = 0 ORDER BY `is_selected` DESC,`distance` ASC";
    console.log(rawQuery1);
    let cafe_details = await sequelize.query(rawQuery, {
      replacements,
      type: sequelize.QueryTypes.SELECT,
    });
    let totalCountDocs = await sequelize.query(rawQuery1, {
      replacements,
      type: sequelize.QueryTypes.SELECT,
    });
    let finalResult = {
      docs: cafe_details,
      page: Math.ceil(totalCountDocs.length / 10),
      total: totalCountDocs.length,
    };
    return finalResult;
  } catch (error) {
    throw new Error(error);
  }
}

//get all cafe list in create group
export async function getAllCafe(data) {
  try {
    let cafe_details = await CafeDB.paginate({
      page: parseInt(data.page),
      paginate: 10,
      where: {
        is_active: 1,
        signup_completed: 1,
        profile_completed: 1,
        menu_completed: 1,
        deleted_at: 0,
      },
      attributes: [
        "id",
        "cafe_name",
        "banner_image",
        "latitude",
        "longitude",
        "address",
        [
          sequelize.fn(
            "ROUND",
            sequelize.literal(
              `3958.8 * acos(cos(radians(${data.latitude})) * cos(radians(latitude)) * cos(radians(${data.longitude}) - radians(longitude)) + sin(radians(${data.latitude})) * sin(radians(latitude)))`
            ),
            2
          ),
          "distance",
        ],
      ],
      order: [[sequelize.col("distance"), "ASC"]],
    });
    return cafe_details;
  } catch (error) {
    throw new Error(error);
  }
}

//get group details by id
export async function GetGroupDetails(data) {
  try {
    const haversine = `(
      3959 * acos(
          cos(radians(${data.latitude}))
          * cos(radians(latitude))
          * cos(radians(longitude) - radians(${data.longitude}))
          + sin(radians(${data.latitude})) * sin(radians(latitude))
      )
    )`;
    let groupDetails = await Groups.findOne({
      where: { id: data.group_id },
      attributes: ['id', 'group_name', 'created_by', 'group_code', 'group_profile', 'created_at'],
      include: [
        {
          model: GroupMemberDB,
          as: 'group_details',
          attributes: ['id', 'user_id'],
          include: [{
            model: User,
            as: 'user_data',
            attributes: ['id', 'name', 'email', 'profile_picture'],
            where: { is_deleted: 0, is_active: 1, is_verified: 1 }
          }]
        },
        {
          model: GroupCafeDB,
          as: 'group_cafe',
          include: [
            {
              model: CafeDB,
              as: 'cafe_data',
              required: true,
              attributes: ['id', 'cafe_name', 'banner_image', 'address', 'latitude', 'longitude',
                [sequelize.literal(`round(${haversine})`), 'distance']],
              order: [[sequelize.col('distance'), 'ASC']],
            }
          ]
        }]
    })
    groupDetails = JSON.stringify(groupDetails)
    groupDetails = JSON.parse(groupDetails)
    for (let index = 0; index < groupDetails.group_details.length; index++) {
      const element = groupDetails.group_details[index];
      element.user_data.is_admin = 0
      if (parseInt(element.user_id) == parseInt(groupDetails.created_by)) {
        element.user_data.is_admin = 1
      }
    }
    // groupDetails['admin'] = created_by_data
    return groupDetails;
  } catch (error) {
    throw new Error(error)
  }
}

// get People list of user networks
/*export async function getPeopleList(data) {
  try {
    let groupIds = [];
    let groupData = await GroupMemberDB.findAll({
      where: {
        user_id: data.user_id
      },
    })
    for (let i = 0; i < groupData.length; i++) {
      groupIds.push(groupData[i].group_id)
    }
    let userDetails = await GroupMemberDB.paginate({
      paginate: 10,
      page: data.page,
      where: {
        group_id: {
          [Op.in]: groupIds
        },
        user_id: {
          [Op.ne]: data.user_id
        },
      },
      attributes: ['id', 'group_id', 'user_id'],
      include: [{
        model: User,
        as: 'user_data',
        attributes: ['id', 'name', 'email', 'profile_picture'],
        where: { is_deleted: 0, is_active: 1, is_verified: 1 },
        order: [['name', "ASC"]],
      }],
      group: 'user_id'
    })
    return userDetails;
  } catch (error) {
    console.log(error);
    throw new Error(error);
  }
}*/

//above function New code 
/*export async function getPeopleList(data) {
  try {
    let groupIds = [];
    const groupData = await User.findAll();
    if(groupData.length === 0){
      return [];
    }
    //console.log(data.user_id,groupData);
    for (let i = 0; i < groupData.length; i++) {
      groupIds.push(groupData[i].group_id)
    }
    let userDetails = await User.paginate({
      paginate: 10,
      page: data.page,
    })
    return userDetails;
  } catch (error) {
    console.log(error);
    throw new Error(error);
  }
} */
export async function getPeopleList(data) {
  try {
    let groupIds = [];
    let groupData = await GroupMemberDB.findAll({
      where: {
        user_id: data.user_id
      },
    });

    // Check if groupData is empty
    if (groupData.length === 0) {
      // If empty, fetch all users directly
      let userDetails = await GroupMemberDB.paginate({
        paginate: 10,
        page: data.page,
        where: {
          user_id: {
            [Op.ne]: data.user_id
          },
        },
        attributes: ['id', 'group_id', 'user_id'],
        include: [{
          model: User,
          as: 'user_data',
          attributes: ['id', 'name', 'email', 'profile_picture'],
          where: { is_deleted: 0, is_active: 1, is_verified: 1 },
          order: [['name', "ASC"]],
        }]
      });
      return userDetails;
    }

    // If groupData is not empty
    for (let i = 0; i < groupData.length; i++) {
      groupIds.push(groupData[i].group_id)
    }

    let userDetails = await GroupMemberDB.paginate({
      paginate: 10,
      page: data.page,
      where: {
        group_id: {
          [Op.in]: groupIds
        },
        user_id: {
          [Op.ne]: data.user_id
        },
      },
      attributes: ['id', 'group_id', 'user_id'],
      include: [{
        model: User,
        as: 'user_data',
        attributes: ['id', 'name', 'email', 'profile_picture'],
        where: { is_deleted: 0, is_active: 1, is_verified: 1 },
        order: [['name', "ASC"]],
      }],
      group: ['user_id', 'group_members.id'] // Ensure all non-aggregated columns are included in the GROUP BY clause
    });
    return userDetails;
  } catch (error) {
    console.log(error);
    throw new Error(error);
  }
}



// search user of particular user network
export async function searchPeopleList(data) {
  try {
    let groupIds = [];
    let groupData = await GroupMemberDB.findAll({
      where: {
        user_id: data.user_id
      },
    })
    for (let i = 0; i < groupData.length; i++) {
      groupIds.push(groupData[i].group_id)
    }
    let userDetails = await GroupMemberDB.paginate({
      paginate: 10,
      page: data.page,
      where: {
        group_id: {
          [Op.in]: groupIds
        },
        user_id: {
          [Op.ne]: data.user_id
        },
      },
      attributes: ['id', 'group_id', 'user_id'],
      include: [{
        model: User,
        as: 'user_data',
        attributes: ['id', 'name', 'email', 'profile_picture'],
        where: {
          is_deleted: 0,
          is_active: 1,
          is_verified: 1,
          name: {
            [Op.like]: `%${data.user_name}%`
          }
        },
        order: [['name', "ASC"]],
      }],
      group: 'user_id'
    })
    return userDetails;
  } catch (error) {
    throw new Error(error);
  }
}

//get all user list in group wise
export async function getGroupPeopleList(data, user_id) {
  try {
    let groupDetails = await GroupMemberDB.paginate({
      paginate: 10,
      page: data.page,
      where: { group_id: data.group_id },
      attributes: ['id', 'group_id', 'user_id'],
      include: [{
        model: User,
        as: 'user_data',
        attributes: ['id', 'name', 'email', 'profile_picture'],
        where: { is_deleted: 0, is_active: 1, is_verified: 1 }
      }],
    })
    groupDetails = JSON.stringify(groupDetails)
    groupDetails = JSON.parse(groupDetails)
    for (let index = 0; index < groupDetails.docs.length; index++) {
      groupDetails.docs[index].is_admin = 0
      try {
        let isAdmin = await Groups.findOne(
          {
            where: {
              id: groupDetails.docs[index].group_id,
              created_by: groupDetails.docs[index].user_id
            }
          }
        )
        if (isAdmin && isAdmin.created_by == groupDetails.docs[index].user_id) {
          groupDetails.docs[index].is_admin = 1
        }
      } catch (error) {
        throw new Error(error);
      }
    }
    return groupDetails;
  } catch (error) {
    throw new Error(error);
  }
}

// add additional cafes in group
export async function addCafe(data) {
  try {
    await GroupCafeDB.destroy({
      where: { group_id: data.group_id },
    });
    let storeGroupCafeObj = [];
    data.group_cafes.forEach((element) => {
      storeGroupCafeObj.push({
        group_id: data.group_id,
        cafe_id: element.cafe_id,
        created_at: moment().unix(),
      });
    });
    await GroupCafeDB.bulkCreate(storeGroupCafeObj);
  } catch (error) {
    throw new Error(error);
  }
}

//get group list
export async function getGroupList(userId, page) {
  try {
    if (parseInt(page) > 0) page = parseInt(page) - 1
    page = parseInt(page) * 10
    const rawQuery = "SELECT `groups`.`id`, `groups`.`created_by`, `groups`.`group_name`, `groups`.`group_profile`, `groups`.`group_code`, `groups`.`created_at`, MAX(`group_members`.`user_id`) AS `user_id` FROM `groups` INNER JOIN `group_members` ON `groups`.`id` = `group_members`.`group_id` WHERE (`groups`.`created_by` = :created_by OR `group_members`.`user_id` = :user_id) AND `groups`.`is_active` = 1 GROUP BY `groups`.`id` ORDER BY `groups`.`id` DESC LIMIT :offset, :limit;";
    const replacements = {
      created_by: parseInt(userId),
      user_id: parseInt(userId),
      offset: parseInt(page),
      limit: 10
    };
    let group_data = await sequelize.query(rawQuery, { replacements, type: sequelize.QueryTypes.SELECT });
    group_data = JSON.stringify(group_data)
    group_data = JSON.parse(group_data)
    for (let index = 0; index < group_data.length; index++) {
      const element = group_data[index];
      element.group_members = await GroupMemberDB.findAll({
        where: {
          group_id: element.id
        },
        attributes: ['id', 'user_id'],
        include: [{
          model: User,
          as: 'user_data',
          attributes: [['id', 'user_id'], 'name', 'profile_picture'],
          where: {
            is_deleted: 0,
            is_active: 1,
            is_verified: 1
          },
          required: true
        }],
      })
      element.group_members = JSON.stringify(element.group_members)
      element.group_members = JSON.parse(element.group_members)
      for (let i = 0; i < element.group_members.length; i++) {
        const element1 = element.group_members[i];
        element1.user_data.is_admin = 0
        if (element1.user_id == element.created_by) {
          element1.user_data.is_admin = 1
        }

      }
    }
    return group_data;
  } catch (error) {
    throw new Error(error)
  }
}

//remove user from group
export async function removeUser(data) {
  try {
    await GroupMemberDB.destroy({
      where: { group_id: data.group_id, user_id: data.user_id },
    });
  } catch (error) {
    throw new Error(error);
  }
}

//exit group
export async function exitGroup(data) {
  try {
    let getGroupDetails = await Groups.findOne({
      where: { id: data.group_id },
      attributes: ["created_by"],
    });
    if (getGroupDetails && getGroupDetails.created_by == data.user_id) {
      await Groups.destroy({
        where: { id: data.group_id },
      });
    } else {
      await GroupMemberDB.destroy({
        where: { group_id: data.group_id, user_id: data.user_id },
      });
    }
    return getGroupDetails;
  } catch (error) {
    throw new Error(error);
  }
}

// get Group Code
export async function findcode(groupcode) {
  try {
    let result = await Groups.findOne({
      where: {
        group_code: groupcode,
      },
    })
    return result;
  } catch (error) {
    throw new Error(error);
  }
}

// create group id 
export async function createMember(data) {
  try {
    await GroupMemberDB.create(data)
    return true;
  } catch (error) {
    throw new Error(error);
  }
}

//get Group Member
export async function getMemberDetail(user_id, data) {
  try {
    let get_id = await GroupMemberDB.findOne({
      where: {
        group_id: data,
        user_id: user_id,
      },
    });
    return get_id;
  } catch (error) {
    throw new Error(error);
  }
}

export async function findId(user_id, group_id) {
  try {
    let CreatedId = await Groups.findOne({
      where: {
        created_by: user_id,
        id: group_id
      },
    });
    return CreatedId;
  } catch (error) {
    throw new Error(error);
  }
}

// add members in group
export async function addMemberInGroup(data) {
  try {
    await GroupMemberDB.destroy({
      where: {
        group_id: parseInt(data.group_id)
      }
    })
    data.members.forEach(async (element) => {
      const [user, created] = await GroupMemberDB.findOrCreate({
        where: { group_id: data.group_id, user_id: element.user_id },
      });
    })
    return true
  } catch (error) {
    throw new Error(error);
  }
}

// remove cafe from group
export async function removeCafeFromGroup(data) {
  try {
    await GroupCafeDB.destroy({
      where: {
        id: parseInt(data.id)
      }
    })
    return true
  } catch (error) {
    throw new Error(error);
  }
}