1
- import { Injectable } from '@nestjs/common' ;
1
+ import { Injectable , Logger } from '@nestjs/common' ;
2
2
3
3
import { ObjectMetadataInterface } from 'src/engine/metadata-modules/field-metadata/interfaces/object-metadata.interface' ;
4
4
@@ -8,44 +8,92 @@ import {
8
8
RecordPositionQueryType ,
9
9
} from 'src/engine/api/graphql/workspace-query-builder/factories/record-position-query.factory' ;
10
10
import { RecordPositionFactory } from 'src/engine/api/graphql/workspace-query-runner/factories/record-position.factory' ;
11
+ import { ObjectMetadataService } from 'src/engine/metadata-modules/object-metadata/object-metadata.service' ;
11
12
12
13
@Injectable ( )
13
14
export class RecordPositionBackfillService {
15
+ private readonly logger = new Logger ( RecordPositionBackfillService . name ) ;
14
16
constructor (
17
+ private readonly objectMetadataService : ObjectMetadataService ,
15
18
private readonly recordPositionFactory : RecordPositionFactory ,
16
19
private readonly recordPositionQueryFactory : RecordPositionQueryFactory ,
17
20
private readonly workspaceDataSourceService : WorkspaceDataSourceService ,
18
21
) { }
19
22
20
- async backfill (
21
- workspaceId : string ,
22
- objectMetadata : { nameSingular : string ; isCustom : boolean } ,
23
- recordId : string ,
24
- ) {
25
- const position = await this . recordPositionFactory . create (
26
- 'last' ,
27
- objectMetadata as ObjectMetadataInterface ,
28
- workspaceId ,
29
- ) ;
30
-
23
+ async backfill ( workspaceId : string , dryRun : boolean ) {
31
24
const dataSourceSchema =
32
25
this . workspaceDataSourceService . getSchemaName ( workspaceId ) ;
33
26
34
- const [ query , params ] = await this . recordPositionQueryFactory . create (
35
- {
36
- recordPositionQueryType : RecordPositionQueryType . UPDATE_POSITION ,
37
- recordId,
38
- positionValue : position ,
39
- } ,
40
- objectMetadata as ObjectMetadataInterface ,
41
- dataSourceSchema ,
42
- ) ;
43
-
44
- this . workspaceDataSourceService . executeRawQuery (
45
- query ,
46
- params ,
47
- workspaceId ,
48
- undefined ,
49
- ) ;
27
+ const objectMetadataEntities =
28
+ await this . objectMetadataService . findManyWithinWorkspace ( workspaceId , {
29
+ where : { isSystem : false } ,
30
+ } ) ;
31
+
32
+ const objectMetadataWithPosition =
33
+ objectMetadataEntities . filter ( hasPositionField ) ;
34
+
35
+ for ( const objectMetadata of objectMetadataWithPosition ) {
36
+ const [ recordsWithoutPositionQuery , recordsWithoutPositionQueryParams ] =
37
+ await this . recordPositionQueryFactory . create (
38
+ {
39
+ recordPositionQueryType : RecordPositionQueryType . FIND_BY_POSITION ,
40
+ positionValue : null ,
41
+ } ,
42
+ objectMetadata ,
43
+ dataSourceSchema ,
44
+ ) ;
45
+
46
+ const recordsWithoutPosition =
47
+ await this . workspaceDataSourceService . executeRawQuery (
48
+ recordsWithoutPositionQuery ,
49
+ recordsWithoutPositionQueryParams ,
50
+ workspaceId ,
51
+ undefined ,
52
+ ) ;
53
+
54
+ const position = await this . recordPositionFactory . create (
55
+ 'last' ,
56
+ objectMetadata as ObjectMetadataInterface ,
57
+ workspaceId ,
58
+ ) ;
59
+
60
+ for (
61
+ let recordIndex = 0 ;
62
+ recordIndex < recordsWithoutPosition . length ;
63
+ recordIndex ++
64
+ ) {
65
+ const recordId = recordsWithoutPosition [ recordIndex ] . id ;
66
+ const backfilledPosition = position + recordIndex ;
67
+
68
+ this . logger . log (
69
+ `Backfilling position ${ backfilledPosition } for ${ objectMetadata . nameSingular } ${ recordId } ` ,
70
+ ) ;
71
+
72
+ if ( dryRun ) {
73
+ continue ;
74
+ }
75
+
76
+ const [ query , params ] = await this . recordPositionQueryFactory . create (
77
+ {
78
+ recordPositionQueryType : RecordPositionQueryType . UPDATE_POSITION ,
79
+ recordId : recordsWithoutPosition [ recordIndex ] . id ,
80
+ positionValue : position + recordIndex ,
81
+ } ,
82
+ objectMetadata ,
83
+ dataSourceSchema ,
84
+ ) ;
85
+
86
+ await this . workspaceDataSourceService . executeRawQuery (
87
+ query ,
88
+ params ,
89
+ workspaceId ,
90
+ undefined ,
91
+ ) ;
92
+ }
93
+ }
50
94
}
51
95
}
96
+
97
+ const hasPositionField = ( objectMetadata : ObjectMetadataInterface ) =>
98
+ [ 'company' , 'opportunity' , 'person' ] . includes ( objectMetadata . nameSingular ) ||
99
+ objectMetadata . isCustom ;
0 commit comments