1
- const cds = require ( '@sap/cds/lib' )
1
+ const cds = require ( '@sap/cds/lib' )
2
+
3
+ const isChangeTracked = ( entity ) => (
4
+ entity [ '@changelog' ]
5
+ || entity [ '@changelog.keys' ]
6
+ // || entity.elements && Object.values(entity.elements).some(e => e['@changelog'])
7
+ )
8
+
2
9
3
10
// Unfold @changelog annotations in loaded model
4
11
cds . on ( 'loaded' , m => {
5
12
6
13
// Get definitions from Dummy entity in our models
7
14
const { 'sap.changelog.aspect' : aspect } = m . definitions ; if ( ! aspect ) return // some other model
8
- const { '@UI.Facets' : [ facet ] , elements : { changes} } = aspect
15
+ const { '@UI.Facets' : [ facet ] , elements : { changes } } = aspect
9
16
changes . on . pop ( ) // remove ID -> filled in below
10
17
11
18
for ( let name in m . definitions ) {
12
19
const entity = m . definitions [ name ]
13
- if ( entity [ '@changelog' ] || entity [ '@changelog.keys' ] ) {
20
+ if ( isChangeTracked ( entity ) ) {
14
21
15
22
// Determine entity keys
16
- const keys = [ ] , { elements :elms } = entity
23
+ const keys = [ ] , { elements : elms } = entity
17
24
for ( let e in elms ) if ( elms [ e ] . key ) keys . push ( e )
18
25
19
26
// Add association to ChangeView...
20
- const on = [ ...changes . on ] ; keys . forEach ( ( k , i ) => { i && on . push ( '||' ) ; on . push ( { ref :[ k ] } ) } )
27
+ const on = [ ...changes . on ] ; keys . forEach ( ( k , i ) => { i && on . push ( '||' ) ; on . push ( { ref : [ k ] } ) } )
21
28
const assoc = { ...changes , on }
22
29
const query = entity . projection || entity . query ?. SELECT
23
30
if ( query ) {
24
- ( query . columns ??= [ '*' ] ) . push ( { as : 'changes' , cast : assoc } )
31
+ ( query . columns ??= [ '*' ] ) . push ( { as : 'changes' , cast : assoc } )
25
32
} else {
26
33
entity . elements . changes = assoc
27
34
}
28
35
29
36
// Add defaults for @changelog .keys
30
- entity [ '@changelog.keys' ] ??= keys . map ( k => ( { '=' :k } ) )
37
+ entity [ '@changelog.keys' ] ??= keys . map ( k => ( { '=' : k } ) )
31
38
32
39
// Add UI.Facet for Change History List
33
40
entity [ '@UI.Facets' ] ?. push ( facet )
@@ -36,4 +43,22 @@ cds.on('loaded', m => {
36
43
} )
37
44
38
45
// Add generic change tracking handlers
39
- cds . on ( 'served' , ( ) => require ( "./lib/change-log" ) ( ) )
46
+ cds . on ( 'served' , ( ) => {
47
+ const { _logChanges, _afterReadChangeView } = require ( "./lib/change-log" )
48
+ for ( const srv of cds . services ) {
49
+ if ( srv instanceof cds . ApplicationService ) {
50
+ let any = false
51
+ for ( const entity of Object . values ( srv . entities ) ) {
52
+ if ( isChangeTracked ( entity ) || Object . values ( entity . elements ) . some ( e => e [ '@changelog' ] ) ) {
53
+ cds . db . before ( "CREATE" , entity , _logChanges )
54
+ cds . db . before ( "UPDATE" , entity , _logChanges )
55
+ cds . db . before ( "DELETE" , entity , _logChanges )
56
+ any = true
57
+ }
58
+ }
59
+ if ( any && srv . entities . ChangeView ) {
60
+ srv . after ( "READ" , srv . entities . ChangeView , _afterReadChangeView )
61
+ }
62
+ }
63
+ }
64
+ } )
0 commit comments