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>} */ static async getAll(): 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)" ) .getMany() .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", (subQuery) => { return subQuery .from(membership, "membership") .where("membership.memberId = member.id") .orderBy("membership.date", "ASC") .limit(1); }, "membership_first" ) .leftJoinAndMapOne( "member.lastMembershipEntry", (subQuery) => { return subQuery .from(membership, "membership") .where("membership.memberId = member.id") .orderBy("membership.date", "DESC") .limit(1); }, "membership_last" ) .where("member.id = :id", { id: id }) .getOneOrFail() .then((res) => { return res; }) .catch((err) => { throw new InternalException("member not found by id", err); }); } }