Skip to content

Commit

Permalink
Refacto status publication (#421)
Browse files Browse the repository at this point in the history
* correct dto send/validate pin habilitation

* delete dead code

* delete status READY_TO_PUBLISH

* add migration delete READY_TO_PUBLISH

* add route habilitation/is-valid

* correct test

* merge

* delete space

* correct import ready to publish

* change comment

* correct test

* rename migration
  • Loading branch information
fufeck authored Jan 15, 2024
1 parent 343c8ab commit dae48d2
Showing 14 changed files with 126 additions and 81 deletions.
14 changes: 0 additions & 14 deletions apps/api/src/modules/base_locale/base_locale.service.ts
Original file line number Diff line number Diff line change
@@ -203,20 +203,6 @@ export class BaseLocaleService {
);
}

const numeroCount = await this.numeroService.count({
_bal: baseLocale._id,
_deleted: null,
});
if (
numeroCount === 0 &&
update.status === StatusBaseLocalEnum.READY_TO_PUBLISH
) {
throw new HttpException(
'La base locale ne possède aucune adresse',
HttpStatus.PRECONDITION_FAILED,
);
}

const updatedBaseLocale = await this.baseLocaleModel.findOneAndUpdate(
{ _id: baseLocale._id },
{ $set: update },
10 changes: 7 additions & 3 deletions apps/api/src/modules/base_locale/pipe/search_query.pipe.ts
Original file line number Diff line number Diff line change
@@ -8,6 +8,7 @@ import { FilterQuery } from 'mongoose';

import { BaseLocale } from '@/shared/schemas/base_locale/base_locale.schema';
import { getCommune } from '@/shared/utils/cog.utils';
import { StatusBaseLocalEnum } from '@/shared/schemas/base_locale/status.enum';

import { checkValidEmail } from '@/modules/base_locale/utils/base_locale.utils';

@@ -74,9 +75,12 @@ export class SearchQueryPipe implements PipeTransform {
if (query.status) {
if (
typeof query.status === 'string' &&
['demo', 'draft', 'ready-to-publish', 'published', 'replaced'].includes(
query.status,
)
[
StatusBaseLocalEnum.DEMO,
StatusBaseLocalEnum.DRAFT,
StatusBaseLocalEnum.PUBLISHED,
StatusBaseLocalEnum.REPLACED,
].includes(query.status)
) {
filters.status = { $eq: query.status };
} else {
Original file line number Diff line number Diff line change
@@ -36,6 +36,27 @@ import { ValidatePinCodeResponseDTO } from './dto/validate-pin-code.response.dto
export class HabilitationController {
constructor(private habilitationService: HabilitationService) {}

@Get('/bases-locales/:baseLocaleId/habilitation/is-valid')
@ApiOperation({
summary: 'Find habiliation is Valid',
operationId: 'findIsValid',
})
@ApiParam({ name: 'baseLocaleId', required: true, type: String })
@ApiResponse({ status: 200, type: Boolean })
async getHabilitationIsValid(
@Req() req: CustomRequest,
@Res() res: Response,
) {
try {
const isValid: boolean = await this.habilitationService.isValid(
req.baseLocale._habilitation,
);
res.status(HttpStatus.OK).json(isValid);
} catch (err) {
res.status(HttpStatus.OK).json(false);
}
}

@Get('/bases-locales/:baseLocaleId/habilitation')
@ApiOperation({
summary: 'Find habiliation',
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
import { HttpException, HttpStatus, Injectable } from '@nestjs/common';

import { Habilitation } from '@/shared/modules/api_depot/types/habilitation.type';
import {
Habilitation,
StatusHabiliation,
} from '@/shared/modules/api_depot/types/habilitation.type';
import { ApiDepotService } from '@/shared/modules/api_depot/api_depot.service';
import { BaseLocale } from '@/shared/schemas/base_locale/base_locale.schema';

@@ -17,6 +20,25 @@ export class HabilitationService {
return this.apiDepotService.findOneHabiliation(habilitationId);
}

async isValid(habilitationId: string): Promise<boolean> {
const habilitation: Habilitation =
await this.apiDepotService.findOneHabiliation(habilitationId);

// On verifie que l'habilitation est valide
if (habilitation.status !== StatusHabiliation.ACCEPTED) {
return false;
}

// On verifie que l'habilitation n'est pas expirée
if (
!habilitation.expiresAt ||
new Date(habilitation.expiresAt) < new Date()
) {
return false;
}
return true;
}

async createOne(baseLocale: BaseLocale): Promise<Habilitation> {
if (baseLocale._habilitation) {
const habilitation = await this.findOne(baseLocale._habilitation);
10 changes: 5 additions & 5 deletions apps/api/src/modules/stats/stats.service.ts
Original file line number Diff line number Diff line change
@@ -4,6 +4,7 @@ import { groupBy, mapValues } from 'lodash';
import { format } from 'date-fns';

import { BaseLocale } from '@/shared/schemas/base_locale/base_locale.schema';
import { StatusBaseLocalEnum } from '@/shared/schemas/base_locale/status.enum';

import { BaseLocaleService } from '@/modules/base_locale/base_locale.service';
import { BasesLocalesStatusDTO } from '@/modules/stats/dto/bases_locales_status.dto';
@@ -66,13 +67,12 @@ export class StatsService {
createdBAL: mapValues(balsGroupedByCommune, (balsByCommune) => ({
total: balsByCommune.length,
published: balsByCommune.filter(
({ status }) => status === 'published',
({ status }) => status === StatusBaseLocalEnum.PUBLISHED,
).length,
draft: balsByCommune.filter(({ status }) => status === 'draft')
.length,
readyToPublish: balsByCommune.filter(
({ status }) => status === 'ready-to-publish',
draft: balsByCommune.filter(
({ status }) => status === StatusBaseLocalEnum.DRAFT,
).length,
readyToPublish: 0,
demo: balsByCommune.filter(({ status }) => status === 'demo').length,
})),
};
2 changes: 1 addition & 1 deletion apps/api/test/base_locale.e2e-spec.ts
Original file line number Diff line number Diff line change
@@ -953,7 +953,7 @@ voie;rue de paris;1;1ter`;
error: 'Bad Request',
message: [
'nom should not be empty',
'status must be one of the following values: draft, ready-to-publish, published, demo, replaced',
'status must be one of the following values: draft, published, demo, replaced',
'emails should not be empty',
],
statusCode: 400,
16 changes: 8 additions & 8 deletions apps/api/test/habilitation.e2e-spec.ts
Original file line number Diff line number Diff line change
@@ -17,7 +17,7 @@ import {
} from '@/shared/modules/api_depot/types/habilitation.type';
import { add } from 'date-fns';

describe('BASE LOCAL MODULE', () => {
describe('HABILITATION MODULE', () => {
let app: INestApplication;
let mongod: MongoMemoryServer;
let mongoConnection: Connection;
@@ -172,7 +172,7 @@ describe('BASE LOCAL MODULE', () => {
commune,
emails: ['test@test.fr'],
token,
status: StatusBaseLocalEnum.READY_TO_PUBLISH,
status: StatusBaseLocalEnum.DRAFT,
});

const habilitation: Habilitation = {
@@ -207,7 +207,7 @@ describe('BASE LOCAL MODULE', () => {
commune,
emails: ['test@test.fr'],
token,
status: StatusBaseLocalEnum.READY_TO_PUBLISH,
status: StatusBaseLocalEnum.DRAFT,
_habilitation: habilitationId.toString(),
});

@@ -244,7 +244,7 @@ describe('BASE LOCAL MODULE', () => {
commune,
emails: ['test@test.fr'],
token,
status: StatusBaseLocalEnum.READY_TO_PUBLISH,
status: StatusBaseLocalEnum.DRAFT,
_habilitation: habilitationId.toString(),
});

@@ -288,7 +288,7 @@ describe('BASE LOCAL MODULE', () => {
commune,
emails: ['test@test.fr'],
token,
status: StatusBaseLocalEnum.READY_TO_PUBLISH,
status: StatusBaseLocalEnum.DRAFT,
_habilitation: habilitationId.toString(),
});

@@ -325,7 +325,7 @@ describe('BASE LOCAL MODULE', () => {
commune,
emails: ['test@test.fr'],
token,
status: StatusBaseLocalEnum.READY_TO_PUBLISH,
status: StatusBaseLocalEnum.DRAFT,
_habilitation: habilitationId.toString(),
});

@@ -371,7 +371,7 @@ describe('BASE LOCAL MODULE', () => {
commune,
emails: ['test@test.fr'],
token,
status: StatusBaseLocalEnum.READY_TO_PUBLISH,
status: StatusBaseLocalEnum.DRAFT,
_habilitation: habilitationId.toString(),
});

@@ -418,7 +418,7 @@ describe('BASE LOCAL MODULE', () => {
commune,
emails: ['test@test.fr'],
token,
status: StatusBaseLocalEnum.READY_TO_PUBLISH,
status: StatusBaseLocalEnum.DRAFT,
_habilitation: habilitationId.toString(),
});

16 changes: 8 additions & 8 deletions apps/api/test/publication.e2e-spec.ts
Original file line number Diff line number Diff line change
@@ -34,7 +34,7 @@ jest.mock('nodemailer');

const createTransport = nodemailer.createTransport;

describe('BASE LOCAL MODULE', () => {
describe('PUBLICATION MODULE', () => {
let app: INestApplication;
let mongod: MongoMemoryServer;
let mongoConnection: Connection;
@@ -136,13 +136,13 @@ describe('BASE LOCAL MODULE', () => {
}

describe('POST /bases-locales/sync/exec', () => {
it('Publish 200 READY_TO_PUBLISH', async () => {
it('Publish 200 DRAFT', async () => {
const commune = '91534';
const habilitationId = new Types.ObjectId();
const balId = await createBal({
commune,
_habilitation: habilitationId.toString(),
status: StatusBaseLocalEnum.READY_TO_PUBLISH,
status: StatusBaseLocalEnum.DRAFT,
emails: ['test@test.fr'],
});
const voieId = await createVoie({
@@ -466,7 +466,7 @@ describe('BASE LOCAL MODULE', () => {
JSON.stringify({
statusCode: 412,
message:
'La synchronisation pas possibles pour les Bases Adresses Locales de démo ou en mode brouillon',
'La synchronisation pas possibles pour les Bases Adresses Locales de démo',
}),
);
});
@@ -475,7 +475,7 @@ describe('BASE LOCAL MODULE', () => {
const commune = '91534';
const balId = await createBal({
commune,
status: StatusBaseLocalEnum.READY_TO_PUBLISH,
status: StatusBaseLocalEnum.DRAFT,
emails: ['test@test.fr'],
});

@@ -499,7 +499,7 @@ describe('BASE LOCAL MODULE', () => {
const balId = await createBal({
commune,
_habilitation: habilitationId.toString(),
status: StatusBaseLocalEnum.READY_TO_PUBLISH,
status: StatusBaseLocalEnum.DRAFT,
emails: ['test@test.fr'],
});

@@ -535,7 +535,7 @@ describe('BASE LOCAL MODULE', () => {
const balId = await createBal({
commune,
_habilitation: habilitationId.toString(),
status: StatusBaseLocalEnum.READY_TO_PUBLISH,
status: StatusBaseLocalEnum.DRAFT,
emails: ['test@test.fr'],
});

@@ -571,7 +571,7 @@ describe('BASE LOCAL MODULE', () => {
const balId = await createBal({
commune,
_habilitation: habilitationId.toString(),
status: StatusBaseLocalEnum.READY_TO_PUBLISH,
status: StatusBaseLocalEnum.DRAFT,
emails: ['test@test.fr'],
});

19 changes: 7 additions & 12 deletions apps/api/test/stats.e2e-spec.ts
Original file line number Diff line number Diff line change
@@ -11,7 +11,7 @@ import { StatusBaseLocalEnum } from '@/shared/schemas/base_locale/status.enum';
import { StatsModule } from '@/modules/stats/stats.module';
import { CodeCommuneDTO } from '@/modules/stats/dto/code_commune.dto';

describe('TOPONYME MODULE', () => {
describe('STATS MODULE', () => {
let app: INestApplication;
let mongod: MongoMemoryServer;
let mongoConnection: Connection;
@@ -63,7 +63,7 @@ describe('TOPONYME MODULE', () => {
await createBal({
commune: '54084',
_created: new Date('2019-01-01'),
status: StatusBaseLocalEnum.READY_TO_PUBLISH,
status: StatusBaseLocalEnum.DRAFT,
});
const balId1 = await createBal({
commune: '37003',
@@ -107,7 +107,7 @@ describe('TOPONYME MODULE', () => {
await createBal({
commune: '54084',
_created: new Date('2019-01-01'),
status: StatusBaseLocalEnum.READY_TO_PUBLISH,
status: StatusBaseLocalEnum.DRAFT,
});
await createBal({
commune: '37003',
@@ -127,11 +127,7 @@ describe('TOPONYME MODULE', () => {
const expectedRes = [
{
status: StatusBaseLocalEnum.DRAFT,
count: 1,
},
{
status: StatusBaseLocalEnum.READY_TO_PUBLISH,
count: 1,
count: 2,
},
{
status: StatusBaseLocalEnum.PUBLISHED,
@@ -141,7 +137,6 @@ describe('TOPONYME MODULE', () => {

expect(response.body).toContainEqual(expectedRes[0]);
expect(response.body).toContainEqual(expectedRes[1]);
expect(response.body).toContainEqual(expectedRes[2]);
});
});

@@ -150,7 +145,7 @@ describe('TOPONYME MODULE', () => {
await createBal({
commune: '54084',
_created: new Date('2019-01-01'),
status: StatusBaseLocalEnum.READY_TO_PUBLISH,
status: StatusBaseLocalEnum.DRAFT,
});
await createBal({
commune: '37003',
@@ -174,8 +169,8 @@ describe('TOPONYME MODULE', () => {
54084: {
total: 1,
published: 0,
draft: 0,
readyToPublish: 1,
draft: 1,
readyToPublish: 0,
demo: 0,
},
},
9 changes: 3 additions & 6 deletions libs/shared/src/modules/publication/publication.service.ts
Original file line number Diff line number Diff line change
@@ -37,12 +37,9 @@ export class PublicationService {
const baseLocale = await this.baseLocaleModel.findOne(balId);

// On vérifie que la BAL n'est pas en DEMO ou DRAFT
if (
baseLocale.status === StatusBaseLocalEnum.DEMO ||
baseLocale.status === StatusBaseLocalEnum.DRAFT
) {
if (baseLocale.status === StatusBaseLocalEnum.DEMO) {
throw new HttpException(
'La synchronisation pas possibles pour les Bases Adresses Locales de démo ou en mode brouillon',
'La synchronisation pas possibles pour les Bases Adresses Locales de démo',
HttpStatus.PRECONDITION_FAILED,
);
}
@@ -94,7 +91,7 @@ export class PublicationService {
}

// On traite ensuite le cas de la première publication
if (baseLocale.status === StatusBaseLocalEnum.READY_TO_PUBLISH) {
if (baseLocale.status === StatusBaseLocalEnum.DRAFT) {
// On créer le fichier BAL CSV
const file: string = await this.exportCsvService.exportToCsv(baseLocale);
// On créer la publication sur l'api-depot
1 change: 0 additions & 1 deletion libs/shared/src/schemas/base_locale/status.enum.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
export enum StatusBaseLocalEnum {
DRAFT = 'draft',
READY_TO_PUBLISH = 'ready-to-publish',
PUBLISHED = 'published',
DEMO = 'demo',
REPLACED = 'replaced',
Loading

0 comments on commit dae48d2

Please sign in to comment.