Skip to content

Commit

Permalink
Merge pull request #16 from samply/feature/research-environment
Browse files Browse the repository at this point in the history
Feature/research environment
  • Loading branch information
djuarezgf authored Jul 1, 2024
2 parents 5c439b7 + b8c658b commit d1410ec
Show file tree
Hide file tree
Showing 27 changed files with 535 additions and 233 deletions.
5 changes: 4 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](http://keepachangelog.com/)
and this project adheres to [Semantic Versioning](http://semver.org/).

## [0.0.1 - 2024-06-26]
## [0.0.1 - 2024-07-01]
### Added
- First version of the project
- Spring Application
Expand Down Expand Up @@ -136,3 +136,6 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
- Check export execution status
- Coder Service
- RStudio in Coder
- Research environment project type
- Upload file to Coder
- Delete Coder workspace job
53 changes: 34 additions & 19 deletions src/main/java/de/samply/app/ProjectManagerConst.java
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,9 @@ public class ProjectManagerConst {
public final static String FETCH_OTHER_DOCUMENTS_ACTION = "FETCH_OTHER_DOCUMENTS";
public final static String ACCEPT_PROJECT_RESULTS_ACTION = "ACCEPT_PROJECT_RESULTS";
public final static String REJECT_PROJECT_RESULTS_ACTION = "REJECT_PROJECT_RESULTS";
public final static String ACCEPT_PROJECT_ANALYSIS_ACTION = "ACCEPT_PROJECT_ANALYSIS_ACTION";
public final static String REJECT_PROJECT_ANALYSIS_ACTION = "REJECT_PROJECT_ANALYSIS_ACTION";
public final static String REQUEST_CHANGES_IN_PROJECT_ANALYSIS_ACTION = "REQUEST_CHANGES_IN_PROJECT_ANALYSIS_ACTION";
public final static String REQUEST_CHANGES_IN_PROJECT_ACTION = "REQUEST_CHANGES_IN_PROJECT";
public final static String FETCH_NOTIFICATIONS_ACTION = "FETCH_NOTIFICATIONS";
public final static String SET_NOTIFICATION_AS_READ_ACTION = "SET_NOTIFICATION_AS_READ";
Expand Down Expand Up @@ -137,6 +140,9 @@ public class ProjectManagerConst {
public final static String ACCEPT_PROJECT_RESULTS = "/accept-project-results";
public final static String REJECT_PROJECT_RESULTS = "/reject-project-results";
public final static String REQUEST_CHANGES_IN_PROJECT = "/request-changes-in-project";
public final static String ACCEPT_PROJECT_ANALYSIS = "/accept-project-analysis";
public final static String REJECT_PROJECT_ANALYSIS = "/reject-project-analysis";
public final static String REQUEST_CHANGES_IN_PROJECT_ANALYSIS = "/request-changes-in-project-analysis";
public final static String FETCH_PROJECT_BRIDGEHEADS = "/project-bridgeheads";
public final static String FETCH_VISIBLE_PROJECT_BRIDGEHEADS = "/visible-project-bridgeheads";
public final static String FETCH_PROJECT = "/project";
Expand Down Expand Up @@ -242,14 +248,15 @@ public class ProjectManagerConst {
public static final String EXPORTER_QUERY_CONTEXT_PROJECT_ID = "PROJECT-ID";
public final static String EXPORTER_QUERY_CONTEXT_SEPARATOR = ";";
public final static String API_KEY = "ApiKey";
public final static String EXPORTER_FETCH_QUERY_EXECUTION_URL_PATH = "/response?query-execution-id=";


// Focus
public final static String FOCUS_METADATA_PROJECT = "exporter";
public final static String FOCUS_TASK_PATH = "/v1/tasks";
public final static String FOCUS_TASK_RESULTS_PATH = "/results";
public final static String FOCUS_TASK_WAIT_TIME_PARAM = "wait_time";
public final static String FOCUS_TASK_WAIT_COUNT_PARAM = "wait_count";
// Beam
public final static String BEAM_FOCUS_METADATA_PROJECT = "exporter";
public final static String BEAM_TASK_PATH = "/v1/tasks";
public final static String BEAM_TASK_RESULTS_PATH = "/results";
public final static String BEAM_TASK_WAIT_TIME_PARAM = "wait_time";
public final static String BEAM_TASK_WAIT_COUNT_PARAM = "wait_count";

// Token Manager Variables
public final static String TOKEN_MANAGER_ROOT = "/api";
Expand Down Expand Up @@ -306,12 +313,13 @@ public class ProjectManagerConst {
public final static String EMAIL_TEMPLATES_DIRECTORY = "EMAIL_TEMPLATES_DIRECTORY";
public final static String EXPORT_TEMPLATES = "EXPORT_TEMPLATES";
public final static String DATASHIELD_TEMPLATES = "DATASHIELD_TEMPLATES";
public final static String FOCUS_PROJECT_MANAGER_ID = "FOCUS_PROJECT_MANAGER_ID";
public final static String FOCUS_TTL = "FOCUS_TTL";
public final static String FOCUS_FAILURE_STRATEGY_BACKOFF_IN_MILLISECONDS = "FOCUS_FAILURE_STRATEGY_BACKOFF_IN_MILLISECONDS";
public final static String FOCUS_FAILURE_STRATEGY_MAX_TRIES = "FOCUS_FAILURE_STRATEGY_MAX_TRIES";
public final static String FOCUS_URL = "FOCUS_URL";
public final static String FOCUS_API_KEY = "FOCUS_API_KEY";
public final static String RESEARCH_ENVIRONMENT_TEMPLATES = "RESEARCH_ENVIRONMENT_TEMPLATES";
public final static String BEAM_PROJECT_MANAGER_ID = "BEAM_PROJECT_MANAGER_ID";
public final static String BEAM_TTL = "BEAM_TTL";
public final static String BEAM_FAILURE_STRATEGY_BACKOFF_IN_MILLISECONDS = "BEAM_FAILURE_STRATEGY_BACKOFF_IN_MILLISECONDS";
public final static String BEAM_FAILURE_STRATEGY_MAX_TRIES = "BEAM_FAILURE_STRATEGY_MAX_TRIES";
public final static String BEAM_URL = "BEAM_URL";
public final static String EXPORTER_API_KEY = "EXPORTER_API_KEY";
public final static String TOKEN_MANAGER_URL = "TOKEN_MANAGER_URL";
public final static String ENABLE_EMAILS = "ENABLE_EMAILS";
public final static String MANAGE_TOKENS_CRON_EXPRESSION = "MANAGE_TOKENS_CRON_EXPRESSION";
Expand Down Expand Up @@ -339,12 +347,15 @@ public class ProjectManagerConst {
public final static String CODER_CREATE_PATH = "CODER_CREATE_PATH";
public final static String CODER_DELETE_PATH = "CODER_DELETE_PATH";
public final static String CODER_SESSION_TOKEN = "CODER_SESSION_TOKEN";
public final static String CODER_CRON_EXPRESSION = "CODER_CRON_EXPRESSION";

public final static String CODER_ENABLE_JUPYTER_LAB_PARAM_VALUE = "CODER_ENABLE_JUPYTER_LAB_PARAM_VALUE";
public final static String CODER_ENABLE_RSTUDIO_PARAM_VALUE = "CODER_ENABLE_RSTUDIO_PARAM_VALUE";
public final static String CODER_ENABLE_VS_CODE_SERVER_PARAM_VALUE = "CODER_ENABLE_VS_CODE_SERVER_PARAM_VALUE";
public final static String CODER_DOTFILES_URL_PARAM_VALUE = "CODER_DOTFILES_URL_PARAM_VALUE";
public final static String CODER_ENABLE_FILE_RECEIVER_PARAM_VALUE = "CODER_ENABLE_FILE_RECEIVER_PARAM_VALUE";
public final static String CODER_BEAM_ID_SUFFIX = "CODER_BEAM_ID_SUFFIX";
public final static String CODER_TEST_FILE_BEAM_ID = "CODER_TEST_FILE_BEAM_ID";
public final static String ENABLE_CODER = "ENABLE_CODER";

// Spring Values (SV)
Expand Down Expand Up @@ -388,14 +399,15 @@ public class ProjectManagerConst {
public final static String EMAIL_TEMPLATES_DIRECTORY_SV = HEAD_SV + EMAIL_TEMPLATES_DIRECTORY + BOTTOM_SV;
public final static String EXPORT_TEMPLATES_SV = HEAD_SV + EXPORT_TEMPLATES + BOTTOM_SV;
public final static String DATASHIELD_TEMPLATES_SV = HEAD_SV + DATASHIELD_TEMPLATES + BOTTOM_SV;
public final static String RESEARCH_ENVIRONMENT_TEMPLATES_SV = HEAD_SV + RESEARCH_ENVIRONMENT_TEMPLATES + BOTTOM_SV;
public final static String TOKEN_MANAGER_URL_SV = HEAD_SV + TOKEN_MANAGER_URL + BOTTOM_SV;
public final static String FOCUS_PROJECT_MANAGER_ID_SV = HEAD_SV + FOCUS_PROJECT_MANAGER_ID + BOTTOM_SV;
public final static String FOCUS_TTL_SV = HEAD_SV + FOCUS_TTL + ":60s" + BOTTOM_SV;
public final static String FOCUS_FAILURE_STRATEGY_BACKOFF_IN_MILLISECONDS_SV =
HEAD_SV + FOCUS_FAILURE_STRATEGY_BACKOFF_IN_MILLISECONDS + ":1000" + BOTTOM_SV;
public final static String FOCUS_FAILURE_STRATEGY_MAX_TRIES_SV = HEAD_SV + FOCUS_FAILURE_STRATEGY_MAX_TRIES + ":5" + BOTTOM_SV;
public final static String FOCUS_URL_SV = HEAD_SV + FOCUS_URL + BOTTOM_SV;
public final static String FOCUS_API_KEY_SV = HEAD_SV + FOCUS_API_KEY + BOTTOM_SV;
public final static String BEAM_PROJECT_MANAGER_ID_SV = HEAD_SV + BEAM_PROJECT_MANAGER_ID + BOTTOM_SV;
public final static String BEAM_TTL_SV = HEAD_SV + BEAM_TTL + ":60s" + BOTTOM_SV;
public final static String BEAM_FAILURE_STRATEGY_BACKOFF_IN_MILLISECONDS_SV =
HEAD_SV + BEAM_FAILURE_STRATEGY_BACKOFF_IN_MILLISECONDS + ":1000" + BOTTOM_SV;
public final static String BEAM_FAILURE_STRATEGY_MAX_TRIES_SV = HEAD_SV + BEAM_FAILURE_STRATEGY_MAX_TRIES + ":5" + BOTTOM_SV;
public final static String BEAM_URL_SV = HEAD_SV + BEAM_URL + BOTTOM_SV;
public final static String EXPORTER_API_KEY_SV = HEAD_SV + EXPORTER_API_KEY + BOTTOM_SV;
public final static String ENABLE_EMAILS_SV = HEAD_SV + ENABLE_EMAILS + ":true" + BOTTOM_SV;
public final static String ENABLE_TOKEN_MANAGER_SV = HEAD_SV + ENABLE_TOKEN_MANAGER + ":true" + BOTTOM_SV;
public final static String ENABLE_EXPORTER_SV = HEAD_SV + ENABLE_EXPORTER + ":true" + BOTTOM_SV;
Expand All @@ -422,6 +434,9 @@ public class ProjectManagerConst {
public final static String CODER_CREATE_PATH_SV = HEAD_SV + CODER_CREATE_PATH + BOTTOM_SV;
public final static String CODER_DELETE_PATH_SV = HEAD_SV + CODER_DELETE_PATH + BOTTOM_SV;
public final static String CODER_SESSION_TOKEN_SV = HEAD_SV + CODER_SESSION_TOKEN + BOTTOM_SV;
public final static String CODER_BEAM_ID_SUFFIX_SV = HEAD_SV + CODER_BEAM_ID_SUFFIX + BOTTOM_SV;
public final static String CODER_TEST_FILE_BEAM_ID_SV = HEAD_SV + CODER_TEST_FILE_BEAM_ID + BOTTOM_SV;
public final static String CODER_CRON_EXPRESSION_SV = HEAD_SV + CODER_CRON_EXPRESSION + BOTTOM_SV;

public final static String CODER_ENABLE_JUPYTER_LAB_PARAM_VALUE_SV = HEAD_SV + CODER_ENABLE_JUPYTER_LAB_PARAM_VALUE + ":1" + BOTTOM_SV;
public final static String CODER_ENABLE_RSTUDIO_PARAM_VALUE_SV = HEAD_SV + CODER_ENABLE_RSTUDIO_PARAM_VALUE + ":1" + BOTTOM_SV;
Expand Down
51 changes: 47 additions & 4 deletions src/main/java/de/samply/app/ProjectManagerController.java
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,7 @@ public ResponseEntity<String> fetchProjectsBridgeheads(

@RoleConstraints(projectRoles = {ProjectRole.CREATOR, ProjectRole.PROJECT_MANAGER_ADMIN})
@StateConstraints(projectStates = {ProjectState.DEVELOP})
@ProjectConstraints(projectTypes = {ProjectType.DATASHIELD})
@ProjectConstraints(projectTypes = {ProjectType.DATASHIELD, ProjectType.RESEARCH_ENVIRONMENT})
@EmailSender(templateType = EmailTemplateType.INVITATION, recipients = {EmailRecipientType.EMAIL_ANNOTATION})
@EmailSender(templateType = EmailTemplateType.REQUEST_TECHNICAL_APPROVAL, recipients = {EmailRecipientType.BRIDGEHEAD_ADMIN})
//TODO: Send email to PM-ADMIN, that there was a problem with the operation
Expand All @@ -199,7 +199,7 @@ public ResponseEntity<String> setUserAsDeveloper(

@RoleConstraints(organisationRoles = {OrganisationRole.PROJECT_MANAGER_ADMIN})
@StateConstraints(projectStates = {ProjectState.PILOT})
@ProjectConstraints(projectTypes = {ProjectType.DATASHIELD})
@ProjectConstraints(projectTypes = {ProjectType.DATASHIELD, ProjectType.RESEARCH_ENVIRONMENT})
@EmailSender(templateType = EmailTemplateType.INVITATION, recipients = {EmailRecipientType.EMAIL_ANNOTATION})
@EmailSender(templateType = EmailTemplateType.REQUEST_TECHNICAL_APPROVAL, recipients = {EmailRecipientType.BRIDGEHEAD_ADMIN})
@FrontendSiteModule(site = ProjectManagerConst.PROJECT_VIEW_SITE, module = ProjectManagerConst.USER_MODULE)
Expand Down Expand Up @@ -431,7 +431,7 @@ public ResponseEntity<String> createProject(

@RoleConstraints(organisationRoles = {OrganisationRole.PROJECT_MANAGER_ADMIN})
@StateConstraints(projectStates = {ProjectState.ACCEPTED})
@ProjectConstraints(projectTypes = {ProjectType.DATASHIELD})
@ProjectConstraints(projectTypes = {ProjectType.DATASHIELD, ProjectType.RESEARCH_ENVIRONMENT})
@FrontendSiteModule(site = ProjectManagerConst.PROJECT_VIEW_SITE, module = ProjectManagerConst.PROJECT_STATE_MODULE)
@FrontendAction(action = ProjectManagerConst.START_DEVELOP_STAGE_ACTION)
@PostMapping(value = ProjectManagerConst.START_DEVELOP_STAGE)
Expand All @@ -443,7 +443,7 @@ public ResponseEntity<String> startDevelopStage(

@RoleConstraints(organisationRoles = {OrganisationRole.PROJECT_MANAGER_ADMIN})
@StateConstraints(projectStates = {ProjectState.DEVELOP})
@ProjectConstraints(projectTypes = {ProjectType.DATASHIELD})
@ProjectConstraints(projectTypes = {ProjectType.DATASHIELD, ProjectType.RESEARCH_ENVIRONMENT})
@FrontendSiteModule(site = ProjectManagerConst.PROJECT_VIEW_SITE, module = ProjectManagerConst.PROJECT_STATE_MODULE)
@FrontendAction(action = ProjectManagerConst.START_PILOT_STAGE_ACTION)
@PostMapping(value = ProjectManagerConst.START_PILOT_STAGE)
Expand Down Expand Up @@ -608,6 +608,49 @@ public ResponseEntity<String> requestChangesInProject(
return convertToResponseEntity(() -> userService.requestChangesInProject(projectCode, bridgehead));
}

@RoleConstraints(projectRoles = {ProjectRole.DEVELOPER, ProjectRole.PILOT})
@StateConstraints(projectStates = {ProjectState.DEVELOP, ProjectState.PILOT})
@EmailSender(templateType = EmailTemplateType.ANALYSIS_ACCEPTED, recipients = {EmailRecipientType.PROJECT_MANAGER_ADMIN, EmailRecipientType.ALL_DEVELOPERS, EmailRecipientType.ALL_PILOTS, EmailRecipientType.ALL_FINALS})
@FrontendSiteModule(site = ProjectManagerConst.PROJECT_VIEW_SITE, module = ProjectManagerConst.PROJECT_STATE_MODULE)
@FrontendAction(action = ProjectManagerConst.ACCEPT_PROJECT_ANALYSIS_ACTION)
@PostMapping(value = ProjectManagerConst.ACCEPT_PROJECT_ANALYSIS)
public ResponseEntity<String> acceptProjectAnalysis(
@ProjectCode @RequestParam(name = ProjectManagerConst.PROJECT_CODE) String projectCode,
@Bridgehead @RequestParam(name = ProjectManagerConst.BRIDGEHEAD) String bridgehead
) {
return convertToResponseEntity(() -> userService.acceptProject(projectCode, bridgehead));
}

@RoleConstraints(projectRoles = {ProjectRole.DEVELOPER, ProjectRole.PILOT})
@StateConstraints(projectStates = {ProjectState.DEVELOP, ProjectState.PILOT})
@EmailSender(templateType = EmailTemplateType.ANALYSIS_REJECTED, recipients = {EmailRecipientType.PROJECT_MANAGER_ADMIN, EmailRecipientType.ALL_DEVELOPERS, EmailRecipientType.ALL_PILOTS, EmailRecipientType.ALL_FINALS})
@FrontendSiteModule(site = ProjectManagerConst.PROJECT_VIEW_SITE, module = ProjectManagerConst.PROJECT_STATE_MODULE)
@FrontendAction(action = ProjectManagerConst.REJECT_PROJECT_ANALYSIS_ACTION)
@PostMapping(value = ProjectManagerConst.REJECT_PROJECT_ANALYSIS)
public ResponseEntity<String> rejectProjectAnalysis(
@ProjectCode @RequestParam(name = ProjectManagerConst.PROJECT_CODE) String projectCode,
@Bridgehead @RequestParam(name = ProjectManagerConst.BRIDGEHEAD) String bridgehead,
// Message is sent per email
@Message @RequestParam(name = ProjectManagerConst.MESSAGE, required = false) String message
) {
return convertToResponseEntity(() -> userService.rejectProject(projectCode, bridgehead));
}

@RoleConstraints(projectRoles = {ProjectRole.DEVELOPER, ProjectRole.PILOT})
@StateConstraints(projectStates = {ProjectState.DEVELOP, ProjectState.PILOT})
@EmailSender(templateType = EmailTemplateType.REQUEST_CHANGES_IN_PROJECT_ANALYSIS, recipients = {EmailRecipientType.PROJECT_MANAGER_ADMIN, EmailRecipientType.ALL_DEVELOPERS, EmailRecipientType.ALL_PILOTS, EmailRecipientType.ALL_FINALS})
@FrontendSiteModule(site = ProjectManagerConst.PROJECT_VIEW_SITE, module = ProjectManagerConst.PROJECT_STATE_MODULE)
@FrontendAction(action = ProjectManagerConst.REQUEST_CHANGES_IN_PROJECT_ANALYSIS_ACTION)
@PostMapping(value = ProjectManagerConst.REQUEST_CHANGES_IN_PROJECT_ANALYSIS)
public ResponseEntity<String> requestChangesInProjectAnalysis(
@ProjectCode @RequestParam(name = ProjectManagerConst.PROJECT_CODE) String projectCode,
@Bridgehead @RequestParam(name = ProjectManagerConst.BRIDGEHEAD) String bridgehead,
// Message is sent per email
@Message @RequestParam(name = ProjectManagerConst.MESSAGE, required = false) String message
) {
return convertToResponseEntity(() -> userService.requestChangesInProject(projectCode, bridgehead));
}

@RoleConstraints(organisationRoles = {OrganisationRole.PROJECT_MANAGER_ADMIN})
@StateConstraints(projectStates = {ProjectState.CREATED, ProjectState.ACCEPTED, ProjectState.DEVELOP, ProjectState.PILOT, ProjectState.FINAL})
@FrontendSiteModule(site = ProjectManagerConst.PROJECT_VIEW_SITE, module = ProjectManagerConst.PROJECT_STATE_MODULE)
Expand Down
13 changes: 9 additions & 4 deletions src/main/java/de/samply/bridgehead/BridgeheadConfiguration.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@ public class BridgeheadConfiguration {
@Data
public static class BridgeheadConfig {
private String explorerId;
private String focusId;
private String focusBeamId;
private String fileDispatcherBeamId;
private String tokenManagerId;
private String humanReadable;
}
Expand All @@ -34,7 +35,7 @@ public static class BridgeheadConfig {
private void initIdBridgeheadMaps() {
config.forEach((bridgehead, bridgeheadConfig) -> {
addBridgeheadId(bridgehead, bridgeheadConfig.getExplorerId(), explorerIdBridgeheadMap);
addBridgeheadId(bridgehead, bridgeheadConfig.getFocusId(), focusIdBridgeheadMap);
addBridgeheadId(bridgehead, bridgeheadConfig.getFocusBeamId(), focusIdBridgeheadMap);
addBridgeheadId(bridgehead, bridgeheadConfig.getTokenManagerId(), tokenManagerIdBridgeheadMap);
});
}
Expand All @@ -57,8 +58,8 @@ public boolean isRegisteredBridgehead(String bridgehead) {
return config.keySet().contains(bridgehead);
}

public String getFocusId(String bridgehead) {
return config.get(bridgehead).getFocusId();
public String getFocusBeamId(String bridgehead) {
return config.get(bridgehead).getFocusBeamId();
}

public String getHumanReadable(String bridgehead) {
Expand Down Expand Up @@ -86,6 +87,10 @@ public String fetchBridgeheadForFocusId(String focusId) {
return fetchBridgehead(focusId, focusIdBridgeheadMap);
}

public String getFileDispatcherBeamId(String bridgehead) {
return config.get(bridgehead).getFileDispatcherBeamId();
}

public Optional<String> getBridgeheadForTokenManagerId(String tokenManagerId) {
return fetchBridgeheadOptional(tokenManagerId, tokenManagerIdBridgeheadMap);
}
Expand Down
Loading

0 comments on commit d1410ec

Please sign in to comment.