1
1
pub use analytics:: * ;
2
2
3
3
pub mod routes {
4
+ use std:: {
5
+ collections:: { HashMap , HashSet } ,
6
+ sync:: Arc ,
7
+ } ;
8
+
4
9
use actix_web:: { web, Responder , Scope } ;
5
10
use analytics:: {
6
11
api_event:: api_events_core, connector_events:: connector_events_core, enums:: AuthInfo ,
@@ -21,21 +26,21 @@ pub mod routes {
21
26
GetSdkEventMetricRequest , ReportRequest ,
22
27
} ;
23
28
use common_enums:: EntityType ;
24
- use common_utils:: id_type:: { MerchantId , OrganizationId } ;
25
29
use error_stack:: { report, ResultExt } ;
30
+ use futures:: { stream:: FuturesUnordered , StreamExt } ;
26
31
27
32
use crate :: {
28
- consts:: opensearch:: OPENSEARCH_INDEX_PERMISSIONS ,
33
+ consts:: opensearch:: SEARCH_INDEXES ,
29
34
core:: { api_locking, errors:: user:: UserErrors , verification:: utils} ,
30
- db:: user:: UserInterface ,
35
+ db:: { user:: UserInterface , user_role :: ListUserRolesByUserIdPayload } ,
31
36
routes:: AppState ,
32
37
services:: {
33
38
api,
34
39
authentication:: { self as auth, AuthenticationData , UserFromToken } ,
35
40
authorization:: { permissions:: Permission , roles:: RoleInfo } ,
36
41
ApplicationResponse ,
37
42
} ,
38
- types:: domain:: UserEmail ,
43
+ types:: { domain:: UserEmail , storage :: UserRole } ,
39
44
} ;
40
45
41
46
pub struct Analytics ;
@@ -1838,25 +1843,89 @@ pub mod routes {
1838
1843
. await
1839
1844
. change_context ( UserErrors :: InternalServerError )
1840
1845
. change_context ( OpenSearchError :: UnknownError ) ?;
1841
- let permissions = role_info. get_permissions_set ( ) ;
1842
- let accessible_indexes: Vec < _ > = OPENSEARCH_INDEX_PERMISSIONS
1846
+ let permission_groups = role_info. get_permission_groups ( ) ;
1847
+ if !permission_groups. contains ( & common_enums:: PermissionGroup :: OperationsView ) {
1848
+ return Err ( OpenSearchError :: AccessForbiddenError ) ?;
1849
+ }
1850
+ let user_roles: HashSet < UserRole > = state
1851
+ . store
1852
+ . list_user_roles_by_user_id ( ListUserRolesByUserIdPayload {
1853
+ user_id : & auth. user_id ,
1854
+ org_id : Some ( & auth. org_id ) ,
1855
+ merchant_id : None ,
1856
+ profile_id : None ,
1857
+ entity_id : None ,
1858
+ version : None ,
1859
+ status : None ,
1860
+ limit : None ,
1861
+ } )
1862
+ . await
1863
+ . change_context ( UserErrors :: InternalServerError )
1864
+ . change_context ( OpenSearchError :: UnknownError ) ?
1865
+ . into_iter ( )
1866
+ . collect ( ) ;
1867
+
1868
+ let state = Arc :: new ( state) ;
1869
+ let role_info_map: HashMap < String , RoleInfo > = user_roles
1843
1870
. iter ( )
1844
- . filter ( |( _, perm) | perm. iter ( ) . any ( |p| permissions. contains ( p) ) )
1845
- . map ( |( i, _) | * i)
1871
+ . map ( |user_role| {
1872
+ let state = Arc :: clone ( & state) ;
1873
+ let role_id = user_role. role_id . clone ( ) ;
1874
+ let org_id = user_role. org_id . clone ( ) . unwrap_or_default ( ) ;
1875
+ async move {
1876
+ RoleInfo :: from_role_id_in_org_scope ( & state, & role_id, & org_id)
1877
+ . await
1878
+ . change_context ( UserErrors :: InternalServerError )
1879
+ . change_context ( OpenSearchError :: UnknownError )
1880
+ . map ( |role_info| ( role_id, role_info) )
1881
+ }
1882
+ } )
1883
+ . collect :: < FuturesUnordered < _ > > ( )
1884
+ . collect :: < Vec < _ > > ( )
1885
+ . await
1886
+ . into_iter ( )
1887
+ . collect :: < Result < HashMap < _ , _ > , _ > > ( ) ?;
1888
+
1889
+ let filtered_user_roles: Vec < & UserRole > = user_roles
1890
+ . iter ( )
1891
+ . filter ( |user_role| {
1892
+ let user_role_id = & user_role. role_id ;
1893
+ if let Some ( role_info) = role_info_map. get ( user_role_id) {
1894
+ let permissions = role_info. get_permission_groups ( ) ;
1895
+ permissions. contains ( & common_enums:: PermissionGroup :: OperationsView )
1896
+ } else {
1897
+ false
1898
+ }
1899
+ } )
1846
1900
. collect ( ) ;
1847
1901
1848
- let merchant_id: MerchantId = auth. merchant_id ;
1849
- let org_id: OrganizationId = auth. org_id ;
1850
- let search_params: Vec < AuthInfo > = vec ! [ AuthInfo :: MerchantLevel {
1851
- org_id: org_id. clone( ) ,
1852
- merchant_ids: vec![ merchant_id. clone( ) ] ,
1853
- } ] ;
1902
+ let search_params: Vec < AuthInfo > = filtered_user_roles
1903
+ . iter ( )
1904
+ . filter_map ( |user_role| {
1905
+ user_role
1906
+ . get_entity_id_and_type ( )
1907
+ . and_then ( |( _, entity_type) | match entity_type {
1908
+ EntityType :: Profile => Some ( AuthInfo :: ProfileLevel {
1909
+ org_id : user_role. org_id . clone ( ) ?,
1910
+ merchant_id : user_role. merchant_id . clone ( ) ?,
1911
+ profile_ids : vec ! [ user_role. profile_id. clone( ) ?] ,
1912
+ } ) ,
1913
+ EntityType :: Merchant => Some ( AuthInfo :: MerchantLevel {
1914
+ org_id : user_role. org_id . clone ( ) ?,
1915
+ merchant_ids : vec ! [ user_role. merchant_id. clone( ) ?] ,
1916
+ } ) ,
1917
+ EntityType :: Organization => Some ( AuthInfo :: OrgLevel {
1918
+ org_id : user_role. org_id . clone ( ) ?,
1919
+ } ) ,
1920
+ } )
1921
+ } )
1922
+ . collect ( ) ;
1854
1923
1855
1924
analytics:: search:: msearch_results (
1856
1925
& state. opensearch_client ,
1857
1926
req,
1858
1927
search_params,
1859
- accessible_indexes ,
1928
+ SEARCH_INDEXES . to_vec ( ) ,
1860
1929
)
1861
1930
. await
1862
1931
. map ( ApplicationResponse :: Json )
@@ -1898,20 +1967,82 @@ pub mod routes {
1898
1967
. await
1899
1968
. change_context ( UserErrors :: InternalServerError )
1900
1969
. change_context ( OpenSearchError :: UnknownError ) ?;
1901
- let permissions = role_info. get_permissions_set ( ) ;
1902
- let _ = OPENSEARCH_INDEX_PERMISSIONS
1970
+ let permission_groups = role_info. get_permission_groups ( ) ;
1971
+ if !permission_groups. contains ( & common_enums:: PermissionGroup :: OperationsView ) {
1972
+ return Err ( OpenSearchError :: AccessForbiddenError ) ?;
1973
+ }
1974
+ let user_roles: HashSet < UserRole > = state
1975
+ . store
1976
+ . list_user_roles_by_user_id ( ListUserRolesByUserIdPayload {
1977
+ user_id : & auth. user_id ,
1978
+ org_id : Some ( & auth. org_id ) ,
1979
+ merchant_id : None ,
1980
+ profile_id : None ,
1981
+ entity_id : None ,
1982
+ version : None ,
1983
+ status : None ,
1984
+ limit : None ,
1985
+ } )
1986
+ . await
1987
+ . change_context ( UserErrors :: InternalServerError )
1988
+ . change_context ( OpenSearchError :: UnknownError ) ?
1989
+ . into_iter ( )
1990
+ . collect ( ) ;
1991
+ let state = Arc :: new ( state) ;
1992
+ let role_info_map: HashMap < String , RoleInfo > = user_roles
1903
1993
. iter ( )
1904
- . filter ( |( ind, _) | * ind == index)
1905
- . find ( |i| i. 1 . iter ( ) . any ( |p| permissions. contains ( p) ) )
1906
- . ok_or ( OpenSearchError :: IndexAccessNotPermittedError ( index) ) ?;
1994
+ . map ( |user_role| {
1995
+ let state = Arc :: clone ( & state) ;
1996
+ let role_id = user_role. role_id . clone ( ) ;
1997
+ let org_id = user_role. org_id . clone ( ) . unwrap_or_default ( ) ;
1998
+ async move {
1999
+ RoleInfo :: from_role_id_in_org_scope ( & state, & role_id, & org_id)
2000
+ . await
2001
+ . change_context ( UserErrors :: InternalServerError )
2002
+ . change_context ( OpenSearchError :: UnknownError )
2003
+ . map ( |role_info| ( role_id, role_info) )
2004
+ }
2005
+ } )
2006
+ . collect :: < FuturesUnordered < _ > > ( )
2007
+ . collect :: < Vec < _ > > ( )
2008
+ . await
2009
+ . into_iter ( )
2010
+ . collect :: < Result < HashMap < _ , _ > , _ > > ( ) ?;
1907
2011
1908
- let merchant_id: MerchantId = auth. merchant_id ;
1909
- let org_id: OrganizationId = auth. org_id ;
1910
- let search_params: Vec < AuthInfo > = vec ! [ AuthInfo :: MerchantLevel {
1911
- org_id: org_id. clone( ) ,
1912
- merchant_ids: vec![ merchant_id. clone( ) ] ,
1913
- } ] ;
2012
+ let filtered_user_roles: Vec < & UserRole > = user_roles
2013
+ . iter ( )
2014
+ . filter ( |user_role| {
2015
+ let user_role_id = & user_role. role_id ;
2016
+ if let Some ( role_info) = role_info_map. get ( user_role_id) {
2017
+ let permissions = role_info. get_permission_groups ( ) ;
2018
+ permissions. contains ( & common_enums:: PermissionGroup :: OperationsView )
2019
+ } else {
2020
+ false
2021
+ }
2022
+ } )
2023
+ . collect ( ) ;
1914
2024
2025
+ let search_params: Vec < AuthInfo > = filtered_user_roles
2026
+ . iter ( )
2027
+ . filter_map ( |user_role| {
2028
+ user_role
2029
+ . get_entity_id_and_type ( )
2030
+ . and_then ( |( _, entity_type) | match entity_type {
2031
+ EntityType :: Profile => Some ( AuthInfo :: ProfileLevel {
2032
+ org_id : user_role. org_id . clone ( ) ?,
2033
+ merchant_id : user_role. merchant_id . clone ( ) ?,
2034
+ profile_ids : vec ! [ user_role. profile_id. clone( ) ?] ,
2035
+ } ) ,
2036
+ EntityType :: Merchant => Some ( AuthInfo :: MerchantLevel {
2037
+ org_id : user_role. org_id . clone ( ) ?,
2038
+ merchant_ids : vec ! [ user_role. merchant_id. clone( ) ?] ,
2039
+ } ) ,
2040
+ EntityType :: Organization => Some ( AuthInfo :: OrgLevel {
2041
+ org_id : user_role. org_id . clone ( ) ?,
2042
+ } ) ,
2043
+ } )
2044
+ } )
2045
+ . collect ( ) ;
1915
2046
analytics:: search:: search_results ( & state. opensearch_client , req, search_params)
1916
2047
. await
1917
2048
. map ( ApplicationResponse :: Json )
0 commit comments