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 c8c3b21492 spawn containers with the given project, reattach to 
existing sessions, service updates, and data initializations
c8c3b21492 is described below

commit c8c3b21492fc204df8cadd185173d56189318c39
Author: lahiruj <[email protected]>
AuthorDate: Mon Mar 31 17:05:24 2025 -0400

    spawn containers with the given project, reattach to existing sessions, 
service updates, and data initializations
---
 .../airavata/research/service/DataInitializer.java | 67 ++++++++++++++++++++++
 .../service/ResearchServiceApplication.java        |  9 +--
 .../research/service/config/AuthzTokenFilter.java  |  4 +-
 .../research/service/handlers/ProjectHandler.java  | 15 +++++
 .../service/handlers/ResearchHubHandler.java       | 24 ++++----
 .../research/service/handlers/SessionHandler.java  | 13 +++++
 .../research/service/handlers/UserHandler.java     | 33 ++++++-----
 .../research/service/model/UserContext.java        | 20 +++----
 .../research/service/model/entity/Project.java     | 36 +++++++++++-
 .../research/service/model/entity/Resource.java    | 30 ++++++++++
 .../research/service/model/entity/Session.java     | 26 ++++-----
 .../research/service/model/entity/User.java        | 23 ++++----
 12 files changed, 233 insertions(+), 67 deletions(-)

diff --git 
a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/DataInitializer.java
 
