2024-09-16 12:37:06 +02:00
|
|
|
import { dataSource } from "../data-source";
|
|
|
|
import { member } from "../entity/member";
|
2024-09-16 15:55:41 +02:00
|
|
|
import { membership } from "../entity/membership";
|
2024-09-16 12:37:06 +02:00
|
|
|
import InternalException from "../exceptions/internalException";
|
|
|
|
|
|
|
|
export default abstract class MemberService {
|
|
|
|
/**
|
|
|
|
* @description get all members
|
2024-09-16 18:00:00 +02:00
|
|
|
* @returns {Promise<[Array<member>, number]>}
|
2024-09-16 12:37:06 +02:00
|
|
|
*/
|
2025-01-03 15:20:05 +01:00
|
|
|
static async getAll(offset: number = 0, count: number = 25, search: string = ""): Promise<[Array<member>, number]> {
|
2025-01-05 13:43:03 +01:00
|
|
|
let query = dataSource
|
2024-09-16 12:37:06 +02:00
|
|
|
.getRepository(member)
|
|
|
|
.createQueryBuilder("member")
|
2024-09-16 15:55:41 +02:00
|
|
|
.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)"
|
|
|
|
)
|
2024-09-16 19:03:41 +02:00
|
|
|
.leftJoinAndSelect("membership_first.status", "status_first")
|
|
|
|
.leftJoinAndSelect("membership_last.status", "status_last")
|
2024-09-18 09:28:46 +02:00
|
|
|
.leftJoinAndSelect("member.sendNewsletter", "sendNewsletter")
|
|
|
|
.leftJoinAndSelect("sendNewsletter.type", "communicationtype")
|
2024-09-17 16:44:39 +02:00
|
|
|
.leftJoinAndMapMany(
|
|
|
|
"member.preferredCommunication",
|
|
|
|
"member.communications",
|
|
|
|
"preferredCommunication",
|
2024-09-18 09:28:46 +02:00
|
|
|
"preferredCommunication.preferred = 1"
|
2024-09-17 16:44:39 +02:00
|
|
|
)
|
|
|
|
.leftJoinAndSelect("preferredCommunication.type", "communicationtype_preferred")
|
2024-11-27 10:07:59 +01:00
|
|
|
.leftJoinAndMapMany("member.smsAlarming", "member.communications", "smsAlarming", "smsAlarming.isSMSAlarming = 1")
|
2025-01-03 15:20:05 +01:00
|
|
|
.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,
|
|
|
|
});
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2025-01-05 13:43:03 +01:00
|
|
|
return await query
|
2024-09-16 18:00:00 +02:00
|
|
|
.offset(offset)
|
|
|
|
.limit(count)
|
2024-09-16 19:03:41 +02:00
|
|
|
.orderBy("member.lastname")
|
|
|
|
.addOrderBy("member.firstname")
|
|
|
|
.addOrderBy("member.nameaffix")
|
2024-09-16 18:00:00 +02:00
|
|
|
.getManyAndCount()
|
2024-09-16 12:37:06 +02:00
|
|
|
.then((res) => {
|
|
|
|
return res;
|
|
|
|
})
|
|
|
|
.catch((err) => {
|
|
|
|
throw new InternalException("members not found", err);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @description get member by id
|
|
|
|
* @param {number} id
|
2024-11-27 10:07:59 +01:00
|
|
|
* @returns {Promise<member>}
|
2024-09-16 12:37:06 +02:00
|
|
|
*/
|
|
|
|
static async getById(id: number): Promise<member> {
|
|
|
|
return await dataSource
|
|
|
|
.getRepository(member)
|
|
|
|
.createQueryBuilder("member")
|
2024-09-16 15:55:41 +02:00
|
|
|
.leftJoinAndMapOne(
|
|
|
|
"member.firstMembershipEntry",
|
2024-09-16 18:00:00 +02:00
|
|
|
"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)"
|
2024-09-16 15:55:41 +02:00
|
|
|
)
|
|
|
|
.leftJoinAndMapOne(
|
|
|
|
"member.lastMembershipEntry",
|
2024-09-16 18:00:00 +02:00
|
|
|
"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)"
|
2024-09-16 15:55:41 +02:00
|
|
|
)
|
2024-09-16 19:03:41 +02:00
|
|
|
.leftJoinAndSelect("membership_first.status", "status_first")
|
|
|
|
.leftJoinAndSelect("membership_last.status", "status_last")
|
2024-09-18 09:28:46 +02:00
|
|
|
.leftJoinAndSelect("member.sendNewsletter", "sendNewsletter")
|
|
|
|
.leftJoinAndSelect("sendNewsletter.type", "communicationtype")
|
|
|
|
.leftJoinAndMapMany(
|
|
|
|
"member.preferredCommunication",
|
|
|
|
"member.communications",
|
|
|
|
"preferredCommunication",
|
|
|
|
"preferredCommunication.preferred = 1"
|
|
|
|
)
|
2024-11-27 10:07:59 +01:00
|
|
|
|
|
|
|
.leftJoinAndMapMany("member.smsAlarming", "member.communications", "smsAlarming", "smsAlarming.isSMSAlarming = 1")
|
|
|
|
.leftJoinAndSelect("smsAlarming.type", "communicationtype_smsAlarming")
|
2024-09-18 09:28:46 +02:00
|
|
|
.leftJoinAndSelect("preferredCommunication.type", "communicationtype_preferred")
|
2024-09-16 12:37:06 +02:00
|
|
|
.where("member.id = :id", { id: id })
|
|
|
|
.getOneOrFail()
|
|
|
|
.then((res) => {
|
|
|
|
return res;
|
|
|
|
})
|
|
|
|
.catch((err) => {
|
|
|
|
throw new InternalException("member not found by id", err);
|
|
|
|
});
|
|
|
|
}
|
2024-11-27 10:07:59 +01:00
|
|
|
|
2025-01-05 13:43:03 +01:00
|
|
|
/**
|
|
|
|
* @description get members where membership is setz
|
|
|
|
* @returns {Promise<member>}
|
|
|
|
*/
|
|
|
|
static async getByRunningMembership(): Promise<Array<member>> {
|
|
|
|
return await dataSource
|
|
|
|
.getRepository(member)
|
|
|
|
.createQueryBuilder("member")
|
|
|
|
.leftJoinAndSelect("member.memberships", "membership")
|
|
|
|
.where("membership.end IS NULL")
|
|
|
|
.getMany()
|
|
|
|
.then((res) => {
|
|
|
|
return res;
|
|
|
|
})
|
|
|
|
.catch((err) => {
|
|
|
|
throw new InternalException("member not found by id", err);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2024-11-27 10:07:59 +01:00
|
|
|
/**
|
|
|
|
* @description get newsletter by member by id
|
|
|
|
* @param {number} id
|
|
|
|
* @returns {Promise<member>}
|
|
|
|
*/
|
|
|
|
static async getNewsletterById(id: number): Promise<member> {
|
|
|
|
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);
|
|
|
|
});
|
|
|
|
}
|
2024-09-16 12:37:06 +02:00
|
|
|
}
|