diff --git a/knex/migrations/20180522000001_titres.js b/knex/migrations/20180522000001_titres.js index e596c5dd82b4cb2d8b349cd15ac36ce576d58527..8760922946660ab8686815fe6a3c2428f28a6978 100644 --- a/knex/migrations/20180522000001_titres.js +++ b/knex/migrations/20180522000001_titres.js @@ -24,6 +24,7 @@ exports.up = knex => table.string('communesTitreEtapeId', 128) table.string('doublonTitreId', 128) table.jsonb('propsTitreEtapesIds') + table.specificType('coordonnees', 'POINT').index(null, 'GIST') }) exports.down = knex => knex.schema.dropTable('titres') diff --git a/package.json b/package.json index bdaa759f623ea5cbd45fc9d951b675697331a6d9..afdae2af31a527c5199c26ecd90eff5fdd51a809 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "node": ">=14.15.0", "npm": ">=6.14.0" }, - "main": "index.js", + "main": "dist/index.js", "scripts": { "bim": "npm i && npm run build && npm run db:recreate && npm run db:import", "build": "rm -rf dist && tsc && mkdir -p ./dist/api/graphql && cp -r ./src/api/graphql/schemas ./dist/api/graphql", diff --git a/src/api/_format/titres.ts b/src/api/_format/titres.ts index 05d1d335ba1ecdd11487b5792364d70fe2e9a520..e0110225ee7c01981cc7a8bde412db22a0dc238b 100644 --- a/src/api/_format/titres.ts +++ b/src/api/_format/titres.ts @@ -9,8 +9,7 @@ import { import { geojsonFeatureMultiPolygon, - geojsonFeatureCollectionPoints, - geojsonCentre + geojsonFeatureCollectionPoints } from '../../tools/geojson' import { dupRemove } from '../../tools/index' @@ -128,20 +127,22 @@ const titreFormat = ( ) => { if (!fields) return t - if (t.points?.length) { - if (fields.geojsonMultiPolygon) { - t.geojsonMultiPolygon = geojsonFeatureMultiPolygon(t.points) as IGeoJson - } + if (fields.geojsonMultiPolygon && t.points?.length) { + t.geojsonMultiPolygon = geojsonFeatureMultiPolygon(t.points) as IGeoJson + } - if (fields.geojsonPoints) { - t.geojsonPoints = geojsonFeatureCollectionPoints(t.points) as IGeoJson - } - if (fields.geojsonCentre) { - let geojsonMultiPolygon = t.geojsonMultiPolygon - if (!geojsonMultiPolygon) { - geojsonMultiPolygon = geojsonFeatureMultiPolygon(t.points) as IGeoJson - } - t.geojsonCentre = geojsonCentre(geojsonMultiPolygon, t.pointsTitreEtapeId) + if (fields.geojsonPoints && t.points?.length) { + t.geojsonPoints = geojsonFeatureCollectionPoints(t.points) as IGeoJson + } + + if (fields.geojsonCentre && t.coordonnees && t.pointsTitreEtapeId) { + t.geojsonCentre = { + type: 'Feature', + geometry: { + type: 'Point', + coordinates: [t.coordonnees.x, t.coordonnees.y] + }, + properties: { etapeId: t.pointsTitreEtapeId } } } diff --git a/src/business/_updates-log.ts b/src/business/_updates-log.ts index e63941d150465fa1d54981454a37162a59961d69..d47843051f009b0683306a1182a77a33f69cd827 100644 --- a/src/business/_updates-log.ts +++ b/src/business/_updates-log.ts @@ -30,6 +30,7 @@ const updatesLog = ({ titresEtapesAdministrationsLocalesDeleted, titresPropsEtapeIdUpdated, titresPropsContenuUpdated, + titresCoordonneesUpdated, titresTravauxEtapesOrdreUpdated, titresTravauxOrdreUpdated, titresActivitesCreated, @@ -62,6 +63,7 @@ const updatesLog = ({ titresEtapesAdministrationsLocalesDeleted?: ITitreAdministrationLocale[] titresPropsEtapeIdUpdated?: string[] titresPropsContenuUpdated?: string[] + titresCoordonneesUpdated?: string[] titresTravauxEtapesOrdreUpdated?: string[] titresTravauxOrdreUpdated?: string[] titresActivitesCreated?: string[] @@ -203,6 +205,12 @@ const updatesLog = ({ ) } + if (titresCoordonneesUpdated?.length) { + console.info( + `mise à jour: ${titresCoordonneesUpdated.length} titres(s) (propriétés-étapes)` + ) + } + if (titresTravauxEtapesOrdreUpdated?.length) { console.info( `mise à jour: ${titresTravauxEtapesOrdreUpdated.length} étape(s) de travaux (ordre)` diff --git a/src/business/daily.ts b/src/business/daily.ts index ceb98b8b32f0863e9d67c18d596ba40d8676cf90..bd18c0aee0c6af0e56325c4c3e5d0098ee513793 100644 --- a/src/business/daily.ts +++ b/src/business/daily.ts @@ -19,6 +19,7 @@ import titresTravauxOrdreUpdate from './processes/titres-travaux-ordre-update' import titresTravauxEtapesOrdreUpdate from './processes/titres-travaux-etapes-ordre-update' import { matomoCacheInit } from '../tools/api-matomo' import updatesLog from './_updates-log' +import titresCoordonneesUpdate from './processes/titres-coordonnees-update' const daily = async () => { try { @@ -59,6 +60,8 @@ const daily = async () => { } = await titresEtapesAdministrationsLocalesUpdate() const titresPropsEtapeIdUpdated = await titresPropsEtapeIdUpdate() const titresPropsContenuUpdated = await titresPropsContenuUpdate() + + const titresCoordonneesUpdated = await titresCoordonneesUpdate() const titresTravauxEtapesOrdreUpdated = await titresTravauxEtapesOrdreUpdate() const titresTravauxOrdreUpdated = await titresTravauxOrdreUpdate() const titresActivitesCreated = await titresActivitesUpdate() @@ -93,6 +96,7 @@ const daily = async () => { titresEtapesAdministrationsLocalesDeleted, titresPropsEtapeIdUpdated, titresPropsContenuUpdated, + titresCoordonneesUpdated, titresTravauxEtapesOrdreUpdated, titresTravauxOrdreUpdated, titresActivitesCreated, diff --git a/src/business/processes/titres-coordonnees-update.test.ts b/src/business/processes/titres-coordonnees-update.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..6536a3539830e1ea69136334024c408b6272dd99 --- /dev/null +++ b/src/business/processes/titres-coordonnees-update.test.ts @@ -0,0 +1,73 @@ +import { mocked } from 'ts-jest/utils' +import titreCoordonneesFind from '../rules/titre-coordonnees-find' +import { titresGet } from '../../database/queries/titres' +import Titres from '../../database/models/titres' +import titresCoordonneesUpdate from './titres-coordonnees-update' + +jest.mock('../../database/queries/titres', () => ({ + titreUpdate: jest.fn().mockResolvedValue(true), + titresGet: jest.fn() +})) +jest.mock('../rules/titre-coordonnees-find', () => ({ + default: jest.fn() +})) + +const titresGetMock = mocked(titresGet, true) +const titreCoordonneesFindMock = mocked(titreCoordonneesFind, true) + +console.info = jest.fn() + +describe('coordoonnées des titres', () => { + test.each([{ x: 1, y: 1 }, { x: 1 }, { y: 1 }, undefined])( + "met à jour les coordonnees d'un titre", + async coordonnees => { + titresGetMock.mockResolvedValue([ + { id: 'titre-id', coordonnees } + ] as Titres[]) + titreCoordonneesFindMock.mockReturnValue({ x: 1, y: 0.5 }) + + const titresCoordonneesUpdated = await titresCoordonneesUpdate() + + expect(titresCoordonneesUpdated.length).toEqual(1) + } + ) + + test.each([null, { x: null, y: 1 }])( + "enlève les coordonnees d'un titre sans points", + async coordonnees => { + titresGetMock.mockResolvedValue([ + { id: 'titre-id', coordonnees: { x: 1, y: 1 } } + ] as Titres[]) + titreCoordonneesFindMock.mockReturnValue(coordonnees) + + const titresCoordonneesUpdated = await titresCoordonneesUpdate() + + expect(titresCoordonneesUpdated.length).toEqual(1) + } + ) + + test("met à jour les coordonnees d'un titre", async () => { + titresGetMock.mockResolvedValue([ + { id: 'titre-id', coordonnees: null } + ] as Titres[]) + titreCoordonneesFindMock.mockReturnValue({ x: null, y: 1 }) + + const titresCoordonneesUpdated = await titresCoordonneesUpdate() + + expect(titresCoordonneesUpdated.length).toEqual(1) + }) + + test('ne met à jour aucun titre', async () => { + titresGetMock.mockResolvedValue([ + { + id: 'titre-type-id', + coordonnees: { x: 1, y: 0.5 } + } + ] as Titres[]) + titreCoordonneesFindMock.mockReturnValue({ x: 1, y: 0.5 }) + + const titresCoordonneesUpdated = await titresCoordonneesUpdate() + + expect(titresCoordonneesUpdated.length).toEqual(0) + }) +}) diff --git a/src/business/processes/titres-coordonnees-update.ts b/src/business/processes/titres-coordonnees-update.ts new file mode 100644 index 0000000000000000000000000000000000000000..6814a570055becf301c640e3c6084259a6b1a7d8 --- /dev/null +++ b/src/business/processes/titres-coordonnees-update.ts @@ -0,0 +1,49 @@ +import PQueue from 'p-queue' + +import { titresGet, titreUpdate } from '../../database/queries/titres' +import titreCoordoneesFind from '../rules/titre-coordonnees-find' + +const titresCoordonneesUpdate = async (titresIds?: string[]) => { + console.info() + console.info('coordonnées des titres…') + const queue = new PQueue({ concurrency: 100 }) + + const titres = await titresGet( + { ids: titresIds }, + { fields: { points: { id: {} } } }, + 'super' + ) + + const titresCoordonneesUpdated = [] as string[] + + titres.forEach(titre => { + const coordonnees = titreCoordoneesFind(titre.points) + + if ( + (coordonnees && + titre.coordonnees && + (coordonnees.x !== titre.coordonnees.x || + coordonnees.y !== titre.coordonnees.y)) || + !coordonnees !== !titre.coordonnees + ) { + queue.add(async () => { + await titreUpdate(titre.id, { coordonnees }) + + const log = { + type: 'titre : coordonnées (mise à jour) ->', + value: `${titre.id} : ${coordonnees?.x}, ${coordonnees?.y}` + } + + console.info(log.type, log.value) + + titresCoordonneesUpdated.push(titre.id) + }) + } + }) + + await queue.onIdle() + + return titresCoordonneesUpdated +} + +export default titresCoordonneesUpdate diff --git a/src/business/processes/titres-props-etape-id-update.ts b/src/business/processes/titres-props-etape-id-update.ts index 3798d8f819d75d27315361e8f5d2cb37a8f33f1a..86dd664fb5f7d9cf08b80ce62c64f1a9e27280b8 100644 --- a/src/business/processes/titres-props-etape-id-update.ts +++ b/src/business/processes/titres-props-etape-id-update.ts @@ -44,7 +44,7 @@ const titresPropsEtapeIdsUpdate = async (titresIds?: string[]) => { 'super' ) - const titresIdsUpdated = [] as string[] + const titresPropsEtapeIdsUpdated = [] as string[] titres.forEach(titre => { const props = titrePropsEtapes.reduce( @@ -78,14 +78,14 @@ const titresPropsEtapeIdsUpdate = async (titresIds?: string[]) => { console.info(log.type, log.value) - titresIdsUpdated.push(titre.id) + titresPropsEtapeIdsUpdated.push(titre.id) }) } }) await queue.onIdle() - return titresIdsUpdated + return titresPropsEtapeIdsUpdated } export { titrePropsEtapes } diff --git a/src/business/rules/__mocks__/titre-coordonnees-find.ts b/src/business/rules/__mocks__/titre-coordonnees-find.ts new file mode 100644 index 0000000000000000000000000000000000000000..1e0e620e57706e0d09f862676b0c21436adc92b1 --- /dev/null +++ b/src/business/rules/__mocks__/titre-coordonnees-find.ts @@ -0,0 +1,44 @@ +import { ITitrePoint } from '../../../types' + +const titrePoints = [ + { + id: 'h-cx-courdemanges-1988-oct01-dpu01-1', + groupe: 1, + contour: 1, + point: 1, + coordonnees: { x: 0, y: 0 } + }, + { + id: 'h-cx-courdemanges-1988-oct01-dpu01-2', + groupe: 1, + contour: 1, + point: 2, + coordonnees: { x: 0, y: 1 } + }, + { + id: 'h-cx-courdemanges-1988-oct01-dpu01-3', + groupe: 1, + contour: 1, + point: 1, + coordonnees: { x: 1, y: 1 } + } +] as ITitrePoint[] + +const titreGeojson = { + type: 'Feature', + properties: { etapeId: 'h-cx-courdemanges-1988-oct01-dpu01' }, + geometry: { + type: 'MultiPolygon', + coordinates: [ + [ + [ + [1, 1], + [0, 1], + [1, 1] + ] + ] + ] + } +} + +export { titrePoints, titreGeojson } diff --git a/src/business/rules/titre-coordonnees-find.test.ts b/src/business/rules/titre-coordonnees-find.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..7fd7e5c8b04a7c88ebe69db4d15f8835c310df03 --- /dev/null +++ b/src/business/rules/titre-coordonnees-find.test.ts @@ -0,0 +1,23 @@ +import { mocked } from 'ts-jest/utils' +import titreCoordonneesFind from './titre-coordonnees-find' +import { geojsonFeatureMultiPolygon } from '../../tools/geojson' + +import { titrePoints, titreGeojson } from './__mocks__/titre-coordonnees-find' + +jest.mock('../../tools/geojson', () => ({ + geojsonFeatureMultiPolygon: jest.fn() +})) + +const geojsonFeatureMultiPolygonMock = mocked(geojsonFeatureMultiPolygon, true) + +describe("coordonnées d'un titre", () => { + test("retourne les coordonnées d'un titre", () => { + geojsonFeatureMultiPolygonMock.mockReturnValue(titreGeojson) + expect(titreCoordonneesFind(titrePoints)).toMatchObject({ x: 0.5, y: 1 }) + }) + + test("retourne null si le titre n'a pas de points", () => { + expect(titreCoordonneesFind([])).toBeNull() + expect(titreCoordonneesFind(null)).toBeNull() + }) +}) diff --git a/src/business/rules/titre-coordonnees-find.ts b/src/business/rules/titre-coordonnees-find.ts new file mode 100644 index 0000000000000000000000000000000000000000..dbbd1d82150241784bf20dde86a4717c1e578c78 --- /dev/null +++ b/src/business/rules/titre-coordonnees-find.ts @@ -0,0 +1,14 @@ +import { ITitrePoint } from '../../types' +import center from '@turf/center' +import { geojsonFeatureMultiPolygon } from '../../tools/geojson' + +const titreCoordonneesFind = (titrePoints?: ITitrePoint[] | null) => { + if (!titrePoints?.length) return null + + const geojson = geojsonFeatureMultiPolygon(titrePoints) + const [x, y] = center(geojson).geometry.coordinates + + return { x, y } +} + +export default titreCoordonneesFind diff --git a/src/business/titre-demarche-update.ts b/src/business/titre-demarche-update.ts index 4fae2fb749133816bd4babb6ec6d83601fad977e..d43beca1dd3b52554eb3f5b3e1220ed4768c3518 100644 --- a/src/business/titre-demarche-update.ts +++ b/src/business/titre-demarche-update.ts @@ -11,6 +11,7 @@ import titresDemarchesOrdreUpdate from './processes/titres-demarches-ordre-updat import titresPublicUpdate from './processes/titres-public-update' import { titresIdsUpdate } from './processes/titres-ids-update' import updatesLog from './_updates-log' +import titresCoordonneesUpdate from './processes/titres-coordonnees-update' const titreDemarcheUpdate = async ( titreDemarcheId: string | null, @@ -53,6 +54,7 @@ const titreDemarcheUpdate = async ( const titresDatesUpdated = await titresDatesUpdate([titreId]) const titresPropsEtapeIdUpdated = await titresPropsEtapeIdUpdate([titreId]) const titresPropsContenuUpdated = await titresPropsContenuUpdate([titreId]) + const titresCoordonneesUpdated = await titresCoordonneesUpdate([titreId]) const titresActivitesCreated = await titresActivitesUpdate([titreId]) // met à jour l'id dans le titre par effet de bord @@ -72,6 +74,7 @@ const titreDemarcheUpdate = async ( titresDatesUpdated, titresPropsEtapeIdUpdated, titresPropsContenuUpdated, + titresCoordonneesUpdated, titresActivitesCreated, titresUpdatedIndex }) diff --git a/src/business/titre-etape-update.ts b/src/business/titre-etape-update.ts index d2a7f306a4440b641c46f32b71f2297fcb955e98..3b3ead3de3f3958b25ec5a97c0ed357aa8210788 100644 --- a/src/business/titre-etape-update.ts +++ b/src/business/titre-etape-update.ts @@ -16,6 +16,7 @@ import titresPropsContenuUpdate from './processes/titres-props-contenu-update' import { titresIdsUpdate } from './processes/titres-ids-update' import titresPublicUpdate from './processes/titres-public-update' import updatesLog from './_updates-log' +import titresCoordonneesUpdate from './processes/titres-coordonnees-update' const titreEtapeUpdate = async ( titreEtapeId: string | null, @@ -93,6 +94,7 @@ const titreEtapeUpdate = async ( } = await titresEtapesAdministrationsLocalesUpdate([titreId]) const titresPropsEtapeIdUpdated = await titresPropsEtapeIdUpdate([titreId]) const titresPropsContenuUpdated = await titresPropsContenuUpdate([titreId]) + const titresCoordonneesUpdated = await titresCoordonneesUpdate([titreId]) const titresActivitesCreated = await titresActivitesUpdate([titreId]) // met à jour l'id dans le titre par effet de bord @@ -121,6 +123,7 @@ const titreEtapeUpdate = async ( titresEtapesAdministrationsLocalesDeleted, titresPropsEtapeIdUpdated, titresPropsContenuUpdated, + titresCoordonneesUpdated, titresActivitesCreated, titresUpdatedIndex }) diff --git a/src/database/models/documents.ts b/src/database/models/documents.ts index d99bbe1a01fa4d23ff0f1d2d76199dcc8dd1bdd0..f8857a1a1590a8df39feab59be33eafc5ef7cfc3 100644 --- a/src/database/models/documents.ts +++ b/src/database/models/documents.ts @@ -91,19 +91,17 @@ class Document extends Model { } public $formatDatabaseJson(json: Pojo): Pojo { - json = super.$formatDatabaseJson(json) - delete json.modification delete json.suppression + json = super.$formatDatabaseJson(json) return json } public $parseJson(json: Pojo): Pojo { - json = super.$parseJson(json) - delete json.modification delete json.suppression + json = super.$parseJson(json) return json } diff --git a/src/database/models/titres-activites.ts b/src/database/models/titres-activites.ts index ac0307dc608e2b80e4a7327aaa7b05d924253470..1c4a090d0d65313956eb9ac8e71de7411bf0796e 100644 --- a/src/database/models/titres-activites.ts +++ b/src/database/models/titres-activites.ts @@ -100,8 +100,6 @@ class TitresActivites extends Model { } public $parseJson(json: Pojo) { - json = super.$parseJson(json) - if (!json.id && json.titreId && json.typeId && json.frequencePeriodeId) { const id = `${json.titreId}-${json.typeId}-${ json.annee @@ -111,15 +109,15 @@ class TitresActivites extends Model { delete json.modification delete json.documentsCreation + json = super.$parseJson(json) return json } public $formatDatabaseJson(json: Pojo) { - json = super.$formatDatabaseJson(json) - delete json.modification delete json.documentsCreation + json = super.$formatDatabaseJson(json) return json } diff --git a/src/database/models/titres-demarches.ts b/src/database/models/titres-demarches.ts index 22c2212784ea8d2bed681ebfcf01909c02afb227..6740bbd565dbfb25f882e092daa1d39828f8445b 100644 --- a/src/database/models/titres-demarches.ts +++ b/src/database/models/titres-demarches.ts @@ -115,8 +115,6 @@ class TitresDemarches extends Model { } public $parseJson(json: Pojo) { - json = super.$parseJson(json) - if (!json.id && json.titreId && json.typeId) { json.id = `${json.titreId}-${json.typeId}99` } @@ -124,16 +122,16 @@ class TitresDemarches extends Model { delete json.modification delete json.suppression delete json.etapesCreation + json = super.$parseJson(json) return json } public $formatDatabaseJson(json: Pojo) { - json = super.$formatDatabaseJson(json) - delete json.modification delete json.suppression delete json.etapesCreation + json = super.$formatDatabaseJson(json) return json } diff --git a/src/database/models/titres-etapes.ts b/src/database/models/titres-etapes.ts index 8a861a9b313e2ca645a77acb628b20c8196f3054..7cef04b38fb939a5f7d361357914a8c1eb4d697c 100644 --- a/src/database/models/titres-etapes.ts +++ b/src/database/models/titres-etapes.ts @@ -194,8 +194,6 @@ class TitresEtapes extends Model { } public $formatDatabaseJson(json: Pojo) { - json = super.$formatDatabaseJson(json) - if (json.pays) { delete json.pays } @@ -203,13 +201,12 @@ class TitresEtapes extends Model { delete json.modification delete json.suppression delete json.justificatifsAssociation + json = super.$formatDatabaseJson(json) return json } public $parseJson(json: Pojo) { - json = super.$parseJson(json) - if (!json.id && json.titreDemarcheId && json.typeId) { json.id = `${json.titreDemarcheId}-${json.typeId}99` } @@ -249,10 +246,10 @@ class TitresEtapes extends Model { delete json.geojsonMultiPolygon delete json.geojsonPoints - delete json.modification delete json.suppression delete json.justificatifsAssociation + json = super.$parseJson(json) return json } diff --git a/src/database/models/titres-points.ts b/src/database/models/titres-points.ts index 699978b2ff09110aa8853bc01841410bd8d7dc8d..ead8d8b1d6655e799c336793c3217c8f0baf11fa 100644 --- a/src/database/models/titres-points.ts +++ b/src/database/models/titres-points.ts @@ -18,10 +18,7 @@ class TitresPoints extends Model { description: { type: ['string', 'null'] }, coordonnees: { type: 'object', - properties: { - x: { type: 'number' }, - y: { type: 'number' } - } + properties: { x: { type: 'number' }, y: { type: 'number' } } }, groupe: { type: 'integer' }, contour: { type: 'integer' }, diff --git a/src/database/models/titres-travaux-etapes.ts b/src/database/models/titres-travaux-etapes.ts index d0269a042a1e539e6f98bc487d400af1a852ea8b..e21624a053882ea6c68868167e4ad2f10f5bc1a2 100644 --- a/src/database/models/titres-travaux-etapes.ts +++ b/src/database/models/titres-travaux-etapes.ts @@ -69,23 +69,21 @@ class TitresTravauxEtapes extends Model { } public $formatDatabaseJson(json: Pojo) { - json = super.$formatDatabaseJson(json) - delete json.modification delete json.suppression + json = super.$formatDatabaseJson(json) return json } public $parseJson(json: Pojo) { - json = super.$parseJson(json) - if (!json.id && json.titreTravauxId && json.typeId) { json.id = `${json.titreTravauxId}-${json.typeId}99` } delete json.modification delete json.suppression + json = super.$parseJson(json) return json } diff --git a/src/database/models/titres-travaux.ts b/src/database/models/titres-travaux.ts index cafdfaf4b6e26a8971c73f7529ebe52b15435fb0..3386caede189b1567c81c8a8ae016fd0733bb100 100644 --- a/src/database/models/titres-travaux.ts +++ b/src/database/models/titres-travaux.ts @@ -65,8 +65,6 @@ class TitresTravaux extends Model { } public $parseJson(json: Pojo) { - json = super.$parseJson(json) - if (!json.id && json.titreId && json.typeId) { json.id = `${json.titreId}-${json.typeId}99` } @@ -74,16 +72,16 @@ class TitresTravaux extends Model { delete json.modification delete json.suppression delete json.etapesCreation + json = super.$parseJson(json) return json } public $formatDatabaseJson(json: Pojo) { - json = super.$formatDatabaseJson(json) - delete json.modification delete json.suppression delete json.etapesCreation + json = super.$formatDatabaseJson(json) return json } diff --git a/src/database/models/titres.ts b/src/database/models/titres.ts index 40c0a0fdcbab21615b664c0a7847014d102dcb7a..fc06a2b83f07142f9009ba992032b821a188b8df 100644 --- a/src/database/models/titres.ts +++ b/src/database/models/titres.ts @@ -40,7 +40,11 @@ class Titres extends Model { administrationsTitreEtapeId: { type: ['string', 'null'], maxLength: 128 }, surfaceTitreEtapeId: { type: ['string', 'null'], maxLength: 128 }, communesTitreEtapeId: { type: ['string', 'null'], maxLength: 128 }, - propsTitreEtapesIds: { type: 'json' } + propsTitreEtapesIds: { type: 'json' }, + coordonnees: { + type: ['object', 'null'], + properties: { x: { type: 'number' }, y: { type: 'number' } } + } } } @@ -218,17 +222,19 @@ class Titres extends Model { } public $parseJson(json: Pojo) { - json = super.$parseJson(json) - json = titreInsertFormat(json) + json = super.$parseJson(json) return json } public $formatDatabaseJson(json: Pojo) { - json = super.$formatDatabaseJson(json) + if (json.coordonnees) { + json.coordonnees = `${json.coordonnees.x},${json.coordonnees.y}` + } json = titreInsertFormat(json) + json = super.$formatDatabaseJson(json) return json } diff --git a/src/database/models/utilisateurs.ts b/src/database/models/utilisateurs.ts index d13a11969fa2b0dee685230745803d8eefad82ef..f649d294c1b4e645615388296e015213f4d83343 100644 --- a/src/database/models/utilisateurs.ts +++ b/src/database/models/utilisateurs.ts @@ -67,21 +67,19 @@ class Utilisateurs extends Model { } public $parseJson(json: Pojo) { - json = super.$parseJson(json) - delete json.modification delete json.suppression delete json.permissionModification + json = super.$parseJson(json) return json } public $formatDatabaseJson(json: Pojo) { - json = super.$formatDatabaseJson(json) - delete json.modification delete json.suppression delete json.permissionModification + json = super.$formatDatabaseJson(json) return json } diff --git a/src/database/queries/graph/format.ts b/src/database/queries/graph/format.ts index 4540df4c97de1faa05045a948c024eb718a9ef24..592739ed3cf7dc79495b3b57283da4c7dc0c5e1f 100644 --- a/src/database/queries/graph/format.ts +++ b/src/database/queries/graph/format.ts @@ -16,12 +16,8 @@ const fieldsOrderAsc = [ 'titresTypesTitresStatuts' ] const fieldsToRemove = ['coordonnees'] -const titreFieldsToRemove = [] as string[] -const geoFieldsToReplace = [ - 'geojsonPoints', - 'geojsonMultiPolygon', - 'geojsonCentre' -] +const titreFieldsToRemove = ['geojsonCentre'] as string[] +const geoFieldsToReplace = ['geojsonPoints', 'geojsonMultiPolygon'] const titrePropsEtapesFields = ['surface'] interface IFields { diff --git a/src/tools/__mock__/geojson.ts b/src/tools/__mock__/geojson.ts new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/src/tools/geojson.ts b/src/tools/geojson.ts index ea669642c767b47eb5d873867b658f270ec133b9..082a284107630b34c3ce411f1f2aef73a8869dcd 100644 --- a/src/tools/geojson.ts +++ b/src/tools/geojson.ts @@ -1,6 +1,5 @@ -import { ITitrePoint, IGeometry, IGeoJson } from '../types' +import { ITitrePoint, IGeometry } from '../types' import * as rewind from 'geojson-rewind' -import center from '@turf/center' // convertit des points // en un geojson de type 'MultiPolygon' @@ -38,27 +37,6 @@ const geojsonFeatureCollectionPoints = (points: ITitrePoint[]) => ({ })) }) -const geojsonCentre = ( - geojsonMultiPolygon: IGeoJson | undefined, - etapeId?: string | null -) => { - if (geojsonMultiPolygon) { - const centreCoords = center(geojsonMultiPolygon).geometry?.coordinates - if (centreCoords && centreCoords.length === 2) { - return { - type: 'Feature', - geometry: { - type: 'Point', - coordinates: centreCoords - }, - properties: { etapeId } - } - } - } - - return undefined -} - // convertit une liste de points // en un tableau 'coordinates' geoJson // (le premier et le dernier point d'un contour ont les mêmes coordonnées) @@ -92,8 +70,4 @@ const multiPolygonContoursClose = (groupes: number[][][][]) => }, []) ) -export { - geojsonFeatureMultiPolygon, - geojsonFeatureCollectionPoints, - geojsonCentre -} +export { geojsonFeatureMultiPolygon, geojsonFeatureCollectionPoints } diff --git a/src/types.ts b/src/types.ts index 72abf189a6061a3c2c7ad09d04bfcd2b2d4f91c8..52cde59563c7b176d00cef2781d16ce7340384b1 100644 --- a/src/types.ts +++ b/src/types.ts @@ -497,6 +497,7 @@ interface ITitre { substances?: ISubstance[] | null pointsTitreEtapeId?: string | null points?: ITitrePoint[] | null + coordonnees?: ICoordonnees | null geojsonMultiPolygon?: IGeoJson | null geojsonPoints?: IGeoJson | null geojsonCentre?: IGeoJsonCentre | null @@ -923,7 +924,6 @@ export { IFrequence, IGeoJson, IGeoJsonProperties, - IGeoJsonCentre, IApiGeoResult, IGeometry, IGeoSysteme, diff --git a/tsconfig.json b/tsconfig.json index 95c82ba4cd9d7e3f6cae5a46f5ce444dfa70735b..a18a74f24f4f1dd4d098c3d79df84fd15887c659 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -49,7 +49,7 @@ ] }, { - "title": "Developpement", + "title": "Développement", "pages": [ { "title": "Introduction",