Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • web-et-numerique/factory/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_server
1 result
Show changes
Commits on Source (2)
Showing
with 26 additions and 275 deletions
......@@ -11,8 +11,6 @@ module.exports = {
structureName: "Maison de l'Emploi (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",
lockdownActivity:
'Toutes les activités sont maintenues durant le confinement. Toutes nécessitent cependant de prendre rdv préalablement',
contactPhone: '04 04 04 04 04',
contactMail: 'm.annequin@test.fr',
website: '',
......@@ -169,7 +167,6 @@ module.exports = {
updatedAt: '2020-12-16T10:19:00.000Z',
structureName: 'Pôle emploi (Vénissieux)',
description: "Espace informatique en libre service le matin Sur RDV l'après-midi, réservation d'un poste",
lockdownActivity: "Espace libre accès le matin RDV l'après-midi, résercation d'un poste",
contactPhone: '',
contactMail: '',
website: '',
......@@ -276,7 +273,6 @@ module.exports = {
structureName: '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.",
lockdownActivity: 'Aide aux démarches administratives et médiation numérique, sur rendez vous uniquement',
contactPhone: '04 05 05 05 05',
contactMail: 'test@gmail.com',
website: 'www.centresocialquartiervitalite.i-citoyen.com',
......@@ -377,8 +373,6 @@ module.exports = {
structureName: "L'Atelier Numérique",
description:
"L'Atelier Numérique est l'Espace Public Numérique des Centres Sociaux de Rillieux-la-Pape, ayant pour mission la médiation numérique pour toutes et tous.",
lockdownActivity:
'accesLibres, permanences numériques téléphoniques, cours et ateliers à distance, formations professionnelles.',
contactPhone: '',
contactMail: '',
website: '',
......@@ -520,8 +514,6 @@ module.exports = {
structureName: 'Cyber-base / MJC Louis Aragon',
description:
'Notre espace est un lieu de DÉCOUVERTE, d’APPRENTISSAGE et de SOUTIEN de votre pratique numérique. Ouvert à tous, c’est un aussi un lieu de vie, d’échanges et de partage de savoirs. La Cyber-base est un lieu ressource pour les acteurs sociaux, éducatifs et culturels . Elle a vocation à ACCOMPAGNER : • les projets des structures impliquant le numérique comme levier social d’inclusion des citoyens • l’éducation aux médias des jeunes générations • à la parentalité.',
lockdownActivity:
"OUVERT au public pour un libre accès INTERNET et impressions de documents.\nUne permanence téléphonique d'AIDE NUMERIQUE (logiciel VISIO, envoyer une pièce jointe, se connecter au WIFI, récupération mot de passe,...) est maintenue : mercredi / vendredi, 11h à 13h et 18h à 19h au 04 72 81 76 87. Les activités enfants / ados sont SUSPENDUES. \nDes soirées conviviales sont organisées A DISTANCE les vendredis soirs, de 18h30 à 19h30 -> https://cyberbase.mjcbron.fr/les-vendredis-conviviaux/",
contactPhone: '04 06 06 06 60',
contactMail: 'cyberbase@test.fr',
website: 'http://cyberbase.mjcbron.fr',
......@@ -623,7 +615,6 @@ module.exports = {
updatedAt: '2021-03-02T10:07:48.000Z',
structureName: 'Oasis Informatique',
description: '',
lockdownActivity: '',
contactPhone: '06 06 06 60 60',
contactMail: 'iip.oasis@test.fr',
website: 'http://oasis-informatique.fr/',
......@@ -736,8 +727,6 @@ module.exports = {
structureName: 'Le Son du Clic',
description:
"Entreprise de médiation numérique assurant l'animation d'atelier numériques en collectif ou l'accompagnement au numérique des particuliers en individuel. Structure agréée APTIC sur la métropole de Lyon, acceptant à ce titre le règlement de ses prestations en chèque PASS NUMERIQUE",
lockdownActivity:
'Médiation numérique et formation pour les particuliers, en individuel, à domicile ou en visioconférence',
contactPhone: '06 60 60 60 60',
contactMail: 'jean-francois@test.fr',
website: 'http://lesonduclic.fr/site1/',
......
......@@ -91,7 +91,6 @@ const structuresSchema = mongoose.Schema({
structureName: String,
structureType: String,
description: String,
lockdownActivity: String,
address: Object,
contactPhone: String,
contactMail: String,
......
......@@ -11,7 +11,6 @@ import { MailerModule } from './mailer/mailer.module';
import { NewsletterModule } from './newsletter/newsletter.module';
import { OnlineMediationModule } from './online-mediation/onlineMediation.module';
import { PagesModule } from './pages/pages.module';
import { ParametersModule } from './parameters/parameters.module';
import { PersonalOffersModule } from './personal-offers/personal-offers.module';
import { PostsModule } from './posts/posts.module';
import { StructuresModule } from './structures/structures.module';
......@@ -41,7 +40,6 @@ import { IndicatorModule } from './indicator/indicator.module';
NewsletterModule,
ContactModule,
PersonalOffersModule,
ParametersModule,
AppointmentModule,
OnlineMediationModule,
EspaceCoopModule,
......
import { Db } from 'mongodb';
import { getDb } from '../migrations-utils/db';
export const up = async () => {
const db: Db = await getDb();
await db.collection('structures').updateMany({}, { $unset: { lockdownActivity: '' } });
await db.collection('parameters').drop();
console.log(`Update done: removed 'lockdownActivity' from 'structures' and deleted the 'parameters' collection`);
};
export const down = async () => {
const db: Db = await getDb();
const updateResult = await db.collection('structures').updateMany({}, { $set: { lockdownActivity: '' } });
await db
.collection('parameters')
.insertOne({ lockdownInfoDisplay: false, createdAt: new Date(), updatedAt: new Date() });
console.log(
`Downgrade done: added lockdownActivity to ${updateResult.modifiedCount} structures and added the 'parameters' collection back with its contents`
);
};
import { Document } from 'mongoose';
export interface IParameters extends Document {
lockdownInfoDisplay: boolean;
}
import { getModelToken } from '@nestjs/mongoose';
import { Test, TestingModule } from '@nestjs/testing';
import { ParametersController } from './parameters.controller';
import { ParametersService } from './parameters.service';
import { Parameters } from './schemas/parameters.schema';
describe('ParametersController', () => {
let parametersController: ParametersController;
const parametersServiceMock = {
getParameters: jest.fn(),
setParameterLockdownInfoDisplay: jest.fn(),
};
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
providers: [
{
provide: ParametersService,
useValue: parametersServiceMock,
},
{
provide: getModelToken('Parameters'),
useValue: Parameters,
},
],
controllers: [ParametersController],
}).compile();
parametersController = module.get<ParametersController>(ParametersController);
});
it('should be defined', async () => {
expect(parametersController).toBeDefined();
});
it('should call getParameters', async () => {
const spyer = jest.spyOn(parametersServiceMock, 'getParameters');
await parametersController.getParameters();
expect(spyer).toHaveBeenCalledTimes(1);
});
describe('setParameterLockdownInfoDisplay', () => {
const spyer = jest.spyOn(parametersServiceMock, 'setParameterLockdownInfoDisplay');
afterEach(() => spyer.mockClear());
it('should call setParameterLockdownInfoDisplay(false)', async () => {
await parametersController.setParameterLockdownInfoDisplay({ lockdownInfoDisplay: false });
expect(spyer).toHaveBeenCalledTimes(1);
expect(spyer).toHaveBeenCalledWith(false);
});
it('should call setParameterLockdownInfoDisplay(true)', async () => {
await parametersController.setParameterLockdownInfoDisplay({ lockdownInfoDisplay: true });
expect(spyer).toHaveBeenCalledTimes(1);
expect(spyer).toHaveBeenCalledWith(true);
});
});
});
import { Body, Controller, Post, Get, UseGuards } from '@nestjs/common';
import { ApiTags } 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 { ParametersService } from './parameters.service';
import { Parameters } from './schemas/parameters.schema';
@ApiTags('parameters')
@Controller('parameters')
export class ParametersController {
constructor(private parametersService: ParametersService) {}
@Get()
public async getParameters(): Promise<Parameters> {
return this.parametersService.getParameters();
}
@Post()
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles('admin')
public async setParameterLockdownInfoDisplay(@Body() data: { lockdownInfoDisplay: boolean }): Promise<Parameters> {
return this.parametersService.setParameterLockdownInfoDisplay(data.lockdownInfoDisplay);
}
}
import { Module } from '@nestjs/common';
import { MongooseModule } from '@nestjs/mongoose';
import { ParametersController } from './parameters.controller';
import { ParametersService } from './parameters.service';
import { Parameters, ParametersSchema } from './schemas/parameters.schema';
@Module({
imports: [MongooseModule.forFeature([{ name: Parameters.name, schema: ParametersSchema }])],
controllers: [ParametersController],
providers: [ParametersService],
})
export class ParametersModule {}
import { HttpStatus } from '@nestjs/common';
import { getModelToken } from '@nestjs/mongoose';
import { Test, TestingModule } from '@nestjs/testing';
import { ParametersService } from './parameters.service';
import { Parameters } from './schemas/parameters.schema';
describe('ParametersService', () => {
let parametersService: ParametersService;
const parametersModelMock = {
findOne: jest.fn(),
exec: jest.fn(),
};
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
providers: [
ParametersService,
{
provide: getModelToken(Parameters.name),
useValue: parametersModelMock,
},
],
}).compile();
parametersService = module.get<ParametersService>(ParametersService);
});
afterEach(() => {
jest.clearAllMocks();
});
it('should be defined', () => {
expect(parametersService).toBeDefined();
});
describe('getParameters', () => {
it('should get parameters', async () => {
const spyer = jest.spyOn(parametersModelMock, 'findOne');
parametersModelMock.findOne.mockReturnThis();
parametersModelMock.exec.mockResolvedValueOnce({ lockdownInfoDisplay: false });
const result = await parametersService.getParameters();
expect(spyer).toHaveBeenCalledTimes(1);
expect(result).toEqual({ lockdownInfoDisplay: false });
});
it('should throw error because parameters was not found', async () => {
const spyer = jest.spyOn(parametersModelMock, 'findOne');
parametersModelMock.findOne.mockReturnThis();
parametersModelMock.exec.mockResolvedValueOnce(null);
try {
await parametersService.getParameters();
expect(true).toBe(false);
} catch (error) {
expect(error.message).toBe('Parameters not found');
expect(error.status).toBe(HttpStatus.NOT_FOUND);
}
expect(spyer).toHaveBeenCalledTimes(1);
});
});
describe('setParameters', () => {
it('should set parameters', async () => {
const spyer = jest.spyOn(parametersModelMock, 'findOne');
parametersModelMock.findOne.mockReturnThis();
parametersModelMock.exec.mockResolvedValueOnce({ lockdownInfoDisplay: false, save: jest.fn() });
const result = await parametersService.setParameterLockdownInfoDisplay(true);
expect(spyer).toHaveBeenCalledTimes(1);
expect(result.lockdownInfoDisplay).toEqual(true);
});
it('should throw error because parameters was not found', async () => {
const spyer = jest.spyOn(parametersModelMock, 'findOne');
parametersModelMock.findOne.mockReturnThis();
parametersModelMock.exec.mockResolvedValueOnce(null);
try {
await parametersService.setParameterLockdownInfoDisplay(true);
expect(true).toBe(false);
} catch (error) {
expect(error.message).toBe('Parameters not found');
expect(error.status).toBe(HttpStatus.NOT_FOUND);
}
expect(spyer).toHaveBeenCalledTimes(1);
});
});
});
import { HttpException, HttpStatus, Injectable } from '@nestjs/common';
import { InjectModel } from '@nestjs/mongoose';
import { Model } from 'mongoose';
import { IParameters } from './interface/parameters.interface';
import { Parameters } from './schemas/parameters.schema';
@Injectable()
export class ParametersService {
constructor(@InjectModel(Parameters.name) private parametersModel: Model<IParameters>) {}
public async getParameters(): Promise<Parameters> {
const parameters = await this.parametersModel.findOne().exec();
if (!parameters) {
throw new HttpException('Parameters not found', HttpStatus.NOT_FOUND);
}
return parameters;
}
public async setParameterLockdownInfoDisplay(lockdownInfoDisplay: boolean): Promise<Parameters> {
const parameters = await this.parametersModel.findOne().exec();
if (!parameters) {
throw new HttpException('Parameters not found', HttpStatus.NOT_FOUND);
}
parameters.lockdownInfoDisplay = lockdownInfoDisplay;
await parameters.save();
return parameters;
}
}
import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose';
import { Document } from 'mongoose';
export type ParametersDocument = Parameters & Document;
@Schema({ timestamps: { createdAt: 'createdAt', updatedAt: 'updatedAt' } })
export class Parameters {
@Prop({ required: true })
lockdownInfoDisplay: boolean;
}
export const ParametersSchema = SchemaFactory.createForClass(Parameters);
......@@ -35,7 +35,6 @@ export class StructureDto {
instagram: string;
linkedin: string;
lockdownActivity: string;
otherDescription: string;
@ApiProperty({ required: true })
......
......@@ -17,7 +17,6 @@ export class Structure {
this.numero = data.numero;
this.structureType = data.structureType;
this.description = data.description;
this.lockdownActivity = data.lockdownActivity;
this.address = data.address;
this.contactPhone = data.contactPhone;
this.contactMail = data.contactMail;
......@@ -61,9 +60,6 @@ export class Structure {
@Prop()
description: string;
@Prop()
lockdownActivity: string;
@Prop()
@ValidateNested({ each: true })
@Type(() => Address)
......
......@@ -51,7 +51,6 @@ function createMockedStructure(overrides: Partial<StructureDocument> = {}) {
structureName: 'A. Le Son du Clic',
description:
"Entreprise de médiation numérique assurant l'animation d'atelier numériques en collectif ou l'accompagnement au numérique des particuliers en individuel. Structure agréée APTIC sur la métropole de Lyon, acceptant à ce titre le règlement de ses prestations en chèque PASS NUMERIQUE",
lockdownActivity: null,
address: {
numero: '7',
street: 'Rue Robert et Reynier ',
......
......@@ -163,7 +163,6 @@ export class StructuresImportService {
nbPrinters: 0,
nbScanners: 0,
freeWorkShop: 'Non',
lockdownActivity: null,
structureType: null,
website: structure.site_web ?? null,
dataShareConsentDate: null,
......
......@@ -9,7 +9,6 @@ import { of } from 'rxjs';
import { personalOffersDataMock } from '../../../test/mock/data/personalOffers.mock.data';
import { structureMockDto, structuresDocumentDataMock } from '../../../test/mock/data/structures.mock.data';
import { userDetails } from '../../../test/mock/data/users.mock.data';
import { mockParametersModel } from '../../../test/mock/services/parameters.mock.service';
import {
mockCNFSStructures,
mockResinStructures,
......@@ -20,8 +19,6 @@ import { UsersServiceMock } from '../../../test/mock/services/user.mock.service'
import { CategoriesService } from '../../categories/services/categories.service';
import { ConfigurationService } from '../../configuration/configuration.service';
import { MailerModule } from '../../mailer/mailer.module';
import { ParametersService } from '../../parameters/parameters.service';
import { Parameters } from '../../parameters/schemas/parameters.schema';
import { PersonalOfferDocument } from '../../personal-offers/schemas/personal-offer.schema';
import { SearchModule } from '../../search/search.module';
import { IUser } from '../../users/interfaces/user.interface';
......@@ -73,8 +70,6 @@ const mockStructuresSearchService = {
structureName: "L'Atelier Numérique",
description:
"L'Atelier Numérique est l'Espace Public Numérique des Centres Sociaux de Rillieux-la-Pape, ayant pour mission la médiation numérique pour toutes et tous.",
lockdownActivity:
'accesLibres, permanences numériques téléphoniques, cours et ateliers à distance, formations professionnelles.',
contactPhone: '',
contactMail: '',
website: '',
......@@ -247,7 +242,6 @@ describe('StructuresService', () => {
providers: [
StructuresService,
ConfigurationService,
ParametersService,
{
provide: HttpService,
useValue: httpServiceMock,
......@@ -272,10 +266,6 @@ describe('StructuresService', () => {
provide: JobsService,
useValue: jobServiceMock,
},
{
provide: getModelToken(Parameters.name),
useValue: mockParametersModel,
},
],
}).compile();
......@@ -320,8 +310,6 @@ describe('StructuresService', () => {
updatedAt: '2021-04-12T08:48:00.000Z',
description:
"L'Atelier Numérique est l'Espace Public Numérique des Centres Sociaux de Rillieux-la-Pape, ayant pour mission la médiation numérique pour toutes et tous.",
lockdownActivity:
'accesLibres, permanences numériques téléphoniques, cours et ateliers à distance, formations professionnelles.',
contactPhone: '',
contactMail: '',
website: '',
......
......@@ -4,8 +4,6 @@ import { JwtModule } from '@nestjs/jwt';
import { MongooseModule } from '@nestjs/mongoose';
import { CategoriesModule } from '../categories/categories.module';
import { MailerModule } from '../mailer/mailer.module';
import { ParametersService } from '../parameters/parameters.service';
import { Parameters, ParametersSchema } from '../parameters/schemas/parameters.schema';
import { PersonalOffersModule } from '../personal-offers/personal-offers.module';
import { SearchModule } from '../search/search.module';
import { TempUserModule } from '../temp-user/temp-user.module';
......@@ -27,7 +25,6 @@ config();
MongooseModule.forFeature([
{ name: Structure.name, schema: StructureSchema },
{ name: StructureType.name, schema: StructureTypeSchema },
{ name: Parameters.name, schema: ParametersSchema },
]),
HttpModule,
MailerModule,
......@@ -47,7 +44,6 @@ config();
StructuresSearchService,
StructuresService,
StructureTypeService,
ParametersService,
StructuresExportService,
StructuresImportService,
],
......
......@@ -7,8 +7,6 @@ import { Types } from 'mongoose';
import { usersMockData } from '../../../test/mock/data/users.mock.data';
import { ConfigurationModule } from '../../configuration/configuration.module';
import { MailerService } from '../../mailer/mailer.service';
import { ParametersService } from '../../parameters/parameters.service';
import { Parameters } from '../../parameters/schemas/parameters.schema';
import { SearchModule } from '../../search/search.module';
import { Structure } from '../../structures/schemas/structure.schema';
import { StructuresSearchService } from '../../structures/services/structures-search.service';
......@@ -82,7 +80,6 @@ describe('UsersController', () => {
UsersService,
StructuresSearchService,
MailerService,
ParametersService,
{
provide: StructuresService,
useValue: structureServiceMock,
......@@ -119,10 +116,6 @@ describe('UsersController', () => {
provide: getModelToken('User'),
useValue: User,
},
{
provide: getModelToken('Parameters'),
useValue: Parameters,
},
],
controllers: [UsersController],
}).compile();
......
......@@ -139,7 +139,6 @@ export const mockGouvStructureToResinFormat = new Structure({
accountVerified: true,
personalOffers: [],
dataShareConsentDate: null,
lockdownActivity: null,
structureType: null,
website: 'https://mediathequeodyssee.mairie-craponne.fr/',
exceptionalClosures: null,
......
......@@ -14,7 +14,6 @@ export const structureDtoMock: StructureDto = {
twitter: '',
instagram: '',
linkedin: '',
lockdownActivity: '',
otherDescription: '',
pmrAccess: false,
remoteAccompaniment: false,
......