import { dataSource } from "../../../data-source"; import { member } from "../../../entity/club/member/member"; import { membership } from "../../../entity/club/member/membership"; import InternalException from "../../../exceptions/internalException"; import { memberView } from "../../../views/memberView"; export default abstract class MemberService { /** * @description get all members * @returns {Promise<[Array, number]>} */ static async getAll({ offset = 0, count = 25, search = "", noLimit = false, ids = [], }: { offset?: number; count?: number; search?: string; noLimit?: boolean; ids?: Array; }): Promise<[Array, number]> { let query = dataSource .getRepository(member) .createQueryBuilder("member") .leftJoinAndMapOne( "member.firstMembershipEntry", "member.memberships", "membership_first", "membership_first.memberId = member.id AND membership_first.start = (SELECT MIN(m.start) FROM membership m WHERE m.memberId = member.id)" ) .leftJoinAndMapOne( "member.lastMembershipEntry", "member.memberships", "membership_last", "membership_last.memberId = member.id AND membership_last.start = (SELECT MAX(m.start) FROM membership m WHERE m.memberId = member.id)" ) .leftJoinAndSelect("membership_first.status", "status_first") .leftJoinAndSelect("membership_last.status", "status_last") .leftJoinAndSelect("member.sendNewsletter", "sendNewsletter") .leftJoinAndSelect("sendNewsletter.type", "communicationtype") .leftJoinAndMapMany( "member.preferredCommunication", "member.communications", "preferredCommunication", "preferredCommunication.preferred = 1" ) .leftJoinAndSelect("preferredCommunication.type", "communicationtype_preferred") .leftJoinAndMapMany("member.smsAlarming", "member.communications", "smsAlarming", "smsAlarming.isSMSAlarming = 1") .leftJoinAndSelect("smsAlarming.type", "communicationtype_smsAlarming"); if (search != "") { search.split(" ").forEach((term, index) => { const searchQuery = `%${term}%`; const dynamic = "searchQuery" + Math.random().toString(36).substring(2); if (index == 0) { query = query.where(`member.firstname LIKE :${dynamic} OR member.lastname LIKE :${dynamic}`, { [dynamic]: searchQuery, }); } else { query = query.orWhere(`member.firstname LIKE :${dynamic} OR member.lastname LIKE :${dynamic}`, { [dynamic]: searchQuery, }); } }); } if (ids.length != 0) { query = query.where({ id: ids }); } if (!noLimit) { query = query.offset(offset).limit(count); } return await query .orderBy("member.lastname") .addOrderBy("member.firstname") .addOrderBy("member.nameaffix") .getManyAndCount() .then((res) => { return res; }) .catch((err) => { throw new InternalException("members not found", err); }); } /** * @description get member by id * @param {number} id * @returns {Promise} */ static async getById(id: number): Promise { return await dataSource .getRepository(member) .createQueryBuilder("member") .leftJoinAndMapOne( "member.firstMembershipEntry", "member.memberships", "membership_first", "membership_first.memberId = member.id AND membership_first.start = (SELECT MIN(m.start) FROM membership m WHERE m.memberId = member.id)" ) .leftJoinAndMapOne( "member.lastMembershipEntry", "member.memberships", "membership_last", "membership_last.memberId = member.id AND membership_last.start = (SELECT MAX(m.start) FROM membership m WHERE m.memberId = member.id)" ) .leftJoinAndSelect("membership_first.status", "status_first") .leftJoinAndSelect("membership_last.status", "status_last") .leftJoinAndSelect("member.sendNewsletter", "sendNewsletter") .leftJoinAndSelect("sendNewsletter.type", "communicationtype") .leftJoinAndMapMany( "member.preferredCommunication", "member.communications", "preferredCommunication", "preferredCommunication.preferred = 1" ) .leftJoinAndMapMany("member.smsAlarming", "member.communications", "smsAlarming", "smsAlarming.isSMSAlarming = 1") .leftJoinAndSelect("smsAlarming.type", "communicationtype_smsAlarming") .leftJoinAndSelect("preferredCommunication.type", "communicationtype_preferred") .where("member.id = :id", { id: id }) .getOneOrFail() .then((res) => { return res; }) .catch((err) => { throw new InternalException("member not found by id", err); }); } /** * @description get member statistics by id * @param {number} id * @returns {Promise} */ static async getStatisticsById(id: number): Promise { return await dataSource .getRepository(memberView) .createQueryBuilder("memberView") .where("memberView.id = :id", { id: id }) .getOneOrFail() .then((res) => { return res; }) .catch((err) => { throw new InternalException("memberView not found by id", err); }); } /** * @description get members where membership is setz * @returns {Promise} */ static async getByRunningMembership(): Promise> { return await dataSource .getRepository(member) .createQueryBuilder("member") .leftJoinAndSelect("member.memberships", "membership") .where("membership.end IS NULL") .orderBy("member.lastname") .addOrderBy("member.firstname") .addOrderBy("member.nameaffix") .getMany() .then((res) => { return res; }) .catch((err) => { throw new InternalException("member not found by id", err); }); } /** * @description get newsletter by member by id * @param {number} id * @returns {Promise} */ static async getNewsletterById(id: number): Promise { return await dataSource .getRepository(member) .createQueryBuilder("member") .leftJoinAndSelect("member.sendNewsletter", "sendNewsletter") .where("member.id = :id", { id: id }) .getOneOrFail() .then((res) => { return res; }) .catch((err) => { throw new InternalException("member not found by id", err); }); } }