Skip to main content

Enums & Configuration

Complete reference for all enums, constants, and configuration files used throughout the AquaGen application.


Overview

AquaGen uses enums and constants to maintain consistency and avoid magic strings/numbers throughout the codebase.

Location: libs/shared/src/enums/ and libs/shared/src/constants/


Enums

Permissions Enum

Purpose: Define all available user permissions for access control

Location: libs/shared/src/enums/permissions.js

All Permissions

export const allPermission = {
// Core Permissions
DEFAULT: 'DEFAULT',
SUPER_USER: 'SUPER_USER',

// Dashboard & Monitoring
LANDING_PAGE: 'LANDING_PAGE',
WATER_MONITORING: 'WATER_MONITORING',
DAILY_SUMMARY: 'DAILY_SUMMARY',

// Water Management
WATER_BALANCE: 'WATER_BALANCE',
WATER_NEUTRALITY: 'WATER_NEUTRALITY',
WATER_RATIO: 'WATER_RATIO',

// Water Indexes
RWI: 'RWI',
RWI_EFFICIENCY_SAVINGS: 'RWI_EFFICIENCY_SAVINGS',
UWI: 'UWI',
UWI_DASHBOARD: 'UWI_DASHBOARD',
UWI_SHOW_ENERGY_SAVING: 'UWI_SHOW_ENERGY_SAVING',
WRI: 'WRI',
WRI_MACRO_LEVEL: 'WRI_MACRO_LEVEL',
WRI_MICRO_LEVEL: 'WRI_MICRO_LEVEL',
GWI: 'GWI',

// SCADA & HMI
SCADA_EDITOR: 'SCADA_EDITOR',
SCADA_VIEWER: 'SCADA_VIEWER',
WEB_HMI: 'WEB_HMI',

// AI & Analytics
AQUAGPT: 'AQUAGPT',
NLABS: 'NLABS',

// Alerts
ALERTS: 'ALERTS',
ENERGY_ALERT: 'ENERGY_ALERT',

// Account Management
ACCOUNT_SETTINGS: 'ACCOUNT_SETTINGS',
MANUAL_NODE_ENTRY: 'MANUAL_NODE_ENTRY',

// Energy
EFFICIENCY: 'EFFICIENCY',
EFFICENCY: 'EFFICENCY', // Typo kept for backward compatibility
DISABLE_ENERGY_TOGGLE_BUTTON: 'DISABLE_ENERGY_TOGGLE_BUTTON',

// Reports
NOT_GENERAL_REPORT: 'NOT_GENERAL_REPORT'
};

Group Permissions

export const groupPermission = {
GROUP_OPERATIONS: [
allPermission.LATEST_DATA
]
};

Usage:

import { Permissions } from '@aquagen-mf-webapp/shared/enums';

// Check permission
if (PermissionController.isPermitted(
Permissions.allPermission.AQUAGPT,
loginData
)) {
// User has AquaGPT permission
}

Code Reference: libs/shared/src/enums/permissions.js:1-37


Login Type Enum

Purpose: Define different types of login methods

Location: libs/shared/src/enums/loginType.js

export const LoginType = {
DEFAULT: 'DEFAULT', // Username & Password
OTP: 'OTP', // One-Time Password
MICROSOFT: 'MICROSOFT', // Microsoft SSO
GOOGLE: 'GOOGLE', // Google OAuth
AUTO_LOGIN: 'AUTO_LOGIN' // Session-based auto login
};

Usage:

import { LoginType } from '@aquagen-mf-webapp/shared/enums';

const handleLogin = (type) => {
switch (type) {
case LoginType.MICROSOFT:
handleMicrosoftLogin();
break;
case LoginType.GOOGLE:
handleGoogleLogin();
break;
case LoginType.DEFAULT:
handleDefaultLogin();
break;
}
};

Category Type Enum

Purpose: Define different water monitoring categories

Location: libs/shared/src/enums/categoryType.js

export const CategoryType = {
SOURCE_CATEGORY: 'SOURCE_CATEGORY',
STOCK_CATEGORY: 'STOCK_CATEGORY',
QUALITY_CATEGORY: 'QUALITY_CATEGORY',
GROUND_WATER_LEVEL: 'GROUND_WATER_LEVEL',
ENERGY_CATEGORY: 'ENERGY_CATEGORY',
FLOW_CATEGORY: 'FLOW_CATEGORY'
};

