Skip to content
Snippets Groups Projects
Unverified Commit 97ffbe28 authored by BITARD Michaël's avatar BITARD Michaël Committed by GitHub
Browse files

chore(node): met à jour typescript (#591)

parent 9728b000
Branches
Tags
No related merge requests found
Showing
with 1134 additions and 1684 deletions
Source diff could not be displayed: it is too large. Options to address this: view the blob.
{ {
"upgrade": true, "upgrade": true,
"reject": ["@sindresorhus/slugify", "@types/node-fetch", "chalk", "crypto-random-string", "email-regex", "decamelize", "dateformat", "node-fetch", "camelcase", "graphql-upload", "express-jwt"] "reject": ["@sindresorhus/slugify", "@types/node-fetch", "chalk", "email-regex", "decamelize", "dateformat", "node-fetch", "camelcase", "graphql-upload", "express-jwt"]
} }
...@@ -34,7 +34,7 @@ ...@@ -34,7 +34,7 @@
"matrices": "node --loader ts-node/esm/transpile-only ./src/scripts/matrices.ts" "matrices": "node --loader ts-node/esm/transpile-only ./src/scripts/matrices.ts"
}, },
"@comment dependencies": { "@comment dependencies": {
"modules esm": "crypto-random-string, @sindresorhus/slugify, email-regex, decamelize, node-fetch à ne pas updater tant que on ne compile pas pour es2020: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c. Pas simple de migrer ts-node.", "modules esm": "@sindresorhus/slugify, email-regex, decamelize, node-fetch à ne pas updater tant que on ne compile pas pour es2020: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c. Pas simple de migrer ts-node.",
"express-graphql": "bloque l'upgrade de graphql" "express-graphql": "bloque l'upgrade de graphql"
}, },
"dependencies": { "dependencies": {
...@@ -46,6 +46,8 @@ ...@@ -46,6 +46,8 @@
"@sindresorhus/slugify": "^1.1.2", "@sindresorhus/slugify": "^1.1.2",
"@turf/center": "^6.5.0", "@turf/center": "^6.5.0",
"@turf/intersect": "^6.5.0", "@turf/intersect": "^6.5.0",
"@tus/file-store": "^1.0.0-beta.1",
"@tus/server": "^1.0.0-beta.5",
"@types/basic-auth": "^1.1.3", "@types/basic-auth": "^1.1.3",
"@types/bcryptjs": "^2.4.2", "@types/bcryptjs": "^2.4.2",
"@types/compression": "1.7.2", "@types/compression": "1.7.2",
...@@ -67,7 +69,6 @@ ...@@ -67,7 +69,6 @@
"compression": "^1.7.4", "compression": "^1.7.4",
"cookie-parser": "^1.4.6", "cookie-parser": "^1.4.6",
"cors": "^2.8.5", "cors": "^2.8.5",
"crypto-random-string": "^3.3.1",
"decamelize": "^5.0.0", "decamelize": "^5.0.0",
"dotenv": "^16.0.1", "dotenv": "^16.0.1",
"email-regex": "4.0.0", "email-regex": "4.0.0",
...@@ -96,7 +97,6 @@ ...@@ -96,7 +97,6 @@
"shpjs": "^4.0.4", "shpjs": "^4.0.4",
"stream-json": "^1.7.5", "stream-json": "^1.7.5",
"ts-node": "^10.9.1", "ts-node": "^10.9.1",
"tus-node-server": "^0.9.0",
"xlsx": "^0.18.5", "xlsx": "^0.18.5",
"xstate": "^4.37.0" "xstate": "^4.37.0"
}, },
...@@ -120,7 +120,7 @@ ...@@ -120,7 +120,7 @@
"eslint-plugin-tsdoc": "^0.2.1", "eslint-plugin-tsdoc": "^0.2.1",
"pg-escape": "^0.2.0", "pg-escape": "^0.2.0",
"supertest": "^6.3.3", "supertest": "^6.3.3",
"typescript": "^5.0.4", "typescript": "^5.1.3",
"vitest": "^0.31.0" "vitest": "^0.31.0"
}, },
"prettier": { "prettier": {
......
declare module 'type-fest' {
// TODO 2023-06-12 required by @tus/server, waiting for https://github.com/tus/tus-node-server/pull/443/files to be merged
export type SetRequired<T, A extends keyof T> = Required<Pick<T, A>> & Omit<T, A>
}
...@@ -2,6 +2,7 @@ import { emailsForAdministrationsGet } from './_titre-etape-email.js' ...@@ -2,6 +2,7 @@ import { emailsForAdministrationsGet } from './_titre-etape-email.js'
import { userSuper } from '../../../database/user-super.js' import { userSuper } from '../../../database/user-super.js'
import { expect, test } from 'vitest' import { expect, test } from 'vitest'
import { UserNotNull } from 'camino-common/src/roles.js' import { UserNotNull } from 'camino-common/src/roles.js'
import { newUtilisateurId } from '../../../database/models/_format/id-create.js'
test('envoie un email sur une étape non existante', () => { test('envoie un email sur une étape non existante', () => {
const actual = emailsForAdministrationsGet(undefined, undefined, '', '', '', userSuper, undefined) const actual = emailsForAdministrationsGet(undefined, undefined, '', '', '', userSuper, undefined)
...@@ -10,7 +11,7 @@ test('envoie un email sur une étape non existante', () => { ...@@ -10,7 +11,7 @@ test('envoie un email sur une étape non existante', () => {
}) })
const user: UserNotNull = { const user: UserNotNull = {
id: 'super', id: newUtilisateurId('super'),
email: 'camino@beta.gouv.fr', email: 'camino@beta.gouv.fr',
nom: 'Camino', nom: 'Camino',
prenom: '', prenom: '',
......
import { GraphQLResolveInfo } from 'graphql' import { GraphQLResolveInfo } from 'graphql'
import cryptoRandomString from 'crypto-random-string'
import { Context, IUtilisateursColonneId } from '../../../types.js' import { Context, IUtilisateursColonneId } from '../../../types.js'
...@@ -8,11 +7,12 @@ import { fieldsBuild } from './_fields-build.js' ...@@ -8,11 +7,12 @@ import { fieldsBuild } from './_fields-build.js'
import { userGet, utilisateurGet, utilisateursCount, utilisateursGet } from '../../../database/queries/utilisateurs.js' import { userGet, utilisateurGet, utilisateursCount, utilisateursGet } from '../../../database/queries/utilisateurs.js'
import { newsletterSubscriberUpdate } from '../../../tools/api-mailjet/newsletter.js' import { newsletterSubscriberUpdate } from '../../../tools/api-mailjet/newsletter.js'
import { Role } from 'camino-common/src/roles.js' import { Role, UtilisateurId } from 'camino-common/src/roles.js'
import { canReadUtilisateurs, canReadUtilisateur } from 'camino-common/src/permissions/utilisateurs.js' import { canReadUtilisateurs, canReadUtilisateur } from 'camino-common/src/permissions/utilisateurs.js'
import { newUtilisateurId } from '../../../database/models/_format/id-create.js'
export const userIdGenerate = async (): Promise<string> => { export const userIdGenerate = async (): Promise<UtilisateurId> => {
const id = cryptoRandomString({ length: 6 }) const id = newUtilisateurId()
const utilisateurWithTheSameId = await userGet(id) const utilisateurWithTheSameId = await userGet(id)
if (utilisateurWithTheSameId) { if (utilisateurWithTheSameId) {
return userIdGenerate() return userIdGenerate()
...@@ -21,7 +21,7 @@ export const userIdGenerate = async (): Promise<string> => { ...@@ -21,7 +21,7 @@ export const userIdGenerate = async (): Promise<string> => {
return id return id
} }
export const utilisateur = async ({ id }: { id: string }, { user }: Context, info: GraphQLResolveInfo) => { export const utilisateur = async ({ id }: { id: UtilisateurId }, { user }: Context, info: GraphQLResolveInfo) => {
try { try {
if (!canReadUtilisateur(user, id)) { if (!canReadUtilisateur(user, id)) {
return null return null
......
...@@ -6,6 +6,7 @@ import { UtilisateurToEdit } from 'camino-common/src/utilisateur.js' ...@@ -6,6 +6,7 @@ import { UtilisateurToEdit } from 'camino-common/src/utilisateur.js'
import type { Pool } from 'pg' import type { Pool } from 'pg'
import { constants } from 'http2' import { constants } from 'http2'
import { userSuper } from '../../database/user-super.js' import { userSuper } from '../../database/user-super.js'
import { newUtilisateurId } from '../../database/models/_format/id-create.js'
console.info = vi.fn() console.info = vi.fn()
console.error = vi.fn() console.error = vi.fn()
...@@ -45,7 +46,7 @@ describe('moi', () => { ...@@ -45,7 +46,7 @@ describe('moi', () => {
describe('utilisateurModifier', () => { describe('utilisateurModifier', () => {
test('ne peut pas modifier un compte (utilisateur anonyme)', async () => { test('ne peut pas modifier un compte (utilisateur anonyme)', async () => {
const utilisateurToEdit: UtilisateurToEdit = { const utilisateurToEdit: UtilisateurToEdit = {
id: 'test', id: newUtilisateurId('test'),
role: 'defaut', role: 'defaut',
entreprises: [], entreprises: [],
administrationId: null, administrationId: null,
......
...@@ -250,16 +250,8 @@ const titreDemarcheTravauxStatutIdFind = (titreDemarcheEtapes: Pick<ITitreEtape, ...@@ -250,16 +250,8 @@ const titreDemarcheTravauxStatutIdFind = (titreDemarcheEtapes: Pick<ITitreEtape,
[Travaux.AvisRapportDirecteurREAL]: DemarchesStatutsIds.EnInstruction, [Travaux.AvisRapportDirecteurREAL]: DemarchesStatutsIds.EnInstruction,
[Travaux.TransPrescriptionsDemandeur]: DemarchesStatutsIds.EnInstruction, [Travaux.TransPrescriptionsDemandeur]: DemarchesStatutsIds.EnInstruction,
[Travaux.OuvertureEnquetePublique]: DemarchesStatutsIds.EnInstruction, [Travaux.OuvertureEnquetePublique]: DemarchesStatutsIds.EnInstruction,
[Travaux.AvisServiceAdminLocal]: DemarchesStatutsIds.EnInstruction,
[Travaux.AvisDDTM]: DemarchesStatutsIds.EnInstruction,
[Travaux.AvisAutoriteMilitaire]: DemarchesStatutsIds.EnInstruction,
[Travaux.AvisARS]: DemarchesStatutsIds.EnInstruction,
[Travaux.AvisDRAC]: DemarchesStatutsIds.EnInstruction,
[Travaux.AvisPrefetMaritime]: DemarchesStatutsIds.EnInstruction,
[Travaux.AvisAutresInstances]: DemarchesStatutsIds.EnInstruction,
[Travaux.MemoireReponseExploitant]: DemarchesStatutsIds.EnInstruction, [Travaux.MemoireReponseExploitant]: DemarchesStatutsIds.EnInstruction,
[Travaux.ClotureEnquetePublique]: DemarchesStatutsIds.EnInstruction, [Travaux.ClotureEnquetePublique]: DemarchesStatutsIds.EnInstruction,
[Travaux.AvisRapportDirecteurREAL]: DemarchesStatutsIds.EnInstruction,
[Travaux.AvisCODERST]: DemarchesStatutsIds.EnInstruction, [Travaux.AvisCODERST]: DemarchesStatutsIds.EnInstruction,
[Travaux.AvisPrescriptionsDemandeur]: DemarchesStatutsIds.EnInstruction, [Travaux.AvisPrescriptionsDemandeur]: DemarchesStatutsIds.EnInstruction,
[Travaux.RapportDREAL]: DemarchesStatutsIds.EnInstruction, [Travaux.RapportDREAL]: DemarchesStatutsIds.EnInstruction,
......
...@@ -29,9 +29,9 @@ vi.mock('../../tools/file-delete', () => ({ ...@@ -29,9 +29,9 @@ vi.mock('../../tools/file-delete', () => ({
__esModule: true, __esModule: true,
default: vi.fn(), default: vi.fn(),
})) }))
const fileDeleteMock = vi.mocked(fileDelete, true)
vi.mock('crypto-random-string', () => ({ default: () => 'prefix' })) vi.mock('../../database/models/_format/id-create', () => ({ idGenerate: () => 'prefix' }))
const fileDeleteMock = vi.mocked(fileDelete, true)
afterEach(() => { afterEach(() => {
vi.resetAllMocks() vi.resetAllMocks()
......
import { FileUpload } from 'graphql-upload' import { FileUpload } from 'graphql-upload'
import cryptoRandomString from 'crypto-random-string'
import { join } from 'path' import { join } from 'path'
import { IContenu, IContenuValeur, IDocumentRepertoire, ITitreEtape } from '../../types.js' import { IContenu, IContenuValeur, IDocumentRepertoire, ITitreEtape } from '../../types.js'
...@@ -9,6 +8,7 @@ import fileStreamCreate from '../../tools/file-stream-create.js' ...@@ -9,6 +8,7 @@ import fileStreamCreate from '../../tools/file-stream-create.js'
import fileDelete from '../../tools/file-delete.js' import fileDelete from '../../tools/file-delete.js'
import { Section, SectionsElement } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/sections.js' import { Section, SectionsElement } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/sections.js'
import { DeepReadonly } from 'camino-common/src/typescript-tools.js' import { DeepReadonly } from 'camino-common/src/typescript-tools.js'
import { idGenerate } from '../../database/models/_format/id-create.js'
const sectionElementContenuAndFilesGet = (contenuValeur: IContenuValeur, sectionElement: DeepReadonly<SectionsElement>) => { const sectionElementContenuAndFilesGet = (contenuValeur: IContenuValeur, sectionElement: DeepReadonly<SectionsElement>) => {
const newFiles = [] as FileUpload[] const newFiles = [] as FileUpload[]
...@@ -20,9 +20,7 @@ const sectionElementContenuAndFilesGet = (contenuValeur: IContenuValeur, section ...@@ -20,9 +20,7 @@ const sectionElementContenuAndFilesGet = (contenuValeur: IContenuValeur, section
} }
if (fileUpload?.file) { if (fileUpload?.file) {
const fileName = `${cryptoRandomString({ const fileName = `${idGenerate(4)}-${fileUpload.file.filename}`
length: 4,
})}-${fileUpload.file.filename}`
fileUpload.file.filename = fileName fileUpload.file.filename = fileName
newFiles.push(fileUpload?.file) newFiles.push(fileUpload?.file)
newValue = fileName newValue = fileName
......
...@@ -9,7 +9,6 @@ import { titreEtapesSortAscByOrdre } from './titre-etapes-sort.js' ...@@ -9,7 +9,6 @@ import { titreEtapesSortAscByOrdre } from './titre-etapes-sort.js'
import titreDemarcheOctroiDateDebutFind from '../rules/titre-demarche-octroi-date-debut-find.js' import titreDemarcheOctroiDateDebutFind from '../rules/titre-demarche-octroi-date-debut-find.js'
import { titresGet, titreUpdate } from '../../database/queries/titres.js' import { titresGet, titreUpdate } from '../../database/queries/titres.js'
import { userSuper } from '../../database/user-super.js' import { userSuper } from '../../database/user-super.js'
import cryptoRandomString from 'crypto-random-string'
import { titreDemarcheUpdate } from '../../database/queries/titres-demarches.js' import { titreDemarcheUpdate } from '../../database/queries/titres-demarches.js'
import { titreEtapeUpdate } from '../../database/queries/titres-etapes.js' import { titreEtapeUpdate } from '../../database/queries/titres-etapes.js'
import { titrePointReferenceUpdate, titrePointUpdate } from '../../database/queries/titres-points.js' import { titrePointReferenceUpdate, titrePointUpdate } from '../../database/queries/titres-points.js'
...@@ -17,6 +16,7 @@ import { titreActiviteUpdate } from '../../database/queries/titres-activites.js' ...@@ -17,6 +16,7 @@ import { titreActiviteUpdate } from '../../database/queries/titres-activites.js'
import { UserNotNull } from 'camino-common/src/roles' import { UserNotNull } from 'camino-common/src/roles'
import { getDomaineId, getTitreTypeType } from 'camino-common/src/static/titresTypes.js' import { getDomaineId, getTitreTypeType } from 'camino-common/src/static/titresTypes.js'
import { TitreId } from 'camino-common/src/titres.js' import { TitreId } from 'camino-common/src/titres.js'
import { idGenerate } from '../../database/models/_format/id-create.js'
const titreSlugFind = (titre: ITitre) => { const titreSlugFind = (titre: ITitre) => {
const { typeId, nom } = titre const { typeId, nom } = titre
...@@ -115,7 +115,7 @@ export const titreSlugAndRelationsUpdate = async (titre: ITitre): Promise<{ hasC ...@@ -115,7 +115,7 @@ export const titreSlugAndRelationsUpdate = async (titre: ITitre): Promise<{ hasC
if (titreWithTheSameSlug?.length > 1 || (titreWithTheSameSlug?.length === 1 && titreWithTheSameSlug[0].id !== titre.id)) { if (titreWithTheSameSlug?.length > 1 || (titreWithTheSameSlug?.length === 1 && titreWithTheSameSlug[0].id !== titre.id)) {
if (!titre.slug?.startsWith(slug)) { if (!titre.slug?.startsWith(slug)) {
slug += `-${cryptoRandomString({ length: 8 })}` slug += `-${idGenerate(8)}`
doublonTitreId = titreWithTheSameSlug[0].id doublonTitreId = titreWithTheSameSlug[0].id
} else { } else {
slug = titre.slug slug = titre.slug
......
...@@ -4,6 +4,7 @@ import { AdministrationId } from 'camino-common/src/static/administrations' ...@@ -4,6 +4,7 @@ import { AdministrationId } from 'camino-common/src/static/administrations'
import { testBlankUser } from 'camino-common/src/tests-utils' import { testBlankUser } from 'camino-common/src/tests-utils'
import { test, expect } from 'vitest' import { test, expect } from 'vitest'
import { utilisateurUpdationValidate } from './utilisateur-updation-validate' import { utilisateurUpdationValidate } from './utilisateur-updation-validate'
import { newUtilisateurId } from '../../database/models/_format/id-create.js'
const users: Record<Role, UserNotNull> = { const users: Record<Role, UserNotNull> = {
super: { ...testBlankUser, role: 'super' }, super: { ...testBlankUser, role: 'super' },
...@@ -58,77 +59,81 @@ test('utilisateurUpdationValidate privilege escalation forbidden', () => { ...@@ -58,77 +59,81 @@ test('utilisateurUpdationValidate privilege escalation forbidden', () => {
}) })
test('utilisateurUpdationValidate incorrect users throw error', () => { test('utilisateurUpdationValidate incorrect users throw error', () => {
expect(() => utilisateurUpdationValidate(users.super, { id: 'utilisateurId', role: 'super', administrationId: null, entreprises: [] }, undefined)).toThrowErrorMatchingInlineSnapshot( expect(() =>
'"l\'utilisateur n\'existe pas"' utilisateurUpdationValidate(users.super, { id: newUtilisateurId('utilisateurId'), role: 'super', administrationId: null, entreprises: [] }, undefined)
) ).toThrowErrorMatchingInlineSnapshot('"l\'utilisateur n\'existe pas"')
expect(() => expect(() =>
utilisateurUpdationValidate(users.super, { id: 'utilisateurId', role: 'super', entreprises: [newEntrepriseId('entrepriseId')], administrationId: null }, undefined) utilisateurUpdationValidate(users.super, { id: newUtilisateurId('utilisateurId'), role: 'super', entreprises: [newEntrepriseId('entrepriseId')], administrationId: null }, undefined)
).toThrowErrorMatchingInlineSnapshot('"utilisateur incorrect"')
expect(() =>
utilisateurUpdationValidate(users.super, { id: newUtilisateurId('utilisateurId'), role: 'super', administrationId: 'aut-97300-01', entreprises: [] }, undefined)
).toThrowErrorMatchingInlineSnapshot('"utilisateur incorrect"') ).toThrowErrorMatchingInlineSnapshot('"utilisateur incorrect"')
expect(() => utilisateurUpdationValidate(users.super, { id: 'utilisateurId', role: 'super', administrationId: 'aut-97300-01', entreprises: [] }, undefined)).toThrowErrorMatchingInlineSnapshot(
'"utilisateur incorrect"'
)
expect(() => utilisateurUpdationValidate(users.super, { id: 'utilisateurId', role: 'defaut', administrationId: null, entreprises: [] }, undefined)).toThrowErrorMatchingInlineSnapshot(
'"l\'utilisateur n\'existe pas"'
)
expect(() => expect(() =>
utilisateurUpdationValidate(users.super, { id: 'utilisateurId', role: 'defaut', entreprises: [newEntrepriseId('entrepriseId')], administrationId: null }, undefined) utilisateurUpdationValidate(users.super, { id: newUtilisateurId('utilisateurId'), role: 'defaut', administrationId: null, entreprises: [] }, undefined)
).toThrowErrorMatchingInlineSnapshot('"l\'utilisateur n\'existe pas"')
expect(() =>
utilisateurUpdationValidate(users.super, { id: newUtilisateurId('utilisateurId'), role: 'defaut', entreprises: [newEntrepriseId('entrepriseId')], administrationId: null }, undefined)
).toThrowErrorMatchingInlineSnapshot('"utilisateur incorrect"')
expect(() =>
utilisateurUpdationValidate(users.super, { id: newUtilisateurId('utilisateurId'), role: 'defaut', administrationId: 'aut-97300-01', entreprises: [] }, undefined)
).toThrowErrorMatchingInlineSnapshot('"utilisateur incorrect"') ).toThrowErrorMatchingInlineSnapshot('"utilisateur incorrect"')
expect(() => utilisateurUpdationValidate(users.super, { id: 'utilisateurId', role: 'defaut', administrationId: 'aut-97300-01', entreprises: [] }, undefined)).toThrowErrorMatchingInlineSnapshot(
'"utilisateur incorrect"'
)
expect(() => utilisateurUpdationValidate(users.super, { id: 'utilisateurId', role: 'admin', administrationId: null, entreprises: [] }, undefined)).toThrowErrorMatchingInlineSnapshot(
'"utilisateur incorrect"'
)
expect(() => expect(() =>
utilisateurUpdationValidate(users.super, { id: 'utilisateurId', role: 'admin', entreprises: [newEntrepriseId('entrepriseId')], administrationId: null }, undefined) utilisateurUpdationValidate(users.super, { id: newUtilisateurId('utilisateurId'), role: 'admin', administrationId: null, entreprises: [] }, undefined)
).toThrowErrorMatchingInlineSnapshot('"utilisateur incorrect"')
expect(() =>
utilisateurUpdationValidate(users.super, { id: newUtilisateurId('utilisateurId'), role: 'admin', entreprises: [newEntrepriseId('entrepriseId')], administrationId: null }, undefined)
).toThrowErrorMatchingInlineSnapshot('"utilisateur incorrect"')
expect(() =>
utilisateurUpdationValidate(users.super, { id: newUtilisateurId('utilisateurId'), role: 'admin', administrationId: fakeAdministrationId, entreprises: [] }, undefined)
).toThrowErrorMatchingInlineSnapshot('"utilisateur incorrect"') ).toThrowErrorMatchingInlineSnapshot('"utilisateur incorrect"')
expect(() => utilisateurUpdationValidate(users.super, { id: 'utilisateurId', role: 'admin', administrationId: fakeAdministrationId, entreprises: [] }, undefined)).toThrowErrorMatchingInlineSnapshot(
'"utilisateur incorrect"'
)
expect(() => utilisateurUpdationValidate(users.super, { id: 'utilisateurId', role: 'entreprise', administrationId: null, entreprises: [] }, undefined)).toThrowErrorMatchingInlineSnapshot(
'"utilisateur incorrect"'
)
expect(() => utilisateurUpdationValidate(users.super, { id: 'utilisateurId', role: 'entreprise', administrationId: null, entreprises: [] }, undefined)).toThrowErrorMatchingInlineSnapshot(
'"utilisateur incorrect"'
)
expect(() => expect(() =>
utilisateurUpdationValidate(users.super, { id: 'utilisateurId', role: 'entreprise', administrationId: fakeAdministrationId, entreprises: [newEntrepriseId('entrepriseId')] }, undefined) utilisateurUpdationValidate(users.super, { id: newUtilisateurId('utilisateurId'), role: 'entreprise', administrationId: null, entreprises: [] }, undefined)
).toThrowErrorMatchingInlineSnapshot('"utilisateur incorrect"')
expect(() =>
utilisateurUpdationValidate(users.super, { id: newUtilisateurId('utilisateurId'), role: 'entreprise', administrationId: null, entreprises: [] }, undefined)
).toThrowErrorMatchingInlineSnapshot('"utilisateur incorrect"')
expect(() =>
utilisateurUpdationValidate(
users.super,
{ id: newUtilisateurId('utilisateurId'), role: 'entreprise', administrationId: fakeAdministrationId, entreprises: [newEntrepriseId('entrepriseId')] },
undefined
)
).toThrowErrorMatchingInlineSnapshot('"utilisateur incorrect"') ).toThrowErrorMatchingInlineSnapshot('"utilisateur incorrect"')
expect(() => utilisateurUpdationValidate(users.super, { id: 'utilisateurId', role: 'super', entreprises: [], administrationId: null }, undefined)).toThrowErrorMatchingInlineSnapshot( expect(() =>
'"l\'utilisateur n\'existe pas"' utilisateurUpdationValidate(users.super, { id: newUtilisateurId('utilisateurId'), role: 'super', entreprises: [], administrationId: null }, undefined)
) ).toThrowErrorMatchingInlineSnapshot('"l\'utilisateur n\'existe pas"')
expect(() => expect(() =>
utilisateurUpdationValidate( utilisateurUpdationValidate(
users.admin, users.admin,
{ id: 'utilisateurId', role: 'editeur', administrationId: 'aut-97300-01', entreprises: [] }, { id: newUtilisateurId('utilisateurId'), role: 'editeur', administrationId: 'aut-97300-01', entreprises: [] },
{ ...testBlankUser, id: 'fakeId', role: 'admin', administrationId: 'aut-97300-01' } { ...testBlankUser, id: newUtilisateurId('fakeId'), role: 'admin', administrationId: 'aut-97300-01' }
) )
).not.toThrowError() ).not.toThrowError()
expect(() => expect(() =>
utilisateurUpdationValidate( utilisateurUpdationValidate(
users.admin, users.admin,
{ id: 'utilisateurId', role: 'admin', administrationId: 'aut-97300-01', entreprises: [] }, { id: newUtilisateurId('utilisateurId'), role: 'admin', administrationId: 'aut-97300-01', entreprises: [] },
{ ...testBlankUser, id: 'fakeId', role: 'editeur', administrationId: 'aut-97300-01' } { ...testBlankUser, id: newUtilisateurId('fakeId'), role: 'editeur', administrationId: 'aut-97300-01' }
) )
).not.toThrowError() ).not.toThrowError()
expect(() => expect(() =>
utilisateurUpdationValidate( utilisateurUpdationValidate(
users.admin, users.admin,
{ id: 'utilisateurId', role: 'editeur', administrationId: 'aut-mrae-guyane-01', entreprises: [] }, { id: newUtilisateurId('utilisateurId'), role: 'editeur', administrationId: 'aut-mrae-guyane-01', entreprises: [] },
{ ...testBlankUser, id: 'fakeId', role: 'editeur', administrationId: 'aut-97300-01' } { ...testBlankUser, id: newUtilisateurId('fakeId'), role: 'editeur', administrationId: 'aut-97300-01' }
) )
).toThrowErrorMatchingInlineSnapshot('"droits insuffisants"') ).toThrowErrorMatchingInlineSnapshot('"droits insuffisants"')
expect(() => expect(() =>
utilisateurUpdationValidate( utilisateurUpdationValidate(
users.admin, users.admin,
{ id: 'utilisateurId', role: 'editeur', administrationId: 'aut-97300-01', entreprises: [] }, { id: newUtilisateurId('utilisateurId'), role: 'editeur', administrationId: 'aut-97300-01', entreprises: [] },
{ ...testBlankUser, id: 'fakeId', role: 'editeur', administrationId: 'aut-mrae-guyane-01' } { ...testBlankUser, id: newUtilisateurId('fakeId'), role: 'editeur', administrationId: 'aut-mrae-guyane-01' }
) )
).toThrowErrorMatchingInlineSnapshot('"droits insuffisants"') ).toThrowErrorMatchingInlineSnapshot('"droits insuffisants"')
......
import { test, expect } from 'vitest'
import { idGenerate, newDocumentId } from './id-create.js'
import { toCaminoDate } from 'camino-common/src/date.js'
test('idGenerate', () => {
expect(idGenerate()).toHaveLength(24)
expect(idGenerate(24)).toHaveLength(24)
expect(idGenerate(12)).toHaveLength(12)
})
test('newDocumentId', () => {
expect(newDocumentId(toCaminoDate('2023-01-01'), 'aac')).toHaveLength(23)
})
...@@ -5,8 +5,9 @@ import { DocumentTypeId } from 'camino-common/src/static/documentsTypes.js' ...@@ -5,8 +5,9 @@ import { DocumentTypeId } from 'camino-common/src/static/documentsTypes.js'
import { randomBytes } from 'node:crypto' import { randomBytes } from 'node:crypto'
import { TitreId } from 'camino-common/src/titres.js' import { TitreId } from 'camino-common/src/titres.js'
import { EtapeId } from 'camino-common/src/etape.js' import { EtapeId } from 'camino-common/src/etape.js'
import { UtilisateurId } from 'camino-common/src/roles.js'
export const idGenerate = <T extends string = string>(): T => randomBytes(12).toString('hex') as T export const idGenerate = <T extends string = string>(length = 24): T => randomBytes(length / 2).toString('hex') as T
// TODO 2022-09-13 il faudrait ajouter un préfixe dédié aux démarche à l’id. // TODO 2022-09-13 il faudrait ajouter un préfixe dédié aux démarche à l’id.
// pour pouvoir utiliser « is » de Typescript et controler qu’on ne met pas n’importe quel string dans cette méthode // pour pouvoir utiliser « is » de Typescript et controler qu’on ne met pas n’importe quel string dans cette méthode
...@@ -23,7 +24,11 @@ export const newEtapeId = (value: string = idGenerate()): EtapeId => { ...@@ -23,7 +24,11 @@ export const newEtapeId = (value: string = idGenerate()): EtapeId => {
} }
export const newDocumentId = (date: CaminoDate, documentTypeId: DocumentTypeId): DocumentId => { export const newDocumentId = (date: CaminoDate, documentTypeId: DocumentTypeId): DocumentId => {
const hash = randomBytes(4).toString('hex') const hash = idGenerate(8)
return documentIdValidator.parse(`${date}-${documentTypeId}-${hash}`) return documentIdValidator.parse(`${date}-${documentTypeId}-${hash}`)
} }
export const newUtilisateurId = (value: string = idGenerate(6)): UtilisateurId => {
return value as UtilisateurId
}
...@@ -9,7 +9,6 @@ import Types from './titres-types.js' ...@@ -9,7 +9,6 @@ import Types from './titres-types.js'
import { titreInsertFormat } from './_format/titre-insert.js' import { titreInsertFormat } from './_format/titre-insert.js'
import { idGenerate } from './_format/id-create.js' import { idGenerate } from './_format/id-create.js'
import slugify from '@sindresorhus/slugify' import slugify from '@sindresorhus/slugify'
import cryptoRandomString from 'crypto-random-string'
import TitresActivites from './titres-activites.js' import TitresActivites from './titres-activites.js'
import { getDomaineId, getTitreTypeType } from 'camino-common/src/static/titresTypes.js' import { getDomaineId, getTitreTypeType } from 'camino-common/src/static/titresTypes.js'
...@@ -139,7 +138,7 @@ class Titres extends Model { ...@@ -139,7 +138,7 @@ class Titres extends Model {
} }
if (!this.slug && this.typeId && this.nom) { if (!this.slug && this.typeId && this.nom) {
this.slug = `${getDomaineId(this.typeId)}-${getTitreTypeType(this.typeId)}-${slugify(this.nom)}-${cryptoRandomString({ length: 4 })}` this.slug = `${getDomaineId(this.typeId)}-${getTitreTypeType(this.typeId)}-${slugify(this.nom)}-${idGenerate(4)}`
} }
return super.$beforeInsert(context) return super.$beforeInsert(context)
......
...@@ -253,6 +253,6 @@ export const titresFiltersQueryModify = ( ...@@ -253,6 +253,6 @@ export const titresFiltersQueryModify = (
} }
q.joinRaw(`join titres_etapes as facades_points_etapes on facades_points_etapes.id = ${name}."props_titre_etapes_ids" #>> '{points}'`) q.joinRaw(`join titres_etapes as facades_points_etapes on facades_points_etapes.id = ${name}."props_titre_etapes_ids" #>> '{points}'`)
q.leftJoinRelated(jointureFormat(name, 'pointsEtape')) q.leftJoinRelated(jointureFormat(name, 'pointsEtape'))
q.whereRaw(`?? \\?| array[${secteurs.map(secteur => `E'${secteur.replaceAll("'", "\\'")}'`).join(',')}]`, 'facades_points_etapes.secteursMaritime') q.whereRaw(`?? \\?| array[${secteurs.map(secteur => `E'${secteur.replace(/'/g, "\\'")}'`).join(',')}]`, 'facades_points_etapes.secteursMaritime')
} }
} }
...@@ -3,7 +3,7 @@ import { IEntreprise, ITitre, ITitreDemarche } from '../../../types.js' ...@@ -3,7 +3,7 @@ import { IEntreprise, ITitre, ITitreDemarche } from '../../../types.js'
import { dbManager } from '../../../../tests/db-manager.js' import { dbManager } from '../../../../tests/db-manager.js'
import Titres from '../../models/titres.js' import Titres from '../../models/titres.js'
import { idGenerate, newDemarcheId, newEtapeId, newTitreId } from '../../models/_format/id-create.js' import { idGenerate, newDemarcheId, newEtapeId, newTitreId, newUtilisateurId } from '../../models/_format/id-create.js'
import { titresArmEnDemandeQuery, titresConfidentielSelect, titresModificationSelectQuery, titresQueryModify, titresVisibleByEntrepriseQuery } from './titres.js' import { titresArmEnDemandeQuery, titresConfidentielSelect, titresModificationSelectQuery, titresQueryModify, titresVisibleByEntrepriseQuery } from './titres.js'
import { userSuper } from '../../user-super.js' import { userSuper } from '../../user-super.js'
import { AdministrationRole } from 'camino-common/src/roles.js' import { AdministrationRole } from 'camino-common/src/roles.js'
...@@ -268,7 +268,7 @@ describe('titresQueryModify', () => { ...@@ -268,7 +268,7 @@ describe('titresQueryModify', () => {
q.select( q.select(
titresModificationSelectQuery(q, { titresModificationSelectQuery(q, {
email: '', email: '',
id: '', id: newUtilisateurId(''),
nom: '', nom: '',
prenom: '', prenom: '',
role: 'admin', role: 'admin',
......
...@@ -7,6 +7,7 @@ import { Administrations } from 'camino-common/src/static/administrations.js' ...@@ -7,6 +7,7 @@ import { Administrations } from 'camino-common/src/static/administrations.js'
import options from '../_options.js' import options from '../_options.js'
import { beforeAll, expect, afterAll, test, describe, vi } from 'vitest' import { beforeAll, expect, afterAll, test, describe, vi } from 'vitest'
import { testBlankUser, TestUser } from 'camino-common/src/tests-utils.js' import { testBlankUser, TestUser } from 'camino-common/src/tests-utils.js'
import { newUtilisateurId } from '../../models/_format/id-create.js'
console.info = vi.fn() console.info = vi.fn()
console.error = vi.fn() console.error = vi.fn()
beforeAll(async () => { beforeAll(async () => {
...@@ -21,7 +22,7 @@ afterAll(async () => { ...@@ -21,7 +22,7 @@ afterAll(async () => {
const mockAdministration = Administrations['aut-97300-01'] const mockAdministration = Administrations['aut-97300-01']
const mockUser: IUtilisateur = { const mockUser: IUtilisateur = {
id: 'utilisateurId', id: newUtilisateurId('utilisateurId'),
role: 'editeur', role: 'editeur',
nom: 'utilisateurNom', nom: 'utilisateurNom',
email: 'utilisateurEmail', email: 'utilisateurEmail',
......
import { titresActivitesGet } from './titres-activites.js' import { titresActivitesGet } from './titres-activites.js'
import TitresActivites from '../models/titres-activites.js' import TitresActivites from '../models/titres-activites.js'
import { dbManager } from '../../../tests/db-manager.js' import { dbManager } from '../../../tests/db-manager.js'
import { newTitreId } from '../models/_format/id-create.js' import { newTitreId, newUtilisateurId } from '../models/_format/id-create.js'
import Titres from '../models/titres.js' import Titres from '../models/titres.js'
import { UserNotNull } from 'camino-common/src/roles.js' import { UserNotNull } from 'camino-common/src/roles.js'
import { beforeAll, expect, afterAll, test, describe, vi } from 'vitest' import { beforeAll, expect, afterAll, test, describe, vi } from 'vitest'
...@@ -40,7 +40,7 @@ describe('teste les requêtes sur les activités', () => { ...@@ -40,7 +40,7 @@ describe('teste les requêtes sur les activités', () => {
}) })
const adminDGALN: UserNotNull = { const adminDGALN: UserNotNull = {
id: 'utilisateurId', id: newUtilisateurId('utilisateurId'),
role: 'admin', role: 'admin',
nom: 'utilisateurNom', nom: 'utilisateurNom',
prenom: 'utilisateurPrenom', prenom: 'utilisateurPrenom',
......
import { UserNotNull } from 'camino-common/src/roles.js' import { UserNotNull } from 'camino-common/src/roles.js'
import { newUtilisateurId } from './models/_format/id-create.js'
export const userSuper: UserNotNull = { export const userSuper: UserNotNull = {
id: 'super', id: newUtilisateurId('super'),
email: 'camino@beta.gouv.fr', email: 'camino@beta.gouv.fr',
nom: 'Camino', nom: 'Camino',
prenom: '', prenom: '',
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment