diff --git a/src/environment/config.ts b/src/environment/config.ts index 009c1a2..81c7bf0 100644 --- a/src/environment/config.ts +++ b/src/environment/config.ts @@ -1,6 +1,7 @@ import { echo } from "@atums/echo"; import { validateJWTConfig, validateMailerConfig } from "#lib/validation"; import { isValidUrl } from "#lib/validation/url"; +import { requiredVariables } from "./constants"; import { cassandraConfig, validateCassandraConfig } from "./database/cassandra"; import { jwt } from "./jwt"; import { mailerConfig } from "./mailer"; @@ -12,30 +13,11 @@ const environment: Environment = { host: process.env.HOST || "0.0.0.0", development: process.env.NODE_ENV === "development" || process.argv.includes("--dev"), - fqdn: process.env.FRONTEND_FQDN || "", + frontendFqdn: process.env.FRONTEND_FQDN || "", + backendFqdn: process.env.BACKEND_FQDN || "", }; function verifyRequiredVariables(): void { - const requiredVariables = [ - "HOST", - "PORT", - - "REDIS_URL", - "REDIS_TTL", - - "CASSANDRA_HOST", - "CASSANDRA_PORT", - "CASSANDRA_CONTACT_POINTS", - "CASSANDRA_AUTH_ENABLED", - "CASSANDRA_DATACENTER", - - "JWT_SECRET", - "JWT_EXPIRATION", - "JWT_ISSUER", - - "FRONTEND_FQDN", - ]; - let hasError = false; for (const key of requiredVariables) { @@ -56,9 +38,11 @@ function verifyRequiredVariables(): void { } const validateJWT = validateJWTConfig(jwt); - if (!validateJWT.valid) { + if (!validateJWT.isValid) { echo.error("JWT configuration validation failed:"); - echo.error(`- ${validateJWT.error}`); + for (const error of validateJWT.errors) { + echo.error(`- ${error}`); + } hasError = true; } @@ -71,19 +55,24 @@ function verifyRequiredVariables(): void { hasError = true; } - const urlValidation = isValidUrl(environment.fqdn, { - requireProtocol: true, - failOnTrailingSlash: true, - allowedProtocols: ["http", "https"], - allowLocalhost: environment.development, - allowIP: environment.development, - }); + const validateUrl = (url: string, name: string) => { + const validation = isValidUrl(url, { + requireProtocol: true, + failOnTrailingSlash: true, + allowedProtocols: ["http", "https"], + allowLocalhost: environment.development, + allowIP: environment.development, + }); - if (!urlValidation.valid) { - echo.error("FRONTEND_FQDN validation failed:"); - echo.error(`- ${urlValidation.error}`); - hasError = true; - } + if (!validation.valid) { + echo.error(`${name} validation failed:`); + echo.error(`- ${validation.error}`); + hasError = true; + } + }; + + validateUrl(environment.frontendFqdn, "FRONTEND_FQDN"); + validateUrl(environment.backendFqdn, "BACKEND_FQDN"); if (hasError) { process.exit(1); diff --git a/src/environment/constants/index.ts b/src/environment/constants/index.ts index dab8414..310a710 100644 --- a/src/environment/constants/index.ts +++ b/src/environment/constants/index.ts @@ -1,3 +1,32 @@ +export const requiredVariables = [ + "HOST", + "PORT", + + "REDIS_URL", + "REDIS_TTL", + + "CASSANDRA_HOST", + "CASSANDRA_PORT", + "CASSANDRA_CONTACT_POINTS", + "CASSANDRA_DATACENTER", + "CASSANDRA_KEYSPACE", + + "JWT_SECRET", + "JWT_EXPIRATION", + "JWT_ISSUER", + + "FRONTEND_FQDN", + + "SMTP_ADDRESS", + "SMTP_PORT", + "SMTP_FROM", + "SMTP_USERNAME", + "SMTP_PASSWORD", + + "EXTRA_COMPANY_NAME", + "EXTRA_SUPPORT_EMAIL", +]; + export * from "./server"; export * from "./validation"; export * from "./database"; diff --git a/src/environment/constants/server.ts b/src/environment/constants/server.ts index 2ff4a9f..aedf92e 100644 --- a/src/environment/constants/server.ts +++ b/src/environment/constants/server.ts @@ -1,6 +1,6 @@ const reqLoggerIgnores = { ignoredStartsWith: ["/public"], - ignoredPaths: [""], + ignoredPaths: ["/favicon.ico"], }; export { reqLoggerIgnores }; diff --git a/src/environment/database/cassandra.ts b/src/environment/database/cassandra.ts index 41254cc..25a988d 100644 --- a/src/environment/database/cassandra.ts +++ b/src/environment/database/cassandra.ts @@ -1,4 +1,5 @@ import type { CassandraConfig } from "#types/config"; +import type { simpleConfigValidation } from "#types/lib"; function isValidHost(host: string): boolean { if (!host || host.trim().length === 0) return false; @@ -50,10 +51,9 @@ function isValidDatacenter(datacenter: string, authEnabled: boolean): boolean { return datacenter.trim().length > 0; } -function validateCassandraConfig(config: CassandraConfig): { - isValid: boolean; - errors: string[]; -} { +function validateCassandraConfig( + config: CassandraConfig, +): simpleConfigValidation { const errors: string[] = []; if (!isValidHost(config.host)) { diff --git a/src/environment/extra.ts b/src/environment/extra.ts new file mode 100644 index 0000000..4cd5848 --- /dev/null +++ b/src/environment/extra.ts @@ -0,0 +1,6 @@ +const extraValues = { + companyName: process.env.EXTRA_COMPANY_NAME || "Default Company", + supportEmail: process.env.EXTRA_SUPPORT_EMAIL || "", +}; + +export { extraValues }; diff --git a/src/environment/mailer/templates/register.html b/src/environment/mailer/templates/register.html index 5573145..cd55ac0 100644 --- a/src/environment/mailer/templates/register.html +++ b/src/environment/mailer/templates/register.html @@ -5,28 +5,95 @@
Hi {{displayName}},
-Thank you for registering with {{companyName}}. Your account has been successfully created.
-
- User ID: {{id}}
- Verification Status: {{isVerified}}
-
Thanks for signing up! Please verify your email address to activate your account:
-To get started, please verify your email address by clicking the link below:
- + + +If the button doesn't work:
+Copy and paste this link into your browser:
+Once verified, you'll have full access to your {{companyName}} account!
+ +Questions? Reply to this email or contact us at {{supportEmail}}
-If you didn't create this account, please ignore this email.
- Best regards,
- The {{companyName}} team
-
Best regards,
The {{companyName}} team