@@ -9,80 +9,32 @@ const LOGGER = new (require('./lib/logger'))();
9
9
* Transform AWS CloudWatch events from AWS CodeCommit
10
10
*/
11
11
12
- let TransformCodeCommitEvents = ( data , recordNumber ) => {
12
+ let transformCodeCommitEvents = ( data , recordNumber ) => {
13
13
LOGGER . log ( 'INFO' , 'Start transforming CodeCommit CW Event ' + recordNumber . toString ( ) ) ;
14
14
15
15
let detailData = { } ;
16
16
let requestParametersData = { } ;
17
- let responseElementsData = { } ;
18
17
let transformedRecord = { } ;
19
18
let transformedDetail = { } ;
20
19
21
20
//Process event data
22
21
for ( let key in data ) {
23
22
//Keep all key values that are not under detail tag as they are common in all cloudwatch events
24
23
if ( key !== 'detail' ) {
25
- if ( ! transformedRecord . hasOwnProperty ( key ) ) {
26
- if ( key !== 'detail-type' ) transformedRecord [ key ] = data [ key ] ;
27
- //rename key detail-type to detail_type to support athena query
28
- else transformedRecord [ 'detail_type' ] = data [ key ] ;
29
- }
24
+ transformedRecord = getCWEventCommonData ( key , data , transformedRecord ) ;
30
25
}
31
26
//process key values under detail tag that are specific only for this event
32
27
else {
33
28
detailData = data [ 'detail' ] ;
34
- if ( detailData . hasOwnProperty ( 'eventName' ) ) transformedDetail [ 'eventName' ] = detailData [ 'eventName' ] ;
35
-
36
- //process commits made from command line git commands
37
- if ( detailData . hasOwnProperty ( 'userIdentity' ) && detailData [ 'userIdentity' ] != null ) {
38
- let userIdentity = detailData [ 'userIdentity' ] ;
39
- if ( userIdentity [ 'userName' ] != null ) transformedDetail [ 'authorName' ] = userIdentity [ 'userName' ] ;
40
- //Fix missing userName in codecommit event when pushes are made by assumed role credentials
41
- else if ( userIdentity [ 'sessionContext' ] [ 'sessionIssuer' ] [ 'userName' ] != null )
42
- transformedDetail [ 'authorName' ] = userIdentity [ 'sessionContext' ] [ 'sessionIssuer' ] [ 'userName' ] ;
43
- else if ( userIdentity [ 'principalId' ] != null )
44
- transformedDetail [ 'authorName' ] = userIdentity [ 'principalId' ] . split ( ':' ) [ 1 ] ;
45
- }
46
-
47
- //process commits made from aws codecommit console
48
- if ( detailData . hasOwnProperty ( 'requestParameters' ) && detailData [ 'requestParameters' ] != null ) {
49
- requestParametersData = detailData [ 'requestParameters' ] ;
50
- if ( requestParametersData . hasOwnProperty ( 'repositoryName' ) )
51
- transformedDetail [ 'repositoryName' ] = requestParametersData [ 'repositoryName' ] ;
52
- if ( requestParametersData . hasOwnProperty ( 'branchName' ) )
53
- transformedDetail [ 'branchName' ] = requestParametersData [ 'branchName' ] ;
54
- if ( requestParametersData . hasOwnProperty ( 'name' ) )
55
- transformedDetail [ 'authorName' ] = requestParametersData [ 'name' ] ;
56
- if ( requestParametersData . hasOwnProperty ( 'commitId' ) )
57
- transformedDetail [ 'commitId' ] = requestParametersData [ 'commitId' ] ;
58
- }
59
- // If requestParameters is not found in source data, stop further processing but return empty json object to drop this record
60
- else {
61
- return { } ;
62
- }
63
-
64
- //process commits made from aws codecommit console
65
- if ( detailData . hasOwnProperty ( 'responseElements' ) && detailData [ 'responseElements' ] != null ) {
66
- responseElementsData = detailData [ 'responseElements' ] ;
67
- if ( ! transformedDetail . hasOwnProperty ( 'commitId' ) && responseElementsData . hasOwnProperty ( 'commitId' ) )
68
- transformedDetail [ 'commitId' ] = responseElementsData [ 'commitId' ] ;
69
- }
70
-
71
- //process commits made from command line git commands
72
- if ( Object . keys ( requestParametersData ) . length > 0 && requestParametersData . hasOwnProperty ( 'references' ) ) {
73
- let references = requestParametersData [ 'references' ] [ 0 ] ;
74
- if ( references . hasOwnProperty ( 'commit' ) && ! transformedDetail . hasOwnProperty ( 'commitId' ) )
75
- transformedDetail [ 'commitId' ] = references [ 'commit' ] ;
76
- if ( references . hasOwnProperty ( 'ref' ) && ! transformedDetail . hasOwnProperty ( 'branchName' ) )
77
- transformedDetail [ 'branchName' ] = references [ 'ref' ] . split ( '/' ) . pop ( ) ;
78
- }
79
-
80
- //process commits made from command line git commands
81
- if ( detailData . hasOwnProperty ( 'additionalEventData' ) ) {
82
- let additionalEventData = detailData [ 'additionalEventData' ] ;
83
- if ( additionalEventData . hasOwnProperty ( 'repositoryName' ) && ! transformedDetail . hasOwnProperty ( 'repositoryName' ) )
84
- transformedDetail [ 'repositoryName' ] = additionalEventData [ 'repositoryName' ] ;
85
- }
29
+ transformedDetail = getEventName ( detailData , transformedDetail ) ;
30
+ transformedDetail = getCommandLineGitCommitData ( detailData , transformedDetail ) ;
31
+ const consoleGitCommitData = getCodeCommitConsoleGitCommitData ( detailData , transformedDetail , requestParametersData ) ;
32
+ // If empty json object is found, stop further processing but return empty json object to drop this record
33
+ if ( Object . keys ( consoleGitCommitData [ 0 ] ) . length === 0 ) return { } ;
34
+ requestParametersData = consoleGitCommitData [ 0 ] ;
35
+ transformedDetail = consoleGitCommitData [ 1 ] ;
36
+ transformedDetail = getCodeCommitConsoleCommitID ( detailData , transformedDetail ) ;
37
+ transformedDetail = getCommandLineGitCommitAdditionalData ( detailData , transformedDetail , requestParametersData ) ;
86
38
87
39
// if no commit Id (possibly due to codecommit error or other reasons), return empty json object to drop this record
88
40
if ( ! transformedDetail . hasOwnProperty ( 'commitId' ) ) {
@@ -99,6 +51,117 @@ let TransformCodeCommitEvents = (data, recordNumber) => {
99
51
return transformedRecord ;
100
52
} ;
101
53
54
+ /**
55
+ * Keep all key values that are not under detail tag as they are common in all cloudwatch events
56
+ * @param {string } key - key in the CodeCommit CloudWatch raw event
57
+ * @param {json } data - CodeCommit CloudWatch raw event
58
+ * @param {json } transformedRecord - Transformed CodeCommit record
59
+ */
60
+ const getCWEventCommonData = ( key , data , transformedRecord ) => {
61
+ if ( ! transformedRecord . hasOwnProperty ( key ) ) {
62
+ if ( key !== 'detail-type' ) transformedRecord [ key ] = data [ key ] ;
63
+ //rename key detail-type to detail_type to support athena query
64
+ else transformedRecord [ 'detail_type' ] = data [ key ] ;
65
+ }
66
+
67
+ return transformedRecord ;
68
+ } ;
69
+
70
+ /**
71
+ * Get eventName from CodeCommit CloudWatch raw event data under detail key
72
+ * @param {json } detailData - CodeCommit CloudWatch raw event data under detail key
73
+ * @param {json } transformedDetail - Transformed CodeCommit record under detail key
74
+ */
75
+ const getEventName = ( detailData , transformedDetail ) => {
76
+ if ( detailData . hasOwnProperty ( 'eventName' ) ) transformedDetail [ 'eventName' ] = detailData [ 'eventName' ] ;
77
+
78
+ return transformedDetail ;
79
+ } ;
80
+
81
+ /**
82
+ * Process commits made from command line git commands
83
+ * @param {json } detailData - CodeCommit CloudWatch raw event data under detail key
84
+ * @param {json } transformedDetail - Transformed CodeCommit record under detail key
85
+ */
86
+ const getCommandLineGitCommitData = ( detailData , transformedDetail ) => {
87
+ if ( ! detailData [ 'userIdentity' ] ) return transformedDetail ;
88
+
89
+ let userIdentity = detailData [ 'userIdentity' ] ;
90
+ if ( userIdentity [ 'userName' ] != null ) transformedDetail [ 'authorName' ] = userIdentity [ 'userName' ] ;
91
+ //Fix missing userName in codecommit event when pushes are made by assumed role credentials
92
+ else if ( userIdentity [ 'sessionContext' ] [ 'sessionIssuer' ] [ 'userName' ] != null )
93
+ transformedDetail [ 'authorName' ] = userIdentity [ 'sessionContext' ] [ 'sessionIssuer' ] [ 'userName' ] ;
94
+ else if ( userIdentity [ 'principalId' ] != null )
95
+ transformedDetail [ 'authorName' ] = userIdentity [ 'principalId' ] . split ( ':' ) [ 1 ] ;
96
+
97
+ return transformedDetail ;
98
+ } ;
99
+
100
+ /**
101
+ * Process commits made from AWS CodeCommit console
102
+ * @param {json } detailData - CodeCommit CloudWatch raw event data under detail key
103
+ * @param {json } transformedDetail - Transformed CodeCommit record under detail key
104
+ * @param {json } requestParametersData - data under requestParameters key
105
+ */
106
+ const getCodeCommitConsoleGitCommitData = ( detailData , transformedDetail , requestParametersData ) => {
107
+ if ( detailData . hasOwnProperty ( 'requestParameters' ) && detailData [ 'requestParameters' ] != null ) {
108
+ requestParametersData = detailData [ 'requestParameters' ] ;
109
+ if ( requestParametersData . hasOwnProperty ( 'repositoryName' ) )
110
+ transformedDetail [ 'repositoryName' ] = requestParametersData [ 'repositoryName' ] ;
111
+ if ( requestParametersData . hasOwnProperty ( 'branchName' ) )
112
+ transformedDetail [ 'branchName' ] = requestParametersData [ 'branchName' ] ;
113
+ if ( requestParametersData . hasOwnProperty ( 'name' ) )
114
+ transformedDetail [ 'authorName' ] = requestParametersData [ 'name' ] ;
115
+ if ( requestParametersData . hasOwnProperty ( 'commitId' ) )
116
+ transformedDetail [ 'commitId' ] = requestParametersData [ 'commitId' ] ;
117
+ return [ requestParametersData , transformedDetail ]
118
+ }
119
+ // If requestParameters is not found in source data, return empty json object to drop this record
120
+ else {
121
+ return [ { } , { } ] ;
122
+ }
123
+ }
124
+
125
+
126
+ /**
127
+ * Get commit id for git commit made from AWS CodeCommit console
128
+ * @param {json } detailData - CodeCommit CloudWatch raw event data under detail key
129
+ * @param {json } transformedDetail - Transformed CodeCommit record under detail key
130
+ * @param {json } requestParametersData - data under requestParameters key
131
+ */
132
+ const getCodeCommitConsoleCommitID = ( detailData , transformedDetail ) => {
133
+ //process commits made from aws codecommit console
134
+ let responseElementsData = { }
135
+ if ( detailData . hasOwnProperty ( 'responseElements' ) && detailData [ 'responseElements' ] != null ) {
136
+ responseElementsData = detailData [ 'responseElements' ] ;
137
+ if ( ! transformedDetail . hasOwnProperty ( 'commitId' ) && responseElementsData . hasOwnProperty ( 'commitId' ) )
138
+ transformedDetail [ 'commitId' ] = responseElementsData [ 'commitId' ] ;
139
+ }
140
+ return transformedDetail ;
141
+ } ;
142
+
143
+ /**
144
+ * Extract additional data from commits made from command line git commands
145
+ * @param {json } detailData - CodeCommit CloudWatch raw event data under detail key
146
+ * @param {json } transformedDetail - Transformed CodeCommit record under detail key
147
+ * @param {json } requestParametersData - data under requestParameters key
148
+ */
149
+ const getCommandLineGitCommitAdditionalData = ( detailData , transformedDetail , requestParametersData ) => {
150
+ if ( Object . keys ( requestParametersData ) . length > 0 && requestParametersData . hasOwnProperty ( 'references' ) ) {
151
+ let references = requestParametersData [ 'references' ] [ 0 ] ;
152
+ if ( references . hasOwnProperty ( 'commit' ) && ! transformedDetail . hasOwnProperty ( 'commitId' ) )
153
+ transformedDetail [ 'commitId' ] = references [ 'commit' ] ;
154
+ if ( references . hasOwnProperty ( 'ref' ) && ! transformedDetail . hasOwnProperty ( 'branchName' ) )
155
+ transformedDetail [ 'branchName' ] = references [ 'ref' ] . split ( '/' ) . pop ( ) ;
156
+ }
157
+ if ( detailData . hasOwnProperty ( 'additionalEventData' ) ) {
158
+ let additionalEventData = detailData [ 'additionalEventData' ] ;
159
+ if ( additionalEventData . hasOwnProperty ( 'repositoryName' ) && ! transformedDetail . hasOwnProperty ( 'repositoryName' ) )
160
+ transformedDetail [ 'repositoryName' ] = additionalEventData [ 'repositoryName' ] ;
161
+ }
162
+ return transformedDetail ;
163
+ } ;
164
+
102
165
module . exports = {
103
- transformCodeCommitEvents : TransformCodeCommitEvents
166
+ transformCodeCommitEvents : transformCodeCommitEvents
104
167
} ;
0 commit comments