Usage:

import { CategoryType } from '@aquagen-mf-webapp/shared/enums';

const navigateToCategory = (type, categoryId) => {
switch (type) {
case CategoryType.SOURCE_CATEGORY:
navigate(`/monitoring/source_category/${categoryId}`);
break;
case CategoryType.QUALITY_CATEGORY:
navigate(`/monitoring/quality_category/${categoryId}`);
break;
// ... more cases
}
};

Graph Type Enum

Purpose: Define different chart/graph types

Location: libs/shared/src/enums/graphType.js

export const GraphType = {
LINE: 'LINE',
BAR: 'BAR',
PIE: 'PIE',
AREA: 'AREA',
SCATTER: 'SCATTER',
HEATMAP: 'HEATMAP',
TREEMAP: 'TREEMAP',
COMPARISON: 'COMPARISON',
STACKED_BAR: 'STACKED_BAR',
GROUPED_BAR: 'GROUPED_BAR'
};

Usage:

import { GraphType } from '@aquagen-mf-webapp/shared/enums';

const renderGraph = (type, data) => {
switch (type) {
case GraphType.LINE:
return <LineGraph data={data} />;
case GraphType.BAR:
return <BarGraph data={data} />;
case GraphType.PIE:
return <PieChart data={data} />;
default:
return null;
}
};

Date Picker Enum

Purpose: Define date picker types and modes

Location: libs/shared/src/enums/datePickerEnum.js

export const DatePickerType = {
SINGLE: 'SINGLE',
RANGE: 'RANGE',
MONTH: 'MONTH',
YEAR: 'YEAR',
CUSTOM: 'CUSTOM'
};

export const DatePickerMode = {
DAY: 'DAY',
WEEK: 'WEEK',
MONTH: 'MONTH',
QUARTER: 'QUARTER',
YEAR: 'YEAR'
};

Usage:

import { DatePickerType, DatePickerMode } from '@aquagen-mf-webapp/shared/enums';

<AppDatePicker
type={DatePickerType.RANGE}
mode={DatePickerMode.MONTH}
onChange={handleDateChange}
/>

Analytics Enum

Purpose: Define analytics event types

Location: libs/shared/src/enums/analyticsEnum.js

export const AnalyticEvents = {
// Login Events
MICROSOFT_SSO_BUTTON_CLICK: 'MICROSOFT_SSO_BUTTON_CLICK',
GOOGLE_SSO_BUTTON_CLICK: 'GOOGLE_SSO_BUTTON_CLICK',
DEFAULT_LOGIN_CLICK: 'DEFAULT_LOGIN_CLICK',
DEFAULT_LOGIN_ERROR: 'DEFAULT_LOGIN_ERROR',
OTP_LOGIN_CLICK: 'OTP_LOGIN_CLICK',
SEND_OTP_CLICK: 'SEND_OTP_CLICK',
RESEND_OTP: 'RESEND_OTP',

// Navigation Events
PAGE_VIEW: 'PAGE_VIEW',
ROUTE_CHANGE: 'ROUTE_CHANGE',

// Feature Events
AQUAGPT_QUERY: 'AQUAGPT_QUERY',
REPORT_DOWNLOAD: 'REPORT_DOWNLOAD',
ALERT_ACKNOWLEDGED: 'ALERT_ACKNOWLEDGED',
MANUAL_ENTRY_SUBMITTED: 'MANUAL_ENTRY_SUBMITTED',

// Error Events
API_ERROR: 'API_ERROR',
NETWORK_ERROR: 'NETWORK_ERROR'
};

Usage:

import { AnalyticEvents } from '@aquagen-mf-webapp/shared/enums';
import { AnalyticsService } from '@aquagen-mf-webapp/shared/services';

const handleButtonClick = () => {
AnalyticsService.sendEvent(
AnalyticEvents.MICROSOFT_SSO_BUTTON_CLICK,
{ timestamp: Date.now() }
);
};

Subscription Enum

Purpose: Define subscription states and types

Location: libs/shared/src/enums/subscriptionEnum.js

export const SubscriptionStatus = {
ACTIVE: 'ACTIVE',
EXPIRED: 'EXPIRED',
TRIAL: 'TRIAL',
CANCELLED: 'CANCELLED',
SUSPENDED: 'SUSPENDED'
};

