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" ;
2025-02-07 09:35:57 +01:00
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" )
2025-01-25 16:37:52 +01:00
. leftJoinAndMapOne (
"member.sendNewsletter" ,
"member.communications" ,
"sendNewsletter" ,
2025-02-09 17:23:54 +01:00
"sendNewsletter.isSendNewsletter = true"
2025-01-25 16:37:52 +01:00
)
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" ,
2025-02-07 09:35:57 +01:00
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" ,
2025-02-07 09:35:57 +01:00
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" ,
2025-02-07 09:35:57 +01:00
"preferredCommunication.preferred = true"
2025-01-29 09:42:22 +01:00
)
. leftJoinAndSelect ( "preferredCommunication.type" , "communicationtype_preferred" )
. leftJoinAndMapOne (
"member.sendNewsletter" ,
"member.communications" ,
"sendNewsletter" ,
2025-02-07 09:35:57 +01:00
"sendNewsletter.isSendNewsletter = true"
2025-01-29 09:42:22 +01:00
)
. leftJoinAndSelect ( "sendNewsletter.type" , "communicationtype" )
2025-02-07 09:35:57 +01:00
. 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
}