diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index ba583836..ee7ef1b8 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -23,7 +23,7 @@ jobs:
uses: actions/setup-java@v3
with:
distribution: 'temurin'
- java-version: '21'
+ java-version: '25'
- name: Check out Git repository
uses: actions/checkout@v3
@@ -47,7 +47,7 @@ jobs:
uses: actions/setup-java@v3
with:
distribution: 'temurin'
- java-version: '21'
+ java-version: '25'
- name: Check out Git repository
uses: actions/checkout@v3
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0d4c8c45..20e194e0 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,28 +4,28 @@ 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 - 2025-02-11]
+## [1.0.0 - 2026-05-27]
### Added
- First version of the project
- Spring Application
-- State Machine for project
+- State Machine for a project
- Project states and event states
- Project Service
- OAuth2 Security
-- OIDC <> Organisation Roles Mapping
+- OIDC <> Organization Roles Mapping
- Session User Info
- Session User Info email
- Multi bridgehead user
-- Test user if security disabled
+- Test user if security is disabled
- Bridgehead configuration
- User Service
- Project Role Constraints Aspect
- Extract path roles map for Security Configuration
- Project State Constraints Aspect
- Frontend service
-- Set user as developer, pilot or final
-- REST Services: Design and Create project
-- REST Service: Accept, reject, archive, start develop, start pilot, start final, finish
+- Set the user as a developer, pilot or final
+- REST Services: Design and Create a project
+- REST Service: Accept, reject, archive, start developer, start pilot, start final, finish
- Project Query and Query Format
- REST Services: Create Query and Create CQL DATA Query
- Document Service
@@ -33,7 +33,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
- Project Type
- HTTP Method for every endpoint in Security Configuration
- IS_TEST_ENVIRONMENT variable disables CSRF
-- Create CREATOR user after creating project
+- Create CREATOR user after creating a project
- Send and execute query REST Services
- Label, description, template-id and output-format in Query
- Token Manager Service
@@ -42,7 +42,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
- Exporter Service implementation
- Bridgehead configuration with explorer and exporter mapping
- Bridgehead Operation
-- Create query and draft project (Lens)
+- Create a query and draft a project (Lens)
- humanReadable in Bridgehead Config
- Email Service
- Email Templates
@@ -55,29 +55,29 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
- Module names
- Http Method and Params for Actions
- Test endpoint
-- Download application form
+- Download the application form
- Edit project and query
- Fetch output format, query format and templates
- Query Context
-- Download document rights to developer, pilot and final users
+- Download document rights to a developer, pilot and final users
- Fetch Projects
-- Modified Desc as parameter of fetch projects
+- Modified Desc as a parameter of fetch projects
- Upload and download documents by document type
- Fetch publications and other documents
- Fetch project types
- Accept and reject project bridgehead
- Fetch project bridgeheads
-- Accept, reject and request changes in script
+- Accept, reject and request changes in a script
- Fetch all actions
- Accept, Reject and request changes in project results
- Notification Service
- Token Manager services
- Integration in Focus and Beam
- Frontend DTO
-- Email as Mime message
+- Email as a Mime message
- EmailSenderIfError annotation
- Frontend DTO converters
-- Fetch all user visible notifications
+- Fetch all user-visible notifications
- Accepted state requirement for setting user as developer or pilot
- Notification User Action
- Replace Bridgehead Operation through Notification
@@ -89,16 +89,16 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
- Add notifications for services: document, project bridgehead, project event, project, query, user
- DataSHIELD Token Manager Job
- Check Expired Active Projects Job
-- Check if session scope is active before creating a notification for changing project state
-- Fetch token status and project status of token manager
-- New email if authentication script for DataSHIELD has changed
+- Check if the session scope is active before creating a notification for changing the project state
+- Fetch token status and project status of a token manager
+- New email if an authentication script for DataSHIELD has changed
- Explorer URL in CORS
- Oauth2 Resource Server configuration
- Allow required headers
- Project Constraints: Project Type
-- Email template for Accept/Reject/Request changes in project
+- Email template for Accept/Reject/Request changes in a project
- User Autocomplete
-- Explorer Ids to create and edit query
+- Explorer Ids to create and edit a query
- Decode redirect explorer URL
- Fetch project users
- rejectProject state constraints
@@ -106,14 +106,14 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
- Flag ENABLE_TOKEN_MANAGER
- Content Disposition in exposed headers
- Exists Votum and Application Form
-- Exists Script
+- Script exists
- Explorer Redirect URI
- User State in Frontend DTO
- Fetch project configurations
-- Exists authentication script
+- There exists an authentication script
- Remove inactive projects in Opal
- Project Bridgehead DataSHIELD info
-- Set project bridgehead datashield removed to false while sending query of DATASHIELD project to exporter
+- Set project bridgehead datashield removed to false while sending a query of a DATASHIELD project to exporter
- Fetch current project configuration
- Custom project configuration
- Fetch visible bridgeheads and fetch project bridgeheads
@@ -121,50 +121,50 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
- Fetch Project Roles
- Email Types: NEW_PROJECT_ACCEPTED, NEW_VOTUM, REQUEST_TECHNICAL_APPROVAL, NEW_PUBLICATION
- Email config for types NEW_PROJECT_ACCEPTED, NEW_VOTUM, REQUEST_TECHNICAL_APPROVAL, NEW_PUBLICATION
-- Fetch label of application form, label and script
+- Fetch label of an application form, label and script
- Service exist invited users
- R-Studio Group Manager
- Email Sender: ALL_DEVELOP, ALL_PILOT, ALL_FINAL
- Send email to all involved users after a publication has been uploaded
- Project and project view url in email context
-- Create notification after sending an email
-- Send message while requesting changes in script or project
-- Send message while rejecting a project
+- Create a notification after sending an email
+- Send a message while requesting changes in a script or project
+- Send a message while rejecting a project
- Exporter Job
- Check Queries in Exporter Job
-- Max time to wait focus task in minutes
+- Max time to wait a focus task in minutes
- Check export execution status
- Coder Service
- RStudio in Coder
- Research environment project type
- Upload file to Coder
- Delete Coder workspace job
-- Resend export files to research environment
+- Resend export files to a research environment
- Query Code in Explorer URL
-- Decode human readable in base 64
-- Log bridgeheads at start
-- Replace hypen in bridgeheads
+- Decode human-readable in base 64
+- Log bridgeheads at the start
+- Replace hype in bridgeheads
- Log bridgeheads sorted
- Replace hyphen in frontend sites
- Human Readable Bridgehead for frontend dto
- Http proxy configuration
- Email as HTML
-- Provide also human readable by fetch all registered bridgeheads
+- Provide also human-readable by fetching all registered bridgeheads
- DataSHIELD Project Status Error
- Catch token manager exceptions and return ERROR status
-- Send emails in async execution pool
+- Send emails in the async execution pool
- Notification async execution pool
- Exporter async execution pool
- Action explanations
-- Integration of action explanatios in fetch Actions
+- Integration of action examples in fetch Actions
- Action explanations templates
- Email Context
- Extend email context
- Thymeleaf Dialect for email context variables
-- Combine first and last name in name
-- Replace email context variables in email subject
-- Default and Default var in html tags
-- Fetch human readable bridgehead for emails
+- Combine first and last name in a name
+- Replace email context variables in the email subject
+- Default and Default var in HTML tags
+- Fetch human-readable bridgehead for emails
- Email context project bridgeheads variable
- Decode Base64 values of email context
- Enable minus in variables of email context
@@ -173,35 +173,35 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
- Process variables recursively in Thymeleaf
- Creator name in Frontend Project
- Action explanation priority
-- Configurations as file
+- Configurations as a file
- File Description for Frontend
-- Fetch Project-States for dashboard site
+- Fetch Project-States for the dashboard site
- Primary and Test Mail Server
-- Email if project rejected
-- Send email when the query has arrived to the exporter or it has been executed
+- Email if a project is rejected
+- Send email when the query has arrived to the exporter, or it has been executed
- Export dispatch counter
- Title and description in project configuration
- Annotation Ignore Project Configuration Match
-- Send error email if error while sending query to bridgehead
-- Mailing Black List
-- Sort Mailing Black List by first and last name
+- Send error email if error while sending a query to bridgehead
+- Mailing Blacklist
+- Sort Mailing Blacklist by first and last name
- Results
-- DRN in exporter label
+- DRN in the exporter label
- Final User State in results
- Create State in Frontend DTO's (for project and project bridgehead)
- Fetch email message and subject HTTP endpoint
- Send project results only if there are final users
- User Project State in State Constraints
- Bridgehead Admin info in the variables for the email templates
-- Results URL in frontend dto
+- Result URL in frontend dto
- EmailContextKey enum
- Votum for all
- Configuration Site
- REST Service: is project manager admin
- Research Environment URL key for Email Context
- REST Service: Fetch research environment URL
-- REST Service: Exists research environment workspace for user
-- View only last reseach environment workspace for a project
+- REST Service: There exists a research environment workspace for user
+- View only the last research environment workspace for a project
- Valid Email Aspect
- EncryptionConverter to encrypt results url
- Coder Configuration
@@ -217,3 +217,81 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
- Log App Register Service
- Removal conditions for ProjectBridgeheadDataShield
- Check message for HTTP requests to exporter
+- Request Variable annotation
+- Optimize JPA configuration
+- Compatibility with Authentik
+- JWT Decoder configuration
+- AST and AST_DATA as query format
+- Project Form
+- Project Form Services
+- Language annotation
+- Form PDF Service
+- External Execution Not Allowed Profile
+- Download Form PDF
+- Arrange form fields in the right order in PDF
+- DataType in Form PDF
+- Form Variables Config
+- Fetch Form Templates
+- Fetch Form Template Filename
+- Current Date in Form Template
+- Project Form Fields
+- Bridgehead Affiliation
+- Form Data Type Date and Timestamp
+- HTTP Get methods fetch RequestParam and HTTP Post methods fetch RequestVariable except for uploading files
+- Check organizational roles for any bridgehead
+- Form Repository
+- Fetch all project states depending on project code
+- Make user role thread safe
+- Log frontend config
+- SAMPLES project type
+- Project And Form Configuration
+- Multiple types pro-project
+- Remove the project output service
+- Use global conversion service of spring
+- Annotated Parameter Wrapper
+- Request Parameter
+- Synchronization between query outputs and bridgehead executions
+- Project context in form template context
+- Template Filename
+- Send a query with different project types to bridgehead
+- List parameters in a controller
+- Fetch best form templates
+- Description document and related services
+- Cohort definition in a query
+- Send Query To Bridgehead Event
+- Send Query To Bridgehead Event scheduled job
+- Send attachments in emails
+- Final report services
+
+
+### Changed
+- Rename project state CREATED and ACCEPTED as REVIEW and APPROVAL
+- Update to Maven 4
+- Update to Java 25
+- Remove project bridgehead user with role creator
+- View also own-created projects even if they don't belong to own bridgeheads
+- View all project bridgeheads for creator
+- RequestVariableMethodArgumentResolver for complex datatypes
+- Edit form instead of just adding forms to the project
+- Add and rename forms instead of editing services
+- Notifications only for Project Manager Admin
+- Filter templates by selected forms
+- Samples project can generate exports not visible to researcher
+- there isCustomConfig in the Project as nullable
+- Ethical Approval in Project Context
+- Data Type Enum for Form Config
+- Fetch selected forms returns also preconfigured titles
+- Query Details
+- There Exists Publication
+
+
+### Removed
+- RStudio Keycloak Groups
+- Application Form Services
+
+### Fixed
+- Init flyway migration in spring 4
+- Jwt decoder configuration
+- Full name if the first or last name is missing
+- Only one user session at the same time
+- Update query outputs correctly
diff --git a/Dockerfile b/Dockerfile
index ed8b332b..569590ee 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,4 +1,4 @@
-FROM eclipse-temurin:21-jre
+FROM eclipse-temurin:25-jre
COPY target/project-manager.jar /app/
diff --git a/pom.xml b/pom.xml
index 5fc11f97..613c4b81 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,8 +5,8 @@
org.springframework.boot
spring-boot-starter-parent
- 3.2.1
-
+ 4.0.5
+
de.samply
project-manager
@@ -14,13 +14,17 @@
project-manager
Samply Project Manager
- 21
- 2.2.0
- 3.2.1
- 1.18.30
- 3.9.6
- 6.1.1
- 1.14.11
+ 25
+ 3.0.0
+ 4.0.1
+ 1.18.42
+ 3.9.15
+ 5.0.0.Alpha2
+ 1.1.36
+ 4.0.0-M2
+ 1.6.3
+ 3.15.0
+ 7.7.0
@@ -46,6 +50,7 @@
org.springframework.boot
spring-boot-starter-aop
+ ${spring-boot-starter-aop.version}
org.springframework.boot
@@ -60,9 +65,14 @@
springdoc-openapi-starter-webmvc-ui
${openapi.version}
+
+ org.springframework.boot
+ spring-boot-starter-flyway
+
org.flywaydb
- flyway-core
+ flyway-database-postgresql
+ runtime
org.springframework.statemachine
@@ -80,6 +90,11 @@
maven-model
${maven-model.version}
+
+ io.netty
+ netty-transport-native-epoll
+ ${netty-transport-native-epoll.version}
+
org.postgresql
@@ -96,11 +111,62 @@
reactor-test
test
+
+ io.github.openhtmltopdf
+ openhtmltopdf-pdfbox
+ ${openhtmltopdf-pdfbox.version}
+
+
+
+ org.mapstruct
+ mapstruct
+ ${mapstruct.version}
+
+
+ org.mapstruct
+ mapstruct-processor
+ ${mapstruct.version}
+ provided
+
+
+
+ net.javacrumbs.shedlock
+ shedlock-spring
+ ${shedlock-spring.version}
+
+
+ net.javacrumbs.shedlock
+ shedlock-provider-jdbc-template
+ ${shedlock-spring.version}
+
+
project-manager
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ ${maven-compiler-plugin.version}
+
+ ${java.version}
+ ${java.version}
+
+
+ org.projectlombok
+ lombok
+ ${lombok.version}
+
+
+ org.mapstruct
+ mapstruct-processor
+ ${mapstruct.version}
+
+
+
+
+
org.springframework.boot
spring-boot-maven-plugin
@@ -108,4 +174,6 @@
+
+
diff --git a/src/main/java/de/samply/annotations/Language.java b/src/main/java/de/samply/annotations/Language.java
new file mode 100644
index 00000000..11eddc7d
--- /dev/null
+++ b/src/main/java/de/samply/annotations/Language.java
@@ -0,0 +1,11 @@
+package de.samply.annotations;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.PARAMETER)
+public @interface Language {
+}
diff --git a/src/main/java/de/samply/annotations/RequestParameter.java b/src/main/java/de/samply/annotations/RequestParameter.java
new file mode 100644
index 00000000..93495186
--- /dev/null
+++ b/src/main/java/de/samply/annotations/RequestParameter.java
@@ -0,0 +1,20 @@
+package de.samply.annotations;
+
+import de.samply.app.ProjectManagerConst;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Target(ElementType.PARAMETER) // Applies to method parameters
+@Retention(RetentionPolicy.RUNTIME) // Retain at runtime for reflection
+public @interface RequestParameter {
+ String name();
+
+ boolean required() default true;
+
+ boolean notEmpty() default false;
+
+ String defaultValue() default ProjectManagerConst.NOT_SET;
+}
diff --git a/src/main/java/de/samply/annotations/RequestVariable.java b/src/main/java/de/samply/annotations/RequestVariable.java
new file mode 100644
index 00000000..8bea81f8
--- /dev/null
+++ b/src/main/java/de/samply/annotations/RequestVariable.java
@@ -0,0 +1,87 @@
+package de.samply.annotations;
+
+import de.samply.app.ProjectManagerConst;
+import de.samply.resolvers.RequestVariableAndParameterMethodArgumentResolver;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Custom annotation to bind request parameters from either the request body or query parameters.
+ * This allows flexible handling of request variables by attempting to extract values
+ * from both the query parameters and the JSON body, providing an elegant fallback mechanism.
+ *
+ *
+ * The annotation can be used on controller method parameters, and the corresponding values
+ * will be retrieved either from the query parameters or the JSON body (if the parameter is missing
+ * in the query parameters). It simplifies code and ensures that the necessary parameters are
+ * available regardless of where they are specified in the request.
+ *
+ *
+ * Example of JSON Body
+ *
+ * {@code
+ * POST /create HTTP/1.1
+ * Content-Type: application/json
+ *
+ * {
+ * "query": "SELECT * FROM projects WHERE status = 'active'",
+ * "queryFormat": "SQL",
+ * "label": "Active Projects",
+ * "description": "Projects that are currently active."
+ * }
+ * }
+ *
+ * In the above example:
+ *
+ * {@code query}: The SQL query string passed in the JSON body
+ * {@code queryFormat}: The format of the query (e.g., SQL)
+ * {@code label}: Optional label
+ * {@code description}: Optional description
+ *
+ *
+ * How it works
+ *
+ * The values for parameters annotated with {@code @RequestVariable} are first extracted
+ * from the JSON body if present.
+ * If the value is not found in the body, the resolver falls back to query parameters.
+ *
+ *
+ * Usage Example
+ *
+ * {@code
+ * {@literal @}PostMapping("/create")
+ * public ResponseEntity createProject(
+ * {@literal @}RequestVariable(name = "query", required = true) String query,
+ * {@literal @}RequestVariable(name = "queryFormat", required = true) String queryFormat,
+ * {@literal @}RequestVariable(name = "label", required = false) String label,
+ * {@literal @}RequestVariable(name = "description", required = false) String description
+ * ) {
+ * return ResponseEntity.ok("ProjectCode created successfully!");
+ * }
+ * }
+ *
+ * In this example:
+ *
+ * {@code query} and {@code queryFormat} are required and will be extracted from either
+ * the JSON body or query parameters.
+ * {@code label} and {@code description} are optional.
+ *
+ *
+ * @see RequestVariableAndParameterMethodArgumentResolver
+ */
+
+
+@Target(ElementType.PARAMETER) // Applies to method parameters
+@Retention(RetentionPolicy.RUNTIME) // Retain at runtime for reflection
+public @interface RequestVariable {
+ String name();
+
+ boolean required() default true;
+
+ boolean notEmpty() default false;
+
+ String defaultValue() default ProjectManagerConst.NOT_SET;
+}
diff --git a/src/main/java/de/samply/annotations/RoleConstraints.java b/src/main/java/de/samply/annotations/RoleConstraints.java
index 1ae24897..cacae1da 100644
--- a/src/main/java/de/samply/annotations/RoleConstraints.java
+++ b/src/main/java/de/samply/annotations/RoleConstraints.java
@@ -19,7 +19,7 @@
*/
OrganisationRole[] organisationRoles() default {};
- // Project Role are checked in ProjectRoleConstrainstAspects
+ // ProjectCode Role are checked in ProjectRoleConstraintAspects
ProjectRole[] projectRoles() default {};
diff --git a/src/main/java/de/samply/aop/ConstraintsService.java b/src/main/java/de/samply/aop/ConstraintsService.java
index 514ea130..0a77b0d3 100644
--- a/src/main/java/de/samply/aop/ConstraintsService.java
+++ b/src/main/java/de/samply/aop/ConstraintsService.java
@@ -6,20 +6,15 @@
import de.samply.db.model.Project;
import de.samply.db.model.ProjectBridgehead;
import de.samply.db.model.ProjectBridgeheadUser;
-import de.samply.db.repository.ProjectBridgeheadRepository;
-import de.samply.db.repository.ProjectBridgeheadUserRepository;
-import de.samply.db.repository.ProjectRepository;
-import de.samply.project.ProjectType;
+import de.samply.project.ProjectBridgeheadUserService;
import de.samply.project.state.ProjectBridgeheadState;
import de.samply.project.state.ProjectState;
import de.samply.project.state.UserProjectState;
-import de.samply.query.QueryState;
import de.samply.security.SessionUser;
import de.samply.user.roles.OrganisationRole;
import de.samply.user.roles.OrganisationRoleToProjectRoleMapper;
import de.samply.user.roles.ProjectRole;
import de.samply.user.roles.UserProjectRoles;
-import de.samply.utils.AspectUtils;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
@@ -28,13 +23,13 @@
import java.util.Map;
import java.util.Optional;
+@SuppressWarnings("rawtypes") // For Optional. Otherwise, it would be too complex
@Service
public class ConstraintsService {
- private final ProjectRepository projectRepository;
+ private final ProjectBridgeheadUserService projectBridgeheadUserService;
+
private final OrganisationRoleToProjectRoleMapper organisationRoleToProjectRoleMapper;
- private final ProjectBridgeheadRepository projectBridgeheadRepository;
- private final ProjectBridgeheadUserRepository projectBridgeheadUserRepository;
private final SessionUser sessionUser;
private final Map temporalProjectRoleProjectStateMap = Map.of(
@@ -42,28 +37,24 @@ public class ConstraintsService {
ProjectRole.PILOT, ProjectState.PILOT,
ProjectRole.FINAL, ProjectState.FINAL);
- public ConstraintsService(ProjectRepository projectRepository,
+ public ConstraintsService(ProjectBridgeheadUserService projectBridgeheadUserService,
OrganisationRoleToProjectRoleMapper organisationRoleToProjectRoleMapper,
- ProjectBridgeheadRepository projectBridgeheadRepository,
- ProjectBridgeheadUserRepository projectBridgeheadUserRepository,
SessionUser sessionUser) {
- this.projectRepository = projectRepository;
+ this.projectBridgeheadUserService = projectBridgeheadUserService;
this.organisationRoleToProjectRoleMapper = organisationRoleToProjectRoleMapper;
- this.projectBridgeheadRepository = projectBridgeheadRepository;
- this.projectBridgeheadUserRepository = projectBridgeheadUserRepository;
this.sessionUser = sessionUser;
}
- public Optional checkRoleConstraints(Optional roleConstraints, Optional stateConstraints, Optional projectCode, Optional bridgehead) {
- Optional result = checkOrganisationRoleConstraints(roleConstraints, bridgehead);
- return (result.isPresent()) ? result : checkProjectRoleConstraints(roleConstraints, stateConstraints, projectCode, bridgehead);
+ public Optional checkRoleConstraints(Optional roleConstraints, Optional stateConstraints, Optional project, Optional bridgehead) {
+ Optional result = checkOrganisationRoleConstraints(roleConstraints);
+ return (result.isPresent()) ? result : checkProjectRoleConstraints(roleConstraints, stateConstraints, project, bridgehead);
}
- public Optional checkOrganisationRoleConstraints(Optional roleConstraints, Optional bridgehead) {
+ public Optional checkOrganisationRoleConstraints(Optional roleConstraints) {
if (roleConstraints.isPresent() && roleConstraints.get().organisationRoles().length > 0) {
boolean hasAnyOrganisationRole = false;
for (OrganisationRole organisationRole : roleConstraints.get().organisationRoles()) {
- if (sessionUser.getUserOrganisationRoles().containsRole(organisationRole, bridgehead)) {
+ if (sessionUser.getUserOrganisationRoles().containsAnyRole(organisationRole)) {
hasAnyOrganisationRole = true;
break;
}
@@ -75,19 +66,15 @@ public Optional checkOrganisationRoleConstraints(Optional checkProjectRoleConstraints(Optional roleConstraints, Optional stateConstraints, Optional projectCode, Optional bridgehead) {
+ public Optional checkProjectRoleConstraints(Optional roleConstraints, Optional stateConstraints, Optional project, Optional bridgehead) {
if (roleConstraints.isPresent() && roleConstraints.get().projectRoles().length > 0) {
- if (projectCode.isEmpty() || projectCode.get().length() == 0) {
- return Optional.of(ResponseEntity.badRequest().body("Project code not provided"));
- }
- Optional project = AspectUtils.fetchProject(projectRepository, projectCode);
if (project.isEmpty()) {
return Optional.of(ResponseEntity.notFound().build());
}
Optional userProjectRoles = organisationRoleToProjectRoleMapper.map(project.get());
boolean userHasProjectRoleInProject = false;
for (ProjectRole projectRole : roleConstraints.get().projectRoles()) {
- if (userHasProjectRoleInProject(userProjectRoles, project.get(), projectRole, bridgehead) &&
+ if (userHasProjectRoleInProject(userProjectRoles, projectRole, bridgehead) &&
isProjectRoleInAuthorizedProjectState(projectRole, project.get(), stateConstraints)) {
userHasProjectRoleInProject = true;
break;
@@ -108,16 +95,13 @@ private boolean isProjectRoleInAuthorizedProjectState(ProjectRole projectRole, P
return project.getState() == projectState && Arrays.asList(stateConstraints.get().projectStates()).contains(projectState);
}
- private boolean userHasProjectRoleInProject(Optional userProjectRoles, Project project, ProjectRole projectRole, Optional bridgehead) {
- return (userProjectRoles.isPresent()) ? userProjectRoles.get().containsRole(projectRole, bridgehead) : false;
+ private boolean userHasProjectRoleInProject(Optional userProjectRoles, ProjectRole projectRole, Optional bridgehead) {
+ Optional bridgeheadOptional = bridgehead.map(ProjectBridgehead::getBridgehead);
+ return userProjectRoles.isPresent() && userProjectRoles.get().containsRole(projectRole, bridgeheadOptional);
}
- public Optional checkStateConstraints(Optional stateConstraints, Optional projectCode, Optional bridgehead) {
+ public Optional checkStateConstraints(Optional stateConstraints, Optional project, Optional bridgehead) {
if (stateConstraints.isPresent()) {
- if (projectCode.isEmpty() || projectCode.get().length() == 0) {
- return Optional.of(ResponseEntity.badRequest().body("Project code not provided"));
- }
- Optional project = AspectUtils.fetchProject(projectRepository, projectCode);
if (project.isEmpty()) {
return Optional.of(ResponseEntity.notFound().build());
}
@@ -134,32 +118,27 @@ public Optional checkStateConstraints(Optional
}
}
if (stateConstraints.get().projectBridgeheadStates().length > 0 || stateConstraints.get().queryStates().length > 0 || stateConstraints.get().userProjectStates().length > 0) {
- Optional projectBridgehead = fetchProjectBridgehead(project.get(), bridgehead);
- if (projectBridgehead.isEmpty()) {
+ if (bridgehead.isEmpty()) {
return Optional.of(ResponseEntity.status(HttpStatus.METHOD_NOT_ALLOWED).build());
}
boolean hasAnyProjectBridgeheadStateConstraint = true;
if (stateConstraints.get().projectBridgeheadStates().length > 0) {
hasAnyProjectBridgeheadStateConstraint = false;
for (ProjectBridgeheadState projectBridgeheadState : stateConstraints.get().projectBridgeheadStates()) {
- if (projectBridgehead.get().getState() == projectBridgeheadState) {
+ if (bridgehead.get().getState() == projectBridgeheadState) {
hasAnyProjectBridgeheadStateConstraint = true;
break;
}
}
}
if (hasAnyProjectBridgeheadStateConstraint && stateConstraints.get().queryStates().length > 0) {
- hasAnyProjectBridgeheadStateConstraint = false;
- for (QueryState queryState : stateConstraints.get().queryStates()) {
- if (projectBridgehead.get().getQueryState() == queryState) {
- hasAnyProjectBridgeheadStateConstraint = true;
- break;
- }
- }
+ hasAnyProjectBridgeheadStateConstraint = bridgehead.get().getExecutions().stream()
+ .anyMatch(exec -> Arrays.asList(stateConstraints.get().queryStates())
+ .contains(exec.getQueryState()));
}
if (hasAnyProjectBridgeheadStateConstraint && stateConstraints.get().userProjectStates().length > 0) {
hasAnyProjectBridgeheadStateConstraint = false;
- Optional projectBridgeheadUser = fetchProjectBridgeheadUser(projectBridgehead.get());
+ Optional projectBridgeheadUser = fetchProjectBridgeheadUser(bridgehead.get());
if (projectBridgeheadUser.isPresent()) {
for (UserProjectState userProjectState : stateConstraints.get().userProjectStates()) {
if (projectBridgeheadUser.get().getProjectState() == userProjectState) {
@@ -188,24 +167,16 @@ public Optional checkStateConstraints(Optional
return Optional.empty();
}
- public Optional checkProjectConstraints(Optional projectConstraints, Optional projectCode) {
+ public Optional checkProjectConstraints(Optional projectConstraints, Optional project) {
//TODO
if (projectConstraints.isPresent()) {
- if (projectCode.isEmpty() || projectCode.get().length() == 0) {
- return Optional.of(ResponseEntity.badRequest().body("Project code not provided"));
- }
- Optional project = AspectUtils.fetchProject(projectRepository, projectCode);
if (project.isEmpty()) {
return Optional.of(ResponseEntity.notFound().build());
}
if (projectConstraints.get().projectTypes().length > 0) {
- boolean hasAnyProjectTypeConstraint = false;
- for (ProjectType projectType : projectConstraints.get().projectTypes()) {
- if (project.get().getType() == projectType) {
- hasAnyProjectTypeConstraint = true;
- break;
- }
- }
+ boolean hasAnyProjectTypeConstraint = Arrays.stream(projectConstraints.get().projectTypes())
+ .anyMatch(pc -> project.get().hasProjectType(pc));
+
if (!hasAnyProjectTypeConstraint) {
return Optional.of(ResponseEntity.status(HttpStatus.METHOD_NOT_ALLOWED).build());
}
@@ -214,12 +185,8 @@ public Optional checkProjectConstraints(Optional fetchProjectBridgehead(Project project, Optional bridgehead) {
- return (bridgehead.isEmpty()) ? Optional.empty() : this.projectBridgeheadRepository.findFirstByBridgeheadAndProject(bridgehead.get(), project);
- }
-
private Optional fetchProjectBridgeheadUser(ProjectBridgehead projectBridgehead) {
- return this.projectBridgeheadUserRepository.getFirstByEmailAndProjectBridgeheadOrderByModifiedAtDesc(sessionUser.getEmail(), projectBridgehead);
+ return projectBridgeheadUserService.fetchFirstUsersOrderByModifiedAtDesc(sessionUser.getEmail(), projectBridgehead);
}
}
diff --git a/src/main/java/de/samply/aop/EmailSenderAspect.java b/src/main/java/de/samply/aop/EmailSenderAspect.java
index aba995fd..e722d859 100644
--- a/src/main/java/de/samply/aop/EmailSenderAspect.java
+++ b/src/main/java/de/samply/aop/EmailSenderAspect.java
@@ -8,10 +8,12 @@
import de.samply.db.model.Project;
import de.samply.db.model.ProjectBridgehead;
import de.samply.db.model.ProjectBridgeheadUser;
-import de.samply.db.repository.*;
import de.samply.email.*;
+import de.samply.project.ProjectBridgeheadService;
+import de.samply.project.ProjectBridgeheadUserService;
import de.samply.project.state.ProjectBridgeheadState;
import de.samply.security.SessionUser;
+import de.samply.user.UserService;
import de.samply.user.roles.OrganisationRoleToProjectRoleMapper;
import de.samply.user.roles.ProjectRole;
import de.samply.user.roles.UserProjectRoles;
@@ -26,7 +28,6 @@
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
-import java.lang.annotation.Annotation;
import java.util.*;
import java.util.function.Supplier;
@@ -34,48 +35,48 @@
@Aspect
public class EmailSenderAspect {
+ // Services
private final EmailService emailService;
private final SessionUser sessionUser;
- private final BridgeheadAdminUserRepository bridgeheadAdminUserRepository;
- private final ProjectBridgeheadUserRepository projectBridgeheadUserRepository;
- private final ProjectManagerAdminUserRepository projectManagerAdminUserRepository;
+ private final UserService userService;
+ private final ProjectBridgeheadService projectBridgeheadService;
+ private final ProjectBridgeheadUserService projectBridgeheadUserService;
+
private final OrganisationRoleToProjectRoleMapper organisationRoleToProjectRoleMapper;
- private final ProjectBridgeheadRepository projectBridgeheadRepository;
- private final ProjectRepository projectRepository;
private final EmailKeyValuesFactory emailKeyValuesFactory;
public EmailSenderAspect(EmailService emailService,
SessionUser sessionUser,
- BridgeheadAdminUserRepository bridgeheadAdminUserRepository,
- ProjectBridgeheadUserRepository projectBridgeheadUserRepository,
- ProjectManagerAdminUserRepository projectManagerAdminUserRepository,
+ UserService userService,
+ ProjectBridgeheadService projectBridgeheadService,
+ ProjectBridgeheadUserService projectBridgeheadUserService,
OrganisationRoleToProjectRoleMapper organisationRoleToProjectRoleMapper,
- ProjectBridgeheadRepository projectBridgeheadRepository,
- ProjectRepository projectRepository,
EmailKeyValuesFactory emailKeyValuesFactory) {
this.emailService = emailService;
this.sessionUser = sessionUser;
- this.bridgeheadAdminUserRepository = bridgeheadAdminUserRepository;
- this.projectBridgeheadUserRepository = projectBridgeheadUserRepository;
- this.projectManagerAdminUserRepository = projectManagerAdminUserRepository;
+ this.userService = userService;
+ this.projectBridgeheadService = projectBridgeheadService;
+ this.projectBridgeheadUserService = projectBridgeheadUserService;
this.organisationRoleToProjectRoleMapper = organisationRoleToProjectRoleMapper;
- this.projectBridgeheadRepository = projectBridgeheadRepository;
- this.projectRepository = projectRepository;
this.emailKeyValuesFactory = emailKeyValuesFactory;
}
+ @SuppressWarnings("EmptyMethod")
@Pointcut("@annotation(de.samply.annotations.EmailSender)")
public void emailSenderPointcut() {
}
+ @SuppressWarnings("EmptyMethod")
@Pointcut("@annotation(de.samply.annotations.EmailSenders)")
public void emailSendersPointcut() {
}
+ @SuppressWarnings("EmptyMethod")
@Pointcut("@annotation(de.samply.annotations.EmailSenderIfError)")
public void emailSenderIfErrorPointcut() {
}
+ @SuppressWarnings("EmptyMethod")
@Pointcut("@annotation(de.samply.annotations.EmailSendersIfError)")
public void emailSendersIfErrorPointcut() {
}
@@ -101,16 +102,16 @@ public Object aroundEmailSendersIfError(ProceedingJoinPoint joinPoint) throws Th
return aroundEmailSender(joinPoint, false, true);
}
- private Object aroundEmailSender(ProceedingJoinPoint joinPoint, boolean isSingleEmailSender, boolean ifError) throws Throwable {
+ private Object aroundEmailSender(ProceedingJoinPoint joinPoint, boolean isSingleEmailSender, boolean ifError) throws Throwable {
try {
- ResponseEntity responseEntity = (ResponseEntity) joinPoint.proceed();
+ @SuppressWarnings("rawtypes") ResponseEntity responseEntity = (ResponseEntity) joinPoint.proceed();
if (responseEntity.getStatusCode().is2xxSuccessful() ^ ifError) {
sendEmail(joinPoint, isSingleEmailSender, ifError);
}
return responseEntity;
} catch (Exception e) {
if (ifError) {
- sendEmail(joinPoint, isSingleEmailSender, ifError);
+ sendEmail(joinPoint, isSingleEmailSender, true);
}
throw new RuntimeException(e);
}
@@ -138,8 +139,8 @@ private void sendEmailFromEmailSenders(ProceedingJoinPoint joinPoint, Optional emailSenderOptional) {
- emailSenderOptional.ifPresent(emailSender -> fetchEmailRecipients(() -> emailSender.recipients(), joinPoint)
- .forEach(emailRecipient -> sendEmail(emailRecipient, () -> emailSender.templateType())));
+ emailSenderOptional.ifPresent(emailSender -> fetchEmailRecipients(emailSender::recipients, joinPoint)
+ .forEach(emailRecipient -> sendEmail(emailRecipient, emailSender::templateType)));
}
private void sendEmailFromEmailSendersIfError(ProceedingJoinPoint joinPoint, Optional emailSendersIfErrorOptional) {
@@ -148,14 +149,14 @@ private void sendEmailFromEmailSendersIfError(ProceedingJoinPoint joinPoint, Opt
}
private void sendEmailFromEmailSenderIfError(ProceedingJoinPoint joinPoint, Optional emailSenderIfErrorOptional) {
- emailSenderIfErrorOptional.ifPresent(emailSenderIfError -> fetchEmailRecipients(() -> emailSenderIfError.recipients(), joinPoint)
- .forEach(emailRecipient -> sendEmail(emailRecipient, () -> emailSenderIfError.templateType())));
+ emailSenderIfErrorOptional.ifPresent(emailSenderIfError -> fetchEmailRecipients(emailSenderIfError::recipients, joinPoint)
+ .forEach(emailRecipient -> sendEmail(emailRecipient, emailSenderIfError::templateType)));
}
@Async(ProjectManagerConst.ASYNC_EMAIL_SENDER_EXECUTOR)
protected void sendEmail(EmailRecipient emailRecipient, Supplier emailTemplateTypeSupplier) {
try {
- emailService.sendEmail(emailRecipient.getEmail(), emailRecipient.getProjectCode(), emailRecipient.getBridgehead(),
+ emailService.sendEmail(emailRecipient.getEmail(), emailRecipient.getProject(), emailRecipient.getBridgehead(),
emailRecipient.getRole(), emailTemplateTypeSupplier.get(), emailKeyValuesFactory.newInstance().add(emailRecipient));
} catch (EmailServiceException e) {
throw new RuntimeException(e);
@@ -180,24 +181,25 @@ private Optional fetchEmailSendersIfError(JoinPoint joinPoi
private Set fetchEmailRecipients(Supplier emailRecipientTypesSupplier, ProceedingJoinPoint joinPoint) {
Set result = new HashSet<>();
- Optional projectCode = AspectUtils.fetchProjectCode(joinPoint);
- Optional bridgehead = AspectUtils.fetchBridgehead(joinPoint);
+ Optional project = AspectUtils.fetchProject(joinPoint);
+ Optional projectBridgehead = AspectUtils.fetchBridgehead(joinPoint);
Optional email = AspectUtils.fetchEmail(joinPoint);
Optional message = AspectUtils.fetchMessage(joinPoint);
Arrays.stream(emailRecipientTypesSupplier.get()).forEach(emailRecipientType ->
result.addAll(switch (emailRecipientType) {
- case SESSION_USER -> fetchEmailRecipientsForSessionUser(projectCode, bridgehead);
- case CREATOR -> fetchEmailRecipientsForCreator(projectCode, bridgehead);
- case EMAIL_ANNOTATION -> fetchEmailRecipientsForEmailAnnotation(projectCode, bridgehead, email);
- case ALL_BRIDGEHEAD_ADMINS -> fetchEmailRecipientsForAllBridgeheadAdminsOfTheProject(projectCode);
- case ALL_DEVELOPERS -> fetchEmailRecipientsForAllDeveloperUsersOfTheProject(projectCode);
- case ALL_PILOTS -> fetchEmailRecipientsForAllPilotUsersOfTheProject(projectCode);
- case ALL_FINALS -> fetchEmailRecipientsForAllFinalUsersOfTheProject(projectCode);
- case BRIDGEHEAD_ADMIN -> fetchEmailRecipientsForBridgeheadAdmin(projectCode, bridgehead);
- case BRIDGHEAD_ADMINS_WHO_HAVE_NOT_ACCEPTED_NOR_REJECTED_THE_PROJECT ->
- fetchEmailRecipientsForBridgeheadAdminsWhoHaveNotAcceptedNorRejectedTheProject(projectCode);
- case PROJECT_MANAGER_ADMIN -> fetchEmailRecipientsForProjectManagerAdmin(projectCode, bridgehead);
- case PROJECT_ALL -> fetchEmailRecipientsForAllProjectUsers(projectCode, bridgehead);
+ case SESSION_USER -> fetchEmailRecipientsForSessionUser(project, projectBridgehead);
+ case CREATOR -> fetchEmailRecipientsForCreator(project, projectBridgehead);
+ case EMAIL_ANNOTATION -> fetchEmailRecipientsForEmailAnnotation(project, projectBridgehead, email);
+ case ALL_BRIDGEHEAD_ADMINS -> fetchEmailRecipientsForAllBridgeheadAdminsOfTheProject(project);
+ case ALL_DEVELOPERS -> fetchEmailRecipientsForAllDeveloperUsersOfTheProject(project);
+ case ALL_PILOTS -> fetchEmailRecipientsForAllPilotUsersOfTheProject(project);
+ case ALL_FINALS -> fetchEmailRecipientsForAllFinalUsersOfTheProject(project);
+ case BRIDGEHEAD_ADMIN -> fetchEmailRecipientsForBridgeheadAdmin(project, projectBridgehead);
+ case BRIDGEHEAD_ADMINS_WHO_HAVE_NOT_ACCEPTED_NOR_REJECTED_THE_PROJECT ->
+ fetchEmailRecipientsForBridgeheadAdminsWhoHaveNotAcceptedNorRejectedTheProject(project);
+ case PROJECT_MANAGER_ADMIN ->
+ fetchEmailRecipientsForProjectManagerAdmin(project, projectBridgehead);
+ case PROJECT_ALL -> fetchEmailRecipientsForAllProjectUsers(project, projectBridgehead);
}));
if (message.isPresent()) {
result.forEach(emailRecipient -> emailRecipient.setMessage(message));
@@ -205,170 +207,171 @@ private Set fetchEmailRecipients(Supplier
return result;
}
- private Set fetchEmailRecipientsForCreator(Optional projectCode, Optional bridgehead) {
+ private Set fetchEmailRecipientsForCreator(Optional project, Optional bridgehead) {
Set result = new HashSet<>();
- if (projectCode.isPresent()) {
- Optional project = this.projectRepository.findByCode(projectCode.get());
- if (project.isPresent()) {
- result.add(new EmailRecipient(project.get().getCreatorEmail(), projectCode, bridgehead, ProjectRole.CREATOR));
- }
+ if (project.isPresent()) {
+ project.ifPresent(value -> result.add(new EmailRecipient(value.getCreatorEmail(), project, bridgehead, ProjectRole.CREATOR)));
}
return result;
}
- private Set fetchEmailRecipientsForAllDeveloperUsersOfTheProject(Optional projectCode) {
- return fetchEmailRecipientsForAllDeveloperUsersOfTheProject(projectCode, ProjectRole.DEVELOPER);
+ private Set fetchEmailRecipientsForAllDeveloperUsersOfTheProject(Optional project) {
+ return fetchEmailRecipientsForAllDeveloperUsersOfTheProject(project, ProjectRole.DEVELOPER);
}
- private Set fetchEmailRecipientsForAllPilotUsersOfTheProject(Optional projectCode) {
- return fetchEmailRecipientsForAllDeveloperUsersOfTheProject(projectCode, ProjectRole.PILOT);
+ private Set fetchEmailRecipientsForAllPilotUsersOfTheProject(Optional project) {
+ return fetchEmailRecipientsForAllDeveloperUsersOfTheProject(project, ProjectRole.PILOT);
}
- private Set fetchEmailRecipientsForAllFinalUsersOfTheProject(Optional projectCode) {
- return fetchEmailRecipientsForAllDeveloperUsersOfTheProject(projectCode, ProjectRole.FINAL);
+ private Set fetchEmailRecipientsForAllFinalUsersOfTheProject(Optional project) {
+ return fetchEmailRecipientsForAllDeveloperUsersOfTheProject(project, ProjectRole.FINAL);
}
- private Set fetchEmailRecipientsForAllDeveloperUsersOfTheProject(Optional projectCode, ProjectRole projectRole) {
+ private Set fetchEmailRecipientsForAllDeveloperUsersOfTheProject(Optional project, ProjectRole projectRole) {
Set result = new HashSet<>();
- if (projectCode.isPresent()) {
- projectBridgeheadUserRepository.getDistinctByProjectRoleAndProjectCode(projectRole, projectCode.get()).stream()
- .filter(projectBridgeheadUser -> !projectBridgeheadUser.getEmail().equals(sessionUser.getEmail())).forEach(projectBridgeheadUser ->
- result.add(new EmailRecipient(projectBridgeheadUser.getEmail(), projectCode, Optional.of(projectBridgeheadUser.getProjectBridgehead().getBridgehead()), projectRole)));
+ if (project.isPresent()) {
+ projectBridgeheadUserService
+ .fetchUsers(projectRole, project.get())
+ .stream()
+ .filter(projectBridgeheadUser -> !projectBridgeheadUser.getEmail().equals(sessionUser.getEmail()))
+ .forEach(projectBridgeheadUser ->
+ result.add(
+ new EmailRecipient(
+ projectBridgeheadUser.getEmail(),
+ project,
+ Optional.of(projectBridgeheadUser.getProjectBridgehead()),
+ projectRole)));
}
return result;
}
- private Set fetchEmailRecipientsForAllBridgeheadAdminsOfTheProject(Optional projectCode) {
+ private Set fetchEmailRecipientsForAllBridgeheadAdminsOfTheProject(Optional project) {
Set result = new HashSet<>();
- if (projectCode.isPresent()) {
- Optional project = this.projectRepository.findByCode(projectCode.get());
- if (project.isPresent()) {
- this.projectBridgeheadRepository.findByProject(project.get()).forEach(projectBridgehead ->
- this.bridgeheadAdminUserRepository.findByBridgehead(projectBridgehead.getBridgehead()).forEach(bridgeheadAdminUser ->
- result.add(new EmailRecipient(bridgeheadAdminUser.getEmail(), projectCode,
- Optional.of(projectBridgehead.getBridgehead()), ProjectRole.BRIDGEHEAD_ADMIN))));
- }
+ if (project.isPresent()) {
+ project.ifPresent(value -> projectBridgeheadService
+ .fetchBridgeheads(value)
+ .forEach(projectBridgehead -> userService
+ .fetchBridgeheadAdmin(projectBridgehead)
+ .forEach(bridgeheadAdminUser -> result.add(
+ new EmailRecipient(
+ bridgeheadAdminUser.getEmail(),
+ project,
+ Optional.of(projectBridgehead),
+ ProjectRole.BRIDGEHEAD_ADMIN)))));
}
return result;
}
- private Set fetchEmailRecipientsForSessionUser(Optional projectCode, Optional bridgehead) {
+ private Set fetchEmailRecipientsForSessionUser(Optional project, Optional bridgehead) {
Set result = new HashSet<>();
- Optional userProjectRolesOptional = fetchSessionUserProjectRoles(projectCode);
+ Optional userProjectRolesOptional = fetchSessionUserProjectRoles(project);
userProjectRolesOptional.ifPresent(userProjectRoles -> {
ProjectRole projectRole = null;
if (bridgehead.isPresent()) {
- List bridgeheadRolesOrderedInTimeDescendent = userProjectRoles.getBridgeheadRolesOrderedInDescendentTime(bridgehead.get());
+ List bridgeheadRolesOrderedInTimeDescendent = userProjectRoles.getBridgeheadRolesOrderedInDescendentTime(bridgehead.get().getBridgehead());
if (!bridgeheadRolesOrderedInTimeDescendent.isEmpty()) {
- projectRole = bridgeheadRolesOrderedInTimeDescendent.get(0);
+ projectRole = bridgeheadRolesOrderedInTimeDescendent.getFirst();
}
}
if (projectRole == null) {
Set rolesNotDependentOnBridgeheads = userProjectRoles.getRolesNotDependentOnBridgeheads();
if (!rolesNotDependentOnBridgeheads.isEmpty()) {
- projectRole = rolesNotDependentOnBridgeheads.stream().toList().get(0);
+ projectRole = rolesNotDependentOnBridgeheads.stream().toList().getFirst();
}
}
if (projectRole == null) {
projectRole = ProjectRole.DEFAULT;
}
- result.add(new EmailRecipient(sessionUser.getEmail(), projectCode, bridgehead, projectRole));
+ result.add(new EmailRecipient(sessionUser.getEmail(), project, bridgehead, projectRole));
});
return result;
}
- private Optional fetchSessionUserProjectRoles(Optional projectCode) {
- return (projectCode.isPresent()) ? organisationRoleToProjectRoleMapper.map(projectCode.get()) : Optional.empty();
+ private Optional fetchSessionUserProjectRoles(Optional project) {
+ return (project.isPresent()) ? organisationRoleToProjectRoleMapper.map(project.get()) : Optional.empty();
}
- private Set fetchEmailRecipientsForEmailAnnotation(Optional projectCode, Optional bridgehead, Optional email) {
+ private Set fetchEmailRecipientsForEmailAnnotation(Optional project, Optional bridgehead, Optional email) {
Set result = new HashSet<>();
if (email.isPresent()) {
ProjectRole projectRole = ProjectRole.DEFAULT;
- if (projectCode.isPresent() && bridgehead.isPresent()) {
- Optional projectBridgeheadUser = fetchProjectBridgeheadUser(projectCode.get(), bridgehead.get(), email.get());
+ if (project.isPresent() && bridgehead.isPresent()) {
+ Optional projectBridgeheadUser = fetchProjectBridgeheadUser(bridgehead.get(), email.get());
if (projectBridgeheadUser.isPresent()) {
projectRole = projectBridgeheadUser.get().getProjectRole();
}
}
- result.add(new EmailRecipient(email.get(), projectCode, bridgehead, projectRole));
+ result.add(new EmailRecipient(email.get(), project, bridgehead, projectRole));
}
return result;
}
- private Optional fetchProjectBridgeheadUser(String projectCode, String bridgehead, String email) {
- Optional project = projectRepository.findByCode(projectCode);
- if (project.isPresent()) {
- Optional projectBridgehead = projectBridgeheadRepository.findFirstByBridgeheadAndProject(bridgehead, project.get());
- if (projectBridgehead.isPresent()) {
- List projectBridgeheadUserList =
- ProjectRolesUtils.orderCollectionInDescendentTime(
- projectBridgeheadUserRepository.getByEmailAndProjectBridgehead(email, projectBridgehead.get()),
- projectBridgeheadUser -> projectBridgeheadUser.getProjectRole());
- if (!projectBridgeheadUserList.isEmpty()) {
- return Optional.of(projectBridgeheadUserList.get(0));
- }
- }
+ private Optional fetchProjectBridgeheadUser(ProjectBridgehead bridgehead, String email) {
+ List projectBridgeheadUserList =
+ ProjectRolesUtils.orderCollectionInDescendentTime(
+ projectBridgeheadUserService.fetchUsers(email, bridgehead),
+ ProjectBridgeheadUser::getProjectRole);
+ if (!projectBridgeheadUserList.isEmpty()) {
+ return Optional.of(projectBridgeheadUserList.getFirst());
+ } else {
+ return Optional.empty();
}
- return Optional.empty();
}
- private Set fetchEmailRecipientsForBridgeheadAdmin(Optional projectCode, Optional bridgehead) {
+ private Set fetchEmailRecipientsForBridgeheadAdmin(Optional project, Optional bridgehead) {
Set result = new HashSet<>();
- fetchProjectBridgeheads(projectCode, bridgehead).forEach(projectBridgehead ->
- bridgeheadAdminUserRepository.findByBridgehead(projectBridgehead.getBridgehead()).forEach(bridgeheadAdminUser ->
- result.add(new EmailRecipient(bridgeheadAdminUser.getEmail(), projectCode, Optional.of(projectBridgehead.getBridgehead()), ProjectRole.BRIDGEHEAD_ADMIN))));
+ fetchProjectBridgeheads(project, bridgehead)
+ .forEach(projectBridgehead -> userService
+ .fetchBridgeheadAdmin(projectBridgehead)
+ .forEach(bridgeheadAdminUser -> result.add(
+ new EmailRecipient(
+ bridgeheadAdminUser.getEmail(),
+ project,
+ Optional.of(projectBridgehead),
+ ProjectRole.BRIDGEHEAD_ADMIN))));
return result;
}
- private Set fetchEmailRecipientsForBridgeheadAdminsWhoHaveNotAcceptedNorRejectedTheProject(Optional projectCode) {
+ private Set fetchEmailRecipientsForBridgeheadAdminsWhoHaveNotAcceptedNorRejectedTheProject(Optional project) {
Set result = new HashSet<>();
- fetchProjectBridgeheadsNotAcceptedNorRejected(projectCode).forEach(projectBridgehead ->
- bridgeheadAdminUserRepository.findByBridgehead(projectBridgehead.getBridgehead()).forEach(bridgeheadAdminUser ->
- result.add(new EmailRecipient(bridgeheadAdminUser.getEmail(), projectCode, Optional.of(projectBridgehead.getBridgehead()), ProjectRole.BRIDGEHEAD_ADMIN))));
+ fetchProjectBridgeheadsNotAcceptedNorRejected(project)
+ .forEach(projectBridgehead -> userService
+ .fetchBridgeheadAdmin(projectBridgehead)
+ .forEach(bridgeheadAdminUser -> result.add(
+ new EmailRecipient(
+ bridgeheadAdminUser.getEmail(),
+ project,
+ Optional.of(projectBridgehead),
+ ProjectRole.BRIDGEHEAD_ADMIN))));
return result;
}
- private Set fetchProjectBridgeheadsNotAcceptedNorRejected(Optional projectCode) {
- if (projectCode.isPresent()) {
- Optional project = projectRepository.findByCode(projectCode.get());
- if (project.isPresent()) {
- return projectBridgeheadRepository.findByProjectAndState(project.get(), ProjectBridgeheadState.CREATED);
- }
- }
- return new HashSet<>();
+ private Set fetchProjectBridgeheadsNotAcceptedNorRejected(Optional project) {
+ return project
+ .map(p -> projectBridgeheadService.fetchBridgeheads(p, ProjectBridgeheadState.CREATED))
+ .orElse(Collections.emptySet());
}
- private Set fetchProjectBridgeheads(Optional projectCode, Optional bridgehead) {
- if (projectCode.isPresent()) {
- Optional project = projectRepository.findByCode(projectCode.get());
- if (project.isPresent()) {
- if (bridgehead.isPresent()) {
- Optional projectBridgehead = projectBridgeheadRepository.findFirstByBridgeheadAndProject(bridgehead.get(), project.get());
- if (projectBridgehead.isPresent()) {
- return Set.of(projectBridgehead.get());
- }
- } else {
- return projectBridgeheadRepository.findByProject(project.get());
- }
- }
+ private Set fetchProjectBridgeheads(Optional project, Optional bridgehead) {
+ if (project.isEmpty()) {
+ return new HashSet<>();
}
- return new HashSet<>();
+ return bridgehead.map(Set::of).orElseGet(() -> projectBridgeheadService.fetchBridgeheads(project.get()));
}
- private Set fetchEmailRecipientsForProjectManagerAdmin(Optional projectCode, Optional bridgehead) {
+ private Set fetchEmailRecipientsForProjectManagerAdmin(Optional project, Optional bridgehead) {
Set result = new HashSet<>();
- projectManagerAdminUserRepository.findAll().forEach(projectManagerAdminUser ->
- result.add(new EmailRecipient(projectManagerAdminUser.getEmail(), projectCode, bridgehead, ProjectRole.PROJECT_MANAGER_ADMIN)));
+ userService.fetchAllProjectManagerAdmins().forEach(projectManagerAdminUser ->
+ result.add(new EmailRecipient(projectManagerAdminUser.getEmail(), project, bridgehead, ProjectRole.PROJECT_MANAGER_ADMIN)));
return result;
}
- private Set fetchEmailRecipientsForAllProjectUsers(Optional projectCode, Optional bridgehead) {
+ private Set fetchEmailRecipientsForAllProjectUsers(Optional project, Optional bridgehead) {
Map userEmailRecipientMap = new HashMap<>();
- fetchProjectBridgeheads(projectCode, bridgehead).forEach(projectBridgehead -> {
- projectBridgeheadUserRepository.getByProjectBridgehead(projectBridgehead).forEach(projectBridgeheadUser -> {
+ fetchProjectBridgeheads(project, bridgehead).forEach(projectBridgehead -> {
+ projectBridgeheadUserService.fetchUsers(projectBridgehead).forEach(projectBridgeheadUser -> {
boolean addUser;
EmailRecipient emailRecipient = userEmailRecipientMap.get(projectBridgeheadUser.getEmail());
if (emailRecipient != null) {
@@ -378,18 +381,26 @@ private Set fetchEmailRecipientsForAllProjectUsers(Optional {
- if (!userEmailRecipientMap.containsKey(bridgeheadAdminUser.getEmail())) {
- userEmailRecipientMap.put(bridgeheadAdminUser.getEmail(), new EmailRecipient(bridgeheadAdminUser.getEmail(), projectCode, Optional.of(bridgeheadAdminUser.getBridgehead()), ProjectRole.BRIDGEHEAD_ADMIN));
+ new EmailRecipient(projectBridgeheadUser.getEmail(), project, Optional.of(projectBridgehead), projectBridgeheadUser.getProjectRole()));
}
});
+ userService
+ .fetchBridgeheadAdmin(projectBridgehead)
+ .forEach(bridgeheadAdminUser -> {
+ if (!userEmailRecipientMap.containsKey(bridgeheadAdminUser.getEmail())) {
+ userEmailRecipientMap.put(
+ bridgeheadAdminUser.getEmail(),
+ new EmailRecipient(
+ bridgeheadAdminUser.getEmail(),
+ project,
+ project.flatMap(p -> projectBridgeheadService.fetchBridgehead(p, bridgeheadAdminUser.getBridgehead())),
+ ProjectRole.BRIDGEHEAD_ADMIN));
+ }
+ });
});
- projectManagerAdminUserRepository.findAll().forEach(projectManagerAdminUser -> {
+ userService.fetchAllProjectManagerAdmins().forEach(projectManagerAdminUser -> {
if (!userEmailRecipientMap.containsKey(projectManagerAdminUser.getEmail())) {
- userEmailRecipientMap.put(projectManagerAdminUser.getEmail(), new EmailRecipient(projectManagerAdminUser.getEmail(), projectCode, Optional.empty(), ProjectRole.PROJECT_MANAGER_ADMIN));
+ userEmailRecipientMap.put(projectManagerAdminUser.getEmail(), new EmailRecipient(projectManagerAdminUser.getEmail(), project, Optional.empty(), ProjectRole.PROJECT_MANAGER_ADMIN));
}
});
return new HashSet<>(userEmailRecipientMap.values());
diff --git a/src/main/java/de/samply/aop/NotEmptyAspect.java b/src/main/java/de/samply/aop/NotEmptyAspect.java
index 2edaf23c..c3edd384 100644
--- a/src/main/java/de/samply/aop/NotEmptyAspect.java
+++ b/src/main/java/de/samply/aop/NotEmptyAspect.java
@@ -18,6 +18,7 @@
@Aspect
public class NotEmptyAspect {
+ @SuppressWarnings("EmptyMethod")
@Pointcut("execution(* *(.., @de.samply.annotations.NotEmpty (*), ..))")
public void notEmptyPointcut() {
}
diff --git a/src/main/java/de/samply/aop/ProjectConstraintsAspect.java b/src/main/java/de/samply/aop/ProjectConstraintsAspect.java
index bfe36239..c8aecc1d 100644
--- a/src/main/java/de/samply/aop/ProjectConstraintsAspect.java
+++ b/src/main/java/de/samply/aop/ProjectConstraintsAspect.java
@@ -1,6 +1,7 @@
package de.samply.aop;
import de.samply.annotations.ProjectConstraints;
+import de.samply.db.model.Project;
import de.samply.utils.AspectUtils;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
@@ -22,6 +23,7 @@ public ProjectConstraintsAspect(ConstraintsService constraintsService) {
this.constraintsService = constraintsService;
}
+ @SuppressWarnings("EmptyMethod")
@Pointcut("@annotation(de.samply.annotations.ProjectConstraints)")
public void projectConstraintsPointcut() {
}
@@ -29,8 +31,8 @@ public void projectConstraintsPointcut() {
@Around("projectConstraintsPointcut()")
public Object aroundProjectConstraints(ProceedingJoinPoint joinPoint) throws Throwable {
Optional projectConstraints = fetchProjectConstrains(joinPoint);
- Optional projectCode = AspectUtils.fetchProjectCode(joinPoint);
- Optional result = this.constraintsService.checkProjectConstraints(projectConstraints, projectCode);
+ Optional project = AspectUtils.fetchProject(joinPoint);
+ @SuppressWarnings("rawtypes") Optional result = this.constraintsService.checkProjectConstraints(projectConstraints, project);
return (result.isEmpty()) ? joinPoint.proceed() : result.get();
}
diff --git a/src/main/java/de/samply/aop/ProjectRoleConstraintsAspect.java b/src/main/java/de/samply/aop/RoleConstraintsAspect.java
similarity index 71%
rename from src/main/java/de/samply/aop/ProjectRoleConstraintsAspect.java
rename to src/main/java/de/samply/aop/RoleConstraintsAspect.java
index 3d15270f..7e499f6f 100644
--- a/src/main/java/de/samply/aop/ProjectRoleConstraintsAspect.java
+++ b/src/main/java/de/samply/aop/RoleConstraintsAspect.java
@@ -2,6 +2,8 @@
import de.samply.annotations.RoleConstraints;
import de.samply.annotations.StateConstraints;
+import de.samply.db.model.Project;
+import de.samply.db.model.ProjectBridgehead;
import de.samply.utils.AspectUtils;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
@@ -15,11 +17,11 @@
@Component
@Aspect
-public class ProjectRoleConstraintsAspect {
+public class RoleConstraintsAspect {
- private ConstraintsService constraintsService;
+ private final ConstraintsService constraintsService;
- public ProjectRoleConstraintsAspect(ConstraintsService constraintsService) {
+ public RoleConstraintsAspect(ConstraintsService constraintsService) {
this.constraintsService = constraintsService;
}
@@ -27,13 +29,14 @@ public ProjectRoleConstraintsAspect(ConstraintsService constraintsService) {
public void roleConstraintsPointcut() {
}
+ @SuppressWarnings("rawtypes") // For Optional. Otherwise, it would be too complex
@Around("roleConstraintsPointcut()")
public Object aroundRoleConstraints(ProceedingJoinPoint joinPoint) throws Throwable {
Optional roleConstraints = fetchRoleConstrains(joinPoint);
Optional stateConstraints = fetchStateConstrains(joinPoint);
- Optional projectCode = AspectUtils.fetchProjectCode(joinPoint);
- Optional bridgehead = AspectUtils.fetchBridgehead(joinPoint);
- Optional result = this.constraintsService.checkProjectRoleConstraints(roleConstraints, stateConstraints, projectCode, bridgehead);
+ Optional project = AspectUtils.fetchProject(joinPoint);
+ Optional bridgehead = AspectUtils.fetchBridgehead(joinPoint);
+ Optional result = this.constraintsService.checkRoleConstraints(roleConstraints, stateConstraints, project, bridgehead);
return (result.isEmpty()) ? joinPoint.proceed() : result.get();
}
diff --git a/src/main/java/de/samply/aop/StateConstraintsAspect.java b/src/main/java/de/samply/aop/StateConstraintsAspect.java
index adf45e6d..02b7f036 100644
--- a/src/main/java/de/samply/aop/StateConstraintsAspect.java
+++ b/src/main/java/de/samply/aop/StateConstraintsAspect.java
@@ -1,6 +1,8 @@
package de.samply.aop;
import de.samply.annotations.StateConstraints;
+import de.samply.db.model.Project;
+import de.samply.db.model.ProjectBridgehead;
import de.samply.utils.AspectUtils;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
@@ -22,6 +24,7 @@ public StateConstraintsAspect(ConstraintsService constraintsService) {
this.constraintsService = constraintsService;
}
+ @SuppressWarnings("EmptyMethod")
@Pointcut("@annotation(de.samply.annotations.StateConstraints)")
public void stateConstraintsPointcut() {
}
@@ -29,9 +32,9 @@ public void stateConstraintsPointcut() {
@Around("stateConstraintsPointcut()")
public Object aroundStateConstraints(ProceedingJoinPoint joinPoint) throws Throwable {
Optional stateConstraints = fetchStateConstraints(joinPoint);
- Optional projectCode = AspectUtils.fetchProjectCode(joinPoint);
- Optional bridghead = AspectUtils.fetchBridgehead(joinPoint);
- Optional result = this.constraintsService.checkStateConstraints(stateConstraints, projectCode, bridghead);
+ Optional project = AspectUtils.fetchProject(joinPoint);
+ Optional bridgehead = AspectUtils.fetchBridgehead(joinPoint);
+ @SuppressWarnings("rawtypes") Optional result = this.constraintsService.checkStateConstraints(stateConstraints, project, bridgehead);
return (result.isEmpty()) ? joinPoint.proceed() : result.get();
}
diff --git a/src/main/java/de/samply/aop/ValidEmailAspect.java b/src/main/java/de/samply/aop/ValidEmailAspect.java
index b1a1e422..c443b987 100644
--- a/src/main/java/de/samply/aop/ValidEmailAspect.java
+++ b/src/main/java/de/samply/aop/ValidEmailAspect.java
@@ -1,7 +1,6 @@
package de.samply.aop;
import de.samply.annotations.Email;
-import de.samply.annotations.NotEmpty;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
@@ -13,12 +12,11 @@
import java.lang.annotation.Annotation;
import java.util.Optional;
-import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicReference;
import java.util.regex.Pattern;
import java.util.stream.IntStream;
-// It checks if the parameters marked with the annotation @Email of a REST service, are valid emails.
+// It checks if the parameters marked with the annotation @Email of a REST service are valid emails.
// If not, it returns BAD REQUEST
@Component
@Aspect
@@ -28,6 +26,7 @@ public class ValidEmailAspect {
"^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,6}$"
);
+ @SuppressWarnings("EmptyMethod")
@Pointcut("execution(* *(.., @de.samply.annotations.Email (*), ..))")
public void emailPointcut() {
}
diff --git a/src/main/java/de/samply/app/ProjectManagerApplication.java b/src/main/java/de/samply/app/ProjectManagerApplication.java
index f012404e..b2169b7e 100644
--- a/src/main/java/de/samply/app/ProjectManagerApplication.java
+++ b/src/main/java/de/samply/app/ProjectManagerApplication.java
@@ -1,8 +1,9 @@
package de.samply.app;
+import net.javacrumbs.shedlock.spring.annotation.EnableSchedulerLock;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.boot.autoconfigure.domain.EntityScan;
+import org.springframework.boot.persistence.autoconfigure.EntityScan;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.scheduling.annotation.EnableScheduling;
@@ -12,9 +13,10 @@
@EntityScan(basePackages = {"de.samply.db.model"})
@EnableJpaRepositories("de.samply.db.repository")
@EnableScheduling
+@EnableSchedulerLock(defaultLockAtMostFor = ProjectManagerConst.SHED_LOCK_MAX_TIME_SV)
public class ProjectManagerApplication {
- public static void main(String[] args) {
+ static void main(String[] args) {
SpringApplication.run(ProjectManagerApplication.class, args);
}
diff --git a/src/main/java/de/samply/app/ProjectManagerConst.java b/src/main/java/de/samply/app/ProjectManagerConst.java
index 26151832..8ad07f84 100644
--- a/src/main/java/de/samply/app/ProjectManagerConst.java
+++ b/src/main/java/de/samply/app/ProjectManagerConst.java
@@ -2,25 +2,10 @@
public class ProjectManagerConst {
- public final static String APP_NAME = "Project Manager";
-
- // R-Studio Group Implementations
- public final static String RSTUDIO_GROUP_KEYCLOAK_IMPLEMENTATION = "KEYCLOAK";
-
- // Keycloak paths
- public final static String FETCH_USER_ID_KEYCLOAK_PATH = "/admin/realms/{realm}/users?email={email}";
- public final static String FETCH_GROUP_ID_KEYCLOAK_PATH = "/admin/realms/{realm}/groups?search={group}";
- public final static String CHANGE_USER_GROUP_KEYCLOAK_PATH = "/admin/realms/{realm}/users/{user-id}/groups/{group-id}";
- public final static String FETCH_TOKEN_KEYCLOAK_PATH = "/realms/{realm}/protocol/openid-connect/token";
-
- // Keycloak parameters
- public final static String CLIENT_ID_KEYCLOAK_PARAM = "client_id";
- public final static String CLIENT_SECRET_KEYCLOAK_PARAM = "client_secret";
- public final static String GRANT_TYPE_KEYCLOAK_PARAM = "grant_type";
- public final static String CLIENT_CREDENTIALS_KEYCLOAK_CONST = "client_credentials";
- public final static String ACCES_TOKEN_KEYCLOAK_CONST = "access_token";
- public final static String ID_KEYCLOAK_CONST = "id";
+ public final static String APP_NAME = "ProjectCode Manager";
+ // Profiles
+ public final static String EXTERNAL_EXECUTION_NOT_ALLOWED = "external-execution-not-allowed";
// Sites
public final static String PROJECT_DASHBOARD_SITE = "project-dashboard";
@@ -54,33 +39,42 @@ public class ProjectManagerConst {
public final static String START_PILOT_STAGE_ACTION = "START_PILOT_STAGE";
public final static String START_FINAL_STAGE_ACTION = "START_FINAL_STAGE";
public final static String FINISH_PROJECT_ACTION = "FINISH_PROJECT";
- public final static String DOWNLOAD_APPLICATION_FORM_TEMPLATE_ACTION = "DOWNLOAD_APPLICATION_FORM_TEMPLATE";
public final static String SAVE_QUERY_IN_BRIDGEHEAD_ACTION = "SAVE_QUERY_IN_BRIDGEHEAD";
public final static String SAVE_AND_EXECUTE_QUERY_IN_BRIDGEHEAD_ACTION = "SAVE_AND_EXECUTE_QUERY_IN_BRIDGEHEAD";
public final static String DOWNLOAD_AUTHENTICATION_SCRIPT_ACTION = "DOWNLOAD_AUTHENTICATION_SCRIPT";
public final static String EDIT_PROJECT_ACTION = "EDIT_PROJECT";
+ public final static String REMOVE_PROJECT_OUTPUT_ACTION = "REMOVE_PROJECT_OUTPUT";
public final static String FETCH_EXPORTER_TEMPLATES_ACTION = "EXPORTER_TEMPLATES";
public final static String FETCH_QUERY_FORMATS_ACTION = "FETCH_QUERY_FORMATS";
public final static String FETCH_OUTPUT_FORMATS_ACTION = "FETCH_OUTPUT_FORMATS";
public final static String UPLOAD_VOTUM_ACTION = "UPLOAD_VOTUM";
+ public final static String UPLOAD_DESCRIPTION_ACTION = "UPLOAD_DESCRIPTION";
+ public final static String UPLOAD_ETHICS_APPROVAL_ACTION = "UPLOAD_ETHICS_APPROVAL";
public final static String UPLOAD_VOTUM_FOR_ALL_BRIDGEHEADS_ACTION = "UPLOAD_VOTUM_FOR_ALL_BRIDGEHEADS";
- public final static String UPLOAD_APPLICATION_FORM_ACTION = "UPLOAD_APPLICATION_FORM";
public final static String UPLOAD_PUBLICATION_ACTION = "UPLOAD_PUBLICATION";
+ public final static String UPLOAD_FINAL_REPORT_ACTION = "UPLOAD_FINAL_REPORT";
public final static String UPLOAD_SCRIPT_ACTION = "UPLOAD_SCRIPT";
public final static String UPLOAD_OTHER_DOCUMENT_ACTION = "UPLOAD_OTHER_DOCUMENT";
public final static String ADD_PUBLICATION_URL_ACTION = "ADD_PUBLICATION_URL";
+ public final static String ADD_FINAL_REPORT_URL_ACTION = "ADD_FINAL_REPORT_URL";
public final static String ADD_OTHER_DOCUMENT_URL_ACTION = "ADD_OTHER_DOCUMENT_URL";
+ public final static String DOWNLOAD_DESCRIPTION_ACTION = "DOWNLOAD_DESCRIPTION";
+ public final static String DOWNLOAD_ETHICS_APPROVAL_ACTION = "DOWNLOAD_ETHICS_APPROVAL";
+ public final static String EXISTS_ETHICS_APPROVAL_ACTION = "EXISTS_ETHICS_APPROVAL";
+ public final static String FETCH_ETHICS_APPROVAL_DESCRIPTION_ACTION = "FETCH_ETHICS_APPROVAL_DESCRIPTION";
public final static String DOWNLOAD_VOTUM_ACTION = "DOWNLOAD_VOTUM";
public final static String DOWNLOAD_VOTUM_FOR_ALL_BRIDGEHEADS_ACTION = "DOWNLOAD_VOTUM_FOR_ALL_BRIDGEHEADS";
public final static String FETCH_VOTUM_DESCRIPTION_ACTION = "FETCH_VOTUM_DESCRIPTION";
+ public final static String FETCH_DESCRIPTION_ACTION = "FETCH_DESCRIPTION";
public final static String FETCH_VOTUM_FOR_ALL_BRIDGEHEADS_DESCRIPTION_ACTION = "FETCH_VOTUM_FOR_ALL_BRIDGEHEADS_DESCRIPTION";
public final static String EXISTS_VOTUM_ACTION = "EXISTS_VOTUM";
+ public final static String EXISTS_PUBLICATION_ACTION = "EXISTS_PUBLICATION";
+ public final static String EXISTS_FINAL_REPORT_ACTION = "EXISTS_FINAL_REPORT";
+ public final static String EXISTS_DESCRIPTION_ACTION = "EXISTS_DESCRIPTION";
public final static String EXISTS_VOTUM_FOR_ALL_BRIDGEHEADS_ACTION = "EXISTS_VOTUM_FOR_ALL_BRIDGEHEADS";
- public final static String DOWNLOAD_APPLICATION_FORM_ACTION = "DOWNLOAD_APPLICATION_FORM";
- public final static String FETCH_APPLICATION_FORM_DESCRIPTION_ACTION = "FETCH_APPLICATION_FORM_DESCRIPTION";
- public final static String EXISTS_APPLICATION_FORM_ACTION = "EXISTS_APPLICATION_FORM";
public final static String EXISTS_SCRIPT_ACTION = "EXISTS_SCRIPT";
public final static String DOWNLOAD_PUBLICATION_ACTION = "DOWNLOAD_PUBLICATION";
+ public final static String DOWNLOAD_FINAL_REPORT_ACTION = "DOWNLOAD_FINAL_REPORT";
public final static String DOWNLOAD_SCRIPT_ACTION = "DOWNLOAD_SCRIPT";
public final static String FETCH_SCRIPT_DESCRIPTION_ACTION = "FETCH_SCRIPT_DESCRIPTION";
public final static String DOWNLOAD_OTHER_DOCUMENT_ACTION = "DOWNLOAD_OTHER_DOCUMENT";
@@ -93,6 +87,7 @@ public class ProjectManagerConst {
public final static String FETCH_PROJECT_TYPES_ACTION = "FETCH_PROJECT_TYPES";
public final static String FETCH_PROJECTS_ACTION = "FETCH_PROJECTS";
public final static String FETCH_PUBLICATIONS_ACTION = "FETCH_PUBLICATIONS";
+ public final static String FETCH_FINAL_REPORTS_ACTION = "FETCH_FINAL_REPORTS";
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";
@@ -122,7 +117,7 @@ public class ProjectManagerConst {
public final static String REMOVE_USER_FROM_MAILING_BLACK_LIST_ACTION = "REMOVE_USER_FROM_MAILING_BLACK_LIST";
public final static String FETCH_MAILING_BLACK_LIST_ACTION = "FETCH_MAILING_BLACK_LIST";
public final static String FETCH_USERS_FOR_AUTOCOMPLETE_IN_MAILING_BLACK_LIST_ACTION = "FETCH_USERS_FOR_AUTOCOMPLETE_IN_MAILING_BLACK_LIST";
- public final static String ADD_PROJECT_BRIDGHEAD_RESULTS_URL_ACTION = "ADD_PROJECT_BRIDGHEAD_RESULTS_URL";
+ public final static String ADD_PROJECT_BRIDGEHEAD_RESULTS_URL_ACTION = "ADD_PROJECT_BRIDGEHEAD_RESULTS_URL";
public final static String ADD_PROJECT_RESULTS_URL_ACTION = "ADD_PROJECT_RESULTS_URL";
public final static String ACCEPT_PROJECT_RESULTS_URL_ACTION = "ACCEPT_PROJECT_RESULTS_URL";
public final static String REJECT_PROJECT_RESULTS_URL_ACTION = "REJECT_PROJECT_RESULTS_URL";
@@ -137,6 +132,15 @@ public class ProjectManagerConst {
public final static String IS_PROJECT_MANAGER_ADMIN_ACTION = "IS_PROJECT_MANAGER_ADMIN";
public final static String FETCH_RESEARCH_ENVIRONMENT_URL_ACTION = "FETCH_RESEARCH_ENVIRONMENT_URL";
public final static String EXISTS_RESEARCH_ENVIRONMENT_WORKSPACE_ACTION = "EXISTS_RESEARCH_ENVIRONMENT_WORKSPACE";
+ public final static String FETCH_PROJECT_FORM_TITLES_ACTION = "FETCH_PROJECT_FORM_TITLES";
+ public final static String FETCH_PROJECT_FORM_FIELDS_ACTION = "FETCH_PROJECT_FORM_FIELDS";
+ public final static String FETCH_PROJECT_FORM_TEMPLATES_ACTION = "FETCH_FORM_TEMPLATES";
+ public final static String FETCH_BEST_PROJECT_FORM_TEMPLATES_ACTION = "FETCH_BEST_FORM_TEMPLATES";
+ public final static String EDIT_PROJECT_FORM_FIELDS_ACTION = "EDIT_PROJECT_FORM_FIELDS";
+ public final static String DOWNLOAD_FORM_AS_PDF_ACTION = "DOWNLOAD_FORM_AS_PDF";
+ public final static String FETCH_SELECTED_PROJECT_FORMS_ACTION = "FETCH_SELECTED_PROJECT_FORMS";
+ public final static String ADD_SELECTED_PROJECT_FORM_ACTION = "ADD_SELECTED_PROJECT_FORM";
+ public final static String REMOVE_SELECTED_PROJECT_FORM_ACTION = "REMOVE_SELECTED_PROJECT_FORM";
// REST Services
@@ -145,102 +149,121 @@ public class ProjectManagerConst {
public final static String ACTIONS = "/actions";
public final static String ALL_ACTIONS = "/all-actions";
public final static String FETCH_PROJECTS = "/projects";
- public final static String SET_DEVELOPER_USER = "/set-developer-user";
- public final static String SET_PILOT_USER = "/set-pilot-user";
- public final static String SET_FINAL_USER = "/set-final-user";
+ public final static String SET_DEVELOPER_USER = "/developer";
+ public final static String SET_PILOT_USER = "/pilot-user";
+ public final static String SET_FINAL_USER = "/final-user";
public final static String CREATE_QUERY_AND_DESIGN_PROJECT = "/create-query-and-design-project";
- public final static String EDIT_PROJECT = "/edit-project";
- public final static String FETCH_EXPORTER_TEMPLATES = "/exporter-templates";
- public final static String FETCH_QUERY_FORMATS = "/query-formats";
- public final static String FETCH_PROJECT_ROLES = "/project-roles";
- public final static String FETCH_OUTPUT_FORMATS = "/output-formats";
- public final static String FETCH_PROJECT_CONFIGURATIONS = "/project-configurations";
- public final static String FETCH_CURRENT_PROJECT_CONFIGURATION = "/project-configuration";
- public final static String SET_PROJECT_CONFIGURATION = "/project-configuration";
- public final static String DESIGN_PROJECT = "/design-project";
- public final static String CREATE_PROJECT = "/create-project";
- public final static String ACCEPT_PROJECT = "/accept-project";
- public final static String REJECT_PROJECT = "/reject-project";
- public final static String ADD_USER_TO_MAILING_BLACK_LIST = "/add-mailing-black-list";
- public final static String REMOVE_USER_FROM_MAILING_BLACK_LIST = "/remove-mailing-black-list";
+ public final static String EDIT_PROJECT = "/project/edit";
+ public final static String REMOVE_PROJECT_OUTPUT = "/project/output";
+ public final static String FETCH_EXPORTER_TEMPLATES = "/exporter/templates";
+ public final static String FETCH_QUERY_FORMATS = "/query/formats";
+ public final static String FETCH_PROJECT_ROLES = "/project/roles";
+ public final static String FETCH_OUTPUT_FORMATS = "/output/formats";
+ public final static String FETCH_PROJECT_CONFIGURATIONS = "/project/configurations";
+ public final static String FETCH_CURRENT_PROJECT_CONFIGURATION = "/project/configuration";
+ public final static String SET_PROJECT_CONFIGURATION = "/project/configuration";
+ public final static String DESIGN_PROJECT = "/project/design";
+ public final static String CREATE_PROJECT = "/project";
+ public final static String ACCEPT_PROJECT = "/project/accept";
+ public final static String REJECT_PROJECT = "/project/reject";
+ public final static String ADD_USER_TO_MAILING_BLACK_LIST = "/mailing-black-list";
+ public final static String REMOVE_USER_FROM_MAILING_BLACK_LIST = "/mailing-black-list";
public final static String FETCH_MAILING_BLACK_LIST = "/mailing-black-list";
- public final static String FETCH_USERS_FOR_AUTOCOMPLETE_IN_MAILING_BLACK_LIST = "/mailing-black-list-autocomplete";
- public final static String ACCEPT_BRIDGEHEAD_PROJECT = "/accept-bridgehead-project";
- public final static String REJECT_BRIDGEHEAD_PROJECT = "/reject-bridgehead-project";
- public final static String ACCEPT_SCRIPT = "/accept-script";
- public final static String REJECT_SCRIPT = "/reject-script";
- public final static String REQUEST_SCRIPT_CHANGES = "/request-script-changes";
- 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_USERS_FOR_AUTOCOMPLETE_IN_MAILING_BLACK_LIST = "/mailing-black-list/autocomplete";
+ public final static String ACCEPT_BRIDGEHEAD_PROJECT = "/project/bridgehead/accept";
+ public final static String REJECT_BRIDGEHEAD_PROJECT = "/project/bridgehead/reject";
+ public final static String ACCEPT_SCRIPT = "/script/accept";
+ public final static String REJECT_SCRIPT = "/script/reject";
+ public final static String REQUEST_SCRIPT_CHANGES = "/script/request-changes";
+ public final static String ACCEPT_PROJECT_RESULTS = "/project/results/accept";
+ public final static String REJECT_PROJECT_RESULTS = "/project/results/reject";
+ public final static String REQUEST_CHANGES_IN_PROJECT = "/project/request-changes";
+ public final static String ACCEPT_PROJECT_ANALYSIS = "/project/analysis/accept";
+ public final static String REJECT_PROJECT_ANALYSIS = "/project/analysis/reject";
+ public final static String REQUEST_CHANGES_IN_PROJECT_ANALYSIS = "/project/analysis/request-changes";
+ public final static String FETCH_PROJECT_BRIDGEHEADS = "/project/bridgeheads";
+ public final static String FETCH_VISIBLE_PROJECT_BRIDGEHEADS = "/project/bridgeheads/visible";
public final static String FETCH_PROJECT = "/project";
- public final static String FETCH_PROJECT_STATES = "/project-states";
- public final static String ARCHIVE_PROJECT = "/archive-project";
- public final static String START_DEVELOP_STAGE = "/start-develop-project";
- public final static String START_PILOT_STAGE = "/start-pilot-project";
- public final static String START_FINAL_STAGE = "/start-final-project";
- public final static String FINISH_PROJECT = "/finish-project";
- public final static String CREATE_QUERY = "/create-query";
- public final static String FETCH_PROJECT_TYPES = "/project-types";
- public final static String UPLOAD_VOTUM = "/upload-votum";
- public final static String UPLOAD_VOTUM_FOR_ALL_BRIDGEHEADS = "/upload-votum-for-all-bridgeheads";
- public final static String UPLOAD_APPLICATION_FORM = "/upload-application-form";
- public final static String UPLOAD_PUBLICATION = "/upload-publication";
- public final static String UPLOAD_SCRIPT = "/upload-script";
- public final static String UPLOAD_OTHER_DOCUMENT = "/upload-other-document";
- public final static String ADD_PUBLICATION_URL = "/add-publication-url";
- public final static String ADD_OTHER_DOCUMENT_URL = "/add-other-document-url";
- public final static String DOWNLOAD_VOTUM = "/download-votum";
- public final static String DOWNLOAD_VOTUM_FOR_ALL_BRIDGEHEADS = "/download-votum-for-all-bridgeheads";
- public final static String FETCH_VOTUM_DESCRIPTION = "/votum-description";
- public final static String FETCH_VOTUM_FOR_ALL_BRIDGEHEADS_DESCRIPTION = "/votum-description-for-all-bridgeheads";
- public final static String EXISTS_VOTUM = "/exists-votum";
- public final static String EXISTS_VOTUM_FOR_ALL_BRIDGEHEADS = "/exists-votum-for-all-bridgeheads";
- public final static String DOWNLOAD_APPLICATION_FORM = "/download-application-form";
- public final static String FETCH_APPLICATION_FORM_DESCRIPTION = "/application-form-description";
- public final static String EXISTS_APPLICATION_FORM = "/exists-application-form";
- public final static String DOWNLOAD_PUBLICATION = "/download-publication";
- public final static String DOWNLOAD_SCRIPT = "/download-script";
- public final static String FETCH_SCRIPT_DESCRIPTION = "/script-description";
- public final static String EXISTS_SCRIPT = "/exists-script";
- public final static String DOWNLOAD_OTHER_DOCUMENT = "/download-other-document";
- public final static String DOWNLOAD_APPLICATION_FORM_TEMPLATE = "/download-application-form-template";
- public final static String SAVE_QUERY_IN_BRIDGEHEAD = "/save-query-in-bridgehead";
- public final static String SAVE_AND_EXECUTE_QUERY_IN_BRIDGEHEAD = "/save-and-execute-query-in-bridgehead";
- public final static String DOWNLOAD_AUTHENTICATION_SCRIPT = "/download-authentication-script";
- public final static String SEND_EXPORT_FILES_TO_RESEARCH_ENVIRONMENT = "/send-export-files-to-research-environment";
- public final static String ARE_EXPORT_FILES_TRANSFERRED_TO_RESEARCH_ENVIRONMENT = "/export-files-transferred-to-research-environment";
- public final static String EXISTS_AUTHENTICATION_SCRIPT = "/exists-authentication-script";
+ public final static String FETCH_PROJECT_STATES = "/project/states";
+ public final static String ARCHIVE_PROJECT = "/project/archive";
+ public final static String START_DEVELOP_STAGE = "/project/start-develop";
+ public final static String START_PILOT_STAGE = "/project/start-pilot";
+ public final static String START_FINAL_STAGE = "/project/start-final";
+ public final static String FINISH_PROJECT = "/project/finish";
+ public final static String CREATE_QUERY = "/query";
+ public final static String FETCH_PROJECT_TYPES = "/project/types";
+ public final static String UPLOAD_VOTUM = "/votum/upload";
+ public final static String UPLOAD_DESCRIPTION = "/project/description/upload";
+ public final static String UPLOAD_ETHICS_APPROVAL = "/project/ethics-approval/upload";
+ public final static String DOWNLOAD_ETHICS_APPROVAL = "/project/ethics-approval/download";
+ public final static String EXISTS_ETHICS_APPROVAL = "/project/ethics-approval/exists";
+ public final static String FETCH_ETHICS_APPROVAL_DESCRIPTION = "/project/ethics-approval/description";
+ public final static String UPLOAD_VOTUM_FOR_ALL_BRIDGEHEADS = "/all-bridgeheads/votum/upload";
+ public final static String UPLOAD_PUBLICATION = "/publication/upload";
+ public final static String UPLOAD_FINAL_REPORT = "/report/upload";
+ public final static String UPLOAD_SCRIPT = "/script/upload";
+ public final static String UPLOAD_OTHER_DOCUMENT = "/other-document/upload";
+ public final static String ADD_PUBLICATION_URL = "/publication/url";
+ public final static String ADD_FINAL_REPORT_URL = "/report/url";
+ public final static String ADD_OTHER_DOCUMENT_URL = "/document/url";
+ public final static String DOWNLOAD_VOTUM = "/votum/download";
+ public final static String DOWNLOAD_DESCRIPTION = "/project/description/download";
+ public final static String DOWNLOAD_VOTUM_FOR_ALL_BRIDGEHEADS = "/all-bridgeheads/votum/download";
+ public final static String FETCH_VOTUM_DESCRIPTION = "/votum/description";
+ public final static String FETCH_DESCRIPTION = "/project/description";
+ public final static String FETCH_VOTUM_FOR_ALL_BRIDGEHEADS_DESCRIPTION = "/all-bridgeheads/votum/description";
+ public final static String EXISTS_VOTUM = "/votum/exists";
+ public final static String EXISTS_PUBLICATION = "/publication/exists";
+ public final static String EXISTS_FINAL_REPORT = "/report/exists";
+ public final static String EXISTS_DESCRIPTION = "/project/description/exists";
+ public final static String EXISTS_VOTUM_FOR_ALL_BRIDGEHEADS = "/all-bridgeheads/votum/exists";
+ public final static String DOWNLOAD_PUBLICATION = "/publication/download";
+ public final static String DOWNLOAD_FINAL_REPORT = "/report/download";
+ public final static String DOWNLOAD_SCRIPT = "/script/download";
+ public final static String FETCH_SCRIPT_DESCRIPTION = "/script/description";
+ public final static String EXISTS_SCRIPT = "/script/exists";
+ public final static String DOWNLOAD_OTHER_DOCUMENT = "/other-document/download";
+ public final static String SAVE_QUERY_IN_BRIDGEHEAD = "/project/bridgehead/query/save";
+ public final static String SAVE_AND_EXECUTE_QUERY_IN_BRIDGEHEAD = "/project/bridgehead/query/save-execute";
+ public final static String DOWNLOAD_AUTHENTICATION_SCRIPT = "/authentication-script/download";
+ public final static String SEND_EXPORT_FILES_TO_RESEARCH_ENVIRONMENT = "/project/export-files/send";
+ public final static String ARE_EXPORT_FILES_TRANSFERRED_TO_RESEARCH_ENVIRONMENT = "/project/export-files/status";
+ public final static String EXISTS_AUTHENTICATION_SCRIPT = "/authentication-script/exists";
public final static String FETCH_DATASHIELD_STATUS = "/datashield-status";
public final static String FETCH_PUBLICATIONS = "/publications";
+ public final static String FETCH_FINAL_REPORTS = "/reports";
public final static String FETCH_OTHER_DOCUMENTS = "/other-documents";
public final static String FETCH_NOTIFICATIONS = "/notifications";
- public final static String SET_NOTIFICATION_AS_READ = "/read-notification";
+ public final static String SET_NOTIFICATION_AS_READ = "/notification/read";
public final static String FETCH_ALL_REGISTERED_BRIDGEHEADS = "/bridgeheads";
public final static String FETCH_USERS_FOR_AUTOCOMPLETE = "/autocomplete-users";
- public final static String FETCH_PROJECT_USERS = "/project-users";
+ public final static String FETCH_PROJECT_USERS = "/project/users";
public final static String FETCH_CURRENT_USER = "/current-user";
- public final static String EXIST_INVITED_USERS = "/exist-invited-users";
- public final static String ADD_PROJECT_BRIDGHEAD_RESULTS_URL = "/project-bridgehead-results-url";
- public final static String ADD_PROJECT_RESULTS_URL = "/project-results-url";
- public final static String ACCEPT_PROJECT_RESULTS_URL = "/accept-project-results-url";
- public final static String REJECT_PROJECT_RESULTS_URL = "/reject-project-results-url";
- public final static String FETCH_PROJECT_RESULTS = "/project-results";
- public final static String REQUEST_CHANGES_IN_PROJECT_RESULTS_URL = "/request-changes-project-results-url";
- public final static String ACCEPT_PROJECT_BRIDGEHEAD_RESULTS_URL = "/accept-project-bridgehead-results-url";
- public final static String REJECT_PROJECT_BRIDGEHEAD_RESULTS_URL = "/reject-project-bridgehead-results-url";
- public final static String REQUEST_CHANGES_IN_PROJECT_BRIDGEHEAD_RESULTS_URL = "/request-changes-project-bridgehead-results-url";
- public final static String FETCH_PROJECT_BRIDGEHEAD_RESULTS = "/project-bridgehead-results";
- public final static String FETCH_PROJECT_BRIDGEHEAD_RESULTS_FOR_OWN_BRIDGEHEAD = "/own-project-bridgehead-results";
+ public final static String EXIST_INVITED_USERS = "/invited-users/exists";
+ public final static String ADD_PROJECT_BRIDGEHEAD_RESULTS_URL = "/project/bridgehead/results/url";
+ public final static String ADD_PROJECT_RESULTS_URL = "/project/results/url";
+ public final static String ACCEPT_PROJECT_RESULTS_URL = "/project/results/accept-url";
+ public final static String REJECT_PROJECT_RESULTS_URL = "/project/results/reject-url";
+ public final static String FETCH_PROJECT_RESULTS = "/project/results";
+ public final static String REQUEST_CHANGES_IN_PROJECT_RESULTS_URL = "/project/results/url/request-changes";
+ public final static String ACCEPT_PROJECT_BRIDGEHEAD_RESULTS_URL = "/project/bridgehead/results/url/accept";
+ public final static String REJECT_PROJECT_BRIDGEHEAD_RESULTS_URL = "/project/bridgehead/results/url/reject";
+ public final static String REQUEST_CHANGES_IN_PROJECT_BRIDGEHEAD_RESULTS_URL = "/project/bridgehead/results/url/request-changes";
+ public final static String FETCH_PROJECT_BRIDGEHEAD_RESULTS = "/project/bridgehead/results";
+ public final static String FETCH_PROJECT_BRIDGEHEAD_RESULTS_FOR_OWN_BRIDGEHEAD = "/project/bridgeheads/own/results";
public final static String FETCH_EMAIL_MESSAGE_AND_SUBJECT = "/email-message-and-subject";
public final static String IS_PROJECT_MANAGER_ADMIN = "/is-project-manager-admin";
public final static String FETCH_RESEARCH_ENVIRONMENT_URL = "/research-environment-url";
- public final static String EXISTS_RESEARCH_ENVIRONMENT_WORKSPACE = "/exists-research-environment-workspace";
+ public final static String EXISTS_RESEARCH_ENVIRONMENT_WORKSPACE = "/research-environment-workspace/exists";
+ public final static String FETCH_PROJECT_FORM_TITLES = "/project/forms/titles";
+ public final static String FETCH_PROJECT_FORM_FIELDS = "/project/forms/fields";
+ public final static String FETCH_PROJECT_FORM_TEMPLATES = "/project/forms/templates";
+ public final static String FETCH_BEST_PROJECT_FORM_TEMPLATES = "/project/forms/templates/best";
+ public final static String EDIT_PROJECT_FORM_FIELDS = "/project/forms/fields";
+ public final static String DOWNLOAD_FORM_AS_PDF = "/download-form-as-pdf";
+ public final static String FETCH_SELECTED_PROJECT_FORMS = "/project/forms/selected";
+ public final static String ADD_SELECTED_PROJECT_FORM = "/project/forms/selected";
+ public final static String REMOVE_SELECTED_PROJECT_FORM = "/project/forms/selected";
// REST Parameters
@@ -255,6 +278,7 @@ public class ProjectManagerConst {
public final static String PARTIAL_EMAIL = "partial-email";
public final static String SITE = "site";
public final static String EMAIL = "email";
+ public final static String QUERY = "query";
public final static String QUERY_FORMAT = "query-format";
public final static String PROJECT_TYPE = "project-type";
public final static String PROJECT_STATE = "project-state";
@@ -267,11 +291,16 @@ public class ProjectManagerConst {
public final static String FILENAME = "filename";
public final static String QUERY_CODE = "query-code";
public final static String LABEL = "label";
+ public final static String FORM_TITLE = "form-title";
+ public final static String FORM_FIELDS = "form-fields";
+ public final static String FORM_TEMPLATE = "form-template";
public final static String DESCRIPTION = "description";
+ public final static String COHORT_DEFINITION = "cohort-definition";
public final static String OUTPUT_FORMAT = "output-format";
public final static String TEMPLATE_ID = "template-id";
public final static String HUMAN_READABLE = "human-readable";
public final static String REDIRECT_EXPLORER_URL = "explorer-url";
+ public final static String QUERY_DETAILS = "query-details";
public final static String QUERY_CONTEXT = "query-context";
public final static String RESULTS_URL = "results-url";
public final static String PROJECT_ROLE = "project-role";
@@ -281,7 +310,6 @@ public class ProjectManagerConst {
public final static String EMAIL_CONTEXT_VARIABLE_TAG_ATTRIBUTE_DEFAULT_VARIABLE = "default-var";
// Application Properties
- public final static String JWKS_URI_PROPERTY = "spring.security.oauth2.client.provider.oidc.jwk-set-uri";
public final static String REGISTERED_BRIDGEHEADS = "bridgeheads";
public final static String FRONTEND_CONFIG = "frontend";
public final static String HTTP_PROXY_PREFIX = "http.proxy";
@@ -350,8 +378,6 @@ public class ProjectManagerConst {
public final static String BK_ADMIN_GROUP_PREFIX = "BK_ADMIN_GROUP_PREFIX";
public final static String BK_ADMIN_GROUP_SUFFIX = "BK_ADMIN_GROUP_SUFFIX";
public final static String PROJECT_DOCUMENTS_DIRECTORY = "PROJECT_DOCUMENTS_DIRECTORY";
- public final static String PUBLIC_DOCUMENTS_DIRECTORY = "PUBLIC_DOCUMENTS_DIRECTORY";
- public final static String APPLICATION_FORM_FILENAME = "APPLICATION_FORM_FILENAME";
public final static String PROJECT_DOCUMENTS_DIRECTORY_TIMESTAMP_FORMAT = "PROJECT_DOCUMENTS_DIRECTORY_TIMESTAMP";
public final static String WEBCLIENT_BUFFER_SIZE_IN_BYTES = "WEBCLIENT_BUFFER_SIZE_IN_BYTES";
public final static String WEBCLIENT_REQUEST_TIMEOUT_IN_SECONDS = "WEBCLIENT_REQUEST_TIMEOUT_IN_SECONDS";
@@ -367,6 +393,7 @@ public class ProjectManagerConst {
public final static String ACTION_EXPLANATION_CONFIG_PATH = "ACTION_EXPLANATION_CONFIG_PATH";
public final static String EMAIL_TEMPLATES_DIRECTORY = "EMAIL_TEMPLATES_DIRECTORY";
public final static String EXPORT_TEMPLATES = "EXPORT_TEMPLATES";
+ public final static String SAMPLES_TEMPLATES = "SAMPLES_TEMPLATES";
public final static String DATASHIELD_TEMPLATES = "DATASHIELD_TEMPLATES";
public final static String RESEARCH_ENVIRONMENT_TEMPLATES = "RESEARCH_ENVIRONMENT_TEMPLATES";
public final static String BEAM_PROJECT_MANAGER_ID = "BEAM_PROJECT_MANAGER_ID";
@@ -385,21 +412,16 @@ public class ProjectManagerConst {
public final static String ENABLE_TOKEN_MANAGER = "ENABLE_TOKEN_MANAGER";
public final static String EXPLORER_REDIRECT_URI_PARAMETER = "EXPLORER_REDIRECT_URI_PARAMETER";
public final static String FRONTEND_PROJECT_CONFIG_PATH = "FRONTEND_PROJECT_CONFIG_PATH";
- public final static String RSTUDIO_GROUP_IMPLEMENTATION = "RSTUDIO_GROUP_IMPLEMENTATION";
- public final static String KEYCLOAK_RSTUDIO_GROUP_CLIENT_ID = "KEYCLOAK_RSTUDIO_GROUP_CLIENT_ID";
- public final static String KEYCLOAK_RSTUDIO_GROUP_CLIENT_SECRET = "KEYCLOAK_RSTUDIO_GROUP_CLIENT_SECRET";
- public final static String KEYCLOAK_RSTUDIO_GROUP = "KEYCLOAK_RSTUDIO_GROUP";
- public final static String ENABLE_RSTUDIO_GROUP_MANAGER = "ENABLE_RSTUDIO_GROUP_MANAGER";
- public final static String OIDC_URL = "OIDC_URL";
- public final static String OIDC_REALM = "OIDC_REALM";
public final static String ENABLE_EXPORTER = "ENABLE_EXPORTER";
public final static String MAX_TIME_TO_WAIT_FOCUS_TASK_IN_MINUTES = "MAX_TIME_TO_WAIT_FOCUS_TASK_IN_MINUTES";
public final static String DEFAULT_LANGUAGE = "DEFAULT_LANGUAGE";
+ public final static String REQUEST_CACHE_LIMIT = "REQUEST_CACHE_LIMIT";
public final static String JWT_GROUPS_CLAIM = "JWT_GROUPS_CLAIM";
public final static String JWT_EMAIL_CLAIM = "JWT_EMAIL_CLAIM";
public final static String JWT_FIRST_NAME_CLAIM = "JWT_FIRST_NAME_CLAIM";
public final static String JWT_LAST_NAME_CLAIM = "JWT_LAST_NAME_CLAIM";
+ public final static String JWT_FULL_NAME_CLAIM = "JWT_FULL_NAME_CLAIM";
public final static String CODER_BASE_URL = "CODER_BASE_URL";
public final static String CODER_ORGANISATION_ID = "CODER_ORGANISATION_ID";
@@ -436,6 +458,17 @@ public class ProjectManagerConst {
public final static String APP_REGISTER_AUTHORIZATION_FORMAT = "APP_REGISTER_AUTHORIZATION_FORMAT";
public final static String ENABLE_APP_REGISTER = "ENABLE_APP_REGISTER";
+ public final static String FORM_RESOURCES_DIRECTORY = "FORM_RESOURCES_DIRECTORY";
+ public final static String FORM_TEMPLATE_METADATA_DIRECTORY = "FORM_TEMPLATE_METADATA_DIRECTORY";
+ public final static String FORM_TEMPLATE_DEFAULT_PDF_FILENAME = "FORM_TEMPLATE_DEFAULT_PDF_FILENAME";
+ public final static String FORM_FIELDS_DIRECTORY = "FORM_FIELDS_DIRECTORY";
+ public final static String FORM_TEMPLATE_DATE_PATTERN = "FORM_TEMPLATE_DATE_PATTERN";
+
+ public final static String SHED_LOCK_MAX_TIME = "SHED_LOCK_MAX_TIME";
+ public final static String TIME_BETWEEN_CHECK_EXPORTS_IN_SECONDS = "TIME_BETWEEN_CHECK_EXPORTS_IN_SECONDS";
+ public final static String MAX_NUMBER_OF_RETRIES_BETWEEN_CHECK_EXPORTS = "MAX_NUMBER_OF_RETRIES_BETWEEN_CHECK_EXPORTS";
+
+
// Spring Values (SV)
public final static String HEAD_SV = "${";
public final static String BOTTOM_SV = "}";
@@ -444,14 +477,12 @@ public class ProjectManagerConst {
public final static String JWT_EMAIL_CLAIM_SV = HEAD_SV + JWT_EMAIL_CLAIM + ":email" + BOTTOM_SV;
public final static String JWT_FIRST_NAME_CLAIM_SV = HEAD_SV + JWT_FIRST_NAME_CLAIM + ":given_name" + BOTTOM_SV;
public final static String JWT_LAST_NAME_CLAIM_SV = HEAD_SV + JWT_LAST_NAME_CLAIM + ":family_name" + BOTTOM_SV;
- public final static String JWKS_URI_PROPERTY_SV = HEAD_SV + JWKS_URI_PROPERTY + BOTTOM_SV;
+ public final static String JWT_FULL_NAME_CLAIM_SV = HEAD_SV + JWT_FULL_NAME_CLAIM + ":name" + BOTTOM_SV;
public final static String BK_USER_GROUP_PREFIX_SV = HEAD_SV + BK_USER_GROUP_PREFIX + BOTTOM_SV;
public final static String BK_USER_GROUP_SUFFIX_SV = HEAD_SV + BK_USER_GROUP_SUFFIX + BOTTOM_SV;
public final static String BK_ADMIN_GROUP_PREFIX_SV = HEAD_SV + BK_ADMIN_GROUP_PREFIX + BOTTOM_SV;
public final static String BK_ADMIN_GROUP_SUFFIX_SV = HEAD_SV + BK_ADMIN_GROUP_SUFFIX + BOTTOM_SV;
public final static String PROJECT_DOCUMENTS_DIRECTORY_SV = HEAD_SV + PROJECT_DOCUMENTS_DIRECTORY + BOTTOM_SV;
- public final static String PUBLIC_DOCUMENTS_DIRECTORY_SV = HEAD_SV + PUBLIC_DOCUMENTS_DIRECTORY + BOTTOM_SV;
- public final static String APPLICATION_FORM_FILENAME_SV = HEAD_SV + APPLICATION_FORM_FILENAME + BOTTOM_SV;
public final static String PROJECT_DOCUMENTS_DIRECTORY_TIMESTAMP_FORMAT_SV = HEAD_SV + PROJECT_DOCUMENTS_DIRECTORY_TIMESTAMP_FORMAT + ":yyyyMMdd-HHmmss" + BOTTOM_SV;
public final static String SECURITY_ENABLED_SV = HEAD_SV + SECURITY_ENABLED + ":true" + BOTTOM_SV;
public final static String WEBCLIENT_BUFFER_SIZE_IN_BYTES_SV =
@@ -480,6 +511,7 @@ public class ProjectManagerConst {
public final static String ACTION_EXPLANATION_CONFIG_PATH_SV = HEAD_SV + ACTION_EXPLANATION_CONFIG_PATH + BOTTOM_SV;
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 SAMPLES_TEMPLATES_SV = HEAD_SV + SAMPLES_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;
@@ -503,16 +535,8 @@ public class ProjectManagerConst {
public final static String EXPLORER_URL_SV = HEAD_SV + EXPLORER_URL + BOTTOM_SV;
public final static String EXPLORER_REDIRECT_URI_PARAMETER_SV = HEAD_SV + EXPLORER_REDIRECT_URI_PARAMETER + BOTTOM_SV;
public final static String FRONTEND_PROJECT_CONFIG_PATH_SV = HEAD_SV + FRONTEND_PROJECT_CONFIG_PATH + BOTTOM_SV;
- public final static String RSTUDIO_GROUP_IMPLEMENTATION_SV = HEAD_SV + RSTUDIO_GROUP_IMPLEMENTATION + ":" + RSTUDIO_GROUP_KEYCLOAK_IMPLEMENTATION + BOTTOM_SV;
- public final static String KEYCLOAK_RSTUDIO_GROUP_CLIENT_ID_SV = HEAD_SV + KEYCLOAK_RSTUDIO_GROUP_CLIENT_ID + BOTTOM_SV;
- public final static String KEYCLOAK_RSTUDIO_GROUP_CLIENT_SECRET_SV = HEAD_SV + KEYCLOAK_RSTUDIO_GROUP_CLIENT_SECRET + BOTTOM_SV;
- public final static String KEYCLOAK_RSTUDIO_GROUP_SV = HEAD_SV + KEYCLOAK_RSTUDIO_GROUP + BOTTOM_SV;
- public final static String ENABLE_RSTUDIO_GROUP_MANAGER_SV = HEAD_SV + ENABLE_RSTUDIO_GROUP_MANAGER + ":true" + BOTTOM_SV;
- public final static String OIDC_URL_SV = HEAD_SV + OIDC_URL + BOTTOM_SV;
- public final static String OIDC_REALM_SV = HEAD_SV + OIDC_REALM + BOTTOM_SV;
public final static String CODER_BASE_URL_SV = HEAD_SV + CODER_BASE_URL + BOTTOM_SV;
public final static String CODER_ORGANISATION_ID_SV = HEAD_SV + CODER_ORGANISATION_ID + BOTTOM_SV;
- public final static String CODER_MEMBER_ID_SV = HEAD_SV + CODER_MEMBER_ID + BOTTOM_SV;
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;
@@ -520,6 +544,7 @@ public class ProjectManagerConst {
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_WORKSPACE_NAME_MAX_LENGTH_SV = HEAD_SV + CODER_WORKSPACE_NAME_MAX_LENGTH + ":32" + BOTTOM_SV;
+ public final static String REQUEST_CACHE_LIMIT_SV = HEAD_SV + REQUEST_CACHE_LIMIT + ":#{2 * 1024 * 1024}" + BOTTOM_SV;
public final static String ENABLE_CODER_SV = HEAD_SV + ENABLE_CODER + ":true" + BOTTOM_SV;
@@ -535,7 +560,7 @@ public class ProjectManagerConst {
public final static String EXPORTER_CORE_POOL_SIZE_SV = HEAD_SV + EXPORTER_CORE_POOL_SIZE + ":4" + BOTTOM_SV;
public final static String EXPORTER_MAX_POOL_SIZE_SV = HEAD_SV + EXPORTER_MAX_POOL_SIZE + ":8" + BOTTOM_SV;
public final static String EXPORTER_QUEUE_CAPACITY_SV = HEAD_SV + EXPORTER_QUEUE_CAPACITY + ":500" + BOTTOM_SV;
- public final static String DEFAULT_LANGUAGE_SV = HEAD_SV + DEFAULT_LANGUAGE + ":EN" + BOTTOM_SV;
+ public final static String DEFAULT_LANGUAGE_SV = HEAD_SV + DEFAULT_LANGUAGE + ":en" + BOTTOM_SV;
public final static String TEST_EMAIL_DOMAINS_SV = HEAD_SV + TEST_EMAIL_DOMAINS + ":" + BOTTOM_SV;
@@ -547,6 +572,16 @@ public class ProjectManagerConst {
public final static String APP_REGISTER_AUTHORIZATION_FORMAT_SV = HEAD_SV + APP_REGISTER_AUTHORIZATION_FORMAT + ":ApiKey {}" + BOTTOM_SV;
public final static String ENABLE_APP_REGISTER_SV = HEAD_SV + ENABLE_APP_REGISTER + ":true" + BOTTOM_SV;
+ public final static String FORM_RESOURCES_DIRECTORY_SV = HEAD_SV + FORM_RESOURCES_DIRECTORY + BOTTOM_SV;
+ public final static String FORM_TEMPLATE_METADATA_DIRECTORY_SV = HEAD_SV + FORM_TEMPLATE_METADATA_DIRECTORY + BOTTOM_SV;
+ public final static String FORM_TEMPLATE_DEFAULT_PDF_FILENAME_SV = HEAD_SV + FORM_TEMPLATE_DEFAULT_PDF_FILENAME + ":form.pdf" + BOTTOM_SV;
+ public final static String FORM_FIELDS_DIRECTORY_SV = HEAD_SV + FORM_FIELDS_DIRECTORY + BOTTOM_SV;
+ public final static String FORM_TEMPLATE_DATE_PATTERN_SV = HEAD_SV + FORM_TEMPLATE_DATE_PATTERN + ":d. MMMM yyyy" + BOTTOM_SV;
+ public final static String SHED_LOCK_MAX_TIME_SV = HEAD_SV + SHED_LOCK_MAX_TIME + ":PT5M" + BOTTOM_SV;
+ public final static String TIME_BETWEEN_CHECK_EXPORTS_IN_SECONDS_SV = HEAD_SV + TIME_BETWEEN_CHECK_EXPORTS_IN_SECONDS + ":5" + BOTTOM_SV;
+ public final static String MAX_NUMBER_OF_RETRIES_BETWEEN_CHECK_EXPORTS_SV = HEAD_SV + MAX_NUMBER_OF_RETRIES_BETWEEN_CHECK_EXPORTS + ":3" + BOTTOM_SV;
+
+
// Async Configuration
public final static String ASYNC_EMAIL_SENDER_EXECUTOR = "email-sender";
public final static String ASYNC_NOTIFICATION_EXECUTOR = "notification";
@@ -555,7 +590,7 @@ public class ProjectManagerConst {
// Thymeleaf
public final static int THYMELEAF_PROCESSOR_PRECEDENCE = 1000;
public final static int THYMELEAF_DIALECT_PRECEDENCE = 1000;
- public final static String THYMELEAF_DIALECT_NAME = "Project Manager";
+ public final static String THYMELEAF_DIALECT_NAME = "ProjectCode Manager";
public final static String THYMELEAF_DIALECT_PREFIX = "pm";
// Variable name placeholders
@@ -564,7 +599,6 @@ public class ProjectManagerConst {
// App Register
public final static String REGISTER_PATH = "/beam-app";
- public final static String UNREGISTER_PATH = "/beam-app";
// Others
@@ -583,6 +617,12 @@ public class ProjectManagerConst {
public final static String PRIMARY_MAIL_SENDER = "primaryJavaMailSender";
public final static String TEST_MAIL_SENDER = "testJavaMailSender";
public final static String NOT_AUTHORIZED = "Not authorized yet";
+ public final static String FORM_FILENAME_TIMESTAMP_FORMAT = "yyyyMMdd-HHmm";
+ public final static String FORM_FILENAME_TIMESTAMP_ZONE = "UTC";
+ public final static String FORM_PROJECT_FIELDS_TITLE_PREFIX = "_project_fields";
+ public final static String NOT_SET = "__NOT_SET__";
+ public final static String EXPORTER_JOB_NAME = "exporterJob";
+ public final static String SHEDLOCK_TABLE_NAME = "samply.shedlock";
}
diff --git a/src/main/java/de/samply/app/ProjectManagerController.java b/src/main/java/de/samply/app/ProjectManagerController.java
index d3def9e2..53d5b78d 100644
--- a/src/main/java/de/samply/app/ProjectManagerController.java
+++ b/src/main/java/de/samply/app/ProjectManagerController.java
@@ -6,21 +6,28 @@
import de.samply.annotations.*;
import de.samply.bridgehead.BridgeheadConfiguration;
import de.samply.coder.CoderService;
+import de.samply.datashield.DataShieldTokenManagerService;
+import de.samply.db.model.Project;
+import de.samply.db.model.ProjectBridgehead;
import de.samply.db.model.ProjectDocument;
import de.samply.document.DocumentService;
import de.samply.document.DocumentServiceException;
import de.samply.document.DocumentType;
+import de.samply.document.DtoDocumentService;
import de.samply.email.EmailRecipientType;
import de.samply.email.EmailService;
import de.samply.email.EmailTemplateType;
import de.samply.exporter.ExporterService;
+import de.samply.form.DtoFormService;
+import de.samply.form.FormService;
+import de.samply.form.template.FormTemplateService;
import de.samply.frontend.FrontendService;
import de.samply.frontend.dto.DtoFactory;
+import de.samply.frontend.dto.FormField;
import de.samply.frontend.dto.configuration.ProjectConfigurations;
+import de.samply.notification.DtoNotificationService;
import de.samply.notification.NotificationService;
-import de.samply.project.ProjectBridgeheadService;
-import de.samply.project.ProjectService;
-import de.samply.project.ProjectType;
+import de.samply.project.*;
import de.samply.project.event.ProjectEventActionsException;
import de.samply.project.event.ProjectEventService;
import de.samply.project.state.ProjectBridgeheadState;
@@ -30,15 +37,15 @@
import de.samply.query.QueryFormat;
import de.samply.query.QueryService;
import de.samply.query.QueryState;
-import de.samply.datashield.DataShieldTokenManagerService;
+import de.samply.user.DtoUserService;
import de.samply.user.UserService;
import de.samply.user.roles.OrganisationRole;
import de.samply.user.roles.ProjectRole;
import de.samply.utils.ProjectVersion;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.exception.ExceptionUtils;
+import org.springframework.context.annotation.Profile;
import org.springframework.core.io.ByteArrayResource;
-import org.springframework.core.io.Resource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
@@ -47,248 +54,308 @@
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
-import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Arrays;
+import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
+// Suppress raw types warning:
+// This controller intentionally returns raw ResponseEntity to avoid
+// excessive generic duplication across many endpoints.
+
+// Suppress unused parameter warning:
+// Parameters such as bridgehead and project are not always used
+// directly in the method body but are required for validation and
+// authorization in the AOP layer.
+@SuppressWarnings({"rawtypes"})
@RestController
@Slf4j
public class ProjectManagerController {
private final String projectVersion = ProjectVersion.getProjectVersion();
- private final ObjectMapper objectMapper = new ObjectMapper().enable(SerializationFeature.INDENT_OUTPUT)
- .registerModule(new JavaTimeModule()).configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
+ private final ObjectMapper objectMapper = new ObjectMapper().enable(
+ SerializationFeature.INDENT_OUTPUT)
+ .registerModule(new JavaTimeModule())
+ .configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
private final ProjectEventService projectEventService;
private final FrontendService frontendService;
private final UserService userService;
+ private final DtoUserService dtoUserService;
private final QueryService queryService;
private final DocumentService documentService;
+ private final DtoDocumentService dtoDocumentService;
private final ExporterService exporterService;
private final DataShieldTokenManagerService dataShieldTokenManagerService;
private final ProjectService projectService;
+ private final DtoProjectService dtoProjectService;
private final ProjectBridgeheadService projectBridgeheadService;
+ private final DtoProjectBridgeheadService dtoProjectBridgeheadService;
private final NotificationService notificationService;
+ private final DtoNotificationService dtoNotificationService;
private final BridgeheadConfiguration bridgeheadConfiguration;
private final ProjectConfigurations frontendProjectConfigurations;
private final DtoFactory dtoFactory;
private final EmailService emailService;
private final CoderService coderService;
+ private final FormService formService;
+ private final DtoFormService dtoFormService;
+ private final FormTemplateService formTemplateService;
public ProjectManagerController(ProjectEventService projectEventService,
FrontendService frontendService,
UserService userService,
+ DtoUserService dtoUserService,
QueryService queryService,
DocumentService documentService,
+ DtoDocumentService dtoDocumentService,
ExporterService exporterService,
DataShieldTokenManagerService dataShieldTokenManagerService,
ProjectService projectService,
+ DtoProjectService dtoProjectService,
ProjectBridgeheadService projectBridgeheadService,
+ DtoProjectBridgeheadService dtoProjectBridgeheadService,
NotificationService notificationService,
+ DtoNotificationService dtoNotificationService,
BridgeheadConfiguration bridgeheadConfiguration,
ProjectConfigurations frontendProjectConfigurations,
DtoFactory dtoFactory,
EmailService emailService,
- CoderService coderService) {
+ CoderService coderService,
+ FormService formService,
+ DtoFormService dtoFormService,
+ FormTemplateService formTemplateService) {
this.projectEventService = projectEventService;
this.frontendService = frontendService;
this.userService = userService;
+ this.dtoUserService = dtoUserService;
this.queryService = queryService;
this.documentService = documentService;
+ this.dtoDocumentService = dtoDocumentService;
this.exporterService = exporterService;
this.dataShieldTokenManagerService = dataShieldTokenManagerService;
this.projectService = projectService;
+ this.dtoProjectService = dtoProjectService;
this.projectBridgeheadService = projectBridgeheadService;
+ this.dtoProjectBridgeheadService = dtoProjectBridgeheadService;
this.notificationService = notificationService;
+ this.dtoNotificationService = dtoNotificationService;
this.bridgeheadConfiguration = bridgeheadConfiguration;
this.frontendProjectConfigurations = frontendProjectConfigurations;
this.dtoFactory = dtoFactory;
this.emailService = emailService;
this.coderService = coderService;
+ this.formService = formService;
+ this.dtoFormService = dtoFormService;
+ this.formTemplateService = formTemplateService;
}
@GetMapping(value = ProjectManagerConst.INFO)
- public ResponseEntity info() {
+ public ResponseEntity info() {
return new ResponseEntity<>(projectVersion, HttpStatus.OK);
}
@GetMapping(value = ProjectManagerConst.TEST)
- public ResponseEntity test() {
+ public ResponseEntity test() {
return new ResponseEntity<>(ProjectManagerConst.THIS_IS_A_TEST, HttpStatus.OK);
}
@GetMapping(value = ProjectManagerConst.ACTIONS, produces = MediaType.APPLICATION_JSON_VALUE)
- public ResponseEntity fetchActions(
- @ProjectCode @RequestParam(name = ProjectManagerConst.PROJECT_CODE, required = false) String projectCode,
- @Bridgehead @RequestParam(name = ProjectManagerConst.BRIDGEHEAD, required = false) String bridgehead,
- @RequestParam(name = ProjectManagerConst.LANGUAGE, required = false) String language,
- @RequestParam(name = ProjectManagerConst.SITE) String site
+ public ResponseEntity fetchActions(
+ @ProjectCode @RequestParameter(name = ProjectManagerConst.PROJECT_CODE, required = false) Project project,
+ @Bridgehead @RequestParameter(name = ProjectManagerConst.BRIDGEHEAD, required = false) ProjectBridgehead bridgehead,
+ @Language String language,
+ @RequestParameter(name = ProjectManagerConst.SITE) String site
) {
return convertToResponseEntity(() ->
- this.frontendService.fetchModuleActionPackage(site, Optional.ofNullable(projectCode), Optional.ofNullable(bridgehead), Optional.ofNullable(language), true));
+ this.frontendService.fetchModuleActionPackage(site, Optional.ofNullable(project),
+ Optional.ofNullable(bridgehead), Optional.ofNullable(language), true));
}
@GetMapping(value = ProjectManagerConst.ALL_ACTIONS, produces = MediaType.APPLICATION_JSON_VALUE)
- public ResponseEntity fetchAllActions(
- @ProjectCode @RequestParam(name = ProjectManagerConst.PROJECT_CODE, required = false) String projectCode,
- @Bridgehead @RequestParam(name = ProjectManagerConst.BRIDGEHEAD, required = false) String bridgehead,
- @RequestParam(name = ProjectManagerConst.LANGUAGE, required = false) String language,
- @RequestParam(name = ProjectManagerConst.SITE) String site
+ public ResponseEntity fetchAllActions(
+ @ProjectCode @RequestParameter(name = ProjectManagerConst.PROJECT_CODE, required = false) Project project,
+ @Bridgehead @RequestParameter(name = ProjectManagerConst.BRIDGEHEAD, required = false) ProjectBridgehead bridgehead,
+ @Language String language,
+ @RequestParameter(name = ProjectManagerConst.SITE) String site
) {
return convertToResponseEntity(() ->
- this.frontendService.fetchModuleActionPackage(site, Optional.ofNullable(projectCode), Optional.ofNullable(bridgehead), Optional.ofNullable(language), false));
+ this.frontendService.fetchModuleActionPackage(site, Optional.ofNullable(project),
+ Optional.ofNullable(bridgehead), Optional.ofNullable(language), false));
}
@FrontendSiteModule(site = ProjectManagerConst.PROJECT_DASHBOARD_SITE, module = ProjectManagerConst.PROJECTS_MODULE)
@FrontendAction(action = ProjectManagerConst.FETCH_PROJECTS_ACTION)
@GetMapping(value = ProjectManagerConst.FETCH_PROJECTS, produces = MediaType.APPLICATION_JSON_VALUE)
- public ResponseEntity fetchProjects(
- @RequestParam(name = ProjectManagerConst.PROJECT_STATE, required = false) ProjectState projectState,
- @RequestParam(name = ProjectManagerConst.ARCHIVED, required = false) Boolean archived,
- @RequestParam(name = ProjectManagerConst.LAST_MODIFIED_DESC, required = false, defaultValue = "true") boolean modifiedDescendant,
- @RequestParam(name = ProjectManagerConst.PAGE) int page,
- @RequestParam(name = ProjectManagerConst.PAGE_SIZE) int pageSize
+ public ResponseEntity fetchProjects(
+ @RequestParameter(name = ProjectManagerConst.PROJECT_STATE, required = false) ProjectState projectState,
+ @RequestParameter(name = ProjectManagerConst.ARCHIVED, required = false) Boolean archived,
+ @RequestParameter(name = ProjectManagerConst.LAST_MODIFIED_DESC, required = false, defaultValue = "true") boolean modifiedDescendant,
+ @RequestParameter(name = ProjectManagerConst.PAGE) int page,
+ @RequestParameter(name = ProjectManagerConst.PAGE_SIZE) int pageSize
) {
- return convertToResponseEntity(() -> projectService.fetchUserVisibleProjects(
- Optional.ofNullable(projectState), Optional.ofNullable(archived), page, pageSize, modifiedDescendant));
+ return convertToResponseEntity(() -> dtoProjectService.fetchUserVisibleProjects(
+ Optional.ofNullable(projectState), Optional.ofNullable(archived), page, pageSize,
+ modifiedDescendant));
}
- @RoleConstraints(projectRoles = {ProjectRole.CREATOR, ProjectRole.DEVELOPER, ProjectRole.PILOT, ProjectRole.FINAL, ProjectRole.BRIDGEHEAD_ADMIN, ProjectRole.PROJECT_MANAGER_ADMIN})
+ @RoleConstraints(projectRoles = {ProjectRole.CREATOR, ProjectRole.DEVELOPER, ProjectRole.PILOT,
+ ProjectRole.FINAL, ProjectRole.BRIDGEHEAD_ADMIN, ProjectRole.PROJECT_MANAGER_ADMIN})
@FrontendSiteModule(site = ProjectManagerConst.PROJECT_VIEW_SITE, module = ProjectManagerConst.PROJECT_BRIDGEHEAD_MODULE)
@FrontendAction(action = ProjectManagerConst.FETCH_PROJECT_ACTION)
@GetMapping(value = ProjectManagerConst.FETCH_PROJECT, produces = MediaType.APPLICATION_JSON_VALUE)
- public ResponseEntity fetchProject(
- @ProjectCode @RequestParam(name = ProjectManagerConst.PROJECT_CODE) String projectCode,
+ public ResponseEntity fetchProject(
+ @ProjectCode @RequestParameter(name = ProjectManagerConst.PROJECT_CODE) Project project,
// Bridgehead required for role constraints
- @Bridgehead @RequestParam(name = ProjectManagerConst.BRIDGEHEAD) String bridgehead
+ @SuppressWarnings("unused") @Bridgehead @RequestParameter(name = ProjectManagerConst.BRIDGEHEAD) ProjectBridgehead bridgehead
) {
- return convertToResponseEntity(() -> projectService.fetchProject(projectCode));
+ return convertToResponseEntity(() -> dtoProjectService.fetchDtoProject(project.getCode()));
}
@FrontendSiteModule(site = ProjectManagerConst.PROJECT_VIEW_SITE, module = ProjectManagerConst.PROJECT_BRIDGEHEAD_MODULE)
@FrontendSiteModule(site = ProjectManagerConst.PROJECT_DASHBOARD_SITE, module = ProjectManagerConst.PROJECT_BRIDGEHEAD_MODULE)
@FrontendAction(action = ProjectManagerConst.FETCH_PROJECT_STATES_ACTION)
@GetMapping(value = ProjectManagerConst.FETCH_PROJECT_STATES, produces = MediaType.APPLICATION_JSON_VALUE)
- public ResponseEntity fetchProjectStates(
+ public ResponseEntity fetchProjectStates(
+ @ProjectCode @RequestParameter(name = ProjectManagerConst.PROJECT_CODE, required = false) Project project
) {
- return convertToResponseEntity(() -> ProjectState.values());
+ return convertToResponseEntity(
+ () -> projectEventService.fetchAllProjectEvents(Optional.ofNullable(project)));
}
@FrontendSiteModule(site = ProjectManagerConst.PROJECT_VIEW_SITE, module = ProjectManagerConst.PROJECT_BRIDGEHEAD_MODULE)
@FrontendAction(action = ProjectManagerConst.FETCH_VISIBLE_PROJECT_BRIDGEHEADS_ACTION)
@GetMapping(value = ProjectManagerConst.FETCH_VISIBLE_PROJECT_BRIDGEHEADS, produces = MediaType.APPLICATION_JSON_VALUE)
- public ResponseEntity fetchVisibleProjectsBridgeheads(
- @ProjectCode @RequestParam(name = ProjectManagerConst.PROJECT_CODE) String projectCode
+ public ResponseEntity fetchVisibleProjectsBridgeheads(
+ @ProjectCode @RequestParameter(name = ProjectManagerConst.PROJECT_CODE) Project project
) {
- return convertToResponseEntity(() -> projectBridgeheadService.fetchUserVisibleProjectBridgeheads(projectCode));
+ return convertToResponseEntity(
+ () -> dtoProjectBridgeheadService.fetchUserVisibleProjectBridgeheads(project));
}
@FrontendSiteModule(site = ProjectManagerConst.PROJECT_VIEW_SITE, module = ProjectManagerConst.PROJECT_BRIDGEHEAD_MODULE)
@FrontendAction(action = ProjectManagerConst.FETCH_PROJECT_BRIDGEHEADS_ACTION)
@GetMapping(value = ProjectManagerConst.FETCH_PROJECT_BRIDGEHEADS, produces = MediaType.APPLICATION_JSON_VALUE)
- public ResponseEntity fetchProjectsBridgeheads(
- @ProjectCode @RequestParam(name = ProjectManagerConst.PROJECT_CODE) String projectCode
+ public ResponseEntity fetchProjectsBridgeheads(
+ @ProjectCode @RequestParameter(name = ProjectManagerConst.PROJECT_CODE) Project project
) {
- return convertToResponseEntity(() -> projectBridgeheadService.fetchProjectBridgeheads(projectCode));
+ return convertToResponseEntity(
+ () -> dtoProjectBridgeheadService.fetchProjectBridgeheads(project));
}
- @RoleConstraints(projectRoles = {ProjectRole.CREATOR, ProjectRole.BRIDGEHEAD_ADMIN, ProjectRole.PROJECT_MANAGER_ADMIN})
+ @RoleConstraints(projectRoles = {ProjectRole.CREATOR, ProjectRole.BRIDGEHEAD_ADMIN,
+ ProjectRole.PROJECT_MANAGER_ADMIN})
@StateConstraints(projectStates = {ProjectState.DEVELOP})
@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})
+ @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
@FrontendSiteModule(site = ProjectManagerConst.PROJECT_VIEW_SITE, module = ProjectManagerConst.USER_MODULE)
@FrontendAction(action = ProjectManagerConst.SET_DEVELOPER_USER_ACTION)
@PostMapping(value = ProjectManagerConst.SET_DEVELOPER_USER)
- public ResponseEntity setUserAsDeveloper(
- @ProjectCode @RequestParam(name = ProjectManagerConst.PROJECT_CODE) String projectCode,
- @Bridgehead @RequestParam(name = ProjectManagerConst.BRIDGEHEAD) String bridgehead,
- @Email @RequestParam(name = ProjectManagerConst.EMAIL) String email
+ public ResponseEntity setUserAsDeveloper(
+ @ProjectCode @RequestVariable(name = ProjectManagerConst.PROJECT_CODE) Project project,
+ @Bridgehead @RequestVariable(name = ProjectManagerConst.BRIDGEHEAD) ProjectBridgehead bridgehead,
+ @Email @RequestVariable(name = ProjectManagerConst.EMAIL) String email
) {
return convertToResponseEntity(() ->
- this.userService.setProjectBridgheadUserWithRoleAndGenerateTokensIfDataShield(email, projectCode, bridgehead, ProjectRole.DEVELOPER));
+ this.userService.setProjectBridgeheadUserWithRoleAndGenerateTokensIfDataShield(email,
+ project, bridgehead, ProjectRole.DEVELOPER));
}
@RoleConstraints(projectRoles = {ProjectRole.BRIDGEHEAD_ADMIN, ProjectRole.PROJECT_MANAGER_ADMIN})
@StateConstraints(projectStates = {ProjectState.PILOT})
@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})
+ @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)
@FrontendAction(action = ProjectManagerConst.SET_PILOT_USER_ACTION)
@PostMapping(value = ProjectManagerConst.SET_PILOT_USER)
- public ResponseEntity setUserAsPilot(
- @ProjectCode @RequestParam(name = ProjectManagerConst.PROJECT_CODE) String projectCode,
- @Bridgehead @RequestParam(name = ProjectManagerConst.BRIDGEHEAD) String bridgehead,
- @Email @RequestParam(name = ProjectManagerConst.EMAIL) String email
+ public ResponseEntity setUserAsPilot(
+ @ProjectCode @RequestVariable(name = ProjectManagerConst.PROJECT_CODE) Project project,
+ @Bridgehead @RequestVariable(name = ProjectManagerConst.BRIDGEHEAD) ProjectBridgehead bridgehead,
+ @Email @RequestVariable(name = ProjectManagerConst.EMAIL) String email
) {
return convertToResponseEntity(() ->
- this.userService.setProjectBridgheadUserWithRoleAndGenerateTokensIfDataShield(email, projectCode, bridgehead, ProjectRole.PILOT));
+ this.userService.setProjectBridgeheadUserWithRoleAndGenerateTokensIfDataShield(email,
+ project, bridgehead, ProjectRole.PILOT));
}
@RoleConstraints(organisationRoles = {OrganisationRole.PROJECT_MANAGER_ADMIN})
@StateConstraints(projectStates = {ProjectState.FINAL})
- @EmailSender(templateType = EmailTemplateType.INVITATION, recipients = {EmailRecipientType.EMAIL_ANNOTATION})
+ @EmailSender(templateType = EmailTemplateType.INVITATION, recipients = {
+ EmailRecipientType.EMAIL_ANNOTATION})
@FrontendSiteModule(site = ProjectManagerConst.PROJECT_VIEW_SITE, module = ProjectManagerConst.USER_MODULE)
@FrontendAction(action = ProjectManagerConst.SET_FINAL_USER_ACTION)
@PostMapping(value = ProjectManagerConst.SET_FINAL_USER)
- public ResponseEntity setUserAsFinal(
- @ProjectCode @RequestParam(name = ProjectManagerConst.PROJECT_CODE) String projectCode,
- @Bridgehead @RequestParam(name = ProjectManagerConst.BRIDGEHEAD) String bridgehead,
- @Email @RequestParam(name = ProjectManagerConst.EMAIL) String email
+ public ResponseEntity setUserAsFinal(
+ @ProjectCode @RequestVariable(name = ProjectManagerConst.PROJECT_CODE) Project project,
+ @Bridgehead @RequestVariable(name = ProjectManagerConst.BRIDGEHEAD) ProjectBridgehead bridgehead,
+ @Email @RequestVariable(name = ProjectManagerConst.EMAIL) String email
) {
return convertToResponseEntity(() ->
- this.userService.setProjectBridgheadUserWithRoleAndGenerateTokensIfDataShield(email, projectCode, bridgehead, ProjectRole.FINAL));
+ this.userService.setProjectBridgeheadUserWithRoleAndGenerateTokensIfDataShield(email,
+ project, bridgehead, ProjectRole.FINAL));
}
@RoleConstraints(organisationRoles = {OrganisationRole.RESEARCHER})
@PostMapping(value = ProjectManagerConst.CREATE_QUERY)
- public ResponseEntity createProjectQuery(
- @NotEmpty @RequestBody() String query,
- @NotEmpty @RequestParam(name = ProjectManagerConst.QUERY_FORMAT) QueryFormat queryFormat,
- @RequestParam(name = ProjectManagerConst.LABEL, required = false) String label,
- @RequestParam(name = ProjectManagerConst.DESCRIPTION, required = false) String description,
- @RequestParam(name = ProjectManagerConst.OUTPUT_FORMAT, required = false) OutputFormat outputFormat,
- @RequestParam(name = ProjectManagerConst.TEMPLATE_ID, required = false) String templateId,
- @RequestParam(name = ProjectManagerConst.HUMAN_READABLE, required = false) String humanReadable,
- @RequestParam(name = ProjectManagerConst.REDIRECT_EXPLORER_URL, required = false) String explorerUrl,
- @RequestParam(name = ProjectManagerConst.QUERY_CONTEXT, required = false) String queryContext
+ public ResponseEntity createProjectQuery(
+ @RequestVariable(name = ProjectManagerConst.QUERY, notEmpty = true) String query,
+ @RequestVariable(name = ProjectManagerConst.QUERY_FORMAT, notEmpty = true) QueryFormat queryFormat,
+ @RequestVariable(name = ProjectManagerConst.LABEL, required = false) String label,
+ @RequestVariable(name = ProjectManagerConst.DESCRIPTION, required = false) String description,
+ @RequestVariable(name = ProjectManagerConst.OUTPUT_FORMAT, required = false) OutputFormat outputFormat,
+ @RequestVariable(name = ProjectManagerConst.TEMPLATE_ID, required = false) String templateId,
+ @RequestVariable(name = ProjectManagerConst.HUMAN_READABLE, required = false) String humanReadable,
+ @RequestVariable(name = ProjectManagerConst.REDIRECT_EXPLORER_URL, required = false) String explorerUrl,
+ @RequestVariable(name = ProjectManagerConst.QUERY_CONTEXT, required = false) String queryContext,
+ @RequestVariable(name = ProjectManagerConst.QUERY_DETAILS, required = false) String queryDetails,
+ @RequestVariable(name = ProjectManagerConst.PROJECT_TYPE, required = false) ProjectType projectType
) {
return convertToResponseEntity(() ->
- this.queryService.createQuery(query, queryFormat, label, description, outputFormat, templateId, humanReadable, explorerUrl, queryContext));
+ this.queryService.createQuery(query, queryFormat, label, description,
+ outputFormat, templateId, projectType, humanReadable, explorerUrl, queryContext,
+ queryDetails));
}
@RoleConstraints(organisationRoles = {OrganisationRole.RESEARCHER})
@PostMapping(value = ProjectManagerConst.CREATE_QUERY_AND_DESIGN_PROJECT)
- public ResponseEntity createQueryAndDesignProject(
- @NotEmpty @RequestBody() String query,
- @NotEmpty @RequestParam(name = ProjectManagerConst.QUERY_FORMAT) QueryFormat queryFormat,
- @RequestParam(name = ProjectManagerConst.BRIDGEHEADS, required = false) String[] bridgeheads,
- @RequestParam(name = ProjectManagerConst.EXPLORER_IDS, required = false) String[] explorerIds,
- @RequestParam(name = ProjectManagerConst.LABEL, required = false) String label,
- @RequestParam(name = ProjectManagerConst.DESCRIPTION, required = false) String description,
- @RequestParam(name = ProjectManagerConst.OUTPUT_FORMAT, required = false) OutputFormat outputFormat,
- @RequestParam(name = ProjectManagerConst.TEMPLATE_ID, required = false) String templateId,
- @RequestParam(name = ProjectManagerConst.HUMAN_READABLE, required = false) String humanReadable,
- @RequestParam(name = ProjectManagerConst.REDIRECT_EXPLORER_URL, required = false) String explorerUrl,
- @RequestParam(name = ProjectManagerConst.PROJECT_TYPE, required = false) ProjectType projectType,
- @RequestParam(name = ProjectManagerConst.QUERY_CONTEXT, required = false) String queryContext
+ public ResponseEntity createQueryAndDesignProject(
+ @RequestVariable(name = ProjectManagerConst.QUERY, notEmpty = true) String query,
+ @RequestVariable(name = ProjectManagerConst.QUERY_FORMAT, notEmpty = true) QueryFormat queryFormat,
+ @RequestVariable(name = ProjectManagerConst.BRIDGEHEADS, required = false) String[] bridgeheads,
+ @RequestVariable(name = ProjectManagerConst.EXPLORER_IDS, required = false) String[] explorerIds,
+ @RequestVariable(name = ProjectManagerConst.LABEL, required = false) String label,
+ @RequestVariable(name = ProjectManagerConst.DESCRIPTION, required = false) String description,
+ @RequestVariable(name = ProjectManagerConst.OUTPUT_FORMAT, required = false) OutputFormat outputFormat,
+ @RequestVariable(name = ProjectManagerConst.TEMPLATE_ID, required = false) String templateId,
+ @RequestVariable(name = ProjectManagerConst.HUMAN_READABLE, required = false) String humanReadable,
+ @RequestVariable(name = ProjectManagerConst.REDIRECT_EXPLORER_URL, required = false) String explorerUrl,
+ @RequestVariable(name = ProjectManagerConst.PROJECT_TYPE, required = false) ProjectType projectType,
+ @RequestVariable(name = ProjectManagerConst.QUERY_DETAILS, required = false) String queryDetails,
+ @RequestVariable(name = ProjectManagerConst.QUERY_CONTEXT, required = false) String queryContext
) throws ProjectEventActionsException {
if (areBridgeheadsOrExplorerIdsEmpty(bridgeheads, explorerIds)) {
return ResponseEntity.badRequest().body("Bridgeheads or explorer ids cannot be empty");
}
String[] tempBridgeheads = (explorerIds != null && explorerIds.length > 0) ?
- Arrays.stream(explorerIds).map(explorerId ->
- bridgeheadConfiguration.getBridgeheadForExplorerId(explorerId).get()).toArray(String[]::new) : bridgeheads;
+ Arrays.stream(explorerIds)
+ .map(bridgeheadConfiguration::getBridgeheadForExplorerId)
+ .flatMap(Optional::stream)
+ .toArray(String[]::new) : bridgeheads;
String queryCode = this.queryService.createQuery(
- query, queryFormat, label, description, outputFormat, templateId, humanReadable, explorerUrl, queryContext);
- String projectCode = this.projectEventService.draft(tempBridgeheads, queryCode, projectType);
+ query, queryFormat, label, description, outputFormat, templateId,
+ projectType, humanReadable, explorerUrl, queryContext, queryDetails);
+ String projectCode = this.projectEventService.draft(tempBridgeheads, queryCode);
this.queryService.addProjectCodeToExporterUrl(queryCode, projectCode);
return convertToResponseEntity(() -> this.frontendService.fetchExplorerRedirectUri(
ProjectManagerConst.PROJECT_VIEW_SITE,
@@ -297,95 +364,271 @@ public ResponseEntity createQueryAndDesignProject(
}
private boolean areBridgeheadsOrExplorerIdsEmpty(String[] bridgeheads, String[] explorerIds) {
- return (bridgeheads == null || bridgeheads.length == 0) && (explorerIds == null || explorerIds.length == 0);
+ return (bridgeheads == null || bridgeheads.length == 0) && (explorerIds == null
+ || explorerIds.length == 0);
}
- @RoleConstraints(projectRoles = {ProjectRole.CREATOR})
- @StateConstraints(projectStates = {ProjectState.DRAFT, ProjectState.CREATED})
+ @RoleConstraints(projectRoles = {ProjectRole.CREATOR, ProjectRole.PROJECT_MANAGER_ADMIN})
+ @StateConstraints(projectStates = {ProjectState.DRAFT, ProjectState.REVIEW})
@FrontendSiteModule(site = ProjectManagerConst.PROJECT_VIEW_SITE, module = ProjectManagerConst.PROJECT_EDITION_MODULE)
@FrontendAction(action = ProjectManagerConst.EDIT_PROJECT_ACTION)
- @PostMapping(value = ProjectManagerConst.EDIT_PROJECT)
- public ResponseEntity editProject(
- @RequestBody() String query,
- @RequestParam(name = ProjectManagerConst.QUERY_FORMAT, required = false) QueryFormat queryFormat,
- @RequestParam(name = ProjectManagerConst.BRIDGEHEADS, required = false) String[] bridgeheads,
- @RequestParam(name = ProjectManagerConst.EXPLORER_IDS, required = false) String[] explorerIds,
- @RequestParam(name = ProjectManagerConst.LABEL, required = false) String label,
- @RequestParam(name = ProjectManagerConst.DESCRIPTION, required = false) String description,
- @RequestParam(name = ProjectManagerConst.OUTPUT_FORMAT, required = false) OutputFormat outputFormat,
- @RequestParam(name = ProjectManagerConst.TEMPLATE_ID, required = false) String templateId,
- @RequestParam(name = ProjectManagerConst.HUMAN_READABLE, required = false) String humanReadable,
- @RequestParam(name = ProjectManagerConst.REDIRECT_EXPLORER_URL, required = false) String explorerUrl,
- @RequestParam(name = ProjectManagerConst.PROJECT_TYPE, required = false) ProjectType projectType,
- @RequestParam(name = ProjectManagerConst.QUERY_CONTEXT, required = false) String queryContext,
- @ProjectCode @RequestParam(name = ProjectManagerConst.PROJECT_CODE) String projectCode
- ) {
- String[] tempBridgeheads = (explorerIds != null && explorerIds.length > 0) ?
- Arrays.stream(explorerIds).map(explorerId ->
- bridgeheadConfiguration.getBridgeheadForExplorerId(explorerId).get()).toArray(String[]::new) : bridgeheads;
- projectService.editProject(projectCode, projectType, tempBridgeheads);
- queryService.editQuery(projectCode, (query != null && query.trim().length() > 0 && !query.equals("{}")) ? query : null, queryFormat, label, description, outputFormat, templateId, humanReadable, explorerUrl, queryContext);
+ @PutMapping(value = ProjectManagerConst.EDIT_PROJECT)
+ public ResponseEntity editProject(
+ @RequestVariable(name = ProjectManagerConst.QUERY, required = false) String query,
+ @RequestVariable(name = ProjectManagerConst.QUERY_FORMAT, required = false) QueryFormat queryFormat,
+ @RequestVariable(name = ProjectManagerConst.BRIDGEHEADS, required = false) String[] bridgeheads,
+ @RequestVariable(name = ProjectManagerConst.EXPLORER_IDS, required = false) String[] explorerIds,
+ @RequestVariable(name = ProjectManagerConst.LABEL, required = false) String label,
+ @RequestVariable(name = ProjectManagerConst.DESCRIPTION, required = false) String description,
+ @RequestVariable(name = ProjectManagerConst.COHORT_DEFINITION, required = false) String cohortDefinition,
+ @RequestVariable(name = ProjectManagerConst.OUTPUT_FORMAT, required = false) OutputFormat outputFormat,
+ @RequestVariable(name = ProjectManagerConst.TEMPLATE_ID, required = false) String templateId,
+ @RequestVariable(name = ProjectManagerConst.PROJECT_TYPE, required = false) ProjectType projectType,
+ @RequestVariable(name = ProjectManagerConst.HUMAN_READABLE, required = false) String humanReadable,
+ @RequestVariable(name = ProjectManagerConst.REDIRECT_EXPLORER_URL, required = false) String explorerUrl,
+ @RequestVariable(name = ProjectManagerConst.QUERY_CONTEXT, required = false) String queryContext,
+ @RequestVariable(name = ProjectManagerConst.QUERY_DETAILS, required = false) String queryDetails,
+ @ProjectCode @RequestVariable(name = ProjectManagerConst.PROJECT_CODE) Project project
+ ) {
+ if (bridgeheads != null) {
+ String[] tempBridgeheads = (explorerIds != null && explorerIds.length > 0) ?
+ Arrays.stream(explorerIds)
+ .map(bridgeheadConfiguration::getBridgeheadForExplorerId)
+ .flatMap(Optional::stream)
+ .toArray(String[]::new) : bridgeheads;
+ projectService.updateBridgeheads(project, tempBridgeheads);
+ }
+ queryService.editQuery(project,
+ (query != null && !query.trim().isEmpty() && !query.equals("{}")) ? query :
+ null, queryFormat, label, description, outputFormat, templateId, projectType,
+ humanReadable,
+ explorerUrl, queryContext, cohortDefinition, queryDetails);
return convertToResponseEntity(() -> this.frontendService.fetchExplorerRedirectUri(
ProjectManagerConst.PROJECT_VIEW_SITE,
- Map.of(ProjectManagerConst.PROJECT_CODE, projectCode)
+ Map.of(ProjectManagerConst.PROJECT_CODE, project.getCode())
));
}
+ @RoleConstraints(projectRoles = {ProjectRole.CREATOR, ProjectRole.PROJECT_MANAGER_ADMIN})
+ @StateConstraints(projectStates = {ProjectState.DRAFT, ProjectState.REVIEW})
+ @FrontendSiteModule(site = ProjectManagerConst.PROJECT_VIEW_SITE, module = ProjectManagerConst.PROJECT_EDITION_MODULE)
+ @FrontendAction(action = ProjectManagerConst.REMOVE_PROJECT_OUTPUT_ACTION)
+ @DeleteMapping(value = ProjectManagerConst.REMOVE_PROJECT_OUTPUT)
+ public ResponseEntity removeOutput(
+ @RequestVariable(name = ProjectManagerConst.PROJECT_TYPE) ProjectType projectType,
+ @ProjectCode @RequestVariable(name = ProjectManagerConst.PROJECT_CODE) Project project
+ ) {
+ return convertToResponseEntity(() -> this.queryService.removeOutput(project, projectType));
+ }
+
+ @RoleConstraints(projectRoles = {ProjectRole.CREATOR, ProjectRole.PROJECT_MANAGER_ADMIN,
+ ProjectRole.BRIDGEHEAD_ADMIN, ProjectRole.DEVELOPER, ProjectRole.FINAL, ProjectRole.PILOT})
+ @StateConstraints(projectStates = {ProjectState.DRAFT, ProjectState.REVIEW, ProjectState.DEVELOP,
+ ProjectState.PILOT, ProjectState.FINAL, ProjectState.FINISHED})
+ @FrontendSiteModule(site = ProjectManagerConst.PROJECT_VIEW_SITE, module = ProjectManagerConst.PROJECT_EDITION_MODULE)
+ @FrontendAction(action = ProjectManagerConst.FETCH_PROJECT_FORM_TITLES_ACTION)
+ @GetMapping(value = ProjectManagerConst.FETCH_PROJECT_FORM_TITLES)
+ public ResponseEntity fetchProjectFormTitles(
+ // ProjectCode code needed for role constraints
+ @SuppressWarnings("unused") @ProjectCode @RequestParameter(name = ProjectManagerConst.PROJECT_CODE) Project project,
+ @SuppressWarnings("unused") @Bridgehead @RequestParameter(name = ProjectManagerConst.BRIDGEHEAD, required = false) ProjectBridgehead bridgehead,
+ @Language String language
+ ) {
+ return convertToResponseEntity(
+ () -> dtoFormService.fetchProjectFormTitles(Optional.ofNullable(language)));
+ }
+
+ @RoleConstraints(projectRoles = {ProjectRole.CREATOR, ProjectRole.PROJECT_MANAGER_ADMIN,
+ ProjectRole.BRIDGEHEAD_ADMIN, ProjectRole.DEVELOPER, ProjectRole.FINAL, ProjectRole.PILOT})
+ @StateConstraints(projectStates = {ProjectState.DRAFT, ProjectState.REVIEW, ProjectState.DEVELOP,
+ ProjectState.PILOT, ProjectState.FINAL, ProjectState.FINISHED})
+ @FrontendSiteModule(site = ProjectManagerConst.PROJECT_VIEW_SITE, module = ProjectManagerConst.PROJECT_EDITION_MODULE)
+ @FrontendAction(action = ProjectManagerConst.FETCH_PROJECT_FORM_FIELDS_ACTION)
+ @GetMapping(value = ProjectManagerConst.FETCH_PROJECT_FORM_FIELDS)
+ public ResponseEntity fetchProjectFormFields(
+ // ProjectCode code needed for role constraints
+ @ProjectCode @RequestParameter(name = ProjectManagerConst.PROJECT_CODE) Project project,
+ @SuppressWarnings("unused") @Bridgehead @RequestParameter(name = ProjectManagerConst.BRIDGEHEAD, required = false) ProjectBridgehead bridgehead,
+ @Language String language,
+ @RequestParameter(name = ProjectManagerConst.FORM_TITLE, required = false) String formTitle
+ ) {
+ return convertToResponseEntity(
+ () -> dtoFormService.fetchProjectFormFields(Optional.ofNullable(formTitle), project,
+ Optional.ofNullable(language)));
+ }
+
+ @RoleConstraints(projectRoles = {ProjectRole.CREATOR, ProjectRole.PROJECT_MANAGER_ADMIN,
+ ProjectRole.BRIDGEHEAD_ADMIN, ProjectRole.DEVELOPER, ProjectRole.FINAL, ProjectRole.PILOT})
+ @StateConstraints(projectStates = {ProjectState.DRAFT, ProjectState.REVIEW, ProjectState.DEVELOP,
+ ProjectState.PILOT, ProjectState.FINAL, ProjectState.FINISHED})
+ @FrontendSiteModule(site = ProjectManagerConst.PROJECT_VIEW_SITE, module = ProjectManagerConst.PROJECT_EDITION_MODULE)
+ @FrontendAction(action = ProjectManagerConst.FETCH_SELECTED_PROJECT_FORMS_ACTION)
+ @GetMapping(value = ProjectManagerConst.FETCH_SELECTED_PROJECT_FORMS)
+ public ResponseEntity fetchSelectedProjectForms(
+ // ProjectCode code needed for role constraints
+ @ProjectCode @RequestParameter(name = ProjectManagerConst.PROJECT_CODE) Project project,
+ @SuppressWarnings("unused") @Bridgehead @RequestParameter(name = ProjectManagerConst.BRIDGEHEAD, required = false) ProjectBridgehead bridgehead,
+ @Language String language
+ ) {
+ return convertToResponseEntity(
+ () -> dtoFormService.fetchSelectedForms(project, Optional.ofNullable(language)));
+ }
+
+ @RoleConstraints(projectRoles = {ProjectRole.CREATOR, ProjectRole.PROJECT_MANAGER_ADMIN})
+ @StateConstraints(projectStates = {ProjectState.DRAFT, ProjectState.REVIEW})
+ @FrontendSiteModule(site = ProjectManagerConst.PROJECT_VIEW_SITE, module = ProjectManagerConst.PROJECT_EDITION_MODULE)
+ @FrontendAction(action = ProjectManagerConst.ADD_SELECTED_PROJECT_FORM_ACTION)
+ @PostMapping(value = ProjectManagerConst.ADD_SELECTED_PROJECT_FORM)
+ public ResponseEntity addSelectedProjectForm(
+ // ProjectCode code needed for role constraints
+ @ProjectCode @RequestVariable(name = ProjectManagerConst.PROJECT_CODE) Project project,
+ @RequestVariable(name = ProjectManagerConst.FORM_TITLE) String formTitle
+ ) {
+ return convertToResponseEntity(() -> formService.addSelectedForm(project, formTitle));
+ }
+
+ @RoleConstraints(projectRoles = {ProjectRole.CREATOR})
+ @StateConstraints(projectStates = {ProjectState.DRAFT, ProjectState.REVIEW})
+ @FrontendSiteModule(site = ProjectManagerConst.PROJECT_VIEW_SITE, module = ProjectManagerConst.PROJECT_EDITION_MODULE)
+ @FrontendAction(action = ProjectManagerConst.REMOVE_SELECTED_PROJECT_FORM_ACTION)
+ @DeleteMapping(value = ProjectManagerConst.REMOVE_SELECTED_PROJECT_FORM)
+ public ResponseEntity removeSelectedProjectForm(
+ // ProjectCode code needed for role constraints
+ @ProjectCode @RequestParameter(name = ProjectManagerConst.PROJECT_CODE) Project project,
+ @RequestParameter(name = ProjectManagerConst.FORM_TITLE) String formTitle
+ ) {
+ return convertToResponseEntity(() -> formService.removeSelectedForm(project, formTitle));
+ }
+
+
+ @RoleConstraints(projectRoles = {ProjectRole.CREATOR, ProjectRole.PROJECT_MANAGER_ADMIN})
+ @StateConstraints(projectStates = {ProjectState.DRAFT, ProjectState.REVIEW})
+ @FrontendSiteModule(site = ProjectManagerConst.PROJECT_VIEW_SITE, module = ProjectManagerConst.PROJECT_EDITION_MODULE)
+ @FrontendAction(action = ProjectManagerConst.EDIT_PROJECT_FORM_FIELDS_ACTION)
+ @PutMapping(value = ProjectManagerConst.EDIT_PROJECT_FORM_FIELDS)
+ public ResponseEntity editProjectFormValues(
+ // ProjectCode code needed for role constraints
+ @ProjectCode @RequestVariable(name = ProjectManagerConst.PROJECT_CODE) Project project,
+ @RequestVariable(name = ProjectManagerConst.FORM_FIELDS) FormField[] formFields
+ ) {
+ return convertToResponseEntity(
+ () -> formService.editProjectFormFieldValues(Optional.ofNullable(formFields), project));
+ }
+
+ @RoleConstraints(projectRoles = {ProjectRole.CREATOR, ProjectRole.PROJECT_MANAGER_ADMIN,
+ ProjectRole.BRIDGEHEAD_ADMIN})
+ @StateConstraints(projectStates = {ProjectState.DRAFT, ProjectState.REVIEW, ProjectState.DEVELOP,
+ ProjectState.PILOT, ProjectState.FINAL, ProjectState.FINISHED})
+ @FrontendSiteModule(site = ProjectManagerConst.PROJECT_VIEW_SITE, module = ProjectManagerConst.PROJECT_EDITION_MODULE)
+ @FrontendAction(action = ProjectManagerConst.DOWNLOAD_FORM_AS_PDF_ACTION)
+ @GetMapping(value = ProjectManagerConst.DOWNLOAD_FORM_AS_PDF)
+ public ResponseEntity downloadFormAsPdf(
+ // ProjectCode code and bridgehead needed for role constraints
+ @ProjectCode @RequestParameter(name = ProjectManagerConst.PROJECT_CODE) Project project,
+ @SuppressWarnings("unused") @Bridgehead @RequestParameter(name = ProjectManagerConst.BRIDGEHEAD, required = false) ProjectBridgehead bridgehead,
+ @Language String language,
+ @RequestParameter(name = ProjectManagerConst.FORM_TEMPLATE) String formTemplate
+ ) {
+ return convertToResponseEntity(() ->
+ ResponseEntity.ok()
+ .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" +
+ formTemplateService.fetchFormFilename(project, formTemplate))
+ .contentType(MediaType.APPLICATION_PDF)
+ .body(formTemplateService.createFormAsPdf(project, formTemplate,
+ Optional.ofNullable(language)))
+ );
+ }
+
+ @RoleConstraints(projectRoles = {ProjectRole.CREATOR, ProjectRole.PROJECT_MANAGER_ADMIN,
+ ProjectRole.BRIDGEHEAD_ADMIN})
+ @StateConstraints(projectStates = {ProjectState.DRAFT, ProjectState.REVIEW, ProjectState.DEVELOP,
+ ProjectState.PILOT, ProjectState.FINAL, ProjectState.FINISHED})
+ @FrontendSiteModule(site = ProjectManagerConst.PROJECT_VIEW_SITE, module = ProjectManagerConst.PROJECT_EDITION_MODULE)
+ @FrontendAction(action = ProjectManagerConst.FETCH_PROJECT_FORM_TEMPLATES_ACTION)
+ @GetMapping(value = ProjectManagerConst.FETCH_PROJECT_FORM_TEMPLATES)
+ public ResponseEntity fetchProjectFormTemplates(
+ // ProjectCode code and bridgehead needed for role constraints
+ @ProjectCode @RequestParameter(name = ProjectManagerConst.PROJECT_CODE) Project project,
+ @SuppressWarnings("unused") @Bridgehead @RequestParameter(name = ProjectManagerConst.BRIDGEHEAD, required = false) ProjectBridgehead bridgehead,
+ @Language String language
+ ) {
+ return convertToResponseEntity(
+ () -> formTemplateService.fetchTemplates(project, Optional.ofNullable(language)));
+ }
+
+ @RoleConstraints(projectRoles = {ProjectRole.CREATOR, ProjectRole.PROJECT_MANAGER_ADMIN,
+ ProjectRole.BRIDGEHEAD_ADMIN})
+ @StateConstraints(projectStates = {ProjectState.DRAFT, ProjectState.REVIEW, ProjectState.DEVELOP,
+ ProjectState.PILOT, ProjectState.FINAL, ProjectState.FINISHED})
+ @FrontendSiteModule(site = ProjectManagerConst.PROJECT_VIEW_SITE, module = ProjectManagerConst.PROJECT_EDITION_MODULE)
+ @FrontendAction(action = ProjectManagerConst.FETCH_BEST_PROJECT_FORM_TEMPLATES_ACTION)
+ @GetMapping(value = ProjectManagerConst.FETCH_BEST_PROJECT_FORM_TEMPLATES)
+ public ResponseEntity fetchBestProjectFormTemplates(
+ // ProjectCode code and bridgehead needed for role constraints
+ @ProjectCode @RequestParameter(name = ProjectManagerConst.PROJECT_CODE) Project project,
+ @SuppressWarnings("unused") @Bridgehead @RequestParameter(name = ProjectManagerConst.BRIDGEHEAD, required = false) ProjectBridgehead bridgehead,
+ @Language String language
+ ) {
+ return convertToResponseEntity(
+ () -> formTemplateService.fetchBestTemplates(project, Optional.ofNullable(language)));
+ }
+
@RoleConstraints(projectRoles = {ProjectRole.CREATOR})
- @StateConstraints(projectStates = {ProjectState.DRAFT, ProjectState.CREATED})
+ @StateConstraints(projectStates = {ProjectState.DRAFT, ProjectState.REVIEW})
@FrontendSiteModule(site = ProjectManagerConst.PROJECT_VIEW_SITE, module = ProjectManagerConst.PROJECT_EDITION_MODULE)
@FrontendAction(action = ProjectManagerConst.FETCH_EXPORTER_TEMPLATES_ACTION)
@GetMapping(value = ProjectManagerConst.FETCH_EXPORTER_TEMPLATES)
- public ResponseEntity fetchExporterTemplates(
- // Project code needed for role constraints
- @ProjectCode @RequestParam(name = ProjectManagerConst.PROJECT_CODE) String projectCode,
- @RequestParam(name = ProjectManagerConst.PROJECT_TYPE) ProjectType projectType
+ public ResponseEntity fetchExporterTemplates(
+ // ProjectCode code needed for role constraints
+ @SuppressWarnings("unused") @ProjectCode @RequestParameter(name = ProjectManagerConst.PROJECT_CODE) Project project
) {
- return convertToResponseEntity(() -> exporterService.getExporterTemplates(projectType));
+ return convertToResponseEntity(exporterService::getExporterTemplates);
}
@RoleConstraints(projectRoles = {ProjectRole.CREATOR})
- @StateConstraints(projectStates = {ProjectState.DRAFT, ProjectState.CREATED})
+ @StateConstraints(projectStates = {ProjectState.DRAFT, ProjectState.REVIEW})
@FrontendSiteModule(site = ProjectManagerConst.PROJECT_VIEW_SITE, module = ProjectManagerConst.PROJECT_EDITION_MODULE)
@FrontendAction(action = ProjectManagerConst.FETCH_QUERY_FORMATS_ACTION)
@GetMapping(value = ProjectManagerConst.FETCH_QUERY_FORMATS)
- public ResponseEntity fetchQueryFormats(
- // Project code needed for role constraints
- @ProjectCode @RequestParam(name = ProjectManagerConst.PROJECT_CODE) String projectCode
+ public ResponseEntity fetchQueryFormats(
+ // ProjectCode code needed for role constraints
+ @SuppressWarnings("unused") @ProjectCode @RequestParameter(name = ProjectManagerConst.PROJECT_CODE) Project project
) {
- return convertToResponseEntity(() -> QueryFormat.values());
+ return convertToResponseEntity(QueryFormat::values);
}
- @RoleConstraints(organisationRoles = {OrganisationRole.RESEARCHER, OrganisationRole.BRIDGEHEAD_ADMIN, OrganisationRole.PROJECT_MANAGER_ADMIN})
+ @RoleConstraints(organisationRoles = {OrganisationRole.RESEARCHER,
+ OrganisationRole.BRIDGEHEAD_ADMIN, OrganisationRole.PROJECT_MANAGER_ADMIN})
@FrontendSiteModule(site = ProjectManagerConst.NAVIGATION_BAR_SITE, module = ProjectManagerConst.USER_MODULE)
@FrontendAction(action = ProjectManagerConst.IS_PROJECT_MANAGER_ADMIN_ACTION)
@GetMapping(value = ProjectManagerConst.IS_PROJECT_MANAGER_ADMIN)
- public ResponseEntity isProjectManagerAdmin(
- @Bridgehead @RequestParam(name = ProjectManagerConst.BRIDGEHEAD, required = false) String bridgehead
+ public ResponseEntity isProjectManagerAdmin(
) {
- return convertToResponseEntity(() -> userService.isProjectManagerAdmin());
+ return convertToResponseEntity(userService::isProjectManagerAdmin);
}
- @RoleConstraints(projectRoles = {ProjectRole.CREATOR, ProjectRole.DEVELOPER, ProjectRole.PILOT, ProjectRole.FINAL, ProjectRole.BRIDGEHEAD_ADMIN, ProjectRole.PROJECT_MANAGER_ADMIN})
+ @RoleConstraints(projectRoles = {ProjectRole.CREATOR, ProjectRole.DEVELOPER, ProjectRole.PILOT,
+ ProjectRole.FINAL, ProjectRole.BRIDGEHEAD_ADMIN, ProjectRole.PROJECT_MANAGER_ADMIN})
@FrontendSiteModule(site = ProjectManagerConst.PROJECT_VIEW_SITE, module = ProjectManagerConst.USER_MODULE)
@FrontendAction(action = ProjectManagerConst.FETCH_PROJECT_ROLES_ACTION)
@GetMapping(value = ProjectManagerConst.FETCH_PROJECT_ROLES)
- public ResponseEntity fetchProjectRoles(
- @ProjectCode @RequestParam(name = ProjectManagerConst.PROJECT_CODE) String projectCode,
- @Bridgehead @RequestParam(name = ProjectManagerConst.BRIDGEHEAD, required = false) String bridgehead
+ public ResponseEntity fetchProjectRoles(
+ @ProjectCode @RequestParameter(name = ProjectManagerConst.PROJECT_CODE) Project project,
+ @Bridgehead @RequestParameter(name = ProjectManagerConst.BRIDGEHEAD, required = false) ProjectBridgehead bridgehead
) {
- return convertToResponseEntity(() -> userService.fetchProjectRoles(projectCode, Optional.ofNullable(bridgehead)));
+ return convertToResponseEntity(
+ () -> userService.fetchProjectRoles(project, Optional.ofNullable(bridgehead)));
}
@RoleConstraints(projectRoles = {ProjectRole.CREATOR})
- @StateConstraints(projectStates = {ProjectState.DRAFT, ProjectState.CREATED})
+ @StateConstraints(projectStates = {ProjectState.DRAFT, ProjectState.REVIEW})
@FrontendSiteModule(site = ProjectManagerConst.PROJECT_VIEW_SITE, module = ProjectManagerConst.PROJECT_EDITION_MODULE)
@FrontendAction(action = ProjectManagerConst.FETCH_OUTPUT_FORMATS_ACTION)
@GetMapping(value = ProjectManagerConst.FETCH_OUTPUT_FORMATS)
- public ResponseEntity fetchOutputFormats(
- @ProjectCode @RequestParam(name = ProjectManagerConst.PROJECT_CODE) String projectCode
+ public ResponseEntity fetchOutputFormats(
+ @ProjectCode @RequestParameter(name = ProjectManagerConst.PROJECT_CODE) Project project
) {
- return convertToResponseEntity(() -> projectService.fetchOutputFormats(projectCode));
+ return convertToResponseEntity(() -> projectService.fetchOutputFormats(project));
}
@RoleConstraints(projectRoles = {ProjectRole.DEVELOPER, ProjectRole.PILOT, ProjectRole.FINAL})
@@ -393,11 +636,11 @@ public ResponseEntity fetchOutputFormats(
@FrontendSiteModule(site = ProjectManagerConst.PROJECT_VIEW_SITE, module = ProjectManagerConst.USER_MODULE)
@FrontendAction(action = ProjectManagerConst.FETCH_RESEARCH_ENVIRONMENT_URL_ACTION)
@GetMapping(value = ProjectManagerConst.FETCH_RESEARCH_ENVIRONMENT_URL)
- public ResponseEntity fetchResearchEnvironmentUrl(
- @ProjectCode @RequestParam(name = ProjectManagerConst.PROJECT_CODE) String projectCode,
- @Bridgehead @RequestParam(name = ProjectManagerConst.BRIDGEHEAD) String bridgehead
+ public ResponseEntity fetchResearchEnvironmentUrl(
+ @SuppressWarnings("unused") @ProjectCode @RequestParameter(name = ProjectManagerConst.PROJECT_CODE) Project project,
+ @SuppressWarnings("unused") @Bridgehead @RequestParameter(name = ProjectManagerConst.BRIDGEHEAD) ProjectBridgehead bridgehead
) {
- return convertToResponseEntity(() -> coderService.getResearchEnvironmentUrl());
+ return convertToResponseEntity(coderService::getResearchEnvironmentUrl);
}
@RoleConstraints(projectRoles = {ProjectRole.DEVELOPER, ProjectRole.PILOT, ProjectRole.FINAL})
@@ -405,91 +648,94 @@ public ResponseEntity fetchResearchEnvironmentUrl(
@FrontendSiteModule(site = ProjectManagerConst.PROJECT_VIEW_SITE, module = ProjectManagerConst.USER_MODULE)
@FrontendAction(action = ProjectManagerConst.EXISTS_RESEARCH_ENVIRONMENT_WORKSPACE_ACTION)
@GetMapping(value = ProjectManagerConst.EXISTS_RESEARCH_ENVIRONMENT_WORKSPACE)
- public ResponseEntity existsUserResearchEnvironmentWorkspace(
- @ProjectCode @RequestParam(name = ProjectManagerConst.PROJECT_CODE) String projectCode,
- @Bridgehead @RequestParam(name = ProjectManagerConst.BRIDGEHEAD) String bridgehead
+ public ResponseEntity existsUserResearchEnvironmentWorkspace(
+ @ProjectCode @RequestParameter(name = ProjectManagerConst.PROJECT_CODE) Project project,
+ @Bridgehead @RequestParameter(name = ProjectManagerConst.BRIDGEHEAD) ProjectBridgehead bridgehead
) {
- return convertToResponseEntity(() -> coderService.existsUserResearchEnvironmentWorkspace(projectCode, bridgehead));
+ return convertToResponseEntity(
+ () -> coderService.existsUserResearchEnvironmentWorkspace(project, bridgehead));
}
@RoleConstraints(projectRoles = {ProjectRole.CREATOR})
- @StateConstraints(projectStates = {ProjectState.DRAFT, ProjectState.CREATED})
+ @StateConstraints(projectStates = {ProjectState.DRAFT, ProjectState.REVIEW})
@FrontendSiteModule(site = ProjectManagerConst.PROJECT_VIEW_SITE, module = ProjectManagerConst.PROJECT_EDITION_MODULE)
@FrontendAction(action = ProjectManagerConst.FETCH_PROJECT_CONFIGURATIONS_ACTION)
@GetMapping(value = ProjectManagerConst.FETCH_PROJECT_CONFIGURATIONS)
- public ResponseEntity fetchProjectConfigurations(
- @ProjectCode @RequestParam(name = ProjectManagerConst.PROJECT_CODE) String projectCode
+ public ResponseEntity fetchProjectConfigurations(
+ @SuppressWarnings("unused") @ProjectCode @RequestParameter(name = ProjectManagerConst.PROJECT_CODE) Project project
) {
- return convertToResponseEntity(() -> this.frontendProjectConfigurations.getConfig());
+ return convertToResponseEntity(this.frontendProjectConfigurations::getConfig);
}
@RoleConstraints(projectRoles = {ProjectRole.CREATOR})
- @StateConstraints(projectStates = {ProjectState.DRAFT, ProjectState.CREATED})
+ @StateConstraints(projectStates = {ProjectState.DRAFT, ProjectState.REVIEW})
@FrontendSiteModule(site = ProjectManagerConst.PROJECT_VIEW_SITE, module = ProjectManagerConst.PROJECT_EDITION_MODULE)
@FrontendAction(action = ProjectManagerConst.FETCH_CURRENT_PROJECT_CONFIGURATION_ACTION)
@GetMapping(value = ProjectManagerConst.FETCH_CURRENT_PROJECT_CONFIGURATION)
- public ResponseEntity fetchCurrentProjectConfiguration(
- @ProjectCode @RequestParam(name = ProjectManagerConst.PROJECT_CODE) String projectCode
+ public ResponseEntity fetchCurrentProjectConfiguration(
+ @ProjectCode @RequestParameter(name = ProjectManagerConst.PROJECT_CODE) Project project
) {
- return convertToResponseEntity(() -> this.projectService.fetchCurrentProjectConfiguration(projectCode));
+ return convertToResponseEntity(
+ () -> this.dtoProjectService.fetchCurrentProjectConfiguration(project));
}
- @RoleConstraints(projectRoles = {ProjectRole.CREATOR})
- @StateConstraints(projectStates = {ProjectState.DRAFT, ProjectState.CREATED})
+ @RoleConstraints(projectRoles = {ProjectRole.CREATOR, ProjectRole.PROJECT_MANAGER_ADMIN})
+ @StateConstraints(projectStates = {ProjectState.DRAFT, ProjectState.REVIEW})
@FrontendSiteModule(site = ProjectManagerConst.PROJECT_VIEW_SITE, module = ProjectManagerConst.PROJECT_EDITION_MODULE)
@FrontendAction(action = ProjectManagerConst.SET_PROJECT_CONFIGURATION_ACTION)
- @PostMapping(value = ProjectManagerConst.SET_PROJECT_CONFIGURATION)
- public ResponseEntity setProjectConfiguration(
- @ProjectCode @RequestParam(name = ProjectManagerConst.PROJECT_CODE) String projectCode,
- @RequestParam(name = ProjectManagerConst.PROJECT_CONFIGURATION) String projectConfigurationName
+ @PutMapping(value = ProjectManagerConst.SET_PROJECT_CONFIGURATION)
+ public ResponseEntity setProjectConfiguration(
+ @ProjectCode @RequestVariable(name = ProjectManagerConst.PROJECT_CODE) Project project,
+ @RequestVariable(name = ProjectManagerConst.PROJECT_CONFIGURATION) String projectConfigurationName
) {
- return convertToResponseEntity(() -> this.projectService.setProjectConfiguration(projectCode, projectConfigurationName));
+ return convertToResponseEntity(
+ () -> this.projectService.setProjectConfiguration(project, projectConfigurationName));
}
@RoleConstraints(projectRoles = {ProjectRole.CREATOR})
- @StateConstraints(projectStates = {ProjectState.DRAFT, ProjectState.CREATED})
+ @StateConstraints(projectStates = {ProjectState.DRAFT, ProjectState.REVIEW})
@FrontendSiteModule(site = ProjectManagerConst.PROJECT_VIEW_SITE, module = ProjectManagerConst.PROJECT_EDITION_MODULE)
@FrontendAction(action = ProjectManagerConst.FETCH_PROJECT_TYPES_ACTION)
@GetMapping(value = ProjectManagerConst.FETCH_PROJECT_TYPES)
- public ResponseEntity fetchProjectTypes(
- // Project code needed for role constraints
- @ProjectCode @RequestParam(name = ProjectManagerConst.PROJECT_CODE) String projectCode
+ public ResponseEntity fetchProjectTypes(
+ // ProjectCode code needed for role constraints
+ @SuppressWarnings("unused") @ProjectCode @RequestParameter(name = ProjectManagerConst.PROJECT_CODE) Project project
) {
- return convertToResponseEntity(() -> ProjectType.values());
+ return convertToResponseEntity(ProjectType::values);
}
@RoleConstraints(organisationRoles = {OrganisationRole.RESEARCHER})
@PostMapping(value = ProjectManagerConst.DESIGN_PROJECT)
- public ResponseEntity designProject(
- @RequestParam(name = ProjectManagerConst.BRIDGEHEADS) String[] bridgeheads,
- @RequestParam(name = ProjectManagerConst.QUERY_CODE) String queryCode,
- @RequestParam(name = ProjectManagerConst.PROJECT_TYPE) ProjectType projectType
+ public ResponseEntity designProject(
+ @RequestVariable(name = ProjectManagerConst.BRIDGEHEADS) String[] bridgeheads,
+ @RequestVariable(name = ProjectManagerConst.QUERY_CODE) String queryCode
) {
- return convertToResponseEntity(() -> this.projectEventService.draft(bridgeheads, queryCode, projectType));
+ return convertToResponseEntity(() -> this.projectEventService.draft(bridgeheads, queryCode));
}
@RoleConstraints(projectRoles = {ProjectRole.CREATOR})
@StateConstraints(projectStates = {ProjectState.DRAFT})
- @EmailSender(templateType = EmailTemplateType.NEW_PROJECT, recipients = {EmailRecipientType.PROJECT_MANAGER_ADMIN})
+ @EmailSender(templateType = EmailTemplateType.NEW_PROJECT, recipients = {
+ EmailRecipientType.PROJECT_MANAGER_ADMIN, EmailRecipientType.CREATOR})
@FrontendSiteModule(site = ProjectManagerConst.PROJECT_VIEW_SITE, module = ProjectManagerConst.PROJECT_STATE_MODULE)
@FrontendAction(action = ProjectManagerConst.CREATE_PROJECT_ACTION)
@PostMapping(value = ProjectManagerConst.CREATE_PROJECT)
- public ResponseEntity createProject(
- @ProjectCode @RequestParam(name = ProjectManagerConst.PROJECT_CODE) String projectCode
+ public ResponseEntity createProject(
+ @ProjectCode @RequestVariable(name = ProjectManagerConst.PROJECT_CODE) Project project
) {
- return convertToResponseEntity(() -> projectEventService.create(projectCode));
+ return convertToResponseEntity(() -> projectEventService.create(project));
}
@RoleConstraints(organisationRoles = {OrganisationRole.PROJECT_MANAGER_ADMIN})
- @StateConstraints(projectStates = {ProjectState.ACCEPTED})
+ @StateConstraints(projectStates = {ProjectState.APPROVAL})
@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)
- public ResponseEntity startDevelopStage(
- @ProjectCode @RequestParam(name = ProjectManagerConst.PROJECT_CODE) String projectCode
+ @PutMapping(value = ProjectManagerConst.START_DEVELOP_STAGE)
+ public ResponseEntity startDevelopStage(
+ @ProjectCode @RequestVariable(name = ProjectManagerConst.PROJECT_CODE) Project project
) {
- return convertToResponseEntity(() -> projectEventService.startDevelopStage(projectCode));
+ return convertToResponseEntity(() -> projectEventService.startDevelopStage(project));
}
@RoleConstraints(organisationRoles = {OrganisationRole.PROJECT_MANAGER_ADMIN})
@@ -497,58 +743,63 @@ public ResponseEntity startDevelopStage(
@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)
- public ResponseEntity startPilotStage(
- @ProjectCode @RequestParam(name = ProjectManagerConst.PROJECT_CODE) String projectCode
+ @PutMapping(value = ProjectManagerConst.START_PILOT_STAGE)
+ public ResponseEntity startPilotStage(
+ @ProjectCode @RequestVariable(name = ProjectManagerConst.PROJECT_CODE) Project project
) {
- return convertToResponseEntity(() -> projectEventService.startPilotStage(projectCode));
+ return convertToResponseEntity(() -> projectEventService.startPilotStage(project));
}
@RoleConstraints(organisationRoles = {OrganisationRole.PROJECT_MANAGER_ADMIN})
- @StateConstraints(projectStates = {ProjectState.PILOT, ProjectState.ACCEPTED})
- @EmailSender(templateType = EmailTemplateType.REQUEST_TECHNICAL_APPROVAL, recipients = {EmailRecipientType.BRIDGHEAD_ADMINS_WHO_HAVE_NOT_ACCEPTED_NOR_REJECTED_THE_PROJECT})
+ @StateConstraints(projectStates = {ProjectState.PILOT, ProjectState.APPROVAL})
+ @EmailSender(templateType = EmailTemplateType.REQUEST_TECHNICAL_APPROVAL, recipients = {
+ EmailRecipientType.BRIDGEHEAD_ADMINS_WHO_HAVE_NOT_ACCEPTED_NOR_REJECTED_THE_PROJECT})
@FrontendSiteModule(site = ProjectManagerConst.PROJECT_VIEW_SITE, module = ProjectManagerConst.PROJECT_STATE_MODULE)
@FrontendAction(action = ProjectManagerConst.START_FINAL_STAGE_ACTION)
- @PostMapping(value = ProjectManagerConst.START_FINAL_STAGE)
- public ResponseEntity startFinalStage(
- @ProjectCode @RequestParam(name = ProjectManagerConst.PROJECT_CODE) String projectCode
+ @PutMapping(value = ProjectManagerConst.START_FINAL_STAGE)
+ public ResponseEntity startFinalStage(
+ @ProjectCode @RequestVariable(name = ProjectManagerConst.PROJECT_CODE) Project project
) {
- return convertToResponseEntity(() -> projectEventService.startFinalStage(projectCode));
+ return convertToResponseEntity(() -> projectEventService.startFinalStage(project));
}
@RoleConstraints(organisationRoles = {OrganisationRole.PROJECT_MANAGER_ADMIN})
- @StateConstraints(projectStates = {ProjectState.CREATED, ProjectState.ARCHIVED})
- @EmailSender(templateType = EmailTemplateType.NEW_PROJECT_ACCEPTED, recipients = {EmailRecipientType.CREATOR})
- @EmailSender(templateType = EmailTemplateType.NEW_PROJECT_ACCEPTED, recipients = {EmailRecipientType.ALL_BRIDGEHEAD_ADMINS})
+ @StateConstraints(projectStates = {ProjectState.REVIEW, ProjectState.ARCHIVED})
+ @EmailSender(templateType = EmailTemplateType.NEW_PROJECT_ACCEPTED, recipients = {
+ EmailRecipientType.CREATOR})
+ @EmailSender(templateType = EmailTemplateType.NEW_PROJECT_ACCEPTED, recipients = {
+ EmailRecipientType.ALL_BRIDGEHEAD_ADMINS})
@FrontendSiteModule(site = ProjectManagerConst.PROJECT_VIEW_SITE, module = ProjectManagerConst.PROJECT_STATE_MODULE)
@FrontendAction(action = ProjectManagerConst.ACCEPT_PROJECT_ACTION)
- @PostMapping(value = ProjectManagerConst.ACCEPT_PROJECT)
- public ResponseEntity acceptProject(
- @ProjectCode @RequestParam(name = ProjectManagerConst.PROJECT_CODE) String projectCode
+ @PutMapping(value = ProjectManagerConst.ACCEPT_PROJECT)
+ public ResponseEntity acceptProject(
+ @ProjectCode @RequestVariable(name = ProjectManagerConst.PROJECT_CODE) Project project
) {
- return convertToResponseEntity(() -> projectEventService.accept(projectCode));
+ return convertToResponseEntity(() -> projectEventService.accept(project));
}
@RoleConstraints(projectRoles = {ProjectRole.CREATOR, ProjectRole.PROJECT_MANAGER_ADMIN})
- @StateConstraints(projectStates = {ProjectState.DRAFT, ProjectState.CREATED, ProjectState.DEVELOP, ProjectState.PILOT, ProjectState.FINAL})
- @EmailSender(templateType = EmailTemplateType.PROJECT_REJECTED, recipients = {EmailRecipientType.PROJECT_ALL})
+ @StateConstraints(projectStates = {ProjectState.DRAFT, ProjectState.REVIEW, ProjectState.DEVELOP,
+ ProjectState.PILOT, ProjectState.FINAL})
+ @EmailSender(templateType = EmailTemplateType.PROJECT_REJECTED, recipients = {
+ EmailRecipientType.PROJECT_ALL})
@FrontendSiteModule(site = ProjectManagerConst.PROJECT_VIEW_SITE, module = ProjectManagerConst.PROJECT_STATE_MODULE)
@FrontendAction(action = ProjectManagerConst.REJECT_PROJECT_ACTION)
- @PostMapping(value = ProjectManagerConst.REJECT_PROJECT)
- public ResponseEntity rejectProject(
- @ProjectCode @RequestParam(name = ProjectManagerConst.PROJECT_CODE) String projectCode,
+ @PutMapping(value = ProjectManagerConst.REJECT_PROJECT)
+ public ResponseEntity rejectProject(
+ @ProjectCode @RequestVariable(name = ProjectManagerConst.PROJECT_CODE) Project project,
// Message is sent per email
- @Message @RequestParam(name = ProjectManagerConst.MESSAGE, required = false) String message
+ @SuppressWarnings("unused") @Message @RequestVariable(name = ProjectManagerConst.MESSAGE, required = false) String message
) {
- return convertToResponseEntity(() -> projectEventService.reject(projectCode));
+ return convertToResponseEntity(() -> projectEventService.reject(project));
}
@RoleConstraints(organisationRoles = OrganisationRole.PROJECT_MANAGER_ADMIN)
@FrontendSiteModule(site = ProjectManagerConst.CONFIGURATION_SITE, module = ProjectManagerConst.USER_MODULE)
@FrontendAction(action = ProjectManagerConst.ADD_USER_TO_MAILING_BLACK_LIST_ACTION)
@PostMapping(value = ProjectManagerConst.ADD_USER_TO_MAILING_BLACK_LIST)
- public ResponseEntity addUserToMailingBlackList(
- @Email @RequestParam(name = ProjectManagerConst.EMAIL) String email
+ public ResponseEntity addUserToMailingBlackList(
+ @Email @RequestVariable(name = ProjectManagerConst.EMAIL) String email
) {
return convertToResponseEntity(() -> userService.updateUserInMailingBlackList(email, true));
}
@@ -556,9 +807,9 @@ public ResponseEntity addUserToMailingBlackList(
@RoleConstraints(organisationRoles = OrganisationRole.PROJECT_MANAGER_ADMIN)
@FrontendSiteModule(site = ProjectManagerConst.CONFIGURATION_SITE, module = ProjectManagerConst.USER_MODULE)
@FrontendAction(action = ProjectManagerConst.REMOVE_USER_FROM_MAILING_BLACK_LIST_ACTION)
- @PostMapping(value = ProjectManagerConst.REMOVE_USER_FROM_MAILING_BLACK_LIST)
- public ResponseEntity removeUserFromMailingBlackList(
- @Email @RequestParam(name = ProjectManagerConst.EMAIL) String email
+ @DeleteMapping(value = ProjectManagerConst.REMOVE_USER_FROM_MAILING_BLACK_LIST)
+ public ResponseEntity removeUserFromMailingBlackList(
+ @Email @RequestParameter(name = ProjectManagerConst.EMAIL) String email
) {
return convertToResponseEntity(() -> userService.updateUserInMailingBlackList(email, false));
}
@@ -566,726 +817,983 @@ public ResponseEntity removeUserFromMailingBlackList(
@RoleConstraints(organisationRoles = OrganisationRole.PROJECT_MANAGER_ADMIN)
@FrontendSiteModule(site = ProjectManagerConst.CONFIGURATION_SITE, module = ProjectManagerConst.USER_MODULE)
@FrontendAction(action = ProjectManagerConst.FETCH_MAILING_BLACK_LIST_ACTION)
- @PostMapping(value = ProjectManagerConst.FETCH_MAILING_BLACK_LIST)
- public ResponseEntity fetchMailingBlackList() {
- return convertToResponseEntity(() -> userService.fetchMailingBlackList());
+ @GetMapping(value = ProjectManagerConst.FETCH_MAILING_BLACK_LIST)
+ public ResponseEntity fetchMailingBlackList() {
+ return convertToResponseEntity(dtoUserService::fetchMailingBlackList);
}
@RoleConstraints(organisationRoles = OrganisationRole.PROJECT_MANAGER_ADMIN)
@FrontendSiteModule(site = ProjectManagerConst.CONFIGURATION_SITE, module = ProjectManagerConst.USER_MODULE)
@FrontendAction(action = ProjectManagerConst.FETCH_USERS_FOR_AUTOCOMPLETE_IN_MAILING_BLACK_LIST_ACTION)
- @PostMapping(value = ProjectManagerConst.FETCH_USERS_FOR_AUTOCOMPLETE_IN_MAILING_BLACK_LIST)
- public ResponseEntity fetchUsersForAutocompleteInMailingBlackList(
- @RequestParam(name = ProjectManagerConst.EMAIL, required = false) String partialEmail
+ @GetMapping(value = ProjectManagerConst.FETCH_USERS_FOR_AUTOCOMPLETE_IN_MAILING_BLACK_LIST)
+ public ResponseEntity fetchUsersForAutocompleteInMailingBlackList(
+ @RequestParameter(name = ProjectManagerConst.EMAIL, required = false) String partialEmail
) {
- return convertToResponseEntity(() -> userService.fetchUsersForAutocompleteInMailingBlackList(partialEmail));
+ return convertToResponseEntity(
+ () -> dtoUserService.fetchUsersForAutocompleteInMailingBlackList(partialEmail));
}
@RoleConstraints(projectRoles = {ProjectRole.BRIDGEHEAD_ADMIN})
- @StateConstraints(projectStates = {ProjectState.FINAL}, projectBridgeheadStates = {ProjectBridgeheadState.ACCEPTED})
- @EmailSender(templateType = EmailTemplateType.PROJECT_BRIDGHEAD_RESULTS_URL_ADDED, recipients = {EmailRecipientType.ALL_FINALS, EmailRecipientType.CREATOR})
+ @StateConstraints(projectStates = {ProjectState.FINAL}, projectBridgeheadStates = {
+ ProjectBridgeheadState.ACCEPTED})
+ @EmailSender(templateType = EmailTemplateType.PROJECT_BRIDGEHEAD_RESULTS_URL_ADDED, recipients = {
+ EmailRecipientType.ALL_FINALS, EmailRecipientType.CREATOR})
@FrontendSiteModule(site = ProjectManagerConst.PROJECT_VIEW_SITE, module = ProjectManagerConst.PROJECT_RESULTS_MODULE)
- @FrontendAction(action = ProjectManagerConst.ADD_PROJECT_BRIDGHEAD_RESULTS_URL_ACTION)
- @PostMapping(value = ProjectManagerConst.ADD_PROJECT_BRIDGHEAD_RESULTS_URL)
- public ResponseEntity addProjectBridgeheadResultsUrl(
- @ProjectCode @RequestParam(name = ProjectManagerConst.PROJECT_CODE) String projectCode,
- @Bridgehead @RequestParam(name = ProjectManagerConst.BRIDGEHEAD) String bridgehead,
- @RequestParam(name = ProjectManagerConst.RESULTS_URL) String resultsUrl
+ @FrontendAction(action = ProjectManagerConst.ADD_PROJECT_BRIDGEHEAD_RESULTS_URL_ACTION)
+ @PostMapping(value = ProjectManagerConst.ADD_PROJECT_BRIDGEHEAD_RESULTS_URL)
+ public ResponseEntity addProjectBridgeheadResultsUrl(
+ @SuppressWarnings("unused") @ProjectCode @RequestVariable(name = ProjectManagerConst.PROJECT_CODE) Project project,
+ @Bridgehead @RequestVariable(name = ProjectManagerConst.BRIDGEHEAD) ProjectBridgehead bridgehead,
+ @RequestVariable(name = ProjectManagerConst.RESULTS_URL) String resultsUrl
) {
- return convertToResponseEntity(() -> projectBridgeheadService.addResultsUrl(projectCode, bridgehead, resultsUrl));
+ return convertToResponseEntity(
+ () -> projectBridgeheadService.addResultsUrl(bridgehead, resultsUrl));
}
@RoleConstraints(projectRoles = {ProjectRole.CREATOR, ProjectRole.FINAL})
@StateConstraints(projectStates = {ProjectState.FINAL})
+ @ProjectConstraints(projectTypes = {ProjectType.DATASHIELD, ProjectType.RESEARCH_ENVIRONMENT,
+ ProjectType.EXPORT})
@FrontendSiteModule(site = ProjectManagerConst.PROJECT_VIEW_SITE, module = ProjectManagerConst.PROJECT_RESULTS_MODULE)
@FrontendAction(action = ProjectManagerConst.FETCH_PROJECT_RESULTS_ACTION)
@GetMapping(value = ProjectManagerConst.FETCH_PROJECT_RESULTS)
- public ResponseEntity fetchProjectResults(
- @ProjectCode @RequestParam(name = ProjectManagerConst.PROJECT_CODE) String projectCode,
- @Bridgehead @RequestParam(name = ProjectManagerConst.BRIDGEHEAD) String bridgehead
+ public ResponseEntity fetchProjectResults(
+ @ProjectCode @RequestParameter(name = ProjectManagerConst.PROJECT_CODE) Project project,
+ @SuppressWarnings("unused") @Bridgehead @RequestParameter(name = ProjectManagerConst.BRIDGEHEAD) ProjectBridgehead bridgehead
) {
- return convertOptionalToResponseEntity(() -> projectService.fetchResults(projectCode));
+ return convertOptionalToResponseEntity(() -> dtoProjectService.fetchResults(project));
}
@RoleConstraints(projectRoles = {ProjectRole.CREATOR, ProjectRole.FINAL})
@StateConstraints(projectStates = {ProjectState.FINAL})
+ @ProjectConstraints(projectTypes = {ProjectType.DATASHIELD, ProjectType.RESEARCH_ENVIRONMENT,
+ ProjectType.EXPORT})
@FrontendSiteModule(site = ProjectManagerConst.PROJECT_VIEW_SITE, module = ProjectManagerConst.PROJECT_RESULTS_MODULE)
@FrontendAction(action = ProjectManagerConst.FETCH_PROJECT_BRIDGEHEAD_RESULTS_ACTION)
@GetMapping(value = ProjectManagerConst.FETCH_PROJECT_BRIDGEHEAD_RESULTS)
- public ResponseEntity fetchProjectBridgeheadResults(
- @ProjectCode @RequestParam(name = ProjectManagerConst.PROJECT_CODE) String projectCode,
- @Bridgehead @RequestParam(name = ProjectManagerConst.BRIDGEHEAD) String bridgehead
+ public ResponseEntity fetchProjectBridgeheadResults(
+ @ProjectCode @RequestParameter(name = ProjectManagerConst.PROJECT_CODE) Project project,
+ @SuppressWarnings("unused") @Bridgehead @RequestParameter(name = ProjectManagerConst.BRIDGEHEAD) ProjectBridgehead bridgehead
) {
- return convertToResponseEntity(() -> projectBridgeheadService.fetchResults(projectCode));
+ return convertToResponseEntity(() -> dtoProjectBridgeheadService.fetchResults(project));
}
@RoleConstraints(projectRoles = {ProjectRole.BRIDGEHEAD_ADMIN})
@StateConstraints(projectStates = {ProjectState.FINAL})
+ @ProjectConstraints(projectTypes = {ProjectType.DATASHIELD, ProjectType.RESEARCH_ENVIRONMENT,
+ ProjectType.EXPORT})
@FrontendSiteModule(site = ProjectManagerConst.PROJECT_VIEW_SITE, module = ProjectManagerConst.PROJECT_RESULTS_MODULE)
@FrontendAction(action = ProjectManagerConst.FETCH_PROJECT_BRIDGEHEAD_RESULTS_FOR_OWN_BRIDGEHEAD_ACTION)
@GetMapping(value = ProjectManagerConst.FETCH_PROJECT_BRIDGEHEAD_RESULTS_FOR_OWN_BRIDGEHEAD)
- public ResponseEntity