export const SubscriptionType = {
FREE: 'FREE',
BASIC: 'BASIC',
PREMIUM: 'PREMIUM',
ENTERPRISE: 'ENTERPRISE'
};

Usage:

import { SubscriptionStatus } from '@aquagen-mf-webapp/shared/enums';

if (subscriptionData.status === SubscriptionStatus.EXPIRED) {
showSubscriptionExpiredDialog();
}

Local DB Keys Enum

Purpose: Define keys for localStorage/sessionStorage

Location: libs/shared/src/enums/localDBKeys.js

export const LocalDBKeys = {
LOGIN_RESPONSE: 'loginResponse',
USER_PREFERENCES: 'userPreferences',
THEME: 'theme',
LANGUAGE: 'language',
SELECTED_CATEGORY: 'selectedCategory',
DASHBOARD_FILTERS: 'dashboardFilters',
CHART_SETTINGS: 'chartSettings'
};

Usage:

import { LocalDBKeys } from '@aquagen-mf-webapp/shared/enums';
import { LocalDBInstance } from '@aquagen-mf-webapp/shared/services';

// Store
LocalDBInstance.setItem(LocalDBKeys.LOGIN_RESPONSE, JSON.stringify(data));

// Retrieve
const loginData = LocalDBInstance.getItem(LocalDBKeys.LOGIN_RESPONSE);

Configuration Files

Authentication Configuration

Purpose: Configure Azure AD and Google OAuth

Location: libs/shared/src/constants/authConfig.js

Microsoft (Azure AD) Configuration

export const msalConfig = {
auth: {
clientId: '30a53001-9e7e-4264-b685-b948a0036935',
authority: 'https://login.microsoftonline.com/organizations',
redirectUri: window.location.origin,
postLogoutRedirectUri: window.location.origin,
navigateToLoginRequestUrl: false
},
cache: {
cacheLocation: 'sessionStorage',
storeAuthStateInCookie: false
},
system: {
loggerOptions: {
loggerCallback: (level, message, containsPii) => {
if (containsPii) return;
console.log(message);
},
logLevel: 'Info',
piiLoggingEnabled: false
}
}
};

export const loginRequest = {
scopes: ['User.Read']
};

export const graphConfig = {
graphMeEndpoint: 'https://graph.microsoft.com/v1.0/me'
};

Usage:

import { msalConfig, loginRequest } from '@aquagen-mf-webapp/shared/constants/authConfig';
import { PublicClientApplication } from '@azure/msal-browser';

const msalInstance = new PublicClientApplication(msalConfig);

// Login
msalInstance.loginRedirect(loginRequest);

Code Reference: libs/shared/src/constants/authConfig.js:14-50


Google OAuth Configuration

export const googleConfig = {
clientId: '463665648594-npnkvu7092n4j585vjav0mmvr537h5hr.apps.googleusercontent.com',
scope: 'openid email profile',
responseType: 'id_token',
prompt: 'select_account'
};

Usage:

import { googleConfig } from '@aquagen-mf-webapp/shared/constants/authConfig';

const googleAuthUrl =
`https://accounts.google.com/o/oauth2/v2/auth?` +
`client_id=${googleConfig.clientId}` +
`&redirect_uri=${window.location.origin}` +
`&response_type=${googleConfig.responseType}` +
`&scope=${googleConfig.scope}` +
`&prompt=${googleConfig.prompt}`;

Code Reference: libs/shared/src/constants/authConfig.js:71-73


Application Constants

Purpose: Global application constants

Location: libs/shared/src/constants/constants.js

export const constants = {
// Authentication
googleSignInEnabled: true,
microsoftSignInEnabled: true,

// OTP Configuration
resendOtpTime: 60, // seconds
otpLength: 6,

// API Configuration
apiTimeout: 50000, // milliseconds
requestRetryCount: 3,

// Date/Time
defaultDateFormat: 'DD/MM/YYYY',
defaultTimeFormat: 'HH:mm:ss',

// Pagination
defaultPageSize: 20,
maxPageSize: 100,

// Charts
defaultChartColors: [
'#1976d2', '#dc004e', '#388e3c',
'#f57c00', '#7b1fa2', '#0097a7'
],

// Thresholds
alertThreshold: 5,
qualityThreshold: 70,

// Feature Flags
enableAquaGPT: true,
enableSCADA: true,
enableHMI: true,
enableLabs: false,

// Analytics
googleAnalyticsId: 'G-XXXXXXXXXX',
mixpanelToken: 'xxxxxxxxxxxxxxxxxxxxx',
sentryDSN: 'https://xxxxxxxxxxxxx@sentry.io/xxxxxxx',

// File Upload
maxFileSize: 10485760, // 10MB in bytes
allowedFileTypes: ['.csv', '.xlsx', '.pdf', '.jpg', '.png'],

// Session
sessionTimeout: 3600000, // 1 hour in milliseconds
tokenRefreshInterval: 300000 // 5 minutes
};

