This is an automated email from the ASF dual-hosted git repository.
lahirujayathilake pushed a commit to branch cybershuttle-staging
in repository https://gitbox.apache.org/repos/asf/airavata.git
The following commit(s) were added to refs/heads/cybershuttle-staging by this
push:
new 226d9629c3 initialize user and changes to rhub service classes
226d9629c3 is described below
commit 226d9629c307bb1f970783ea2ee859c06d9c34d8
Author: lahiruj <[email protected]>
AuthorDate: Mon Mar 31 14:35:51 2025 -0400
initialize user and changes to rhub service classes
---
.../research/service/config/AuthzTokenFilter.java | 8 ++
.../service/controller/ResearchHubController.java | 5 +-
...jectController.java => ResourceController.java} | 21 ++---
.../research/service/handlers/ProjectHandler.java | 101 ---------------------
.../service/handlers/ResearchHubHandler.java | 2 +-
.../{ProjectHandler.java => ResourceHandler.java} | 11 +--
.../research/service/handlers/UserHandler.java | 51 +++++++++--
.../research/service/model/entity/Session.java | 7 ++
.../research/service/model/entity/User.java | 10 ++
.../service/model/repo/UserRepository.java | 4 +
.../src/main/proto/research-service.proto | 1 +
11 files changed, 92 insertions(+), 129 deletions(-)
diff --git
a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/config/AuthzTokenFilter.java
b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/config/AuthzTokenFilter.java
index a1f46007e2..b8d281b47c 100644
---
a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/config/AuthzTokenFilter.java
+++
b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/config/AuthzTokenFilter.java
@@ -25,6 +25,7 @@ import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.apache.airavata.model.security.AuthzToken;
+import org.apache.airavata.research.service.handlers.UserHandler;
import org.apache.airavata.research.service.model.UserContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -42,9 +43,15 @@ public class AuthzTokenFilter extends OncePerRequestFilter {
private static final Logger LOGGER =
LoggerFactory.getLogger(AuthzTokenFilter.class);
+ private final UserHandler userHandler;
+
@Value("${cybershuttle.hub.url}")
private String csHubUrl;
+ public AuthzTokenFilter(UserHandler userHandler) {
+ this.userHandler = userHandler;
+ }
+
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response, FilterChain filterChain) throws ServletException,
IOException {
@@ -69,6 +76,7 @@ public class AuthzTokenFilter extends OncePerRequestFilter {
authzToken.setClaimsMap(claimsMap);
UserContext.setAuthzToken(authzToken);
+ userHandler.initializeUser(UserContext.username());
} catch (Exception e) {
LOGGER.error("Invalid authorization data", e);
response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Invalid
authorization data");
diff --git
a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/controller/ResearchHubController.java
b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/controller/ResearchHubController.java
index 04e40858e1..38eab2f9ee 100644
---
a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/controller/ResearchHubController.java
+++
b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/controller/ResearchHubController.java
@@ -27,6 +27,7 @@ import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.net.URI;
@@ -45,8 +46,8 @@ public class ResearchHubController {
}
@GetMapping("/project/{projectId}")
- public ResponseEntity<?> resolveRHubUrl(@PathVariable("projectId") String
projectId) {
- String spawnUrl = rHubHandler.spinRHubSession(projectId);
+ public ResponseEntity<?> resolveRHubUrl(@PathVariable("projectId") String
projectId, @RequestParam("sessionName") String sessionName) {
+ String spawnUrl = rHubHandler.spinRHubSession(projectId, sessionName);
LOGGER.info("Redirecting user to spawn URL: {}", spawnUrl);
return
ResponseEntity.status(HttpStatus.FOUND).location(URI.create(spawnUrl)).build();
diff --git
a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/controller/ProjectController.java
b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/controller/ResourceController.java
similarity index 82%
rename from
modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/controller/ProjectController.java
rename to
modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/controller/ResourceController.java
index 884d92af0e..b82025cd56 100644
---
a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/controller/ProjectController.java
+++
b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/controller/ResourceController.java
@@ -31,45 +31,44 @@ import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Operation;
import org.springframework.web.bind.annotation.*;
-import org.apache.airavata.research.service.handlers.ProjectHandler;
+import org.apache.airavata.research.service.handlers.ResourceHandler;
import org.springframework.http.ResponseEntity;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.List;
@RestController
@RequestMapping("/api/v1/rf/project-management")
@Tag(name = "Project", description = "The Project API")
-public class ProjectController {
- private static final Logger LOGGER =
LoggerFactory.getLogger(ProjectController.class);
+public class ResourceController {
+ private static final Logger LOGGER =
LoggerFactory.getLogger(ResourceController.class);
@org.springframework.beans.factory.annotation.Autowired
- private ProjectHandler projectHandler;
+ private ResourceHandler resourceHandler;
@PostMapping("/dataset")
public ResponseEntity<ResourceResponse> createDatasetResource(@RequestBody
DatasetResource datasetResource) {
- ResourceResponse response =
projectHandler.createResource(datasetResource, ResourceTypeEnum.DATASET);
+ ResourceResponse response =
resourceHandler.createResource(datasetResource, ResourceTypeEnum.DATASET);
return ResponseEntity.ok(response);
}
@PostMapping("/notebook")
public ResponseEntity<ResourceResponse>
createNotebookResource(@RequestBody NotebookResource notebookResource) {
- ResourceResponse response =
projectHandler.createResource(notebookResource, ResourceTypeEnum.NOTEBOOK);
+ ResourceResponse response =
resourceHandler.createResource(notebookResource, ResourceTypeEnum.NOTEBOOK);
return ResponseEntity.ok(response);
}
@PostMapping("/repository")
public ResponseEntity<ResourceResponse>
createRepositoryResource(@RequestBody RepositoryResource repositoryResource) {
- ResourceResponse response =
projectHandler.createResource(repositoryResource, ResourceTypeEnum.REPOSITORY);
+ ResourceResponse response =
resourceHandler.createResource(repositoryResource, ResourceTypeEnum.REPOSITORY);
return ResponseEntity.ok(response);
}
@PostMapping("/model")
public ResponseEntity<ResourceResponse> createModelResource(@RequestBody
ModelResource modelResource) {
- ResourceResponse response =
projectHandler.createResource(modelResource, ResourceTypeEnum.MODEL);
+ ResourceResponse response =
resourceHandler.createResource(modelResource, ResourceTypeEnum.MODEL);
return ResponseEntity.ok(response);
}
@@ -80,7 +79,7 @@ public class ProjectController {
)
@GetMapping(value = "/resources/{id}")
public ResponseEntity<ResourceResponse>
getResource(@PathVariable(value="id") String id) {
- return ResponseEntity.ok(projectHandler.getResourceById(id));
+ return ResponseEntity.ok(resourceHandler.getResourceById(id));
}
@Operation(
@@ -104,7 +103,7 @@ public class ProjectController {
typeList.add(DatasetResource.class);
}
}
- Page<ResourceResponse> response =
projectHandler.getAllResources(pageNumber, pageSize, typeList);
+ Page<ResourceResponse> response =
resourceHandler.getAllResources(pageNumber, pageSize, typeList);
return ResponseEntity.ok(response);
}
diff --git
a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/handlers/ProjectHandler.java
b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/handlers/ProjectHandler.java
index 224dc95235..7bea3e254e 100644
---
a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/handlers/ProjectHandler.java
+++
b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/handlers/ProjectHandler.java
@@ -18,114 +18,13 @@
*/
package org.apache.airavata.research.service.handlers;
-import org.apache.airavata.research.service.ResponseTypes.ResourceResponse;
-import org.apache.airavata.research.service.enums.ResourceTypeEnum;
-import org.apache.airavata.research.service.model.entity.DatasetResource;
-import org.apache.airavata.research.service.model.entity.ModelResource;
-import org.apache.airavata.research.service.model.entity.NotebookResource;
-import org.apache.airavata.research.service.model.entity.RepositoryResource;
-import org.apache.airavata.research.service.model.entity.Resource;
-import org.apache.airavata.research.service.model.entity.Tag;
-import org.apache.airavata.research.service.model.entity.User;
-import org.apache.airavata.research.service.model.repo.ResourceRepository;
-import org.apache.airavata.research.service.model.repo.TagRepository;
-import org.apache.airavata.research.service.model.repo.UserRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.domain.Page;
-import org.springframework.data.domain.PageRequest;
-import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Optional;
-import java.util.Set;
-
@Service
public class ProjectHandler {
private static final Logger LOGGER =
LoggerFactory.getLogger(ProjectHandler.class);
- @Autowired
- private UserRepository userRepository;
-
- @Autowired
- private TagRepository tagRepository;
-
- @Autowired
- ResourceRepository resourceRepository;
-
- public void initializeResource(Resource resource) {
- Set<User> userSet = new HashSet<>();
- for (User u: resource.getAuthors()) {
- Optional<User> fetchedUser = userRepository.findById(u.getId());
- if (fetchedUser.isEmpty()) {
- throw new RuntimeException("User not found: " + u.getId());
- }
- userSet.add(fetchedUser.get());
- }
-
- HashSet<Tag> tags = new HashSet<>();
- for (Tag t: resource.getTags()) {
- String tagValue = t.getValue();
- Tag fetchedTag = tagRepository.findByValue(tagValue);
- if (fetchedTag == null) {
- fetchedTag = tagRepository.save(t);
- }
- tags.add(fetchedTag);
- }
- resource.setAuthors(userSet);
- resource.setTags(tags);
- }
-
- public ResourceResponse createResource(Resource resource, ResourceTypeEnum
type) {
- ResourceResponse response = new ResourceResponse();
-
- initializeResource(resource);
- response.setResource(resourceRepository.save(resource));
- response.setType(type);
-
- return response;
- }
-
- public ResourceResponse resourceToResponse(Resource resource) {
- ResourceResponse response = new ResourceResponse();
- response.setResource(resource);
-
- if (resource instanceof DatasetResource) {
- response.setType(ResourceTypeEnum.DATASET);
- } else if (resource instanceof NotebookResource) {
- response.setType(ResourceTypeEnum.NOTEBOOK);
- } else if (resource instanceof RepositoryResource) {
- response.setType(ResourceTypeEnum.REPOSITORY);
- } else if (resource instanceof ModelResource) {
- response.setType(ResourceTypeEnum.MODEL);
- } else {
- throw new RuntimeException("Unknown resource type: " +
resource.getClass().getName());
- }
-
- return response;
- }
-
- public ResourceResponse getResourceById(String id)
- {
- // Your logic to fetch the resource by ID
- Optional<Resource> opResource = resourceRepository.findById(id);
-
- if (opResource.isEmpty()) {
- throw new RuntimeException("Resource not found: " + id);
- }
-
- Resource resource = opResource.get();
- return resourceToResponse(resource);
- }
-
- public Page<ResourceResponse> getAllResources(int pageNumber, int
pageSize, List<Class<? extends Resource>> typeList) {
- Pageable pageable = PageRequest.of(pageNumber, pageSize);
- Page<Resource> resources = resourceRepository.findAllByTypes(typeList,
pageable);
- return resources.map(this::resourceToResponse);
- }
-
}
diff --git
a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/handlers/ResearchHubHandler.java
b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/handlers/ResearchHubHandler.java
index eae2cb1b11..01d8cc01fb 100644
---
a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/handlers/ResearchHubHandler.java
+++
b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/handlers/ResearchHubHandler.java
@@ -45,7 +45,7 @@ public class ResearchHubHandler {
this.sessionHandler = sessionHandler;
}
- public String spinRHubSession(String projectId) {
+ public String spinRHubSession(String projectId, String sessionName) {
// TODO fix the conflict of Project vs Resource
// TODO extract the data using the projectId
String gitUrl = "https://github.com/AllenInstitute/bmtk-workshop.git";
diff --git
a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/handlers/ProjectHandler.java
b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/handlers/ResourceHandler.java
similarity index 96%
copy from
modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/handlers/ProjectHandler.java
copy to
modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/handlers/ResourceHandler.java
index 224dc95235..c07c28aafa 100644
---
a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/handlers/ProjectHandler.java
+++
b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/handlers/ResourceHandler.java
@@ -44,9 +44,9 @@ import java.util.Optional;
import java.util.Set;
@Service
-public class ProjectHandler {
+public class ResourceHandler {
- private static final Logger LOGGER =
LoggerFactory.getLogger(ProjectHandler.class);
+ private static final Logger LOGGER =
LoggerFactory.getLogger(ResourceHandler.class);
@Autowired
private UserRepository userRepository;
@@ -59,7 +59,7 @@ public class ProjectHandler {
public void initializeResource(Resource resource) {
Set<User> userSet = new HashSet<>();
- for (User u: resource.getAuthors()) {
+ for (User u : resource.getAuthors()) {
Optional<User> fetchedUser = userRepository.findById(u.getId());
if (fetchedUser.isEmpty()) {
throw new RuntimeException("User not found: " + u.getId());
@@ -68,7 +68,7 @@ public class ProjectHandler {
}
HashSet<Tag> tags = new HashSet<>();
- for (Tag t: resource.getTags()) {
+ for (Tag t : resource.getTags()) {
String tagValue = t.getValue();
Tag fetchedTag = tagRepository.findByValue(tagValue);
if (fetchedTag == null) {
@@ -109,8 +109,7 @@ public class ProjectHandler {
return response;
}
- public ResourceResponse getResourceById(String id)
- {
+ public ResourceResponse getResourceById(String id) {
// Your logic to fetch the resource by ID
Optional<Resource> opResource = resourceRepository.findById(id);
diff --git
a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/handlers/UserHandler.java
b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/handlers/UserHandler.java
index 2f2ab3cadb..e984a53f08 100644
---
a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/handlers/UserHandler.java
+++
b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/handlers/UserHandler.java
@@ -1,20 +1,42 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
package org.apache.airavata.research.service.handlers;
-import org.springframework.stereotype.Service;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.apache.airavata.research.service.model.repo.UserRepository;
-
-import org.apache.airavata.research.service.model.entity.User;
-
import org.apache.airavata.research.CreateUserRequest;
+import org.apache.airavata.research.service.model.entity.User;
+import org.apache.airavata.research.service.model.repo.UserRepository;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
import java.util.Date;
@Service
public class UserHandler {
- @Autowired
- private UserRepository userRepository;
+ private static final Logger LOGGER =
LoggerFactory.getLogger(UserHandler.class);
+
+ private final UserRepository userRepository;
+
+ public UserHandler(UserRepository userRepository) {
+ this.userRepository = userRepository;
+ }
public User createUser(CreateUserRequest userRequest) {
if (userRepository.existsByEmail(userRequest.getEmail())) {
@@ -22,6 +44,7 @@ public class UserHandler {
}
User user = new User();
+ user.setUsername(userRequest.getUserName());
user.setFirstName(userRequest.getFirstName());
user.setLastName(userRequest.getLastName());
user.setEmail(userRequest.getEmail());
@@ -47,4 +70,16 @@ public class UserHandler {
return userRepository.findByEmail(email);
}
+ public void initializeUser(String username) {
+ userRepository.findByUsername(username).ifPresentOrElse(
+ user -> LOGGER.info("User {} is already registered.",
username),
+ () -> {
+ // TODO initialize this using the airavata userprofile
+ User newUser = new User(username, "CHANGE_ME",
"CHANGE_ME", username);
+ userRepository.save(newUser);
+ LOGGER.info("Initialized new user with username {}.",
username);
+ }
+ );
+ }
+
}
diff --git
a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/entity/Session.java
b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/entity/Session.java
index e5c8a86c3a..a436d03b43 100644
---
a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/entity/Session.java
+++
b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/entity/Session.java
@@ -65,6 +65,13 @@ public class Session {
@LastModifiedDate
private Date updatedAt;
+ public Session() {
+ }
+
+ public Session(String sessionName, User user) {
+ this.sessionName = sessionName;
+ this.user = user;
+ }
public String getId() {
return id;
diff --git
a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/entity/User.java
b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/entity/User.java
index 3a362bd5b3..e1b4b59746 100644
---
a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/entity/User.java
+++
b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/entity/User.java
@@ -66,6 +66,16 @@ public class User {
@Column(nullable = true)
private String avatar;
+ public User() {
+ }
+
+ public User(String username, String firstName, String lastName, String
email) {
+ this.username = username;
+ this.firstName = firstName;
+ this.lastName = lastName;
+ this.email = email;
+ }
+
public String getId() {
return id;
}
diff --git
a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/repo/UserRepository.java
b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/repo/UserRepository.java
index b0ee4f21be..fd822074fd 100644
---
a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/repo/UserRepository.java
+++
b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/repo/UserRepository.java
@@ -21,8 +21,12 @@ package org.apache.airavata.research.service.model.repo;
import org.apache.airavata.research.service.model.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
+import java.util.Optional;
+
public interface UserRepository extends JpaRepository<User, String> {
+ Optional<User> findByUsername(String username);
+
boolean existsByEmail(String email);
User findByEmail(String email);
diff --git
a/modules/research-framework/research-service/src/main/proto/research-service.proto
b/modules/research-framework/research-service/src/main/proto/research-service.proto
index ccab060223..702a41a41b 100644
---
a/modules/research-framework/research-service/src/main/proto/research-service.proto
+++
b/modules/research-framework/research-service/src/main/proto/research-service.proto
@@ -11,6 +11,7 @@ service ResearchService {
}
message CreateUserRequest {
+ string userName = 1;
string firstName = 2;
string lastName = 3;
string email = 4;