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

Merge branch 'recette' into 'master'

Recette

See merge request web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_server!38
parents 390f6802 517c96b9
No related branches found
No related tags found
2 merge requests!45Dev,!38Recette
Showing
with 234 additions and 68 deletions
......@@ -2,6 +2,38 @@
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
## [1.5.0](https://forge.grandlyon.com///compare/v1.4.0...v1.5.0) (2021-02-25)
### Features
* add ghost stack ([98e4254](https://forge.grandlyon.com///commit/98e4254ae9cc6c5f91bc7e7ab310b85b52111c33))
* add name and surname in token ([4a125a1](https://forge.grandlyon.com///commit/4a125a1b4f776baaaa6a7142f4ccc4fe46014f93))
* add post endpoint and update swagger declaration to allow auth ([d450d44](https://forge.grandlyon.com///commit/d450d44c79acda0262f74e3093a384822f6be733))
* add startup script for test users ([8d06a19](https://forge.grandlyon.com///commit/8d06a19f4a9c28465a561d720ad5c53db2ee2479))
* add temp-user handling for structure join ([9560829](https://forge.grandlyon.com///commit/95608291b11759847484efe9b94a1f81a02a3798))
* add user structure delete ([e592a89](https://forge.grandlyon.com///commit/e592a8979c96a5c03f5280eee21522b52329142b))
* move structureType to back ([22e0bd2](https://forge.grandlyon.com///commit/22e0bd2eaa6b336a77b4817ccee3d342d1f7d6fd))
* update config service for template handling + add structure join ([679f239](https://forge.grandlyon.com///commit/679f239edae90f714b60fd7a89e4f881fcc6d5dc))
### Bug Fixes
* add npm script for db init ([8c819fc](https://forge.grandlyon.com///commit/8c819fc5e250d54e26b9058457534f3f8ddbe1ef))
* add structure remove from userModel ([fd21790](https://forge.grandlyon.com///commit/fd2179074baef4f435092330ee9169cdae85f803))
* aptic structure accountVerified ([928bf58](https://forge.grandlyon.com///commit/928bf58b85e49d493e9f462d0fbe55cac21b7b81))
* aptic structure init + admin structurename for claim validation ([cef5451](https://forge.grandlyon.com///commit/cef545168d9bdd6346767a55fe985459ff81b606))
* delete structure ([451e004](https://forge.grandlyon.com///commit/451e0041f6c431c57938db34c507dbb48563e2bd))
* mail config + new url ([874b062](https://forge.grandlyon.com///commit/874b06236254fd6dc28df8fe060f3c0597d01913))
* MR conflicts ([ac18ce8](https://forge.grandlyon.com///commit/ac18ce82b3456198bb8f0f52638f386d303134ca))
* MR return + issue on delete owner endpoint ([1fb8047](https://forge.grandlyon.com///commit/1fb80471382d883db23909b4ae58beab05d1cfca))
* remove unused imports ([f2db14e](https://forge.grandlyon.com///commit/f2db14eb0bb98682dbb3c37610e88f800480f9d5))
* remove useless swagger auth ([bf89fbd](https://forge.grandlyon.com///commit/bf89fbd62873517fdb990a7a2b9126e296b0ddcd))
* user cration bug + structure find refacto ([25480d5](https://forge.grandlyon.com///commit/25480d585119ca6bef98dc4567cd63c8b273e980))
* user model structureid from string to objectid ([35fa953](https://forge.grandlyon.com///commit/35fa953761b6800426155d27595efaa26df0f47f))
* **form:** fix model ([f0d1df6](https://forge.grandlyon.com///commit/f0d1df6092c099a100256425c1ab4b640b48aaf6))
* **form:** fix structure ([af1b4fa](https://forge.grandlyon.com///commit/af1b4fac5fa2c370e53917dfe3271c3c60a55266))
## [1.4.0](https://forge.grandlyon.com///compare/v1.3.0...v1.4.0) (2021-02-01)
......
mongo admin -u root -p MONGO_ROOT_PASSWORD
use ram
db.structures.insertOne({"id":1,"numero":"26-190","dateDeCreation":"Mon Nov 16 2020 16:37:00 GMT+0100 (heure normale d’Europe centrale)","derniereModification":"Mon Nov 16 2020 16:38:00 GMT+0100 (heure normale d’Europe centrale)","nomDeLusager":"-","votreStructureEstElle":"Un établissement principal (siège social)","nomDeVotreStructure":"Maison de l'Emploi de Feyzin","description":"- Permanence de médiation numérique (sur rdv) les lundis; mardi, mercredi apres midi 13h30 - 17h30 et les vendredi matins 9h-12h - mise à disposition d'ordinateurs aux horaires d'ouverture de la structure lundi, mercredi, jeudi 9h-12h; 13h30-17h30 ; mardi 10h-12h 13h30- 17h30 et vendredi matin 9h-12H. - mise à disposition (sur rdv)de matériels pour suivre des formations / informations collectives à distance et participer à un entretien en visio - cours de code et entrainement en ligne sur rdv","activitesMaintenuesDansLeCadreDuConfinement":"Toutes les activités sont maintenues durant le confinement. Toutes nécessitent cependant de prendre rdv préalablement","n":"18","voie":"Rue de la Mairie","telephone":"04 72 21 46 66","courriel":"m.annequin@ville-feyzin.fr","siteWeb":"ville de Feyzin","facebook":"","twitter":"","instagram":"","civilite":"Madame","nom":"Annequin","prenom":"Muriel","fonction":"Directeur","accessibilitePersonnesAMobiliteReduitePmr":"True","modalitesDacces":["Accès libre","Sur RDV"],"pourLesRdv,MerciDePreciserSilEstNecessaireDapporterDesPiecesJustificativesOuDuMateriel.":"Si la personne n'est pas inscrite à la maison de l'emploi il lui sera demandé de s'inscrire.","labelsEtQualifications":[""],"publicsAcceptes":["Tout public"],"fermeturesExceptionnelles":"Jours fériés","jaccompagneLesUsagersDansLeursDemarchesEnLigne":"True","accompagnementDesDemarches":["Pôle Emploi","Accompagnant CAF"],"autresAccompagnements":"","lesCompetencesDeBase":[""],"accesAuxDroits":["176"],"insertionSocialeEtProfessionnelle":[""],"aideALaParentalite":[""],"cultureEtSecuriteNumerique":[""],"wifiEnAccesLibre":"True","ordinateurs":"True","nombre":"5","tablettes":"","bornesNumeriques":"","imprimantes":"True","precisionsSiNecessaire":"","statutJuridique":"","appartenezVousAUnReseauDeMediation":"","precisezLequel":"","idDeLitemStructureDansDirectus":"141","statutDeLitemStructureDansDirectus":"","idDeLitemOffreDansDirectus":"46","statut":"Versement des données offre","typeDeStructure":["Mairie"],"commune":"Feyzin","hours":{"monday":{"open":true,"time":[{"openning":900,"closing":1200},{"openning":1330,"closing":1730}]},"tuesday":{"open":true,"time":[{"openning":1000,"closing":1200},{"openning":1330,"closing":1730}]},"wednesday":{"open":true,"time":[{"openning":900,"closing":1200},{"openning":1330,"closing":1730}]},"thursday":{"open":true,"time":[{"openning":900,"closing":1200},{"openning":1330,"closing":1730}]},"friday":{"open":true,"time":[{"openning":900,"closing":1200},{"openning":null,"closing":null}]},"saturday":{"open":false,"time":[{"openning":null,"closing":null},{"openning":null,"closing":null}]},"sunday":{"open":false,"time":[{"openning":null,"closing":null},{"openning":null,"closing":null}]}}})
db.structures.insertOne({"id":2,"numero":"26-182","dateDeCreation":"Mon Nov 16 2020 15:15:00 GMT+0100 (heure normale d’Europe centrale)","derniereModification":"Tue Nov 17 2020 09:10:00 GMT+0100 (heure normale d’Europe centrale)","nomDeLusager":"-","votreStructureEstElle":"Un établissement principal (siège social)","nomDeVotreStructure":"Centre social Quartier Vitalité","description":"Le centre social s'inscrit dans une démarche d'animation de la vie sociale locale afin de permettre aux habitants d'exprimer, de concevoir, de réaliser leurs projets. C'est un lieu de proximité à vocation familiale et intergénérationnelle qui propose des activités sociales, éducatives et culturelles pour répondre aux besoins de chacun.","activitesMaintenuesDansLeCadreDuConfinement":"Aide aux démarches administratives et médiation numérique, sur rendez vous uniquement","n":"7","voie":"Rue Saint Polycarpe","telephone":"04.78.39.36.36","courriel":"aurebertherat@gmail.com","siteWeb":"www.centresocialquartiervitalite.i-citoyen.com","facebook":"","twitter":"","instagram":"","civilite":"Madame","nom":"BERTHERAT","prenom":"AURELIE","fonction":"Autres","accessibilitePersonnesAMobiliteReduitePmr":"True","modalitesDacces":["Téléphone / Visio","Sur RDV"],"pourLesRdv,MerciDePreciserSilEstNecessaireDapporterDesPiecesJustificativesOuDuMateriel.":"","labelsEtQualifications":[""],"publicsAcceptes":["Jeunes (16-25 ans)","Adultes","Séniors (+ de 65 ans)","Tout public"],"fermeturesExceptionnelles":"vacances de Noel + tout le mois d'Aout","jaccompagneLesUsagersDansLeursDemarchesEnLigne":"True","accompagnementDesDemarches":["Pôle Emploi","CPAM","Impôts","Logement","CARSAT","Accompagnant CAF"],"autresAccompagnements":"","lesCompetencesDeBase":["259","261","249","222","212","186","183","260"],"accesAuxDroits":["175","174","173","172","171","167","165","176"],"insertionSocialeEtProfessionnelle":["193","192","191","262","194"],"aideALaParentalite":["238","178","166","257"],"cultureEtSecuriteNumerique":["232","225","221","218","208","195","264"],"wifiEnAccesLibre":"","ordinateurs":"True","nombre":"3","tablettes":"","bornesNumeriques":"","imprimantes":"True","precisionsSiNecessaire":"Impression de documents uniquement en lien avec le rendez vous et l'accompagnement administratif de la personne","statutJuridique":"","appartenezVousAUnReseauDeMediation":"","precisezLequel":"","idDeLitemStructureDansDirectus":"140","statutDeLitemStructureDansDirectus":"","idDeLitemOffreDansDirectus":"","statut":"Erreur lors du versement des données offre","typeDeStructure":["Centre socio-culturel"],"commune":"Lyon 1","hours":{"monday":{"open":false,"time":[{"openning":null,"closing":null},{"openning":null,"closing":null}]},"tuesday":{"open":true,"time":[{"openning":1330,"closing":1700},{"openning":null,"closing":null}]},"wednesday":{"open":false,"time":[{"openning":null,"closing":null},{"openning":null,"closing":null}]},"thursday":{"open":true,"time":[{"openning":930,"closing":1200},{"openning":null,"closing":null}]},"friday":{"open":false,"time":[{"openning":null,"closing":null},{"openning":null,"closing":null}]},"saturday":{"open":false,"time":[{"openning":null,"closing":null},{"openning":null,"closing":null}]},"sunday":{"open":false,"time":[{"openning":null,"closing":null},{"openning":null,"closing":null}]}}})
db.structures.insertOne({"id":3,"numero":"26-181","dateDeCreation":"Mon Nov 16 2020 12:49:00 GMT+0100 (heure normale d’Europe centrale)","derniereModification":"Tue Nov 17 2020 09:12:00 GMT+0100 (heure normale d’Europe centrale)","nomDeLusager":"-","votreStructureEstElle":"Un établissement principal (siège social)","nomDeVotreStructure":"Centre socioculturel la Carnière","description":"Le centre socio-culturel la Carnière est une association développe dans le cadre de son projet des activités, des services et un soutien aux projets et initiatives ouvert à tous les habitants de la commune. En phase avec les enjeux du territoire, nous œuvrons plus particulièrement dans les domaines de l'accompagnement social et l'accès aux droits, le handicap, la fracture numérique, la parentalité et enfin auprès des personnes âgées.","activitesMaintenuesDansLeCadreDuConfinement":"- WEBTV pour garder le contact et proposer des activités à faire à la maison en direct en replay. - Accompagnement et médiation numérique (démarche en ligne, accès au droit...) - Handicap et numérique. - Entraide numérique sur rdv individuel (sortir d'un blocage, découvrir skype, zoom...) - Ateliers linguistiques via l'outil numérique. - Accompagnement scolaire à distance. - Conférence parentalité en visio.","n":"4","voie":"Montée de la Carnière","telephone":"0478206197","courriel":"contact@centresocial-lacarniere.fr ou numerique@centresocial-lacarniere.fr","siteWeb":"www.centresocial-lacarniere.fr","facebook":"","twitter":"","instagram":"","civilite":"Monsieur","nom":"Chanteperdrix Cyril ou Haouchet Karim","prenom":"","fonction":"Directeur","accessibilitePersonnesAMobiliteReduitePmr":"True","modalitesDacces":["Téléphone / Visio","Sur RDV"],"pourLesRdv,MerciDePreciserSilEstNecessaireDapporterDesPiecesJustificativesOuDuMateriel.":"ordinateur portable habituel.","labelsEtQualifications":["Pass numérique"],"publicsAcceptes":["Tout public"],"fermeturesExceptionnelles":"","jaccompagneLesUsagersDansLeursDemarchesEnLigne":"True","accompagnementDesDemarches":["Pôle Emploi","CPAM","Impôts","Logement","CARSAT","Accompagnant CAF"],"autresAccompagnements":"","lesCompetencesDeBase":["259","261","249","222","212","186","183","260"],"accesAuxDroits":["175","174","173","172","171","167","165","176"],"insertionSocialeEtProfessionnelle":[""],"aideALaParentalite":["178","166","257"],"cultureEtSecuriteNumerique":["255","232","225","221","218","208","195","164","163","162","264"],"wifiEnAccesLibre":"True","ordinateurs":"","nombre":"","tablettes":"","bornesNumeriques":"","imprimantes":"","precisionsSiNecessaire":"équipements informatiques fournis pour les formations","statutJuridique":"","appartenezVousAUnReseauDeMediation":"","precisezLequel":"","idDeLitemStructureDansDirectus":"143","statutDeLitemStructureDansDirectus":"","idDeLitemOffreDansDirectus":"","statut":"Erreur lors du versement des données offre","typeDeStructure":["Centre socio-culturel"],"commune":"Saint-Priest","hours":{"monday":{"open":true,"time":[{"openning":900,"closing":1800},{"openning":null,"closing":null}]},"tuesday":{"open":true,"time":[{"openning":1400,"closing":1730},{"openning":null,"closing":null}]},"wednesday":{"open":false,"time":[{"openning":null,"closing":null},{"openning":null,"closing":null}]},"thursday":{"open":true,"time":[{"openning":900,"closing":1800},{"openning":null,"closing":null}]},"friday":{"open":true,"time":[{"openning":900,"closing":1730},{"openning":null,"closing":null}]},"saturday":{"open":false,"time":[{"openning":null,"closing":null},{"openning":null,"closing":null}]},"sunday":{"open":false,"time":[{"openning":null,"closing":null},{"openning":null,"closing":null}]}}})
\ No newline at end of file
......@@ -6,6 +6,8 @@ services:
image: registry.forge.grandlyon.com/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_server:${TAG}
ports:
- ${SERVICE_API_BIND_PORT}:3000
extra_hosts:
- 'sen.grandlyon.com:10.128.16.229'
environment:
MONGO_NON_ROOT_USERNAME: ${MONGO_NON_ROOT_USERNAME}
MONGO_NON_ROOT_PASSWORD: ${MONGO_NON_ROOT_PASSWORD}
......
{
"name": "ram_server",
"version": "1.4.0",
"version": "1.5.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
......
{
"name": "ram_server",
"private": true,
"version": "1.4.0",
"version": "1.5.0",
"description": "Nest TypeScript starter repository",
"license": "MIT",
"scripts": {
......@@ -14,6 +14,7 @@
"start:prod": "node dist/main",
"lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
"release": "standard-version",
"init-db": "node ./scripts/init-db.js",
"test": "jest",
"test:watch": "jest --watch",
"test:cov": "jest --coverage",
......
// eslint-disable-next-line @typescript-eslint/no-var-requires
const mongoose = require('mongoose');
module.exports = {
data: [
{
pendingStructuresLink: [],
structuresLink: [
mongoose.Types.ObjectId('60059cf7dfb2ac4b00733db0'),
mongoose.Types.ObjectId('6001a48e16b08100062e4180'),
],
phone: '06 06 06 06 06',
newEmail: null,
changeEmailToken: null,
role: 1,
resetPasswordToken: null,
surname: 'ADMIN',
name: 'Admin',
validationToken: null,
emailVerified: true,
email: 'admin@admin.com',
structureOutdatedMailSent: [],
},
{
structureOutdatedMailSent: [],
pendingStructuresLink: [],
structuresLink: [mongoose.Types.ObjectId('6001a48e16b08100062e4180')],
newEmail: null,
changeEmailToken: null,
role: 0,
resetPasswordToken: null,
validationToken: null,
emailVerified: true,
email: 'paula.dubois@mii.com',
name: 'Paula',
surname: 'DUBOIS',
phone: '06 07 08 09 10',
},
{
structureOutdatedMailSent: [],
pendingStructuresLink: [],
structuresLink: [mongoose.Types.ObjectId('6001a48e16b08100062e4180')],
newEmail: null,
changeEmailToken: null,
role: 0,
resetPasswordToken: null,
validationToken: null,
emailVerified: true,
email: 'jp@test.com',
name: 'Jean-Paul',
surname: 'DESCHAMPS',
phone: '06 11 11 11 11',
},
],
};
// eslint-disable-next-line @typescript-eslint/no-var-requires
const mongoose = require('mongoose');
// eslint-disable-next-line @typescript-eslint/no-var-requires
const userData = require('./data/users');
// eslint-disable-next-line @typescript-eslint/no-var-requires
const bcrypt = require('bcrypt');
// eslint-disable-next-line @typescript-eslint/no-var-requires
const path = require('path');
// eslint-disable-next-line @typescript-eslint/no-var-requires
// const app = require(path.resolve(__dirname, './server'));
require('dotenv').config({ path: path.resolve(__dirname, '../.env') });
/* connect to the database */
const param =
'mongodb://' +
process.env.MONGO_NON_ROOT_USERNAME +
':' +
process.env.MONGO_NON_ROOT_PASSWORD +
'@' +
process.env.MONGO_DB_HOST_AND_PORT +
'/ram';
mongoose.connect(param, { useNewUrlParser: true, useUnifiedTopology: true }).catch((error) => console.log(error));
// Make Mongoose use `findOneAndUpdate()`. Note that this option is `true`
// by default, you need to set it to false.
mongoose.set('useFindAndModify', false);
function hashPassword() {
return bcrypt.hashSync(process.env.USER_PWD, process.env.SALT);
}
// define Schema
var usersSchema = mongoose.Schema({
name: String,
surname: String,
email: String,
emailVerified: Boolean,
validationToken: String,
resetPasswordToken: String,
role: Number,
changeEmailToken: String,
newEmail: String,
structuresLink: [],
structureOutdatedMailSent: [],
pendingStructuresLink: [],
password: String,
phone: String,
});
// compile schema to model
var User = mongoose.model('Users', usersSchema);
/* drop users collections */
mongoose.connection.dropCollection('users', function (err) {
/* show messages */
if (err) {
if (err.code === 26) console.log('-- Users collection does not exists --');
else throw err;
} else console.log('-- Users collection dropped --');
// Init passsword
console.log('-- Users password encryption based on .env --');
userData.data.forEach((user) => {
user.password = hashPassword();
});
// save model to database
User.create(userData.data, function (error, user) {
if (error) return console.error(error);
console.log('-- Users collection initialized --');
process.exit(0);
});
});
......@@ -16,8 +16,14 @@ export class AdminController {
@Roles('admin')
@Get('pendingStructures')
@ApiOperation({ description: 'Get pending structre for validation' })
public getPendingAttachments(): Promise<PendingStructureDto[]> {
return this.usersService.getPendingStructures();
public async getPendingAttachments(): Promise<PendingStructureDto[]> {
const pendingStructure = await this.usersService.getPendingStructures();
return await Promise.all(
pendingStructure.map(async (structure) => {
structure.structureName = (await this.structuresService.findOne(structure.structureId)).structureName;
return structure;
})
);
}
@UseGuards(JwtAuthGuard, RolesGuard)
......
......@@ -11,4 +11,9 @@ export class PendingStructureDto {
@IsString()
@ApiProperty({ type: String })
readonly structureId: string;
@IsNotEmpty()
@IsString()
@ApiProperty({ type: String })
structureName: string;
}
......@@ -11,6 +11,7 @@ import { MailerModule } from './mailer/mailer.module';
import { TclModule } from './tcl/tcl.module';
import { AdminModule } from './admin/admin.module';
import { PostsModule } from './posts/posts.module';
import { TempUserModule } from './temp-user/temp-user.module';
@Module({
imports: [
ConfigurationModule,
......@@ -26,6 +27,7 @@ import { PostsModule } from './posts/posts.module';
TclModule,
AdminModule,
PostsModule,
TempUserModule,
],
controllers: [AppController],
})
......
export const configDev = {
url: process.env.MAIL_URL,
token: process.env.MAIL_TOKEN,
host: 'ram-dev.grandlyon.com',
host: 'resin-dev.grandlyon.com',
protocol: 'https',
port: '443',
from: 'inclusionnumerique@grandlyon.com',
from_name: 'Réseau des acteurs de la médiation numérique',
replyTo: 'inclusionnumerique@grandlyon.com',
templates: {
directory: './src/mailer/mail-templates',
verify: {
ejs: 'verify.ejs',
json: 'verify.json',
},
changeEmail: {
ejs: 'changeEmail.ejs',
json: 'changeEmail.json',
},
resetPassword: {
ejs: 'resetPassword.ejs',
json: 'resetPassword.json',
},
adminStructureClaim: {
ejs: 'adminStructureClaim.ejs',
json: 'adminStructureClaim.json',
},
structureClaimValidation: {
ejs: 'structureClaimValidation.ejs',
json: 'structureClaimValidation.json',
},
structureOutdatedInfo: {
ejs: 'structureOutdatedInfo.ejs',
json: 'structureOutdatedInfo.json',
},
},
};
export const configProd = {
url: process.env.MAIL_URL,
token: process.env.MAIL_TOKEN,
host: 'ram.grandlyon.com',
host: 'resin.grandlyon.com',
protocol: 'https',
port: '443',
from: 'inclusionnumerique@grandlyon.com',
from_name: 'Réseau des acteurs de la médiation numérique',
replyTo: 'inclusionnumerique@grandlyon.com',
templates: {
directory: './src/mailer/mail-templates',
verify: {
ejs: 'verify.ejs',
json: 'verify.json',
},
changeEmail: {
ejs: 'changeEmail.ejs',
json: 'changeEmail.json',
},
resetPassword: {
ejs: 'resetPassword.ejs',
json: 'resetPassword.json',
},
adminStructureClaim: {
ejs: 'adminStructureClaim.ejs',
json: 'adminStructureClaim.json',
},
structureClaimValidation: {
ejs: 'structureClaimValidation.ejs',
json: 'structureClaimValidation.json',
},
structureOutdatedInfo: {
ejs: 'structureOutdatedInfo.ejs',
json: 'structureOutdatedInfo.json',
},
},
};
......@@ -37,5 +37,13 @@ export const config = {
ejs: 'apticStructureDuplication.ejs',
json: 'apticStructureDuplication.json',
},
tempUserRegistration: {
ejs: 'tempUserRegistration.ejs',
json: 'tempUserRegistration.json',
},
structureJoinRequest: {
ejs: 'structureJoinRequest.ejs',
json: 'structureJoinRequest.json',
},
},
};
......@@ -10,9 +10,11 @@ export class ConfigurationService {
// Initializing conf with values from var env
if (process.env.NODE_ENV && process.env.NODE_ENV === 'production') {
this._config = configProd;
this._config.templates = config.templates; // Add mail templates
Logger.log('App started with production conf', 'ConfigurationService');
} else if (process.env.NODE_ENV && process.env.NODE_ENV === 'dev') {
this._config = configDev;
this._config.templates = config.templates; // Add mail templates
Logger.log('App started with dev conf', 'ConfigurationService');
} else {
this._config = config;
......
Bonjour<br />
<br />
Vous recevez ce message car <strong><%= surname %></strong> <strong><%= name %></strong> demande a rejoindre votre
stucture <strong><%= structureName %></strong> sur RES'in, le réseau des acteurs de l'inclusion numérique de la
Métropole de Lyon. Vous pouvez dès maintenant valider la demande en
<a
href="<%= config.protocol %>://<%= config.host %><%= config.port ? ':' + config.port : '' %>/join?id=<%= id %>&userId=<%= userId %>&status=true"
>cliquant ici</a
>
ou refuser la demande
<a
href="<%= config.protocol %>://<%= config.host %><%= config.port ? ':' + config.port : '' %>/join?id=<%= id %>&userId=<%= userId %>&status=false"
>cliquant ici</a
>.
<br />
Cordialement,
<br />
L'équipe RES'in
<br />
<br />
Ce mail est un mail automatique. Merci de ne pas y répondre.
{
"subject": "Un acteur demande a rejoindre votre structure, Réseau des Acteurs de la Médiation Numérique de la Métropole de Lyon"
}
Bonjour<br />
<br />
Vous recevez ce message car vous avez été relié a la stucture <strong><%= name %></strong> sur RES'in, le réseau des
acteurs de l'inclusion numérique de la Métropole de Lyon. Vous pouvez dès maitenant vous créer un compte sur la
plateforme pour accéder a votre structure en
<a href="<%= config.protocol %>://<%= config.host %><%= config.port ? ':' + config.port : '' %>/register?id=<%= id %>"
>cliquant ici</a
>.
<br />
Cordialement,
<br />
L'équipe RES'in
<br />
<br />
Ce mail est un mail automatique. Merci de ne pas y répondre.
{
"subject": "Un compte a été créé pour vous sur le Réseau des Acteurs de la Médiation Numérique de la Métropole de Lyon"
}
import { Controller, Get, HttpService, Query } from '@nestjs/common';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
import { ApiBearerAuth, ApiQuery } from '@nestjs/swagger';
import { ApiQuery } from '@nestjs/swagger';
import { Post } from './schemas/post.schema';
@Controller('posts')
......
......@@ -7,6 +7,7 @@ export class structureDto {
numero: string;
createdAt: string;
updatedAt: string;
deletedAt: Date;
@IsNotEmpty()
structureName: string;
......@@ -46,8 +47,6 @@ export class structureDto {
@ArrayNotEmpty()
publics: string[];
@IsNotEmpty()
freeWifi: boolean;
@IsNotEmpty()
freeWorkShop: boolean;
@IsNotEmpty()
nbComputers: number;
......
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