Skip to content

Commit 3e22921

Browse files
refactor(api): centrelize lifecycle-hook-manager types
1 parent 911d1fb commit 3e22921

File tree

14 files changed

+235
-319
lines changed

14 files changed

+235
-319
lines changed

api/src/chat/repositories/block.repository.ts

Lines changed: 23 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,17 @@
88

99
import { Injectable } from '@nestjs/common';
1010
import { InjectModel } from '@nestjs/mongoose';
11-
import {
12-
Document,
13-
Model,
14-
Query,
15-
Types,
16-
UpdateQuery,
17-
UpdateWithAggregationPipeline,
18-
} from 'mongoose';
11+
import { Model, Types } from 'mongoose';
1912

20-
import { BaseRepository, DeleteResult } from '@/utils/generics/base-repository';
21-
import { TFilterQuery } from '@/utils/types/filter.types';
13+
import { BaseRepository } from '@/utils/generics/base-repository';
14+
import {
15+
Args,
16+
postDelete,
17+
preCreate,
18+
preDelete,
19+
preUpdate,
20+
preUpdateMany,
21+
} from '@/utils/types/lifecycle-hook-manager.types';
2222

2323
import { BlockCreateDto, BlockDto, BlockUpdateDto } from '../dto/block.dto';
2424
import {
@@ -63,10 +63,8 @@ export class BlockRepository extends BaseRepository<
6363
*
6464
* @param doc - The document that is being created.
6565
*/
66-
async preCreate(
67-
_doc: Document<unknown, object, Block> & Block & { _id: Types.ObjectId },
68-
): Promise<void> {
69-
if (_doc) this.checkDeprecatedAttachmentUrl(_doc);
66+
async preCreate(...[doc]: Args<preCreate<Block>>): Promise<void> {
67+
if (doc) this.checkDeprecatedAttachmentUrl(doc);
7068
}
7169

7270
/**
@@ -77,19 +75,9 @@ export class BlockRepository extends BaseRepository<
7775
* @param updates - The update data.
7876
*/
7977
async preUpdate(
80-
_query: Query<
81-
Document<Block, any, any>,
82-
Document<Block, any, any>,
83-
unknown,
84-
Block,
85-
'findOneAndUpdate'
86-
>,
87-
criteria: TFilterQuery<Block>,
88-
updates:
89-
| UpdateWithAggregationPipeline
90-
| UpdateQuery<Document<Block, any, any>>,
78+
...[, criteria, updates]: Args<preUpdate<Block>>
9179
): Promise<void> {
92-
const update: BlockUpdateDto = updates?.['$set'];
80+
const update = '$set' in updates ? updates.$set : {};
9381

9482
if (update?.category) {
9583
const movedBlock = await this.findOne(criteria);
@@ -109,7 +97,10 @@ export class BlockRepository extends BaseRepository<
10997
{ $set: { attachedBlock: null } },
11098
);
11199
}
112-
this.checkDeprecatedAttachmentUrl(update);
100+
101+
if (update) {
102+
this.checkDeprecatedAttachmentUrl(update);
103+
}
113104
}
114105

115106
/**
@@ -120,18 +111,10 @@ export class BlockRepository extends BaseRepository<
120111
* @param updates - The update data.
121112
*/
122113
async preUpdateMany(
123-
_query: Query<
124-
Document<Block, any, any>,
125-
Document<Block, any, any>,
126-
unknown,
127-
Block,
128-
'updateMany',
129-
Record<string, never>
130-
>,
131-
criteria: TFilterQuery<Block>,
132-
updates: UpdateQuery<Document<Block, any, any>>,
114+
...[, criteria, updates]: Args<preUpdateMany<Block>>
133115
): Promise<void> {
134-
const categoryId: string = updates.$set.category;
116+
const categoryId = '$set' in updates && updates.$set?.category;
117+
135118
if (categoryId) {
136119
const movedBlocks = await this.find(criteria);
137120

@@ -226,16 +209,7 @@ export class BlockRepository extends BaseRepository<
226209
* @param query - The delete query.
227210
* @param result - The result of the delete operation.
228211
*/
229-
async postDelete(
230-
_query: Query<
231-
DeleteResult,
232-
Document<Block, any, any>,
233-
unknown,
234-
Block,
235-
'deleteOne' | 'deleteMany'
236-
>,
237-
result: DeleteResult,
238-
) {
212+
async postDelete(...[, result]: Args<postDelete<Block>>) {
239213
if (result.deletedCount > 0) {
240214
}
241215
}
@@ -247,16 +221,7 @@ export class BlockRepository extends BaseRepository<
247221
* @param query - The delete query.
248222
* @param criteria - The filter criteria for finding blocks to delete.
249223
*/
250-
async preDelete(
251-
_query: Query<
252-
DeleteResult,
253-
Document<Block, any, any>,
254-
unknown,
255-
Block,
256-
'deleteOne' | 'deleteMany'
257-
>,
258-
criteria: TFilterQuery<Block>,
259-
) {
224+
async preDelete(...[, criteria]: Args<preDelete<Block>>) {
260225
const docsToDelete = await this.model.find(criteria);
261226
const idsToDelete = docsToDelete.map(({ id }) => id);
262227
if (idsToDelete.length > 0) {

api/src/chat/repositories/category.repository.ts

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@
88

99
import { ForbiddenException, Injectable, Optional } from '@nestjs/common';
1010
import { InjectModel } from '@nestjs/mongoose';
11-
import { Document, Model, Query } from 'mongoose';
11+
import { Model } from 'mongoose';
1212

13-
import { BaseRepository, DeleteResult } from '@/utils/generics/base-repository';
14-
import { TFilterQuery } from '@/utils/types/filter.types';
13+
import { BaseRepository } from '@/utils/generics/base-repository';
14+
import { Args, preDelete } from '@/utils/types/lifecycle-hook-manager.types';
1515

1616
import { CategoryDto } from '../dto/category.dto';
1717
import { Category } from '../schemas/category.schema';
@@ -41,16 +41,7 @@ export class CategoryRepository extends BaseRepository<
4141
* @param query - The delete query.
4242
* @param criteria - The filter criteria for finding blocks to delete.
4343
*/
44-
async preDelete(
45-
query: Query<
46-
DeleteResult,
47-
Document<Category, any, any>,
48-
unknown,
49-
Category,
50-
'deleteOne' | 'deleteMany'
51-
>,
52-
criteria: TFilterQuery<Category>,
53-
) {
44+
async preDelete(...[query, criteria]: Args<preDelete<Category>>) {
5445
criteria = query.getQuery();
5546
const ids = Array.isArray(criteria._id?.$in)
5647
? criteria._id.$in

api/src/chat/repositories/context-var.repository.ts

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,10 @@ import {
1313
Optional,
1414
} from '@nestjs/common';
1515
import { InjectModel } from '@nestjs/mongoose';
16-
import { Document, Model, Query } from 'mongoose';
16+
import { Model } from 'mongoose';
1717

18-
import { BaseRepository, DeleteResult } from '@/utils/generics/base-repository';
19-
import { TFilterQuery } from '@/utils/types/filter.types';
18+
import { BaseRepository } from '@/utils/generics/base-repository';
19+
import { Args, preDelete } from '@/utils/types/lifecycle-hook-manager.types';
2020

2121
import { ContextVarDto } from '../dto/context-var.dto';
2222
import { ContextVar } from '../schemas/context-var.schema';
@@ -47,16 +47,7 @@ export class ContextVarRepository extends BaseRepository<
4747
* @param query - The delete query.
4848
* @param criteria - The filter criteria for finding context vars to delete.
4949
*/
50-
async preDelete(
51-
_query: Query<
52-
DeleteResult,
53-
Document<ContextVar, any, any>,
54-
unknown,
55-
ContextVar,
56-
'deleteOne' | 'deleteMany'
57-
>,
58-
criteria: TFilterQuery<ContextVar>,
59-
) {
50+
async preDelete(...[, criteria]: Args<preDelete<ContextVar>>) {
6051
const ids = Array.isArray(criteria._id) ? criteria._id : [criteria._id];
6152

6253
for (const id of ids) {

api/src/chat/repositories/label.repository.ts

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,19 @@
88

99
import { Injectable } from '@nestjs/common';
1010
import { InjectModel } from '@nestjs/mongoose';
11-
import { Document, Model, Query } from 'mongoose';
11+
import { Model } from 'mongoose';
1212

13-
import { BaseRepository, DeleteResult } from '@/utils/generics/base-repository';
14-
import { TFilterQuery } from '@/utils/types/filter.types';
13+
import { BaseRepository } from '@/utils/generics/base-repository';
14+
import {
15+
Args,
16+
postCreate,
17+
preDelete,
18+
} from '@/utils/types/lifecycle-hook-manager.types';
1519

1620
import { LabelDto } from '../dto/label.dto';
1721
import {
1822
Label,
1923
LABEL_POPULATE,
20-
LabelDocument,
2124
LabelFull,
2225
LabelPopulate,
2326
} from '../schemas/label.schema';
@@ -40,7 +43,7 @@ export class LabelRepository extends BaseRepository<
4043
*
4144
* @returns A promise that resolves when the update operation is complete.
4245
*/
43-
async postCreate(created: LabelDocument): Promise<void> {
46+
async postCreate(...[created]: Args<postCreate<Label>>): Promise<void> {
4447
this.eventEmitter.emit(
4548
'hook:label:create',
4649
created,
@@ -68,16 +71,7 @@ export class LabelRepository extends BaseRepository<
6871
*
6972
* @returns {Promise<void>} A promise that resolves once the event is emitted.
7073
*/
71-
async preDelete(
72-
_query: Query<
73-
DeleteResult,
74-
Document<Label, any, any>,
75-
unknown,
76-
Label,
77-
'deleteOne' | 'deleteMany'
78-
>,
79-
_criteria: TFilterQuery<Label>,
80-
): Promise<void> {
74+
async preDelete(...[, _criteria]: Args<preDelete<Label>>): Promise<void> {
8175
const ids = Array.isArray(_criteria._id?.$in)
8276
? _criteria._id.$in
8377
: Array.isArray(_criteria._id)

api/src/chat/repositories/subscriber.repository.ts

Lines changed: 8 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -8,23 +8,20 @@
88

99
import { Injectable } from '@nestjs/common';
1010
import { InjectModel } from '@nestjs/mongoose';
11-
import {
12-
Document,
13-
Model,
14-
Query,
15-
UpdateQuery,
16-
UpdateWithAggregationPipeline,
17-
} from 'mongoose';
11+
import { Model } from 'mongoose';
1812

1913
import { BotStatsType } from '@/analytics/schemas/bot-stats.schema';
2014
import { BaseRepository } from '@/utils/generics/base-repository';
21-
import { TFilterQuery } from '@/utils/types/filter.types';
15+
import {
16+
Args,
17+
postCreate,
18+
preUpdate,
19+
} from '@/utils/types/lifecycle-hook-manager.types';
2220

2321
import { SubscriberDto, SubscriberUpdateDto } from '../dto/subscriber.dto';
2422
import {
2523
Subscriber,
2624
SUBSCRIBER_POPULATE,
27-
SubscriberDocument,
2825
SubscriberFull,
2926
SubscriberPopulate,
3027
} from '../schemas/subscriber.schema';
@@ -45,7 +42,7 @@ export class SubscriberRepository extends BaseRepository<
4542
*
4643
* @param created - The newly created subscriber document.
4744
*/
48-
async postCreate(created: SubscriberDocument): Promise<void> {
45+
async postCreate(...[created]: Args<postCreate<Subscriber>>): Promise<void> {
4946
this.eventEmitter.emit(
5047
'hook:stats:entry',
5148
BotStatsType.new_users,
@@ -63,17 +60,7 @@ export class SubscriberRepository extends BaseRepository<
6360
* @param updates - The update data, which may include fields like `assignedTo`.
6461
*/
6562
async preUpdate(
66-
_query: Query<
67-
Document<Subscriber, any, any>,
68-
Document<Subscriber, any, any>,
69-
unknown,
70-
Subscriber,
71-
'findOneAndUpdate'
72-
>,
73-
criteria: TFilterQuery<Subscriber>,
74-
updates:
75-
| UpdateWithAggregationPipeline
76-
| UpdateQuery<Document<Subscriber, any, any>>,
63+
...[, criteria, updates]: Args<preUpdate<Subscriber>>
7764
): Promise<void> {
7865
const subscriberUpdates: SubscriberUpdateDto = updates?.['$set'];
7966

api/src/cms/repositories/content-type.repository.ts

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@
88

99
import { ForbiddenException, Injectable, Optional } from '@nestjs/common';
1010
import { InjectModel } from '@nestjs/mongoose';
11-
import { Document, Model, Query } from 'mongoose';
11+
import { Model } from 'mongoose';
1212

1313
import { BlockService } from '@/chat/services/block.service';
14-
import { BaseRepository, DeleteResult } from '@/utils/generics/base-repository';
15-
import { TFilterQuery } from '@/utils/types/filter.types';
14+
import { BaseRepository } from '@/utils/generics/base-repository';
15+
import { Args, preDelete } from '@/utils/types/lifecycle-hook-manager.types';
1616

1717
import { ContentTypeDto } from '../dto/contentType.dto';
1818
import { ContentType } from '../schemas/content-type.schema';
@@ -42,25 +42,16 @@ export class ContentTypeRepository extends BaseRepository<
4242
* @param query - The query object used for deletion.
4343
* @param criteria - The filter query to identify the content type entity to delete.
4444
*/
45-
async preDelete(
46-
_query: Query<
47-
DeleteResult,
48-
Document<ContentType, any, any>,
49-
unknown,
50-
ContentType,
51-
'deleteOne' | 'deleteMany'
52-
>,
53-
criteria: TFilterQuery<ContentType>,
54-
) {
55-
const entityId: string = criteria._id as string;
45+
async preDelete(...[, criteria]: Args<preDelete<ContentType>>) {
46+
const entityId = criteria._id;
5647
const associatedBlocks = await this.blockService?.findOne({
5748
'options.content.entity': entityId,
5849
});
5950
if (associatedBlocks) {
6051
throw new ForbiddenException(`Content type have blocks associated to it`);
6152
}
62-
if (criteria._id) {
63-
await this.contentModel.deleteMany({ entity: criteria._id });
53+
if (entityId) {
54+
await this.contentModel.deleteMany({ entity: entityId });
6455
} else {
6556
throw new Error(
6657
'Attempted to delete content type using unknown criteria',

0 commit comments

Comments
 (0)