@justair/justair-library 4.8.11 → 4.8.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/.github/workflows/publish.yml +28 -0
  2. package/README +146 -146
  3. package/package.json +27 -27
  4. package/src/config/db.js +116 -116
  5. package/src/config/logger.js +143 -143
  6. package/src/index.js +116 -116
  7. package/src/models/admin.js +27 -27
  8. package/src/models/alerts.js +219 -219
  9. package/src/models/announcements.js +31 -31
  10. package/src/models/apiKey.js +22 -22
  11. package/src/models/configurations.js +17 -17
  12. package/src/models/contexts.js +13 -13
  13. package/src/models/dataCompleteness.js +35 -35
  14. package/src/models/events.js +128 -128
  15. package/src/models/features.js +14 -14
  16. package/src/models/jobs.js +43 -43
  17. package/src/models/lightmonitors.js +30 -30
  18. package/src/models/measurements.js +263 -263
  19. package/src/models/monitorRequests.js +25 -25
  20. package/src/models/monitorSuppliers.js +49 -49
  21. package/src/models/monitors.js +394 -394
  22. package/src/models/networkMetrics.js +42 -42
  23. package/src/models/organizations.js +97 -97
  24. package/src/models/parameters.js +11 -11
  25. package/src/models/referenceMonitorInfo.js +18 -18
  26. package/src/models/tests/admin.test.js +42 -42
  27. package/src/models/tests/configurations.test.js +44 -44
  28. package/src/models/tests/measurements.test.js +46 -46
  29. package/src/models/tests/monitorRequests.test.js +46 -46
  30. package/src/models/tests/monitors.test.js +62 -62
  31. package/src/models/tests/organizations.test.js +51 -51
  32. package/src/models/tests/users.test.js +54 -54
  33. package/src/models/usageMetrics.js +28 -28
  34. package/src/models/users.js +55 -55
  35. package/tsconfig.json +10 -10
