11package org .hswebframework .web .system .authorization .defaults .service ;
22
33import org .apache .commons .collections4 .CollectionUtils ;
4+ import org .apache .commons .collections4 .MapUtils ;
45import org .hswebframework .ezorm .rdb .mapping .ReactiveRepository ;
56import org .hswebframework .web .authorization .Dimension ;
67import org .hswebframework .web .authorization .DimensionProvider ;
2021import org .springframework .beans .factory .annotation .Autowired ;
2122import org .springframework .context .ApplicationEventPublisher ;
2223import org .springframework .context .event .EventListener ;
24+ import org .springframework .transaction .annotation .Transactional ;
2325import reactor .core .publisher .Flux ;
2426import reactor .core .publisher .Mono ;
2527
28+ import java .time .Duration ;
2629import java .util .Collection ;
2730import java .util .List ;
2831import java .util .function .Function ;
2932import java .util .stream .Collectors ;
3033
34+ @ Deprecated
3135public class DefaultDimensionService
32- extends GenericReactiveTreeSupportCrudService <DimensionEntity , String >
33- implements
34- DimensionProvider , DimensionUserBindProvider {
36+ extends GenericReactiveTreeSupportCrudService <DimensionEntity , String >
37+ implements
38+ DimensionProvider , DimensionUserBindProvider {
3539
3640 @ Autowired
3741 private ReactiveRepository <DimensionUserEntity , String > dimensionUserRepository ;
@@ -52,20 +56,25 @@ public void setChildren(DimensionEntity entity, List<DimensionEntity> children)
5256 entity .setChildren (children );
5357 }
5458
59+ private Flux <DimensionTypeEntity > allCache ;
60+
5561 @ Override
5662 public Flux <DimensionTypeEntity > getAllType () {
57- return dimensionTypeRepository
58- .createQuery ()
59- .fetch ();
63+ if (allCache == null ) {
64+ return allCache = Flux
65+ .defer (()-> dimensionTypeRepository .createQuery ().fetch ())
66+ .cache (Duration .ofSeconds (1 ));
67+ }
68+ return allCache ;
6069 }
6170
6271 @ Override
6372 public Mono <DynamicDimension > getDimensionById (DimensionType type , String id ) {
6473 return createQuery ()
65- .where (DimensionEntity ::getId , id )
66- .fetch ()
67- .singleOrEmpty ()
68- .map (entity -> DynamicDimension .of (entity , type ));
74+ .where (DimensionEntity ::getId , id )
75+ .fetch ()
76+ .singleOrEmpty ()
77+ .map (entity -> DynamicDimension .of (entity , type ));
6978 }
7079
7180 @ Override
@@ -78,70 +87,72 @@ public Flux<? extends Dimension> getDimensionsById(DimensionType type, Collectio
7887 }
7988
8089 @ Override
90+ @ Transactional (readOnly = true )
8191 public Flux <DynamicDimension > getDimensionByUserId (String userId ) {
8292 return getAllType ()
83- .collect (Collectors .toMap (DimensionType ::getId , Function .identity ()))
84- .flatMapMany (typeGrouping -> dimensionUserRepository
85- .createQuery ()
86- .where (DimensionUserEntity ::getUserId , userId )
87- .fetch ()
88- .collectList ()
89- .filter (CollectionUtils ::isNotEmpty )
90- .flatMapMany (list -> {
91- //查询所有的维度
92- return this
93- .queryIncludeChildren (list .stream ()
94- .map (DimensionUserEntity ::getDimensionId )
95- .collect (Collectors .toSet ()))
96- .filter (dimension -> typeGrouping .containsKey (dimension .getTypeId ()))
97- .map (dimension ->
98- DynamicDimension .of (dimension , typeGrouping .get (dimension .getTypeId ()))
99- );
100-
101- })
102- );
93+ .collect (Collectors .toMap (DimensionType ::getId , Function .identity ()))
94+ .filter (MapUtils ::isNotEmpty )
95+ .flatMapMany (typeGrouping -> dimensionUserRepository
96+ .createQuery ()
97+ .where (DimensionUserEntity ::getUserId , userId )
98+ .fetch ()
99+ .collectList ()
100+ .filter (CollectionUtils ::isNotEmpty )
101+ .flatMapMany (list -> {
102+ //查询所有的维度
103+ return this
104+ .queryIncludeChildren (list .stream ()
105+ .map (DimensionUserEntity ::getDimensionId )
106+ .collect (Collectors .toSet ()))
107+ .filter (dimension -> typeGrouping .containsKey (dimension .getTypeId ()))
108+ .map (dimension ->
109+ DynamicDimension .of (dimension , typeGrouping .get (dimension .getTypeId ()))
110+ );
111+
112+ })
113+ );
103114 }
104115
105116 @ Override
106117 public Flux <DimensionUserBind > getDimensionBindInfo (Collection <String > userIdList ) {
107118 return dimensionUserRepository
108- .createQuery ()
109- .in (DimensionUserEntity ::getUserId , userIdList )
110- .fetch ()
111- .map (entity -> DimensionUserBind .of (entity .getUserId (), entity .getDimensionTypeId (), entity .getDimensionId ()));
119+ .createQuery ()
120+ .in (DimensionUserEntity ::getUserId , userIdList )
121+ .fetch ()
122+ .map (entity -> DimensionUserBind .of (entity .getUserId (), entity .getDimensionTypeId (), entity .getDimensionId ()));
112123 }
113124
114125 @ Override
115126 @ SuppressWarnings ("all" )
116127 public Flux <String > getUserIdByDimensionId (String dimensionId ) {
117128 return dimensionUserRepository
118- .createQuery ()
119- .select (DimensionUserEntity ::getUserId )
120- .where (DimensionUserEntity ::getDimensionId , dimensionId )
121- .fetch ()
122- .map (DimensionUserEntity ::getUserId );
129+ .createQuery ()
130+ .select (DimensionUserEntity ::getUserId )
131+ .where (DimensionUserEntity ::getDimensionId , dimensionId )
132+ .fetch ()
133+ .map (DimensionUserEntity ::getUserId );
123134 }
124135
125136 @ EventListener
126137 public void handleDimensionChanged (EntitySavedEvent <DimensionEntity > event ) {
127138 event .async (
128- ClearUserAuthorizationCacheEvent .all ().publish (eventPublisher )
139+ ClearUserAuthorizationCacheEvent .all ().publish (eventPublisher )
129140 );
130141 }
131142
132143 @ EventListener
133144 public void handleDimensionChanged (EntityModifyEvent <DimensionEntity > event ) {
134145 event .async (
135- ClearUserAuthorizationCacheEvent .all ().publish (eventPublisher )
146+ ClearUserAuthorizationCacheEvent .all ().publish (eventPublisher )
136147 );
137148 }
138149
139150 @ EventListener
140151 public void dispatchDimensionDeleteEvent (EntityDeletedEvent <DimensionEntity > event ) {
141152
142153 event .async (
143- Flux .fromIterable (event .getEntity ())
144- .flatMap (e -> new DimensionDeletedEvent (e .getTypeId (), e .getId ()).publish (eventPublisher ))
154+ Flux .fromIterable (event .getEntity ())
155+ .flatMap (e -> new DimensionDeletedEvent (e .getTypeId (), e .getId ()).publish (eventPublisher ))
145156 );
146157 }
147158
0 commit comments