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) {
// ...
}
2. Group Related Constants
// 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/Config | Location | Purpose |
|---|---|---|
| Permissions | enums/permissions.js | User access control |
| LoginType | enums/loginType.js | Authentication methods |
| CategoryType | enums/categoryType.js | Monitoring categories |
| GraphType | enums/graphType.js | Chart types |
| DatePickerEnum | enums/datePickerEnum.js | Date picker config |
| AnalyticEvents | enums/analyticsEnum.js | Event tracking |
| SubscriptionEnum | enums/subscriptionEnum.js | Subscription states |
| LocalDBKeys | enums/localDBKeys.js | Storage keys |
| authConfig | constants/authConfig.js | Auth configuration |
| constants | constants/constants.js | Global constants |
| Urls | services/api/urls.js | API endpoints |
Next Steps
- Review API & Services for using these configs in API calls
- Check Permissions for permission enum usage
- See Authentication for auth config usage
Last Updated: February 2026