Usage:

import { constants } from '@aquagen-mf-webapp/shared/constants';

// Check feature flag
if (constants.enableAquaGPT) {
renderAquaGPT();
}

// Use timeout
const timer = setTimeout(callback, constants.sessionTimeout);

// Validate file size
if (file.size > constants.maxFileSize) {
alert('File too large!');
}

API URLs Configuration

Purpose: Define API endpoints and base URLs

Location: libs/shared/src/services/api/urls.js

export class Urls {
// Base URLs by Environment
static get baseURL() {
const hostname = window.location.hostname;

if (hostname.includes('localhost')) {
return 'http://localhost:5001/api/user';
}

if (hostname.includes('dev')) {
return 'https://dev2-aquagenapi.azurewebsites.net/api/user';
}

if (hostname.includes('demo')) {
return 'https://aqua-demo-api.azurewebsites.net/api/user';
}

// Production
return 'https://prod-aquagen.azurewebsites.net/api/user';
}

// Auth Endpoints
static login = '/login';
static logout = '/logout';
static refreshToken = '/refresh';
static otpSend = '/otp/send';
static otpVerify = '/otp/verify';

// Dashboard Endpoints
static landingPageUserData = '/landingPage/userData';
static landingPageMonthsData = '/landingPage/monthsData';

// Monitoring Endpoints
static deviceData = '/deviceData';
static deviceDataV2 = '/deviceDataV2';
static granularCategory = '/granular/category';
static granularUnit = '/granular/unit';

// Alerts Endpoints
static alerts = '/alerts';
static alertsUnitGraph = '/alerts/unitGraph';
static alertsAcknowledge = '/alerts/acknowledge';

// Water Features
static waterBalance = '/waterBalance/data';
static waterNeutrality = '/waterNeutrality';
static wri = '/wri/';
static gwi = '/gwi/data';

// AI Endpoints
static gptAqua = '/gpt/aqua';
static gptStreamAqua = '/gpt/stream/aqua';

// SCADA Endpoints
static scadaGraphEditor = '/scada/graphEditor';
static scadaData = '/scada/data';

// Account Endpoints
static accountSettings = '/accounts/settings';
static accountLandingPage = '/accounts/landingpage';

// Azure AD Configuration
static azureADRedirectUrl = window.location.origin;
static azureADAuthority = 'https://login.microsoftonline.com/organizations';
}

Usage:

import { Urls } from '@aquagen-mf-webapp/shared/services/api/urls';
import { apiClient } from '@aquagen-mf-webapp/shared/services';

// API call
const response = await apiClient.get(Urls.landingPageUserData);

// Dynamic base URL
console.log('API Base:', Urls.baseURL);

Code Reference: libs/shared/src/services/api/urls.js:1-150


Environment Configuration

Purpose: Environment-specific settings

Location: Multiple environment files

// Development
export const environment = {
production: false,
apiUrl: 'https://dev2-aquagenapi.azurewebsites.net/api/user',
websocketUrl: 'wss://dev-pubsub.webpubsub.azure.com',
enableDebugMode: true,
enableSourceMaps: true,
logLevel: 'DEBUG'
};

// Production
export const environment = {
production: true,
apiUrl: 'https://prod-aquagen.azurewebsites.net/api/user',
websocketUrl: 'wss://prod-pubsub.webpubsub.azure.com',
enableDebugMode: false,
enableSourceMaps: false,
logLevel: 'ERROR'
};

Usage:

import { environment } from '../environments/environment';

if (environment.enableDebugMode) {
console.log('Debug mode enabled');
}

const apiUrl = environment.apiUrl;

Theme Configuration

Purpose: Material-UI theme customization

Location: libs/shared/src/theme/theme.js (if exists)

