@flusys/nestjs-event-manager 7.1.0 → 8.0.0
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/adapters/event-manager.adapter.d.ts +2 -2
- package/adapters/index.d.ts +1 -1
- package/config/index.d.ts +3 -3
- package/controllers/event.controller.d.ts +3 -3
- package/controllers/index.d.ts +1 -1
- package/docs/event-manager-swagger.config.d.ts +2 -2
- package/docs/index.d.ts +1 -1
- package/dtos/calendar-query.dto.d.ts +1 -1
- package/dtos/event.dto.d.ts +1 -1
- package/dtos/index.d.ts +3 -3
- package/entities/event-with-company.entity.d.ts +1 -1
- package/entities/index.d.ts +8 -8
- package/fesm/477.js +1798 -0
- package/fesm/833.js +840 -0
- package/fesm/adapters/index.js +884 -1
- package/fesm/config/index.js +87 -3
- package/fesm/controllers/index.js +365 -1
- package/fesm/docs/index.js +155 -2
- package/fesm/dtos/index.js +720 -3
- package/fesm/entities/index.js +350 -11
- package/fesm/index.js +121 -9
- package/fesm/interfaces/index.js +16 -2
- package/fesm/modules/index.js +13 -1
- package/fesm/runtime.js +85 -0
- package/fesm/services/index.js +272 -4
- package/index.d.ts +9 -9
- package/interfaces/event-manager-module.interface.d.ts +3 -3
- package/interfaces/event.interface.d.ts +1 -1
- package/interfaces/index.d.ts +2 -2
- package/modules/event-manager.module.d.ts +2 -2
- package/modules/index.d.ts +1 -1
- package/package.json +29 -39
- package/services/event-manager-config.service.d.ts +3 -3
- package/services/event-manager-datasource.provider.d.ts +3 -3
- package/services/event-manager-helper.service.d.ts +3 -3
- package/services/event.service.d.ts +7 -7
- package/services/index.d.ts +4 -4
- package/cjs/adapters/event-manager.adapter.js +0 -65
- package/cjs/adapters/event-manager.adapter.spec.js +0 -104
- package/cjs/adapters/index.js +0 -18
- package/cjs/config/event-actions.js +0 -31
- package/cjs/config/event-manager.constants.js +0 -13
- package/cjs/config/index.js +0 -20
- package/cjs/config/message-keys.js +0 -27
- package/cjs/controllers/event.controller.js +0 -190
- package/cjs/controllers/event.controller.spec.js +0 -156
- package/cjs/controllers/index.js +0 -18
- package/cjs/docs/event-manager-swagger.config.js +0 -125
- package/cjs/docs/event-manager-swagger.config.spec.js +0 -65
- package/cjs/docs/index.js +0 -21
- package/cjs/dtos/calendar-query.dto.js +0 -212
- package/cjs/dtos/event-participant.dto.js +0 -181
- package/cjs/dtos/event.dto.js +0 -343
- package/cjs/dtos/index.js +0 -20
- package/cjs/entities/event-participant.entity.js +0 -89
- package/cjs/entities/event-with-company.entity.js +0 -56
- package/cjs/entities/event.entity.js +0 -156
- package/cjs/entities/index.js +0 -55
- package/cjs/entities/index.spec.js +0 -18
- package/cjs/index.js +0 -27
- package/cjs/interfaces/event-manager-module.interface.js +0 -4
- package/cjs/interfaces/event.interface.js +0 -4
- package/cjs/interfaces/index.js +0 -19
- package/cjs/modules/event-manager.module.js +0 -132
- package/cjs/modules/event-manager.module.spec.js +0 -146
- package/cjs/modules/index.js +0 -18
- package/cjs/services/event-manager-config.service.js +0 -76
- package/cjs/services/event-manager-config.service.spec.js +0 -111
- package/cjs/services/event-manager-datasource.provider.js +0 -84
- package/cjs/services/event-manager-datasource.provider.spec.js +0 -198
- package/cjs/services/event-manager-helper.service.js +0 -235
- package/cjs/services/event-manager-helper.service.spec.js +0 -327
- package/cjs/services/event.service.js +0 -481
- package/cjs/services/event.service.spec.js +0 -929
- package/cjs/services/index.js +0 -21
- package/fesm/adapters/event-manager.adapter.js +0 -55
- package/fesm/adapters/event-manager.adapter.spec.js +0 -100
- package/fesm/config/event-actions.js +0 -10
- package/fesm/config/event-manager.constants.js +0 -3
- package/fesm/config/message-keys.js +0 -9
- package/fesm/controllers/event.controller.js +0 -180
- package/fesm/controllers/event.controller.spec.js +0 -152
- package/fesm/docs/event-manager-swagger.config.js +0 -118
- package/fesm/docs/event-manager-swagger.config.spec.js +0 -61
- package/fesm/dtos/calendar-query.dto.js +0 -194
- package/fesm/dtos/event-participant.dto.js +0 -157
- package/fesm/dtos/event.dto.js +0 -322
- package/fesm/entities/event-participant.entity.js +0 -79
- package/fesm/entities/event-with-company.entity.js +0 -46
- package/fesm/entities/event.entity.js +0 -146
- package/fesm/entities/index.spec.js +0 -14
- package/fesm/interfaces/event-manager-module.interface.js +0 -3
- package/fesm/interfaces/event.interface.js +0 -1
- package/fesm/modules/event-manager.module.js +0 -122
- package/fesm/modules/event-manager.module.spec.js +0 -142
- package/fesm/services/event-manager-config.service.js +0 -66
- package/fesm/services/event-manager-config.service.spec.js +0 -107
- package/fesm/services/event-manager-datasource.provider.js +0 -74
- package/fesm/services/event-manager-datasource.provider.spec.js +0 -194
- package/fesm/services/event-manager-helper.service.js +0 -225
- package/fesm/services/event-manager-helper.service.spec.js +0 -323
- package/fesm/services/event.service.js +0 -471
- package/fesm/services/event.service.spec.js +0 -925
|
@@ -1,481 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
value: true
|
|
4
|
-
});
|
|
5
|
-
Object.defineProperty(exports, "EventService", {
|
|
6
|
-
enumerable: true,
|
|
7
|
-
get: function() {
|
|
8
|
-
return EventService;
|
|
9
|
-
}
|
|
10
|
-
});
|
|
11
|
-
const _classes = require("@flusys/nestjs-shared/classes");
|
|
12
|
-
const _decorators = require("@flusys/nestjs-shared/decorators");
|
|
13
|
-
const _enums = require("@flusys/nestjs-shared/enums");
|
|
14
|
-
const _modules = require("@flusys/nestjs-shared/modules");
|
|
15
|
-
const _utils = require("@flusys/nestjs-shared/utils");
|
|
16
|
-
const _common = require("@nestjs/common");
|
|
17
|
-
const _typeorm = require("typeorm");
|
|
18
|
-
const _config = require("../config");
|
|
19
|
-
const _dtos = require("../dtos");
|
|
20
|
-
const _entities = require("../entities");
|
|
21
|
-
const _eventmanagerconfigservice = require("./event-manager-config.service");
|
|
22
|
-
const _eventmanagerdatasourceprovider = require("./event-manager-datasource.provider");
|
|
23
|
-
function _define_property(obj, key, value) {
|
|
24
|
-
if (key in obj) {
|
|
25
|
-
Object.defineProperty(obj, key, {
|
|
26
|
-
value: value,
|
|
27
|
-
enumerable: true,
|
|
28
|
-
configurable: true,
|
|
29
|
-
writable: true
|
|
30
|
-
});
|
|
31
|
-
} else {
|
|
32
|
-
obj[key] = value;
|
|
33
|
-
}
|
|
34
|
-
return obj;
|
|
35
|
-
}
|
|
36
|
-
function _ts_decorate(decorators, target, key, desc) {
|
|
37
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
38
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
39
|
-
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;
|
|
40
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
41
|
-
}
|
|
42
|
-
function _ts_metadata(k, v) {
|
|
43
|
-
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
44
|
-
}
|
|
45
|
-
function _ts_param(paramIndex, decorator) {
|
|
46
|
-
return function(target, key) {
|
|
47
|
-
decorator(target, key, paramIndex);
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
let EventService = class EventService extends _classes.ApiService {
|
|
51
|
-
// Override methods
|
|
52
|
-
async convertSingleDtoToEntity(dto, user) {
|
|
53
|
-
await this.ensureDataSourceRepository();
|
|
54
|
-
let entity = {};
|
|
55
|
-
if ('id' in dto && dto.id && typeof dto.id === 'string') {
|
|
56
|
-
const existing = await this.repository.findOne({
|
|
57
|
-
where: {
|
|
58
|
-
id: dto.id
|
|
59
|
-
}
|
|
60
|
-
});
|
|
61
|
-
if (!existing) throw new _common.NotFoundException({
|
|
62
|
-
message: 'Event not found',
|
|
63
|
-
messageKey: _config.EVENT_MESSAGES.NOT_FOUND
|
|
64
|
-
});
|
|
65
|
-
entity = existing;
|
|
66
|
-
}
|
|
67
|
-
const isAllDay = dto.isAllDay ?? entity.isAllDay ?? false;
|
|
68
|
-
const merged = {
|
|
69
|
-
...entity,
|
|
70
|
-
title: dto.title ?? entity.title,
|
|
71
|
-
description: dto.description ?? entity.description,
|
|
72
|
-
eventDate: dto.eventDate ?? entity.eventDate,
|
|
73
|
-
startTime: isAllDay ? '00:00' : dto.startTime ?? entity.startTime ?? '00:00',
|
|
74
|
-
endTime: isAllDay ? '23:59' : dto.endTime ?? entity.endTime ?? '23:59',
|
|
75
|
-
isAllDay,
|
|
76
|
-
recurrenceType: dto.recurrenceType ?? entity.recurrenceType ?? _enums.RecurrenceType.NONE,
|
|
77
|
-
recurrenceEndDate: dto.recurrenceEndDate ?? entity.recurrenceEndDate ?? null,
|
|
78
|
-
weekDays: dto.weekDays ?? entity.weekDays ?? null,
|
|
79
|
-
color: dto.color ?? entity.color ?? this.eventConfig.getDefaultColor(),
|
|
80
|
-
meetingLink: dto.meetingLink !== undefined ? dto.meetingLink ?? null : entity.meetingLink ?? null,
|
|
81
|
-
isActive: dto.isActive ?? entity.isActive ?? true
|
|
82
|
-
};
|
|
83
|
-
if (this.eventConfig.isCompanyFeatureEnabled()) {
|
|
84
|
-
merged.companyId = user?.companyId ?? null;
|
|
85
|
-
}
|
|
86
|
-
if ('participantIds' in dto) {
|
|
87
|
-
this.pendingParticipantsList.push(dto.participantIds ?? []);
|
|
88
|
-
}
|
|
89
|
-
return merged;
|
|
90
|
-
}
|
|
91
|
-
async getFilterQuery(query, filter, _user) {
|
|
92
|
-
for (const [key, value] of Object.entries(filter)){
|
|
93
|
-
if (key === 'isActive' && typeof value === 'boolean') {
|
|
94
|
-
query.andWhere(`${this.entityName}.isActive = :isActive`, {
|
|
95
|
-
isActive: value
|
|
96
|
-
});
|
|
97
|
-
} else if (key === 'recurrenceType') {
|
|
98
|
-
query.andWhere(`${this.entityName}.recurrenceType = :recurrenceType`, {
|
|
99
|
-
recurrenceType: value
|
|
100
|
-
});
|
|
101
|
-
} else if (key === 'participantUserId' && typeof value === 'string') {
|
|
102
|
-
const eventIds = await this.getParticipantEventIds(value);
|
|
103
|
-
if (eventIds.length > 0) {
|
|
104
|
-
query.andWhere(`${this.entityName}.id IN (:...participantEventIds)`, {
|
|
105
|
-
participantEventIds: eventIds
|
|
106
|
-
});
|
|
107
|
-
} else {
|
|
108
|
-
query.andWhere('1 = 0');
|
|
109
|
-
}
|
|
110
|
-
} else {
|
|
111
|
-
query.andWhere(`${this.entityName}.${key} = :value`, {
|
|
112
|
-
value
|
|
113
|
-
});
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
return {
|
|
117
|
-
query,
|
|
118
|
-
isRaw: false
|
|
119
|
-
};
|
|
120
|
-
}
|
|
121
|
-
async getExtraManipulateQuery(query, filterDto, user) {
|
|
122
|
-
const result = await super.getExtraManipulateQuery(query, filterDto, user);
|
|
123
|
-
this.applyEventCompanyFilter(query, user);
|
|
124
|
-
await this.ensureParticipantRepositoryInitialized();
|
|
125
|
-
query.leftJoinAndMapMany(`${this.entityName}.participants`, _entities.EventParticipant, 'ep', 'ep.event_id = event.id AND ep.deleted_at IS NULL');
|
|
126
|
-
return result;
|
|
127
|
-
}
|
|
128
|
-
async afterInsertOperation(entities, _dto, user, _qr) {
|
|
129
|
-
for(let i = 0; i < entities.length; i++){
|
|
130
|
-
const participantIds = this.pendingParticipantsList[i] ?? [];
|
|
131
|
-
await this.addCreatorAndParticipants(entities[i].id, participantIds, user);
|
|
132
|
-
}
|
|
133
|
-
this.pendingParticipantsList = [];
|
|
134
|
-
}
|
|
135
|
-
async afterUpdateOperation(entities, _dto, user, _qr) {
|
|
136
|
-
const participantRepo = await this.ensureParticipantRepositoryInitialized();
|
|
137
|
-
for(let i = 0; i < entities.length; i++){
|
|
138
|
-
const participantIds = this.pendingParticipantsList[i] ?? [];
|
|
139
|
-
await participantRepo.update({
|
|
140
|
-
eventId: entities[i].id,
|
|
141
|
-
deletedAt: (0, _typeorm.IsNull)()
|
|
142
|
-
}, {
|
|
143
|
-
deletedAt: new Date()
|
|
144
|
-
});
|
|
145
|
-
await this.addCreatorAndParticipants(entities[i].id, participantIds, user);
|
|
146
|
-
}
|
|
147
|
-
this.pendingParticipantsList = [];
|
|
148
|
-
}
|
|
149
|
-
// Public API methods
|
|
150
|
-
async getEventsForCalendarRange(queryDto, user) {
|
|
151
|
-
await this.ensureDataSourceRepository();
|
|
152
|
-
const query = this.repository.createQueryBuilder('event').where('event.deletedAt IS NULL').andWhere('event.isActive = :isActive', {
|
|
153
|
-
isActive: queryDto.activeOnly !== false
|
|
154
|
-
}).andWhere('((event.eventDate >= :startDate AND event.eventDate <= :endDate) OR (event.recurrenceType != :none AND event.eventDate <= :endDate AND (event.recurrenceEndDate IS NULL OR event.recurrenceEndDate >= :startDate)))', {
|
|
155
|
-
startDate: queryDto.startDate,
|
|
156
|
-
endDate: queryDto.endDate,
|
|
157
|
-
none: _enums.RecurrenceType.NONE
|
|
158
|
-
});
|
|
159
|
-
this.applyEventCompanyFilter(query, user);
|
|
160
|
-
if (queryDto.userId) {
|
|
161
|
-
const eventIds = await this.getParticipantEventIds(queryDto.userId);
|
|
162
|
-
if (eventIds.length > 0) {
|
|
163
|
-
query.andWhere('event.id IN (:...eventIds)', {
|
|
164
|
-
eventIds
|
|
165
|
-
});
|
|
166
|
-
} else {
|
|
167
|
-
return [];
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
const events = await query.getMany();
|
|
171
|
-
if (queryDto.includeParticipants && events.length > 0) {
|
|
172
|
-
await this.loadParticipantsForEvents(events);
|
|
173
|
-
}
|
|
174
|
-
return this.expandRecurringEvents(events, queryDto.startDate, queryDto.endDate);
|
|
175
|
-
}
|
|
176
|
-
async updateParticipantStatus(dto, user) {
|
|
177
|
-
const participantRepo = await this.ensureParticipantRepositoryInitialized();
|
|
178
|
-
const participant = await participantRepo.findOne({
|
|
179
|
-
where: {
|
|
180
|
-
id: dto.id
|
|
181
|
-
}
|
|
182
|
-
});
|
|
183
|
-
if (!participant) {
|
|
184
|
-
throw new _common.NotFoundException({
|
|
185
|
-
message: 'Event participant not found',
|
|
186
|
-
messageKey: _config.EVENT_PARTICIPANT_MESSAGES.NOT_FOUND
|
|
187
|
-
});
|
|
188
|
-
}
|
|
189
|
-
participant.status = dto.status;
|
|
190
|
-
const saved = await participantRepo.save(participant);
|
|
191
|
-
await Promise.all([
|
|
192
|
-
this.clearCacheForAll(),
|
|
193
|
-
this.clearCacheForId([
|
|
194
|
-
{
|
|
195
|
-
id: participant.eventId
|
|
196
|
-
}
|
|
197
|
-
])
|
|
198
|
-
]);
|
|
199
|
-
await this.publishDomainAction(_config.EVENT_MANAGER_EVENT_ACTIONS.PARTICIPANT_STATUS_CHANGED, {
|
|
200
|
-
ids: [
|
|
201
|
-
participant.eventId
|
|
202
|
-
],
|
|
203
|
-
metadata: {
|
|
204
|
-
participantId: saved.id,
|
|
205
|
-
participantUserId: saved.userId,
|
|
206
|
-
status: saved.status
|
|
207
|
-
},
|
|
208
|
-
user
|
|
209
|
-
});
|
|
210
|
-
return saved;
|
|
211
|
-
}
|
|
212
|
-
// Private business logic helpers
|
|
213
|
-
async addCreatorAndParticipants(eventId, participantIds, user) {
|
|
214
|
-
if (!user?.id) return;
|
|
215
|
-
const participantRepo = await this.ensureParticipantRepositoryInitialized();
|
|
216
|
-
const allUserIds = Array.from(new Set([
|
|
217
|
-
user.id,
|
|
218
|
-
...participantIds
|
|
219
|
-
]));
|
|
220
|
-
const existing = await participantRepo.find({
|
|
221
|
-
where: {
|
|
222
|
-
eventId,
|
|
223
|
-
userId: (0, _typeorm.In)(allUserIds)
|
|
224
|
-
},
|
|
225
|
-
withDeleted: true
|
|
226
|
-
});
|
|
227
|
-
const existingByUserId = new Map(existing.map((p)=>[
|
|
228
|
-
p.userId,
|
|
229
|
-
p
|
|
230
|
-
]));
|
|
231
|
-
const toSave = allUserIds.map((userId)=>{
|
|
232
|
-
const existingRecord = existingByUserId.get(userId);
|
|
233
|
-
if (existingRecord) {
|
|
234
|
-
return {
|
|
235
|
-
...existingRecord,
|
|
236
|
-
deletedAt: null,
|
|
237
|
-
isOrganizer: userId === user.id
|
|
238
|
-
};
|
|
239
|
-
}
|
|
240
|
-
return {
|
|
241
|
-
eventId,
|
|
242
|
-
userId,
|
|
243
|
-
isOrganizer: userId === user.id
|
|
244
|
-
};
|
|
245
|
-
});
|
|
246
|
-
await participantRepo.save(toSave);
|
|
247
|
-
}
|
|
248
|
-
expandRecurringEvents(events, rangeStart, rangeEnd) {
|
|
249
|
-
const result = [];
|
|
250
|
-
const maxOccurrences = this.eventConfig.getMaxRecurrenceOccurrences();
|
|
251
|
-
for (const event of events){
|
|
252
|
-
if (event.recurrenceType === _enums.RecurrenceType.NONE) {
|
|
253
|
-
result.push(this.toCalendarEvent(event));
|
|
254
|
-
} else {
|
|
255
|
-
result.push(...this.generateOccurrences(event, rangeStart, rangeEnd, maxOccurrences));
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
return result.sort((a, b)=>a.eventDate.localeCompare(b.eventDate));
|
|
259
|
-
}
|
|
260
|
-
generateOccurrences(event, rangeStart, rangeEnd, maxOccurrences) {
|
|
261
|
-
const occurrences = [];
|
|
262
|
-
const recurrenceEnd = event.recurrenceEndDate ?? null;
|
|
263
|
-
const recurrenceType = event.recurrenceType;
|
|
264
|
-
const weekDays = event.weekDays ?? [
|
|
265
|
-
this.getDayOfWeek(event.eventDate)
|
|
266
|
-
];
|
|
267
|
-
let currentDate = event.eventDate;
|
|
268
|
-
let count = 0;
|
|
269
|
-
if (recurrenceType === _enums.RecurrenceType.WEEKLY || recurrenceType === _enums.RecurrenceType.BIWEEKLY) {
|
|
270
|
-
let weekStart = this.getWeekStart(event.eventDate);
|
|
271
|
-
while(count < maxOccurrences){
|
|
272
|
-
for (const dayOfWeek of weekDays){
|
|
273
|
-
if (count >= maxOccurrences) break;
|
|
274
|
-
currentDate = this.addDaysToDate(weekStart, this.weekdayNameToIndex(dayOfWeek));
|
|
275
|
-
if (currentDate < event.eventDate) continue;
|
|
276
|
-
if (this.shouldStopRecurrence(currentDate, recurrenceEnd, rangeEnd)) {
|
|
277
|
-
count = maxOccurrences;
|
|
278
|
-
break;
|
|
279
|
-
}
|
|
280
|
-
if (currentDate >= rangeStart && currentDate <= rangeEnd) {
|
|
281
|
-
occurrences.push(this.toCalendarEventOnDate(event, currentDate, occurrences.length > 0));
|
|
282
|
-
}
|
|
283
|
-
count++;
|
|
284
|
-
}
|
|
285
|
-
const weeksToAdd = recurrenceType === _enums.RecurrenceType.BIWEEKLY ? 2 : 1;
|
|
286
|
-
weekStart = this.addDaysToDate(weekStart, 7 * weeksToAdd);
|
|
287
|
-
}
|
|
288
|
-
} else {
|
|
289
|
-
const originalDayOfMonth = parseInt(event.eventDate.split('-')[2], 10);
|
|
290
|
-
while(count < maxOccurrences){
|
|
291
|
-
if (this.shouldStopRecurrence(currentDate, recurrenceEnd, rangeEnd)) break;
|
|
292
|
-
if (currentDate >= rangeStart && currentDate <= rangeEnd) {
|
|
293
|
-
occurrences.push(this.toCalendarEventOnDate(event, currentDate, count > 0));
|
|
294
|
-
}
|
|
295
|
-
currentDate = this.getNextOccurrenceDate(currentDate, recurrenceType, originalDayOfMonth);
|
|
296
|
-
count++;
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
return occurrences;
|
|
300
|
-
}
|
|
301
|
-
// Private utility helpers
|
|
302
|
-
async ensureParticipantRepositoryInitialized() {
|
|
303
|
-
if (!this.participantRepository) {
|
|
304
|
-
this.participantRepository = await this.dataSourceProvider.getRepository(_entities.EventParticipant);
|
|
305
|
-
}
|
|
306
|
-
return this.participantRepository;
|
|
307
|
-
}
|
|
308
|
-
async getParticipantEventIds(userId) {
|
|
309
|
-
const participantRepo = await this.ensureParticipantRepositoryInitialized();
|
|
310
|
-
const results = await participantRepo.createQueryBuilder('ep').select('ep.eventId').where('ep.userId = :userId', {
|
|
311
|
-
userId
|
|
312
|
-
}).andWhere('ep.deletedAt IS NULL').getRawMany();
|
|
313
|
-
return results.map((p)=>p.ep_event_id);
|
|
314
|
-
}
|
|
315
|
-
async loadParticipantsForEvents(events) {
|
|
316
|
-
const participantRepo = await this.ensureParticipantRepositoryInitialized();
|
|
317
|
-
const eventIds = events.map((e)=>e.id);
|
|
318
|
-
const participants = await participantRepo.find({
|
|
319
|
-
where: {
|
|
320
|
-
eventId: (0, _typeorm.In)(eventIds),
|
|
321
|
-
deletedAt: (0, _typeorm.IsNull)()
|
|
322
|
-
}
|
|
323
|
-
});
|
|
324
|
-
const participantsByEvent = new Map();
|
|
325
|
-
for (const p of participants){
|
|
326
|
-
const list = participantsByEvent.get(p.eventId) || [];
|
|
327
|
-
list.push(p);
|
|
328
|
-
participantsByEvent.set(p.eventId, list);
|
|
329
|
-
}
|
|
330
|
-
for (const event of events){
|
|
331
|
-
event.participants = participantsByEvent.get(event.id) || [];
|
|
332
|
-
}
|
|
333
|
-
}
|
|
334
|
-
applyEventCompanyFilter(query, user) {
|
|
335
|
-
(0, _utils.applyCompanyFilter)(query, {
|
|
336
|
-
isCompanyFeatureEnabled: this.eventConfig.isCompanyFeatureEnabled(),
|
|
337
|
-
entityAlias: 'event'
|
|
338
|
-
}, user);
|
|
339
|
-
}
|
|
340
|
-
shouldStopRecurrence(currentDate, recurrenceEnd, rangeEnd) {
|
|
341
|
-
return recurrenceEnd !== null && currentDate > recurrenceEnd || currentDate > rangeEnd;
|
|
342
|
-
}
|
|
343
|
-
getDayOfWeek(dateStr) {
|
|
344
|
-
const days = [
|
|
345
|
-
'SUN',
|
|
346
|
-
'MON',
|
|
347
|
-
'TUE',
|
|
348
|
-
'WED',
|
|
349
|
-
'THU',
|
|
350
|
-
'FRI',
|
|
351
|
-
'SAT'
|
|
352
|
-
];
|
|
353
|
-
return days[new Date(`${dateStr}T00:00:00Z`).getUTCDay()];
|
|
354
|
-
}
|
|
355
|
-
weekdayNameToIndex(day) {
|
|
356
|
-
const map = {
|
|
357
|
-
SUN: 0,
|
|
358
|
-
MON: 1,
|
|
359
|
-
TUE: 2,
|
|
360
|
-
WED: 3,
|
|
361
|
-
THU: 4,
|
|
362
|
-
FRI: 5,
|
|
363
|
-
SAT: 6
|
|
364
|
-
};
|
|
365
|
-
return map[day.toUpperCase()] ?? 0;
|
|
366
|
-
}
|
|
367
|
-
getWeekStart(dateStr) {
|
|
368
|
-
const d = new Date(`${dateStr}T00:00:00Z`);
|
|
369
|
-
d.setUTCDate(d.getUTCDate() - d.getUTCDay());
|
|
370
|
-
return d.toISOString().slice(0, 10);
|
|
371
|
-
}
|
|
372
|
-
addDaysToDate(dateStr, days) {
|
|
373
|
-
const d = new Date(`${dateStr}T00:00:00Z`);
|
|
374
|
-
d.setUTCDate(d.getUTCDate() + days);
|
|
375
|
-
return d.toISOString().slice(0, 10);
|
|
376
|
-
}
|
|
377
|
-
getNextOccurrenceDate(current, recurrenceType, originalDayOfMonth) {
|
|
378
|
-
const d = new Date(`${current}T00:00:00Z`);
|
|
379
|
-
switch(recurrenceType){
|
|
380
|
-
case _enums.RecurrenceType.DAILY:
|
|
381
|
-
d.setUTCDate(d.getUTCDate() + 1);
|
|
382
|
-
break;
|
|
383
|
-
case _enums.RecurrenceType.MONTHLY:
|
|
384
|
-
{
|
|
385
|
-
// Compute the target year/month from the *original* date before any mutation.
|
|
386
|
-
// Mutating `d` first (e.g. via setUTCMonth) can overflow past short months
|
|
387
|
-
// (Jan 31 -> Feb 31 normalizes to Mar 3), which would then compute
|
|
388
|
-
// `lastDayOfMonth` for the wrong (already-overflowed) month and silently
|
|
389
|
-
// skip target months that have fewer days than the original day-of-month.
|
|
390
|
-
const targetDay = originalDayOfMonth ?? d.getUTCDate();
|
|
391
|
-
const targetYear = d.getUTCFullYear();
|
|
392
|
-
const targetMonth = d.getUTCMonth() + 1;
|
|
393
|
-
const lastDayOfMonth = new Date(Date.UTC(targetYear, targetMonth + 1, 0)).getUTCDate();
|
|
394
|
-
return new Date(Date.UTC(targetYear, targetMonth, Math.min(targetDay, lastDayOfMonth))).toISOString().slice(0, 10);
|
|
395
|
-
}
|
|
396
|
-
default:
|
|
397
|
-
break;
|
|
398
|
-
}
|
|
399
|
-
return d.toISOString().slice(0, 10);
|
|
400
|
-
}
|
|
401
|
-
// Private transformation helpers
|
|
402
|
-
toCalendarEvent(event) {
|
|
403
|
-
return {
|
|
404
|
-
id: event.id,
|
|
405
|
-
title: event.title,
|
|
406
|
-
description: event.description,
|
|
407
|
-
eventDate: event.eventDate,
|
|
408
|
-
startTime: event.startTime,
|
|
409
|
-
endTime: event.endTime,
|
|
410
|
-
isAllDay: event.isAllDay,
|
|
411
|
-
recurrenceType: event.recurrenceType,
|
|
412
|
-
recurrenceEndDate: event.recurrenceEndDate,
|
|
413
|
-
weekDays: event.weekDays,
|
|
414
|
-
color: event.color,
|
|
415
|
-
meetingLink: event.meetingLink ?? null,
|
|
416
|
-
isActive: event.isActive,
|
|
417
|
-
createdAt: event.createdAt,
|
|
418
|
-
updatedAt: event.updatedAt,
|
|
419
|
-
deletedAt: event.deletedAt,
|
|
420
|
-
createdById: event.createdById,
|
|
421
|
-
updatedById: event.updatedById,
|
|
422
|
-
deletedById: event.deletedById,
|
|
423
|
-
participants: event.participants?.map((p)=>this.toParticipantInfo(p))
|
|
424
|
-
};
|
|
425
|
-
}
|
|
426
|
-
toCalendarEventOnDate(event, occurrenceDate, isRecurrenceInstance) {
|
|
427
|
-
return {
|
|
428
|
-
...this.toCalendarEvent(event),
|
|
429
|
-
id: `${event.id}_${occurrenceDate}`,
|
|
430
|
-
originalEventId: event.id,
|
|
431
|
-
isRecurrenceInstance,
|
|
432
|
-
eventDate: occurrenceDate
|
|
433
|
-
};
|
|
434
|
-
}
|
|
435
|
-
toParticipantInfo(p) {
|
|
436
|
-
return {
|
|
437
|
-
id: p.id,
|
|
438
|
-
eventId: p.eventId,
|
|
439
|
-
userId: p.userId,
|
|
440
|
-
status: p.status,
|
|
441
|
-
isOrganizer: p.isOrganizer,
|
|
442
|
-
createdAt: p.createdAt,
|
|
443
|
-
updatedAt: p.updatedAt,
|
|
444
|
-
deletedAt: p.deletedAt,
|
|
445
|
-
createdById: p.createdById,
|
|
446
|
-
updatedById: p.updatedById,
|
|
447
|
-
deletedById: p.deletedById
|
|
448
|
-
};
|
|
449
|
-
}
|
|
450
|
-
constructor(cacheManager, utilsService, eventConfig, dataSourceProvider){
|
|
451
|
-
super(_config.EVENT_MANAGER_EVENT_ENTITIES.EVENT, cacheManager, utilsService, EventService.name, true, _config.EVENT_MANAGER_EVENT_MODULE, dataSourceProvider, eventConfig.isCompanyFeatureEnabled() ? _entities.EventWithCompany : _entities.Event), _define_property(this, "cacheManager", void 0), _define_property(this, "utilsService", void 0), _define_property(this, "eventConfig", void 0), _define_property(this, "dataSourceProvider", void 0), _define_property(this, "participantRepository", void 0), _define_property(this, "pendingParticipantsList", void 0), this.cacheManager = cacheManager, this.utilsService = utilsService, this.eventConfig = eventConfig, this.dataSourceProvider = dataSourceProvider, this.participantRepository = null, this.pendingParticipantsList = [];
|
|
452
|
-
}
|
|
453
|
-
};
|
|
454
|
-
_ts_decorate([
|
|
455
|
-
(0, _decorators.LogAction)({
|
|
456
|
-
action: 'eventParticipant.updateStatus',
|
|
457
|
-
module: 'event-manager'
|
|
458
|
-
}),
|
|
459
|
-
_ts_metadata("design:type", Function),
|
|
460
|
-
_ts_metadata("design:paramtypes", [
|
|
461
|
-
typeof _dtos.UpdateParticipantStatusDto === "undefined" ? Object : _dtos.UpdateParticipantStatusDto,
|
|
462
|
-
Object
|
|
463
|
-
]),
|
|
464
|
-
_ts_metadata("design:returntype", Promise)
|
|
465
|
-
], EventService.prototype, "updateParticipantStatus", null);
|
|
466
|
-
EventService = _ts_decorate([
|
|
467
|
-
(0, _common.Injectable)({
|
|
468
|
-
scope: _common.Scope.REQUEST
|
|
469
|
-
}),
|
|
470
|
-
_ts_param(0, (0, _common.Inject)('CACHE_INSTANCE')),
|
|
471
|
-
_ts_param(1, (0, _common.Inject)(_modules.UtilsService)),
|
|
472
|
-
_ts_param(2, (0, _common.Inject)(_eventmanagerconfigservice.EventManagerConfigService)),
|
|
473
|
-
_ts_param(3, (0, _common.Inject)(_eventmanagerdatasourceprovider.EventManagerDataSourceProvider)),
|
|
474
|
-
_ts_metadata("design:type", Function),
|
|
475
|
-
_ts_metadata("design:paramtypes", [
|
|
476
|
-
typeof _classes.HybridCache === "undefined" ? Object : _classes.HybridCache,
|
|
477
|
-
typeof _modules.UtilsService === "undefined" ? Object : _modules.UtilsService,
|
|
478
|
-
typeof _eventmanagerconfigservice.EventManagerConfigService === "undefined" ? Object : _eventmanagerconfigservice.EventManagerConfigService,
|
|
479
|
-
typeof _eventmanagerdatasourceprovider.EventManagerDataSourceProvider === "undefined" ? Object : _eventmanagerdatasourceprovider.EventManagerDataSourceProvider
|
|
480
|
-
])
|
|
481
|
-
], EventService);
|