From fcfc10f7d123130a5abfb877035c0e073c885021 Mon Sep 17 00:00:00 2001 From: Philipp Dormann Date: Sun, 6 Dec 2020 11:21:10 +0100 Subject: [PATCH 1/3] =?UTF-8?q?=E2=9C=85=20phone=20countrycode=20validatio?= =?UTF-8?q?n=20in=20env=20vars?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ref #18 #16 --- src/config.ts | 3 ++- src/models/creation/CreateGroupContact.ts | 3 ++- src/models/entities/GroupContact.ts | 3 ++- src/models/entities/Participant.ts | 3 ++- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/config.ts b/src/config.ts index 5f54ce3..5dd7d19 100644 --- a/src/config.ts +++ b/src/config.ts @@ -3,5 +3,6 @@ dotenvSafe.config(); export const config = { internal_port: process.env.APP_PORT || 4010, development: process.env.NODE_ENV === "production", - jwt_secret: process.env.JWT_SECRET || "secretjwtsecret" + jwt_secret: process.env.JWT_SECRET || "secretjwtsecret", + phone_validation_countrycode: process.env.PHONE_COUNTRYCODE || "ZZ" } \ No newline at end of file diff --git a/src/models/creation/CreateGroupContact.ts b/src/models/creation/CreateGroupContact.ts index 73f43d0..d8aa815 100644 --- a/src/models/creation/CreateGroupContact.ts +++ b/src/models/creation/CreateGroupContact.ts @@ -1,5 +1,6 @@ import { IsEmail, IsInt, IsNotEmpty, IsOptional, IsPhoneNumber, IsString } from 'class-validator'; import { getConnectionManager } from 'typeorm'; +import { config } from '../../config'; import { AddressNotFoundError, AddressWrongTypeError } from '../../errors/AddressErrors'; import { Address } from '../entities/Address'; import { GroupContact } from '../entities/GroupContact'; @@ -40,7 +41,7 @@ export class CreateGroupContact { * Optional */ @IsOptional() - @IsPhoneNumber("DE") + @IsPhoneNumber(config.phone_validation_countrycode) phone?: string; /** diff --git a/src/models/entities/GroupContact.ts b/src/models/entities/GroupContact.ts index c7c8f18..08c5db3 100644 --- a/src/models/entities/GroupContact.ts +++ b/src/models/entities/GroupContact.ts @@ -8,6 +8,7 @@ import { IsString } from "class-validator"; import { Column, Entity, ManyToOne, OneToMany, PrimaryGeneratedColumn } from "typeorm"; +import { config } from '../../config'; import { Address } from "./Address"; import { RunnerGroup } from "./RunnerGroup"; @@ -62,7 +63,7 @@ export class GroupContact { */ @Column({ nullable: true }) @IsOptional() - @IsPhoneNumber("DE") + @IsPhoneNumber(config.phone_validation_countrycode) phone?: string; /** diff --git a/src/models/entities/Participant.ts b/src/models/entities/Participant.ts index 2e40f5d..791b30d 100644 --- a/src/models/entities/Participant.ts +++ b/src/models/entities/Participant.ts @@ -8,6 +8,7 @@ import { IsString } from "class-validator"; import { Column, Entity, ManyToOne, OneToMany, PrimaryGeneratedColumn, TableInheritance } from "typeorm"; +import { config } from '../../config'; import { Address } from "./Address"; import { Donation } from "./Donation"; @@ -62,7 +63,7 @@ export abstract class Participant { */ @Column({ nullable: true }) @IsOptional() - @IsPhoneNumber("DE") + @IsPhoneNumber(config.phone_validation_countrycode) phone?: string; /** From 4cfe9df429366c760a9a2346fe1256a8e0deb285 Mon Sep 17 00:00:00 2001 From: Philipp Dormann Date: Wed, 9 Dec 2020 19:09:20 +0100 Subject: [PATCH 2/3] final phone validation move to ZZ default close #16 --- src/models/actions/CreateParticipant.ts | 3 ++- src/models/actions/CreateUser.ts | 3 ++- src/models/entities/User.ts | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/models/actions/CreateParticipant.ts b/src/models/actions/CreateParticipant.ts index 00c8783..9cd51ce 100644 --- a/src/models/actions/CreateParticipant.ts +++ b/src/models/actions/CreateParticipant.ts @@ -1,5 +1,6 @@ import { IsEmail, IsInt, IsNotEmpty, IsOptional, IsPhoneNumber, IsString } from 'class-validator'; import { getConnectionManager } from 'typeorm'; +import { config } from '../../config'; import { AddressNotFoundError, AddressWrongTypeError } from '../../errors/AddressErrors'; import { Address } from '../entities/Address'; @@ -32,7 +33,7 @@ export abstract class CreateParticipant { */ @IsString() @IsOptional() - @IsPhoneNumber("ZZ") + @IsPhoneNumber(config.phone_validation_countrycode) phone?: string; /** diff --git a/src/models/actions/CreateUser.ts b/src/models/actions/CreateUser.ts index ff6771a..d3c6ef6 100644 --- a/src/models/actions/CreateUser.ts +++ b/src/models/actions/CreateUser.ts @@ -2,6 +2,7 @@ import * as argon2 from "argon2"; import { IsEmail, IsOptional, IsPhoneNumber, IsString } from 'class-validator'; import { getConnectionManager } from 'typeorm'; import * as uuid from 'uuid'; +import { config } from '../../config'; import { UsernameOrEmailNeededError } from '../../errors/UserErrors'; import { UserGroupNotFoundError } from '../../errors/UserGroupErrors'; import { User } from '../entities/User'; @@ -49,7 +50,7 @@ export class CreateUser { * The new user's phone number. * Optional */ - @IsPhoneNumber("ZZ") + @IsPhoneNumber(config.phone_validation_countrycode) @IsOptional() phone?: string; diff --git a/src/models/entities/User.ts b/src/models/entities/User.ts index 8e29e27..ebc62b1 100644 --- a/src/models/entities/User.ts +++ b/src/models/entities/User.ts @@ -1,5 +1,6 @@ import { IsBoolean, IsEmail, IsInt, IsNotEmpty, IsOptional, IsPhoneNumber, IsString, IsUUID } from "class-validator"; import { Column, Entity, JoinTable, ManyToMany, ManyToOne, OneToMany, PrimaryGeneratedColumn } from "typeorm"; +import { config } from '../../config'; import { Permission } from './Permission'; import { UserAction } from './UserAction'; import { UserGroup } from './UserGroup'; @@ -35,7 +36,7 @@ export class User { */ @Column({ nullable: true }) @IsOptional() - @IsPhoneNumber("ZZ") + @IsPhoneNumber(config.phone_validation_countrycode) phone?: string; /** From 622bdf7a3fb31e69ee28b43a02b3958c2568c31e Mon Sep 17 00:00:00 2001 From: Philipp Dormann Date: Wed, 9 Dec 2020 19:40:08 +0100 Subject: [PATCH 3/3] move to dotenv + custom env validations ref #18 --- ormconfig.ts | 2 +- package.json | 4 ++-- src/app.ts | 9 +++++++-- src/config.ts | 22 ++++++++++++++++++---- 4 files changed, 28 insertions(+), 9 deletions(-) diff --git a/ormconfig.ts b/ormconfig.ts index 852ff37..bf9be07 100644 --- a/ormconfig.ts +++ b/ormconfig.ts @@ -1,4 +1,4 @@ -import { config } from 'dotenv-safe'; +import { config } from 'dotenv'; config(); export default { diff --git a/package.json b/package.json index afc485d..baae298 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ "class-validator-jsonschema": "^2.0.3", "consola": "^2.15.0", "cors": "^2.8.5", + "dotenv": "^8.2.0", "express": "^4.17.1", "helmet": "^4.2.0", "jsonwebtoken": "^8.5.1", @@ -45,14 +46,13 @@ }, "devDependencies": { "@types/cors": "^2.8.8", - "@types/dotenv-safe": "^8.1.1", + "@types/dotenv": "^8.2.0", "@types/express": "^4.17.9", "@types/jsonwebtoken": "^8.5.0", "@types/multer": "^1.4.4", "@types/node": "^14.14.9", "@types/swagger-ui-express": "^4.1.2", "@types/uuid": "^8.3.0", - "dotenv-safe": "^8.2.0", "nodemon": "^2.0.6", "sqlite3": "^5.0.0", "ts-node": "^9.0.0", diff --git a/src/app.ts b/src/app.ts index fd3dc8e..664ec6f 100644 --- a/src/app.ts +++ b/src/app.ts @@ -2,7 +2,7 @@ import consola from "consola"; import "reflect-metadata"; import { createExpressServer } from "routing-controllers"; import authchecker from "./authchecker"; -import { config } from './config'; +import { config, e as errors } from './config'; import loaders from "./loaders/index"; import { ErrorHandler } from './middlewares/ErrorHandler'; @@ -23,4 +23,9 @@ async function main() { ); }); } -main(); +if (errors === 0) { + main(); +} else { + console.log("error"); + // something's wrong +} diff --git a/src/config.ts b/src/config.ts index 5dd7d19..567e35b 100644 --- a/src/config.ts +++ b/src/config.ts @@ -1,8 +1,22 @@ -import * as dotenvSafe from "dotenv-safe"; -dotenvSafe.config(); +import { config as configDotenv } from 'dotenv'; +configDotenv(); export const config = { - internal_port: process.env.APP_PORT || 4010, + internal_port: parseInt(process.env.APP_PORT) || 4010, development: process.env.NODE_ENV === "production", jwt_secret: process.env.JWT_SECRET || "secretjwtsecret", phone_validation_countrycode: process.env.PHONE_COUNTRYCODE || "ZZ" -} \ No newline at end of file +} +let errors = 0 +if (typeof config.internal_port !== "number") { + errors++ +} +if (typeof config.phone_validation_countrycode !== "string") { + errors++ +} +if (config.phone_validation_countrycode.length !== 2) { + errors++ +} +if (typeof config.development !== "boolean") { + errors++ +} +export let e = errors \ No newline at end of file