@flusys/nestjs-event-manager 3.0.1
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.
- package/README.md +1328 -0
- package/adapters/event-manager.adapter.d.ts +12 -0
- package/adapters/index.d.ts +1 -0
- package/cjs/adapters/event-manager.adapter.js +71 -0
- package/cjs/adapters/index.js +18 -0
- package/cjs/config/event-manager.constants.js +13 -0
- package/cjs/config/index.js +18 -0
- package/cjs/controllers/event-participant.controller.js +271 -0
- package/cjs/controllers/event.controller.js +229 -0
- package/cjs/controllers/index.js +19 -0
- package/cjs/docs/event-manager-swagger.config.js +135 -0
- package/cjs/docs/index.js +24 -0
- package/cjs/dtos/calendar-query.dto.js +186 -0
- package/cjs/dtos/event-participant.dto.js +226 -0
- package/cjs/dtos/event.dto.js +291 -0
- package/cjs/dtos/index.js +20 -0
- package/cjs/entities/event-participant.entity.js +96 -0
- package/cjs/entities/event-with-company.entity.js +56 -0
- package/cjs/entities/event.entity.js +143 -0
- package/cjs/entities/index.js +55 -0
- package/cjs/index.js +27 -0
- package/cjs/interfaces/event-manager-module.interface.js +4 -0
- package/cjs/interfaces/event.interface.js +4 -0
- package/cjs/interfaces/index.js +19 -0
- package/cjs/modules/event-manager.module.js +133 -0
- package/cjs/modules/index.js +18 -0
- package/cjs/services/event-manager-config.service.js +76 -0
- package/cjs/services/event-manager-datasource.provider.js +181 -0
- package/cjs/services/event-manager-helper.service.js +253 -0
- package/cjs/services/event-participant.service.js +164 -0
- package/cjs/services/event.service.js +421 -0
- package/cjs/services/index.js +22 -0
- package/config/event-manager.constants.d.ts +1 -0
- package/config/index.d.ts +1 -0
- package/controllers/event-participant.controller.d.ts +31 -0
- package/controllers/event.controller.d.ts +24 -0
- package/controllers/index.d.ts +2 -0
- package/docs/event-manager-swagger.config.d.ts +3 -0
- package/docs/index.d.ts +2 -0
- package/dtos/calendar-query.dto.d.ts +23 -0
- package/dtos/event-participant.dto.d.ts +31 -0
- package/dtos/event.dto.d.ts +37 -0
- package/dtos/index.d.ts +3 -0
- package/entities/event-participant.entity.d.ts +8 -0
- package/entities/event-with-company.entity.d.ts +4 -0
- package/entities/event.entity.d.ts +14 -0
- package/entities/index.d.ts +11 -0
- package/fesm/adapters/event-manager.adapter.js +61 -0
- package/fesm/adapters/index.js +1 -0
- package/fesm/config/event-manager.constants.js +3 -0
- package/fesm/config/index.js +1 -0
- package/fesm/controllers/event-participant.controller.js +261 -0
- package/fesm/controllers/event.controller.js +219 -0
- package/fesm/controllers/index.js +2 -0
- package/fesm/docs/event-manager-swagger.config.js +128 -0
- package/fesm/docs/index.js +4 -0
- package/fesm/dtos/calendar-query.dto.js +168 -0
- package/fesm/dtos/event-participant.dto.js +199 -0
- package/fesm/dtos/event.dto.js +270 -0
- package/fesm/dtos/index.js +3 -0
- package/fesm/entities/event-participant.entity.js +86 -0
- package/fesm/entities/event-with-company.entity.js +46 -0
- package/fesm/entities/event.entity.js +133 -0
- package/fesm/entities/index.js +24 -0
- package/fesm/index.js +10 -0
- package/fesm/interfaces/event-manager-module.interface.js +3 -0
- package/fesm/interfaces/event.interface.js +1 -0
- package/fesm/interfaces/index.js +2 -0
- package/fesm/modules/event-manager.module.js +123 -0
- package/fesm/modules/index.js +1 -0
- package/fesm/services/event-manager-config.service.js +66 -0
- package/fesm/services/event-manager-datasource.provider.js +130 -0
- package/fesm/services/event-manager-helper.service.js +243 -0
- package/fesm/services/event-participant.service.js +154 -0
- package/fesm/services/event.service.js +411 -0
- package/fesm/services/index.js +5 -0
- package/index.d.ts +9 -0
- package/interfaces/event-manager-module.interface.d.ts +20 -0
- package/interfaces/event.interface.d.ts +28 -0
- package/interfaces/index.d.ts +2 -0
- package/modules/event-manager.module.d.ts +8 -0
- package/modules/index.d.ts +1 -0
- package/package.json +89 -0
- package/services/event-manager-config.service.d.ts +13 -0
- package/services/event-manager-datasource.provider.d.ts +23 -0
- package/services/event-manager-helper.service.d.ts +27 -0
- package/services/event-participant.service.d.ts +27 -0
- package/services/event.service.d.ts +49 -0
- package/services/index.d.ts +5 -0
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
function _define_property(obj, key, value) {
|
|
2
|
+
if (key in obj) {
|
|
3
|
+
Object.defineProperty(obj, key, {
|
|
4
|
+
value: value,
|
|
5
|
+
enumerable: true,
|
|
6
|
+
configurable: true,
|
|
7
|
+
writable: true
|
|
8
|
+
});
|
|
9
|
+
} else {
|
|
10
|
+
obj[key] = value;
|
|
11
|
+
}
|
|
12
|
+
return obj;
|
|
13
|
+
}
|
|
14
|
+
function _ts_decorate(decorators, target, key, desc) {
|
|
15
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
16
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
17
|
+
else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
18
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
19
|
+
}
|
|
20
|
+
function _ts_metadata(k, v) {
|
|
21
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
22
|
+
}
|
|
23
|
+
import { RecurrenceType } from '@flusys/nestjs-shared/enums';
|
|
24
|
+
import { Identity } from '@flusys/nestjs-shared/entities';
|
|
25
|
+
import { Column, Entity, Index } from 'typeorm';
|
|
26
|
+
export class Event extends Identity {
|
|
27
|
+
constructor(...args){
|
|
28
|
+
super(...args), _define_property(this, "title", void 0), _define_property(this, "description", void 0), _define_property(this, "meetingLink", void 0), _define_property(this, "startDateTime", void 0), _define_property(this, "endDateTime", void 0), _define_property(this, "isAllDay", void 0), _define_property(this, "recurrenceType", void 0), _define_property(this, "recurrenceEndDate", void 0), _define_property(this, "color", void 0), _define_property(this, "isActive", void 0), _define_property(this, "metadata", void 0);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
_ts_decorate([
|
|
32
|
+
Column({
|
|
33
|
+
type: 'varchar',
|
|
34
|
+
length: 255,
|
|
35
|
+
nullable: false
|
|
36
|
+
}),
|
|
37
|
+
_ts_metadata("design:type", String)
|
|
38
|
+
], Event.prototype, "title", void 0);
|
|
39
|
+
_ts_decorate([
|
|
40
|
+
Column({
|
|
41
|
+
type: 'text',
|
|
42
|
+
nullable: true
|
|
43
|
+
}),
|
|
44
|
+
_ts_metadata("design:type", Object)
|
|
45
|
+
], Event.prototype, "description", void 0);
|
|
46
|
+
_ts_decorate([
|
|
47
|
+
Column({
|
|
48
|
+
type: 'varchar',
|
|
49
|
+
length: 500,
|
|
50
|
+
nullable: true
|
|
51
|
+
}),
|
|
52
|
+
_ts_metadata("design:type", Object)
|
|
53
|
+
], Event.prototype, "meetingLink", void 0);
|
|
54
|
+
_ts_decorate([
|
|
55
|
+
Column({
|
|
56
|
+
name: 'start_date_time',
|
|
57
|
+
type: 'timestamp',
|
|
58
|
+
nullable: false
|
|
59
|
+
}),
|
|
60
|
+
_ts_metadata("design:type", typeof Date === "undefined" ? Object : Date)
|
|
61
|
+
], Event.prototype, "startDateTime", void 0);
|
|
62
|
+
_ts_decorate([
|
|
63
|
+
Column({
|
|
64
|
+
name: 'end_date_time',
|
|
65
|
+
type: 'timestamp',
|
|
66
|
+
nullable: false
|
|
67
|
+
}),
|
|
68
|
+
_ts_metadata("design:type", typeof Date === "undefined" ? Object : Date)
|
|
69
|
+
], Event.prototype, "endDateTime", void 0);
|
|
70
|
+
_ts_decorate([
|
|
71
|
+
Column({
|
|
72
|
+
name: 'is_all_day',
|
|
73
|
+
type: 'boolean',
|
|
74
|
+
nullable: false,
|
|
75
|
+
default: false
|
|
76
|
+
}),
|
|
77
|
+
_ts_metadata("design:type", Boolean)
|
|
78
|
+
], Event.prototype, "isAllDay", void 0);
|
|
79
|
+
_ts_decorate([
|
|
80
|
+
Column({
|
|
81
|
+
name: 'recurrence_type',
|
|
82
|
+
type: 'varchar',
|
|
83
|
+
length: 20,
|
|
84
|
+
nullable: false,
|
|
85
|
+
default: RecurrenceType.NONE
|
|
86
|
+
}),
|
|
87
|
+
_ts_metadata("design:type", String)
|
|
88
|
+
], Event.prototype, "recurrenceType", void 0);
|
|
89
|
+
_ts_decorate([
|
|
90
|
+
Column({
|
|
91
|
+
name: 'recurrence_end_date',
|
|
92
|
+
type: 'timestamp',
|
|
93
|
+
nullable: true
|
|
94
|
+
}),
|
|
95
|
+
_ts_metadata("design:type", Object)
|
|
96
|
+
], Event.prototype, "recurrenceEndDate", void 0);
|
|
97
|
+
_ts_decorate([
|
|
98
|
+
Column({
|
|
99
|
+
type: 'varchar',
|
|
100
|
+
length: 7,
|
|
101
|
+
nullable: false,
|
|
102
|
+
default: '#3B82F6'
|
|
103
|
+
}),
|
|
104
|
+
_ts_metadata("design:type", String)
|
|
105
|
+
], Event.prototype, "color", void 0);
|
|
106
|
+
_ts_decorate([
|
|
107
|
+
Column({
|
|
108
|
+
name: 'is_active',
|
|
109
|
+
type: 'boolean',
|
|
110
|
+
nullable: false,
|
|
111
|
+
default: true
|
|
112
|
+
}),
|
|
113
|
+
_ts_metadata("design:type", Boolean)
|
|
114
|
+
], Event.prototype, "isActive", void 0);
|
|
115
|
+
_ts_decorate([
|
|
116
|
+
Column({
|
|
117
|
+
type: 'simple-json',
|
|
118
|
+
nullable: true
|
|
119
|
+
}),
|
|
120
|
+
_ts_metadata("design:type", Object)
|
|
121
|
+
], Event.prototype, "metadata", void 0);
|
|
122
|
+
Event = _ts_decorate([
|
|
123
|
+
Entity({
|
|
124
|
+
name: 'event'
|
|
125
|
+
}),
|
|
126
|
+
Index([
|
|
127
|
+
'startDateTime',
|
|
128
|
+
'endDateTime'
|
|
129
|
+
]),
|
|
130
|
+
Index([
|
|
131
|
+
'isActive'
|
|
132
|
+
])
|
|
133
|
+
], Event);
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// Entities without company feature
|
|
2
|
+
export * from './event.entity';
|
|
3
|
+
export * from './event-participant.entity';
|
|
4
|
+
// Entities with company feature
|
|
5
|
+
export * from './event-with-company.entity';
|
|
6
|
+
import { Event } from './event.entity';
|
|
7
|
+
import { EventParticipant } from './event-participant.entity';
|
|
8
|
+
import { EventWithCompany } from './event-with-company.entity';
|
|
9
|
+
// Core entities (no company feature)
|
|
10
|
+
export const EventManagerCoreEntities = [
|
|
11
|
+
Event,
|
|
12
|
+
EventParticipant
|
|
13
|
+
];
|
|
14
|
+
// Company-specific entities (EventParticipant is event-scoped, not company-scoped)
|
|
15
|
+
export const EventManagerCompanyEntities = [
|
|
16
|
+
EventWithCompany,
|
|
17
|
+
EventParticipant
|
|
18
|
+
];
|
|
19
|
+
export function getEventManagerEntitiesByConfig(enableCompanyFeature) {
|
|
20
|
+
return enableCompanyFeature ? EventManagerCompanyEntities : EventManagerCoreEntities;
|
|
21
|
+
}
|
|
22
|
+
// Base type aliases for backwards compatibility with services
|
|
23
|
+
export { Event as EventBase } from './event.entity';
|
|
24
|
+
export { EventParticipant as EventParticipantBase } from './event-participant.entity';
|
package/fesm/index.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// Export all event manager module components
|
|
2
|
+
export * from './adapters';
|
|
3
|
+
export * from './controllers';
|
|
4
|
+
export * from './services';
|
|
5
|
+
export * from './entities';
|
|
6
|
+
export * from './modules';
|
|
7
|
+
export * from './config';
|
|
8
|
+
export * from './docs';
|
|
9
|
+
export * from './dtos';
|
|
10
|
+
export * from './interfaces';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { };
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
function _ts_decorate(decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
}
|
|
7
|
+
import { CacheModule, UtilsModule } from '@flusys/nestjs-shared/modules';
|
|
8
|
+
import { EVENT_MANAGER_ADAPTER } from '@flusys/nestjs-shared/interfaces';
|
|
9
|
+
import { Module } from '@nestjs/common';
|
|
10
|
+
import { EVENT_MANAGER_MODULE_OPTIONS } from '../config/event-manager.constants';
|
|
11
|
+
import { EventController, EventParticipantController } from '../controllers';
|
|
12
|
+
import { EventManagerAdapter } from '../adapters';
|
|
13
|
+
import { EventManagerConfigService, EventManagerDataSourceProvider, EventManagerHelperService, EventParticipantService, EventService } from '../services';
|
|
14
|
+
const CONTROLLERS = [
|
|
15
|
+
EventController,
|
|
16
|
+
EventParticipantController
|
|
17
|
+
];
|
|
18
|
+
const EXPORTED_SERVICES = [
|
|
19
|
+
EventManagerConfigService,
|
|
20
|
+
EventManagerDataSourceProvider,
|
|
21
|
+
EventManagerHelperService,
|
|
22
|
+
EventService,
|
|
23
|
+
EventParticipantService
|
|
24
|
+
];
|
|
25
|
+
const ADAPTER_PROVIDER = {
|
|
26
|
+
provide: EVENT_MANAGER_ADAPTER,
|
|
27
|
+
useClass: EventManagerAdapter
|
|
28
|
+
};
|
|
29
|
+
export class EventManagerModule {
|
|
30
|
+
static forRoot(options) {
|
|
31
|
+
return {
|
|
32
|
+
module: EventManagerModule,
|
|
33
|
+
global: options.global ?? false,
|
|
34
|
+
imports: [
|
|
35
|
+
CacheModule,
|
|
36
|
+
UtilsModule
|
|
37
|
+
],
|
|
38
|
+
controllers: options.includeController !== false ? CONTROLLERS : [],
|
|
39
|
+
providers: [
|
|
40
|
+
...this.buildProviders(options),
|
|
41
|
+
EventManagerAdapter,
|
|
42
|
+
ADAPTER_PROVIDER
|
|
43
|
+
],
|
|
44
|
+
exports: [
|
|
45
|
+
...EXPORTED_SERVICES,
|
|
46
|
+
EVENT_MANAGER_ADAPTER
|
|
47
|
+
]
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
static forRootAsync(options) {
|
|
51
|
+
return {
|
|
52
|
+
module: EventManagerModule,
|
|
53
|
+
global: options.global ?? false,
|
|
54
|
+
imports: [
|
|
55
|
+
...options.imports || [],
|
|
56
|
+
CacheModule,
|
|
57
|
+
UtilsModule
|
|
58
|
+
],
|
|
59
|
+
controllers: options.includeController !== false ? CONTROLLERS : [],
|
|
60
|
+
providers: [
|
|
61
|
+
...this.createAsyncProviders(options),
|
|
62
|
+
...this.buildProviders(),
|
|
63
|
+
EventManagerAdapter,
|
|
64
|
+
ADAPTER_PROVIDER
|
|
65
|
+
],
|
|
66
|
+
exports: [
|
|
67
|
+
...EXPORTED_SERVICES,
|
|
68
|
+
EVENT_MANAGER_ADAPTER
|
|
69
|
+
]
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
// Private Helpers
|
|
73
|
+
static buildProviders(options) {
|
|
74
|
+
const providers = [
|
|
75
|
+
...EXPORTED_SERVICES
|
|
76
|
+
];
|
|
77
|
+
if (options) {
|
|
78
|
+
providers.unshift({
|
|
79
|
+
provide: EVENT_MANAGER_MODULE_OPTIONS,
|
|
80
|
+
useValue: options
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
return providers;
|
|
84
|
+
}
|
|
85
|
+
static createAsyncProviders(options) {
|
|
86
|
+
if (options.useFactory) {
|
|
87
|
+
return [
|
|
88
|
+
{
|
|
89
|
+
provide: EVENT_MANAGER_MODULE_OPTIONS,
|
|
90
|
+
useFactory: async (...args)=>({
|
|
91
|
+
...options,
|
|
92
|
+
config: await options.useFactory(...args)
|
|
93
|
+
}),
|
|
94
|
+
inject: options.inject || []
|
|
95
|
+
}
|
|
96
|
+
];
|
|
97
|
+
}
|
|
98
|
+
const factoryClass = options.useClass || options.useExisting;
|
|
99
|
+
if (!factoryClass) return [];
|
|
100
|
+
const providers = [
|
|
101
|
+
{
|
|
102
|
+
provide: EVENT_MANAGER_MODULE_OPTIONS,
|
|
103
|
+
useFactory: async (factory)=>({
|
|
104
|
+
...options,
|
|
105
|
+
config: await factory.createEventManagerOptions()
|
|
106
|
+
}),
|
|
107
|
+
inject: [
|
|
108
|
+
factoryClass
|
|
109
|
+
]
|
|
110
|
+
}
|
|
111
|
+
];
|
|
112
|
+
if (options.useClass) {
|
|
113
|
+
providers.push({
|
|
114
|
+
provide: options.useClass,
|
|
115
|
+
useClass: options.useClass
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
return providers;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
EventManagerModule = _ts_decorate([
|
|
122
|
+
Module({})
|
|
123
|
+
], EventManagerModule);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './event-manager.module';
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
function _define_property(obj, key, value) {
|
|
2
|
+
if (key in obj) {
|
|
3
|
+
Object.defineProperty(obj, key, {
|
|
4
|
+
value: value,
|
|
5
|
+
enumerable: true,
|
|
6
|
+
configurable: true,
|
|
7
|
+
writable: true
|
|
8
|
+
});
|
|
9
|
+
} else {
|
|
10
|
+
obj[key] = value;
|
|
11
|
+
}
|
|
12
|
+
return obj;
|
|
13
|
+
}
|
|
14
|
+
function _ts_decorate(decorators, target, key, desc) {
|
|
15
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
16
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
17
|
+
else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
18
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
19
|
+
}
|
|
20
|
+
function _ts_metadata(k, v) {
|
|
21
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
22
|
+
}
|
|
23
|
+
function _ts_param(paramIndex, decorator) {
|
|
24
|
+
return function(target, key) {
|
|
25
|
+
decorator(target, key, paramIndex);
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
import { Inject, Injectable } from '@nestjs/common';
|
|
29
|
+
import { EventManagerModuleOptions } from '../interfaces';
|
|
30
|
+
import { EVENT_MANAGER_MODULE_OPTIONS } from '../config/event-manager.constants';
|
|
31
|
+
const DEFAULT_COLOR = '#3B82F6';
|
|
32
|
+
const DEFAULT_MAX_RECURRENCE_OCCURRENCES = 365;
|
|
33
|
+
export class EventManagerConfigService {
|
|
34
|
+
// IModuleConfigService Implementation
|
|
35
|
+
isCompanyFeatureEnabled() {
|
|
36
|
+
return this.options.bootstrapAppConfig?.enableCompanyFeature ?? false;
|
|
37
|
+
}
|
|
38
|
+
getDatabaseMode() {
|
|
39
|
+
return this.options.bootstrapAppConfig?.databaseMode ?? 'single';
|
|
40
|
+
}
|
|
41
|
+
isMultiTenant() {
|
|
42
|
+
return this.getDatabaseMode() === 'multi-tenant';
|
|
43
|
+
}
|
|
44
|
+
// Config Getters
|
|
45
|
+
getDefaultColor() {
|
|
46
|
+
return this.options.config?.defaultColor ?? DEFAULT_COLOR;
|
|
47
|
+
}
|
|
48
|
+
getMaxRecurrenceOccurrences() {
|
|
49
|
+
return this.options.config?.maxRecurrenceOccurrences ?? DEFAULT_MAX_RECURRENCE_OCCURRENCES;
|
|
50
|
+
}
|
|
51
|
+
getOptions() {
|
|
52
|
+
return this.options;
|
|
53
|
+
}
|
|
54
|
+
constructor(options){
|
|
55
|
+
_define_property(this, "options", void 0);
|
|
56
|
+
this.options = options;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
EventManagerConfigService = _ts_decorate([
|
|
60
|
+
Injectable(),
|
|
61
|
+
_ts_param(0, Inject(EVENT_MANAGER_MODULE_OPTIONS)),
|
|
62
|
+
_ts_metadata("design:type", Function),
|
|
63
|
+
_ts_metadata("design:paramtypes", [
|
|
64
|
+
typeof EventManagerModuleOptions === "undefined" ? Object : EventManagerModuleOptions
|
|
65
|
+
])
|
|
66
|
+
], EventManagerConfigService);
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
function _define_property(obj, key, value) {
|
|
2
|
+
if (key in obj) {
|
|
3
|
+
Object.defineProperty(obj, key, {
|
|
4
|
+
value: value,
|
|
5
|
+
enumerable: true,
|
|
6
|
+
configurable: true,
|
|
7
|
+
writable: true
|
|
8
|
+
});
|
|
9
|
+
} else {
|
|
10
|
+
obj[key] = value;
|
|
11
|
+
}
|
|
12
|
+
return obj;
|
|
13
|
+
}
|
|
14
|
+
function _ts_decorate(decorators, target, key, desc) {
|
|
15
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
16
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
17
|
+
else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
18
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
19
|
+
}
|
|
20
|
+
function _ts_metadata(k, v) {
|
|
21
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
22
|
+
}
|
|
23
|
+
function _ts_param(paramIndex, decorator) {
|
|
24
|
+
return function(target, key) {
|
|
25
|
+
decorator(target, key, paramIndex);
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
import { MultiTenantDataSourceService } from '@flusys/nestjs-shared/modules';
|
|
29
|
+
import { Inject, Injectable, InternalServerErrorException, Logger, Optional, Scope } from '@nestjs/common';
|
|
30
|
+
import { REQUEST } from '@nestjs/core';
|
|
31
|
+
import { Request } from 'express';
|
|
32
|
+
import { EventManagerConfigService } from './event-manager-config.service';
|
|
33
|
+
export class EventManagerDataSourceProvider extends MultiTenantDataSourceService {
|
|
34
|
+
// Factory Methods
|
|
35
|
+
static buildParentOptions(options) {
|
|
36
|
+
return {
|
|
37
|
+
bootstrapAppConfig: options.bootstrapAppConfig,
|
|
38
|
+
defaultDatabaseConfig: options.config?.defaultDatabaseConfig,
|
|
39
|
+
tenantDefaultDatabaseConfig: options.config?.tenantDefaultDatabaseConfig,
|
|
40
|
+
tenants: options.config?.tenants
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
// Feature Flags
|
|
44
|
+
getEnableCompanyFeatureForTenant(tenant) {
|
|
45
|
+
return tenant?.enableCompanyFeature ?? this.configService.isCompanyFeatureEnabled();
|
|
46
|
+
}
|
|
47
|
+
// Entity Management
|
|
48
|
+
async getEventManagerEntities(enableCompanyFeature) {
|
|
49
|
+
const enable = enableCompanyFeature ?? this.configService.isCompanyFeatureEnabled();
|
|
50
|
+
const entities = await import('../entities');
|
|
51
|
+
// EventParticipant doesn't need company variant - company context comes from Event
|
|
52
|
+
return enable ? [
|
|
53
|
+
entities.EventWithCompany,
|
|
54
|
+
entities.EventParticipant
|
|
55
|
+
] : [
|
|
56
|
+
entities.Event,
|
|
57
|
+
entities.EventParticipant
|
|
58
|
+
];
|
|
59
|
+
}
|
|
60
|
+
// Overrides
|
|
61
|
+
async createDataSourceFromConfig(config) {
|
|
62
|
+
const currentTenant = this.getCurrentTenant();
|
|
63
|
+
const enableCompanyFeature = this.getEnableCompanyFeatureForTenant(currentTenant ?? undefined);
|
|
64
|
+
const entities = await this.getEventManagerEntities(enableCompanyFeature);
|
|
65
|
+
return super.createDataSourceFromConfig(config, entities);
|
|
66
|
+
}
|
|
67
|
+
async getSingleDataSource() {
|
|
68
|
+
if (EventManagerDataSourceProvider.singleDataSource?.isInitialized) {
|
|
69
|
+
return EventManagerDataSourceProvider.singleDataSource;
|
|
70
|
+
}
|
|
71
|
+
if (EventManagerDataSourceProvider.singleConnectionLock) {
|
|
72
|
+
return EventManagerDataSourceProvider.singleConnectionLock;
|
|
73
|
+
}
|
|
74
|
+
const config = this.getDefaultDatabaseConfig();
|
|
75
|
+
if (!config) {
|
|
76
|
+
throw new InternalServerErrorException('No database config available. Provide defaultDatabaseConfig or tenantDefaultDatabaseConfig.');
|
|
77
|
+
}
|
|
78
|
+
const connectionPromise = this.createDataSourceFromConfig(config);
|
|
79
|
+
EventManagerDataSourceProvider.singleConnectionLock = connectionPromise;
|
|
80
|
+
try {
|
|
81
|
+
const dataSource = await connectionPromise;
|
|
82
|
+
EventManagerDataSourceProvider.singleDataSource = dataSource;
|
|
83
|
+
return dataSource;
|
|
84
|
+
} finally{
|
|
85
|
+
EventManagerDataSourceProvider.singleConnectionLock = null;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
async getOrCreateTenantConnection(tenant) {
|
|
89
|
+
const existing = EventManagerDataSourceProvider.tenantConnections.get(tenant.id);
|
|
90
|
+
if (existing?.isInitialized) {
|
|
91
|
+
return existing;
|
|
92
|
+
}
|
|
93
|
+
const pendingConnection = EventManagerDataSourceProvider.connectionLocks.get(tenant.id);
|
|
94
|
+
if (pendingConnection) {
|
|
95
|
+
return pendingConnection;
|
|
96
|
+
}
|
|
97
|
+
const config = this.buildTenantDatabaseConfig(tenant);
|
|
98
|
+
const connectionPromise = this.createDataSourceFromConfig(config);
|
|
99
|
+
EventManagerDataSourceProvider.connectionLocks.set(tenant.id, connectionPromise);
|
|
100
|
+
try {
|
|
101
|
+
const dataSource = await connectionPromise;
|
|
102
|
+
EventManagerDataSourceProvider.tenantConnections.set(tenant.id, dataSource);
|
|
103
|
+
return dataSource;
|
|
104
|
+
} finally{
|
|
105
|
+
EventManagerDataSourceProvider.connectionLocks.delete(tenant.id);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
constructor(configService, request){
|
|
109
|
+
super(EventManagerDataSourceProvider.buildParentOptions(configService.getOptions()), request), _define_property(this, "configService", void 0), _define_property(this, "logger", void 0), this.configService = configService, this.logger = new Logger(EventManagerDataSourceProvider.name);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
_define_property(EventManagerDataSourceProvider, "tenantConnections", new Map());
|
|
113
|
+
_define_property(EventManagerDataSourceProvider, "singleDataSource", null);
|
|
114
|
+
_define_property(EventManagerDataSourceProvider, "tenantsRegistry", new Map());
|
|
115
|
+
_define_property(EventManagerDataSourceProvider, "initialized", false);
|
|
116
|
+
_define_property(EventManagerDataSourceProvider, "connectionLocks", new Map());
|
|
117
|
+
_define_property(EventManagerDataSourceProvider, "singleConnectionLock", null);
|
|
118
|
+
EventManagerDataSourceProvider = _ts_decorate([
|
|
119
|
+
Injectable({
|
|
120
|
+
scope: Scope.REQUEST
|
|
121
|
+
}),
|
|
122
|
+
_ts_param(0, Inject(EventManagerConfigService)),
|
|
123
|
+
_ts_param(1, Optional()),
|
|
124
|
+
_ts_param(1, Inject(REQUEST)),
|
|
125
|
+
_ts_metadata("design:type", Function),
|
|
126
|
+
_ts_metadata("design:paramtypes", [
|
|
127
|
+
typeof EventManagerConfigService === "undefined" ? Object : EventManagerConfigService,
|
|
128
|
+
typeof Request === "undefined" ? Object : Request
|
|
129
|
+
])
|
|
130
|
+
], EventManagerDataSourceProvider);
|