b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/DataInitializer.java
new file mode 100644
index 0000000000..5d7389cdb8
--- /dev/null
+++ 
b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/DataInitializer.java
@@ -0,0 +1,67 @@
+package org.apache.airavata.research.service;
+
+import org.apache.airavata.research.service.enums.PrivacyEnum;
+import org.apache.airavata.research.service.enums.StatusEnum;
+import org.apache.airavata.research.service.model.entity.DatasetResource;
+import org.apache.airavata.research.service.model.entity.Project;
+import org.apache.airavata.research.service.model.entity.RepositoryResource;
+import org.apache.airavata.research.service.model.entity.User;
+import org.apache.airavata.research.service.model.repo.ProjectRepository;
+import org.apache.airavata.research.service.model.repo.ResourceRepository;
+import org.apache.airavata.research.service.model.repo.UserRepository;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.stereotype.Component;
+
+@Component
+public class DataInitializer implements CommandLineRunner {
+
+    private final UserRepository userRepository;
+    private final ProjectRepository projectRepository;
+    private final ResourceRepository resourceRepository;
+
+    public DataInitializer(UserRepository userRepository, ProjectRepository 
projectRepository, ResourceRepository resourceRepository) {
+        this.userRepository = userRepository;
+        this.projectRepository = projectRepository;
+        this.resourceRepository = resourceRepository;
+    }
+
+    @Override
+    public void run(String... args) {
+        cleanup();
+
+        User user = new User("[email protected]", "airavata", "admin", 
"[email protected]");
+        userRepository.save(user);
+
+        RepositoryResource repositoryResource = new RepositoryResource();
+        repositoryResource.setName("BMTK Repository");
+        repositoryResource.setDescription("Repository for the BMTK workshop 
project");
+        repositoryResource.setHeaderImage("header_image.png");
+        
repositoryResource.setRepositoryUrl("https://github.com/AllenInstitute/bmtk-workshop.git";);
+        repositoryResource.setStatus(StatusEnum.VERIFIED);
+        repositoryResource.setPrivacy(PrivacyEnum.PUBLIC);
+        repositoryResource = resourceRepository.save(repositoryResource);
+
+        DatasetResource datasetResource = new DatasetResource();
+        datasetResource.setName("BMTK Dataset");
+        datasetResource.setDescription("Dataset for the BMTK workshop 
project");
+        datasetResource.setHeaderImage("header_image.png");
+        datasetResource.setDatasetUrl("bmtk");
+        datasetResource.setStatus(StatusEnum.VERIFIED);
+        datasetResource.setPrivacy(PrivacyEnum.PUBLIC);
+        datasetResource = resourceRepository.save(datasetResource);
+
+        Project project = new Project();
+        project.setRepositoryResource(repositoryResource);
+        project.getDatasetResources().add(datasetResource);
+
+        projectRepository.save(project);
+
+        System.out.println("Initialized Project with id: " + project.getId());
+    }
+
+    public void cleanup() {
+        userRepository.deleteAll();
+        projectRepository.deleteAll();
+        resourceRepository.deleteAll();
+    }
+}
\ No newline at end of file
diff --git 
a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/ResearchServiceApplication.java
 
b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/ResearchServiceApplication.java
index 688ae0ec29..136ffecb76 100644
--- 
a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/ResearchServiceApplication.java
+++ 
b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/ResearchServiceApplication.java
@@ -1,5 +1,4 @@
 /**
- *
  * 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
@@ -7,9 +6,9 @@
  * 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
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
+ * <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
@@ -21,10 +20,12 @@ package org.apache.airavata.research.service;
 
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
 import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
 
 @SpringBootApplication
 @EnableJpaRepositories()
+@EnableJpaAuditing
 public class ResearchServiceApplication {
     public static void main(String[] args) {
         SpringApplication.run(ResearchServiceApplication.class, args);
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 b8d281b47c..0feac1cf6a 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
@@ -42,6 +42,7 @@ import java.util.Map;
 public class AuthzTokenFilter extends OncePerRequestFilter {
 
     private static final Logger LOGGER = 
LoggerFactory.getLogger(AuthzTokenFilter.class);
+    private static final String USERNAME_CLAIM = "userName";
 
     private final UserHandler userHandler;
 
@@ -76,7 +77,8 @@ public class AuthzTokenFilter extends OncePerRequestFilter {
             authzToken.setClaimsMap(claimsMap);
 
             UserContext.setAuthzToken(authzToken);
-            userHandler.initializeUser(UserContext.username());
+            
UserContext.setUser(userHandler.initializeOrGetUser(claimsMap.get(USERNAME_CLAIM)));
+
         } 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/handlers/ProjectHandler.java
 
b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/handlers/ProjectHandler.java
index 7bea3e254e..eb76fcf939 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,6 +18,9 @@
  */
 package org.apache.airavata.research.service.handlers;
 
+import jakarta.persistence.EntityNotFoundException;
+import org.apache.airavata.research.service.model.entity.Project;
+import org.apache.airavata.research.service.model.repo.ProjectRepository;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
@@ -27,4 +30,16 @@ public class ProjectHandler {
 
     private static final Logger LOGGER = 
LoggerFactory.getLogger(ProjectHandler.class);
 
+    private final ProjectRepository projectRepository;
+
+    public ProjectHandler(ProjectRepository projectRepository) {
+        this.projectRepository = projectRepository;
+    }
+
+    public Project findProject(String projectId) {
+        return projectRepository.findById(projectId).orElseThrow(() -> {
+            LOGGER.error("Unable to find a Project with id: " + projectId);
+            return new EntityNotFoundException("Unable to find a Project with 
id: " + projectId);
+        });
+    }
 }
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 01d8cc01fb..308edd7dbe 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
@@ -19,14 +19,14 @@
 package org.apache.airavata.research.service.handlers;
 
 import org.apache.airavata.research.service.model.UserContext;
+import org.apache.airavata.research.service.model.entity.DatasetResource;
+import org.apache.airavata.research.service.model.entity.Project;
 import org.apache.airavata.research.service.model.entity.Session;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
-import java.util.UUID;
-
 @Service
 public class ResearchHubHandler {
 
@@ -46,19 +46,23 @@ public class ResearchHubHandler {
     }
 
     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";;
-        String dataPath = "bmtk";
-        String randomSessionName = "session-" + 
UUID.randomUUID().toString().substring(0, 6);
-        System.out.println("Session: " + randomSessionName);
-        return String.format(RH_SPAWN_URL, csHubUrl, UserContext.username(), 
randomSessionName, gitUrl, dataPath);
+        Project project = projectHandler.findProject(projectId);
+        // TODO should support multiple data sets for RHub
+        DatasetResource dataset = 
project.getDatasetResources().stream().findFirst().get();
+        Session session = sessionHandler.createSession(sessionName, project);
+
+        String spawnUrl = String.format(RH_SPAWN_URL, csHubUrl, 
UserContext.username(), session.getId(), 
project.getRepositoryResource().getRepositoryUrl(), dataset.getDatasetUrl());
+        LOGGER.debug("Generated the spawn url: {} for the user: {} against the 
project: {}", spawnUrl, UserContext.username(), projectId);
+        return spawnUrl;
     }
 
     public String resolveRHubExistingSession(String sessionId) {
         LOGGER.debug("Resolving RH session id {} for user: {}", sessionId, 
UserContext.username());
         // TODO restrict this execution for owner
         Session session = sessionHandler.findSession(sessionId);
-        return String.format(RH_SESSION_URL, csHubUrl, UserContext.username(), 
session.getId());
+
+        String sessionUrl = String.format(RH_SESSION_URL, csHubUrl, 
UserContext.username(), session.getId());
+        LOGGER.debug("Generated the session url: {} for the user: {}", 
sessionUrl, UserContext.username());
+        return sessionUrl;
     }
 }
diff --git 
a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/handlers/SessionHandler.java
 
b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/handlers/SessionHandler.java
index 367380c867..d9c56d6127 100644
--- 
a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/handlers/SessionHandler.java
+++ 
b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/handlers/SessionHandler.java
@@ -19,12 +19,17 @@
 package org.apache.airavata.research.service.handlers;
 
 import jakarta.persistence.EntityNotFoundException;
+import org.apache.airavata.research.service.model.UserContext;
+import org.apache.airavata.research.service.model.entity.Project;
 import org.apache.airavata.research.service.model.entity.Session;
 import org.apache.airavata.research.service.model.repo.SessionRepository;
+import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
 
+import java.util.UUID;
+
 @Service
 public class SessionHandler {
 
@@ -42,4 +47,12 @@ public class SessionHandler {
             return new EntityNotFoundException("Unable to find session with 
id: " + sessionId);
         });
     }
+
+    public Session createSession(String sessionName, Project project) {
+        sessionName = StringUtils.isNotBlank(sessionName) ? sessionName : 
UUID.randomUUID().toString().substring(0, 6);
+        Session session = new Session(sessionName, UserContext.user(), 
project);
+        session = sessionRepository.save(session);
+        LOGGER.debug("Created session with Id: {}, Name: {}", session.getId(), 
sessionName);
+        return session;
+    }
 }
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 e984a53f08..7959c37676 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
@@ -18,6 +18,7 @@
  */
 package org.apache.airavata.research.service.handlers;
 
+import jakarta.persistence.EntityNotFoundException;
 import org.apache.airavata.research.CreateUserRequest;
 import org.apache.airavata.research.service.model.entity.User;
 import org.apache.airavata.research.service.model.repo.UserRepository;
@@ -25,8 +26,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
 
-import java.util.Date;
-
 @Service
 public class UserHandler {
 
@@ -48,9 +47,6 @@ public class UserHandler {
         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);
@@ -70,16 +66,25 @@ 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
+    public User findUserByUsername(String username) {
+        return userRepository.findById(username).orElseThrow(() -> {
+            LOGGER.error("Unable to find a User with a username: " + username);
+            return new EntityNotFoundException("Unable to find a User with a 
username: " + username);
+        });
+    }
+
+    public User initializeOrGetUser(String username) {
+        return userRepository.findByUsername(username)
+                .map(user -> {
+                    LOGGER.debug("User {} is already registered.", username);
+                    return user;
+                })
+                .orElseGet(() -> {
+                    // TODO: Initialize this using the Airavata user profile 
if needed.
                     User newUser = new User(username, "CHANGE_ME", 
"CHANGE_ME", username);
-                    userRepository.save(newUser);
+                    newUser = userRepository.save(newUser);
                     LOGGER.info("Initialized new user with username {}.", 
username);
-                }
-        );
+                    return newUser;
+                });
     }
-
 }
diff --git 
a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/UserContext.java
 
b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/UserContext.java
index b128cfb331..f4ce77d1d0 100644
--- 
a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/UserContext.java
+++ 
b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/UserContext.java
@@ -19,12 +19,12 @@
 package org.apache.airavata.research.service.model;
 
 import org.apache.airavata.model.security.AuthzToken;
-
-import java.util.Map;
+import org.apache.airavata.research.service.model.entity.User;
 
 public class UserContext {
 
     private static final ThreadLocal<AuthzToken> AUTHZ_TOKEN = new 
ThreadLocal<>();
+    private static final ThreadLocal<User> CURRENT_USER = new ThreadLocal<>();
 
     public static AuthzToken authzToken() {
         return AUTHZ_TOKEN.get();
@@ -34,19 +34,15 @@ public class UserContext {
         AUTHZ_TOKEN.set(token);
     }
 
-    public static String username() {
-        return getClaim("userName");
+    public static User user() {
+        return CURRENT_USER.get();
     }
 
-    public static String gatewayId() {
-        return getClaim("gatewayID");
+    public static void setUser(User user) {
+        CURRENT_USER.set(user);
     }
 
-    private static String getClaim(String claimId) {
-        return AUTHZ_TOKEN.get().getClaimsMap().entrySet().stream()
-                .filter(entry -> entry.getKey().equalsIgnoreCase(claimId))
-                .map(Map.Entry::getValue)
-                .findFirst()
-                .orElseThrow(() -> new IllegalArgumentException("Missing '" + 
claimId + "' claim in the authentication token"));
+    public static String username() {
+        return CURRENT_USER.get().getUsername();
     }
 }
diff --git 
a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/entity/Project.java
 
b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/entity/Project.java
index a486fe03c1..7431ee79fb 100644
--- 
a/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/entity/Project.java
+++ 
b/modules/research-framework/research-service/src/main/java/org/apache/airavata/research/service/model/entity/Project.java
@@ -21,6 +21,7 @@ package org.apache.airavata.research.service.model.entity;
 import jakarta.persistence.CascadeType;
 import jakarta.persistence.Column;
 import jakarta.persistence.Entity;
+import jakarta.persistence.EntityListeners;
 import jakarta.persistence.FetchType;
 import jakarta.persistence.GeneratedValue;
 import jakarta.persistence.Id;
@@ -29,11 +30,16 @@ import jakarta.persistence.JoinTable;
 import jakarta.persistence.ManyToMany;
 import jakarta.persistence.ManyToOne;
 import org.hibernate.annotations.UuidGenerator;
+import org.springframework.data.annotation.CreatedDate;
+import org.springframework.data.annotation.LastModifiedDate;
+import org.springframework.data.jpa.domain.support.AuditingEntityListener;
 
+import java.time.Instant;
 import java.util.HashSet;
 import java.util.Set;
 
 @Entity(name = "PROJECT")
+@EntityListeners(AuditingEntityListener.class)
 public class Project {
 
     @Id
@@ -46,7 +52,7 @@ public class Project {
     @JoinColumn(name = "repository_resource_id")
     private RepositoryResource repositoryResource;
 
-    @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
+    @ManyToMany(fetch = FetchType.EAGER)
     @JoinTable(
             name = "project_dataset",
             joinColumns = @JoinColumn(name = "project_id"),
@@ -54,6 +60,14 @@ public class Project {
     )
     private Set<DatasetResource> datasetResources = new HashSet<>();
 
+    @Column(nullable = false, updatable = false)
+    @CreatedDate
+    private Instant createdAt;
+
+    @Column(nullable = false)
+    @LastModifiedDate
+    private Instant updatedAt;
+
     public String getId() {
         return id;
     }
@@ -77,4 +91,24 @@ public class Project {
     public void setDatasetResources(Set<DatasetResource> datasetResources) {
         this.datasetResources = datasetResources;
     }
+
+    public void addDatasetResource(DatasetResource datasetResource) {
+        this.datasetResources.add(datasetResource);
+    }
+
+    public Instant getCreatedAt() {
+        return createdAt;
+    }
+
+    public void setCreatedAt(Instant createdAt) {
+        this.createdAt = createdAt;
+    }
+
+    public Instant getUpdatedAt() {
+        return updatedAt;
+    }
+
+    public void setUpdatedAt(Instant updatedAt) {
+        this.updatedAt = updatedAt;
+    }
 }
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
index 2019605857..9c3fca15c7 100644
--- 
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
@@ -21,6 +21,7 @@ package org.apache.airavata.research.service.model.entity;
 import jakarta.persistence.CascadeType;
 import jakarta.persistence.Column;
 import jakarta.persistence.Entity;
+import jakarta.persistence.EntityListeners;
 import jakarta.persistence.EnumType;
 import jakarta.persistence.Enumerated;
 import jakarta.persistence.FetchType;
@@ -35,13 +36,18 @@ import jakarta.persistence.Table;
 import org.apache.airavata.research.service.enums.PrivacyEnum;
 import org.apache.airavata.research.service.enums.StatusEnum;
 import org.hibernate.annotations.UuidGenerator;
+import org.springframework.data.annotation.CreatedDate;
+import org.springframework.data.annotation.LastModifiedDate;
+import org.springframework.data.jpa.domain.support.AuditingEntityListener;
 
+import java.time.Instant;
 import java.util.HashSet;
 import java.util.Set;
 
 @Entity
 @Table(name = "RESOURCE")
 @Inheritance(strategy = InheritanceType.JOINED)
+@EntityListeners(AuditingEntityListener.class)
 public abstract class Resource {
 
     @Id
@@ -83,6 +89,14 @@ public abstract class Resource {
     @Enumerated(EnumType.STRING)
     private PrivacyEnum privacy;
 
+    @Column(nullable = false, updatable = false)
+    @CreatedDate
+    private Instant createdAt;
+
+    @Column(nullable = false)
+    @LastModifiedDate
+    private Instant updatedAt;
+
     public String getHeaderImage() {
         return headerImage;
     }
@@ -146,4 +160,20 @@ public abstract class Resource {
     public void 
setPrivacy(org.apache.airavata.research.service.enums.PrivacyEnum privacy) {
         this.privacy = privacy;
     }
+
+    public Instant getCreatedAt() {
+        return createdAt;
+    }
+
+    public void setCreatedAt(Instant createdAt) {
+        this.createdAt = createdAt;
+    }
+
+    public Instant getUpdatedAt() {
+        return updatedAt;
+    }
+
+    public void setUpdatedAt(Instant updatedAt) {
+        this.updatedAt = updatedAt;
+    }
 }
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 a436d03b43..46f7d47391 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
@@ -20,22 +20,23 @@ package org.apache.airavata.research.service.model.entity;
 
 import jakarta.persistence.Column;
 import jakarta.persistence.Entity;
+import jakarta.persistence.EntityListeners;
 import jakarta.persistence.FetchType;
 import jakarta.persistence.GeneratedValue;
 import jakarta.persistence.Id;
 import jakarta.persistence.JoinColumn;
 import jakarta.persistence.ManyToOne;
 import jakarta.persistence.Table;
-import jakarta.persistence.Temporal;
-import jakarta.persistence.TemporalType;
 import org.hibernate.annotations.UuidGenerator;
 import org.springframework.data.annotation.CreatedDate;
 import org.springframework.data.annotation.LastModifiedDate;
+import org.springframework.data.jpa.domain.support.AuditingEntityListener;
 
-import java.util.Date;
+import java.time.Instant;
 
 @Entity
 @Table(name = "SESSION")
+@EntityListeners(AuditingEntityListener.class)
 public class Session {
 
     @Id
@@ -55,22 +56,21 @@ public class Session {
     @JoinColumn(name = "project_id")
     private Project project;
 
-    @Column(nullable = false)
-    @Temporal(TemporalType.TIMESTAMP)
+    @Column(nullable = false, updatable = false)
     @CreatedDate
-    private Date createdAt;
+    private Instant createdAt;
 
     @Column(nullable = false)
-    @Temporal(TemporalType.TIMESTAMP)
     @LastModifiedDate
-    private Date updatedAt;
+    private Instant updatedAt;
 
     public Session() {
     }
 
-    public Session(String sessionName, User user) {
+    public Session(String sessionName, User user, Project project) {
         this.sessionName = sessionName;
         this.user = user;
+        this.project = project;
     }
 
     public String getId() {
@@ -105,19 +105,19 @@ public class Session {
         this.project = project;
     }
 
-    public java.util.Date getCreatedAt() {
+    public Instant getCreatedAt() {
         return createdAt;
     }
 
-    public void setCreatedAt(java.util.Date createdAt) {
+    public void setCreatedAt(Instant createdAt) {
         this.createdAt = createdAt;
     }
 
-    public java.util.Date getUpdatedAt() {
+    public Instant getUpdatedAt() {
         return updatedAt;
     }
 
-    public void setUpdatedAt(java.util.Date updatedAt) {
+    public void setUpdatedAt(Instant updatedAt) {
         this.updatedAt = updatedAt;
     }
 }
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 e1b4b59746..dd4d5e33e1 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
@@ -20,19 +20,20 @@ package org.apache.airavata.research.service.model.entity;
 
 import jakarta.persistence.Column;
 import jakarta.persistence.Entity;
+import jakarta.persistence.EntityListeners;
 import jakarta.persistence.GeneratedValue;
 import jakarta.persistence.Id;
 import jakarta.persistence.Table;
-import jakarta.persistence.Temporal;
-import jakarta.persistence.TemporalType;
 import org.hibernate.annotations.UuidGenerator;
 import org.springframework.data.annotation.CreatedDate;
 import org.springframework.data.annotation.LastModifiedDate;
+import org.springframework.data.jpa.domain.support.AuditingEntityListener;
 
-import java.util.Date;
+import java.time.Instant;
 
 @Entity
 @Table(name = "AUTHOR")
+@EntityListeners(AuditingEntityListener.class)
 public class User {
 
     @Id
@@ -53,15 +54,13 @@ public class User {
     @Column(nullable = false)
     private String email;
 
-    @Column(nullable = false)
-    @Temporal(TemporalType.TIMESTAMP)
+    @Column(nullable = false, updatable = false)
     @CreatedDate
-    private Date createdAt;
+    private Instant createdAt;
 
     @Column(nullable = false)
-    @Temporal(TemporalType.TIMESTAMP)
     @LastModifiedDate
-    private Date updatedAt;
+    private Instant updatedAt;
 
     @Column(nullable = true)
     private String avatar;
@@ -116,19 +115,19 @@ public class User {
         this.email = email;
     }
 
-    public java.util.Date getCreatedAt() {
+    public Instant getCreatedAt() {
         return createdAt;
     }
 
-    public void setCreatedAt(java.util.Date createdAt) {
+    public void setCreatedAt(Instant createdAt) {
         this.createdAt = createdAt;
     }
 
-    public java.util.Date getUpdatedAt() {
+    public Instant getUpdatedAt() {
         return updatedAt;
     }
 
-    public void setUpdatedAt(java.util.Date updatedAt) {
+    public void setUpdatedAt(Instant updatedAt) {
         this.updatedAt = updatedAt;
     }
 

Reply via email to