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
commit 12fff475284acf7f4522af49cfdf159a0b2fc6a1 Author: ganning127 <[email protected]> AuthorDate: Sun Mar 30 22:59:04 2025 -0400 Basic API implementation working --- .../service/ResponseTypes/ResourceResponse.java | 26 +++++ .../service/controller/ProjectController.java | 50 ++++++++- .../service/controller/UserController.java | 73 +++++++++++++ .../research/service/enums/PrivacyEnum.java | 6 ++ .../research/service/enums/ResourceTypeEnum.java | 15 +++ .../research/service/enums/StatusEnum.java | 8 ++ .../research/service/exception/ErrorResponse.java | 47 +++++++++ .../service/exception/GlobalExceptionHandler.java | 24 +++++ .../research/service/handlers/ProjectHandler.java | 79 ++++++++++++++ .../research/service/handlers/UserHandler.java | 50 +++++++++ .../service/model/entity/DatasetResource.java | 17 +++ .../service/model/entity/NotebookResource.java | 17 +++ .../service/model/entity/RepositoryResource.java | 17 +++ .../research/service/model/entity/Resource.java | 115 +++++++++++++++++++++ .../research/service/model/entity/Tag.java | 41 ++++++++ .../research/service/model/entity/User.java | 100 ++++++++++++++++++ .../service/model/repo/ResourceRepository.java | 9 ++ .../research/service/model/repo/TagRepository.java | 8 ++ .../service/model/repo/UserRepository.java | 9 ++ .../src/main/proto/research-service.proto | 10 +- .../src/main/resources/application.yml | 2 +- 21 files changed, 719 insertions(+), 4 deletions(-) diff --git a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/ResponseTypes/ResourceResponse.java b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/ResponseTypes/ResourceResponse.java new file mode 100644 index 0000000000..90a19c8189 --- /dev/null +++ b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/ResponseTypes/ResourceResponse.java @@ -0,0 +1,26 @@ +package org.apache.airavata.research.service.ResponseTypes; + +import org.apache.airavata.research.service.enums.ResourceTypeEnum; +import org.apache.airavata.research.service.model.entity.Resource; + +public class ResourceResponse { + private ResourceTypeEnum type; + private Resource resource; + + // Getters and Setters + public ResourceTypeEnum getType() { + return type; + } + + public void setType(ResourceTypeEnum type) { + this.type = type; + } + + public Resource getResource() { + return resource; + } + + public void setResource(Resource resource) { + this.resource = resource; + } +} 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/ProjectController.java index 932d167b5e..f9ef89d4c9 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/ProjectController.java @@ -18,16 +18,62 @@ */ package org.apache.airavata.research.service.controller; +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.RepositoryResource; +import org.apache.airavata.research.service.model.entity.Resource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; 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.model.entity.NotebookResource; +import org.apache.airavata.research.service.handlers.ProjectHandler; + +import org.springframework.http.ResponseEntity; + @RestController -@RequestMapping("/api/v1/rf/project") +@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); + + + @org.springframework.beans.factory.annotation.Autowired + private ProjectHandler projectHandler; + + + // Endpoint for adding a DatasetResource + @PostMapping("/dataset") + public ResponseEntity<ResourceResponse> createDatasetResource(@RequestBody DatasetResource datasetResource) { + ResourceResponse response = projectHandler.createResource(datasetResource, ResourceTypeEnum.DATASET); + return ResponseEntity.ok(response); + } + + // Endpoint for adding a NotebookResource + @PostMapping("/notebook") + public ResponseEntity<ResourceResponse> createNotebookResource(@RequestBody NotebookResource notebookResource) { + ResourceResponse response = projectHandler.createResource(notebookResource, ResourceTypeEnum.NOTEBOOK); + return ResponseEntity.ok(response); + } + + // Endpoint for adding a RepositoryResource + @PostMapping("/repository") + public ResponseEntity<ResourceResponse> createRepositoryResource(@RequestBody RepositoryResource repositoryResource) { + ResourceResponse response = projectHandler.createResource(repositoryResource, ResourceTypeEnum.REPOSITORY); + return ResponseEntity.ok(response); + } + + @Operation( + summary = "Get dataset, notebook, or repository" + ) + @GetMapping(value = "/resources/{id}") + public ResponseEntity<ResourceResponse> getResource(@PathVariable(value="id") String id) { + return ResponseEntity.ok(projectHandler.getResourceById(id)); + } } diff --git a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/controller/UserController.java b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/controller/UserController.java new file mode 100644 index 0000000000..a054a6e465 --- /dev/null +++ b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/controller/UserController.java @@ -0,0 +1,73 @@ +package org.apache.airavata.research.service.controller; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import org.apache.airavata.research.service.handlers.UserHandler; + +import org.apache.airavata.research.service.model.entity.User; + +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; + +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.media.SchemaProperty; +import org.springframework.web.bind.annotation.RequestBody; + + +import org.apache.airavata.research.CreateUserRequest; + +@RestController +@RequestMapping("/api/v1/rf/user-management") +@Tag(name = "User Management", description = "Endpoints for managing users") +public class UserController { + @Autowired + private UserHandler userService; + + @Operation( + summary = "Create a new user", + description = "Adds a new user to the system" + ) + @PostMapping(value = "/users/{email}") + public ResponseEntity<Object> addUser( + @PathVariable("email") String email, + @RequestParam(value="first name") String firstName, + @RequestParam(value="last name") String lastName, + @RequestParam(value="avatar") String avatar + ) { + try { + CreateUserRequest userRequest = CreateUserRequest.newBuilder() + .setEmail(email) + .setFirstName(firstName) + .setLastName(lastName) + .setAvatar(avatar) + .build(); + User savedUser = userService.createUser(userRequest); + return ResponseEntity.ok(savedUser); + } catch(Exception e) { + return ResponseEntity.badRequest().body("Error: " + e.getMessage()); + } + } + + @Operation( + summary = "Get user profile", + description = "Get user profile" + ) + @GetMapping(value = "/users/{userIdOrEmail}") + public ResponseEntity<Object> getUser( + @PathVariable("userIdOrEmail") String userIdOrEmail + ) { + try { + User user = null; + if (userIdOrEmail.contains("@")) { + user = userService.getUserFromEmail(userIdOrEmail); + } else { + user = userService.getUserFromId(userIdOrEmail); + } + return ResponseEntity.ok(user); + } catch(Exception e) { + return ResponseEntity.badRequest().body("Error: " + e.getMessage()); + } + } +} diff --git a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/enums/PrivacyEnum.java b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/enums/PrivacyEnum.java new file mode 100644 index 0000000000..bf792685a6 --- /dev/null +++ b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/enums/PrivacyEnum.java @@ -0,0 +1,6 @@ +package org.apache.airavata.research.service.enums; + +public enum PrivacyEnum { + PUBLIC, + PRIVATE +} diff --git a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/enums/ResourceTypeEnum.java b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/enums/ResourceTypeEnum.java new file mode 100644 index 0000000000..c99b4c05f7 --- /dev/null +++ b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/enums/ResourceTypeEnum.java @@ -0,0 +1,15 @@ +package org.apache.airavata.research.service.enums; + +public enum ResourceTypeEnum { + NOTEBOOK("NOTEBOOK"), + DATASET("DATASET"), + REPOSITORY("REPOSITORY"); + + private String str; + ResourceTypeEnum(String str) { + this.str = str; + } + public String toString() { + return str; + } +} diff --git a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/enums/StatusEnum.java b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/enums/StatusEnum.java new file mode 100644 index 0000000000..4d50ce46c2 --- /dev/null +++ b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/enums/StatusEnum.java @@ -0,0 +1,8 @@ +package org.apache.airavata.research.service.enums; + +public enum StatusEnum { + NONE, + PENDING, + VERIFIED, + REJECTED, +} diff --git a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/exception/ErrorResponse.java b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/exception/ErrorResponse.java new file mode 100644 index 0000000000..a09dd77a29 --- /dev/null +++ b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/exception/ErrorResponse.java @@ -0,0 +1,47 @@ +package org.apache.airavata.research.service.exception; + +public class ErrorResponse { + private int status; + private String error; + private String message; + private long timestamp; + + public ErrorResponse(int status, String error, String message, long timestamp) { + this.status = status; + this.error = error; + this.message = message; + this.timestamp = timestamp; + } + + public int getStatus() { + return status; + } + + public void setStatus(int status) { + this.status = status; + } + + public String getError() { + return error; + } + + public void setError(String error) { + this.error = error; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public long getTimestamp() { + return timestamp; + } + + public void setTimestamp(long timestamp) { + this.timestamp = timestamp; + } +} diff --git a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/exception/GlobalExceptionHandler.java b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/exception/GlobalExceptionHandler.java new file mode 100644 index 0000000000..cd30317bc0 --- /dev/null +++ b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/exception/GlobalExceptionHandler.java @@ -0,0 +1,24 @@ +package org.apache.airavata.research.service.exception; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; + +@ControllerAdvice +public class GlobalExceptionHandler { + + @ExceptionHandler(RuntimeException.class) + public ResponseEntity<ErrorResponse> handleResourceNotFound(RuntimeException ex) { + // You can customize the error response here + ErrorResponse errorResponse = new ErrorResponse( + HttpStatus.NOT_FOUND.value(), + "Resource not found", + ex.getMessage(), + System.currentTimeMillis() + ); + + return new ResponseEntity<>(errorResponse, HttpStatus.NOT_FOUND); + } +} + 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 42c6ed5603..db140ac134 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,12 +18,91 @@ */ 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.*; +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 java.util.HashSet; +import java.util.Optional; +import java.util.Set; + [email protected] 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 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(); + 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 { + throw new RuntimeException("Unknown resource type: " + resource.getClass().getName()); + } + return response; + } } 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 new file mode 100644 index 0000000000..2f2ab3cadb --- /dev/null +++ b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/handlers/UserHandler.java @@ -0,0 +1,50 @@ +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 java.util.Date; + +@Service +public class UserHandler { + @Autowired + private UserRepository userRepository; + + + public User createUser(CreateUserRequest userRequest) { + if (userRepository.existsByEmail(userRequest.getEmail())) { + throw new RuntimeException("Email already exists!"); + } + + User user = new User(); + user.setFirstName(userRequest.getFirstName()); + user.setLastName(userRequest.getLastName()); + user.setEmail(userRequest.getEmail()); + Date date = new Date(); // same date for createdAt and updatedAt + user.setCreatedAt(date); + user.setUpdatedAt(date); + user.setAvatar(userRequest.getAvatar()); + + return userRepository.save(user); + } + + + public User getUserFromId(String userId) { + return userRepository.findById(userId).orElseThrow( + () -> new RuntimeException("User not found with id: " + userId) + ); + } + + public User getUserFromEmail(String email) { + if (!userRepository.existsByEmail(email)) { + throw new RuntimeException("User not found with email: " + email); + } + return userRepository.findByEmail(email); + } + +} diff --git a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/entity/DatasetResource.java b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/entity/DatasetResource.java new file mode 100644 index 0000000000..050b286177 --- /dev/null +++ b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/entity/DatasetResource.java @@ -0,0 +1,17 @@ +package org.apache.airavata.research.service.model.entity; +import jakarta.persistence.Entity; +import jakarta.persistence.Column; + +@Entity +public class DatasetResource extends Resource { + @Column(nullable = false) + private String datasetUrl; + + public String getDatasetUrl() { + return datasetUrl; + } + + public void setDatasetUrl(String datasetUrl) { + this.datasetUrl = datasetUrl; + } +} diff --git a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/entity/NotebookResource.java b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/entity/NotebookResource.java new file mode 100644 index 0000000000..f3db0a3382 --- /dev/null +++ b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/entity/NotebookResource.java @@ -0,0 +1,17 @@ +package org.apache.airavata.research.service.model.entity; +import jakarta.persistence.Entity; +import jakarta.persistence.Column; + +@Entity +public class NotebookResource extends Resource { + @Column(nullable = false) + private String notebookPath; + + public String getNotebookPath() { + return notebookPath; + } + + public void setNotebookPath(String notebookPath) { + this.notebookPath = notebookPath; + } +} diff --git a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/entity/RepositoryResource.java b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/entity/RepositoryResource.java new file mode 100644 index 0000000000..a40fd35e5c --- /dev/null +++ b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/entity/RepositoryResource.java @@ -0,0 +1,17 @@ +package org.apache.airavata.research.service.model.entity; +import jakarta.persistence.Entity; +import jakarta.persistence.Column; + +@Entity +public class RepositoryResource extends Resource { + @Column(nullable = false) + private String repositoryUrl; + + public String getRepositoryUrl() { + return repositoryUrl; + } + + public void setRepositoryUrl(String repositoryUrl) { + this.repositoryUrl = repositoryUrl; + } +} diff --git a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/entity/Resource.java b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/entity/Resource.java new file mode 100644 index 0000000000..d28d256403 --- /dev/null +++ b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/entity/Resource.java @@ -0,0 +1,115 @@ +package org.apache.airavata.research.service.model.entity; +import jakarta.persistence.*; + +import java.util.HashSet; +import java.util.Set; + +import org.apache.airavata.research.service.enums.StatusEnum; +import org.apache.airavata.research.service.enums.PrivacyEnum; +import org.hibernate.annotations.GenericGenerator; + +@Entity +@Inheritance(strategy = InheritanceType.JOINED) +public abstract class Resource { + @Id + @GeneratedValue(generator = "UUID") + @GenericGenerator(name = "UUID", strategy = "org.hibernate.id.UUIDGenerator") + @Column(nullable = false, updatable = false) + private String id; + + @Column(nullable = false) + private String name; + + @Column(nullable = false, columnDefinition = "TEXT") + private String description; + + @Column(nullable = false) + private String headerImage; + + @ManyToMany(cascade = CascadeType.MERGE, fetch = FetchType.EAGER) + @JoinTable( + name = "resource_authors", + joinColumns = @JoinColumn(name = "resource_id"), + inverseJoinColumns = @JoinColumn(name = "user_id") + ) + private Set<User> authors = new HashSet<>(); + + @ManyToMany(cascade = CascadeType.MERGE, fetch = FetchType.EAGER) + @JoinTable( + name = "resource_tags", + joinColumns = @JoinColumn(name = "resource_id"), + inverseJoinColumns = @JoinColumn(name = "tag_id") + ) + private Set<Tag> tags = new HashSet<>();; + + @Column(nullable = false) + @Enumerated(EnumType.STRING) + private StatusEnum status; + + @Column(nullable = false) + @Enumerated(EnumType.STRING) + private PrivacyEnum privacy; + + public String getHeaderImage() { + return headerImage; + } + + public void setHeaderImage(String headerImage) { + this.headerImage = headerImage; + } + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public java.util.Set<User> getAuthors() { + return authors; + } + + public void setAuthors(java.util.Set<User> authors) { + this.authors = authors; + } + + public java.util.Set<Tag> getTags() { + return tags; + } + + public void setTags(java.util.Set<Tag> tags) { + this.tags = tags; + } + + public org.apache.airavata.research.service.enums.StatusEnum getStatus() { + return status; + } + + public void setStatus(org.apache.airavata.research.service.enums.StatusEnum status) { + this.status = status; + } + + public org.apache.airavata.research.service.enums.PrivacyEnum getPrivacy() { + return privacy; + } + + public void setPrivacy(org.apache.airavata.research.service.enums.PrivacyEnum privacy) { + this.privacy = privacy; + } +} diff --git a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/entity/Tag.java b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/entity/Tag.java new file mode 100644 index 0000000000..2736a6909e --- /dev/null +++ b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/entity/Tag.java @@ -0,0 +1,41 @@ +package org.apache.airavata.research.service.model.entity; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Table; +import jakarta.persistence.ManyToMany; +import org.hibernate.annotations.GenericGenerator; + +import java.util.Set; + +@Entity +@Table(name = "tag") +public class Tag { + @Id + @GeneratedValue(generator = "UUID") + @GenericGenerator(name = "UUID", strategy = "org.hibernate.id.UUIDGenerator") + @Column(nullable = false, updatable = false) + private String id; + + @Column(nullable = false) + private String value; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } +} 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 new file mode 100644 index 0000000000..6f0055a24f --- /dev/null +++ b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/entity/User.java @@ -0,0 +1,100 @@ +package org.apache.airavata.research.service.model.entity; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import jakarta.persistence.TemporalType; +import java.util.Date; +import jakarta.persistence.Temporal; +import org.hibernate.annotations.GenericGenerator; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedDate; +import jakarta.persistence.GeneratedValue; + +@Entity +@Table(name = "user") +public class User { + @Id + @GeneratedValue(generator = "UUID") + @GenericGenerator(name = "UUID", strategy = "org.hibernate.id.UUIDGenerator") + @Column(nullable = false, updatable = false) + private String id; + + @Column(nullable = false) + private String firstName; + + @Column(nullable = false) + private String lastName; + + @Column(nullable = false) + private String email; + + @Column(nullable = false) + @Temporal(TemporalType.TIMESTAMP) + @CreatedDate + private Date createdAt; + + @Column(nullable = false) + @Temporal(TemporalType.TIMESTAMP) + @LastModifiedDate + private Date updatedAt; + + @Column(nullable = true) + private String avatar; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public java.util.Date getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(java.util.Date createdAt) { + this.createdAt = createdAt; + } + + public java.util.Date getUpdatedAt() { + return updatedAt; + } + + public void setUpdatedAt(java.util.Date updatedAt) { + this.updatedAt = updatedAt; + } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } +} diff --git a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/repo/ResourceRepository.java b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/repo/ResourceRepository.java new file mode 100644 index 0000000000..022035954f --- /dev/null +++ b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/repo/ResourceRepository.java @@ -0,0 +1,9 @@ +package org.apache.airavata.research.service.model.repo; + +import org.apache.airavata.research.service.model.entity.Resource; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface ResourceRepository extends JpaRepository<Resource, String> { +} diff --git a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/repo/TagRepository.java b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/repo/TagRepository.java new file mode 100644 index 0000000000..328c2431d8 --- /dev/null +++ b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/repo/TagRepository.java @@ -0,0 +1,8 @@ +package org.apache.airavata.research.service.model.repo; +import org.apache.airavata.research.service.model.entity.Tag; +import org.springframework.data.jpa.repository.JpaRepository; +import org.apache.airavata.research.service.model.entity.NotebookResource; + +public interface TagRepository extends JpaRepository<Tag, String> { + Tag findByValue(String value); +} 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 new file mode 100644 index 0000000000..f565d58b79 --- /dev/null +++ b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/repo/UserRepository.java @@ -0,0 +1,9 @@ +package org.apache.airavata.research.service.model.repo; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.apache.airavata.research.service.model.entity.User; + +public interface UserRepository extends JpaRepository<User, String> { + 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 688ad4a9bc..ccab060223 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 @@ -8,4 +8,12 @@ option java_outer_classname = "ResearchServiceProto"; option go_package = "protos/"; service ResearchService { -} \ No newline at end of file +} + +message CreateUserRequest { + string firstName = 2; + string lastName = 3; + string email = 4; + string avatar = 5; +} + diff --git a/modules/research-framework/research-service/src/main/resources/application.yml b/modules/research-framework/research-service/src/main/resources/application.yml index 73bbfdf573..f14091bd4e 100644 --- a/modules/research-framework/research-service/src/main/resources/application.yml +++ b/modules/research-framework/research-service/src/main/resources/application.yml @@ -25,7 +25,7 @@ spring: leak-detection-threshold: 20000 jpa: hibernate: - ddl-auto: create + ddl-auto: update open-in-view: false springdoc:
