Merge pull request 'sms alarming flag' (#19) from #18-mark-member-phone-as-sms-alarming into main
Reviewed-on: Ehrenamt/member-administration-server#19
This commit is contained in:
commit
a24a9cdc7f
14 changed files with 90 additions and 3 deletions
|
@ -1,5 +1,6 @@
|
|||
export interface CreateCommunicationCommand {
|
||||
preferred: boolean;
|
||||
isSMSAlarming: boolean;
|
||||
mobile: string;
|
||||
email: string;
|
||||
city: string;
|
||||
|
@ -13,6 +14,7 @@ export interface CreateCommunicationCommand {
|
|||
export interface UpdateCommunicationCommand {
|
||||
id: number;
|
||||
preferred: boolean;
|
||||
isSMSAlarming: boolean;
|
||||
mobile: string;
|
||||
email: string;
|
||||
city: string;
|
||||
|
|
|
@ -22,6 +22,7 @@ export default abstract class CommunicationCommandHandler {
|
|||
.into(communication)
|
||||
.values({
|
||||
preferred: createCommunication.preferred,
|
||||
isSMSAlarming: createCommunication.isSMSAlarming,
|
||||
mobile: createCommunication.mobile,
|
||||
email: createCommunication.email,
|
||||
city: createCommunication.city,
|
||||
|
@ -59,6 +60,7 @@ export default abstract class CommunicationCommandHandler {
|
|||
.update(communication)
|
||||
.set({
|
||||
preferred: updateCommunication.preferred,
|
||||
isSMSAlarming: updateCommunication.isSMSAlarming,
|
||||
mobile: updateCommunication.mobile,
|
||||
email: updateCommunication.email,
|
||||
city: updateCommunication.city,
|
||||
|
|
|
@ -68,7 +68,6 @@ export default abstract class MemberCommandHandler {
|
|||
* @returns {Promise<void>}
|
||||
*/
|
||||
static async updateNewsletter(updateMember: UpdateMemberNewsletterCommand): Promise<void> {
|
||||
console.log(updateMember);
|
||||
return await dataSource
|
||||
.createQueryBuilder()
|
||||
.update(member)
|
||||
|
@ -88,6 +87,26 @@ export default abstract class MemberCommandHandler {
|
|||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @description update member newsletter to unset
|
||||
* @param memberId string
|
||||
* @returns {Promise<void>}
|
||||
*/
|
||||
static async unsetNewsletter(memberId: number): Promise<void> {
|
||||
return await dataSource
|
||||
.createQueryBuilder()
|
||||
.update(member)
|
||||
.set({
|
||||
sendNewsletter: null,
|
||||
})
|
||||
.where("id = :id", { id: memberId })
|
||||
.execute()
|
||||
.then(() => {})
|
||||
.catch((err) => {
|
||||
throw new InternalException("Failed updating member", err);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @description delete member
|
||||
* @param DeleteMemberCommand
|
||||
|
|
|
@ -346,6 +346,7 @@ export async function addExecutivePositionToMember(req: Request, res: Response):
|
|||
export async function addCommunicationToMember(req: Request, res: Response): Promise<any> {
|
||||
const memberId = parseInt(req.params.memberId);
|
||||
const preferred = req.body.preferred;
|
||||
const isSMSAlarming = req.body.isSMSAlarming;
|
||||
const mobile = req.body.mobile;
|
||||
const email = req.body.email;
|
||||
const city = req.body.city;
|
||||
|
@ -357,6 +358,7 @@ export async function addCommunicationToMember(req: Request, res: Response): Pro
|
|||
|
||||
let createCommunication: CreateCommunicationCommand = {
|
||||
preferred,
|
||||
isSMSAlarming,
|
||||
mobile,
|
||||
email,
|
||||
city,
|
||||
|
@ -528,6 +530,7 @@ export async function updateCommunicationOfMember(req: Request, res: Response):
|
|||
const memberId = parseInt(req.params.memberId);
|
||||
const recordId = parseInt(req.params.recordId);
|
||||
const preferred = req.body.preferred;
|
||||
const isSMSAlarming = req.body.isSMSAlarming;
|
||||
const mobile = req.body.mobile;
|
||||
const email = req.body.email;
|
||||
const city = req.body.city;
|
||||
|
@ -540,6 +543,7 @@ export async function updateCommunicationOfMember(req: Request, res: Response):
|
|||
let updateCommunication: UpdateCommunicationCommand = {
|
||||
id: recordId,
|
||||
preferred,
|
||||
isSMSAlarming,
|
||||
mobile,
|
||||
email,
|
||||
city,
|
||||
|
@ -550,12 +554,16 @@ export async function updateCommunicationOfMember(req: Request, res: Response):
|
|||
};
|
||||
await CommunicationCommandHandler.update(updateCommunication);
|
||||
|
||||
let currentUserNewsletterMain = await MemberService.getNewsletterById(memberId);
|
||||
|
||||
if (isNewsletterMain) {
|
||||
let updateNewsletter: UpdateMemberNewsletterCommand = {
|
||||
id: memberId,
|
||||
communicationId: recordId,
|
||||
};
|
||||
await MemberCommandHandler.updateNewsletter(updateNewsletter);
|
||||
} else if (currentUserNewsletterMain.sendNewsletter.id == recordId) {
|
||||
await MemberCommandHandler.unsetNewsletter(memberId);
|
||||
}
|
||||
|
||||
res.sendStatus(204);
|
||||
|
|
|
@ -42,6 +42,7 @@ import { calendarType } from "./entity/calendarType";
|
|||
import { Calendar1729947763295 } from "./migrations/1729947763295-calendar";
|
||||
import { reset } from "./entity/reset";
|
||||
import { ResetToken1732358596823 } from "./migrations/1732358596823-resetToken";
|
||||
import { SMSAlarming1732696919191 } from "./migrations/1732696919191-SMSAlarming";
|
||||
|
||||
const dataSource = new DataSource({
|
||||
type: DB_TYPE as any,
|
||||
|
@ -94,6 +95,7 @@ const dataSource = new DataSource({
|
|||
Protocol1729347911107,
|
||||
Calendar1729947763295,
|
||||
ResetToken1732358596823,
|
||||
SMSAlarming1732696919191,
|
||||
],
|
||||
migrationsRun: true,
|
||||
migrationsTransactionMode: "each",
|
||||
|
|
|
@ -10,6 +10,9 @@ export class communication {
|
|||
@Column({ type: "boolean", default: false })
|
||||
preferred: boolean;
|
||||
|
||||
@Column({ type: "boolean", default: false })
|
||||
isSMSAlarming: boolean;
|
||||
|
||||
@Column({ type: "varchar", length: 255, nullable: true })
|
||||
mobile: string;
|
||||
|
||||
|
|
|
@ -65,4 +65,5 @@ export class member {
|
|||
firstMembershipEntry?: membership;
|
||||
lastMembershipEntry?: membership;
|
||||
preferredCommunication?: Array<communication>;
|
||||
smsAlarming?: Array<communication>;
|
||||
}
|
||||
|
|
|
@ -20,6 +20,7 @@ export default abstract class CommunicationFactory {
|
|||
streetNumberAddition: record.streetNumberAddition,
|
||||
type: CommunicationTypeFactory.mapToSingle(record.type),
|
||||
isNewsletterMain: isMain ? isMain : record?.member?.sendNewsletter?.id == record.id,
|
||||
isSMSAlarming: record.isSMSAlarming,
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -27,6 +27,7 @@ export default abstract class MemberFactory {
|
|||
preferredCommunication: record?.preferredCommunication
|
||||
? CommunicationFactory.mapToBase(record.preferredCommunication)
|
||||
: null,
|
||||
smsAlarming: record?.smsAlarming ? CommunicationFactory.mapToBase(record.smsAlarming) : null,
|
||||
};
|
||||
}
|
||||
|
||||
|
|
21
src/migrations/1732696919191-SMSAlarming.ts
Normal file
21
src/migrations/1732696919191-SMSAlarming.ts
Normal file
|
@ -0,0 +1,21 @@
|
|||
import { MigrationInterface, QueryRunner, TableColumn } from "typeorm";
|
||||
|
||||
export class SMSAlarming1732696919191 implements MigrationInterface {
|
||||
name = "SMSAlarming1732696919191";
|
||||
|
||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||
await queryRunner.addColumn(
|
||||
"communication",
|
||||
new TableColumn({
|
||||
name: "isSMSAlarming",
|
||||
type: "tinyint",
|
||||
default: 0,
|
||||
isNullable: false,
|
||||
})
|
||||
);
|
||||
}
|
||||
|
||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||
await queryRunner.dropColumn("communication", "isSMSAlarming");
|
||||
}
|
||||
}
|
|
@ -56,6 +56,6 @@ export default abstract class CommunicationService {
|
|||
static getAvailableColumnsForCommunication(): Array<string> {
|
||||
let metadata = dataSource.getMetadata(communication);
|
||||
let columns = metadata.columns.map((c) => c.propertyName);
|
||||
return columns.filter((c) => !["id", "preferred", "type", "member"].includes(c));
|
||||
return columns.filter((c) => !["id", "preferred", "isSMSAlarming", "type", "member"].includes(c));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -35,6 +35,8 @@ export default abstract class MemberService {
|
|||
"preferredCommunication.preferred = 1"
|
||||
)
|
||||
.leftJoinAndSelect("preferredCommunication.type", "communicationtype_preferred")
|
||||
.leftJoinAndMapMany("member.smsAlarming", "member.communications", "smsAlarming", "smsAlarming.isSMSAlarming = 1")
|
||||
.leftJoinAndSelect("smsAlarming.type", "communicationtype_smsAlarming")
|
||||
.offset(offset)
|
||||
.limit(count)
|
||||
.orderBy("member.lastname")
|
||||
|
@ -52,7 +54,7 @@ export default abstract class MemberService {
|
|||
/**
|
||||
* @description get member by id
|
||||
* @param {number} id
|
||||
* @returns {Promise<Array<member>>}
|
||||
* @returns {Promise<member>}
|
||||
*/
|
||||
static async getById(id: number): Promise<member> {
|
||||
return await dataSource
|
||||
|
@ -80,6 +82,9 @@ export default abstract class MemberService {
|
|||
"preferredCommunication",
|
||||
"preferredCommunication.preferred = 1"
|
||||
)
|
||||
|
||||
.leftJoinAndMapMany("member.smsAlarming", "member.communications", "smsAlarming", "smsAlarming.isSMSAlarming = 1")
|
||||
.leftJoinAndSelect("smsAlarming.type", "communicationtype_smsAlarming")
|
||||
.leftJoinAndSelect("preferredCommunication.type", "communicationtype_preferred")
|
||||
.where("member.id = :id", { id: id })
|
||||
.getOneOrFail()
|
||||
|
@ -90,4 +95,24 @@ export default abstract class MemberService {
|
|||
throw new InternalException("member not found by id", err);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @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);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
@ -11,4 +11,5 @@ export interface CommunicationViewModel {
|
|||
streetNumberAddition: string;
|
||||
type: CommunicationTypeViewModel;
|
||||
isNewsletterMain: boolean;
|
||||
isSMSAlarming: boolean;
|
||||
}
|
||||
|
|
|
@ -12,5 +12,6 @@ export interface MemberViewModel {
|
|||
firstMembershipEntry?: MembershipViewModel;
|
||||
lastMembershipEntry?: MembershipViewModel;
|
||||
sendNewsletter?: CommunicationViewModel;
|
||||
smsAlarming?: Array<CommunicationViewModel>;
|
||||
preferredCommunication?: Array<CommunicationViewModel>;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue