1- // TODO Add Optional IAM saml provider
1+ import { ServiceConnection } from '@cloudgraph/sdk'
2+ import { isEmpty } from 'lodash'
3+ import services from '../../enums/services'
4+ import { RawAwsCognitoIdentityPool } from './data'
5+ import { RawAwsIamRole } from '../iamRole/data'
6+ import { globalRegionName } from '../../enums/regions'
7+
8+ /**
9+ * Cognito Identity Pool
10+ */
11+
12+ export default ( {
13+ service : identityPool ,
14+ data,
15+ region,
16+ } : {
17+ data : { name : string ; data : { [ property : string ] : any [ ] } } [ ]
18+ service : RawAwsCognitoIdentityPool
19+ region : string
20+ } ) : { [ key : string ] : ServiceConnection [ ] } => {
21+ const connections : ServiceConnection [ ] = [ ]
22+
23+ const {
24+ IdentityPoolId : id ,
25+ identityPoolRoles,
26+ SamlProviderARNs = [ ] ,
27+ OpenIdConnectProviderARNs = [ ] ,
28+ } = identityPool
29+
30+ /**
31+ * Find related IAM Roles
32+ */
33+ const roles : { name : string ; data : { [ property : string ] : any [ ] } } =
34+ data . find ( ( { name } ) => name === services . iamRole )
35+
36+ const iamRoleArns = Object . values ( identityPoolRoles ?. Roles || { } )
37+
38+ if ( roles ?. data ?. [ globalRegionName ] ) {
39+ const dataAtRegion : RawAwsIamRole [ ] = roles . data [ globalRegionName ] . filter ( role =>
40+ iamRoleArns . includes ( role . Arn )
41+ )
42+ if ( ! isEmpty ( dataAtRegion ) ) {
43+ for ( const instance of dataAtRegion ) {
44+ const { Arn : arn } : RawAwsIamRole = instance
45+
46+ connections . push ( {
47+ id : arn ,
48+ resourceType : services . iamRole ,
49+ relation : 'child' ,
50+ field : 'iamRoles' ,
51+ } )
52+ }
53+ }
54+ }
55+
56+ /**
57+ * Find iamSamlProvider
58+ * related to this cognito identity pool
59+ */
60+ const iamSamlProviders = data . find ( ( { name } ) => name === services . iamSamlProvider )
61+ if ( iamSamlProviders ?. data ?. [ region ] ) {
62+ const dataInRegion = iamSamlProviders . data [ region ] . filter ( provider =>
63+ SamlProviderARNs . includes ( provider . arn )
64+ )
65+
66+ if ( ! isEmpty ( dataInRegion ) ) {
67+ for ( const provider of dataInRegion ) {
68+ connections . push ( {
69+ id : provider . KeyId ,
70+ resourceType : services . iamSamlProvider ,
71+ relation : 'child' ,
72+ field : 'iamSamlProviders' ,
73+ } )
74+ }
75+ }
76+ }
77+
78+ /**
79+ * Find iamOpenIdConnectProvider
80+ * related to this cognito identity pool
81+ */
82+ const iamOpenIdConnectProviders = data . find ( ( { name } ) => name === services . iamOpenIdConnectProvider )
83+ if ( iamOpenIdConnectProviders ?. data ?. [ region ] ) {
84+ const dataInRegion = iamOpenIdConnectProviders . data [ region ] . filter ( provider =>
85+ OpenIdConnectProviderARNs . includes ( provider . arn )
86+ )
87+
88+ if ( ! isEmpty ( dataInRegion ) ) {
89+ for ( const provider of dataInRegion ) {
90+ connections . push ( {
91+ id : provider . KeyId ,
92+ resourceType : services . iamOpenIdConnectProvider ,
93+ relation : 'child' ,
94+ field : 'iamOpenIdConnectProviders' ,
95+ } )
96+ }
97+ }
98+ }
99+
100+ const identityPoolResult = {
101+ [ id ] : connections ,
102+ }
103+ return identityPoolResult
104+ }
0 commit comments