ff-admin-server/src/service/club/member/memberService.ts

200 lines
6.4 KiB
TypeScript
Raw Normal View History

2025-01-29 09:42:22 +01:00
import { SelectQueryBuilder } from "typeorm";
2025-01-05 14:14:00 +01:00
import { dataSource } from "../../../data-source";
import { member } from "../../../entity/club/member/member";
import { membership } from "../../../entity/club/member/membership";
2025-01-29 09:42:22 +01:00
import DatabaseActionException from "../../../exceptions/databaseActionException";
2025-01-05 14:14:00 +01:00
import InternalException from "../../../exceptions/internalException";
2025-01-21 14:49:14 +01:00
import { memberView } from "../../../views/memberView";
import { DB_TYPE } from "../../../env.defaults";
2024-09-16 12:37:06 +02:00
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-20 09:44:03 +01:00
static async getAll({
offset = 0,
count = 25,
search = "",
noLimit = false,
ids = [],
}: {
offset?: number;
count?: number;
search?: string;
noLimit?: boolean;
2025-01-29 08:53:49 +01:00
ids?: Array<string>;
2025-01-20 09:44:03 +01:00
}): Promise<[Array<member>, number]> {
2025-01-29 09:42:22 +01:00
let query = this.applyMemberBaseJoins();
2025-01-03 15:20:05 +01:00
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-20 09:44:03 +01:00
if (ids.length != 0) {
2025-01-27 15:16:12 +01:00
query = query.where("member.id IN (:...ids)", { ids: ids });
2025-01-20 09:44:03 +01:00
}
if (!noLimit) {
query = query.offset(offset).limit(count);
}
2025-01-05 13:43:03 +01:00
return await query
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) => {
2025-01-29 09:42:22 +01:00
throw new DatabaseActionException("SELECT", "member", err);
2024-09-16 12:37:06 +02:00
});
}
/**
* @description get member by id
2025-01-29 08:53:49 +01:00
* @param {string} id
2024-11-27 10:07:59 +01:00
* @returns {Promise<member>}
2024-09-16 12:37:06 +02:00
*/
2025-01-29 08:53:49 +01:00
static async getById(id: string): Promise<member> {
2025-01-29 09:42:22 +01:00
return this.applyMemberBaseJoins()
2024-09-16 12:37:06 +02:00
.where("member.id = :id", { id: id })
.getOneOrFail()
.then((res) => {
return res;
})
.catch((err) => {
2025-01-29 09:42:22 +01:00
throw new DatabaseActionException("SELECT", "member", err);
2024-09-16 12:37:06 +02:00
});
}
2024-11-27 10:07:59 +01:00
2025-01-21 14:49:14 +01:00
/**
* @description get member statistics by id
2025-01-29 08:53:49 +01:00
* @param {string} id
2025-01-21 14:49:14 +01:00
* @returns {Promise<memberView>}
*/
2025-01-29 08:53:49 +01:00
static async getStatisticsById(id: string): Promise<memberView> {
2025-01-21 14:49:14 +01:00
return await dataSource
.getRepository(memberView)
.createQueryBuilder("memberView")
.where("memberView.id = :id", { id: id })
.getOneOrFail()
.then((res) => {
return res;
})
.catch((err) => {
2025-01-29 09:42:22 +01:00
throw new DatabaseActionException("SELECT", "memberView", err);
2025-01-21 14:49:14 +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
2025-01-08 18:09:22 +01:00
.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) => {
2025-01-29 09:42:22 +01:00
throw new DatabaseActionException("SELECT", "member", err);
2025-01-08 18:09:22 +01:00
});
2025-01-05 13:43:03 +01:00
}
2024-11-27 10:07:59 +01:00
/**
* @description get newsletter by member by id
2025-01-29 08:53:49 +01:00
* @param {string} id
2024-11-27 10:07:59 +01:00
* @returns {Promise<member>}
*/
2025-01-29 08:53:49 +01:00
static async getNewsletterById(id: string): Promise<member> {
2024-11-27 10:07:59 +01:00
return await dataSource
.getRepository(member)
.createQueryBuilder("member")
.leftJoinAndMapOne(
"member.sendNewsletter",
"member.communications",
"sendNewsletter",
2025-02-09 17:23:54 +01:00
"sendNewsletter.isSendNewsletter = true"
)
2024-11-27 10:07:59 +01:00
.where("member.id = :id", { id: id })
.getOneOrFail()
.then((res) => {
return res;
})
.catch((err) => {
2025-01-29 09:42:22 +01:00
throw new DatabaseActionException("SELECT", "member", err);
2024-11-27 10:07:59 +01:00
});
}
2025-01-29 09:42:22 +01:00
/**
* @description apply member joins to query
* @returns {SelectQueryBuilder<member>}
*/
static applyMemberBaseJoins(): SelectQueryBuilder<member> {
return dataSource
.getRepository(member)
.createQueryBuilder("member")
.leftJoinAndMapOne(
"member.firstMembershipEntry",
"member.memberships",
"membership_first",
DB_TYPE == "postgres"
? 'membership_first.memberId = member.id AND membership_first.start = (SELECT MIN("m_first"."start") FROM "membership" "m_first" WHERE "m_first"."memberId" = "member"."id")'
: "membership_first.memberId = member.id AND membership_first.start = (SELECT MIN(m_first.start) FROM membership m_first WHERE m_first.memberId = member.id)"
2025-01-29 09:42:22 +01:00
)
.leftJoinAndMapOne(
"member.lastMembershipEntry",
"member.memberships",
"membership_last",
DB_TYPE == "postgres"
? 'membership_last.memberId = member.id AND membership_last.start = (SELECT MAX("m_last"."start") FROM "membership" "m_last" WHERE "m_last"."memberId" = "member"."id")'
: "membership_last.memberId = member.id AND membership_last.start = (SELECT MAX(m_last.start) FROM membership m_last WHERE m_last.memberId = member.id)"
2025-01-29 09:42:22 +01:00
)
.leftJoinAndSelect("membership_first.status", "status_first")
.leftJoinAndSelect("membership_last.status", "status_last")
.leftJoinAndMapMany(
"member.preferredCommunication",
"member.communications",
"preferredCommunication",
"preferredCommunication.preferred = true"
2025-01-29 09:42:22 +01:00
)
.leftJoinAndSelect("preferredCommunication.type", "communicationtype_preferred")
.leftJoinAndMapOne(
"member.sendNewsletter",
"member.communications",
"sendNewsletter",
"sendNewsletter.isSendNewsletter = true"
2025-01-29 09:42:22 +01:00
)
.leftJoinAndSelect("sendNewsletter.type", "communicationtype")
.leftJoinAndMapMany(
"member.smsAlarming",
"member.communications",
"smsAlarming",
"smsAlarming.isSMSAlarming = true"
)
2025-01-29 09:42:22 +01:00
.leftJoinAndSelect("smsAlarming.type", "communicationtype_smsAlarming")
.leftJoinAndSelect("member.salutation", "salutation");
}
2024-09-16 12:37:06 +02:00
}