diff --git a/package-lock.json b/package-lock.json index d7db25b0dff7b4ec012b28af3c6fdd0284a00624..bc7e044169b7fd979c7bb4356764e667cf3ea61e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -68,7 +68,6 @@ "jsonwebtoken": "^8.5.1", "jszip": "^3.7.1", "knex": "1.0.4", - "knex-db-manager": "^0.7.0", "make-dir": "^3.1.0", "matomo-tracker": "^2.2.4", "node-fetch": "^2.6.5", @@ -4056,6 +4055,7 @@ }, "node_modules/balanced-match": { "version": "1.0.2", + "dev": true, "license": "MIT" }, "node_modules/base64-js": { @@ -4223,6 +4223,7 @@ }, "node_modules/brace-expansion": { "version": "1.1.11", + "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -5137,6 +5138,7 @@ }, "node_modules/concat-map": { "version": "0.0.1", + "dev": true, "license": "MIT" }, "node_modules/concat-stream": { @@ -8597,6 +8599,7 @@ }, "node_modules/fs.realpath": { "version": "1.0.0", + "dev": true, "license": "ISC" }, "node_modules/fsevents": { @@ -9800,6 +9803,7 @@ }, "node_modules/inflight": { "version": "1.0.6", + "dev": true, "license": "ISC", "dependencies": { "once": "^1.3.0", @@ -11477,39 +11481,6 @@ } } }, - "node_modules/knex-db-manager": { - "version": "0.7.0", - "license": "MIT", - "dependencies": { - "bluebird": "^3.7.2", - "glob": "^7.1.6", - "lodash": "^4.17.15" - }, - "engines": { - "node": ">=8.0.0" - }, - "peerDependencies": { - "knex": "0.x" - } - }, - "node_modules/knex-db-manager/node_modules/glob": { - "version": "7.1.7", - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/knex/node_modules/rechoir": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", @@ -12484,6 +12455,7 @@ }, "node_modules/minimatch": { "version": "3.0.4", + "dev": true, "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -16398,6 +16370,7 @@ }, "node_modules/path-is-absolute": { "version": "1.0.1", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -24152,7 +24125,8 @@ } }, "balanced-match": { - "version": "1.0.2" + "version": "1.0.2", + "dev": true }, "base64-js": { "version": "1.5.1", @@ -24272,6 +24246,7 @@ }, "brace-expansion": { "version": "1.1.11", + "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -24920,7 +24895,8 @@ } }, "concat-map": { - "version": "0.0.1" + "version": "0.0.1", + "dev": true }, "concat-stream": { "version": "1.6.2", @@ -27283,7 +27259,8 @@ } }, "fs.realpath": { - "version": "1.0.0" + "version": "1.0.0", + "dev": true }, "fsevents": { "version": "2.3.2", @@ -28126,6 +28103,7 @@ }, "inflight": { "version": "1.0.6", + "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -29333,27 +29311,6 @@ } } }, - "knex-db-manager": { - "version": "0.7.0", - "requires": { - "bluebird": "^3.7.2", - "glob": "^7.1.6", - "lodash": "^4.17.15" - }, - "dependencies": { - "glob": { - "version": "7.1.7", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } - } - }, "kuler": { "version": "2.0.0" }, @@ -30031,6 +29988,7 @@ }, "minimatch": { "version": "3.0.4", + "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -32815,7 +32773,8 @@ "dev": true }, "path-is-absolute": { - "version": "1.0.1" + "version": "1.0.1", + "dev": true }, "path-key": { "version": "3.1.1" diff --git a/package.json b/package.json index 562f1a52ce09f1e265080740a9d942b0d62a4426..cbc1ff4cdda78792d5052bb635f014aa58994092 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,6 @@ "db:export": "rm -rf sources && node ./dist/src/scripts/database-to-json-export.js", "db:import": "pg_restore --host=localhost --username=postgres --clean --if-exists --no-owner --no-privileges --dbname=camino ./backups/camino.sql", "db:prod-fetch": "scp -P 212 $u@camino.beta.gouv.fr:/srv/backups/camino.sql backups/", - "db:public-dump": "ts-node ./src/knex/public-copy.ts && pg_dump --clean --if-exists --host=localhost --username=postgres --format=c --no-owner --no-privileges --dbname=camino_public --file=./backups/camino-public.sql && dropdb --host=localhost --username=postgres camino_public", "db:public-import": "pg_restore --host=localhost --username=postgres --clean --if-exists --no-owner --no-privileges --dbname=camino ./backups/camino-public.sql", "db:recreate": "dropdb --host=localhost --username=postgres camino && createdb --host=localhost --username=postgres camino", "db:user": "ts-node ./src/knex/cli-user-add.ts", @@ -46,12 +45,12 @@ "documents:check": "node ./dist/src/scripts/documents-check.js", "lint": "prettier --write . && eslint --fix .", "start": "node ./dist/src/index.js", - "test": "prettier --check . && eslint . && npm run build && cross-env PGDATABASE=camino_tests jest --testPathIgnorePatterns=tests --runInBand --detectOpenHandles --forceExit", - "test:unit": "cross-env PGDATABASE=camino_tests jest --testPathIgnorePatterns=tests --runInBand --detectOpenHandles --watch", - "test:integration": "cross-env PGDATABASE=camino_tests JWT_SECRET=secret-tests jest --testPathIgnorePatterns=src --runInBand --detectOpenHandles --watch --testTimeout=20000", + "test": "cross-env jest --testPathIgnorePatterns=tests --runInBand --detectOpenHandles --forceExit", + "test:unit": "cross-env jest --testPathIgnorePatterns=tests --runInBand --detectOpenHandles --watch", + "test:integration": "cross-env JWT_SECRET=secret-tests jest --testPathIgnorePatterns=src --runInBand --detectOpenHandles --watch --testTimeout=20000", "ci:lint": "prettier --check . && eslint .", - "ci:test-unit": "cross-env PGDATABASE=camino_tests jest --testPathIgnorePatterns=tests --ci --runInBand --detectOpenHandles --forceExit --testTimeout=20000", - "ci:test-integration": "cross-env PGDATABASE=camino_tests JWT_SECRET=secret-tests JWT_SECRET_REFRESH=refresh-secret jest --testPathIgnorePatterns=src --runInBand --detectOpenHandles --ci --forceExit --testTimeout=20000", + "ci:test-unit": "cross-env jest --testPathIgnorePatterns=tests --ci --runInBand --detectOpenHandles --forceExit --testTimeout=20000", + "ci:test-integration": "cross-env JWT_SECRET=secret-tests JWT_SECRET_REFRESH=refresh-secret jest --testPathIgnorePatterns=src --runInBand --detectOpenHandles --ci --forceExit --testTimeout=20000", "ci:codecov": "codecov", "prepare": "husky install" }, @@ -119,7 +118,6 @@ "jsonwebtoken": "^8.5.1", "jszip": "^3.7.1", "knex": "1.0.4", - "knex-db-manager": "^0.7.0", "make-dir": "^3.1.0", "matomo-tracker": "^2.2.4", "node-fetch": "^2.6.5", diff --git a/src/@types/knex-db-manager.d.ts b/src/@types/knex-db-manager.d.ts deleted file mode 100644 index eb9b8ca8af3a72e3a4cfed287862e16478a80c76..0000000000000000000000000000000000000000 --- a/src/@types/knex-db-manager.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -// la version 0.6.3 de types/knex-db-manager utilise une très vieille version de knex qui génère -// des warnings lors de l’installation des dépendances NPM -declare module 'knex-db-manager' diff --git a/src/database/queries/permissions/administrations.test.ts b/src/database/queries/permissions/administrations.test.ts index 9ad640ead4457ee4b2236d9685422427643aa32a..f5ef15321deebde9f0fa13b1bd9b5e38aa65824a 100644 --- a/src/database/queries/permissions/administrations.test.ts +++ b/src/database/queries/permissions/administrations.test.ts @@ -18,9 +18,7 @@ console.error = jest.fn() const knex = dbManager.getKnex() beforeAll(async () => { - console.log('BEFORE ALL') await dbManager.populateDb(knex) - console.log('AFTER BEFORE ALL') }) afterAll(async () => { @@ -38,7 +36,6 @@ describe('administrationsTitresQuery', () => { `( "Vérifie l'écriture de la requête sur les titres dont une administration a des droits sur le type", async ({ gestionnaire, associee, visible }) => { - console.log('PLOOOOOOP') await Titres.query().delete() await AdministrationsTitresTypes.query().delete() diff --git a/src/database/queries/permissions/titres-demarches.test.ts b/src/database/queries/permissions/titres-demarches.test.ts index 911160994ef2ffcae0d33eacc3efe7a094736231..9cf2a4db5276b645f897dccc93c123cbaed3cd24 100644 --- a/src/database/queries/permissions/titres-demarches.test.ts +++ b/src/database/queries/permissions/titres-demarches.test.ts @@ -14,13 +14,15 @@ import TitresEtapes from '../../models/titres-etapes' console.info = jest.fn() console.error = jest.fn() +const knex = dbManager.getKnex() + beforeAll(async () => { - await dbManager.populateDb() + await dbManager.populateDb(knex) }) afterAll(async () => { - await dbManager.truncateDb() - await dbManager.closeKnex() + await dbManager.truncateDb(knex) + await dbManager.closeKnex(knex) }) describe('titresDemarchesQueryModify', () => { diff --git a/src/database/queries/permissions/titres-etapes.test.ts b/src/database/queries/permissions/titres-etapes.test.ts index 87f2a90aa6380624e0601180ab80a2c9eff922f9..7901cf55e00f9bab8eb0aaa812e89fb1b510ee9a 100644 --- a/src/database/queries/permissions/titres-etapes.test.ts +++ b/src/database/queries/permissions/titres-etapes.test.ts @@ -10,13 +10,14 @@ import TitresDemarches from '../../models/titres-demarches' console.info = jest.fn() console.error = jest.fn() +const knex = dbManager.getKnex() beforeAll(async () => { - await dbManager.populateDb() + await dbManager.populateDb(knex) }) afterAll(async () => { - await dbManager.truncateDb() - await dbManager.closeKnex() + await dbManager.truncateDb(knex) + await dbManager.closeKnex(knex) }) describe('titresEtapesQueryModify', () => { diff --git a/src/database/queries/titres-demarches.test.ts b/src/database/queries/titres-demarches.test.ts index a187ac4f194db4ad33df3f947361a6347cace740..a84698257903acd58666960ab8a1ee1851b4c45e 100644 --- a/src/database/queries/titres-demarches.test.ts +++ b/src/database/queries/titres-demarches.test.ts @@ -8,13 +8,14 @@ import { titreDemarcheArchive } from './titres-demarches' console.info = jest.fn() console.error = jest.fn() +const knex = dbManager.getKnex() beforeAll(async () => { - await dbManager.populateDb() + await dbManager.populateDb(knex) }) afterAll(async () => { - await dbManager.truncateDb() - await dbManager.closeKnex() + await dbManager.truncateDb(knex) + await dbManager.closeKnex(knex) }) describe('teste les requêtes sur les démarches', () => { describe('titreDemarcheArchive', () => { diff --git a/src/database/queries/titres.test.ts b/src/database/queries/titres.test.ts index 0a1847bbc444a66cf96467c7a72962626a9485d9..7e77c1b1b7587eb23f382b3309f409bbd8f3c4fb 100644 --- a/src/database/queries/titres.test.ts +++ b/src/database/queries/titres.test.ts @@ -7,14 +7,14 @@ import { titreArchive } from './titres' console.info = jest.fn() console.error = jest.fn() - +const knex = dbManager.getKnex() beforeAll(async () => { - await dbManager.populateDb() + await dbManager.populateDb(knex) }) afterAll(async () => { - await dbManager.truncateDb() - await dbManager.closeKnex() + await dbManager.truncateDb(knex) + await dbManager.closeKnex(knex) }) describe('teste les requêtes sur les titres', () => { describe('titreArchive', () => { diff --git a/src/knex/public-copy.ts b/src/knex/public-copy.ts deleted file mode 100644 index ffd531cbd30e59d346035fd9bb316ce30e2ec19e..0000000000000000000000000000000000000000 --- a/src/knex/public-copy.ts +++ /dev/null @@ -1,153 +0,0 @@ -// afin de faire un dump public de la base de données, -// ce script copie la base de données -// et supprime les informations confidentielles - -import { dbManagerConfig } from './db-manager-config' -import { knexSnakeCaseMappers } from 'objection' -import { knex, knexInit } from '../knex' - -import { databaseManagerFactory } from 'knex-db-manager' -import chalk from 'chalk' -const dbManager = databaseManagerFactory(dbManagerConfig) - -if (!process.env.PUBLIC_TITRES_IDS) { - console.error( - "La variable d'environnement PUBLIC_TITRES_IDS n'est pas définie" - ) - process.exit(1) -} - -const titresIds = process.env.PUBLIC_TITRES_IDS.split(',') - -const dbPublicName = 'camino_public' - -const dbPublicKnexConfig = { - client: 'pg', - connection: { - host: dbManagerConfig.knex.connection.host, - port: dbManagerConfig.knex.connection.port, - database: dbPublicName, - user: dbManagerConfig.knex.connection.user, - password: dbManagerConfig.knex.connection.password - }, - ...knexSnakeCaseMappers() -} - -knexInit(dbPublicKnexConfig) - -const run = async () => { - try { - console.info('Copie de la base de données…') - await dbManager.dropDb(dbPublicName) - await dbManager.copyDb( - dbManagerConfig.knex.connection.database, - dbPublicName - ) - - console.info('Suppression des informations confidentielles…') - - const titresDeleted = await knex('titres').whereNotIn('id', titresIds).del() - - console.info(`${titresDeleted} titres supprimés de la base de données`) - - const activitesDeleted = await knex('titresActivites').del() - - console.info( - `${activitesDeleted} activités supprimés de la base de données` - ) - - const utilisateursDeleted = await knex('utilisateurs').del() - - console.info( - `${utilisateursDeleted} utilisateurs supprimés de la base de données` - ) - - const titresEntreprises = [ - ...(await knex('titres_titulaires')), - ...(await knex('titres_amodiataires')) - ] - - const entreprisesIdsIndex = titresEntreprises.reduce( - (entreprisesIdsIndex, titreEntreprise) => { - entreprisesIdsIndex[titreEntreprise.entrepriseId] = true - - return entreprisesIdsIndex - }, - {} - ) - - const entreprisesDeleted = await knex('entreprises') - .whereNotIn('id', Object.keys(entreprisesIdsIndex)) - .del() - - console.info( - `${entreprisesDeleted} entreprises supprimées de la base de données` - ) - - const titresAdministrations = [ - ...(await knex('titres_administrations_gestionnaires')), - ...(await knex('titres_administrations_locales')) - ] - - const administrationsIdsIndex = titresAdministrations.reduce( - (administrationsIdsIndex, titreAdministration) => { - administrationsIdsIndex[titreAdministration.administrationId] = true - - return administrationsIdsIndex - }, - {} - ) - - const administrationsDeleted = await knex('administrations') - .whereNotIn('id', Object.keys(administrationsIdsIndex)) - .del() - - console.info( - `${administrationsDeleted} administrations supprimées de la base de données` - ) - - const titresCommunes = await knex('titres_communes') - - const communesIdsIndex = titresCommunes.reduce( - (communesIdsIndex, titreCommune) => { - communesIdsIndex[titreCommune.communeId] = true - - return communesIdsIndex - }, - {} - ) - - const communesDeleted = await knex('communes') - .whereNotIn('id', Object.keys(communesIdsIndex)) - .del() - - console.info(`${communesDeleted} communes supprimées de la base de données`) - - const titresSubstances = await knex('titres_substances') - - const substancesIdsIndex = titresSubstances.reduce( - (substancesIdsIndex, titreSubstance) => { - substancesIdsIndex[titreSubstance.substanceId] = true - - return substancesIdsIndex - }, - {} - ) - - const substancesDeleted = await knex('substances') - .whereNotIn('id', Object.keys(substancesIdsIndex)) - .del() - - console.info( - `${substancesDeleted} substances supprimées de la base de données` - ) - - process.exit() - } catch (e) { - console.error(chalk.red(e)) - - process.exit(1) - } -} - -run() diff --git a/tests/db-manager.ts b/tests/db-manager.ts index 491bb2005ec306d77c5e962c9ce8b0d33d30c8ee..fbd70e56d83387e4b662a53b18829d90cea326df 100644 --- a/tests/db-manager.ts +++ b/tests/db-manager.ts @@ -17,8 +17,16 @@ class DbManager { process.env.DB_NAME = this.dbName } + private static getPgUser() { + return process.env.PGUSER ?? 'postgres' + } + + private static getPgPassword() { + return process.env.PGPASSWORD ?? 'password' + } + public async init(): Promise<void> { - const globalConnection = 'postgres://postgres:password@localhost/postgres' + const globalConnection = `postgres://${DbManager.getPgUser()}:${DbManager.getPgPassword()}@localhost/postgres` const globalClient = new Client(globalConnection) await globalClient.connect() const queryResult = await globalClient.query( @@ -42,8 +50,8 @@ class DbManager { host: 'localhost', port: 5432, database: this.dbName, - user: 'postgres', - password: 'password' + user: DbManager.getPgUser(), + password: DbManager.getPgPassword() }, migrations: { directory: [join(__dirname, '../src/knex/migrations-schema')] @@ -68,7 +76,7 @@ class DbManager { } public async closeKnex(knex: Knex<any, unknown[]>): Promise<void> { - knex.destroy() + await knex.destroy() } public setGlobally(knex: Knex<any, unknown[]>): void { diff --git a/tsconfig.json b/tsconfig.json index ad7875727f82678f3091bd1d197dae7ab5417d5f..35c3065f9906f79c3f79d5985d2ab5cb5d3226da 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -24,7 +24,6 @@ "geojson-rewind": ["./src/@types/geojson-rewind"], "graphql-fields": ["./src/@types/graphql-fields"], "html-to-text": ["./src/@types/html-to-text"], - "knex-db-manager": ["./src/@types/knex-db-manager"], "matomo-tracker": ["./src/@types/matomo-tracker"], "momoa": ["./src/@types/momoa"], "turf-center": ["./src/@types/turf-center"],