1616 */
1717package feast .core .grpc ;
1818
19- import com .google .protobuf .InvalidProtocolBufferException ;
2019import feast .core .CoreServiceGrpc .CoreServiceImplBase ;
2120import feast .core .CoreServiceProto .ApplyFeatureSetRequest ;
2221import feast .core .CoreServiceProto .ApplyFeatureSetResponse ;
22+ import feast .core .CoreServiceProto .ArchiveProjectRequest ;
23+ import feast .core .CoreServiceProto .ArchiveProjectResponse ;
24+ import feast .core .CoreServiceProto .CreateProjectRequest ;
25+ import feast .core .CoreServiceProto .CreateProjectResponse ;
2326import feast .core .CoreServiceProto .GetFeastCoreVersionRequest ;
2427import feast .core .CoreServiceProto .GetFeastCoreVersionResponse ;
2528import feast .core .CoreServiceProto .GetFeatureSetRequest ;
2629import feast .core .CoreServiceProto .GetFeatureSetResponse ;
2730import feast .core .CoreServiceProto .ListFeatureSetsRequest ;
2831import feast .core .CoreServiceProto .ListFeatureSetsResponse ;
32+ import feast .core .CoreServiceProto .ListProjectsRequest ;
33+ import feast .core .CoreServiceProto .ListProjectsResponse ;
2934import feast .core .CoreServiceProto .ListStoresRequest ;
3035import feast .core .CoreServiceProto .ListStoresResponse ;
3136import feast .core .CoreServiceProto .UpdateStoreRequest ;
3237import feast .core .CoreServiceProto .UpdateStoreResponse ;
3338import feast .core .exception .RetrievalException ;
3439import feast .core .grpc .interceptors .MonitoringInterceptor ;
40+ import feast .core .model .Project ;
41+ import feast .core .service .AccessManagementService ;
3542import feast .core .service .SpecService ;
43+ import io .grpc .Status ;
3644import io .grpc .StatusRuntimeException ;
3745import io .grpc .stub .StreamObserver ;
46+ import java .util .List ;
47+ import java .util .stream .Collectors ;
3848import lombok .extern .slf4j .Slf4j ;
3949import org .lognet .springboot .grpc .GRpcService ;
4050import org .springframework .beans .factory .annotation .Autowired ;
4555public class CoreServiceImpl extends CoreServiceImplBase {
4656
4757 private SpecService specService ;
58+ private AccessManagementService accessManagementService ;
4859
4960 @ Autowired
50- public CoreServiceImpl (SpecService specService ) {
61+ public CoreServiceImpl (SpecService specService , AccessManagementService accessManagementService ) {
5162 this .specService = specService ;
63+ this .accessManagementService = accessManagementService ;
5264 }
5365
5466 @ Override
@@ -65,9 +77,10 @@ public void getFeatureSet(
6577 GetFeatureSetResponse response = specService .getFeatureSet (request );
6678 responseObserver .onNext (response );
6779 responseObserver .onCompleted ();
68- } catch (RetrievalException | InvalidProtocolBufferException | StatusRuntimeException e ) {
80+ } catch (RetrievalException | StatusRuntimeException e ) {
6981 log .error ("Exception has occurred in GetFeatureSet method: " , e );
70- responseObserver .onError (e );
82+ responseObserver .onError (
83+ Status .INTERNAL .withDescription (e .getMessage ()).withCause (e ).asRuntimeException ());
7184 }
7285 }
7386
@@ -78,9 +91,10 @@ public void listFeatureSets(
7891 ListFeatureSetsResponse response = specService .listFeatureSets (request .getFilter ());
7992 responseObserver .onNext (response );
8093 responseObserver .onCompleted ();
81- } catch (RetrievalException | InvalidProtocolBufferException e ) {
94+ } catch (RetrievalException | IllegalArgumentException e ) {
8295 log .error ("Exception has occurred in ListFeatureSet method: " , e );
83- responseObserver .onError (e );
96+ responseObserver .onError (
97+ Status .INTERNAL .withDescription (e .getMessage ()).withCause (e ).asRuntimeException ());
8498 }
8599 }
86100
@@ -93,7 +107,8 @@ public void listStores(
93107 responseObserver .onCompleted ();
94108 } catch (RetrievalException e ) {
95109 log .error ("Exception has occurred in ListStores method: " , e );
96- responseObserver .onError (e );
110+ responseObserver .onError (
111+ Status .INTERNAL .withDescription (e .getMessage ()).withCause (e ).asRuntimeException ());
97112 }
98113 }
99114
@@ -104,9 +119,17 @@ public void applyFeatureSet(
104119 ApplyFeatureSetResponse response = specService .applyFeatureSet (request .getFeatureSet ());
105120 responseObserver .onNext (response );
106121 responseObserver .onCompleted ();
122+ } catch (org .hibernate .exception .ConstraintViolationException e ) {
123+ log .error (
124+ "Unable to persist this feature set due to a constraint violation. Please ensure that"
125+ + " field names are unique within the project namespace: " ,
126+ e );
127+ responseObserver .onError (
128+ Status .ALREADY_EXISTS .withDescription (e .getMessage ()).withCause (e ).asRuntimeException ());
107129 } catch (Exception e ) {
108130 log .error ("Exception has occurred in ApplyFeatureSet method: " , e );
109- responseObserver .onError (e );
131+ responseObserver .onError (
132+ Status .INTERNAL .withDescription (e .getMessage ()).withCause (e ).asRuntimeException ());
110133 }
111134 }
112135
@@ -119,7 +142,53 @@ public void updateStore(
119142 responseObserver .onCompleted ();
120143 } catch (Exception e ) {
121144 log .error ("Exception has occurred in UpdateStore method: " , e );
122- responseObserver .onError (e );
145+ responseObserver .onError (
146+ Status .INTERNAL .withDescription (e .getMessage ()).withCause (e ).asRuntimeException ());
147+ }
148+ }
149+
150+ @ Override
151+ public void createProject (
152+ CreateProjectRequest request , StreamObserver <CreateProjectResponse > responseObserver ) {
153+ try {
154+ accessManagementService .createProject (request .getName ());
155+ responseObserver .onNext (CreateProjectResponse .getDefaultInstance ());
156+ responseObserver .onCompleted ();
157+ } catch (Exception e ) {
158+ log .error ("Exception has occurred in the createProject method: " , e );
159+ responseObserver .onError (
160+ Status .INTERNAL .withDescription (e .getMessage ()).withCause (e ).asRuntimeException ());
161+ }
162+ }
163+
164+ @ Override
165+ public void archiveProject (
166+ ArchiveProjectRequest request , StreamObserver <ArchiveProjectResponse > responseObserver ) {
167+ try {
168+ accessManagementService .archiveProject (request .getName ());
169+ responseObserver .onNext (ArchiveProjectResponse .getDefaultInstance ());
170+ responseObserver .onCompleted ();
171+ } catch (Exception e ) {
172+ log .error ("Exception has occurred in the createProject method: " , e );
173+ responseObserver .onError (
174+ Status .INTERNAL .withDescription (e .getMessage ()).withCause (e ).asRuntimeException ());
175+ }
176+ }
177+
178+ @ Override
179+ public void listProjects (
180+ ListProjectsRequest request , StreamObserver <ListProjectsResponse > responseObserver ) {
181+ try {
182+ List <Project > projects = accessManagementService .listProjects ();
183+ responseObserver .onNext (
184+ ListProjectsResponse .newBuilder ()
185+ .addAllProjects (projects .stream ().map (Project ::getName ).collect (Collectors .toList ()))
186+ .build ());
187+ responseObserver .onCompleted ();
188+ } catch (Exception e ) {
189+ log .error ("Exception has occurred in the listProjects method: " , e );
190+ responseObserver .onError (
191+ Status .INTERNAL .withDescription (e .getMessage ()).withCause (e ).asRuntimeException ());
123192 }
124193 }
125194}
0 commit comments