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