From 67ba489fe2f2a2706d640a668cd0e675ded6a7df Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Wed, 20 Jan 2021 17:25:46 +0100 Subject: [PATCH 01/10] Added a config option for test data seeding ref #110 --- src/config.ts | 3 ++- src/loaders/database.ts | 5 +++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/config.ts b/src/config.ts index 580c90d..24902a8 100644 --- a/src/config.ts +++ b/src/config.ts @@ -9,7 +9,8 @@ export const config = { jwt_secret: process.env.JWT_SECRET || "secretjwtsecret", phone_validation_countrycode: getPhoneCodeLocale(), postalcode_validation_countrycode: getPostalCodeLocale(), - version: process.env.VERSION || require('../package.json').version + version: process.env.VERSION || require('../package.json').version, + seedTestData: process.env.SEED_TEST || false } let errors = 0 if (typeof config.internal_port !== "number") { diff --git a/src/loaders/database.ts b/src/loaders/database.ts index 9dda78d..09f71a6 100644 --- a/src/loaders/database.ts +++ b/src/loaders/database.ts @@ -1,6 +1,8 @@ import { createConnection } from "typeorm"; import { runSeeder } from 'typeorm-seeding'; +import { config } from '../config'; import { User } from '../models/entities/User'; +import SeedTestRunners from '../seeds/SeedTestRunners'; import SeedUsers from '../seeds/SeedUsers'; /** * Loader for the database that creates the database connection and initializes the database tabels. @@ -12,5 +14,8 @@ export default async () => { if (await connection.getRepository(User).count() === 0) { await runSeeder(SeedUsers); } + if (config.seedTestData) { + await runSeeder(SeedTestRunners); + } return connection; }; \ No newline at end of file From 9df9d9ae80277d5ccc753639badb48c4afb13088 Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Wed, 20 Jan 2021 17:26:04 +0100 Subject: [PATCH 02/10] Added a seeder for runner test data ref #110 --- src/seeds/SeedTestRunners.ts | 73 ++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 src/seeds/SeedTestRunners.ts diff --git a/src/seeds/SeedTestRunners.ts b/src/seeds/SeedTestRunners.ts new file mode 100644 index 0000000..6bb1e28 --- /dev/null +++ b/src/seeds/SeedTestRunners.ts @@ -0,0 +1,73 @@ +import { Connection } from 'typeorm'; +import { Factory, Seeder } from 'typeorm-seeding'; +import { CreateRunner } from '../models/actions/create/CreateRunner'; +import { CreateRunnerOrganisation } from '../models/actions/create/CreateRunnerOrganisation'; +import { CreateRunnerTeam } from '../models/actions/create/CreateRunnerTeam'; +import { Address } from '../models/entities/Address'; +import { Runner } from '../models/entities/Runner'; +import { RunnerGroup } from '../models/entities/RunnerGroup'; +import { RunnerOrganisation } from '../models/entities/RunnerOrganisation'; +import { RunnerTeam } from '../models/entities/RunnerTeam'; + +/** + * Seeds a test runner org with a test runner team ans some test runners. + * Usefull for testing or demo instances. + */ +export default class SeedTestRunners implements Seeder { + public async run(factory: Factory, connection: Connection): Promise { + let testOrg: RunnerOrganisation = await this.createTestOrg(connection); + let testTeam: RunnerTeam = await this.createTestTeam(connection, testOrg); + await this.createTestRunners(connection, testTeam); + } + + public async createTestOrg(connection: Connection): Promise { + let testOrg = new CreateRunnerOrganisation(); + testOrg.name = "Test Org"; + + testOrg.address = new Address(); + testOrg.address.address1 = "Test street 1"; + testOrg.address.city = "Herzogenaurach"; + testOrg.address.country = "Germany"; + testOrg.address.postalcode = "90174"; + + return await connection.getRepository(RunnerOrganisation).save(await testOrg.toEntity()); + } + + public async createTestTeam(connection: Connection, org: RunnerOrganisation): Promise { + let testTeam = new CreateRunnerTeam(); + testTeam.name = "Test Team"; + testTeam.parentGroup = org.id; + + return await connection.getRepository(RunnerTeam).save(await testTeam.toEntity()); + } + + public async createTestRunners(connection: Connection, group: RunnerGroup) { + for (let first of this.firstnames) { + for (let last of this.lastnames) { + let runner = new CreateRunner; + runner.firstname = first; + runner.lastname = last; + runner.middlename = group.name; + runner.group = group.id; + await connection.getRepository(Runner).save(await runner.toEntity()); + } + } + } + + private firstnames = [ + "Peter", + "Matze", + "Tine", + "Uta", + "Fabian", + "Unicode:ÖÄ?✔⚠" + ] + + private lastnames = [ + "Muster", + "Example", + "Müller", + "Unicode:搆Ǩ>ÙՠƳ|" + ] + +} \ No newline at end of file From 8870ebdb5e6d9045222440abc2c047929a74b520 Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Wed, 20 Jan 2021 17:33:31 +0100 Subject: [PATCH 03/10] SEED_TEST_DATA is now false by default ref #110 --- .env.example | 3 ++- src/config.ts | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.env.example b/.env.example index 076d8cd..ebf22c4 100644 --- a/.env.example +++ b/.env.example @@ -6,4 +6,5 @@ DB_USER=bla DB_PASSWORD=bla DB_NAME=bla NODE_ENV=production -POSTALCODE_COUNTRYCODE=DE \ No newline at end of file +POSTALCODE_COUNTRYCODE=DE +SEED_TEST_DATA=false \ No newline at end of file diff --git a/src/config.ts b/src/config.ts index 24902a8..aa1a40a 100644 --- a/src/config.ts +++ b/src/config.ts @@ -10,7 +10,7 @@ export const config = { phone_validation_countrycode: getPhoneCodeLocale(), postalcode_validation_countrycode: getPostalCodeLocale(), version: process.env.VERSION || require('../package.json').version, - seedTestData: process.env.SEED_TEST || false + seedTestData: process.env.SEED_TEST_DATA || false } let errors = 0 if (typeof config.internal_port !== "number") { From eab0e634a26c1a80e7fa2ccb9dc368f0760b2fd8 Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Wed, 20 Jan 2021 17:34:53 +0100 Subject: [PATCH 04/10] Now also seeding runners to the test org ref #110 --- src/seeds/SeedTestRunners.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/seeds/SeedTestRunners.ts b/src/seeds/SeedTestRunners.ts index 6bb1e28..531b28e 100644 --- a/src/seeds/SeedTestRunners.ts +++ b/src/seeds/SeedTestRunners.ts @@ -17,6 +17,7 @@ export default class SeedTestRunners implements Seeder { public async run(factory: Factory, connection: Connection): Promise { let testOrg: RunnerOrganisation = await this.createTestOrg(connection); let testTeam: RunnerTeam = await this.createTestTeam(connection, testOrg); + await this.createTestRunners(connection, testOrg); await this.createTestRunners(connection, testTeam); } From 1837336865893ca39d3bc628ff3c57e018a8555d Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Wed, 20 Jan 2021 17:38:34 +0100 Subject: [PATCH 05/10] Now creating a test contact ref #110 --- src/seeds/SeedTestRunners.ts | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/seeds/SeedTestRunners.ts b/src/seeds/SeedTestRunners.ts index 531b28e..14725c6 100644 --- a/src/seeds/SeedTestRunners.ts +++ b/src/seeds/SeedTestRunners.ts @@ -1,9 +1,11 @@ import { Connection } from 'typeorm'; import { Factory, Seeder } from 'typeorm-seeding'; +import { CreateGroupContact } from '../models/actions/create/CreateGroupContact'; import { CreateRunner } from '../models/actions/create/CreateRunner'; import { CreateRunnerOrganisation } from '../models/actions/create/CreateRunnerOrganisation'; import { CreateRunnerTeam } from '../models/actions/create/CreateRunnerTeam'; import { Address } from '../models/entities/Address'; +import { GroupContact } from '../models/entities/GroupContact'; import { Runner } from '../models/entities/Runner'; import { RunnerGroup } from '../models/entities/RunnerGroup'; import { RunnerOrganisation } from '../models/entities/RunnerOrganisation'; @@ -17,6 +19,7 @@ export default class SeedTestRunners implements Seeder { public async run(factory: Factory, connection: Connection): Promise { let testOrg: RunnerOrganisation = await this.createTestOrg(connection); let testTeam: RunnerTeam = await this.createTestTeam(connection, testOrg); + await this.createTestContact(connection, testOrg); await this.createTestRunners(connection, testOrg); await this.createTestRunners(connection, testTeam); } @@ -55,6 +58,22 @@ export default class SeedTestRunners implements Seeder { } } + public async createTestContact(connection: Connection, group: RunnerGroup) { + let contact = new CreateGroupContact; + contact.firstname = "Test"; + contact.lastname = "Contact"; + contact.email = "test.contact@dev.lauf-fuer-kaya.de"; + contact.groups = group.id; + + contact.address = new Address(); + contact.address.address1 = "First Contact Street 100"; + contact.address.city = "Herzogenaurach"; + contact.address.country = "Germany"; + contact.address.postalcode = "90174"; + + await connection.getRepository(GroupContact).save(await contact.toEntity()); + } + private firstnames = [ "Peter", "Matze", From 2db6510a8ad83300b286a3bd35ca4db103da72d1 Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Wed, 20 Jan 2021 17:58:11 +0100 Subject: [PATCH 06/10] Added a citizen org seeder ref #110 --- src/seeds/SeedPublicOrg.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 src/seeds/SeedPublicOrg.ts diff --git a/src/seeds/SeedPublicOrg.ts b/src/seeds/SeedPublicOrg.ts new file mode 100644 index 0000000..57685f8 --- /dev/null +++ b/src/seeds/SeedPublicOrg.ts @@ -0,0 +1,15 @@ +import { Connection } from 'typeorm'; +import { Factory, Seeder } from 'typeorm-seeding'; +import { CreateRunnerOrganisation } from '../models/actions/create/CreateRunnerOrganisation'; +import { RunnerOrganisation } from '../models/entities/RunnerOrganisation'; + +/** + * Seeds the public runner org (named: "Citizen" by default). + */ +export default class SeedPublicOrg implements Seeder { + public async run(factory: Factory, connection: Connection): Promise { + let publicOrg = new CreateRunnerOrganisation(); + publicOrg.name = "Citizen"; + await connection.getRepository(RunnerOrganisation).save(await publicOrg.toEntity()); + } +} \ No newline at end of file From b15967ff3162e9fe3a634a6f4fc5669f2314cc21 Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Wed, 20 Jan 2021 17:58:28 +0100 Subject: [PATCH 07/10] Added key-value like db table for config flags ref #110 --- src/models/entities/ConfigFlags.ts | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 src/models/entities/ConfigFlags.ts diff --git a/src/models/entities/ConfigFlags.ts b/src/models/entities/ConfigFlags.ts new file mode 100644 index 0000000..3dd6c69 --- /dev/null +++ b/src/models/entities/ConfigFlags.ts @@ -0,0 +1,27 @@ +import { + IsNotEmpty, + IsString +} from "class-validator"; +import { Column, Entity, PrimaryColumn } from "typeorm"; + +/** + * Defines the ConfigFlag entity. + * This entity can be used to set some flags on db init. +*/ +@Entity() +export class ConfigFlag { + /** + * The flag's name (primary). + */ + @PrimaryColumn() + @IsString() + option: string; + + /** + * The flag's value. + */ + @Column() + @IsString() + @IsNotEmpty() + value: string; +} From c18012f65a704e07acd56870c9ed9f6d06cf97a9 Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Wed, 20 Jan 2021 17:59:33 +0100 Subject: [PATCH 08/10] Added bool conversion for testdata seeding env var ref #110 --- src/config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.ts b/src/config.ts index aa1a40a..76f0ee1 100644 --- a/src/config.ts +++ b/src/config.ts @@ -10,7 +10,7 @@ export const config = { phone_validation_countrycode: getPhoneCodeLocale(), postalcode_validation_countrycode: getPostalCodeLocale(), version: process.env.VERSION || require('../package.json').version, - seedTestData: process.env.SEED_TEST_DATA || false + seedTestData: JSON.parse(process.env.SEED_TEST_DATA) || false } let errors = 0 if (typeof config.internal_port !== "number") { From 7bc603028dc60d26ffc5327868afbce512966d4d Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Wed, 20 Jan 2021 18:02:08 +0100 Subject: [PATCH 09/10] The data seeding now only get's triggered on the first time thx to using the key-value ref #110 --- src/loaders/database.ts | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/loaders/database.ts b/src/loaders/database.ts index 09f71a6..0b4a16a 100644 --- a/src/loaders/database.ts +++ b/src/loaders/database.ts @@ -1,7 +1,8 @@ import { createConnection } from "typeorm"; import { runSeeder } from 'typeorm-seeding'; import { config } from '../config'; -import { User } from '../models/entities/User'; +import { ConfigFlag } from '../models/entities/ConfigFlags'; +import SeedPublicOrg from '../seeds/SeedPublicOrg'; import SeedTestRunners from '../seeds/SeedTestRunners'; import SeedUsers from '../seeds/SeedUsers'; /** @@ -11,11 +12,20 @@ import SeedUsers from '../seeds/SeedUsers'; export default async () => { const connection = await createConnection(); await connection.synchronize(); - if (await connection.getRepository(User).count() === 0) { + + //The data seeding part + if (!(await connection.getRepository(ConfigFlag).findOne({ option: "seeded:user", value: "true" }))) { await runSeeder(SeedUsers); + await connection.getRepository(ConfigFlag).save({ option: "seeded:user", value: "true" }); } - if (config.seedTestData) { + if (!(await connection.getRepository(ConfigFlag).findOne({ option: "seeded:citizenorg", value: "true" }))) { + await runSeeder(SeedPublicOrg); + await connection.getRepository(ConfigFlag).save({ option: "seeded:citizenorg", value: "true" }); + } + if (!(await connection.getRepository(ConfigFlag).findOne({ option: "seeded:testdata", value: "true" })) && config.seedTestData == true) { await runSeeder(SeedTestRunners); + await connection.getRepository(ConfigFlag).save({ option: "seeded:testdata", value: "true" }); } + return connection; }; \ No newline at end of file From e12aedd1aad6de1f934e9593dda4607a303b2eb5 Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Wed, 20 Jan 2021 18:28:41 +0100 Subject: [PATCH 10/10] Fixed the bool converter for null values ref #110 --- src/config.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/config.ts b/src/config.ts index 76f0ee1..3bdcd27 100644 --- a/src/config.ts +++ b/src/config.ts @@ -10,7 +10,7 @@ export const config = { phone_validation_countrycode: getPhoneCodeLocale(), postalcode_validation_countrycode: getPostalCodeLocale(), version: process.env.VERSION || require('../package.json').version, - seedTestData: JSON.parse(process.env.SEED_TEST_DATA) || false + seedTestData: getDataSeeding() } let errors = 0 if (typeof config.internal_port !== "number") { @@ -31,4 +31,11 @@ function getPostalCodeLocale(): any { return null; } } +function getDataSeeding(): Boolean { + try { + return JSON.parse(process.env.SEED_TEST_DATA); + } catch (error) { + return false; + } +} export let e = errors \ No newline at end of file