export const themeConfig = {
palette: {
primary: {
main: '#1976d2',
light: '#42a5f5',
dark: '#1565c0'
},
secondary: {
main: '#dc004e',
light: '#f50057',
dark: '#c51162'
},
error: {
main: '#d32f2f'
},
warning: {
main: '#f57c00'
},
success: {
main: '#388e3c'
},
info: {
main: '#0097a7'
}
},
typography: {
fontFamily: '"Roboto", "Helvetica", "Arial", sans-serif',
fontSize: 14,
h1: { fontSize: '2.5rem' },
h2: { fontSize: '2rem' },
h3: { fontSize: '1.75rem' },
h4: { fontSize: '1.5rem' },
h5: { fontSize: '1.25rem' },
h6: { fontSize: '1rem' }
},
spacing: 8,
breakpoints: {
values: {
xs: 0,
sm: 600,
md: 960,
lg: 1280,
xl: 1920
}
}
};

Firebase Configuration

Purpose: Firebase hosting and services configuration

Location: firebase.json (root)

{
"hosting": [
{
"target": "uat",
"public": "dist/apps/production",
"ignore": ["firebase.json", "**/.*", "**/node_modules/**"],
"headers": [
{
"source": "**",
"headers": [
{
"key": "X-Frame-Options",
"value": "DENY"
},
{
"key": "X-Content-Type-Options",
"value": "nosniff"
},
{
"key": "Strict-Transport-Security",
"value": "max-age=31536000; includeSubDomains"
}
]
}
],
"rewrites": [
{
"source": "**",
"destination": "/index.html"
}
]
}
]
}

Usage Patterns

Pattern 1: Using Enums for Type Safety

// ❌ Bad - Magic strings
if (permission === 'AQUAGPT') {
// ...
}

// ✅ Good - Using enum
import { Permissions } from '@aquagen-mf-webapp/shared/enums';

if (permission === Permissions.allPermission.AQUAGPT) {
// Type-safe and autocomplete-friendly
}

Pattern 2: Centralized Constants

// ❌ Bad - Hardcoded values
setTimeout(callback, 60000);

// ✅ Good - Using constant
import { constants } from '@aquagen-mf-webapp/shared/constants';

setTimeout(callback, constants.resendOtpTime * 1000);

Pattern 3: Dynamic Configuration

// ❌ Bad - Environment check everywhere
if (window.location.hostname.includes('localhost')) {
apiUrl = 'http://localhost:5001';
}

// ✅ Good - Centralized configuration
import { Urls } from '@aquagen-mf-webapp/shared/services/api/urls';

const apiUrl = Urls.baseURL;

Best Practices

1. Always Use Enums for Fixed Values

// Define enum
export const Status = {
PENDING: 'PENDING',
SUCCESS: 'SUCCESS',
ERROR: 'ERROR'
};

// Use in code
if (response.status === Status.SUCCESS) {
// ...
}
// Good organization
export const API_CONFIG = {
timeout: 50000,
retries: 3,
headers: { /* ... */ }
};

export const UI_CONFIG = {
pageSize: 20,
theme: 'light'
};

3. Document Configuration

/**
* Authentication configuration for Azure AD
* @see https://docs.microsoft.com/azure/active-directory/
*/
export const msalConfig = {
// ...
};

4. Use TypeScript for Type Safety

// With TypeScript
export enum GraphType {
LINE = 'LINE',
BAR = 'BAR',
PIE = 'PIE'
}

// Type-safe usage
const type: GraphType = GraphType.LINE;

5. Environment-Specific Overrides

const config = {
...defaultConfig,
...(environment.production ? productionConfig : devConfig)
};

Complete Enums Index

Enum/ConfigLocationPurpose
Permissionsenums/permissions.jsUser access control
LoginTypeenums/loginType.jsAuthentication methods
CategoryTypeenums/categoryType.jsMonitoring categories
GraphTypeenums/graphType.jsChart types
DatePickerEnumenums/datePickerEnum.jsDate picker config
AnalyticEventsenums/analyticsEnum.jsEvent tracking
SubscriptionEnumenums/subscriptionEnum.jsSubscription states
LocalDBKeysenums/localDBKeys.jsStorage keys
authConfigconstants/authConfig.jsAuth configuration
constantsconstants/constants.jsGlobal constants
Urlsservices/api/urls.jsAPI endpoints

Next Steps


Last Updated: February 2026