Merge branch 'milestone/ff-admin-unit' into unit/#102-base-management

# Conflicts:
#	src/data-source.ts
This commit is contained in:
Julian Krauser 2025-06-08 07:55:20 +02:00
commit e056db053b
68 changed files with 1807 additions and 1521 deletions

View file

@ -0,0 +1,49 @@
import { dataSource } from "../../../data-source";
import { memberEducations } from "../../../entity/club/member/memberEducations";
import DatabaseActionException from "../../../exceptions/databaseActionException";
import InternalException from "../../../exceptions/internalException";
export default abstract class MemberEducationService {
/**
* @description get all by member id
* @param {string} memberId
* @returns {Promise<Array<memberEducations>>}
*/
static async getAll(memberId: string): Promise<Array<memberEducations>> {
return await dataSource
.getRepository(memberEducations)
.createQueryBuilder("memberEducations")
.leftJoinAndSelect("memberEducations.education", "education")
.where("memberEducations.memberId = :memberId", { memberId: memberId })
.orderBy("education.education", "ASC")
.getMany()
.then((res) => {
return res;
})
.catch((err) => {
throw new DatabaseActionException("SELECT", "memberEducations", err);
});
}
/**
* @description get by memberId and recordId
* @param {string} memberId
* @param {number} recordId
* @returns {Promise<Array<member>>}
*/
static async getById(memberId: string, recordId: number): Promise<memberEducations> {
return await dataSource
.getRepository(memberEducations)
.createQueryBuilder("memberEducations")
.leftJoinAndSelect("memberEducations.education", "education")
.where("memberEducations.memberId = :memberId", { memberId: memberId })
.andWhere("memberEducations.id = :recordId", { recordId: recordId })
.getOneOrFail()
.then((res) => {
return res;
})
.catch((err) => {
throw new DatabaseActionException("SELECT", "memberEducations", err);
});
}
}

View file

@ -1,9 +1,8 @@
import { Brackets, Like, Not, SelectQueryBuilder } from "typeorm";
import { Brackets, ILike, Not, SelectQueryBuilder } from "typeorm";
import { dataSource } from "../../../data-source";
import { member } from "../../../entity/club/member/member";
import DatabaseActionException from "../../../exceptions/databaseActionException";
import { memberView } from "../../../views/memberView";
import { DB_TYPE } from "../../../env.defaults";
export default abstract class MemberService {
/**
@ -30,10 +29,12 @@ export default abstract class MemberService {
if (searchBits.length < 2) {
query = query.where(
`member.firstname LIKE :searchQuery OR member.lastname LIKE :searchQuery OR member.internalId LIKE :searchQuery`,
{
searchQuery: `%${searchBits[0]}%`,
}
new Brackets((qb) =>
qb
.where({ firstname: ILike(`%${searchBits[0]}%`) })
.orWhere({ lastname: ILike(`%${searchBits[0]}%`) })
.orWhere({ internalId: ILike(`%${searchBits[0]}%`) })
)
);
} else {
searchBits
@ -42,12 +43,12 @@ export default abstract class MemberService {
query = query
.orWhere(
new Brackets((qb) =>
qb.where({ firstname: Like(`%${term[0]}%`) }).andWhere({ lastname: Like(`%${term[1]}%`) })
qb.where({ firstname: ILike(`%${term[0]}%`) }).andWhere({ lastname: ILike(`%${term[1]}%`) })
)
)
.orWhere(
new Brackets((qb) =>
qb.where({ firstname: Like(`%${term[1]}%`) }).andWhere({ lastname: Like(`%${term[0]}%`) })
qb.where({ firstname: ILike(`%${term[1]}%`) }).andWhere({ lastname: ILike(`%${term[0]}%`) })
)
);
});
@ -192,17 +193,13 @@ export default abstract class MemberService {
"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)"
'membership_first.memberId = member.id AND membership_first.start = (SELECT MIN("m_first"."start") FROM "membership" "m_first" WHERE "m_first"."memberId" = "member"."id")'
)
.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)"
'membership_last.memberId = member.id AND membership_last.start = (SELECT MAX("m_last"."start") FROM "membership" "m_last" WHERE "m_last"."memberId" = "member"."id")'
)
.leftJoinAndSelect("membership_first.status", "status_first")
.leftJoinAndSelect("membership_last.status", "status_last")

View file

@ -2,7 +2,7 @@ import { dataSource } from "../../../data-source";
import { membership } from "../../../entity/club/member/membership";
import DatabaseActionException from "../../../exceptions/databaseActionException";
import InternalException from "../../../exceptions/internalException";
import { membershipView } from "../../../views/membershipsView";
import { membershipTotalView, membershipView } from "../../../views/membershipsView";
export default abstract class MembershipService {
/**
@ -66,4 +66,23 @@ export default abstract class MembershipService {
throw new DatabaseActionException("SELECT", "membershipView", err);
});
}
/**
* @description get membership total statistics by memberId
* @param {string} memberId
* @returns {Promise<Array<membershipTotalView>>}
*/
static async getTotalStatisticsById(memberId: string): Promise<membershipTotalView> {
return await dataSource
.getRepository(membershipTotalView)
.createQueryBuilder("membershipTotalView")
.where("membershipTotalView.memberId = :memberId", { memberId: memberId })
.getOneOrFail()
.then((res) => {
return res;
})
.catch((err) => {
throw new DatabaseActionException("SELECT", "membershipTotalView", err);
});
}
}

View file

@ -12,6 +12,7 @@ export default abstract class NewsletterService {
return await dataSource
.getRepository(newsletter)
.createQueryBuilder("newsletter")
.orderBy("createdAt", "DESC")
.offset(offset)
.limit(count)
.getManyAndCount()

View file

@ -0,0 +1,41 @@
import { dataSource } from "../../data-source";
import { education } from "../../entity/configuration/education";
import DatabaseActionException from "../../exceptions/databaseActionException";
export default abstract class EducationService {
/**
* @description get all educations
* @returns {Promise<Array<education>>}
*/
static async getAll(): Promise<Array<education>> {
return await dataSource
.getRepository(education)
.createQueryBuilder("education")
.orderBy("education", "ASC")
.getMany()
.then((res) => {
return res;
})
.catch((err) => {
throw new DatabaseActionException("SELECT", "education", err);
});
}
/**
* @description get education by id
* @returns {Promise<education>}
*/
static async getById(id: number): Promise<education> {
return await dataSource
.getRepository(education)
.createQueryBuilder("education")
.where("education.id = :id", { id: id })
.getOneOrFail()
.then((res) => {
return res;
})
.catch((err) => {
throw new DatabaseActionException("SELECT", "education", err);
});
}
}