diff --git a/db/init-db.sh b/db/init-db.sh deleted file mode 100644 index eb93fd77a432ad1f338ab29c6a3941c916ba8040..0000000000000000000000000000000000000000 --- a/db/init-db.sh +++ /dev/null @@ -1,5 +0,0 @@ -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 diff --git a/scripts/init-db.js b/scripts/init-db.js index 57acb1e1af67ce07d79d8e1b745a456e6a595312..d65251eb5ed7bb7b8674f964aeef13466a8bced6 100644 --- a/scripts/init-db.js +++ b/scripts/init-db.js @@ -63,8 +63,8 @@ mongoose.connection.dropCollection('users', function (err) { user.password = hashPassword(); }); // save model to database - User.create(userData.data, function (err, user) { - if (err) return console.error(err); + User.create(userData.data, function (error, user) { + if (error) return console.error(error); console.log('-- Users collection initialized --'); process.exit(0); }); diff --git a/src/posts/posts.controller.ts b/src/posts/posts.controller.ts index e5c9478a2cde8a29629759fab5fbf5513c07acc0..69d709984424f4be5bc48a1c53b9ca22c085e6f9 100644 --- a/src/posts/posts.controller.ts +++ b/src/posts/posts.controller.ts @@ -1,7 +1,7 @@ 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') diff --git a/src/structures/schemas/structure.schema.ts b/src/structures/schemas/structure.schema.ts index c18f9cdccf6e74dcd5cd21bf557031bc464f75d3..fdd977bfc67d6f6ab411d60b1ba36f109a4a5573 100644 --- a/src/structures/schemas/structure.schema.ts +++ b/src/structures/schemas/structure.schema.ts @@ -1,5 +1,5 @@ import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose'; -import { Document, Types } from 'mongoose'; +import { Document } from 'mongoose'; import { Address } from './address.schema'; import { Week } from './week.schema'; diff --git a/src/structures/services/structures.service.ts b/src/structures/services/structures.service.ts index fe78e14d6c16f45862a6e66a452a117c93204e63..0de3143a240cc0fa3fb42d06dfb675ae3af4ba7f 100644 --- a/src/structures/services/structures.service.ts +++ b/src/structures/services/structures.service.ts @@ -24,12 +24,12 @@ export class StructuresService { @InjectModel(Structure.name) private structureModel: Model<StructureDocument> ) {} - public async create(idUser: string, structureDto: structureDto): Promise<Structure> { + public async create(idUser: string, structure: structureDto): Promise<Structure> { const user = await this.userService.findOne(idUser); if (!user) { throw new HttpException('Invalid profile', HttpStatus.NOT_FOUND); } - const createdStructure = new this.structureModel(structureDto); + const createdStructure = new this.structureModel(structure); createdStructure._id = Types.ObjectId(); createdStructure.save(); user.structuresLink.push(createdStructure._id); @@ -330,7 +330,6 @@ export class StructuresService { } public async updateAccountVerified(idStructure: string, emailUser: string): Promise<Structure> { - const user = await this.userService.findOne(emailUser); const structureLinked = await this.findOne(idStructure); const structure = new this.structureModel(structureLinked); if (!structure) { diff --git a/src/structures/structures.controller.ts b/src/structures/structures.controller.ts index 5b1dde3eeed6c27796b31bedf03c57d0671325ec..b4aeea9bc83c7d3a6198af2d44909e4300b60f89 100644 --- a/src/structures/structures.controller.ts +++ b/src/structures/structures.controller.ts @@ -6,7 +6,6 @@ import { HttpException, HttpStatus, Param, - ParseIntPipe, Post, Put, Query, @@ -16,11 +15,9 @@ import { ApiParam } from '@nestjs/swagger'; import { Types } from 'mongoose'; import { JwtAuthGuard } from '../auth/guards/jwt-auth.guard'; import { CreateTempUserDto } from '../temp-user/dto/create-temp-user.dto'; -import { TempUser } from '../temp-user/temp-user.schema'; import { TempUserService } from '../temp-user/temp-user.service'; import { Roles } from '../users/decorators/roles.decorator'; import { IsStructureOwnerGuard } from '../users/guards/isStructureOwner.guard'; -import { RolesGuard } from '../users/guards/roles.guard'; import { User } from '../users/schemas/user.schema'; import { UsersService } from '../users/users.service'; import { CreateStructureDto } from './dto/create-structure.dto'; diff --git a/src/tcl/tclStopPoint.controller.ts b/src/tcl/tclStopPoint.controller.ts index 2f8b75148e41fd90186763ecec5958e4c2d8c388..5f7e940c9e882afd7b4225dfdb92489f027e90d1 100644 --- a/src/tcl/tclStopPoint.controller.ts +++ b/src/tcl/tclStopPoint.controller.ts @@ -1,5 +1,8 @@ import { Body, Controller, Get, Post, UseGuards } from '@nestjs/common'; import { ApiOperation, ApiResponse } from '@nestjs/swagger'; +import { JwtAuthGuard } from '../auth/guards/jwt-auth.guard'; +import { Roles } from '../users/decorators/roles.decorator'; +import { RolesGuard } from '../users/guards/roles.guard'; import { PgisCoord } from './interfaces/pgis.coord'; import { TclStopPoint } from './tclStopPoint.schema'; import { TclStopPointService } from './tclStopPoint.service'; @@ -16,7 +19,8 @@ export class TclStopPointController { description: 'The stop points have been updated successfully.', }) @Get('/update') - //TODO: protect with admin guard when available + @UseGuards(JwtAuthGuard, RolesGuard) + @Roles('admin') public updateStopPoints(): Promise<void> { return this.tclStopPointService.updateStopPoints(); } diff --git a/src/temp-user/temp-user.service.ts b/src/temp-user/temp-user.service.ts index 8d3eba3993df83ff996aa597ea74637907975623..f4588a4b9c199c84ea49152a2d4ad3e29630faf1 100644 --- a/src/temp-user/temp-user.service.ts +++ b/src/temp-user/temp-user.service.ts @@ -3,7 +3,7 @@ import { InjectModel } from '@nestjs/mongoose'; import { Model, Types } from 'mongoose'; import { MailerService } from '../mailer/mailer.service'; import { CreateTempUserDto } from './dto/create-temp-user.dto'; -import { TempUser, TempUserDocument } from './temp-user.schema'; +import { TempUser } from './temp-user.schema'; import * as ejs from 'ejs'; import { ITempUser } from './temp-user.interface'; diff --git a/src/users/users.service.spec.ts b/src/users/users.service.spec.ts index e24a4807c60a4d93623c6d6b03220032e34905b1..01f5207c753886b4a04644d506a7454f89ed52a4 100644 --- a/src/users/users.service.spec.ts +++ b/src/users/users.service.spec.ts @@ -7,6 +7,11 @@ import { CreateUserDto } from './dto/create-user.dto'; import { HttpException, HttpStatus } from '@nestjs/common'; import { LoginDto } from '../auth/login-dto'; import { EmailChangeDto } from './dto/change-email.dto'; +import * as bcrypt from 'bcrypt'; + +function hashPassword() { + return bcrypt.hashSync(process.env.USER_PWD, process.env.SALT); +} describe('UsersService', () => { let service: UsersService; @@ -38,7 +43,7 @@ describe('UsersService', () => { 'cf1c74c22cedb6b575945098db42d2f493fb759c9142c6aff7980f252886f36ee086574ee99a06bc99119079257116c959c8ec870949cebdef2b293666dbca42', emailVerified: false, email: 'jacques.dupont@mii.com', - password: '$2a$12$vLQjJ9zAWyUwiXLeQDa6w.yazDArYIpf2WnQF1jRHOjBxADEjUEA3', + password: hashPassword(), newEmail: '', changeEmailToken: '', resetPasswordToken: null, @@ -74,7 +79,7 @@ describe('UsersService', () => { 'cf1c74c22cedb6b575945098db42d2f493fb759c9142c6aff7980f252886f36ee086574ee99a06bc99119079257116c959c8ec870949cebdef2b293666dbca42', emailVerified: false, email: 'jacques.dupont@mii.com', - password: '$2a$12$vLQjJ9zAWyUwiXLeQDa6w.yazDArYIpf2WnQF1jRHOjBxADEjUEA3', + password: hashPassword(), role: 0, newEmail: '', changeEmailToken: '', @@ -133,7 +138,7 @@ describe('UsersService', () => { validationToken: '', emailVerified: true, email: 'jacques.dupont@mii.com', - password: '$2a$12$vLQjJ9zAWyUwiXLeQDa6w.yazDArYIpf2WnQF1jRHOjBxADEjUEA3', + password: hashPassword(), role: 0, newEmail: 'test.dupont@mail.com', resetPasswordToken: '', @@ -162,7 +167,7 @@ describe('UsersService', () => { validationToken: '', emailVerified: true, email: 'test.dupont@mail.com', - password: '$2a$12$vLQjJ9zAWyUwiXLeQDa6w.yazDArYIpf2WnQF1jRHOjBxADEjUEA3', + password: hashPassword(), role: 0, newEmail: '', resetPasswordToken: '', diff --git a/src/users/users.service.ts b/src/users/users.service.ts index cf71c5b3f0f89cb29c61f33730dfe384a20ddb1d..c7806f64e8ac23025e7aff33935f1fb1583e9adf 100644 --- a/src/users/users.service.ts +++ b/src/users/users.service.ts @@ -441,14 +441,14 @@ export class UsersService { status = true; // For other users who have made the demand on the same structure if (otherUsers) { - otherUsers.forEach((user) => { + otherUsers.forEach((otherUser) => { // Remove the structure id from their demand - user.pendingStructuresLink = user.pendingStructuresLink.filter((item) => { + otherUser.pendingStructuresLink = otherUser.pendingStructuresLink.filter((item) => { return !Types.ObjectId(structureId).equals(item); }); // Send a rejection email - this.sendStructureClaimApproval(user.email, structureName, false); - user.save(); + this.sendStructureClaimApproval(otherUser.email, structureName, false); + otherUser.save(); }); } }