Skip to content
Snippets Groups Projects
Commit 20fd741e authored by Hugo SUBTIL's avatar Hugo SUBTIL
Browse files

feat: add email sending for outdated structures

parent c9067895
No related branches found
No related tags found
3 merge requests!27Recette,!26Dev,!21feat: add email sending for outdated structures
......@@ -29,5 +29,9 @@ export const config = {
ejs: 'structureClaimValidation.ejs',
json: 'structureClaimValidation.json',
},
structureOutdatedInfo: {
ejs: 'structureOutdatedInfo.ejs',
json: 'structureOutdatedInfo.json',
},
},
};
Bonjour<br />
<br />
La fiche de votre structure: <strong><%= name %></strong> n'a pas été mise a jour depuis 6mois.
<br />
<br />
Ce mail est un mail automatique. Merci de ne pas y répondre.
{
"subject": "Votre fiche structure n'est plus a jour, Réseau des Acteurs de la Médiation Numérique de la Métropole de Lyon"
}
import { HttpException, HttpService, Injectable, HttpStatus } from '@nestjs/common';
import { HttpException, HttpService, Injectable, HttpStatus, Logger } from '@nestjs/common';
import { InjectModel } from '@nestjs/mongoose';
import { Types, Model } from 'mongoose';
import { Observable } from 'rxjs';
import { AxiosResponse } from 'axios';
import { Structure, StructureDocument } from '../schemas/structure.schema';
import { Logger } from '@nestjs/common';
import * as ejs from 'ejs';
import { structureDto } from '../dto/structure.dto';
import { UsersService } from '../../users/users.service';
import { User } from '../../users/schemas/user.schema';
import { MailerService } from '../../mailer/mailer.service';
import { Cron, CronExpression } from '@nestjs/schedule';
import { DateTime } from 'luxon';
@Injectable()
export class StructuresService {
constructor(
private readonly httpService: HttpService,
private readonly userService: UsersService,
private readonly mailerService: MailerService,
@InjectModel(Structure.name) private structureModel: Model<StructureDocument>
) {}
......@@ -201,4 +205,60 @@ export class StructuresService {
Logger.log(`Request : ${req}`, 'StructureService - getCoord');
return this.httpService.get(encodeURI(req));
}
@Cron(CronExpression.EVERY_DAY_AT_4AM)
public async checkOutdatedStructuresInfo(): Promise<void> {
const MONTH_OUTDATED = 2;
const structureList = await this.findAll();
const local = DateTime.local().setZone('Europe/Paris');
// Get outdated structures
const filteredList = structureList.filter((structure) => {
const updateDate = DateTime.fromFormat(structure.updatedAt.split(' GMT')[0], 'EEE MMM dd yyyy HH:mm:ss');
const diff = local.diff(updateDate, ['months']);
if (diff.values.months > MONTH_OUTDATED) {
return true;
}
});
// Get owners of outdated structures
const ownerList = await Promise.all(
filteredList.map(async (structure) => {
const owner = await this.userService.isStructureClaimed(structure._id.toString());
if (owner) {
return { structure: structure, owner: owner };
}
})
);
// Send email if possible and update user
ownerList
.filter((x) => x != undefined)
.forEach(async (data) => {
this.userService.findOne(data.owner.email).then((user) => {
// If mail is already sent, do not resend
if (user.structureOutdatedMailSent.includes(data.structure._id)) {
return;
} else {
this.sendOutdatedEmailToUser(data.owner.email, data.structure.structureName);
user.structureOutdatedMailSent.push(data.structure._id);
user.save();
}
});
});
}
/**
* Generate activation token and send it to user by email, in order to validate
* a new account.
* @param user User
*/
private async sendOutdatedEmailToUser(userEmail: string, structureName: string): Promise<any> {
const config = this.mailerService.config;
const ejsPath = this.mailerService.getTemplateLocation(config.templates.structureOutdatedInfo.ejs);
const jsonConfig = this.mailerService.loadJsonConfig(config.templates.structureOutdatedInfo.json);
const html = await ejs.renderFile(ejsPath, {
config,
name: structureName,
});
this.mailerService.send(userEmail, jsonConfig.subject, html);
}
}
......@@ -15,4 +15,5 @@ export interface IUser extends Document {
newEmail: string;
structuresLink: string[];
pendingStructuresLink: string[];
structureOutdatedMailSent: string[];
}
......@@ -40,6 +40,9 @@ export class User {
@Prop({ default: null })
pendingStructuresLink: string[];
@Prop({ default: null })
structureOutdatedMailSent: string[];
}
export const UserSchema = SchemaFactory.createForClass(User);
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment