Skip to content
Commits on Source (23)
......@@ -20,8 +20,9 @@ api/test/integration:
- name: postgis/postgis:16-3.4
alias: postgres
stage: test
retry: 2
script:
- ./.gitlab/wait-for-it.sh -h ${PGHOST} -p ${PGPORT} -t 30 -- echo 'done'
- ./.gitlab/wait-for-it.sh -h ${PGHOST} -p ${PGPORT} -t 60 -- echo 'done'
- make test/api-integration
api/type:
extends: .prepare-node-run
......@@ -42,10 +43,11 @@ api/check-queries:
- name: postgis/postgis:16-3.4
alias: postgres
stage: test
retry: 2
script:
- set -a
- source .env-example
- ./.gitlab/wait-for-it.sh -h ${PGHOST} -p ${PGPORT} -t 30 -- make db/migrate
- ./.gitlab/wait-for-it.sh -h ${PGHOST} -p ${PGPORT} -t 60 -- make db/migrate
- make db/check-queries
- |
if [ ! -z "$(git status --porcelain)" ]; then
......
......@@ -9,3 +9,17 @@ lint_detect_deadcode:
extends: .prepare-node-run
stage: test
script: make lint/detect-dead-code
build_cron:
stage: build
needs: []
extends:
- .rule-build-and-push
- .prepare-docker-push
image:
name: gcr.io/kaniko-project/executor:debug
entrypoint: [""]
script:
- /kaniko/executor --context "$CI_PROJECT_DIR/infra/ecocompose/crons/" --build-arg BUILD_ENV=dev --dockerfile "$CI_PROJECT_DIR/Dockerfile.cron" --destination "caminofr/cron:${CI_COMMIT_SHA}-dev" ${KANIKO_POST_PARAM}
- /kaniko/executor --context "$CI_PROJECT_DIR/infra/ecocompose/crons/" --build-arg BUILD_ENV=preprod --dockerfile "$CI_PROJECT_DIR/Dockerfile.cron" --destination "caminofr/cron:${CI_COMMIT_SHA}-preprod" ${KANIKO_POST_PARAM}
- /kaniko/executor --context "$CI_PROJECT_DIR/infra/ecocompose/crons/" --build-arg BUILD_ENV=prod --dockerfile "$CI_PROJECT_DIR/Dockerfile.cron" --destination "caminofr/cron:${CI_COMMIT_SHA}-prod" ${KANIKO_POST_PARAM}
......@@ -9,6 +9,7 @@ ui/test:
ui/test-storybook:
extends: .prepare-node-run
stage: test
retry: 2
script:
- make storybook/build
- make storybook/test
......
......@@ -284,13 +284,3 @@ nginx-proxy/build:
nginx-proxy/push:
docker push caminofr/camino-nginx-proxy:1.6.1
cron/build:
docker build -t caminofr/cron:1.0.0-dev --build-arg BUILD_ENV=dev -f Dockerfile.cron infra/ecocompose/crons/
docker build -t caminofr/cron:1.0.0-preprod --build-arg BUILD_ENV=preprod -f Dockerfile.cron infra/ecocompose/crons/
docker build -t caminofr/cron:1.0.0-prod --build-arg BUILD_ENV=prod -f Dockerfile.cron infra/ecocompose/crons/
cron/push:
docker push caminofr/cron:1.0.0-dev
docker push caminofr/cron:1.0.0-preprod
docker push caminofr/cron:1.0.0-prod
......@@ -69,7 +69,7 @@ services:
restart: unless-stopped
cron:
container_name: camino_cron
image: caminofr/cron:1.0.0-${ENV}
image: caminofr/cron:${CAMINO_TAG}-${ENV}
environment:
ENV: ${ENV}
TCHAP_HOOK: ${TCHAP_HOOK}
......
......@@ -5,7 +5,5 @@
users:
- nom: mbitard
ssh: https://github.com/MichaelBitard.keys
- nom: vmaubert
ssh: https://github.com/vmaubert.keys
- nom: asafine
ssh: https://github.com/anis.keys
\ No newline at end of file
ssh: https://github.com/anis.keys
......@@ -81,7 +81,7 @@ export default [
],
'@typescript-eslint/explicit-function-return-type': 0,
'@typescript-eslint/explicit-module-boundary-types': 'warn',
'@typescript-eslint/explicit-module-boundary-types': 'error',
'@typescript-eslint/no-empty-interface': 0,
'@typescript-eslint/no-explicit-any': 0,
'@typescript-eslint/no-non-null-assertion': 0,
......
......@@ -6,7 +6,7 @@ import { titreDemarcheFormatFields } from './_fields'
import { FieldsDemarche } from '../../database/queries/_options'
import { isNullOrUndefined } from 'camino-common/src/typescript-tools'
export const titreDemarcheFormat = (titreDemarche: ITitreDemarche, fields: FieldsDemarche = titreDemarcheFormatFields) => {
export const titreDemarcheFormat = (titreDemarche: ITitreDemarche, fields: FieldsDemarche = titreDemarcheFormatFields): ITitreDemarche => {
if (isNullOrUndefined(fields)) return titreDemarche
if (fields.titre && titreDemarche.titre) {
......
......@@ -4,4 +4,4 @@ import { GraphQLResolveInfo } from 'graphql'
// in: info: objet contenant les propriétés de la requête graphQl
// out: ast avec les champs requis par le client GraphQl
export const fieldsBuild = (info: GraphQLResolveInfo) => graphqlFields(info, {}, { excludedFields: ['__typename'] }) as IFields
export const fieldsBuild = (info: GraphQLResolveInfo): IFields => graphqlFields(info, {}, { excludedFields: ['__typename'] })
import { activitesStatuts as activitesStatutsList } from 'camino-common/src/static/activitesStatuts'
import { sortedActivitesTypes } from 'camino-common/src/static/activitesTypes'
import { ActivitesStatut, activitesStatuts as activitesStatutsList } from 'camino-common/src/static/activitesStatuts'
import { ActiviteType, sortedActivitesTypes } from 'camino-common/src/static/activitesTypes'
export const activitesTypes = () => sortedActivitesTypes
export const activitesTypes = (): ActiviteType[] => sortedActivitesTypes
export const activitesStatuts = () => activitesStatutsList
export const activitesStatuts = (): ActivitesStatut[] => activitesStatutsList
import { sortedGeoSystemes } from 'camino-common/src/static/geoSystemes'
import { UNITES } from 'camino-common/src/static/unites'
import { GeoSysteme, sortedGeoSystemes } from 'camino-common/src/static/geoSystemes'
import { Unite, UNITES } from 'camino-common/src/static/unites'
import { Pays, PaysList } from 'camino-common/src/static/pays'
import { Departement, Departements } from 'camino-common/src/static/departement'
import { Region, Regions } from 'camino-common/src/static/region'
import { EtapesStatuts } from 'camino-common/src/static/etapesStatuts'
import { titresStatutsArray } from 'camino-common/src/static/titresStatuts'
import { phasesStatuts as staticPhasesStatuts } from 'camino-common/src/static/phasesStatuts'
import { sortedReferencesTypes } from 'camino-common/src/static/referencesTypes'
import { sortedDemarchesTypes } from 'camino-common/src/static/demarchesTypes'
import { sortedAdministrationTypes } from 'camino-common/src/static/administrations'
import { sortedDomaines } from 'camino-common/src/static/domaines'
import { sortedTitreTypesTypes } from 'camino-common/src/static/titresTypesTypes'
import { sortedDocumentTypes } from 'camino-common/src/static/documentsTypes'
import { EtapesStatuts, EtapeStatut } from 'camino-common/src/static/etapesStatuts'
import { titresStatutsArray, TitreStatut } from 'camino-common/src/static/titresStatuts'
import { PhaseDefinition, phasesStatuts as staticPhasesStatuts } from 'camino-common/src/static/phasesStatuts'
import { ReferenceType, sortedReferencesTypes } from 'camino-common/src/static/referencesTypes'
import { DemarcheType, sortedDemarchesTypes } from 'camino-common/src/static/demarchesTypes'
import { AdministrationType, sortedAdministrationTypes } from 'camino-common/src/static/administrations'
import { Domaine, sortedDomaines } from 'camino-common/src/static/domaines'
import { sortedTitreTypesTypes, TitreTypeTypeId } from 'camino-common/src/static/titresTypesTypes'
import { DocumentTypeDefinition, sortedDocumentTypes } from 'camino-common/src/static/documentsTypes'
import { config } from '../../../config/index'
import { titreTypesStatutsTitresPublicLecture } from 'camino-common/src/static/titresTypes_titresStatuts'
import { TitresTypes } from 'camino-common/src/static/titresTypes'
import { sortedDemarchesStatuts } from 'camino-common/src/static/demarchesStatuts'
import { sortedDevises } from 'camino-common/src/static/devise'
import { toDocuments } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/documents'
import { TitreTypesStatutsTitresPublicLecture, titreTypesStatutsTitresPublicLecture } from 'camino-common/src/static/titresTypes_titresStatuts'
import { TitresTypes, TitreType } from 'camino-common/src/static/titresTypes'
import { DemarcheStatut, sortedDemarchesStatuts } from 'camino-common/src/static/demarchesStatuts'
import { Devise, sortedDevises } from 'camino-common/src/static/devise'
import { ToDocument, toDocuments } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/documents'
import { Definition } from 'camino-common/src/definition'
export const devises = () => sortedDevises
export const devises = (): Devise[] => sortedDevises
export const geoSystemes = () => sortedGeoSystemes
export const geoSystemes = (): GeoSysteme[] => sortedGeoSystemes
export const unites = () => UNITES
export const unites = (): Unite[] => UNITES
export const documentsTypes = () => sortedDocumentTypes
export const documentsTypes = (): DocumentTypeDefinition[] => sortedDocumentTypes
export const referencesTypes = () => sortedReferencesTypes
export const referencesTypes = (): ReferenceType[] => sortedReferencesTypes
export const domaines = () => sortedDomaines
export const domaines = (): Domaine[] => sortedDomaines
export const types = () => sortedTitreTypesTypes
export const types = (): Definition<TitreTypeTypeId>[] => sortedTitreTypesTypes
export const statuts = () => titresStatutsArray
export const statuts = (): TitreStatut[] => titresStatutsArray
export const demarchesTypes = () => sortedDemarchesTypes
export const demarchesTypes = (): DemarcheType[] => sortedDemarchesTypes
export const demarchesStatuts = () => sortedDemarchesStatuts
export const demarchesStatuts = (): DemarcheStatut[] => sortedDemarchesStatuts
export const etapesStatuts = () => Object.values(EtapesStatuts)
export const etapesStatuts = (): EtapeStatut[] => Object.values(EtapesStatuts)
export const version = () => config().APPLICATION_VERSION
export const version = (): string => config().APPLICATION_VERSION
/**
* Retourne les types d'administrations
*
* @returns un tableau de types d'administrations
*/
export const administrationsTypes = () => sortedAdministrationTypes
export const administrationsTypes = (): AdministrationType[] => sortedAdministrationTypes
export const pays = (): Pays[] => Object.values(PaysList)
......@@ -56,10 +57,10 @@ export const departements = (): Departement[] => Object.values(Departements)
export const regions = (): Region[] => Object.values(Regions)
export const phasesStatuts = () => staticPhasesStatuts
export const phasesStatuts = (): PhaseDefinition[] => staticPhasesStatuts
export const titresTypes = () => Object.values(TitresTypes)
export const titresTypes = (): TitreType[] => Object.values(TitresTypes)
export const titresTypesTitresStatuts = () => titreTypesStatutsTitresPublicLecture
export const titresTypesTitresStatuts = (): TitreTypesStatutsTitresPublicLecture[] => titreTypesStatutsTitresPublicLecture
export const etapesTypesDocumentsTypes = () => toDocuments()
export const etapesTypesDocumentsTypes = (): ToDocument[] => toDocuments()
......@@ -8,11 +8,12 @@ import { Statistiques } from 'camino-common/src/statistiques'
import { TitreTypeId } from 'camino-common/src/static/titresTypes'
import { DEMARCHES_TYPES_IDS } from 'camino-common/src/static/demarchesTypes'
import { ACTIVITES_STATUTS_IDS } from 'camino-common/src/static/activitesStatuts'
import { getAnnee, toCaminoDate } from 'camino-common/src/date'
import { CaminoAnnee, getAnnee, toCaminoDate } from 'camino-common/src/date'
import { isNotNullNorUndefined, isNullOrUndefined } from 'camino-common/src/typescript-tools'
import { getTitresModifiesByMonth } from '../../rest/journal.queries'
import { callAndExit } from '../../../tools/fp-tools'
const ACTIVITE_ANNEE_DEBUT = 2018
const ACTIVITE_ANNEE_DEBUT = 2018 as const
export const statistiquesGlobales = async (_: unknown, { pool }: Context): Promise<Statistiques> => {
try {
......@@ -20,7 +21,7 @@ export const statistiquesGlobales = async (_: unknown, { pool }: Context): Promi
const titresActivitesDepose = titresActivites.filter(titreActivite => titreActivite.annee >= ACTIVITE_ANNEE_DEBUT && titreActivite.activiteStatutId === ACTIVITES_STATUTS_IDS.DEPOSE).length
const titresActivitesBeneficesEntreprise = Math.round((titresActivitesDepose * 2) / 7)
const titresActivitesBeneficesAdministration = Math.round((titresActivitesDepose * 1) / 7)
const titresModifies = await getTitresModifiesByMonth(pool)
const titresModifies = await callAndExit(getTitresModifiesByMonth(pool))
const demarches = titresActivites.filter(titreActivite => {
const dateSaisie = titreActivite.dateSaisie
......@@ -50,7 +51,7 @@ type TitreSurfaceIndex = {
typeId: TitreTypeId
surface: number
}
export const titresSurfaceIndexBuild = (titres: ITitre[], annee: number): TitreSurfaceIndex[] => {
export const titresSurfaceIndexBuild = (titres: ITitre[], annee: CaminoAnnee): TitreSurfaceIndex[] => {
const titresReduced: TitreSurfaceIndex[] = []
for (const titre of titres) {
......@@ -75,7 +76,7 @@ export const titresSurfaceIndexBuild = (titres: ITitre[], annee: number): TitreS
return titresReduced
}
export const concessionsValidesBuild = (titres: ITitre[], annee: number): { quantite: number; surface: number } => {
export const concessionsValidesBuild = (titres: ITitre[], annee: CaminoAnnee): { quantite: number; surface: number } => {
return titres
.filter(titre => titre.typeId === 'cxw' && titreValideCheck(titre.demarches!, toCaminoDate(`${annee}-01-01`), toCaminoDate(`${annee}-12-31`)))
.reduce(
......
import { SubstancesLegales } from 'camino-common/src/static/substancesLegales'
import { SubstanceLegale, SubstancesLegales } from 'camino-common/src/static/substancesLegales'
export const substances = () => SubstancesLegales
export const substances = (): Readonly<SubstanceLegale[]> => SubstancesLegales
......@@ -14,6 +14,7 @@ import { titreDemarcheUpdateTask } from '../../../business/titre-demarche-update
import { titreDemarcheUpdationValidate } from '../../../business/validations/titre-demarche-updation-validate'
import { canEditDemarche } from 'camino-common/src/permissions/titres-demarches'
import { isNullOrUndefined } from 'camino-common/src/typescript-tools'
import { DemarcheSlug } from 'camino-common/src/demarche'
export const demarches = async (
{
......@@ -56,7 +57,14 @@ export const demarches = async (
},
{ user }: Context,
info: GraphQLResolveInfo
) => {
): Promise<{
elements: ITitreDemarche[]
page: number
intervalle: number
ordre?: 'asc' | 'desc' | null
colonne?: ITitreDemarcheColonneId | null
total: number
}> => {
try {
const fields = fieldsBuild(info)
......@@ -128,7 +136,12 @@ export const demarches = async (
}
}
export const demarcheModifier = async ({ demarche }: { demarche: ITitreDemarche }, { user, pool }: Context) => {
export const demarcheModifier = async (
{ demarche }: { demarche: ITitreDemarche },
{ user, pool }: Context
): Promise<{
slug: DemarcheSlug | undefined
}> => {
try {
if (isNullOrUndefined(user)) throw new Error('droits insuffisants')
......
import { Context } from '../../../types'
import { Context, ITitreEtape } from '../../../types'
import { titreDemarcheGet } from '../../../database/queries/titres-demarches'
......@@ -12,7 +12,10 @@ import { titreEtapeFormatFields } from '../../_format/_fields'
import { EtapeId } from 'camino-common/src/etape'
import { DemarcheId } from 'camino-common/src/demarche'
export const etapeHeritage = async ({ date, titreDemarcheId, typeId, etapeId }: { date: CaminoDate; titreDemarcheId: DemarcheId; typeId: EtapeTypeId; etapeId: EtapeId | null }, { user }: Context) => {
export const etapeHeritage = async (
{ date, titreDemarcheId, typeId, etapeId }: { date: CaminoDate; titreDemarcheId: DemarcheId; typeId: EtapeTypeId; etapeId: EtapeId | null },
{ user }: Context
): Promise<ITitreEtape> => {
try {
let titreDemarche = await titreDemarcheGet(titreDemarcheId, { fields: {} }, user)
......
import { GraphQLResolveInfo } from 'graphql'
import { Context, ITitreColonneId } from '../../../types'
import { Context, ITitre, ITitreColonneId } from '../../../types'
import { titresFormat } from '../../_format/titres'
......@@ -55,7 +55,14 @@ export const titres = async (
},
{ user }: Context,
info: GraphQLResolveInfo
) => {
): Promise<{
elements: ITitre[]
intervalle?: number | null
page?: number | null
ordre?: 'asc' | 'desc' | null
colonne?: ITitreColonneId | null
total: number
}> => {
try {
const fields = fieldsBuild(info).elements
......
......@@ -4,6 +4,7 @@ exports[`getResultatEnConcurrence > Avec un seul satellite 1`] = `
{
"demarcheId": "demarcheIdPivotResultat",
"demarcheTypeId": "oct",
"firstEtapeDate": "2400-01-03",
"perimetreSansSatellite": {
"geojson4326_perimetre": {
"geometry": {
......
......@@ -3,7 +3,7 @@ import xlsx from 'xlsx'
import { Index } from '../../types'
export const tableConvert = (section: 'titres' | 'demarches' | 'activites' | 'utilisateurs' | 'entreprises', elements: Index<any>[], format: DownloadFormat) => {
export const tableConvert = (section: 'titres' | 'demarches' | 'activites' | 'utilisateurs' | 'entreprises', elements: Index<any>[], format: DownloadFormat): string => {
let contenu = ''
const sheet = xlsx.utils.json_to_sheet(elements as Index<any>[])
......
......@@ -37,7 +37,7 @@ import { SimplePromiseFn } from 'camino-common/src/typescript-tools'
import { ActiviteDocumentTypeId } from 'camino-common/src/static/documentsTypes'
import { sectionValidator } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/sections'
export const titreTypeIdByActiviteId = async (activiteId: ActiviteIdOrSlug, pool: Pool) => {
export const titreTypeIdByActiviteId = async (activiteId: ActiviteIdOrSlug, pool: Pool): Promise<TitreTypeId> => {
const typeIds = await dbQueryAndValidate(getTitreTypeIdByActiviteId, { activiteId }, pool, titreTypeIdObjectValidator)
if (typeIds.length === 0) {
throw new Error(`Pas de type de titre trouvé pour l'activité ${activiteId}`)
......@@ -97,7 +97,7 @@ export const getActiviteById = async (
titreTypeId: SimplePromiseFn<TitreTypeId>,
titresAdministrationsLocales: SimplePromiseFn<AdministrationId[]>,
entreprisesTitulairesOuAmodiataires: SimplePromiseFn<EntrepriseId[]>
) => {
): Promise<(DbActivite & { suppression: boolean }) | null> => {
const canRead = await canReadTitreActivites(user, titreTypeId, titresAdministrationsLocales, entreprisesTitulairesOuAmodiataires)
if (!canRead) {
......@@ -171,7 +171,7 @@ export const getActiviteDocumentsByActiviteId = async (activiteId: ActiviteId, p
)
}
export const administrationsLocalesByActiviteId = async (activiteId: ActiviteIdOrSlug, pool: Pool) => {
export const administrationsLocalesByActiviteId = async (activiteId: ActiviteIdOrSlug, pool: Pool): Promise<AdministrationId[]> => {
const admins = await dbQueryAndValidate(getAdministrationsLocalesByActiviteId, { activiteId }, pool, administrationsLocalesValidator)
if (admins.length > 1) {
throw new Error(`Trop d'administrations locales trouvées pour l'activité ${activiteId}`)
......@@ -208,7 +208,7 @@ where
or ta.slug = $ activiteId !
`
export const entreprisesTitulairesOuAmoditairesByActiviteId = async (activiteId: ActiviteIdOrSlug, pool: Pool) => {
export const entreprisesTitulairesOuAmoditairesByActiviteId = async (activiteId: ActiviteIdOrSlug, pool: Pool): Promise<EntrepriseId[]> => {
const entreprises = await dbQueryAndValidate(getTitulairesAmodiatairesTitreActivite, { activiteId }, pool, entrepriseIdObjectValidator)
return entreprises.map(({ id }) => id)
......@@ -247,7 +247,7 @@ export const deleteActiviteDocument = async (
activiteTypeId: ActivitesTypesId,
activiteStatutId: ActivitesStatutId,
pool: Pool
) => {
): Promise<void[]> => {
if (!canDeleteActiviteDocument(activiteDocumentTypeId, activiteTypeId, activiteStatutId)) {
throw new Error('droits insuffisants')
}
......@@ -270,7 +270,7 @@ export const insertActiviteDocument = async (
description: string
largeobject_id: number
}
) => dbQueryAndValidate(insertActiviteDocumentInternal, params, pool, z.object({ id: activiteDocumentIdValidator }))
): Promise<{ id: ActiviteDocumentId }[]> => dbQueryAndValidate(insertActiviteDocumentInternal, params, pool, z.object({ id: activiteDocumentIdValidator }))
const insertActiviteDocumentInternal = sql<
Redefine<
......
......@@ -30,6 +30,7 @@ import { AdministrationId } from 'camino-common/src/static/administrations'
import { EntrepriseId } from 'camino-common/src/entreprise'
import { getCurrent } from 'camino-common/src/date'
import { createLargeObject } from '../../database/largeobjects'
import { callAndExit } from '../../tools/fp-tools'
const extractContenuFromSectionWithValue = (sections: Section[], sectionsWithValue: SectionWithValue[]): Contenu => {
const contenu: Contenu = {}
......@@ -102,7 +103,7 @@ export const updateActivite =
}
for (const document of activiteDocumentsToCreate) {
const loid = await createLargeObject(pool, document.tempDocumentName)
const loid = await callAndExit(createLargeObject(pool, document.tempDocumentName))
const date = getCurrent()
......