@@ -1,143 +1,143 @@
1
- import { createLogger, format, transports, config } from 'winston';
2
- const { combine, timestamp, json, errors, prettyPrint } = format;
3
-
4
- class CustomLogger {
5
- constructor({ DATADOG_API_KEY, APPLICATION_NAME }) {
6
- this.DATADOG_API_KEY = DATADOG_API_KEY;
7
- this.APPLICATION_NAME = APPLICATION_NAME;
8
- this.logger = this._createLogger();
9
- }
10
-
11
- _createLogger() {
12
- const httpTransportOptions = {
13
- host: 'http-intake.logs.us5.datadoghq.com',
14
- path: `/api/v2/logs?dd-api-key=${this.DATADOG_API_KEY}&ddsource=nodejs&service=${this.APPLICATION_NAME}`,
15
- ssl: true
16
- };
17
-
18
- return createLogger({
19
- levels: config.syslog.levels,
20
- exitOnError: false,
21
- format: combine(
22
- errors({ stack: true }),
23
- timestamp({
24
- format: 'YYYY-MM-DD HH:mm:ss'
25
- }),
26
- json(),
27
- prettyPrint()
28
- ),
29
- transports: [
30
- new transports.Console(),
31
- new transports.Http(httpTransportOptions),
32
- ],
33
- exceptionHandlers: [
34
- new transports.Console(),
35
- new transports.Http(httpTransportOptions)
36
- ]
37
- });
38
- }
39
-
40
- getLogger() {
41
- return this.logger;
42
- }
43
-
44
- _getServiceMetadata() {
45
- return {
46
- service: this.APPLICATION_NAME,
47
- env: process.env.NODE_ENV || 'production',
48
- version: process.env.K_REVISION || process.env.npm_package_version || 'unknown',
49
- k_service: process.env.K_SERVICE,
50
- k_revision: process.env.K_REVISION,
51
- k_configuration: process.env.K_CONFIGURATION,
52
- pod: process.env.HOSTNAME || process.env.POD_NAME,
53
- namespace: process.env.NAMESPACE,
54
- node: process.env.NODE_NAME,
55
- pid: process.pid,
56
- nodeVersion: process.version,
57
- platform: process.platform,
58
- timestamp: new Date().toISOString()
59
- };
60
- }
61
-
62
- logServiceStartup(metadata = {}) {
63
- this.logger.info('Service startup', {
64
- event: 'service.startup',
65
- ...this._getServiceMetadata(),
66
- ...metadata
67
- });
68
- }
69
-
70
- logGracefulShutdown(signal, metadata = {}) {
71
- this.logger.info('Graceful shutdown initiated', {
72
- event: 'service.shutdown.graceful',
73
- signal,
74
- ...this._getServiceMetadata(),
75
- ...metadata
76
- });
77
- }
78
-
79
- logCrash(error, source, metadata = {}) {
80
- this.logger.error('Service crash detected', {
81
- event: 'service.crash',
82
- source,
83
- error: {
84
- message: error.message,
85
- stack: error.stack,
86
- name: error.name
87
- },
88
- ...this._getServiceMetadata(),
89
- ...metadata
90
- });
91
- }
92
-
93
- logExit(code, metadata = {}) {
94
- this.logger.info('Service exit', {
95
- event: 'service.exit',
96
- exitCode: code,
97
- ...this._getServiceMetadata(),
98
- ...metadata
99
- });
100
- }
101
-
102
- setupLifecycleHooks() {
103
- // Startup
104
- this.logServiceStartup();
105
-
106
- // Graceful shutdown signals
107
- const shutdownHandler = (signal) => {
108
- this.logGracefulShutdown(signal);
109
- // Allow logs to flush before exiting
110
- setTimeout(() => process.exit(0), 1000);
111
- };
112
-
113
- process.on('SIGTERM', () => shutdownHandler('SIGTERM'));
114
- process.on('SIGINT', () => shutdownHandler('SIGINT'));
115
-
116
- // Crash handlers
117
- process.on('uncaughtException', (error) => {
118
- this.logCrash(error, 'uncaughtException');
119
- // Allow logs to flush before exiting
120
- setTimeout(() => process.exit(1), 1000);
121
- });
122
-
123
- process.on('unhandledRejection', (reason, promise) => {
124
- const error = reason instanceof Error ? reason : new Error(String(reason));
125
- this.logCrash(error, 'unhandledRejection', { promise: String(promise) });
126
- });
127
-
128
- // Exit events
129
- process.on('beforeExit', (code) => {
130
- this.logger.info('Before exit', {
131
- event: 'service.beforeExit',
132
- exitCode: code,
133
- ...this._getServiceMetadata()
134
- });
135
- });
136
-
137
- process.on('exit', (code) => {
138
- this.logExit(code);
139
- });
140
- }
141
- }
142
-
143
- export default CustomLogger;
1
+ import { createLogger, format, transports, config } from 'winston';
2
+ const { combine, timestamp, json, errors, prettyPrint } = format;
3
+
4
+ class CustomLogger {
5
+ constructor({ DATADOG_API_KEY, APPLICATION_NAME }) {
6
+ this.DATADOG_API_KEY = DATADOG_API_KEY;
7
+ this.APPLICATION_NAME = APPLICATION_NAME;
8
+ this.logger = this._createLogger();
9
+ }
10
+
11
+ _createLogger() {
12
+ const httpTransportOptions = {
13
+ host: 'http-intake.logs.us5.datadoghq.com',
14
+ path: `/api/v2/logs?dd-api-key=${this.DATADOG_API_KEY}&ddsource=nodejs&service=${this.APPLICATION_NAME}`,
15
+ ssl: true
16
+ };
17
+
18
+ return createLogger({
19
+ levels: config.syslog.levels,
20
+ exitOnError: false,
21
+ format: combine(
22
+ errors({ stack: true }),
23
+ timestamp({
24
+ format: 'YYYY-MM-DD HH:mm:ss'
25
+ }),
26
+ json(),
27
+ prettyPrint()
28
+ ),
29
+ transports: [
30
+ new transports.Console(),
31
+ new transports.Http(httpTransportOptions),
32
+ ],
33
+ exceptionHandlers: [
34
+ new transports.Console(),
35
+ new transports.Http(httpTransportOptions)
36
+ ]
37
+ });
38
+ }
39
+
40
+ getLogger() {
41
+ return this.logger;
42
+ }
43
+
44
+ _getServiceMetadata() {
45
+ return {
46
+ service: this.APPLICATION_NAME,
47
+ env: process.env.NODE_ENV || 'production',
48
+ version: process.env.K_REVISION || process.env.npm_package_version || 'unknown',
49
+ k_service: process.env.K_SERVICE,
50
+ k_revision: process.env.K_REVISION,
51
+ k_configuration: process.env.K_CONFIGURATION,
52
+ pod: process.env.HOSTNAME || process.env.POD_NAME,
53
+ namespace: process.env.NAMESPACE,
54
+ node: process.env.NODE_NAME,
55
+ pid: process.pid,
56
+ nodeVersion: process.version,
57
+ platform: process.platform,
58
+ timestamp: new Date().toISOString()
59
+ };
60
+ }
61
+
62
+ logServiceStartup(metadata = {}) {
63
+ this.logger.info('Service startup', {
64
+ event: 'service.startup',
65
+ ...this._getServiceMetadata(),
66
+ ...metadata
67
+ });
68
+ }
69
+
70
+ logGracefulShutdown(signal, metadata = {}) {
71
+ this.logger.info('Graceful shutdown initiated', {
72
+ event: 'service.shutdown.graceful',
73
+ signal,
74
+ ...this._getServiceMetadata(),
75
+ ...metadata
76
+ });
77
+ }
78
+
79
+ logCrash(error, source, metadata = {}) {
80
+ this.logger.error('Service crash detected', {
81
+ event: 'service.crash',
82
+ source,
83
+ error: {
84
+ message: error.message,
85
+ stack: error.stack,
86
+ name: error.name
87
+ },
88
+ ...this._getServiceMetadata(),
89
+ ...metadata
90
+ });
91
+ }
92
+
93
+ logExit(code, metadata = {}) {
94
+ this.logger.info('Service exit', {
95
+ event: 'service.exit',
96
+ exitCode: code,
97
+ ...this._getServiceMetadata(),
98
+ ...metadata
99
+ });
100
+ }
101
+
102
+ setupLifecycleHooks() {
103
+ // Startup
104
+ this.logServiceStartup();
105
+
106
+ // Graceful shutdown signals
107
+ const shutdownHandler = (signal) => {
108
+ this.logGracefulShutdown(signal);
109
+ // Allow logs to flush before exiting
110
+ setTimeout(() => process.exit(0), 1000);
111
+ };
112
+
113
+ process.on('SIGTERM', () => shutdownHandler('SIGTERM'));
114
+ process.on('SIGINT', () => shutdownHandler('SIGINT'));
115
+
116
+ // Crash handlers
117
+ process.on('uncaughtException', (error) => {
118
+ this.logCrash(error, 'uncaughtException');
119
+ // Allow logs to flush before exiting
120
+ setTimeout(() => process.exit(1), 1000);
121
+ });
122
+
123
+ process.on('unhandledRejection', (reason, promise) => {
124
+ const error = reason instanceof Error ? reason : new Error(String(reason));
125
+ this.logCrash(error, 'unhandledRejection', { promise: String(promise) });
126
+ });
127
+
128
+ // Exit events
129
+ process.on('beforeExit', (code) => {
130
+ this.logger.info('Before exit', {
131
+ event: 'service.beforeExit',
132
+ exitCode: code,
133
+ ...this._getServiceMetadata()
134
+ });
135
+ });
136
+
137
+ process.on('exit', (code) => {
138
+ this.logExit(code);
139
+ });
140
+ }
141
+ }
142
+
143
+ export default CustomLogger;
package/src/index.js CHANGED
@@ -1,116 +1,116 @@
1
- import { adminSchema, Admin } from "./models/admin.js";
2
- import {
3
- configurationsSchema,
4
- Configurations,
5
- } from "./models/configurations.js";
6
- import {
7
- measurementsSchema,
8
- Measurements,
9
- Audit,
10
- auditSchema,
11
- } from "./models/measurements.js";
12
- import {
13
- monitorRequestsSchema,
14
- MonitorRequests,
15
- } from "./models/monitorRequests.js";
16
- import {
17
- monitorsSchema,
18
- Monitors,
19
- monitorAuditSchema,
20
- MonitorAudit,
21
- } from "./models/monitors.js";
22
- import { organizationsSchema, Organizations } from "./models/organizations.js";
23
- import {
24
- referenceMonitorInfoSchema,
25
- ReferenceMonitorInfo,
26
- } from "./models/referenceMonitorInfo.js";
27
- import { lightMonitorSchema, LightMonitors } from "./models/lightmonitors.js";
28
- import {
29
- monitorSuppliersSchema,
30
- MonitorSuppliers,
31
- } from "./models/monitorSuppliers.js";
32
- import { contextsSchema, Contexts } from "./models/contexts.js";
33
- import { parametersSchema, Parameters } from "./models/parameters.js";
34
- import { usersSchema, Users } from "./models/users.js";
35
- import {
36
- eventsSchema,
37
- Events,
38
- eventsAuditSchema,
39
- EventsAudit,
40
- } from "./models/events.js";
41
- import { announcementSchema, Announcements } from "./models/announcements.js";
42
- import { jobsSchema, Jobs } from "./models/jobs.js";
43
- import { apiKeySchema, ApiKey } from "./models/apiKey.js";
44
- import { UsageMetrics, usageMetricsSchema } from "./models/usageMetrics.js";
45
- import {
46
- AlertsAudit,
47
- Alerts,
48
- alertsSchema,
49
- alertsAuditSchema,
50
- } from "./models/alerts.js";
51
- import { Features, featuresSchema } from "./models/features.js";
52
- import {
53
- DataCompleteness,
54
- dataCompletenessSchema,
55
- } from "./models/dataCompleteness.js";
56
- import { NetworkMetrics, networkMetricsSchema } from "./models/networkMetrics.js";
57
- import Database from "./config/db.js"; // Import the new Database class
58
- import CustomLogger from "./config/logger.js";
59
-
60
- export function createLoggerInstance({ DATADOG_API_KEY, APPLICATION_NAME }) {
61
- return new CustomLogger({ DATADOG_API_KEY, APPLICATION_NAME });
62
- }
63
-
64
- export {
65
- Database, // Export the Database class
66
- adminSchema,
67
- Admin,
68
- configurationsSchema,
69
- Configurations,
70
- measurementsSchema,
71
- Measurements,
72
- monitorRequestsSchema,
73
- MonitorRequests,
74
- monitorsSchema,
75
- Monitors,
76
- organizationsSchema,
77
- Organizations,
78
- referenceMonitorInfoSchema,
79
- ReferenceMonitorInfo,
80
- usersSchema,
81
- Users,
82
- eventsSchema,
83
- Events,
84
- lightMonitorSchema,
85
- LightMonitors,
86
- monitorSuppliersSchema,
87
- MonitorSuppliers,
88
- contextsSchema,
89
- Contexts,
90
- parametersSchema,
91
- Parameters,
92
- announcementSchema,
93
- Announcements,
94
- jobsSchema,
95
- Jobs,
96
- apiKeySchema,
97
- ApiKey,
98
- UsageMetrics,
99
- usageMetricsSchema,
100
- Audit,
101
- auditSchema,
102
- EventsAudit,
103
- eventsAuditSchema,
104
- MonitorAudit,
105
- monitorAuditSchema,
106
- AlertsAudit,
107
- Alerts,
108
- alertsSchema,
109
- alertsAuditSchema,
110
- Features,
111
- featuresSchema,
112
- dataCompletenessSchema,
113
- DataCompleteness,
114
- networkMetricsSchema,
115
- NetworkMetrics,
116
- };
1
+ import { adminSchema, Admin } from "./models/admin.js";
2
+ import {
3
+ configurationsSchema,
4
+ Configurations,
5
+ } from "./models/configurations.js";
6
+ import {
7
+ measurementsSchema,
8
+ Measurements,
9
+ Audit,
10
+ auditSchema,
11
+ } from "./models/measurements.js";
12
+ import {
13
+ monitorRequestsSchema,
14
+ MonitorRequests,
15
+ } from "./models/monitorRequests.js";
16
+ import {
17
+ monitorsSchema,
18
+ Monitors,
19
+ monitorAuditSchema,
20
+ MonitorAudit,
21
+ } from "./models/monitors.js";
22
+ import { organizationsSchema, Organizations } from "./models/organizations.js";
23
+ import {
24
+ referenceMonitorInfoSchema,
25
+ ReferenceMonitorInfo,
26
+ } from "./models/referenceMonitorInfo.js";
27
+ import { lightMonitorSchema, LightMonitors } from "./models/lightmonitors.js";
28
+ import {
29
+ monitorSuppliersSchema,
30
+ MonitorSuppliers,
31
+ } from "./models/monitorSuppliers.js";
32
+ import { contextsSchema, Contexts } from "./models/contexts.js";
33
+ import { parametersSchema, Parameters } from "./models/parameters.js";
34
+ import { usersSchema, Users } from "./models/users.js";
35
+ import {
36
+ eventsSchema,
37
+ Events,
38
+ eventsAuditSchema,
39
+ EventsAudit,
40
+ } from "./models/events.js";
41
+ import { announcementSchema, Announcements } from "./models/announcements.js";
42
+ import { jobsSchema, Jobs } from "./models/jobs.js";
43
+ import { apiKeySchema, ApiKey } from "./models/apiKey.js";
44
+ import { UsageMetrics, usageMetricsSchema } from "./models/usageMetrics.js";
45
+ import {
46
+ AlertsAudit,
47
+ Alerts,
48
+ alertsSchema,
49
+ alertsAuditSchema,
50
+ } from "./models/alerts.js";
51
+ import { Features, featuresSchema } from "./models/features.js";
52
+ import {
53
+ DataCompleteness,
54
+ dataCompletenessSchema,
55
+ } from "./models/dataCompleteness.js";
56
+ import { NetworkMetrics, networkMetricsSchema } from "./models/networkMetrics.js";
57
+ import Database from "./config/db.js"; // Import the new Database class
58
+ import CustomLogger from "./config/logger.js";
59
+
60
+ export function createLoggerInstance({ DATADOG_API_KEY, APPLICATION_NAME }) {
61
+ return new CustomLogger({ DATADOG_API_KEY, APPLICATION_NAME });
62
+ }
63
+
64
+ export {
65
+ Database, // Export the Database class
66
+ adminSchema,
67
+ Admin,
68
+ configurationsSchema,
69
+ Configurations,
70
+ measurementsSchema,
71
+ Measurements,
72
+ monitorRequestsSchema,
73
+ MonitorRequests,
74
+ monitorsSchema,
75
+ Monitors,
76
+ organizationsSchema,
77
+ Organizations,
78
+ referenceMonitorInfoSchema,
79
+ ReferenceMonitorInfo,
80
+ usersSchema,
81
+ Users,
82
+ eventsSchema,
83
+ Events,
84
+ lightMonitorSchema,
85
+ LightMonitors,
86
+ monitorSuppliersSchema,
87
+ MonitorSuppliers,
88
+ contextsSchema,
89
+ Contexts,
90
+ parametersSchema,
91
+ Parameters,
92
+ announcementSchema,
93
+ Announcements,
94
+ jobsSchema,
95
+ Jobs,
96
+ apiKeySchema,
97
+ ApiKey,
98
+ UsageMetrics,
99
+ usageMetricsSchema,
100
+ Audit,
101
+ auditSchema,
102
+ EventsAudit,
103
+ eventsAuditSchema,
104
+ MonitorAudit,
105
+ monitorAuditSchema,
106
+ AlertsAudit,
107
+ Alerts,
108
+ alertsSchema,
109
+ alertsAuditSchema,
110
+ Features,
111
+ featuresSchema,
112
+ dataCompletenessSchema,
113
+ DataCompleteness,
114
+ networkMetricsSchema,
115
+ NetworkMetrics,
116
+ };
@@ -1,28 +1,28 @@
1
- import mongoose from 'mongoose';
2
-
3
- const adminSchema = mongoose.Schema({
4
- name: String,
5
- phone: String,
6
- email: String,
7
- password: String,
8
- orgId: { type: mongoose.Types.ObjectId, ref: 'Organizations' },
9
- permissionName: {type: String, enum: ['Super Admin', 'Admin', 'Member', 'Partner']},
10
- permissions: [{type: String, enum: ['create', 'read', 'update', 'delete', 'communicate']}],
11
- authorized: { type: Boolean, default: false },
12
- isActive: { type: Boolean, default: false },
13
- },
14
- {
15
- timestamps: true
16
- });
17
-
18
- // Organization-based admin queries
19
- adminSchema.index({ orgId: 1, isActive: 1 });
20
- // Email-based login with active status (case-insensitive handled in app)
21
- adminSchema.index({ email: 1, isActive: 1 });
22
- // Permission-based queries
23
- adminSchema.index({ orgId: 1, permissionName: 1 });
24
-
25
-
26
- const Admin = mongoose.model('Admin', adminSchema);
27
-
1
+ import mongoose from 'mongoose';
2
+
3
+ const adminSchema = mongoose.Schema({
4
+ name: String,
5
+ phone: String,
6
+ email: String,
7
+ password: String,
8
+ orgId: { type: mongoose.Types.ObjectId, ref: 'Organizations' },
9
+ permissionName: {type: String, enum: ['Super Admin', 'Admin', 'Member', 'Partner']},
10
+ permissions: [{type: String, enum: ['create', 'read', 'update', 'delete', 'communicate']}],
11
+ authorized: { type: Boolean, default: false },
12
+ isActive: { type: Boolean, default: false },
13
+ },
14
+ {
15
+ timestamps: true
16
+ });
17
+
18
+ // Organization-based admin queries
19
+ adminSchema.index({ orgId: 1, isActive: 1 });
20
+ // Email-based login with active status (case-insensitive handled in app)
21
+ adminSchema.index({ email: 1, isActive: 1 });
22
+ // Permission-based queries
23
+ adminSchema.index({ orgId: 1, permissionName: 1 });
24
+
25
+
26
+ const Admin = mongoose.model('Admin', adminSchema);
27
+
28
28
  export {adminSchema, Admin};