From 1c6fb79e752dbff68ba3da4cdbb3e8907ad6cb7e Mon Sep 17 00:00:00 2001 From: Gbuntu Date: Sat, 4 Nov 2023 11:20:14 +0330 Subject: [PATCH] some 4th column myP{age fix --- src/db/data-source.ts | 2 + src/features/family/family.controller.ts | 39 + src/features/family/family.service.ts | 19 +- src/features/mail/mail.module.ts | 3 +- src/features/mail/mail.service.ts | 253 +-- .../mail/templates/monthlySummary.hbs | 1537 ++--------------- src/features/mine/mine.module.ts | 8 +- src/features/need/need.service.ts | 14 +- src/features/schedule/schedule.module.ts | 8 +- src/features/schedule/schedule.service.ts | 2 +- src/features/user/user.controller.ts | 6 +- src/features/user/user.service.ts | 33 +- src/utils/helpers.ts | 20 + 13 files changed, 370 insertions(+), 1574 deletions(-) diff --git a/src/db/data-source.ts b/src/db/data-source.ts index 6d054a4ee..557183770 100644 --- a/src/db/data-source.ts +++ b/src/db/data-source.ts @@ -25,6 +25,7 @@ import { EthereumAccountEntity } from '../entities/ethereum.account.entity'; import config from '../config'; import { AllUserEntity } from 'src/entities/user.entity'; import { ChildrenPreRegisterEntity } from 'src/entities/childrenPreRegister.entity'; +import { ContributionEntity } from 'src/entities/contribution.entity'; export const postgresDataSourceOptions: DataSourceOptions = { ...config().db1, @@ -55,6 +56,7 @@ export const postgresDataSourceOptions: DataSourceOptions = { MidjourneyEntity, CommentEntity, ChildrenPreRegisterEntity, + ContributionEntity, ], }; diff --git a/src/features/family/family.controller.ts b/src/features/family/family.controller.ts index c7b5921a1..dcc74be55 100644 --- a/src/features/family/family.controller.ts +++ b/src/features/family/family.controller.ts @@ -3,6 +3,7 @@ import { ForbiddenException, Get, Param, + Patch, Req, } from '@nestjs/common'; import { FamilyService } from './family.service'; @@ -29,6 +30,7 @@ import { ServerError } from 'src/filters/server-exception.filter'; import { PaymentService } from '../payment/payment.service'; import { NeedService } from '../need/need.service'; import { isAuthenticated } from 'src/utils/auth'; +import { UserService } from '../user/user.service'; @ApiTags('Family') @ApiSecurity('flask-access-token') @@ -41,6 +43,7 @@ import { isAuthenticated } from 'src/utils/auth'; export class FamilyController { constructor( private readonly familyService: FamilyService, + private userService: UserService, private childrenService: ChildrenService, private needService: NeedService, private paymentService: PaymentService, @@ -496,4 +499,40 @@ export class FamilyController { }, }; } + + @Get(`email/status`) + @ApiOperation({ description: 'Get all contributors' }) + async getEmailStatus(@Req() req: Request) { + const dappFlaskUserId = req.headers['dappFlaskUserId']; + if (dappFlaskUserId) { + if (!isAuthenticated(dappFlaskUserId, FlaskUserTypesEnum.FAMILY)) { + throw new ForbiddenException(403, 'You Are not authorized'); + } + } + let nestFamilyMember = await this.userService.getFamilyByFlaskId( + dappFlaskUserId, + ); + if (!nestFamilyMember) { + nestFamilyMember = await this.userService.createFamily(dappFlaskUserId); + } + return nestFamilyMember.monthlyEmail; + } + + @Patch(`email/status`) + @ApiOperation({ description: 'Get all contributors' }) + async updateEmailStatus(@Req() req: Request) { + const dappFlaskUserId = req.headers['dappFlaskUserId']; + if (dappFlaskUserId) { + if (!isAuthenticated(dappFlaskUserId, FlaskUserTypesEnum.FAMILY)) { + throw new ForbiddenException(403, 'You Are not authorized'); + } + } + let nestFamilyMember = await this.userService.getFamilyByFlaskId( + dappFlaskUserId, + ); + if (!nestFamilyMember) { + nestFamilyMember = await this.userService.createFamily(dappFlaskUserId); + } + return await this.familyService.updateEmailMarketing(nestFamilyMember); + } } diff --git a/src/features/family/family.service.ts b/src/features/family/family.service.ts index 87f5e72f5..9508577f3 100644 --- a/src/features/family/family.service.ts +++ b/src/features/family/family.service.ts @@ -6,7 +6,7 @@ import { } from 'src/types/interfaces/interface'; import { InjectRepository } from '@nestjs/typeorm'; import { Need } from 'src/entities/flaskEntities/need.entity'; -import { And, ArrayContains, IsNull, Not, Repository } from 'typeorm'; +import { And, IsNull, Not, Repository, UpdateResult } from 'typeorm'; import { Payment } from 'src/entities/flaskEntities/payment.entity'; import { Child } from 'src/entities/flaskEntities/child.entity'; import { User } from 'src/entities/flaskEntities/user.entity'; @@ -14,15 +14,15 @@ import { UserFamily } from 'src/entities/flaskEntities/userFamily.entity'; import { Family } from 'src/entities/flaskEntities/family.entity'; import { NeedEntity } from 'src/entities/need.entity'; import { NeedFamily } from 'src/entities/flaskEntities/needFamily'; -import { PaymentEntity } from 'src/entities/payment.entity'; +import { AllUserEntity } from 'src/entities/user.entity'; @Injectable() export class FamilyService { constructor( @InjectRepository(NeedEntity) private needRepository: Repository, - @InjectRepository(PaymentEntity) - private paymentRepository: Repository, + @InjectRepository(AllUserEntity) + private allUserRepository: Repository, @InjectRepository(Need, 'flaskPostgres') private flaskNeedRepository: Repository, @InjectRepository(User, 'flaskPostgres') @@ -134,7 +134,9 @@ export class FamilyService { statusNotPaid: PaymentStatusEnum.COMPLETE_PAY, }) .andWhere('need.isDeleted = :needDeleted', { needDeleted: false }) - .andWhere(userId > 0 && `payment.id_user = :pUserId`, { pUserId: userId }) + .andWhere(userId > 0 && `payment.id_user = :pUserId`, { + pUserId: userId, + }) .andWhere(userId > 0 && `needFamily.id_user = :nUserId`, { nUserId: userId, }) @@ -291,4 +293,11 @@ export class FamilyService { .cache(10000) .getMany(); } + + async updateEmailMarketing(user: AllUserEntity): Promise { + const newStatus = user.monthlyEmail ? false : true; + return this.allUserRepository.update(user.id, { + monthlyEmail: newStatus, + }); + } } diff --git a/src/features/mail/mail.module.ts b/src/features/mail/mail.module.ts index 99857a6a5..d7f135abc 100644 --- a/src/features/mail/mail.module.ts +++ b/src/features/mail/mail.module.ts @@ -36,7 +36,7 @@ import { UserFamily } from 'src/entities/flaskEntities/userFamily.entity'; // or transport: { host: config.get('MAIL_HOST'), - secure: false, + secure: true, auth: { user: config.get('MAIL_FROM'), pass: config.get('MAIL_PASSWORD'), @@ -69,6 +69,7 @@ import { UserFamily } from 'src/entities/flaskEntities/userFamily.entity'; ChildrenPreRegisterEntity, SignatureEntity, PaymentEntity, + AllUserEntity, ]), ], providers: [ diff --git a/src/features/mail/mail.service.ts b/src/features/mail/mail.service.ts index 822d6c324..3ede93d43 100644 --- a/src/features/mail/mail.service.ts +++ b/src/features/mail/mail.service.ts @@ -4,9 +4,13 @@ import { UserService } from '../user/user.service'; import { ServerError } from 'src/filters/server-exception.filter'; import { ChildrenService } from '../children/children.service'; import { NeedService } from '../need/need.service'; -import { prepareUrl } from 'src/utils/helpers'; +import { prepareUrl, shuffleArray } from 'src/utils/helpers'; import { WalletService } from '../wallet/wallet.service'; -import { NeedTypeEnum } from 'src/types/interfaces/interface'; +import { + ChildExistence, + NeedTypeEnum, + PaymentStatusEnum, +} from 'src/types/interfaces/interface'; import { MineService } from '../mine/mine.service'; import { FamilyService } from '../family/family.service'; @@ -17,204 +21,89 @@ export class MailService { private needService: NeedService, private userService: UserService, private familyService: FamilyService, - private walletService: WalletService, - private mineService: MineService, private childrenService: ChildrenService, ) {} async sendUserSummaries() { - let sayName1: string; - let avatar1: string; - let childId1: number; - let needId11: number; - let needName11: string; - let needImage11: string; - let needPrice11: number; - let needId12: number; - let needName12: string; - let needImage12: string; - let needPrice12: number; - let needId13: number; - let needName13: string; - let needImage13: string; - let needPrice13: number; - let sayName2: string; - let avatar2: string; - let childId2: number; - let needId21: number; - let needName21: string; - let needImage21: string; - let needPrice21: number; - let needId22: number; - let needName22: string; - let needImage22: string; - let needPrice22: number; - let needId23: number; - let needName23: string; - let needImage23: string; - let needPrice23: number; - let signatureId1: string; - let signatureImage1: string; - let signatureName1: string; - let signatureId2: string; - let signatureImage2: string; - let signatureName2: string; - const users = await this.userService.getFlaskUsers(); try { - const ehsan = users.find((u) => u.userName === 'ehsan'); - let nestUser = await this.userService.getFamilyByFlaskId(ehsan.id); + // for await (const user of shuffleArray(users)) { + const user = users.find((u) => u.userName === 'ehsan'); + let nestUser = await this.userService.getFamilyByFlaskId(user.id); if (!nestUser) { - nestUser = await this.userService.createFamily(ehsan.id); + nestUser = await this.userService.createFamily(user.id); } - if (!nestUser.monthlyEmail) { - const children = await this.childrenService.getMyChildren(ehsan.id); + const myChildren = []; + if (nestUser.monthlyEmail) { const readyToSignNeeds = ( - await this.familyService.getFamilyReadyToSignNeeds(ehsan.id) + await this.familyService.getFamilyReadyToSignNeeds(user.id) ).filter((n) => n.midjourneyImage); - // signatures - if (readyToSignNeeds[0]) { - signatureId1 = readyToSignNeeds[0].id; - signatureImage1 = `https://raw.githubusercontent.com/SAY-DAO/midjourney-bot/main/main/need-images/${readyToSignNeeds[0].midjourneyImage}`; - signatureName1 = readyToSignNeeds[0].name; - } - if (readyToSignNeeds[1]) { - signatureId2 = readyToSignNeeds[1].id; - signatureImage2 = `https://raw.githubusercontent.com/SAY-DAO/midjourney-bot/main/main/need-images/${readyToSignNeeds[1].midjourneyImage}`; - signatureName2 = readyToSignNeeds[1].name; - } + const children = ( + await this.childrenService.getMyChildren(user.id) + ).filter((c) => c.existence_status === ChildExistence.AlivePresent); + console.log(children.length); - let counter = 1; - for await (const child of children) { - const childNeeds = await this.needService.getFlaskChildNeeds( - child.id, - ); + for await (const child of shuffleArray(children)) { + if (myChildren.length < 3) { + const childUnpaidNeeds = + await this.needService.getFlaskChildUnpaidNeeds(child.id); + const shuffledNeeds = shuffleArray(childUnpaidNeeds); + const partialPayment = shuffledNeeds.find( + (n) => n.status === PaymentStatusEnum.PARTIAL_PAY, + ); + const noPayments = shuffledNeeds.filter( + (n) => n.status === PaymentStatusEnum.NOT_PAID, + ); + if (partialPayment || noPayments[0]) { + const theChild = { + id: child.id, + sayName: child.sayname_translations.fa, + avatar: prepareUrl(child.awakeAvatarUrl), + unPaidNeeds: (partialPayment + ? [partialPayment, noPayments[0]] + : noPayments[1] + ? [noPayments[0], noPayments[1]] + : [noPayments[0]] + ).map((n) => { + return { + id: n.id, + name: n.name_translations.fa, + price: n._cost.toLocaleString(), + image: + n.type === NeedTypeEnum.PRODUCT + ? n.img + : prepareUrl(n.imageUrl), + }; + }), + }; - // Child One - if (counter === 1) { - sayName1 = child.sayname_translations.fa; - avatar1 = prepareUrl(child.awakeAvatarUrl); - childId1 = child.id; - for (let i = 0; i < 3; i++) { - if (childNeeds[0] && i === 0) { - needId11 = childNeeds[i].id; - needName11 = childNeeds[i].name_translations.fa; - needImage11 = - childNeeds[i].type === NeedTypeEnum.PRODUCT - ? childNeeds[i].img - : prepareUrl(childNeeds[i].imageUrl); - needPrice11 = childNeeds[i]._cost; - } - if (childNeeds[1] && i === 1) { - needId12 = childNeeds[i].id; - needName12 = childNeeds[i].name_translations.fa; - needImage12 = - childNeeds[i].type === NeedTypeEnum.PRODUCT - ? childNeeds[i].img - : prepareUrl(childNeeds[i].imageUrl); - needPrice12 = childNeeds[i]._cost; - } - if (childNeeds[2] && i === 2) { - needId13 = childNeeds[i].id; - needName13 = childNeeds[i].name_translations.fa; - needImage13 = - childNeeds[i].type === NeedTypeEnum.PRODUCT - ? childNeeds[i].img - : prepareUrl(childNeeds[i].imageUrl); - needPrice13 = childNeeds[i]._cost; - } - } - // Child Two - } else if (counter === 2) { - sayName2 = child.sayname_translations.fa; - avatar2 = prepareUrl(child.awakeAvatarUrl); - childId2 = child.id; - for (let i = 0; i < 3; i++) { - if (childNeeds[0] && i === 0) { - needId21 = childNeeds[i].id; - needName21 = childNeeds[i].name_translations.fa; - needImage21 = - childNeeds[i].type === NeedTypeEnum.PRODUCT - ? childNeeds[i].img - : prepareUrl(childNeeds[i].imageUrl); - needPrice21 = childNeeds[i]._cost; - } - if (childNeeds[1] && i === 1) { - needId22 = childNeeds[i].id; - needName22 = childNeeds[i].name_translations.fa; - needImage22 = - childNeeds[i].type === NeedTypeEnum.PRODUCT - ? childNeeds[i].img - : prepareUrl(childNeeds[i].imageUrl); - needPrice22 = childNeeds[i]._cost; - } - if (childNeeds[2] && i === 2) { - needId23 = childNeeds[i].id; - needName23 = childNeeds[i].name_translations.fa; - needImage23 = - childNeeds[i].type === NeedTypeEnum.PRODUCT - ? childNeeds[i].img - : prepareUrl(childNeeds[i].imageUrl); - needPrice23 = childNeeds[i]._cost; - } + myChildren.push(theChild); + } else { + continue; } } - counter++; } - await this.mailerService.sendMail({ - to: ehsan.emailAddress, - // from: '"Support Team" ', // override default from - subject: 'نیازهای این ماه کودکان شما', - template: './monthlySummary', // `.hbs` extension is appended automatically - context: { - readyToSignNeeds, - // signatureCounter, - // childrenCounter, - // childNeedCounter1, - // childNeedCounter2, - sayName1, - avatar1, - childId1, - needId11, - needName11, - needImage11, - needPrice11: needPrice11 && needPrice11.toLocaleString(), - needId12, - needName12, - needImage12, - needPrice12: needPrice12 && needPrice12.toLocaleString(), - needId13, - needName13, - needImage13, - needPrice13: needPrice13 && needPrice13.toLocaleString(), - - sayName2, - avatar2, - childId2, - needId21, - needName21, - needImage21, - needPrice21: needPrice21 && needPrice21.toLocaleString(), - needId22, - needName22, - needImage22, - needPrice22: needPrice22 && needPrice22.toLocaleString(), - needId23, - needName23, - needImage23, - needPrice23: needPrice23 && needPrice23.toLocaleString(), - - signatureId1, - signatureImage1, - signatureName1, - signatureId2, - signatureImage2, - signatureName2, - }, - }); + // await this.mailerService.sendMail({ + // to: user.emailAddress, + // // from: '"Support Team" ', // override default from + // subject: 'نیازهای این ماه کودکان شما', + // template: './monthlySummary', // `.hbs` extension is appended automatically + // context: { + // readyToSignNeeds, + // myChildren, + // }, + // }); } + console.log('here'); + console.log(user.id); + + console.log(myChildren.length); + console.log(nestUser.monthlyEmail); + + console.log('-----------------'); + // } } catch (e) { console.log(e); throw new ServerError('Cold not send email!'); diff --git a/src/features/mail/templates/monthlySummary.hbs b/src/features/mail/templates/monthlySummary.hbs index 58bb2f251..d1fd20344 100644 --- a/src/features/mail/templates/monthlySummary.hbs +++ b/src/features/mail/templates/monthlySummary.hbs @@ -31,7 +31,7 @@