76 lines
2.3 KiB
TypeScript
76 lines
2.3 KiB
TypeScript
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<member>>}
|
|
*/
|
|
static async getAll(): Promise<Array<member>> {
|
|
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<Array<member>>}
|
|
*/
|
|
static async getById(id: number): Promise<member> {
|
|
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);
|
|
});
|
|
}
|
|
}
|