Commit 39b38fdc authored by ncastejon's avatar ncastejon
Browse files

Add migration process (generate files + CI)

parent 6f5ea922
Pipeline #2407 passed with stages
in 2 minutes and 58 seconds
stages:
- build
- deploy
- db_migration
build_development:
stage: build
......@@ -22,6 +23,17 @@ deploy_development:
environment:
name: development
db_migration-development:
stage: db_migration
only:
- master
before_script:
- npm install tsconfig-paths
script:
- export NODE_ENV=DEV
- export MIGRATION=1
- npm run typeorm:migrate-ci
build_staging:
stage: build
only:
......
......@@ -11,14 +11,33 @@ if (process.env.NODE_ENV === 'LOCAL') {
}
}
export = {
const ormConfig = {
type: 'postgres',
host: 'database-organizations',
port: 5432,
port: process.env.POSTGRES_PORT,
username: process.env.POSTGRES_USER,
password: process.env.POSTGRES_PASSWORD,
database: process.env.POSTGRES_DB,
entities: ['src/**/**.entity{.ts,.js}'],
synchronize: true,
synchronize: false,
migrations: ['src/migrations/*.ts'],
cli: { migrationsDir: 'src/migrations' },
logging: true,
};
if (process.env.MIGRATION) {
if (process.env.NODE_ENV === 'LOCAL') {
ormConfig.username = process.env[`POSTGRES_USER`];
ormConfig.password = process.env[`POSTGRES_PASSWORD`];
ormConfig.database = process.env[`POSTGRES_DB`];
} else {
ormConfig.username = process.env[`${process.env.NODE_ENV}_POSTGRES_USER`];
ormConfig.password = process.env[`${process.env.NODE_ENV}_POSTGRES_PASSWORD`];
ormConfig.database = process.env[`${process.env.NODE_ENV}_POSTGRES_DB`];
}
ormConfig.host = process.env.POSTGRES_HOST_MIGRATION;
ormConfig.port = process.env[`${process.env.NODE_ENV}_POSTGRES_PORT`];
}
export = ormConfig;
......@@ -2278,6 +2278,29 @@
"sha.js": "^2.4.8"
}
},
"cross-env": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/cross-env/-/cross-env-5.2.0.tgz",
"integrity": "sha512-jtdNFfFW1hB7sMhr/H6rW1Z45LFqyI431m3qU6bFXcQ3Eh7LtBuG3h74o7ohHZ3crrRkkqHlo4jYHFPcjroANg==",
"requires": {
"cross-spawn": "^6.0.5",
"is-windows": "^1.0.0"
},
"dependencies": {
"cross-spawn": {
"version": "6.0.5",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
"integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
"requires": {
"nice-try": "^1.0.4",
"path-key": "^2.0.1",
"semver": "^5.5.0",
"shebang-command": "^1.2.0",
"which": "^1.2.9"
}
}
}
},
"cross-spawn": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
......@@ -4678,8 +4701,7 @@
"is-windows": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
"integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
"dev": true
"integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA=="
},
"isarray": {
"version": "0.0.1",
......@@ -5921,8 +5943,7 @@
"nice-try": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
"integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
"dev": true
"integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ=="
},
"node-fetch": {
"version": "2.2.0",
......@@ -7852,8 +7873,7 @@
"semver": {
"version": "5.5.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz",
"integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==",
"dev": true
"integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw=="
},
"semver-diff": {
"version": "2.1.0",
......
......@@ -17,7 +17,11 @@
"test:watch": "jest --watch",
"test:cov": "jest --coverage",
"test:e2e": "jest --config ./test/jest-e2e.json",
"webpack": "webpack --config webpack.config.js"
"webpack": "webpack --config webpack.config.js",
"typeorm:generate": "cross-env MIGRATION=1 ts-node -r tsconfig-paths/register ./node_modules/.bin/typeorm migration:generate -n",
"typeorm:migrate": "cross-env MIGRATION=1 ts-node -r tsconfig-paths/register ./node_modules/.bin/typeorm migration:run",
"typeorm:revert": "cross-env MIGRATION=1 ts-node -r tsconfig-paths/register ./node_modules/.bin/typeorm migration:revert",
"typeorm:migrate-ci": "ts-node -r tsconfig-paths/register ./node_modules/.bin/typeorm migration:run"
},
"dependencies": {
"@nestjs/common": "^5.1.0",
......@@ -28,6 +32,7 @@
"amqplib": "^0.5.2",
"class-transformer": "^0.1.9",
"class-validator": "^0.9.1",
"cross-env": "^5.2.0",
"dotenv": "^6.1.0",
"pg": "^7.4.3",
"postgresql": "0.0.1",
......
import {MigrationInterface, QueryRunner} from 'typeorm';
export class InitSchema1543499326934 implements MigrationInterface {
public async up(queryRunner: QueryRunner): Promise<any> {
await queryRunner.query(`CREATE TABLE "organization" ("id" SERIAL NOT NULL, "name" character varying(200)` +
` NOT NULL, "description" text NOT NULL, "logo" text, CONSTRAINT "PK_472c1f99a32def1b0abb219cd67" PRIMARY` +
` KEY ("id"))`);
await queryRunner.query(`CREATE TABLE "link" ("id" SERIAL NOT NULL, "name" character varying(100), "url"` +
` character varying(300) NOT NULL, "organizationId" integer, CONSTRAINT "PK_26206fb7186da72fbb9eaa3fac9"` +
` PRIMARY KEY ("id"))`);
await queryRunner.query(`ALTER TABLE "link" ADD CONSTRAINT "FK_afeaa57181e374e281c9a647eda" FOREIGN KEY` +
` ("organizationId") REFERENCES "organization"("id") ON DELETE CASCADE`);
}
public async down(queryRunner: QueryRunner): Promise<any> {
await queryRunner.query(`ALTER TABLE "link" DROP CONSTRAINT "FK_afeaa57181e374e281c9a647eda"`);
await queryRunner.query(`DROP TABLE "link"`);
await queryRunner.query(`DROP TABLE "organization"`);
}
}
import { MigrationInterface, QueryRunner } from 'typeorm';
export class InitData1543499552392 implements MigrationInterface {
public async up(queryRunner: QueryRunner): Promise<any> {
await queryRunner.query(`INSERT INTO public.organization ("id", "name",description,logo) VALUES
(1, 'Aéroports de Lyon',
'Au croisement de la Méditerranée et des Alpes, au cœur d’une puissante région économique reconnue pour son` +
` dynamisme, l’aéroport Lyon-Saint Exupéry est un pôle multimodal, facilement accessible et qui donne accès` +
` à plus de 115 destinations. Avec 63 % du trafic international, Aéroports de Lyon assoit sa dimension` +
` internationale et confirme sa vocation de porte d’accès majeure en Europe, au potentiel de développement` +
` parmi les plus élevés du Vieux Continent.',
'https://data.grandlyon.com/files/2015/03/Aeroports_de_Lyon_logo_quadri-_2_lignes-HD-300x142.jpg'),
(2, 'Acoucité','L’association Acoucité, observatoire de l’environnement sonore de la Métropole de Lyon et pôle` +
` national de compétences bruit, a pour but d’œuvrer au développement des connaissances et du savoir professionnel` +
` en environnement sonore urbain.','https://data.grandlyon.com/files/2016/02/Bandeau200x100.jpg'),
(3, 'Cityway','Logo_cityway_200px Depuis 2001, Cityway, SSII filiale du groupe Transdev, met en œuvre, en France` +
`et dans le Monde, des outils innovants pour partager l’info transport et simplifier la mobilité : bases de` +
` données, calculateurs d’itinéraires, outils de gestion des transports à la demande, solutions de vente… En 2014,` +
` nous avons créé avec le Grand Lyon et 11 autres partenaires, le premier GPS pour smartphone multimodal, temps` +
` réel et prédictif au monde : Optymod’Lyon.Nos solutions sont interopérables : partage des données et de web` +
` services.','https://data.grandlyon.com/files/2018/02/Logo_cityway_200px.png'),
(4, 'Air Rhône-Alpes','Air Rhône-Alpes est l’organisme agréé par le Ministère chargé de l’Ecologie pour la` +
` surveillance et l’information sur la qualité de l’air. Ses principales missions sont d’évaluer et d’informer` +
` sur la qualité de l’air de la région Rhône-Alpes, d’améliorer les connaissances sur les phénomènes liés à la` +
` pollution atmosphérique et d’accompagner les décideurs dans l’élaboration et le suivi des plans d’actions` +
` visant à améliorer la qualité de l’air.','https://data.grandlyon.com/files/2014/03/logo-AirRhoneAlpes_Carousel.png'),
(5, 'EFFIA','Filiale du Groupe Keolis, leader du stationnement en gare et numéro deux du stationnement en France,` +
` EFFIA développe une approche intermodale du stationnement qui s’inscrit dans une compréhension globale de la` +
` mobilité urbaine et de la chaîne des déplacements. Dès 2007, EFFIA a été le pionnier en France à proposer un` +
` service de réservation en ligne de places de parkings à l’avance, par téléphone ou par internet, en créant` +
` Resaplace.com. Avec 360 parkings en exploitation présents dans plus 170 villes en France, EFFIA accueil plus` +
` de 22 millions de véhicules par an.','https://data.grandlyon.com/files/2016/04/Logo-Effia-baseline-couleur-300x92.png'),
(6, 'Métropole de Lyon',
'La Métropole de Lyon est née le 1er janvier 2015 : c’est une collectivité territoriale unique en France créée` +
` par la fusion de la Communauté urbaine de Lyon et du Conseil général du Rhône sur les 59 communes qui composent` +
` le territoire du Grand Lyon. Elle intervient désormais sur les domaines des solidarités, du développement` +
` économique, du cadre de vie, de la gestion au quotidien, de l’éducation, de la culture et des loisirs, de plus` +
` de 1,2 millions d’habitants.',
'https://data.grandlyon.com/files/2013/02/grandlyon.png'),
(7, 'Indigo',
'Leader mondial du stationnement et de la mobilité individuelle, Indigo est présent dans plus de 500 villes et` +
` 17 pays. Le Groupe français conçoit et gère des espaces propres, sûrs et accueillants pour que ses clients` +
` puissent profiter sereinement de leur stationnement. Acteur global avec un ancrage local, Indigo propose des` +
` expertises et des gammes de services adaptés aux besoins des collectivités et des entreprises. Pour faciliter` +
` toujours plus l’expérience de nos utilisateurs, Indigo offre un panel de services innovants et connectés tels` +
` que le paiement par mobile, la pré-réservation de places de parking, le jalonnement dynamique, la lecture de` +
` plaques minéralogiques, le guidage pour optimiser les temps de mobilité, autant d’exemples qui favorisent` +
` un parcours client plus intégré, plus fluide, plus facile.',
'https://data.grandlyon.com/files/2017/03/INDIGO.png'),
(8, 'LPA','La société LPA est un acteur de la mobilité dans la métropole. Elle gère plus de 30 parcs de ` +
`stationnement esthétiques, accueillants et confortables répartis dans les principaux quartiers de Lyon et` +
` Villeurbanne. Voitures, motos et vélos, LPA propose une solution à chacun !LPA gère également le service` +
` d’autopartage Citiz qui propose 100 véhicules en libre-service accessibles 24h/24 et 7j/7 grâce à une offre` +
` tout compris : carburant, entretien et assurance.','https://data.grandlyon.com/files/2016/04/LPA15_logotype_mobi-01-300x300.jpg'),
(9, 'OnlyLyon Tourisme & Congrès','OnlyLyon Tourisme & Congrès, association Loi 1901, a pour mission première la` +
` promotion de Lyon sur les segments du tourisme d’affaires, d’agrément et de proximité. Elle est aussi en` +
` charge de l’accueil des visiteurs nationaux et internationaux sur le territoire du Grand Lyon. Membre actif` +
` de la plateforme collaborative Apidae (1er réseau d’informations touristiques et de loisirs en Rhône-Alpes),` +
`OnlyLyon Tourisme & Congrès gère plus de 7 000 fiches descriptives des activités, visites, manifestations, ` +
`commerces et hébergements sur le périmètre du Grand Lyon','https://data.grandlyon.com/files/2014/06/logo-OnlyLyon_H_Carousel.png'),
(10, 'Q-Park France','Q-Park France, challenger du marché du stationnement, est une filiale du groupe Q-Park,` +
` entreprise européenne spécialisée dans l’investissement, la construction et la gestion de parkings à` +
` haut niveau de qualité à des emplacements stratégiques. L’entreprise gère 195 parkings dans 70 villes en` +
` France et concentre ses activités dans des parkings multifonctionnels de centre-ville, à proximité des pôles` +
` de transports publics et des hôpitaux. Conscient que ses clients sont de plus en plus mobiles et connectés,` +
` Q-Park déploie une stratégie digitale d’envergure adaptée à ce nouveau mode de consommation 2.0 : le site` +
` q-park-resa.fr permet aux utilisateurs de réserver en quelques clics leur place de stationnement et d’en` +
` connaître le coût, pour une gestion optimale de leur budget.','https://data.grandlyon.com/files/2016/` +
`04/0608-logo-Q-park-fc-300x119.jpg'),
(11, 'Rhônexpress','Rhônexpress est la première liaison ferroviaire dédiée entre une métropole et son aéroport.` +
` Depuis le 9 août 2010, 365 jours par an, de 4h25 à minuit, Rhônexpress est le moyen le plus rapide (moins` +
` de 30 minutes), et le plus sûr pour relier le centre de Lyon à l’aéroport Saint Exupéry en passant par` +
` Vaulx-en-Velin. Plus d’information sur www.rhonexpress.fr. Retrouvez-nous sur www.facebook.com/Rhonexpress` +
`Officiel/','https://data.grandlyon.com/files/2016/05/Logo-fiche-parent-300x300.png'),
(12, 'JCDecaux','JCDecaux est le numéro un mondial de la Communication Extérieure et numéro un mondial du Vélo ` +
`en Libre-Service. Depuis mai 2013, toutes les données de localisation des stations vélos et les données temps` +
`réel de disponibilité des vélos et places de stationnement en stations, sont disponibles en open data. Inventeur` +
` du concept du Mobilier Urbain en 1964, JCDecaux est le seul acteur mondial à exercer exclusivement le` +
` métier de la communication extérieure et à en développer toutes les activités : mobilier urbain, publicité` +
` dans les transports et affichage grand format. Avec ses 10 400 collaborateurs, JCDecaux est présent dans` +
` plus de 55 pays sur les 5 continents et dans 3 700 villes de plus de 10 000 habitants. Le Groupe a réalisé` +
` un chiffre d’affaires de 2 623 M€ en 2012.','https://data.grandlyon.com/files/2013/07/logo-JCDECAUX_Carousel.png'),
(13, 'Ville de Lyon','Métropole européenne à taille humaine, avec plus de 468 000 habitants, Lyon est régulièrement` +
` citée parmi les villes de France et d’Europe où l’on vit le mieux. Classée au Patrimoine mondial par l’UNESCO,` +
` elle offre un subtil mélange entre cadre de vie attractif et dynamisme économique.','https://data.grandlyon.com` +
`/files/2013/05/logo-VilleDeLyon_Carousel.png'),
(14, 'RNSA','Le RNSA est l’association en charge de l’information sur le risque allergique lié aux particules` +
` biologiques (pollens et moisissures) présentes dans l’air. Sa mission de service public comprend un réseau` +
` de mesure des particules biologiques dans l’air, un réseau d’observateurs phénologiques, et un réseau de` +
` médecins sentinelles pour apprécier l’impact sanitaire lié aux particules biologiques. Pour en savoir plus` +
` www.pollens.fr','https://data.grandlyon.com/files/2014/09/logo-RNSA.png'),
(15, 'SYTRAL','Créé en 1985, le Syndicat Mixte des Transports pour le Rhône et l’agglomération Lyonnaise (SYTRAL)` +
` est l’autorité organisatrice des transports. Le périmètre de compétences du SYTRAL s’étend sur tout le ` +
`territoire rhodanien. Le SYTRAL organise et pilote 3 réseaux (TCL, Libellule, Cars du Rhône) et 2 services` +
` (Optibus et RhônExpress). Sa mission consiste sur son périmètre géographique à financer et développer l’offre ` +
`des transports en commun : prise en compte des attentes des territoires, exigence de la qualité de service rendu,` +
` développement de l’attractivité des transports en commun, écoute des usagers et de leurs besoins, mise en place ` +
`de nouveaux outils d’information… Plus d’information sur : www.sytral.fr et http://magazine.sytral.fr/',` +
`'https://data.grandlyon.com/files/2015/01/New_Sytral200x74.jpg'),
(16, 'TUBà','Lieu d’expérimentation, le TUBà est une plateforme d’innovation et de création de nouveaux services ` +
`à partir des données. C’est un lieu d’animation et d’échanges. Un laboratoire urbain à grande échelle.` +
` Sa vocation ? Faire émerger les services de demain par les entreprises du territoire et pour ses ` +
`habitants. Deux espaces de travail ont été inaugurés courant 2014 : le ShowRoom (ouvert au public) et ` +
`un espace de Co-working (réservé aux entreprises et aux porteurs de projet).','https://data.grandlyon.com` +
`/files/2014/08/logo-TUBa_Carousel.png'),
(17, 'Ville de Chassieu','Métropole européenne à taille humaine, avec plus de 468 000 habitants, Lyon est ` +
`régulièrement citée parmi les villes de France et d’Europe où l’on vit le mieux. Classée au Patrimoine ` +
`mondial par l’UNESCO, elle offre un subtil mélange entre cadre de vie attractif et dynamisme économique.',` +
`'https://data.grandlyon.com/files/2013/05/logo-VilleDeLyon_Carousel.png')
;`);
await queryRunner.query(`INSERT INTO link ("name",url,"organizationId") VALUES
('Aéroports de Lyon', 'https://www.lyonaeroports.com/', 1),
('Acoucité', 'http://www.acoucite.org', 2),
('Cityway', 'https://www.cityway.fr/', 3),
('Air Rhône-Alpes', 'https://www.atmo-auvergnerhonealpes.fr/', 4),
('EFFIA', 'https://www.effia.com/', 5),
('Métropole de Lyon', 'https://data.grandlyon.com/', 6),
('Indigo', 'http://www.parkindigo.com/fr/', 7),
('LPA', 'http://www.lpa.fr/', 8),
('OnlyLyon Tourisme & Congrès', 'https://www.apidae-tourisme.com/', 9),
('Q-Park France', 'https://www.q-park.fr/', 10),
('Rhônexpress', 'http://www.rhonexpress.fr/', 11),
('JCDecaux', 'https://www.jcdecaux.com/', 12),
('Ville de Lyon', 'https://www.lyon.fr/', 13),
('RNSA', 'http://www.pollens.fr/accueil.php', 14),
('SYTRAL', 'http://www.sytral.fr/', 15),
('TUBà', 'http://www.tuba-lyon.com/', 16),
('Ville de Chassieu', 'https://www.lyon.fr/', 17);`);
}
public async down(queryRunner: QueryRunner): Promise<any> {
await queryRunner.query(`TRUNCATE TABLE organization CASCADE`);
await queryRunner.query(`TRUNCATE TABLE link CASCADE`);
}
}
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment