import { dataSource } from "../data-source"; import { member } from "../entity/member"; import { membership } from "../entity/membership"; import InternalException from "../exceptions/internalException"; export default abstract class MemberService { /** * @description get all members * @returns {Promise<[Array, number]>} */ static async getAll(offset: number = 0, count: number = 25): Promise<[Array, number]> { 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" ) .leftJoinAndSelect("preferredCommunication.type", "communicationtype_preferred") .offset(offset) .limit(count) .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" ) .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); }); } }