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:

Reply via email to