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: LoginTypes (note the plural)
const LoginTypes = {
default: 'DEFAULT', // Username & Password
microsoft: 'MICROSOFT', // Microsoft SSO
google: 'GOOGLE', // Google OAuth
otp: 'OTP', // One-Time Password
};
Usage:
import { LoginTypes } from '@aquagen-mf-webapp/shared/enums';
const handleLogin = (type) => {
switch (type) {
case LoginTypes.microsoft:
handleMicrosoftLogin();
break;
case LoginTypes.google:
handleGoogleLogin();
break;
case LoginTypes.default:
handleDefaultLogin();
break;
}
};
Category Type Enum
Purpose: Define different water monitoring categories
Location: libs/shared/src/enums/categoryType.js
Exports: StandardCategoryType, StandardCategoryReportType, StandardCategoryTypeUppercase, StandardCategoryTypeToName, StockCategoryType (there is no CategoryType export)
const StandardCategoryType = {
SOURCE_CATEGORY: 'source_category',
STOCK_CATEGORY: 'stock_category',
QUALITY_CATEGORY: 'quality_category',
GROUND_WATER_LEVEL: 'ground_water_level',
ENERGY_CATEGORY: 'energy_category',
ID_RAIN_WATER: 'rain_water',
};
// Report-type codes used by the reports API
const StandardCategoryReportType = {
SOURCE_CATEGORY: 'water',
STOCK_CATEGORY: 'level',
QUALITY_CATEGORY: 'quality',
GROUND_WATER_LEVEL: 'borewell',
ENERGY_CATEGORY: 'energy',
ID_RAIN_WATER: 'rwi',
CONSOLIDATED: 'consolidated',
SUMMARY: 'summary',
ENERGY_CONSOLIDATED: 'energy_consolidated',
};
// Human-readable names
const StandardCategoryTypeToName = {
SOURCE_CATEGORY: 'Consumption',
STOCK_CATEGORY: 'Level',
QUALITY_CATEGORY: 'Quality',
GROUND_WATER_LEVEL: 'Ground Water',
ENERGY_CATEGORY: 'Energy',
};
StandardCategoryTypeUppercase also adds VIRTUAL_CATEGORY, and StockCategoryType
holds RAW/RECYCLED stock ids.
Usage:
import { StandardCategoryType } from '@aquagen-mf-webapp/shared/enums';
const navigateToCategory = (type, categoryId) => {
switch (type) {
case StandardCategoryType.SOURCE_CATEGORY:
navigate(`/monitoring/source_category/${categoryId}`);
break;
case StandardCategoryType.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
Exports: GraphType, GroundWaterGraphType, GraphTypeIntValue, GraphTypeDisplayName
GraphType is just the toggle between the two chart styles used across
monitoring — bar vs line:
const GraphType = {
BAR: 'bar',
LINE: 'line',
};
// Ground-water time windows (separate export)
const GroundWaterGraphType = {
today: 'today',
thisMonth: 'thisMonth',
past3Months: 'past3Months',
past6Months: 'past6Months',
thisYear: 'thisYear',
};
GraphTypeIntValue and GraphTypeDisplayName map those window keys to a month
count and a display label respectively.
Usage:
import { GraphType } from '@aquagen-mf-webapp/shared/enums';
const renderGraph = (type, data) =>
type === GraphType.BAR ? <BarGraph data={data} /> : <LineGraph data={data} />;
Date Picker Enum
Purpose: Define date picker types and modes
Location: libs/shared/src/enums/datePickerEnum.js
Export: DatepickerEnum (a single object with PickerType and DateTypeOptions)
const DatepickerEnum = {};
DatepickerEnum.PickerType = {
DAY: 'DAY',
WEEK: 'WEEK',
MONTH: 'MONTH',
MONTH_RANGE: 'MONTH_RANGE',
YEAR: 'YEAR',
CUSTOM: 'CUSTOM',
};
// Ready-made {id, label} options for the picker UI
DatepickerEnum.DateTypeOptions = [
{ id: DatepickerEnum.PickerType.DAY, label: 'Day' },
{ id: DatepickerEnum.PickerType.WEEK, label: 'Week' },
{ id: DatepickerEnum.PickerType.MONTH, label: 'Month' },
{ id: DatepickerEnum.PickerType.YEAR, label: 'Year' },
{ id: DatepickerEnum.PickerType.CUSTOM, label: 'Custom' },
];
Usage:
import { DatepickerEnum } from '@aquagen-mf-webapp/shared/enums';
const type = DatepickerEnum.PickerType.MONTH_RANGE;
const options = DatepickerEnum.DateTypeOptions;
Analytics Enum
Purpose: Define analytics event types
Location: libs/shared/src/enums/analyticsEnum.js
Export: AnalyticEvents — an object of 113 event-name constants. A few
real examples (see Analytics Events for the full catalog):
const AnalyticEvents = {
// Login
DEFAULT_LOGIN_CLICK: 'DEFAULT_LOGIN_CLICK',
GOOGLE_SSO_BUTTON_CLICK: 'GOOGLE_SSO_BUTTON_CLICK',
MICROSOFT_SSO_BUTTON_CLICK: 'MICROSOFT_SSO_BUTTON_CLICK',
OTP_LOGIN_CLICK: 'OTP_LOGIN_CLICK',
// Navigation
PAGE_VIEW: 'PAGE_VIEW',
// Feature
DASHBOARD_CARD_CLICK: 'DASHBOARD_CARD_CLICK',
ALERTS_DOWNLOAD: 'ALERTS_DOWNLOAD',
AQUAGPT_SEND: 'AQUAGPT_SEND',
// ...107 more
};
The file also exports AnalyticsServiceProviders, AllAnalyticsServiceProviders,
and AnalyticEventsCategory.
Usage:
import { AnalyticEvents } from '@aquagen-mf-webapp/shared/enums';
import { AnalyticsService } from '@aquagen-mf-webapp/shared/services';
// signature: sendEvent(event, props, pageView = false)
AnalyticsService.sendEvent(AnalyticEvents.GOOGLE_SSO_BUTTON_CLICK, { source: 'login' });
Subscription Enum
Purpose: Define subscription states and types
Location: libs/shared/src/enums/subscriptionEnum.js
Export: SubscriptionEnum (with Status and Messages)
const SubscriptionEnum = {};
SubscriptionEnum.Status = {
ACTIVE: 'active',
PRE: 'pre', // approaching expiry
POST: 'post', // grace period after expiry
EXPIRED: 'expired',
};
SubscriptionEnum.Messages = {
RENEWAL_SYNC_NOTICE: 'Recently renewed? Please allow 48 hours ...',
CONTACT_PHONE: '+91 6364855900',
CONTACT_EMAIL: 'sreeram@fluxgentech.com',
};
Usage:
import { SubscriptionEnum } from '@aquagen-mf-webapp/shared/enums';
if (subscriptionData.status === SubscriptionEnum.Status.EXPIRED) {
showSubscriptionExpiredDialog();
}
Local DB Keys
Purpose: Fixed key names for localStorage
LocalDBKeys is not in shared/enums. It's defined alongside the storage
service in libs/shared/src/services/localdb/localdb.js and imported from
@aquagen-mf-webapp/shared/services. There is no enums/localDBKeys.js file.
const LocalDBKeys = {
loginType: 'loginType',
loginResponse: 'loginResponse',
sessionLoginResponse: 'sessionLoginResponse',
showNewFeatures: 'showNewFeatures',
commonDate: 'commonDate',
commonDateType: 'commonDateType',
showHomePageNewFeaturePopup: 'showHomePageNewFeaturePopup',
rearrangedSubCategories: 'rearrangedSubCategories',
ssoReminderDismissedAt: 'ssoReminderDismissedAt',
deviceId: 'deviceId',
subscriptionDialogShownDate: 'subscriptionDialogShownDate',
subscriptionAlertDismissedDate: 'subscriptionAlertDismissedDate',
subscriptionProposalRequestedDate: 'subscriptionProposalRequestedDate',
announcementPopupDismissed: 'announcementPopupDismissed',
pendingIndustryId: 'pendingIndustryId',
};
Usage:
import { LocalDBInstance, LocalDBKeys } from '@aquagen-mf-webapp/shared/services';
LocalDBInstance.setItem(LocalDBKeys.loginResponse, JSON.stringify(data));
const loginData = LocalDBInstance.getItem(LocalDBKeys.loginResponse);
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
There are no environments/environment.* files. The environment is chosen at
runtime by a single flag in constants.js:
constants.currentEnv = constants.env.prod; // prod | dev | local | ngrok | demo
Urls (in services/api/urls.js) switches the API/WebSocket/AI base URLs off
that flag. To develop against a different backend, change currentEnv — see
Local environment & backend switching.
Theme Configuration
The Material-UI theme is defined per app, not in a shared file. Each app has its own:
apps/<app>/src/themes/CustomTheme.js // e.g. apps/production/src/themes/CustomTheme.js
built with MUI's createTheme. There is no libs/shared/src/theme/theme.js.
Read the relevant app's CustomTheme.js for its exact palette and typography.
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
| Export | Location | Purpose |
|---|---|---|
| Permissions | enums/permissions.js | User access control |
| LoginTypes | enums/loginType.js | Authentication methods |
| StandardCategoryType (+ related) | enums/categoryType.js | Monitoring categories |
| GraphType (+ related) | enums/graphType.js | Chart types (bar/line) |
| DatepickerEnum | enums/datePickerEnum.js | Date picker config |
| AnalyticEvents | enums/analyticsEnum.js | Event tracking |
| SubscriptionEnum | enums/subscriptionEnum.js | Subscription states |
| LocalDBKeys | services/localdb/localdb.js | Storage keys (from shared/services) |
| msalConfig / loginRequest / googleConfig | 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