Compare commits
116 Commits
45bbe51897
...
openapi_in
Author | SHA1 | Date | |
---|---|---|---|
d60cb8b48d | |||
50d35beb63 | |||
20bca79472 | |||
095f34581d | |||
6da9d762df | |||
81ce4fdb4c | |||
ebd76a30ee | |||
6ff6ce5052 | |||
60ec920cff | |||
900a4c5bdc | |||
d0b615c59d | |||
eccf116f49 | |||
8491c9b3cf | |||
137bc84c21 | |||
3c61fdca93 | |||
5ee3755548 | |||
52511dd4c4 | |||
84b70f8f38 | |||
834d68949c | |||
fea8687664 | |||
c94d3654ce | |||
d5c89bf8f4 | |||
78c72bdd72 | |||
307c7e700b | |||
8d486dce89 | |||
653f923693 | |||
64da3c9ab0 | |||
419ceec1bc | |||
e011a5534e | |||
ef964c4d35 | |||
5608b12f84 | |||
467babab79 | |||
a2e2395cc2 | |||
e3393c8834 | |||
5f8fe4a374 | |||
c5e7736a16 | |||
04589392cb | |||
1106cf8478 | |||
215d80ad70 | |||
dded62c25a | |||
3de7ebe2b1 | |||
8153496a0f | |||
861e7495a7 | |||
d78e43f7e0 | |||
3ca97cf378 | |||
e6a8d98d63 | |||
8894fea6d4 | |||
236bb0d167 | |||
d4dcc95d9b | |||
dc843299eb | |||
f3eaf8fe34 | |||
628c61fb8b | |||
4880f3829c | |||
80b2d087e4 | |||
b5c03798fc | |||
1d970ce5f5 | |||
f9de5ed6bf | |||
e75a5c9d2c | |||
5c3b2b138d | |||
8d4dc7916d | |||
1a6db7c953 | |||
3890aed158 | |||
dd5ca2cbd7 | |||
024deeba41 | |||
1cebebf1a5 | |||
d8bc7cc9b6 | |||
067eeb9494 | |||
e66fa33577 | |||
b355463dd9 | |||
27e70ee109 | |||
153501c8d4 | |||
40afde89b7 | |||
4698aa549f | |||
79e949bdd4 | |||
04a73073c1 | |||
11ab5e1dc4 | |||
820757c836 | |||
730aa5f450 | |||
dda3e5fcfd | |||
5e8e875a37 | |||
86e7dc7c75 | |||
6235fe7e68 | |||
3cb12dab4f | |||
0a9d83655f | |||
ef8c8e896d | |||
fc73293122 | |||
e26f8da662 | |||
b4c05f8c59 | |||
ca282378ec | |||
746fa97cf3 | |||
8b24456b48 | |||
6befd10735 | |||
db094a8d86 | |||
c739b4d26d | |||
dacb0dd179 | |||
b00c28a02a | |||
208cbbfa1d | |||
d77f38b405 | |||
525f98a054 | |||
43aadac503 | |||
07f66f65ed | |||
6e5651c527 | |||
1ed976b039 | |||
013b97cec0 | |||
e7cb8cf469 | |||
184642a750 | |||
a8ae5f14d4 | |||
e6565275c8 | |||
f629fb4a4e | |||
7a9955b781 | |||
1e97177777 | |||
9e2ab9fa5a | |||
70b00a1996 | |||
720b19df93 | |||
1498b5908b | |||
249d00177c |
@ -12,8 +12,7 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
distribution: 'temurin' # See 'Supported distributions' for available options
|
distribution: 'temurin' # See 'Supported distributions' for available options
|
||||||
java-version: '21'
|
java-version: '21'
|
||||||
|
|
||||||
- uses: axel-op/googlejavaformat-action@v3
|
- uses: axel-op/googlejavaformat-action@v3
|
||||||
with:
|
with:
|
||||||
args: "--replace --skip-sorting-imports --aosp"
|
args: "--set-exit-if-changed --skip-sorting-imports --skip-reflowing-long-strings --aosp -n"
|
||||||
- name: Print diffs
|
|
||||||
run: git --no-pager diff --exit-code
|
|
||||||
|
33
.gitea/workflows/build-back.yaml
Normal file
33
.gitea/workflows/build-back.yaml
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
name: Build
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout sources
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Load .env file
|
||||||
|
uses: xom9ikk/dotenv@v2.3.0
|
||||||
|
with:
|
||||||
|
path: ./config/
|
||||||
|
mode: dev
|
||||||
|
load-mode: strict
|
||||||
|
|
||||||
|
- name: Setup Java
|
||||||
|
uses: actions/setup-java@v4
|
||||||
|
with:
|
||||||
|
distribution: 'temurin'
|
||||||
|
java-version: 21
|
||||||
|
|
||||||
|
- name: Setup Gradle
|
||||||
|
uses: gradle/actions/setup-gradle@v4
|
||||||
|
with:
|
||||||
|
cache-disabled: true # Once the code has been pushed once in main, this should be reenabled.
|
||||||
|
|
||||||
|
- name: init gradle
|
||||||
|
working-directory: ./MyINPulse-back/
|
||||||
|
run: ./gradlew build # todo: run test, currently fail because no database is present
|
2
.gitignore
vendored
2
.gitignore
vendored
@ -2,4 +2,6 @@
|
|||||||
.idea
|
.idea
|
||||||
keycloak/CAS/target
|
keycloak/CAS/target
|
||||||
docker-compose.yaml
|
docker-compose.yaml
|
||||||
|
node_modules
|
||||||
|
.vscode
|
||||||
postgres/data
|
postgres/data
|
56
Makefile
56
Makefile
@ -1,13 +1,16 @@
|
|||||||
help:
|
help:
|
||||||
@echo "make [clean dev-front prod dev-back]"
|
@echo "make [clean dev-front prod dev-back dev]"
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
|
@cp config/frontdev.env front/MyINPulse-front/.env
|
||||||
|
@cp config/frontdev.env .env
|
||||||
|
@cp config/frontdev.env MyINPulse-back/.env
|
||||||
@cp config/prod.docker-compose.yaml docker-compose.yaml
|
@cp config/prod.docker-compose.yaml docker-compose.yaml
|
||||||
@docker compose down
|
@docker compose down
|
||||||
@rm -f docker-compose.yaml
|
@rm -f docker-compose.yaml
|
||||||
@rm -f .env
|
@rm -f .env
|
||||||
@rm -f front/MyINPulse-front/.env
|
@rm -f front/MyINPulse-front/.env
|
||||||
|
@rm -f MyINPulse-back/.env
|
||||||
|
|
||||||
# Install npm packages
|
# Install npm packages
|
||||||
front/MyINPulse-front/.installed:
|
front/MyINPulse-front/.installed:
|
||||||
@ -16,26 +19,55 @@ front/MyINPulse-front/.installed:
|
|||||||
|
|
||||||
vite: ./front/MyINPulse-front/.installed
|
vite: ./front/MyINPulse-front/.installed
|
||||||
|
|
||||||
|
keycloak: ./keycloak/.installed
|
||||||
|
|
||||||
dev-front: clean vite
|
keycloak/.installed:
|
||||||
@cp config/frontdev.front.env front/MyINPulse-front/.env
|
@echo "running one time install"
|
||||||
@cp config/frontdev.main.env .env
|
@cd keycloak/CAS && sudo sh build.sh
|
||||||
|
@touch ./keycloak/.installed
|
||||||
|
|
||||||
|
dev-front: clean vite keycloak
|
||||||
|
@cp config/frontdev.env front/MyINPulse-front/.env
|
||||||
|
@cp config/frontdev.env .env
|
||||||
|
@cp config/frontdev.env MyINPulse-back/.env
|
||||||
@cp config/frontdev.docker-compose.yaml docker-compose.yaml
|
@cp config/frontdev.docker-compose.yaml docker-compose.yaml
|
||||||
@docker compose up -d --build
|
@docker compose up -d --build
|
||||||
@cd ./front/MyINPulse-front/ && npm run dev
|
@cd ./front/MyINPulse-front/ && npm run dev
|
||||||
|
|
||||||
prod: clean
|
prod: clean keycloak
|
||||||
@cp config/prod.front.env front/MyINPulse-front/.env
|
@cp config/prod.env front/MyINPulse-front/.env
|
||||||
@cp config/prod.main.env .env
|
@cp config/prod.env .env
|
||||||
|
@cp config/prod.env .env
|
||||||
@cp config/prod.docker-compose.yaml docker-compose.yaml
|
@cp config/prod.docker-compose.yaml docker-compose.yaml
|
||||||
@docker compose up -d --build
|
@docker compose up -d --build
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
dev-back:
|
dev-back: keycloak
|
||||||
@cp config/backdev.front.env front/MyINPulse-front/.env
|
@cp config/backdev.env front/MyINPulse-front/.env
|
||||||
@cp config/backdev.main.env .env
|
@cp config/backdev.env .env
|
||||||
|
@cp config/backdev.env MyINPulse-back/.env
|
||||||
@cp config/backdev.docker-compose.yaml docker-compose.yaml
|
@cp config/backdev.docker-compose.yaml docker-compose.yaml
|
||||||
@docker compose up -d --build
|
@docker compose up -d --build
|
||||||
@echo "cd MyINPulse-back"
|
@echo "cd MyINPulse-back" && echo 'export $$(cat .env | xargs)'
|
||||||
@echo "./gradlew bootRun --args='--server.port=8081'"
|
@echo "./gradlew bootRun --args='--server.port=8081'"
|
||||||
|
|
||||||
|
dev: clean vite keycloak
|
||||||
|
@cp config/dev.env front/MyINPulse-front/.env
|
||||||
|
@cp config/dev.env .env
|
||||||
|
@cp config/dev.env MyINPulse-back/.env
|
||||||
|
@cp config/dev.docker-compose.yaml docker-compose.yaml
|
||||||
|
@docker compose up -d --build
|
||||||
|
@echo "cd MyINPulse-back" && echo 'export $$(cat .env | xargs)'
|
||||||
|
@echo "./gradlew bootRun --args='--server.port=8081'"
|
||||||
|
@cd ./front/MyINPulse-front/ && npm run dev &
|
||||||
|
|
||||||
|
test-back: clean keycloak
|
||||||
|
@cp config/dev.env front/MyINPulse-front/.env
|
||||||
|
@cp config/dev.env .env
|
||||||
|
@cp config/dev.env MyINPulse-back/.env
|
||||||
|
@cp config/dev.docker-compose.yaml docker-compose.yaml
|
||||||
|
@docker compose up -d --build
|
||||||
|
@echo "cd MyINPulse-back" && echo 'export $$(cat .env | xargs)'
|
||||||
|
@cd ./MyINPulse-back/ && ./gradlew test && ./gradlew jacocoTestReport
|
||||||
|
@firefox ./MyINPulse-back/build/jacocoHtml/index.html
|
||||||
|
@ -2,6 +2,7 @@ plugins {
|
|||||||
id 'java'
|
id 'java'
|
||||||
id 'org.springframework.boot' version '3.4.2'
|
id 'org.springframework.boot' version '3.4.2'
|
||||||
id 'io.spring.dependency-management' version '1.1.7'
|
id 'io.spring.dependency-management' version '1.1.7'
|
||||||
|
id 'jacoco'
|
||||||
}
|
}
|
||||||
|
|
||||||
group = 'enseirb'
|
group = 'enseirb'
|
||||||
@ -21,13 +22,38 @@ dependencies {
|
|||||||
implementation 'org.springframework.boot:spring-boot-starter-oauth2-resource-server'
|
implementation 'org.springframework.boot:spring-boot-starter-oauth2-resource-server'
|
||||||
implementation 'org.springframework.boot:spring-boot-starter-web'
|
implementation 'org.springframework.boot:spring-boot-starter-web'
|
||||||
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
|
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
|
||||||
implementation('org.springframework.boot:spring-boot-starter-validation')
|
implementation 'org.springframework.boot:spring-boot-starter-validation'
|
||||||
implementation('org.springframework.boot:spring-boot-starter-data-rest')
|
implementation 'org.springframework.boot:spring-boot-starter-data-rest'
|
||||||
|
implementation group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.+'
|
||||||
|
implementation group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.+'
|
||||||
implementation 'org.postgresql:postgresql'
|
implementation 'org.postgresql:postgresql'
|
||||||
|
implementation group: 'com.itextpdf', name: 'itextpdf', version: '5.5.13.3'
|
||||||
|
|
||||||
testImplementation 'org.springframework.boot:spring-boot-starter-test'
|
testImplementation 'org.springframework.boot:spring-boot-starter-test'
|
||||||
|
testImplementation 'com.h2database:h2'
|
||||||
|
|
||||||
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
|
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
|
||||||
}
|
}
|
||||||
|
|
||||||
tasks.named('test') {
|
tasks.named('test') {
|
||||||
useJUnitPlatform()
|
useJUnitPlatform()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
test {
|
||||||
|
finalizedBy jacocoTestReport // report is always generated after tests run
|
||||||
|
}
|
||||||
|
jacocoTestReport {
|
||||||
|
dependsOn test // tests are required to run before generating the report
|
||||||
|
reports {
|
||||||
|
xml.required = false
|
||||||
|
csv.required = false
|
||||||
|
html.outputLocation = layout.buildDirectory.dir('jacocoHtml')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
jacoco {
|
||||||
|
toolVersion = "0.8.12"
|
||||||
|
reportsDirectory = layout.buildDirectory.dir('customJacocoReportDir')
|
||||||
|
}
|
||||||
|
@ -6,7 +6,6 @@ import org.springframework.security.oauth2.jwt.*;
|
|||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
|
|
||||||
@SpringBootApplication
|
@SpringBootApplication
|
||||||
public class MyinpulseApplication {
|
public class MyinpulseApplication {
|
||||||
|
|
||||||
|
@ -1,43 +0,0 @@
|
|||||||
package enseirb.myinpulse.api;
|
|
||||||
|
|
||||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
|
||||||
import org.springframework.security.core.context.SecurityContextHolder;
|
|
||||||
import org.springframework.web.bind.annotation.GetMapping;
|
|
||||||
import org.springframework.web.bind.annotation.RequestMethod;
|
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
|
||||||
import org.springframework.web.bind.annotation.CrossOrigin;
|
|
||||||
|
|
||||||
import java.security.Principal;
|
|
||||||
|
|
||||||
@SpringBootApplication
|
|
||||||
@RestController
|
|
||||||
public class GetUserInfo {
|
|
||||||
// TODO: understand how to get data
|
|
||||||
@GetMapping("/getUserInfo")
|
|
||||||
public Object user(Principal principal) {
|
|
||||||
System.out.println("GetUserInfo + " + principal);
|
|
||||||
System.out.println(SecurityContextHolder.getContext().getAuthentication());
|
|
||||||
return SecurityContextHolder.getContext().getAuthentication().getPrincipal();
|
|
||||||
}
|
|
||||||
|
|
||||||
@CrossOrigin(methods = {RequestMethod.GET, RequestMethod.OPTIONS})
|
|
||||||
@GetMapping("/random")
|
|
||||||
public boolean rand() {
|
|
||||||
System.err.println("HELLO");
|
|
||||||
return Math.random() > 0.5;
|
|
||||||
}
|
|
||||||
|
|
||||||
@CrossOrigin(methods = {RequestMethod.GET, RequestMethod.OPTIONS})
|
|
||||||
@GetMapping("/random2")
|
|
||||||
public boolean rand2() {
|
|
||||||
System.err.println("HELLO2");
|
|
||||||
return Math.random() > 0.5;
|
|
||||||
}
|
|
||||||
|
|
||||||
@CrossOrigin(methods = {RequestMethod.GET, RequestMethod.OPTIONS})
|
|
||||||
@GetMapping("/random3")
|
|
||||||
public boolean rand3() {
|
|
||||||
System.err.println("HELLO");
|
|
||||||
return Math.random() > 0.5;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,4 +1,10 @@
|
|||||||
package enseirb.myinpulse.security;
|
/*
|
||||||
|
* Source: https://github.com/ChristianHuff-DEV/secure-spring-rest-api-using-keycloak/blob/main/src/main/java/io/betweendata/RestApi/security/oauth2/KeycloakJwtRolesConverter.java
|
||||||
|
* edited by Pierre Tellier
|
||||||
|
*/
|
||||||
|
package enseirb.myinpulse.config;
|
||||||
|
|
||||||
|
import static java.util.stream.Collectors.toSet;
|
||||||
|
|
||||||
import org.springframework.core.convert.converter.Converter;
|
import org.springframework.core.convert.converter.Converter;
|
||||||
import org.springframework.security.authentication.AbstractAuthenticationToken;
|
import org.springframework.security.authentication.AbstractAuthenticationToken;
|
||||||
@ -14,8 +20,6 @@ import java.util.Map;
|
|||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
import static java.util.stream.Collectors.toSet;
|
|
||||||
|
|
||||||
public class KeycloakJwtRolesConverter implements Converter<Jwt, AbstractAuthenticationToken> {
|
public class KeycloakJwtRolesConverter implements Converter<Jwt, AbstractAuthenticationToken> {
|
||||||
/** Prefix used for realm level roles. */
|
/** Prefix used for realm level roles. */
|
||||||
public static final String PREFIX_REALM_ROLE = "ROLE_REALM_";
|
public static final String PREFIX_REALM_ROLE = "ROLE_REALM_";
|
||||||
@ -38,7 +42,7 @@ public class KeycloakJwtRolesConverter implements Converter<Jwt, AbstractAuthent
|
|||||||
source,
|
source,
|
||||||
Stream.concat(
|
Stream.concat(
|
||||||
new JwtGrantedAuthoritiesConverter().convert(source).stream(),
|
new JwtGrantedAuthoritiesConverter().convert(source).stream(),
|
||||||
TEMPORARNAME(source).stream())
|
tokenRolesExtractor(source).stream())
|
||||||
.collect(toSet()));
|
.collect(toSet()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -46,7 +50,7 @@ public class KeycloakJwtRolesConverter implements Converter<Jwt, AbstractAuthent
|
|||||||
* Extracts the realm and resource level roles from a JWT token distinguishing between them
|
* Extracts the realm and resource level roles from a JWT token distinguishing between them
|
||||||
* using prefixes.
|
* using prefixes.
|
||||||
*/
|
*/
|
||||||
public Collection<GrantedAuthority> TEMPORARNAME(Jwt jwt) {
|
public Collection<GrantedAuthority> tokenRolesExtractor(Jwt jwt) {
|
||||||
// Collection that will hold the extracted roles
|
// Collection that will hold the extracted roles
|
||||||
Collection<GrantedAuthority> grantedAuthorities = new ArrayList<>();
|
Collection<GrantedAuthority> grantedAuthorities = new ArrayList<>();
|
||||||
|
|
@ -1,6 +1,8 @@
|
|||||||
package enseirb.myinpulse.config;
|
package enseirb.myinpulse.config;
|
||||||
|
|
||||||
import enseirb.myinpulse.security.KeycloakJwtRolesConverter;
|
import static org.springframework.security.authorization.AuthorityAuthorizationManager.hasRole;
|
||||||
|
|
||||||
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
|
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
|
||||||
@ -12,39 +14,53 @@ import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
|
|||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import static org.springframework.security.authorization.AuthorityAuthorizationManager.hasRole;
|
|
||||||
|
|
||||||
@Configuration
|
@Configuration
|
||||||
public class WebSecurityCustomConfiguration {
|
public class WebSecurityCustomConfiguration {
|
||||||
// CORS configuration
|
// CORS configuration
|
||||||
// TODO: make sure to only accept our own domains
|
|
||||||
|
@Value("${VITE_APP_URL}")
|
||||||
|
private String frontendUrl;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configure the CORS (Cross Origin Ressource Sharing -- a security feature) configuration. The
|
||||||
|
* only allowed website is the frontend, defined in the .env file.
|
||||||
|
*
|
||||||
|
* @return the CORS configuration used by the backend
|
||||||
|
*/
|
||||||
@Bean
|
@Bean
|
||||||
public CorsConfigurationSource corsConfigurationSource() {
|
public CorsConfigurationSource corsConfigurationSource() {
|
||||||
CorsConfiguration configuration = new CorsConfiguration();
|
CorsConfiguration configuration = new CorsConfiguration();
|
||||||
configuration.setAllowedOrigins(List.of("*"));
|
configuration.setAllowedOrigins(List.of(frontendUrl));
|
||||||
configuration.setAllowedMethods(Arrays.asList("GET", "OPTIONS"));
|
configuration.setAllowedMethods(Arrays.asList("GET", "OPTIONS"));
|
||||||
configuration.setAllowedHeaders(
|
configuration.setAllowedHeaders(
|
||||||
Arrays.asList(
|
Arrays.asList("authorization", "content-type", "x-auth-token"));
|
||||||
"authorization",
|
|
||||||
"content-type",
|
|
||||||
"x-auth-token")); // Do not remove, this fixes the CORS errors when
|
|
||||||
// unauthenticated
|
|
||||||
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
|
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
|
||||||
source.registerCorsConfiguration("/**", configuration);
|
source.registerCorsConfiguration("/**", configuration);
|
||||||
|
|
||||||
return source;
|
return source;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configure the authorisation required for each path.
|
||||||
|
*
|
||||||
|
* <p>admin endpoints are under /admin/* and entrepreneur are under /entrepreneur/*
|
||||||
|
*
|
||||||
|
* <p>If endpoints dont require authentication, they are under /unauth/
|
||||||
|
*
|
||||||
|
* @param http automatically filled in by spring.
|
||||||
|
* @return a securityfilterchain, automatically used by spring.
|
||||||
|
* @throws Exception TODO: figure out when the exception are raised
|
||||||
|
*/
|
||||||
@Bean
|
@Bean
|
||||||
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
|
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
|
||||||
http.authorizeHttpRequests(
|
http.authorizeHttpRequests(
|
||||||
authorize ->
|
authorize ->
|
||||||
authorize
|
authorize
|
||||||
.requestMatchers("/random2")
|
.requestMatchers("/entrepreneur/**", "/shared/**")
|
||||||
.access(hasRole("REALM_MyINPulse-entrepreneur"))
|
.access(hasRole("REALM_MyINPulse-entrepreneur"))
|
||||||
.requestMatchers("/random")
|
.requestMatchers("/admin/**", "/shared/**")
|
||||||
.access(hasRole("REALM_MyINPulse-admin"))
|
.access(hasRole("REALM_MyINPulse-admin"))
|
||||||
.requestMatchers("/random3")
|
.requestMatchers("/unauth/**")
|
||||||
.permitAll()
|
.permitAll()
|
||||||
.anyRequest()
|
.anyRequest()
|
||||||
.authenticated())
|
.authenticated())
|
||||||
|
@ -0,0 +1,102 @@
|
|||||||
|
package enseirb.myinpulse.controller;
|
||||||
|
|
||||||
|
import enseirb.myinpulse.model.*;
|
||||||
|
import enseirb.myinpulse.service.AdminApiService;
|
||||||
|
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
|
import org.springframework.security.core.annotation.AuthenticationPrincipal;
|
||||||
|
import org.springframework.security.oauth2.jwt.Jwt;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
|
@SpringBootApplication
|
||||||
|
@RestController
|
||||||
|
public class AdminApi {
|
||||||
|
|
||||||
|
private final AdminApiService adminApiService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
AdminApi(AdminApiService adminApiService) {
|
||||||
|
this.adminApiService = adminApiService;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TODO: description
|
||||||
|
*
|
||||||
|
* @return a list of all project managed by the current admin user
|
||||||
|
*/
|
||||||
|
@GetMapping("/admin/projects")
|
||||||
|
public Iterable<Project> getProjects(@AuthenticationPrincipal Jwt principal) {
|
||||||
|
return adminApiService.getProjectsOfAdmin(principal.getClaimAsString("email"));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TODO: Why in admin instead of shared ? + desc
|
||||||
|
*
|
||||||
|
* @return a list of upcoming appointments for the current user
|
||||||
|
*/
|
||||||
|
@GetMapping("/admin/appointments/upcoming")
|
||||||
|
public Iterable<Appointment> getUpcomingAppointments(@AuthenticationPrincipal Jwt principal) {
|
||||||
|
return adminApiService.getUpcomingAppointments(principal.getClaimAsString("email"));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TODO: description
|
||||||
|
*
|
||||||
|
* @return a list of current unvalidated projects, waiting to be accepted
|
||||||
|
*/
|
||||||
|
@GetMapping("/admin/projects/pending")
|
||||||
|
public Iterable<Project> getPendingProjects() {
|
||||||
|
return adminApiService.getPendingProjects();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Endpoint used to make a decision about a project.
|
||||||
|
*
|
||||||
|
* <p>The decision must contain the administrator
|
||||||
|
*
|
||||||
|
* @return the status code of the request
|
||||||
|
*/
|
||||||
|
@PostMapping("/admin/projects/decision")
|
||||||
|
public void validateProject(@RequestBody ProjectDecision decision) {
|
||||||
|
adminApiService.validateProject(decision);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Endpoint used to manually add a project by an admin
|
||||||
|
*
|
||||||
|
* @return the status code of the request
|
||||||
|
*/
|
||||||
|
@PostMapping("/admin/project/add")
|
||||||
|
public void addNewProject(@RequestBody Project project) {
|
||||||
|
adminApiService.addNewProject(project);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TODO: shouldn't it be an PUT request ? / What is the rerun type
|
||||||
|
*
|
||||||
|
* <p>Endpoint used to add a new report to an appointment
|
||||||
|
*
|
||||||
|
* @return the status code of the request
|
||||||
|
*/
|
||||||
|
@PostMapping("/admin/appoitements/report/{appointmentId}")
|
||||||
|
public void createAppointmentReport(
|
||||||
|
@PathVariable long appointmentId,
|
||||||
|
@RequestBody Report report,
|
||||||
|
@AuthenticationPrincipal Jwt principal) {
|
||||||
|
adminApiService.createAppointmentReport(
|
||||||
|
appointmentId, report, principal.getClaimAsString("email"));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TODO: Shouldn't a project be kept in history ? 2 different endpoints ?
|
||||||
|
*
|
||||||
|
* <p>Endpoint used to completely remove a project.
|
||||||
|
*
|
||||||
|
* @return the status code of the request
|
||||||
|
*/
|
||||||
|
@DeleteMapping("/admin/projects/remove/{projectId}")
|
||||||
|
public void deleteProject(@PathVariable long projectId) {
|
||||||
|
adminApiService.deleteProject(projectId);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,78 @@
|
|||||||
|
package enseirb.myinpulse.controller;
|
||||||
|
|
||||||
|
import enseirb.myinpulse.model.SectionCell;
|
||||||
|
import enseirb.myinpulse.model.Project;
|
||||||
|
import enseirb.myinpulse.service.EntrepreneurApiService;
|
||||||
|
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
|
import org.springframework.security.core.annotation.AuthenticationPrincipal;
|
||||||
|
import org.springframework.security.oauth2.jwt.Jwt;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
|
@SpringBootApplication
|
||||||
|
@RestController
|
||||||
|
public class EntrepreneurApi {
|
||||||
|
|
||||||
|
private final EntrepreneurApiService entrepreneurApiService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
EntrepreneurApi(EntrepreneurApiService entrepreneurApiService) {
|
||||||
|
this.entrepreneurApiService = entrepreneurApiService;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TODO: check return type
|
||||||
|
*
|
||||||
|
* <p>Endpoint used to update a LC section.
|
||||||
|
*
|
||||||
|
* @return status code
|
||||||
|
*/
|
||||||
|
@PutMapping("/entrepreneur/lcsection/modify/{sectionId}")
|
||||||
|
public void editSectionCell(
|
||||||
|
@PathVariable Long sectionId,
|
||||||
|
@RequestBody SectionCell sectionCell,
|
||||||
|
@AuthenticationPrincipal Jwt principal) {
|
||||||
|
entrepreneurApiService.editSectionCell(
|
||||||
|
sectionId, sectionCell, principal.getClaimAsString("email"));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TODO: checkReturn Type
|
||||||
|
*
|
||||||
|
* <p>Endpoint used to delete a LC section
|
||||||
|
*
|
||||||
|
* @return status code
|
||||||
|
*/
|
||||||
|
@DeleteMapping("/entrepreneur/lcsection/remove/{sectionId}")
|
||||||
|
public void removeSectionCell(
|
||||||
|
@PathVariable Long sectionId, @AuthenticationPrincipal Jwt principal) {
|
||||||
|
entrepreneurApiService.removeSectionCell(sectionId, principal.getClaimAsString("email"));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TODO: check return type
|
||||||
|
*
|
||||||
|
* <p>Endpoint used to create a new LC section
|
||||||
|
*
|
||||||
|
* @return status code
|
||||||
|
*/
|
||||||
|
@PostMapping("/entrepreneur/lcsection/add") // remove id from doc aswell
|
||||||
|
public void addLCSection(
|
||||||
|
@RequestBody SectionCell sectionCell, @AuthenticationPrincipal Jwt principal) {
|
||||||
|
entrepreneurApiService.addSectionCell(sectionCell, principal.getClaimAsString("email"));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TODO: check return type
|
||||||
|
*
|
||||||
|
* <p>Endpoint used to request the creation of a new project
|
||||||
|
*
|
||||||
|
* @return status code
|
||||||
|
*/
|
||||||
|
@PostMapping("/entrepreneur/project/request")
|
||||||
|
public void requestNewProject(
|
||||||
|
@RequestBody Project project, @AuthenticationPrincipal Jwt principal) {
|
||||||
|
entrepreneurApiService.requestNewProject(project, principal.getClaimAsString("email"));
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,105 @@
|
|||||||
|
package enseirb.myinpulse.controller;
|
||||||
|
|
||||||
|
import com.itextpdf.text.DocumentException;
|
||||||
|
|
||||||
|
import enseirb.myinpulse.model.*;
|
||||||
|
import enseirb.myinpulse.service.SharedApiService;
|
||||||
|
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
|
import org.springframework.security.core.annotation.AuthenticationPrincipal;
|
||||||
|
import org.springframework.security.oauth2.jwt.Jwt;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.URISyntaxException;
|
||||||
|
|
||||||
|
@SpringBootApplication
|
||||||
|
@RestController
|
||||||
|
public class SharedApi {
|
||||||
|
|
||||||
|
private final SharedApiService sharedApiService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
SharedApi(SharedApiService sharedApiService) {
|
||||||
|
this.sharedApiService = sharedApiService;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Endpoint used to get the data inside the lean canvas
|
||||||
|
*
|
||||||
|
* @return a list of lean canvas sections
|
||||||
|
*/
|
||||||
|
@GetMapping("/shared/project/lcsection/{projectId}/{sectionId}/{date}")
|
||||||
|
public Iterable<SectionCell> getLCSection(
|
||||||
|
@PathVariable("projectId") Long projectId,
|
||||||
|
@PathVariable("sectionId") Long sectionId,
|
||||||
|
@PathVariable("date") String date,
|
||||||
|
@AuthenticationPrincipal Jwt principal) {
|
||||||
|
return sharedApiService.getSectionCells(
|
||||||
|
projectId, sectionId, date, principal.getClaimAsString("email"));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Endpoint used to get entrepreneurs details
|
||||||
|
*
|
||||||
|
* @return a list of all entrepreneurs in a project
|
||||||
|
*/
|
||||||
|
@GetMapping("/shared/entrepreneurs/{projectId}")
|
||||||
|
public Iterable<Entrepreneur> getEntrepreneursByProjectId(
|
||||||
|
@PathVariable int projectId, @AuthenticationPrincipal Jwt principal) {
|
||||||
|
return sharedApiService.getEntrepreneursByProjectId(
|
||||||
|
projectId, principal.getClaimAsString("email"));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Endpoint used to get the administrator of a project.
|
||||||
|
*
|
||||||
|
* @return the admin of a project
|
||||||
|
*/
|
||||||
|
@GetMapping("/shared/projects/admin/{projectId}")
|
||||||
|
public Administrator getAdminByProjectId(
|
||||||
|
@PathVariable int projectId, @AuthenticationPrincipal Jwt principal) {
|
||||||
|
return sharedApiService.getAdminByProjectId(projectId, principal.getClaimAsString("email"));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Endpoint used to get all appointments of a single project.
|
||||||
|
*
|
||||||
|
* @return a list of all appointments.
|
||||||
|
*/
|
||||||
|
@GetMapping("/shared/projects/appointments/{projectId}")
|
||||||
|
public Iterable<Appointment> getAppointmentsByProjectId(
|
||||||
|
@PathVariable int projectId, @AuthenticationPrincipal Jwt principal) {
|
||||||
|
return sharedApiService.getAppointmentsByProjectId(
|
||||||
|
projectId, principal.getClaimAsString("email"));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Endpoint used to generate a PDF report
|
||||||
|
*
|
||||||
|
* @return a PDF file? TODO: how does that works ?
|
||||||
|
*/
|
||||||
|
@GetMapping("/shared/projects/appointments/report/{appointmentId}")
|
||||||
|
public void getPDFReport(
|
||||||
|
@PathVariable int appointmentId, @AuthenticationPrincipal Jwt principal) {
|
||||||
|
try {
|
||||||
|
sharedApiService.getPDFReport(appointmentId, principal.getClaimAsString("email"));
|
||||||
|
} catch (DocumentException e) {
|
||||||
|
System.out.println(e + "Document exception");
|
||||||
|
} catch (URISyntaxException e) {
|
||||||
|
System.out.println(e + "Error with URI");
|
||||||
|
} catch (IOException e) {
|
||||||
|
System.out.println(e + "Failed to access file");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return TODO
|
||||||
|
*/
|
||||||
|
@PostMapping("/shared/appointment/request")
|
||||||
|
public void createAppointmentRequest(
|
||||||
|
@RequestBody Appointment appointment, @AuthenticationPrincipal Jwt principal) {
|
||||||
|
sharedApiService.createAppointmentRequest(appointment, principal.getClaimAsString("email"));
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
package enseirb.myinpulse.exception;
|
||||||
|
|
||||||
|
public class RoleNotFoudException extends RuntimeException {
|
||||||
|
public RoleNotFoudException(String message) {
|
||||||
|
super(message);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
package enseirb.myinpulse.exception;
|
||||||
|
|
||||||
|
public class UserNotFoundException extends RuntimeException {
|
||||||
|
public UserNotFoundException(String message) {
|
||||||
|
super(message);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,66 @@
|
|||||||
|
package enseirb.myinpulse.model;
|
||||||
|
|
||||||
|
import jakarta.persistence.*;
|
||||||
|
import jakarta.persistence.PrimaryKeyJoinColumn;
|
||||||
|
import jakarta.persistence.Table;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
@Table(name = "administrator")
|
||||||
|
@PrimaryKeyJoinColumn(name = "idAdministrator", referencedColumnName = "idUser")
|
||||||
|
public class Administrator extends User {
|
||||||
|
|
||||||
|
@OneToMany(mappedBy = "projectAdministrator", fetch = FetchType.LAZY, orphanRemoval = true)
|
||||||
|
private final List<Project> listProject = new ArrayList<>();
|
||||||
|
|
||||||
|
/*@OneToMany(mappedBy = "administratorSectionCell", fetch = FetchType.LAZY, orphanRemoval = true)
|
||||||
|
private List<SectionCell> listSectionCell = new ArrayList<>();*/
|
||||||
|
// should now be useless
|
||||||
|
|
||||||
|
@OneToMany(mappedBy = "administratorAnnotation", fetch = FetchType.LAZY, orphanRemoval = true)
|
||||||
|
private final List<Annotation> listAnnotation = new ArrayList<>();
|
||||||
|
|
||||||
|
/*@OneToMany(mappedBy = "administratorAppointment", fetch = FetchType.LAZY, orphanRemoval = true)
|
||||||
|
private final List<Appointment> listAppointment = new ArrayList<>();*/
|
||||||
|
// should now be useless
|
||||||
|
|
||||||
|
@OneToOne(mappedBy = "administratorAppointment", fetch = FetchType.LAZY, orphanRemoval = true)
|
||||||
|
private MakeAppointment makeAppointment;
|
||||||
|
|
||||||
|
public Administrator() {}
|
||||||
|
|
||||||
|
public Administrator(
|
||||||
|
String userSurname,
|
||||||
|
String username,
|
||||||
|
String primaryMail,
|
||||||
|
String secondaryMail,
|
||||||
|
String phoneNumber) {
|
||||||
|
super(null, userSurname, username, primaryMail, secondaryMail, phoneNumber);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Project> getListProject() {
|
||||||
|
return listProject;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateListProject(Project project) {
|
||||||
|
listProject.add(project);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Annotation> getListAnnotation() {
|
||||||
|
return listAnnotation;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateListAnnotation(Annotation annotation) {
|
||||||
|
listAnnotation.add(annotation);
|
||||||
|
}
|
||||||
|
|
||||||
|
public MakeAppointment getMakeAppointment() {
|
||||||
|
return makeAppointment;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMakeAppointment(MakeAppointment makeAppointment) {
|
||||||
|
this.makeAppointment = makeAppointment;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,61 @@
|
|||||||
|
package enseirb.myinpulse.model;
|
||||||
|
|
||||||
|
import jakarta.persistence.*;
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
@Table(name = "annotation")
|
||||||
|
public class Annotation {
|
||||||
|
|
||||||
|
@Id
|
||||||
|
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||||
|
private Long idAnnotation;
|
||||||
|
|
||||||
|
private String comment;
|
||||||
|
|
||||||
|
@ManyToOne(fetch = FetchType.LAZY)
|
||||||
|
@JoinColumn(name = "idSectionCell")
|
||||||
|
private SectionCell sectionCellAnnotation;
|
||||||
|
|
||||||
|
@ManyToOne(fetch = FetchType.LAZY)
|
||||||
|
@JoinColumn(name = "idAdministrator")
|
||||||
|
private Administrator administratorAnnotation;
|
||||||
|
|
||||||
|
public Annotation() {}
|
||||||
|
|
||||||
|
public Annotation(Long idAnnotation, String commentary) {
|
||||||
|
this.idAnnotation = idAnnotation;
|
||||||
|
this.comment = comment;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getComment() {
|
||||||
|
return comment;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setComment(String comment) {
|
||||||
|
this.comment = comment;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getIdAnnotation() {
|
||||||
|
return idAnnotation;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setIdAnnotation(Long idAnnotation) {
|
||||||
|
this.idAnnotation = idAnnotation;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SectionCell getSectionCellAnnotation() {
|
||||||
|
return sectionCellAnnotation;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSectionCellAnnotation(SectionCell sectionCellAnnotation) {
|
||||||
|
this.sectionCellAnnotation = sectionCellAnnotation;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Administrator getAdministratorAnnotation() {
|
||||||
|
return administratorAnnotation;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAdministratorAnnotation(Administrator administratorAnnotation) {
|
||||||
|
this.administratorAnnotation = administratorAnnotation;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,126 @@
|
|||||||
|
package enseirb.myinpulse.model;
|
||||||
|
|
||||||
|
import jakarta.persistence.*;
|
||||||
|
|
||||||
|
import java.time.LocalDate;
|
||||||
|
import java.time.LocalTime;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
@Table(name = "appointment")
|
||||||
|
public class Appointment {
|
||||||
|
|
||||||
|
/*@OneToMany(mappedBy = "appointmentEntrepreneurs", fetch = FetchType.LAZY, orphanRemoval = true)
|
||||||
|
private final List<Entrepreneur> listEntrepreneur =
|
||||||
|
new ArrayList<>(); */
|
||||||
|
// should now be useless
|
||||||
|
|
||||||
|
@ManyToMany(
|
||||||
|
fetch = FetchType.LAZY,
|
||||||
|
cascade = {CascadeType.ALL})
|
||||||
|
@JoinTable(
|
||||||
|
name = "concern",
|
||||||
|
joinColumns = @JoinColumn(name = "idAppointment"),
|
||||||
|
inverseJoinColumns = @JoinColumn(name = "idSectionCell"))
|
||||||
|
List<SectionCell> listSectionCell = new ArrayList<>();
|
||||||
|
|
||||||
|
@OneToOne(mappedBy = "appointmentReport", fetch = FetchType.LAZY, orphanRemoval = true)
|
||||||
|
private Report report;
|
||||||
|
|
||||||
|
@Id
|
||||||
|
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||||
|
private Long idAppointment;
|
||||||
|
|
||||||
|
private LocalDate appointmentDate;
|
||||||
|
|
||||||
|
private LocalTime appointmentTime;
|
||||||
|
|
||||||
|
private LocalTime appointmentDuration;
|
||||||
|
|
||||||
|
@Column(length = 255)
|
||||||
|
private String appointmentPlace;
|
||||||
|
|
||||||
|
private String appointmentSubject;
|
||||||
|
|
||||||
|
public Appointment() {}
|
||||||
|
|
||||||
|
public Appointment(
|
||||||
|
Long idAppointment,
|
||||||
|
LocalDate appointmentDate,
|
||||||
|
LocalTime appointmentTime,
|
||||||
|
LocalTime appointmentDuration,
|
||||||
|
String appointmentPlace,
|
||||||
|
String appointmentSubject) {
|
||||||
|
this.idAppointment = idAppointment;
|
||||||
|
this.appointmentDate = appointmentDate;
|
||||||
|
this.appointmentTime = appointmentTime;
|
||||||
|
this.appointmentDuration = appointmentDuration;
|
||||||
|
this.appointmentPlace = appointmentPlace;
|
||||||
|
this.appointmentSubject = appointmentSubject;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getIdAppointment() {
|
||||||
|
return idAppointment;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setIdAppointment(Long idAppointment) {
|
||||||
|
this.idAppointment = idAppointment;
|
||||||
|
}
|
||||||
|
|
||||||
|
public LocalDate getAppointmentDate() {
|
||||||
|
return appointmentDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAppointmentDate(LocalDate appointmentDate) {
|
||||||
|
this.appointmentDate = appointmentDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public LocalTime getAppointmentTime() {
|
||||||
|
return appointmentTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAppointmentTime(LocalTime appointmentTime) {
|
||||||
|
this.appointmentTime = appointmentTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public LocalTime getAppointmentDuration() {
|
||||||
|
return appointmentDuration;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAppointmentDuration(LocalTime appointmentDuration) {
|
||||||
|
this.appointmentDuration = appointmentDuration;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getAppointmentPlace() {
|
||||||
|
return appointmentPlace;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAppointmentPlace(String appointmentPlace) {
|
||||||
|
this.appointmentPlace = appointmentPlace;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getAppointmentSubject() {
|
||||||
|
return appointmentSubject;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAppointmentSubject(String appointmentSubject) {
|
||||||
|
this.appointmentSubject = appointmentSubject;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<SectionCell> getAppointmentListSectionCell() {
|
||||||
|
return listSectionCell;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateListSectionCell(SectionCell sectionCell) {
|
||||||
|
listSectionCell.add(sectionCell);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Report getAppointmentReport() {
|
||||||
|
return report;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAppointmentReport(Report report) {
|
||||||
|
this.report = report;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,123 @@
|
|||||||
|
package enseirb.myinpulse.model;
|
||||||
|
|
||||||
|
import jakarta.persistence.*;
|
||||||
|
import jakarta.persistence.Entity;
|
||||||
|
import jakarta.persistence.Table;
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
@Table(name = "entrepreneur")
|
||||||
|
@PrimaryKeyJoinColumn(name = "idEntrepreneur", referencedColumnName = "idUser")
|
||||||
|
public class Entrepreneur extends User {
|
||||||
|
|
||||||
|
@Column(length = 255)
|
||||||
|
private String school;
|
||||||
|
|
||||||
|
@Column(length = 255)
|
||||||
|
private String course;
|
||||||
|
|
||||||
|
private boolean sneeStatus;
|
||||||
|
|
||||||
|
@ManyToOne(fetch = FetchType.LAZY)
|
||||||
|
@JoinColumn(name = "idProjectParticipation", referencedColumnName = "idProject")
|
||||||
|
private Project projectParticipation;
|
||||||
|
|
||||||
|
// @Column(insertable=false, updatable=false)
|
||||||
|
@OneToOne(fetch = FetchType.LAZY)
|
||||||
|
@JoinColumn(name = "idProjectProposed", referencedColumnName = "idProject")
|
||||||
|
private Project projectProposed;
|
||||||
|
|
||||||
|
/*@ManyToOne(fetch = FetchType.LAZY)
|
||||||
|
@JoinColumn(name = "idAppointment")
|
||||||
|
private Appointment appointmentEntrepreneur;*/
|
||||||
|
// should now be useless
|
||||||
|
|
||||||
|
@OneToOne(mappedBy = "entrepreneurAppointment", fetch = FetchType.LAZY, orphanRemoval = true)
|
||||||
|
private MakeAppointment makeAppointment;
|
||||||
|
|
||||||
|
public Entrepreneur() {}
|
||||||
|
|
||||||
|
public Entrepreneur(
|
||||||
|
String userSurname,
|
||||||
|
String username,
|
||||||
|
String primaryMail,
|
||||||
|
String secondaryMail,
|
||||||
|
String phoneNumber,
|
||||||
|
String school,
|
||||||
|
String course,
|
||||||
|
boolean sneeStatus) {
|
||||||
|
super(userSurname, username, primaryMail, secondaryMail, phoneNumber);
|
||||||
|
this.school = school;
|
||||||
|
this.course = course;
|
||||||
|
this.sneeStatus = sneeStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Entrepreneur(
|
||||||
|
Long idUser,
|
||||||
|
String userSurname,
|
||||||
|
String userName,
|
||||||
|
String primaryMail,
|
||||||
|
String secondaryMail,
|
||||||
|
String phoneNumber,
|
||||||
|
String school,
|
||||||
|
String course,
|
||||||
|
boolean sneeStatus,
|
||||||
|
Project projectParticipation,
|
||||||
|
Project projectProposed,
|
||||||
|
MakeAppointment makeAppointment) {
|
||||||
|
super(idUser, userSurname, userName, primaryMail, secondaryMail, phoneNumber);
|
||||||
|
this.school = school;
|
||||||
|
this.course = course;
|
||||||
|
this.sneeStatus = sneeStatus;
|
||||||
|
this.projectParticipation = projectParticipation;
|
||||||
|
this.projectProposed = projectProposed;
|
||||||
|
this.makeAppointment = makeAppointment;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSchool() {
|
||||||
|
return school;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSchool(String school) {
|
||||||
|
this.school = school;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getCourse() {
|
||||||
|
return course;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCourse(String course) {
|
||||||
|
this.course = course;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSneeStatus() {
|
||||||
|
return sneeStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSneeStatus(boolean statusSnee) {
|
||||||
|
this.sneeStatus = sneeStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Project getProjectParticipation() {
|
||||||
|
return projectParticipation;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setProjectParticipation(Project projectParticipation) {
|
||||||
|
this.projectParticipation = projectParticipation;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Project getProjectProposed() {
|
||||||
|
return projectProposed;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setProjectProposed(Project projectProposed) {
|
||||||
|
this.projectProposed = projectProposed;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MakeAppointment getMakeAppointment() {
|
||||||
|
return makeAppointment;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMakeAppointment(MakeAppointment makeAppointment) {
|
||||||
|
this.makeAppointment = makeAppointment;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,26 @@
|
|||||||
|
package enseirb.myinpulse.model;
|
||||||
|
|
||||||
|
import jakarta.persistence.*;
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
@Table(name = "make_appointment")
|
||||||
|
public class MakeAppointment {
|
||||||
|
|
||||||
|
@Id
|
||||||
|
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||||
|
private Long idMakeAppointment;
|
||||||
|
|
||||||
|
@OneToOne(fetch = FetchType.LAZY)
|
||||||
|
@JoinColumn(name = "idAdministrator")
|
||||||
|
private Administrator administratorAppointment;
|
||||||
|
|
||||||
|
@OneToOne(fetch = FetchType.LAZY)
|
||||||
|
@JoinColumn(name = "idEntrepreneur")
|
||||||
|
private Entrepreneur entrepreneurAppointment;
|
||||||
|
|
||||||
|
public MakeAppointment() {}
|
||||||
|
|
||||||
|
public MakeAppointment(Long idMakeAppointment) {
|
||||||
|
this.idMakeAppointment = idMakeAppointment;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,140 @@
|
|||||||
|
package enseirb.myinpulse.model;
|
||||||
|
|
||||||
|
import jakarta.persistence.*;
|
||||||
|
|
||||||
|
import java.time.LocalDate;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
@Table(name = "project")
|
||||||
|
public class Project {
|
||||||
|
|
||||||
|
@OneToMany(mappedBy = "projectParticipation", fetch = FetchType.LAZY, orphanRemoval = true)
|
||||||
|
private final List<Entrepreneur> listEntrepreneurParticipation = new ArrayList<>();
|
||||||
|
|
||||||
|
@OneToMany(mappedBy = "projectSectionCell", fetch = FetchType.LAZY, orphanRemoval = true)
|
||||||
|
private final List<SectionCell> listSectionCell = new ArrayList<>();
|
||||||
|
|
||||||
|
@Id
|
||||||
|
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||||
|
private Long idProject;
|
||||||
|
|
||||||
|
@Column(length = 255)
|
||||||
|
private String projectName;
|
||||||
|
|
||||||
|
private byte[] logo;
|
||||||
|
private LocalDate creationDate;
|
||||||
|
|
||||||
|
@Column private ProjectDecisionValue projectStatus;
|
||||||
|
|
||||||
|
@ManyToOne(fetch = FetchType.LAZY)
|
||||||
|
@JoinColumn(name = "idAdministrator")
|
||||||
|
private Administrator projectAdministrator;
|
||||||
|
|
||||||
|
@OneToOne(mappedBy = "projectProposed", fetch = FetchType.LAZY, orphanRemoval = true)
|
||||||
|
private Entrepreneur entrepreneurProposed;
|
||||||
|
|
||||||
|
public Project() {}
|
||||||
|
|
||||||
|
public Project(
|
||||||
|
String projectName,
|
||||||
|
byte[] logo,
|
||||||
|
LocalDate creationDate,
|
||||||
|
ProjectDecisionValue projectStatus,
|
||||||
|
Administrator projectAdministrator) {
|
||||||
|
this.projectName = projectName;
|
||||||
|
this.logo = logo;
|
||||||
|
this.creationDate = creationDate;
|
||||||
|
// this.projectStatus = (long) projectStatus.ordinal();
|
||||||
|
this.projectStatus = projectStatus;
|
||||||
|
this.projectAdministrator = projectAdministrator;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Project(
|
||||||
|
String projectName,
|
||||||
|
byte[] logo,
|
||||||
|
LocalDate creationDate,
|
||||||
|
ProjectDecisionValue projectStatus,
|
||||||
|
Administrator projectAdministrator,
|
||||||
|
Entrepreneur entrepreneurProposed) {
|
||||||
|
this.projectName = projectName;
|
||||||
|
this.logo = logo;
|
||||||
|
this.creationDate = creationDate;
|
||||||
|
this.projectStatus = projectStatus;
|
||||||
|
this.projectAdministrator = projectAdministrator;
|
||||||
|
this.entrepreneurProposed = entrepreneurProposed;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getIdProject() {
|
||||||
|
return idProject;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setIdProject(Long idProject) {
|
||||||
|
this.idProject = idProject;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getProjectName() {
|
||||||
|
return projectName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setProjectName(String projectName) {
|
||||||
|
this.projectName = projectName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte[] getLogo() {
|
||||||
|
return logo;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLogo(byte[] logo) {
|
||||||
|
this.logo = logo;
|
||||||
|
}
|
||||||
|
|
||||||
|
public LocalDate getCreationDate() {
|
||||||
|
return creationDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCreationDate(LocalDate creationDate) {
|
||||||
|
this.creationDate = creationDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ProjectDecisionValue getProjectStatus() {
|
||||||
|
return projectStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setProjectStatus(ProjectDecisionValue projectStatus) {
|
||||||
|
this.projectStatus = projectStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Entrepreneur> getListEntrepreneurParticipation() {
|
||||||
|
return listEntrepreneurParticipation;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateListEntrepreneurParticipation(Entrepreneur projectParticipant) {
|
||||||
|
listEntrepreneurParticipation.add(projectParticipant);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<SectionCell> getListSectionCell() {
|
||||||
|
return listSectionCell;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateListSectionCell(SectionCell projectSectionCell) {
|
||||||
|
listSectionCell.add(projectSectionCell);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Administrator getProjectAdministrator() {
|
||||||
|
return projectAdministrator;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setProjectAdministrator(Administrator projectAdministrator) {
|
||||||
|
this.projectAdministrator = projectAdministrator;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Entrepreneur getEntrepreneurProposed() {
|
||||||
|
return entrepreneurProposed;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setEntrepreneurProposed(Entrepreneur entrepreneurProposed) {
|
||||||
|
this.entrepreneurProposed = entrepreneurProposed;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,25 @@
|
|||||||
|
package enseirb.myinpulse.model;
|
||||||
|
|
||||||
|
public class ProjectDecision {
|
||||||
|
public long projectId;
|
||||||
|
public long adminId;
|
||||||
|
public long isAccepted;
|
||||||
|
|
||||||
|
public ProjectDecision(long projectId, long adminId, long isAccepted) {
|
||||||
|
this.projectId = projectId;
|
||||||
|
this.adminId = adminId;
|
||||||
|
this.isAccepted = isAccepted;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "ProjectDecision{"
|
||||||
|
+ "projectId="
|
||||||
|
+ projectId
|
||||||
|
+ ", adminId="
|
||||||
|
+ adminId
|
||||||
|
+ ", isAccepted="
|
||||||
|
+ isAccepted
|
||||||
|
+ '}';
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,9 @@
|
|||||||
|
package enseirb.myinpulse.model;
|
||||||
|
|
||||||
|
public enum ProjectDecisionValue {
|
||||||
|
PENDING,
|
||||||
|
ACTIVE,
|
||||||
|
ENDED,
|
||||||
|
ABORTED,
|
||||||
|
REJECTED,
|
||||||
|
}
|
@ -0,0 +1,48 @@
|
|||||||
|
package enseirb.myinpulse.model;
|
||||||
|
|
||||||
|
import jakarta.persistence.*;
|
||||||
|
import jakarta.persistence.Entity;
|
||||||
|
import jakarta.persistence.Id;
|
||||||
|
import jakarta.persistence.Table;
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
@Table(name = "report")
|
||||||
|
public class Report {
|
||||||
|
|
||||||
|
@Id
|
||||||
|
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||||
|
private Long idReport;
|
||||||
|
|
||||||
|
private String reportContent;
|
||||||
|
|
||||||
|
@OneToOne(fetch = FetchType.LAZY)
|
||||||
|
@JoinColumn(name = "idAppointment")
|
||||||
|
private Appointment appointmentReport;
|
||||||
|
|
||||||
|
public Report() {}
|
||||||
|
|
||||||
|
public Report(Long idReport, String reportContent) {
|
||||||
|
this.idReport = idReport;
|
||||||
|
this.reportContent = reportContent;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getIdReport() {
|
||||||
|
return idReport;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getReportContent() {
|
||||||
|
return reportContent;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setReportContent(String reportContent) {
|
||||||
|
this.reportContent = reportContent;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Appointment getAppointmentReport() {
|
||||||
|
return appointmentReport;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAppointmentReport(Appointment appointmentReport) {
|
||||||
|
this.appointmentReport = appointmentReport;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
package enseirb.myinpulse.model;
|
||||||
|
|
||||||
|
public class RoleRepresentation {
|
||||||
|
public String id;
|
||||||
|
public String name;
|
||||||
|
public String description;
|
||||||
|
}
|
@ -0,0 +1,110 @@
|
|||||||
|
package enseirb.myinpulse.model;
|
||||||
|
|
||||||
|
import jakarta.persistence.*;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
@Table(name = "section_cell")
|
||||||
|
public class SectionCell {
|
||||||
|
|
||||||
|
@ManyToMany(mappedBy = "listSectionCell")
|
||||||
|
private final List<Appointment> listAppointment = new ArrayList<>();
|
||||||
|
|
||||||
|
@OneToMany(mappedBy = "sectionCellAnnotation", fetch = FetchType.LAZY, orphanRemoval = true)
|
||||||
|
private final List<Annotation> listAnnotation = new ArrayList<>();
|
||||||
|
|
||||||
|
@Id
|
||||||
|
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||||
|
private Long idSectionCell;
|
||||||
|
|
||||||
|
@Column() private long sectionId;
|
||||||
|
private String contentSectionCell;
|
||||||
|
|
||||||
|
/*@ManyToOne(fetch = FetchType.LAZY)
|
||||||
|
@JoinColumn(name = "idAdministrator")
|
||||||
|
private Administrator administratorSectionCell;*/
|
||||||
|
// should now be useless
|
||||||
|
private LocalDateTime modificationDate;
|
||||||
|
|
||||||
|
@ManyToOne(fetch = FetchType.LAZY)
|
||||||
|
@JoinColumn(name = "idProject")
|
||||||
|
private Project projectSectionCell;
|
||||||
|
|
||||||
|
public SectionCell() {}
|
||||||
|
|
||||||
|
public SectionCell(
|
||||||
|
Long idSectionCell,
|
||||||
|
Long sectionId,
|
||||||
|
String contentSectionCell,
|
||||||
|
LocalDateTime modificationDate,
|
||||||
|
Project projectSectionCell) {
|
||||||
|
this.idSectionCell = idSectionCell;
|
||||||
|
this.sectionId = sectionId;
|
||||||
|
this.contentSectionCell = contentSectionCell;
|
||||||
|
this.modificationDate = modificationDate;
|
||||||
|
this.projectSectionCell = projectSectionCell;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getIdSectionCell() {
|
||||||
|
return idSectionCell;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setIdSectionCell(Long idSectionCell) {
|
||||||
|
this.idSectionCell = idSectionCell;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getSectionId() {
|
||||||
|
return sectionId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSectionId(Long sectionId) {
|
||||||
|
this.sectionId = sectionId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getContentSectionCell() {
|
||||||
|
return contentSectionCell;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setContentSectionCell(String contentSectionCell) {
|
||||||
|
this.contentSectionCell = contentSectionCell;
|
||||||
|
}
|
||||||
|
|
||||||
|
public LocalDateTime getModificationDate() {
|
||||||
|
return modificationDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setModificationDate(LocalDateTime modificationDate) {
|
||||||
|
this.modificationDate = modificationDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Project getProjectSectionCell() {
|
||||||
|
return projectSectionCell;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Appointment> getAppointmentSectionCell() {
|
||||||
|
return listAppointment;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateAppointmentSectionCell(Appointment appointment) {
|
||||||
|
listAppointment.add(appointment);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Annotation> getListAnnotation() {
|
||||||
|
return listAnnotation;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateListAnnotation(Annotation annotation) {
|
||||||
|
listAnnotation.add(annotation);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSectionId(long sectionId) {
|
||||||
|
this.sectionId = sectionId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setProjectSectionCell(Project projectSectionCell) {
|
||||||
|
this.projectSectionCell = projectSectionCell;
|
||||||
|
}
|
||||||
|
}
|
108
MyINPulse-back/src/main/java/enseirb/myinpulse/model/User.java
Normal file
108
MyINPulse-back/src/main/java/enseirb/myinpulse/model/User.java
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
package enseirb.myinpulse.model;
|
||||||
|
|
||||||
|
import jakarta.persistence.*;
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
@Table(name = "user_inpulse")
|
||||||
|
@Inheritance(strategy = InheritanceType.JOINED)
|
||||||
|
public class User {
|
||||||
|
|
||||||
|
@Id
|
||||||
|
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||||
|
private Long idUser;
|
||||||
|
|
||||||
|
@Column(length = 255)
|
||||||
|
private String userSurname;
|
||||||
|
|
||||||
|
@Column(length = 255)
|
||||||
|
private String userName;
|
||||||
|
|
||||||
|
@Column(length = 255)
|
||||||
|
private String primaryMail;
|
||||||
|
|
||||||
|
@Column(length = 255)
|
||||||
|
private String secondaryMail;
|
||||||
|
|
||||||
|
@Column(length = 20)
|
||||||
|
private String phoneNumber;
|
||||||
|
|
||||||
|
public User() {}
|
||||||
|
|
||||||
|
// TODO: this should be removed as we shouldn't be able to chose the ID. Leaving it for
|
||||||
|
// compatibility purposes, as soon as it's not used anymore, delete it
|
||||||
|
public User(
|
||||||
|
Long idUser,
|
||||||
|
String userSurname,
|
||||||
|
String userName,
|
||||||
|
String primaryMail,
|
||||||
|
String secondaryMail,
|
||||||
|
String phoneNumber) {
|
||||||
|
this.idUser = idUser;
|
||||||
|
this.userSurname = userSurname;
|
||||||
|
this.userName = userName;
|
||||||
|
this.primaryMail = primaryMail;
|
||||||
|
this.secondaryMail = secondaryMail;
|
||||||
|
this.phoneNumber = phoneNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
public User(
|
||||||
|
String userSurname,
|
||||||
|
String userName,
|
||||||
|
String primaryMail,
|
||||||
|
String secondaryMail,
|
||||||
|
String phoneNumber) {
|
||||||
|
this.userSurname = userSurname;
|
||||||
|
this.userName = userName;
|
||||||
|
this.primaryMail = primaryMail;
|
||||||
|
this.secondaryMail = secondaryMail;
|
||||||
|
this.phoneNumber = phoneNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getIdUser() {
|
||||||
|
return idUser;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setIdUser(Long idUser) {
|
||||||
|
this.idUser = idUser;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getUserSurname() {
|
||||||
|
return userSurname;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUserSurname(String userSurname) {
|
||||||
|
userSurname = userSurname;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getUserName() {
|
||||||
|
return userName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUserName(String userName) {
|
||||||
|
userName = userName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPrimaryMail() {
|
||||||
|
return primaryMail;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPrimaryMail(String primaryMail) {
|
||||||
|
this.primaryMail = primaryMail;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSecondaryMail() {
|
||||||
|
return secondaryMail;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSecondaryMail(String secondaryMail) {
|
||||||
|
this.secondaryMail = secondaryMail;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPhoneNumber() {
|
||||||
|
return phoneNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPhoneNumber(String phoneNumber) {
|
||||||
|
phoneNumber = phoneNumber;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,6 @@
|
|||||||
|
package enseirb.myinpulse.model;
|
||||||
|
|
||||||
|
public class UserRepresentation {
|
||||||
|
public String id;
|
||||||
|
public String name;
|
||||||
|
}
|
@ -1,37 +0,0 @@
|
|||||||
package enseirb.myinpulse.postgres_db.controller;
|
|
||||||
|
|
||||||
import enseirb.myinpulse.postgres_db.repository.AdministrateursRepository;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.http.HttpStatus;
|
|
||||||
import org.springframework.web.bind.annotation.*;
|
|
||||||
import enseirb.myinpulse.postgres_db.model.Administrateurs;
|
|
||||||
import org.springframework.web.server.ResponseStatusException;
|
|
||||||
|
|
||||||
import java.util.Optional;
|
|
||||||
|
|
||||||
@RestController
|
|
||||||
public class AdministrateursController {
|
|
||||||
|
|
||||||
@Autowired AdministrateursRepository administrateursRepository;
|
|
||||||
|
|
||||||
@GetMapping("/Administrateurs")
|
|
||||||
@ResponseBody
|
|
||||||
public Iterable<Administrateurs> allAdministrateurs() {
|
|
||||||
return this.administrateursRepository.findAll();
|
|
||||||
}
|
|
||||||
|
|
||||||
@GetMapping("/Administrateurs/{id}")
|
|
||||||
public Administrateurs getAdministrateursById(@PathVariable Long id) {
|
|
||||||
Optional<Administrateurs> administrateur = this.administrateursRepository.findById(id);
|
|
||||||
if (administrateur.isEmpty()) {
|
|
||||||
throw new ResponseStatusException(
|
|
||||||
HttpStatus.NOT_FOUND, "Cet administrateur n'existe pas");
|
|
||||||
}
|
|
||||||
return administrateur.get();
|
|
||||||
}
|
|
||||||
|
|
||||||
@PostMapping("/Administrateurs")
|
|
||||||
public Administrateurs addAdministrateurs(@RequestBody Administrateurs administrateurs) {
|
|
||||||
return this.administrateursRepository.save(administrateurs);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,48 +0,0 @@
|
|||||||
package enseirb.myinpulse.postgres_db.controller;
|
|
||||||
|
|
||||||
import enseirb.myinpulse.postgres_db.repository.ComptesRendusRepository;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.http.HttpStatus;
|
|
||||||
import org.springframework.web.bind.annotation.*;
|
|
||||||
import enseirb.myinpulse.postgres_db.model.ComptesRendus;
|
|
||||||
import org.springframework.web.server.ResponseStatusException;
|
|
||||||
|
|
||||||
import java.util.Optional;
|
|
||||||
|
|
||||||
@RestController
|
|
||||||
public class ComptesRendusController {
|
|
||||||
|
|
||||||
@Autowired ComptesRendusRepository comptesRendusRepository;
|
|
||||||
|
|
||||||
@GetMapping("/ComptesRendus")
|
|
||||||
@ResponseBody
|
|
||||||
public Iterable<ComptesRendus> allComptesRendus() {
|
|
||||||
return this.comptesRendusRepository.findAll();
|
|
||||||
}
|
|
||||||
|
|
||||||
@GetMapping("/ComptesRendus/{id}")
|
|
||||||
public ComptesRendus getComptesRendusById(@PathVariable Long id) {
|
|
||||||
Optional<ComptesRendus> compteRendu = this.comptesRendusRepository.findById(id);
|
|
||||||
if (compteRendu.isEmpty()) {
|
|
||||||
throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Ce compte rendu n'existe pas");
|
|
||||||
}
|
|
||||||
return compteRendu.get();
|
|
||||||
}
|
|
||||||
|
|
||||||
@PostMapping("/ComptesRendus")
|
|
||||||
public ComptesRendus addComptesRendus(@RequestBody ComptesRendus comptesRendus) {
|
|
||||||
return this.comptesRendusRepository.save(comptesRendus);
|
|
||||||
}
|
|
||||||
|
|
||||||
@PostMapping("/ComptesRendus/{id}")
|
|
||||||
public ComptesRendus updateProjets(@PathVariable Long id, String contenu_compte_rendu) {
|
|
||||||
Optional<ComptesRendus> compteRendu = this.comptesRendusRepository.findById(id);
|
|
||||||
if (compteRendu.isEmpty()) {
|
|
||||||
throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Ce compte rendu n'existe pas");
|
|
||||||
}
|
|
||||||
if (contenu_compte_rendu != null) {
|
|
||||||
compteRendu.get().setContenu_compte_rendu(contenu_compte_rendu);
|
|
||||||
}
|
|
||||||
return compteRendu.get();
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,57 +0,0 @@
|
|||||||
package enseirb.myinpulse.postgres_db.controller;
|
|
||||||
|
|
||||||
import enseirb.myinpulse.postgres_db.repository.EntrepreneursRepository;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.http.HttpStatus;
|
|
||||||
import org.springframework.web.bind.annotation.*;
|
|
||||||
import enseirb.myinpulse.postgres_db.model.Entrepreneurs;
|
|
||||||
import org.springframework.web.server.ResponseStatusException;
|
|
||||||
|
|
||||||
import java.util.Optional;
|
|
||||||
|
|
||||||
@RestController
|
|
||||||
public class EntrepreneursController {
|
|
||||||
|
|
||||||
@Autowired EntrepreneursRepository entrepreneursRepository;
|
|
||||||
|
|
||||||
@GetMapping("/Entrepreneurs")
|
|
||||||
@ResponseBody
|
|
||||||
public Iterable<Entrepreneurs> allEntrepreneurs() {
|
|
||||||
return this.entrepreneursRepository.findAll();
|
|
||||||
}
|
|
||||||
|
|
||||||
@GetMapping("/Entrepreneurs/{id}")
|
|
||||||
public Entrepreneurs getEntrepreneursById(@PathVariable Long id) {
|
|
||||||
Optional<Entrepreneurs> entrepreneur = entrepreneursRepository.findById(id);
|
|
||||||
if (entrepreneur.isEmpty()) {
|
|
||||||
throw new ResponseStatusException(
|
|
||||||
HttpStatus.NOT_FOUND, "Cet entrepreneur n'existe pas");
|
|
||||||
}
|
|
||||||
return entrepreneur.get();
|
|
||||||
}
|
|
||||||
|
|
||||||
@PostMapping("/Entrepreneurs")
|
|
||||||
public Entrepreneurs addEntrepreneurs(@RequestBody Entrepreneurs entrepreneurs) {
|
|
||||||
return this.entrepreneursRepository.save(entrepreneurs);
|
|
||||||
}
|
|
||||||
|
|
||||||
@PostMapping("/Entrepreneurs/{id}")
|
|
||||||
public Entrepreneurs updateEntrepreneurs(
|
|
||||||
@PathVariable Long id, String ecole, String filiere, Boolean status_snee) {
|
|
||||||
Optional<Entrepreneurs> entrepreneur = entrepreneursRepository.findById(id);
|
|
||||||
if (entrepreneur.isEmpty()) {
|
|
||||||
throw new ResponseStatusException(
|
|
||||||
HttpStatus.NOT_FOUND, "Cet entrepreneur n'existe pas");
|
|
||||||
}
|
|
||||||
if (ecole != null) {
|
|
||||||
entrepreneur.get().setEcole(ecole);
|
|
||||||
}
|
|
||||||
if (filiere != null) {
|
|
||||||
entrepreneur.get().setFiliere(filiere);
|
|
||||||
}
|
|
||||||
if (status_snee != null) {
|
|
||||||
entrepreneur.get().setStatus_snee(status_snee);
|
|
||||||
}
|
|
||||||
return entrepreneur.get();
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,63 +0,0 @@
|
|||||||
package enseirb.myinpulse.postgres_db.controller;
|
|
||||||
|
|
||||||
import enseirb.myinpulse.postgres_db.repository.ProjetsRepository;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.http.HttpStatus;
|
|
||||||
import org.springframework.web.bind.annotation.*;
|
|
||||||
import enseirb.myinpulse.postgres_db.model.Projets;
|
|
||||||
import org.springframework.web.server.ResponseStatusException;
|
|
||||||
|
|
||||||
import java.time.LocalDate;
|
|
||||||
import java.util.Optional;
|
|
||||||
|
|
||||||
@RestController
|
|
||||||
public class ProjetsController {
|
|
||||||
|
|
||||||
@Autowired ProjetsRepository projetsRepository;
|
|
||||||
|
|
||||||
@GetMapping("/Projets")
|
|
||||||
@ResponseBody
|
|
||||||
public Iterable<Projets> allProjets() {
|
|
||||||
return this.projetsRepository.findAll();
|
|
||||||
}
|
|
||||||
|
|
||||||
@GetMapping("/Projets/{id}")
|
|
||||||
public Projets getProjetsById(@PathVariable Long id) {
|
|
||||||
Optional<Projets> projet = this.projetsRepository.findById(id);
|
|
||||||
if (projet.isEmpty()) {
|
|
||||||
throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Ce projet n'existe pas");
|
|
||||||
}
|
|
||||||
return projet.get();
|
|
||||||
}
|
|
||||||
|
|
||||||
@PostMapping("/Projets")
|
|
||||||
public Projets addProjets(@RequestBody Projets projet) {
|
|
||||||
return this.projetsRepository.save(projet);
|
|
||||||
}
|
|
||||||
|
|
||||||
@PostMapping("/Projets/{id}")
|
|
||||||
public Projets updateProjets(
|
|
||||||
@PathVariable Long id,
|
|
||||||
String nom_projet,
|
|
||||||
Byte[] logo,
|
|
||||||
LocalDate date_creation,
|
|
||||||
String status_projet) {
|
|
||||||
Optional<Projets> projet = this.projetsRepository.findById(id);
|
|
||||||
if (projet.isEmpty()) {
|
|
||||||
throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Ce projet n'existe pas");
|
|
||||||
}
|
|
||||||
if (nom_projet != null) {
|
|
||||||
projet.get().setNom_projet(nom_projet);
|
|
||||||
}
|
|
||||||
if (logo != null) {
|
|
||||||
projet.get().setLogo(logo);
|
|
||||||
}
|
|
||||||
if (date_creation != null) {
|
|
||||||
projet.get().setDate_creation(date_creation);
|
|
||||||
}
|
|
||||||
if (status_projet != null) {
|
|
||||||
projet.get().setStatus_projet(status_projet);
|
|
||||||
}
|
|
||||||
return projet.get();
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,68 +0,0 @@
|
|||||||
package enseirb.myinpulse.postgres_db.controller;
|
|
||||||
|
|
||||||
import enseirb.myinpulse.postgres_db.repository.RendezVousRepository;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.http.HttpStatus;
|
|
||||||
import org.springframework.web.bind.annotation.*;
|
|
||||||
import enseirb.myinpulse.postgres_db.model.RendezVous;
|
|
||||||
import org.springframework.web.server.ResponseStatusException;
|
|
||||||
|
|
||||||
import java.time.LocalDate;
|
|
||||||
import java.time.LocalDateTime;
|
|
||||||
import java.util.Optional;
|
|
||||||
|
|
||||||
@RestController
|
|
||||||
public class RendezVousController {
|
|
||||||
|
|
||||||
@Autowired RendezVousRepository rendezVousRepository;
|
|
||||||
|
|
||||||
@GetMapping("/RendezVous")
|
|
||||||
@ResponseBody
|
|
||||||
public Iterable<RendezVous> allRendezVous() {
|
|
||||||
return this.rendezVousRepository.findAll();
|
|
||||||
}
|
|
||||||
|
|
||||||
@GetMapping("/RendezVous/{id}")
|
|
||||||
public RendezVous getRendezVousById(@PathVariable Long id) {
|
|
||||||
Optional<RendezVous> rendezVous = this.rendezVousRepository.findById(id);
|
|
||||||
if (rendezVous.isEmpty()) {
|
|
||||||
throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Ce rendez vous n'existe pas");
|
|
||||||
}
|
|
||||||
return rendezVous.get();
|
|
||||||
}
|
|
||||||
|
|
||||||
@PostMapping("/RendezVous")
|
|
||||||
public RendezVous addRendezVous(@RequestBody RendezVous rendezVous) {
|
|
||||||
return this.rendezVousRepository.save(rendezVous);
|
|
||||||
}
|
|
||||||
|
|
||||||
@PostMapping("/RendezVous/{id}")
|
|
||||||
public RendezVous updateRendezVous(
|
|
||||||
@PathVariable Long id,
|
|
||||||
LocalDate date_rdv,
|
|
||||||
LocalDateTime heure_rdv,
|
|
||||||
LocalDateTime duree_rdv,
|
|
||||||
String lieu_rdv,
|
|
||||||
String sujet_rdv) {
|
|
||||||
Optional<RendezVous> rendezVous = this.rendezVousRepository.findById(id);
|
|
||||||
if (rendezVous.isEmpty()) {
|
|
||||||
throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Ce rendez vous n'existe pas");
|
|
||||||
}
|
|
||||||
if (date_rdv != null) {
|
|
||||||
rendezVous.get().setDate_rdv(date_rdv);
|
|
||||||
}
|
|
||||||
if (heure_rdv != null) {
|
|
||||||
rendezVous.get().setHeure_rdv(heure_rdv);
|
|
||||||
}
|
|
||||||
if (duree_rdv != null) {
|
|
||||||
rendezVous.get().setDuree_rdv(duree_rdv);
|
|
||||||
}
|
|
||||||
if (lieu_rdv != null) {
|
|
||||||
rendezVous.get().setLieu_rdv(lieu_rdv);
|
|
||||||
}
|
|
||||||
if (sujet_rdv != null) {
|
|
||||||
rendezVous.get().setSujet_rdv(sujet_rdv);
|
|
||||||
}
|
|
||||||
return rendezVous.get();
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,59 +0,0 @@
|
|||||||
package enseirb.myinpulse.postgres_db.controller;
|
|
||||||
|
|
||||||
import enseirb.myinpulse.postgres_db.repository.SectionsRepository;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.http.HttpStatus;
|
|
||||||
import org.springframework.web.bind.annotation.*;
|
|
||||||
import enseirb.myinpulse.postgres_db.model.Sections;
|
|
||||||
import org.springframework.web.server.ResponseStatusException;
|
|
||||||
|
|
||||||
import java.time.LocalDateTime;
|
|
||||||
import java.util.Optional;
|
|
||||||
|
|
||||||
@RestController
|
|
||||||
public class SectionsController {
|
|
||||||
|
|
||||||
@Autowired SectionsRepository sectionsRepository;
|
|
||||||
|
|
||||||
@GetMapping("/Sections")
|
|
||||||
@ResponseBody
|
|
||||||
public Iterable<Sections> allSections() {
|
|
||||||
return this.sectionsRepository.findAll();
|
|
||||||
}
|
|
||||||
|
|
||||||
@GetMapping("/Sections/{id}")
|
|
||||||
public Sections getSectionsById(@PathVariable Long id) {
|
|
||||||
Optional<Sections> section = this.sectionsRepository.findById(id);
|
|
||||||
if (section.isEmpty()) {
|
|
||||||
throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Cette section n'extise pas");
|
|
||||||
}
|
|
||||||
return section.get();
|
|
||||||
}
|
|
||||||
|
|
||||||
@PostMapping("/Sections")
|
|
||||||
public Sections addSections(@RequestBody Sections sections) {
|
|
||||||
return this.sectionsRepository.save(sections);
|
|
||||||
}
|
|
||||||
|
|
||||||
@PostMapping("/Sections/{id}")
|
|
||||||
public Sections updateSections(
|
|
||||||
@PathVariable Long id,
|
|
||||||
String titre,
|
|
||||||
String contenu_section,
|
|
||||||
LocalDateTime date_modification) {
|
|
||||||
Optional<Sections> section = this.sectionsRepository.findById(id);
|
|
||||||
if (section.isEmpty()) {
|
|
||||||
throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Cette section n'extise pas");
|
|
||||||
}
|
|
||||||
if (titre != null) {
|
|
||||||
section.get().setTitre(titre);
|
|
||||||
}
|
|
||||||
if (contenu_section != null) {
|
|
||||||
section.get().setContenu_section(contenu_section);
|
|
||||||
}
|
|
||||||
if (date_modification != null) {
|
|
||||||
section.get().setDate_modification(date_modification);
|
|
||||||
}
|
|
||||||
return section.get();
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,66 +0,0 @@
|
|||||||
package enseirb.myinpulse.postgres_db.controller;
|
|
||||||
|
|
||||||
import enseirb.myinpulse.postgres_db.repository.UtilisateursRepository;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.http.HttpStatus;
|
|
||||||
import org.springframework.web.bind.annotation.*;
|
|
||||||
import enseirb.myinpulse.postgres_db.model.Utilisateurs;
|
|
||||||
import org.springframework.web.server.ResponseStatusException;
|
|
||||||
|
|
||||||
import java.util.Optional;
|
|
||||||
|
|
||||||
@RestController
|
|
||||||
public class UtilisateursController {
|
|
||||||
|
|
||||||
@Autowired UtilisateursRepository utilisateursRepository;
|
|
||||||
|
|
||||||
@GetMapping("/Utilisateurs")
|
|
||||||
@ResponseBody
|
|
||||||
public Iterable<Utilisateurs> allUtilisateurs() {
|
|
||||||
return this.utilisateursRepository.findAll();
|
|
||||||
}
|
|
||||||
|
|
||||||
@GetMapping("/Utilisateurs/{id}")
|
|
||||||
public Utilisateurs getUtilisateursById(@PathVariable Long id) {
|
|
||||||
Optional<Utilisateurs> utilisateur = utilisateursRepository.findById(id);
|
|
||||||
if (utilisateur.isEmpty()) {
|
|
||||||
throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Cet utilisateur n'existe pas");
|
|
||||||
}
|
|
||||||
return utilisateur.get();
|
|
||||||
}
|
|
||||||
|
|
||||||
@PostMapping("/Utilisateurs")
|
|
||||||
public Utilisateurs addUtilisateurs(@RequestBody Utilisateurs utilisateurs) {
|
|
||||||
return this.utilisateursRepository.save(utilisateurs);
|
|
||||||
}
|
|
||||||
|
|
||||||
@PostMapping("/Utilisateurs/{id}")
|
|
||||||
public Utilisateurs updateUtilisateurs(
|
|
||||||
@PathVariable Long id,
|
|
||||||
String nom_utilisateur,
|
|
||||||
String prenom_utilisateur,
|
|
||||||
String mail_principal,
|
|
||||||
String mail_secondaire,
|
|
||||||
String numero_telephone) {
|
|
||||||
Optional<Utilisateurs> utilisateur = utilisateursRepository.findById(id);
|
|
||||||
if (utilisateur.isEmpty()) {
|
|
||||||
throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Cet utilisateur n'existe pas");
|
|
||||||
}
|
|
||||||
if (nom_utilisateur != null) {
|
|
||||||
utilisateur.get().setNom_utilisateur(nom_utilisateur);
|
|
||||||
}
|
|
||||||
if (prenom_utilisateur != null) {
|
|
||||||
utilisateur.get().setPrenom_utilisateur(prenom_utilisateur);
|
|
||||||
}
|
|
||||||
if (mail_principal != null) {
|
|
||||||
utilisateur.get().setMail_principal(mail_principal);
|
|
||||||
}
|
|
||||||
if (mail_secondaire != null) {
|
|
||||||
utilisateur.get().setMail_secondaire(mail_secondaire);
|
|
||||||
}
|
|
||||||
if (numero_telephone != null) {
|
|
||||||
utilisateur.get().setNumero_telephone(numero_telephone);
|
|
||||||
}
|
|
||||||
return utilisateur.get();
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,43 +0,0 @@
|
|||||||
package enseirb.myinpulse.postgres_db.model;
|
|
||||||
|
|
||||||
import jakarta.persistence.*;
|
|
||||||
import jakarta.persistence.PrimaryKeyJoinColumn;
|
|
||||||
import jakarta.persistence.Table;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
@Entity
|
|
||||||
@Table(name = "administrateurs")
|
|
||||||
@PrimaryKeyJoinColumn(name = "id_administrateur")
|
|
||||||
public class Administrateurs extends Utilisateurs {
|
|
||||||
|
|
||||||
@ManyToOne(fetch = FetchType.LAZY)
|
|
||||||
@JoinColumn(name = "Projets.id_projets")
|
|
||||||
private Projets projets;
|
|
||||||
|
|
||||||
@OneToMany(mappedBy = "administrateurs", fetch = FetchType.LAZY, orphanRemoval = true)
|
|
||||||
private List<Sections> ListSections = new ArrayList<>();
|
|
||||||
|
|
||||||
@ManyToOne(fetch = FetchType.LAZY)
|
|
||||||
@JoinColumn(name = "RendezVous.id_rdv")
|
|
||||||
private RendezVous rendezVous;
|
|
||||||
|
|
||||||
public Administrateurs() {}
|
|
||||||
|
|
||||||
public Administrateurs(
|
|
||||||
String nom_utilisateur,
|
|
||||||
Long id_utilisateur,
|
|
||||||
String prenom_utilisateur,
|
|
||||||
String mail_principal,
|
|
||||||
String mail_secondaire,
|
|
||||||
String numero_telephone) {
|
|
||||||
super(
|
|
||||||
nom_utilisateur,
|
|
||||||
id_utilisateur,
|
|
||||||
prenom_utilisateur,
|
|
||||||
mail_principal,
|
|
||||||
mail_secondaire,
|
|
||||||
numero_telephone);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,46 +0,0 @@
|
|||||||
package enseirb.myinpulse.postgres_db.model;
|
|
||||||
|
|
||||||
import jakarta.persistence.Entity;
|
|
||||||
import jakarta.persistence.*;
|
|
||||||
import jakarta.persistence.Id;
|
|
||||||
import jakarta.persistence.Table;
|
|
||||||
import jakarta.validation.constraints.NotNull;
|
|
||||||
|
|
||||||
@Entity
|
|
||||||
@Table(name = "comptes_rendus")
|
|
||||||
public class ComptesRendus {
|
|
||||||
|
|
||||||
@Id
|
|
||||||
@NotNull
|
|
||||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
|
||||||
private Long id_compte_rendu;
|
|
||||||
|
|
||||||
private String contenu_compte_rendu;
|
|
||||||
|
|
||||||
@ManyToOne(fetch = FetchType.LAZY)
|
|
||||||
@JoinColumn(name = "RendezVous.id_rdv")
|
|
||||||
private RendezVous rendezVous;
|
|
||||||
|
|
||||||
public ComptesRendus() {}
|
|
||||||
|
|
||||||
public ComptesRendus(Long id_compte_rendu, String contenu_compte_rendu) {
|
|
||||||
this.id_compte_rendu = id_compte_rendu;
|
|
||||||
this.contenu_compte_rendu = contenu_compte_rendu;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Long getId_compte_rendu() {
|
|
||||||
return id_compte_rendu;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setId_compte_rendu(Long id_compte_rendu) {
|
|
||||||
this.id_compte_rendu = id_compte_rendu;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getContenu_compte_rendu() {
|
|
||||||
return contenu_compte_rendu;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setContenu_compte_rendu(String contenu_compte_rendu) {
|
|
||||||
this.contenu_compte_rendu = contenu_compte_rendu;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,79 +0,0 @@
|
|||||||
package enseirb.myinpulse.postgres_db.model;
|
|
||||||
|
|
||||||
import jakarta.persistence.Entity;
|
|
||||||
import jakarta.persistence.*;
|
|
||||||
import jakarta.persistence.Table;
|
|
||||||
|
|
||||||
@Entity
|
|
||||||
@Table(name = "entrepreneurs")
|
|
||||||
@PrimaryKeyJoinColumn(name = "id_entrepreneur")
|
|
||||||
public class Entrepreneurs extends Utilisateurs {
|
|
||||||
|
|
||||||
@Column(length = 255)
|
|
||||||
private String ecole;
|
|
||||||
|
|
||||||
@Column(length = 255)
|
|
||||||
private String filiere;
|
|
||||||
|
|
||||||
private boolean status_snee;
|
|
||||||
|
|
||||||
@ManyToOne(fetch = FetchType.LAZY)
|
|
||||||
@JoinColumn(name = "Projets.id_projets")
|
|
||||||
private Projets projets_participation;
|
|
||||||
|
|
||||||
@OneToOne(fetch = FetchType.LAZY)
|
|
||||||
@JoinColumn(name = "Projets.id_projets")
|
|
||||||
private Projets projets_propose;
|
|
||||||
|
|
||||||
@ManyToOne(fetch = FetchType.LAZY)
|
|
||||||
@JoinColumn(name = "RendezVous.id_rdv")
|
|
||||||
private RendezVous rendezVous;
|
|
||||||
|
|
||||||
public Entrepreneurs() {}
|
|
||||||
|
|
||||||
public Entrepreneurs(
|
|
||||||
String nom_utilisateur,
|
|
||||||
Long id_utilisateur,
|
|
||||||
String prenom_utilisateur,
|
|
||||||
String mail_principal,
|
|
||||||
String mail_secondaire,
|
|
||||||
String numero_telephone,
|
|
||||||
String ecole,
|
|
||||||
boolean status_snee,
|
|
||||||
String filiere) {
|
|
||||||
super(
|
|
||||||
nom_utilisateur,
|
|
||||||
id_utilisateur,
|
|
||||||
prenom_utilisateur,
|
|
||||||
mail_principal,
|
|
||||||
mail_secondaire,
|
|
||||||
numero_telephone);
|
|
||||||
this.ecole = ecole;
|
|
||||||
this.status_snee = status_snee;
|
|
||||||
this.filiere = filiere;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getEcole() {
|
|
||||||
return ecole;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setEcole(String ecole) {
|
|
||||||
this.ecole = ecole;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getFiliere() {
|
|
||||||
return filiere;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setFiliere(String filiere) {
|
|
||||||
this.filiere = filiere;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isStatus_snee() {
|
|
||||||
return status_snee;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setStatus_snee(boolean status_snee) {
|
|
||||||
this.status_snee = status_snee;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,98 +0,0 @@
|
|||||||
package enseirb.myinpulse.postgres_db.model;
|
|
||||||
|
|
||||||
import jakarta.persistence.*;
|
|
||||||
import jakarta.validation.constraints.NotNull;
|
|
||||||
|
|
||||||
import java.time.LocalDate;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
@Entity
|
|
||||||
@Table(name = "projets")
|
|
||||||
public class Projets {
|
|
||||||
|
|
||||||
@Id
|
|
||||||
@NotNull
|
|
||||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
|
||||||
private Long id_projet;
|
|
||||||
|
|
||||||
@Column(length = 255)
|
|
||||||
private String nom_projet;
|
|
||||||
|
|
||||||
private Byte[] logo;
|
|
||||||
|
|
||||||
private LocalDate date_creation;
|
|
||||||
|
|
||||||
@Column(length = 255)
|
|
||||||
private String status_projet;
|
|
||||||
|
|
||||||
@OneToMany(mappedBy = "projets", fetch = FetchType.LAZY, orphanRemoval = true)
|
|
||||||
private List<Administrateurs> listAdministrateurs = new ArrayList<>();
|
|
||||||
|
|
||||||
@OneToMany(mappedBy = "projets", fetch = FetchType.LAZY, orphanRemoval = true)
|
|
||||||
private List<Entrepreneurs> ListEntrepreneursParticipation = new ArrayList<>();
|
|
||||||
|
|
||||||
@OneToOne(mappedBy = "projets", fetch = FetchType.LAZY, orphanRemoval = true)
|
|
||||||
private Entrepreneurs entrepreneurs_propose;
|
|
||||||
|
|
||||||
@OneToMany(mappedBy = "projets", fetch = FetchType.LAZY, orphanRemoval = true)
|
|
||||||
private List<Sections> ListSections = new ArrayList<>();
|
|
||||||
|
|
||||||
// Hibernate expects entities to have a no-arg constructor,
|
|
||||||
// though it does not necessarily have to be public.
|
|
||||||
|
|
||||||
public Projets() {}
|
|
||||||
|
|
||||||
public Projets(
|
|
||||||
Long id_projet,
|
|
||||||
String nom_projet,
|
|
||||||
Byte[] logo,
|
|
||||||
LocalDate date_creation,
|
|
||||||
String status_projet) {
|
|
||||||
this.id_projet = id_projet;
|
|
||||||
this.nom_projet = nom_projet;
|
|
||||||
this.logo = logo;
|
|
||||||
this.date_creation = date_creation;
|
|
||||||
this.status_projet = status_projet;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Long getId_projet() {
|
|
||||||
return id_projet;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setId_projet(Long id_projet) {
|
|
||||||
this.id_projet = id_projet;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getNom_projet() {
|
|
||||||
return nom_projet;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setNom_projet(String nom_projet) {
|
|
||||||
this.nom_projet = nom_projet;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Byte[] getLogo() {
|
|
||||||
return logo;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setLogo(Byte[] logo) {
|
|
||||||
this.logo = logo;
|
|
||||||
}
|
|
||||||
|
|
||||||
public LocalDate getDate_creation() {
|
|
||||||
return date_creation;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setDate_creation(LocalDate date_creation) {
|
|
||||||
this.date_creation = date_creation;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getStatus_projet() {
|
|
||||||
return status_projet;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setStatus_projet(String status_projet) {
|
|
||||||
this.status_projet = status_projet;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,113 +0,0 @@
|
|||||||
package enseirb.myinpulse.postgres_db.model;
|
|
||||||
|
|
||||||
import jakarta.persistence.*;
|
|
||||||
import jakarta.validation.constraints.NotNull;
|
|
||||||
|
|
||||||
import java.time.LocalDate;
|
|
||||||
import java.time.LocalDateTime;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
@Entity
|
|
||||||
@Table(name = "rendez_vous")
|
|
||||||
public class RendezVous {
|
|
||||||
|
|
||||||
@Id
|
|
||||||
@NotNull
|
|
||||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
|
||||||
private Long id_rdv;
|
|
||||||
|
|
||||||
private LocalDate date_rdv;
|
|
||||||
|
|
||||||
private LocalDateTime heure_rdv;
|
|
||||||
|
|
||||||
private LocalDateTime duree_rdv;
|
|
||||||
|
|
||||||
@Column(length = 255)
|
|
||||||
private String lieu_rdv;
|
|
||||||
|
|
||||||
private String sujet_rdv;
|
|
||||||
|
|
||||||
@OneToMany(mappedBy = "rendez_vous", fetch = FetchType.LAZY, orphanRemoval = true)
|
|
||||||
private List<Entrepreneurs> ListEntrepreneurs = new ArrayList<>();
|
|
||||||
|
|
||||||
@OneToMany(mappedBy = "rendez_vous", fetch = FetchType.LAZY, orphanRemoval = true)
|
|
||||||
private List<Administrateurs> ListAdministrateurs = new ArrayList<>();
|
|
||||||
|
|
||||||
@OneToMany(mappedBy = "rendez_vous", fetch = FetchType.LAZY, orphanRemoval = true)
|
|
||||||
private List<ComptesRendus> ListComptesRendus = new ArrayList<>();
|
|
||||||
|
|
||||||
@ManyToMany(
|
|
||||||
fetch = FetchType.LAZY,
|
|
||||||
cascade = {CascadeType.ALL})
|
|
||||||
@JoinTable(
|
|
||||||
name = "concerner",
|
|
||||||
joinColumns = @JoinColumn(name = "id_rdv"),
|
|
||||||
inverseJoinColumns = @JoinColumn(name = "id_sections"))
|
|
||||||
List<Sections> ListSections = new ArrayList<>();
|
|
||||||
|
|
||||||
public RendezVous() {}
|
|
||||||
|
|
||||||
public RendezVous(
|
|
||||||
Long id_rdv,
|
|
||||||
LocalDate date_rdv,
|
|
||||||
LocalDateTime heure_rdv,
|
|
||||||
LocalDateTime duree_rdv,
|
|
||||||
String lieu_rdv,
|
|
||||||
String sujet_rdv) {
|
|
||||||
this.id_rdv = id_rdv;
|
|
||||||
this.date_rdv = date_rdv;
|
|
||||||
this.heure_rdv = heure_rdv;
|
|
||||||
this.duree_rdv = duree_rdv;
|
|
||||||
this.lieu_rdv = lieu_rdv;
|
|
||||||
this.sujet_rdv = sujet_rdv;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Long getId_rdv() {
|
|
||||||
return id_rdv;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setId_rdv(Long id_rdv) {
|
|
||||||
this.id_rdv = id_rdv;
|
|
||||||
}
|
|
||||||
|
|
||||||
public LocalDate getDate_rdv() {
|
|
||||||
return date_rdv;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setDate_rdv(LocalDate date_rdv) {
|
|
||||||
this.date_rdv = date_rdv;
|
|
||||||
}
|
|
||||||
|
|
||||||
public LocalDateTime getHeure_rdv() {
|
|
||||||
return heure_rdv;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setHeure_rdv(LocalDateTime heure_rdv) {
|
|
||||||
this.heure_rdv = heure_rdv;
|
|
||||||
}
|
|
||||||
|
|
||||||
public LocalDateTime getDuree_rdv() {
|
|
||||||
return duree_rdv;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setDuree_rdv(LocalDateTime duree_rdv) {
|
|
||||||
this.duree_rdv = duree_rdv;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getLieu_rdv() {
|
|
||||||
return lieu_rdv;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setLieu_rdv(String lieu_rdv) {
|
|
||||||
this.lieu_rdv = lieu_rdv;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getSujet_rdv() {
|
|
||||||
return sujet_rdv;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setSujet_rdv(String sujet_rdv) {
|
|
||||||
this.sujet_rdv = sujet_rdv;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,81 +0,0 @@
|
|||||||
package enseirb.myinpulse.postgres_db.model;
|
|
||||||
|
|
||||||
import jakarta.persistence.*;
|
|
||||||
import jakarta.validation.constraints.NotNull;
|
|
||||||
|
|
||||||
import java.time.LocalDateTime;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
@Entity
|
|
||||||
@Table(name = "sections")
|
|
||||||
public class Sections {
|
|
||||||
|
|
||||||
@Id
|
|
||||||
@NotNull
|
|
||||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
|
||||||
private Long id_section;
|
|
||||||
|
|
||||||
@Column(length = 255)
|
|
||||||
private String titre;
|
|
||||||
|
|
||||||
private String contenu_section;
|
|
||||||
|
|
||||||
private LocalDateTime date_modification;
|
|
||||||
|
|
||||||
@ManyToOne(fetch = FetchType.LAZY)
|
|
||||||
@JoinColumn(name = "Projets.id_projets")
|
|
||||||
private Projets projets;
|
|
||||||
|
|
||||||
@ManyToOne(fetch = FetchType.LAZY)
|
|
||||||
@JoinColumn(name = "Administrateurs.id_admnistrateur")
|
|
||||||
private Administrateurs administrateurs;
|
|
||||||
|
|
||||||
@ManyToMany(mappedBy = "sections")
|
|
||||||
private List<RendezVous> rendezVous = new ArrayList<>();
|
|
||||||
|
|
||||||
public Sections() {}
|
|
||||||
|
|
||||||
public Sections(
|
|
||||||
Long id_section,
|
|
||||||
String titre,
|
|
||||||
String contenu_section,
|
|
||||||
LocalDateTime date_modification) {
|
|
||||||
this.id_section = id_section;
|
|
||||||
this.titre = titre;
|
|
||||||
this.contenu_section = contenu_section;
|
|
||||||
this.date_modification = date_modification;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getTitre() {
|
|
||||||
return titre;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setTitre(String titre) {
|
|
||||||
this.titre = titre;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Long getId_section() {
|
|
||||||
return id_section;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setId_section(Long id_section) {
|
|
||||||
this.id_section = id_section;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getContenu_section() {
|
|
||||||
return contenu_section;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setContenu_section(String contenu_section) {
|
|
||||||
this.contenu_section = contenu_section;
|
|
||||||
}
|
|
||||||
|
|
||||||
public LocalDateTime getDate_modification() {
|
|
||||||
return date_modification;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setDate_modification(LocalDateTime date_modification) {
|
|
||||||
this.date_modification = date_modification;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,95 +0,0 @@
|
|||||||
package enseirb.myinpulse.postgres_db.model;
|
|
||||||
|
|
||||||
import jakarta.persistence.*;
|
|
||||||
import jakarta.validation.constraints.NotNull;
|
|
||||||
|
|
||||||
@Entity
|
|
||||||
@Table(name = "utilisateurs")
|
|
||||||
@Inheritance(strategy = InheritanceType.JOINED)
|
|
||||||
public class Utilisateurs {
|
|
||||||
|
|
||||||
@Id
|
|
||||||
@NotNull
|
|
||||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
|
||||||
private Long id_utilisateur;
|
|
||||||
|
|
||||||
@Column(length = 255)
|
|
||||||
private String nom_utilisateur;
|
|
||||||
|
|
||||||
@Column(length = 255)
|
|
||||||
private String prenom_utilisateur;
|
|
||||||
|
|
||||||
@Column(length = 255)
|
|
||||||
private String mail_principal;
|
|
||||||
|
|
||||||
@Column(length = 255)
|
|
||||||
private String mail_secondaire;
|
|
||||||
|
|
||||||
@Column(length = 15)
|
|
||||||
private String numero_telephone;
|
|
||||||
|
|
||||||
public Utilisateurs() {}
|
|
||||||
|
|
||||||
public Utilisateurs(
|
|
||||||
String nom_utilisateur,
|
|
||||||
Long id_utilisateur,
|
|
||||||
String prenom_utilisateur,
|
|
||||||
String mail_principal,
|
|
||||||
String mail_secondaire,
|
|
||||||
String numero_telephone) {
|
|
||||||
this.nom_utilisateur = nom_utilisateur;
|
|
||||||
this.id_utilisateur = id_utilisateur;
|
|
||||||
this.prenom_utilisateur = prenom_utilisateur;
|
|
||||||
this.mail_principal = mail_principal;
|
|
||||||
this.mail_secondaire = mail_secondaire;
|
|
||||||
this.numero_telephone = numero_telephone;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Long getId_utilisateur() {
|
|
||||||
return id_utilisateur;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setId_utilisateur(Long id_utilisateur) {
|
|
||||||
this.id_utilisateur = id_utilisateur;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getNom_utilisateur() {
|
|
||||||
return nom_utilisateur;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setNom_utilisateur(String nom_utilisateur) {
|
|
||||||
this.nom_utilisateur = nom_utilisateur;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getPrenom_utilisateur() {
|
|
||||||
return prenom_utilisateur;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setPrenom_utilisateur(String prenom_utilisateur) {
|
|
||||||
this.prenom_utilisateur = prenom_utilisateur;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getMail_principal() {
|
|
||||||
return mail_principal;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setMail_principal(String mail_principal) {
|
|
||||||
this.mail_principal = mail_principal;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getMail_secondaire() {
|
|
||||||
return mail_secondaire;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setMail_secondaire(String mail_secondaire) {
|
|
||||||
this.mail_secondaire = mail_secondaire;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getNumero_telephone() {
|
|
||||||
return numero_telephone;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setNumero_telephone(String numero_telephone) {
|
|
||||||
this.numero_telephone = numero_telephone;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,13 +0,0 @@
|
|||||||
package enseirb.myinpulse.postgres_db.repository;
|
|
||||||
|
|
||||||
import enseirb.myinpulse.postgres_db.model.Administrateurs;
|
|
||||||
import org.springframework.data.jpa.repository.JpaRepository;
|
|
||||||
import org.springframework.data.rest.core.annotation.RepositoryRestResource;
|
|
||||||
|
|
||||||
@RepositoryRestResource
|
|
||||||
public interface AdministrateursRepository extends JpaRepository<Administrateurs, Long> {
|
|
||||||
|
|
||||||
/* @Query("SELECT a from Administrateurs a")
|
|
||||||
Administrateurs findAllAdministrateurs(); */
|
|
||||||
|
|
||||||
}
|
|
@ -1,8 +0,0 @@
|
|||||||
package enseirb.myinpulse.postgres_db.repository;
|
|
||||||
|
|
||||||
import enseirb.myinpulse.postgres_db.model.ComptesRendus;
|
|
||||||
import org.springframework.data.jpa.repository.JpaRepository;
|
|
||||||
import org.springframework.data.rest.core.annotation.RepositoryRestResource;
|
|
||||||
|
|
||||||
@RepositoryRestResource
|
|
||||||
public interface ComptesRendusRepository extends JpaRepository<ComptesRendus, Long> {}
|
|
@ -1,13 +0,0 @@
|
|||||||
package enseirb.myinpulse.postgres_db.repository;
|
|
||||||
|
|
||||||
import enseirb.myinpulse.postgres_db.model.Entrepreneurs;
|
|
||||||
import org.springframework.data.jpa.repository.JpaRepository;
|
|
||||||
import org.springframework.data.rest.core.annotation.RepositoryRestResource;
|
|
||||||
|
|
||||||
@RepositoryRestResource
|
|
||||||
public interface EntrepreneursRepository extends JpaRepository<Entrepreneurs, Long> {
|
|
||||||
|
|
||||||
/* @Query("SELECT e from Entrepreneurs e")
|
|
||||||
Entrepreneurs findAllEntrepreneurs(); */
|
|
||||||
|
|
||||||
}
|
|
@ -1,8 +0,0 @@
|
|||||||
package enseirb.myinpulse.postgres_db.repository;
|
|
||||||
|
|
||||||
import enseirb.myinpulse.postgres_db.model.Projets;
|
|
||||||
import org.springframework.data.jpa.repository.JpaRepository;
|
|
||||||
import org.springframework.data.rest.core.annotation.RepositoryRestResource;
|
|
||||||
|
|
||||||
@RepositoryRestResource
|
|
||||||
public interface ProjetsRepository extends JpaRepository<Projets, Long> {}
|
|
@ -1,8 +0,0 @@
|
|||||||
package enseirb.myinpulse.postgres_db.repository;
|
|
||||||
|
|
||||||
import enseirb.myinpulse.postgres_db.model.RendezVous;
|
|
||||||
import org.springframework.data.jpa.repository.JpaRepository;
|
|
||||||
import org.springframework.data.rest.core.annotation.RepositoryRestResource;
|
|
||||||
|
|
||||||
@RepositoryRestResource
|
|
||||||
public interface RendezVousRepository extends JpaRepository<RendezVous, Long> {}
|
|
@ -1,8 +0,0 @@
|
|||||||
package enseirb.myinpulse.postgres_db.repository;
|
|
||||||
|
|
||||||
import enseirb.myinpulse.postgres_db.model.Sections;
|
|
||||||
import org.springframework.data.jpa.repository.JpaRepository;
|
|
||||||
import org.springframework.data.rest.core.annotation.RepositoryRestResource;
|
|
||||||
|
|
||||||
@RepositoryRestResource
|
|
||||||
public interface SectionsRepository extends JpaRepository<Sections, Long> {}
|
|
@ -1,13 +0,0 @@
|
|||||||
package enseirb.myinpulse.postgres_db.repository;
|
|
||||||
|
|
||||||
import enseirb.myinpulse.postgres_db.model.Utilisateurs;
|
|
||||||
import org.springframework.data.jpa.repository.JpaRepository;
|
|
||||||
import org.springframework.data.rest.core.annotation.RepositoryRestResource;
|
|
||||||
|
|
||||||
@RepositoryRestResource
|
|
||||||
public interface UtilisateursRepository extends JpaRepository<Utilisateurs, Long> {
|
|
||||||
|
|
||||||
/* @Query("SELECT u from Utilisateurs u")
|
|
||||||
Utilisateurs findAllUtilisateurs(); */
|
|
||||||
|
|
||||||
}
|
|
@ -0,0 +1,17 @@
|
|||||||
|
package enseirb.myinpulse.repository;
|
||||||
|
|
||||||
|
import enseirb.myinpulse.model.Administrator;
|
||||||
|
|
||||||
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
import org.springframework.data.rest.core.annotation.RepositoryRestResource;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
@RepositoryRestResource
|
||||||
|
public interface AdministratorRepository extends JpaRepository<Administrator, Long> {
|
||||||
|
|
||||||
|
/* @Query("SELECT a from Administrators a")
|
||||||
|
Administrator findAllAdministrator(); */
|
||||||
|
|
||||||
|
Optional<Administrator> findByPrimaryMail(String PrimaryMail);
|
||||||
|
}
|
@ -0,0 +1,9 @@
|
|||||||
|
package enseirb.myinpulse.repository;
|
||||||
|
|
||||||
|
import enseirb.myinpulse.model.Annotation;
|
||||||
|
|
||||||
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
import org.springframework.data.rest.core.annotation.RepositoryRestResource;
|
||||||
|
|
||||||
|
@RepositoryRestResource
|
||||||
|
public interface AnnotationRepository extends JpaRepository<Annotation, Long> {}
|
@ -0,0 +1,9 @@
|
|||||||
|
package enseirb.myinpulse.repository;
|
||||||
|
|
||||||
|
import enseirb.myinpulse.model.Appointment;
|
||||||
|
|
||||||
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
import org.springframework.data.rest.core.annotation.RepositoryRestResource;
|
||||||
|
|
||||||
|
@RepositoryRestResource
|
||||||
|
public interface AppointmentRepository extends JpaRepository<Appointment, Long> {}
|
@ -0,0 +1,17 @@
|
|||||||
|
package enseirb.myinpulse.repository;
|
||||||
|
|
||||||
|
import enseirb.myinpulse.model.Entrepreneur;
|
||||||
|
import enseirb.myinpulse.model.Project;
|
||||||
|
|
||||||
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
import org.springframework.data.rest.core.annotation.RepositoryRestResource;
|
||||||
|
|
||||||
|
@RepositoryRestResource
|
||||||
|
public interface EntrepreneurRepository extends JpaRepository<Entrepreneur, Long> {
|
||||||
|
|
||||||
|
Iterable<Entrepreneur> getEntrepreneurByProjectParticipation(Project project);
|
||||||
|
|
||||||
|
/* @Query("SELECT e from Entrepreneur e")
|
||||||
|
Entrepreneur findAllEntrepreneurl(); */
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,9 @@
|
|||||||
|
package enseirb.myinpulse.repository;
|
||||||
|
|
||||||
|
import enseirb.myinpulse.model.MakeAppointment;
|
||||||
|
|
||||||
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
import org.springframework.data.rest.core.annotation.RepositoryRestResource;
|
||||||
|
|
||||||
|
@RepositoryRestResource
|
||||||
|
public interface MakeAppointmentRepository extends JpaRepository<MakeAppointment, Long> {}
|
@ -0,0 +1,19 @@
|
|||||||
|
package enseirb.myinpulse.repository;
|
||||||
|
|
||||||
|
import enseirb.myinpulse.model.Administrator;
|
||||||
|
import enseirb.myinpulse.model.Project;
|
||||||
|
import enseirb.myinpulse.model.ProjectDecisionValue;
|
||||||
|
|
||||||
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
import org.springframework.data.rest.core.annotation.RepositoryRestResource;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
@RepositoryRestResource
|
||||||
|
public interface ProjectRepository extends JpaRepository<Project, Long> {
|
||||||
|
Iterable<Project> findByProjectAdministrator(Administrator administrator);
|
||||||
|
|
||||||
|
Iterable<Project> findByProjectStatus(ProjectDecisionValue status);
|
||||||
|
|
||||||
|
Optional<Project> findByProjectName(String projectName);
|
||||||
|
}
|
@ -0,0 +1,9 @@
|
|||||||
|
package enseirb.myinpulse.repository;
|
||||||
|
|
||||||
|
import enseirb.myinpulse.model.Report;
|
||||||
|
|
||||||
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
import org.springframework.data.rest.core.annotation.RepositoryRestResource;
|
||||||
|
|
||||||
|
@RepositoryRestResource
|
||||||
|
public interface ReportRepository extends JpaRepository<Report, Long> {}
|
@ -0,0 +1,18 @@
|
|||||||
|
package enseirb.myinpulse.repository;
|
||||||
|
|
||||||
|
import enseirb.myinpulse.model.Project;
|
||||||
|
import enseirb.myinpulse.model.SectionCell;
|
||||||
|
|
||||||
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
import org.springframework.data.rest.core.annotation.RepositoryRestResource;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
|
@RepositoryRestResource
|
||||||
|
public interface SectionCellRepository extends JpaRepository<SectionCell, Long> {
|
||||||
|
|
||||||
|
Iterable<SectionCell> findByProjectSectionCellAndSectionId(Project project, long sectionId);
|
||||||
|
|
||||||
|
Iterable<SectionCell> findByProjectSectionCellAndSectionIdAndModificationDateBefore(
|
||||||
|
Project project, long sectionId, LocalDateTime date);
|
||||||
|
}
|
@ -0,0 +1,17 @@
|
|||||||
|
package enseirb.myinpulse.repository;
|
||||||
|
|
||||||
|
import enseirb.myinpulse.model.User;
|
||||||
|
|
||||||
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
import org.springframework.data.rest.core.annotation.RepositoryRestResource;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
@RepositoryRestResource
|
||||||
|
public interface UserRepository extends JpaRepository<User, Long> {
|
||||||
|
Optional<User> findByPrimaryMail(String email);
|
||||||
|
|
||||||
|
/* @Query("SELECT u from User u")
|
||||||
|
User findAllUser(); */
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,166 @@
|
|||||||
|
package enseirb.myinpulse.service;
|
||||||
|
|
||||||
|
import static enseirb.myinpulse.model.ProjectDecisionValue.ACTIVE;
|
||||||
|
import static enseirb.myinpulse.model.ProjectDecisionValue.REJECTED;
|
||||||
|
|
||||||
|
import enseirb.myinpulse.model.*;
|
||||||
|
import enseirb.myinpulse.service.database.*;
|
||||||
|
|
||||||
|
import org.apache.logging.log4j.LogManager;
|
||||||
|
import org.apache.logging.log4j.Logger;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.http.HttpStatus;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.web.server.ResponseStatusException;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class AdminApiService {
|
||||||
|
|
||||||
|
protected static final Logger logger = LogManager.getLogger();
|
||||||
|
|
||||||
|
private final ProjectService projectService;
|
||||||
|
private final UserService userService;
|
||||||
|
private final AdministratorService administratorService;
|
||||||
|
private final UtilsService utilsService;
|
||||||
|
private final AppointmentService appointmentService;
|
||||||
|
private final ReportService reportService;
|
||||||
|
private final SectionCellService sectionCellService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
AdminApiService(
|
||||||
|
ProjectService projectService,
|
||||||
|
UserService userService,
|
||||||
|
AdministratorService administratorService,
|
||||||
|
UtilsService utilsService,
|
||||||
|
AppointmentService appointmentService,
|
||||||
|
ReportService reportService,
|
||||||
|
SectionCellService sectionCellService) {
|
||||||
|
this.projectService = projectService;
|
||||||
|
this.userService = userService;
|
||||||
|
this.administratorService = administratorService;
|
||||||
|
this.utilsService = utilsService;
|
||||||
|
this.appointmentService = appointmentService;
|
||||||
|
this.reportService = reportService;
|
||||||
|
this.sectionCellService = sectionCellService;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: check if tests are sufficient - peer verification required
|
||||||
|
public Iterable<Project> getProjectsOfAdmin(String mail) {
|
||||||
|
return projectService.getProjectsByAdminId(
|
||||||
|
administratorService.getAdministratorById(
|
||||||
|
this.userService.getUserByEmail(mail).getIdUser()));
|
||||||
|
}
|
||||||
|
|
||||||
|
public Iterable<Appointment> getUpcomingAppointments(String mail) {
|
||||||
|
logger.info("User {} check their upcoming appointments", mail);
|
||||||
|
User user = this.userService.getUserByEmail(mail);
|
||||||
|
List<Appointment> appointments = new ArrayList<>();
|
||||||
|
if (user instanceof Administrator) {
|
||||||
|
List<Project> projects = new ArrayList<>(((Administrator) user).getListProject());
|
||||||
|
projects.forEach(
|
||||||
|
project -> {
|
||||||
|
project.getListSectionCell()
|
||||||
|
.forEach(
|
||||||
|
sectionCell -> {
|
||||||
|
appointments.addAll(
|
||||||
|
this.sectionCellService
|
||||||
|
.getAppointmentsBySectionCellId(
|
||||||
|
sectionCell
|
||||||
|
.getIdSectionCell()));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (user instanceof Entrepreneur) {
|
||||||
|
Project project = ((Entrepreneur) user).getProjectParticipation();
|
||||||
|
project.getListSectionCell()
|
||||||
|
.forEach(
|
||||||
|
sectionCell -> {
|
||||||
|
appointments.addAll(
|
||||||
|
this.sectionCellService.getAppointmentsBySectionCellId(
|
||||||
|
sectionCell.getIdSectionCell()));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return appointments;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: check if tests are sufficient - peer verification required
|
||||||
|
public Iterable<Project> getPendingProjects() {
|
||||||
|
return this.projectService.getPendingProjects();
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: check if tests are sufficient - peer verification required
|
||||||
|
public void validateProject(ProjectDecision decision) {
|
||||||
|
projectService.updateProject(
|
||||||
|
decision.projectId,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
(decision.isAccepted == 1) ? ACTIVE : REJECTED,
|
||||||
|
this.administratorService.getAdministratorById(decision.adminId));
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: check if tests are sufficient - peer verification required
|
||||||
|
public void addNewProject(Project project) {
|
||||||
|
project.setIdProject(null);
|
||||||
|
// We remove the ID from the request to be sure that it will be auto generated
|
||||||
|
try {
|
||||||
|
this.projectService.getProjectByName(project.getProjectName(), true);
|
||||||
|
throw new ResponseStatusException(HttpStatus.CONFLICT, "Project already exists");
|
||||||
|
} catch (ResponseStatusException e) {
|
||||||
|
if (e.getStatusCode() == HttpStatus.CONFLICT) {
|
||||||
|
throw new ResponseStatusException(HttpStatus.CONFLICT, "Project already exists");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Project newProject = projectService.addNewProject(project);
|
||||||
|
if (project.getProjectAdministrator() != null) {
|
||||||
|
newProject.getProjectAdministrator().updateListProject(newProject);
|
||||||
|
}
|
||||||
|
if (newProject.getEntrepreneurProposed() != null) {
|
||||||
|
Entrepreneur proposed = newProject.getEntrepreneurProposed();
|
||||||
|
proposed.setProjectProposed(newProject);
|
||||||
|
proposed.setProjectParticipation(newProject);
|
||||||
|
}
|
||||||
|
newProject
|
||||||
|
.getListEntrepreneurParticipation()
|
||||||
|
.forEach(
|
||||||
|
participation -> {
|
||||||
|
participation.setProjectParticipation(newProject);
|
||||||
|
});
|
||||||
|
newProject
|
||||||
|
.getListSectionCell()
|
||||||
|
.forEach(
|
||||||
|
sectionCell -> {
|
||||||
|
sectionCell.setProjectSectionCell(newProject);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public void createAppointmentReport(long appointmentId, Report report, String mail) {
|
||||||
|
long projectId =
|
||||||
|
this.appointmentService
|
||||||
|
.getAppointmentById(appointmentId)
|
||||||
|
.getAppointmentListSectionCell()
|
||||||
|
.getFirst()
|
||||||
|
.getProjectSectionCell()
|
||||||
|
.getIdProject();
|
||||||
|
if (!utilsService.isAllowedToCheckProject(mail, projectId)) {
|
||||||
|
logger.warn(
|
||||||
|
"User {} tried to add an report for appointment {} but is not allowed to.",
|
||||||
|
mail,
|
||||||
|
projectId);
|
||||||
|
throw new ResponseStatusException(
|
||||||
|
HttpStatus.UNAUTHORIZED, "You're not allowed to check this project");
|
||||||
|
}
|
||||||
|
logger.info("User {} added a report for appointment {}", mail, projectId);
|
||||||
|
Report addedReport = this.reportService.addNewReport(report);
|
||||||
|
addedReport.setAppointmentReport(this.appointmentService.getAppointmentById(appointmentId));
|
||||||
|
this.appointmentService.getAppointmentById(appointmentId).setAppointmentReport(addedReport);
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: test
|
||||||
|
public void deleteProject(long projectId) {
|
||||||
|
this.projectService.deleteProjectById(projectId);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,135 @@
|
|||||||
|
package enseirb.myinpulse.service;
|
||||||
|
|
||||||
|
import static enseirb.myinpulse.model.ProjectDecisionValue.PENDING;
|
||||||
|
|
||||||
|
import enseirb.myinpulse.model.Project;
|
||||||
|
import enseirb.myinpulse.model.SectionCell;
|
||||||
|
import enseirb.myinpulse.service.database.ProjectService;
|
||||||
|
import enseirb.myinpulse.service.database.SectionCellService;
|
||||||
|
|
||||||
|
import org.apache.logging.log4j.LogManager;
|
||||||
|
import org.apache.logging.log4j.Logger;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.http.HttpStatus;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.web.server.ResponseStatusException;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class EntrepreneurApiService {
|
||||||
|
|
||||||
|
protected static final Logger logger = LogManager.getLogger();
|
||||||
|
|
||||||
|
private final SectionCellService sectionCellService;
|
||||||
|
private final ProjectService projectService;
|
||||||
|
private final UtilsService utilsService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
EntrepreneurApiService(
|
||||||
|
SectionCellService sectionCellService,
|
||||||
|
ProjectService projectService,
|
||||||
|
UtilsService utilsService) {
|
||||||
|
this.sectionCellService = sectionCellService;
|
||||||
|
this.projectService = projectService;
|
||||||
|
this.utilsService = utilsService;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void editSectionCell(Long sectionCellId, SectionCell sectionCell, String mail) {
|
||||||
|
SectionCell editSectionCell = sectionCellService.getSectionCellById(sectionCellId);
|
||||||
|
if (editSectionCell == null) {
|
||||||
|
System.err.println("Trying to edit unknown section cell");
|
||||||
|
throw new ResponseStatusException(
|
||||||
|
HttpStatus.NOT_FOUND, "Cette cellule de section n'existe pas");
|
||||||
|
}
|
||||||
|
if (!utilsService.isAllowedToCheckProject(
|
||||||
|
mail, this.sectionCellService.getProjectId(sectionCellId))) {
|
||||||
|
logger.warn(
|
||||||
|
"User {} tried to edit section cells {} of the project {} but is not allowed to.",
|
||||||
|
mail,
|
||||||
|
sectionCellId,
|
||||||
|
this.sectionCellService.getProjectId(sectionCellId));
|
||||||
|
throw new ResponseStatusException(
|
||||||
|
HttpStatus.UNAUTHORIZED, "You're not allowed to check this project");
|
||||||
|
}
|
||||||
|
logger.info(
|
||||||
|
"User {} edited section cell {} of the project with id {}",
|
||||||
|
mail,
|
||||||
|
sectionCellId,
|
||||||
|
this.sectionCellService.getProjectId(sectionCellId));
|
||||||
|
sectionCellService.updateSectionCell(
|
||||||
|
sectionCellId,
|
||||||
|
sectionCell.getSectionId(),
|
||||||
|
sectionCell.getContentSectionCell(),
|
||||||
|
sectionCell.getModificationDate());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void removeSectionCell(Long sectionCellId, String mail) {
|
||||||
|
SectionCell editSectionCell = sectionCellService.getSectionCellById(sectionCellId);
|
||||||
|
if (editSectionCell == null) {
|
||||||
|
System.err.println("Trying to remove unknown section cell");
|
||||||
|
throw new ResponseStatusException(
|
||||||
|
HttpStatus.NOT_FOUND, "Cette cellule de section n'existe pas");
|
||||||
|
}
|
||||||
|
if (!utilsService.isAllowedToCheckProject(
|
||||||
|
mail, this.sectionCellService.getProjectId(sectionCellId))) {
|
||||||
|
logger.warn(
|
||||||
|
"User {} tried to remove section cells {} of the project {} but is not allowed to.",
|
||||||
|
mail,
|
||||||
|
sectionCellId,
|
||||||
|
this.sectionCellService.getSectionCellById(sectionCellId));
|
||||||
|
throw new ResponseStatusException(
|
||||||
|
HttpStatus.UNAUTHORIZED, "You're not allowed to check this project");
|
||||||
|
}
|
||||||
|
logger.info(
|
||||||
|
"User {} removed section cell {} of the project with id {}",
|
||||||
|
mail,
|
||||||
|
sectionCellId,
|
||||||
|
this.sectionCellService.getProjectId(sectionCellId));
|
||||||
|
sectionCellService.removeSectionCellById(sectionCellId);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addSectionCell(SectionCell sectionCell, String mail) {
|
||||||
|
if (sectionCell == null) {
|
||||||
|
System.err.println("Trying to create an empty section cell");
|
||||||
|
throw new ResponseStatusException(
|
||||||
|
HttpStatus.BAD_REQUEST, "La cellule de section fournie est vide");
|
||||||
|
}
|
||||||
|
if (!utilsService.isAllowedToCheckProject(
|
||||||
|
mail, this.sectionCellService.getProjectId(sectionCell.getIdSectionCell()))) {
|
||||||
|
logger.warn(
|
||||||
|
"User {} tried to add a section cell to the project {} but is not allowed to.",
|
||||||
|
mail,
|
||||||
|
this.sectionCellService.getProjectId(sectionCell.getIdSectionCell()));
|
||||||
|
throw new ResponseStatusException(
|
||||||
|
HttpStatus.UNAUTHORIZED, "You're not allowed to check this project");
|
||||||
|
}
|
||||||
|
logger.info(
|
||||||
|
"User {} added a new section cell {} to the project with id {}",
|
||||||
|
mail,
|
||||||
|
sectionCell.getIdSectionCell(),
|
||||||
|
this.sectionCellService.getProjectId(sectionCell.getIdSectionCell()));
|
||||||
|
SectionCell newSectionCell = sectionCellService.addNewSectionCell(sectionCell);
|
||||||
|
newSectionCell.getProjectSectionCell().updateListSectionCell(newSectionCell);
|
||||||
|
newSectionCell
|
||||||
|
.getAppointmentSectionCell()
|
||||||
|
.forEach(
|
||||||
|
appointment -> {
|
||||||
|
appointment.updateListSectionCell(newSectionCell);
|
||||||
|
});
|
||||||
|
newSectionCell
|
||||||
|
.getListAnnotation()
|
||||||
|
.forEach(
|
||||||
|
annotation -> {
|
||||||
|
annotation.setSectionCellAnnotation(newSectionCell);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public void requestNewProject(Project project, String mail) {
|
||||||
|
if (project == null) {
|
||||||
|
logger.error("Trying to request the creation of a null project");
|
||||||
|
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Le projet fourni est vide");
|
||||||
|
}
|
||||||
|
logger.info("User {} created a new project with id {}", mail, project.getIdProject());
|
||||||
|
project.setProjectStatus(PENDING);
|
||||||
|
projectService.addNewProject(project);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,135 @@
|
|||||||
|
package enseirb.myinpulse.service;
|
||||||
|
|
||||||
|
import static org.springframework.http.MediaType.APPLICATION_JSON;
|
||||||
|
|
||||||
|
import enseirb.myinpulse.exception.UserNotFoundException;
|
||||||
|
import enseirb.myinpulse.model.RoleRepresentation;
|
||||||
|
import enseirb.myinpulse.model.UserRepresentation;
|
||||||
|
|
||||||
|
import org.springframework.web.client.RestClient;
|
||||||
|
|
||||||
|
import javax.management.relation.RoleNotFoundException;
|
||||||
|
|
||||||
|
public class KeycloakApi {
|
||||||
|
|
||||||
|
static final String keycloakUrl;
|
||||||
|
static final String realmName;
|
||||||
|
|
||||||
|
static {
|
||||||
|
if (System.getenv("VITE_KEYCLOAK_URL") == null) {
|
||||||
|
System.exit(-1);
|
||||||
|
}
|
||||||
|
keycloakUrl = System.getenv("VITE_KEYCLOAK_URL");
|
||||||
|
}
|
||||||
|
|
||||||
|
static {
|
||||||
|
if (System.getenv("VITE_KEYCLOAK_REALM") == null) {
|
||||||
|
System.exit(-1);
|
||||||
|
}
|
||||||
|
realmName = System.getenv("VITE_KEYCLOAK_REALM");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Uses Keycloak API to retrieve a role representation of a role by its name
|
||||||
|
*
|
||||||
|
* @param roleName name of the role
|
||||||
|
* @param bearer authorization header used by the client to authenticate to keycloak
|
||||||
|
*/
|
||||||
|
public static RoleRepresentation getRoleRepresentationByName(String roleName, String bearer)
|
||||||
|
throws RoleNotFoundException {
|
||||||
|
RoleRepresentation[] response =
|
||||||
|
RestClient.builder()
|
||||||
|
.baseUrl(keycloakUrl)
|
||||||
|
.defaultHeader("Authorization", bearer)
|
||||||
|
.build()
|
||||||
|
.get()
|
||||||
|
.uri("/admin/realms/{realmName}/roles/{roleName}", realmName, roleName)
|
||||||
|
.retrieve()
|
||||||
|
.body(RoleRepresentation[].class);
|
||||||
|
|
||||||
|
if (response == null || response.length == 0) {
|
||||||
|
throw new RoleNotFoundException("Role not found");
|
||||||
|
}
|
||||||
|
return response[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Use keycloak API to to retreive a userID via his name or email.
|
||||||
|
*
|
||||||
|
* @param username username or mail of the user
|
||||||
|
* @param bearer bearer of the user, allowing access to database
|
||||||
|
* @return the userid, as a String
|
||||||
|
* @throws UserNotFoundException
|
||||||
|
*/
|
||||||
|
public static String getUserIdByName(String username, String bearer)
|
||||||
|
throws UserNotFoundException {
|
||||||
|
UserRepresentation[] response =
|
||||||
|
RestClient.builder()
|
||||||
|
.baseUrl(keycloakUrl)
|
||||||
|
.defaultHeader("Authorization", bearer)
|
||||||
|
.build()
|
||||||
|
.get()
|
||||||
|
.uri(
|
||||||
|
"/admin/realms/{realmName}/users?username={username}",
|
||||||
|
realmName,
|
||||||
|
username)
|
||||||
|
.retrieve()
|
||||||
|
.body(UserRepresentation[].class);
|
||||||
|
|
||||||
|
if (response == null || response.length == 0) {
|
||||||
|
throw new UserNotFoundException("User not found");
|
||||||
|
}
|
||||||
|
return response[0].id;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TODO: check for error
|
||||||
|
*
|
||||||
|
* <p>Set a keycloak role to a keycloak user.
|
||||||
|
*
|
||||||
|
* <p>Usual roles should be `MyINPulse-admin` and `MyINPulse-entrepreneur`
|
||||||
|
*
|
||||||
|
* @param username
|
||||||
|
* @param roleName
|
||||||
|
* @param bearer
|
||||||
|
* @throws RoleNotFoundException
|
||||||
|
* @throws UserNotFoundException
|
||||||
|
*/
|
||||||
|
public static void setRoleToUser(String username, String roleName, String bearer)
|
||||||
|
throws RoleNotFoundException, UserNotFoundException {
|
||||||
|
RoleRepresentation roleRepresentation = getRoleRepresentationByName(roleName, bearer);
|
||||||
|
String userId = getUserIdByName(username, bearer);
|
||||||
|
|
||||||
|
RestClient.builder()
|
||||||
|
.baseUrl(keycloakUrl)
|
||||||
|
.defaultHeader("Authorization", bearer)
|
||||||
|
.build()
|
||||||
|
.post()
|
||||||
|
.uri(
|
||||||
|
"/admin/realms/${realmName}/users/${userId}/role-mappings/realm",
|
||||||
|
realmName,
|
||||||
|
userId)
|
||||||
|
.body(roleRepresentation)
|
||||||
|
.contentType(APPLICATION_JSON)
|
||||||
|
.retrieve();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete a user from Keycloak database. TODO: check the bearer permission.
|
||||||
|
*
|
||||||
|
* @param username
|
||||||
|
* @param bearer
|
||||||
|
* @throws UserNotFoundException
|
||||||
|
*/
|
||||||
|
public static void deleteUser(String username, String bearer) throws UserNotFoundException {
|
||||||
|
String userId = getUserIdByName(username, bearer);
|
||||||
|
|
||||||
|
RestClient.builder()
|
||||||
|
.baseUrl(keycloakUrl)
|
||||||
|
.defaultHeader("Authorization", bearer)
|
||||||
|
.build()
|
||||||
|
.delete()
|
||||||
|
.uri("/admin/realms/${realmName}/users/${userId}", realmName, userId)
|
||||||
|
.retrieve();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,252 @@
|
|||||||
|
package enseirb.myinpulse.service;
|
||||||
|
|
||||||
|
import com.itextpdf.text.*;
|
||||||
|
import com.itextpdf.text.pdf.PdfWriter;
|
||||||
|
|
||||||
|
import enseirb.myinpulse.model.*;
|
||||||
|
import enseirb.myinpulse.service.database.*;
|
||||||
|
|
||||||
|
import org.apache.logging.log4j.LogManager;
|
||||||
|
import org.apache.logging.log4j.Logger;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.http.HttpStatus;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.web.server.ResponseStatusException;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.URI;
|
||||||
|
import java.net.URISyntaxException;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Paths;
|
||||||
|
import java.nio.file.StandardCopyOption;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import java.time.format.DateTimeFormatter;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class SharedApiService {
|
||||||
|
|
||||||
|
protected static final Logger logger = LogManager.getLogger();
|
||||||
|
|
||||||
|
private final ProjectService projectService;
|
||||||
|
private final EntrepreneurService entrepreneurService;
|
||||||
|
private final SectionCellService sectionCellService;
|
||||||
|
private final AppointmentService appointmentService;
|
||||||
|
|
||||||
|
private final UtilsService utilsService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
SharedApiService(
|
||||||
|
ProjectService projectService,
|
||||||
|
EntrepreneurService entrepreneurService,
|
||||||
|
SectionCellService sectionCellService,
|
||||||
|
AppointmentService appointmentService,
|
||||||
|
UtilsService utilsService) {
|
||||||
|
this.projectService = projectService;
|
||||||
|
this.entrepreneurService = entrepreneurService;
|
||||||
|
this.sectionCellService = sectionCellService;
|
||||||
|
this.appointmentService = appointmentService;
|
||||||
|
this.utilsService = utilsService;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO filter this with date
|
||||||
|
public Iterable<SectionCell> getSectionCells(
|
||||||
|
long projectId, long sectionId, String date, String mail) {
|
||||||
|
|
||||||
|
if (!utilsService.isAllowedToCheckProject(mail, projectId)) {
|
||||||
|
logger.warn(
|
||||||
|
"User {} tried to check section cells of the project {} but is not allowed to.",
|
||||||
|
mail,
|
||||||
|
projectId);
|
||||||
|
throw new ResponseStatusException(
|
||||||
|
HttpStatus.UNAUTHORIZED, "You're not allowed to check this project");
|
||||||
|
}
|
||||||
|
|
||||||
|
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
|
||||||
|
LocalDateTime dateTime = LocalDateTime.parse(date, formatter);
|
||||||
|
|
||||||
|
Project project = this.projectService.getProjectById(projectId);
|
||||||
|
return this.sectionCellService.getSectionCellsByProjectAndSectionIdBeforeDate(
|
||||||
|
project, sectionId, dateTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: test
|
||||||
|
public Iterable<Entrepreneur> getEntrepreneursByProjectId(long projectId, String mail) {
|
||||||
|
if (!utilsService.isAllowedToCheckProject(mail, projectId)) {
|
||||||
|
logger.warn(
|
||||||
|
"User {} tried to check the member of the project {} but is not allowed to.",
|
||||||
|
mail,
|
||||||
|
projectId);
|
||||||
|
throw new ResponseStatusException(
|
||||||
|
HttpStatus.UNAUTHORIZED, "You're not allowed to check this project");
|
||||||
|
}
|
||||||
|
Project project = this.projectService.getProjectById(projectId);
|
||||||
|
return this.entrepreneurService.GetEntrepreneurByProject(project);
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: test
|
||||||
|
public Administrator getAdminByProjectId(long projectId, String mail) {
|
||||||
|
if (!utilsService.isAllowedToCheckProject(mail, projectId)) {
|
||||||
|
logger.warn(
|
||||||
|
"User {} tried to check the admin of the project {} but is not allowed to.",
|
||||||
|
mail,
|
||||||
|
projectId);
|
||||||
|
throw new ResponseStatusException(
|
||||||
|
HttpStatus.UNAUTHORIZED, "You're not allowed to check this project");
|
||||||
|
}
|
||||||
|
Project project = this.projectService.getProjectById(projectId);
|
||||||
|
return project.getProjectAdministrator();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Iterable<Appointment> getAppointmentsByProjectId(long projectId, String mail) {
|
||||||
|
if (!utilsService.isAllowedToCheckProject(mail, projectId)) {
|
||||||
|
logger.warn(
|
||||||
|
"User {} tried to check the appointments related to the project {} but is not allowed to.",
|
||||||
|
mail,
|
||||||
|
projectId);
|
||||||
|
throw new ResponseStatusException(
|
||||||
|
HttpStatus.UNAUTHORIZED, "You're not allowed to check this project");
|
||||||
|
}
|
||||||
|
logger.info(
|
||||||
|
"User {} tried to check the appointments related to the project {}",
|
||||||
|
mail,
|
||||||
|
projectId);
|
||||||
|
Iterable<SectionCell> sectionCells =
|
||||||
|
this.sectionCellService.getSectionCellsByProject(
|
||||||
|
projectService.getProjectById(projectId),
|
||||||
|
2L); // sectionId useless in this function ?
|
||||||
|
List<Appointment> appointments = new ArrayList<Appointment>();
|
||||||
|
sectionCells.forEach(
|
||||||
|
sectionCell -> {
|
||||||
|
appointments.addAll(
|
||||||
|
this.sectionCellService.getAppointmentsBySectionCellId(
|
||||||
|
sectionCell.getIdSectionCell()));
|
||||||
|
});
|
||||||
|
return appointments;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void getPDFReport(long appointmentId, String mail)
|
||||||
|
throws DocumentException, URISyntaxException, IOException {
|
||||||
|
long projectId =
|
||||||
|
this.appointmentService
|
||||||
|
.getAppointmentById(appointmentId)
|
||||||
|
.getAppointmentListSectionCell()
|
||||||
|
.getFirst()
|
||||||
|
.getProjectSectionCell()
|
||||||
|
.getIdProject();
|
||||||
|
if (!utilsService.isAllowedToCheckProject(mail, projectId)) {
|
||||||
|
logger.warn(
|
||||||
|
"User {} tried to generate the PDF report {} related to the appointment {} but is not allowed to.",
|
||||||
|
mail,
|
||||||
|
this.appointmentService
|
||||||
|
.getAppointmentById(appointmentId)
|
||||||
|
.getAppointmentReport()
|
||||||
|
.getIdReport(),
|
||||||
|
appointmentId);
|
||||||
|
throw new ResponseStatusException(
|
||||||
|
HttpStatus.UNAUTHORIZED, "You're not allowed to check this project");
|
||||||
|
}
|
||||||
|
logger.info(
|
||||||
|
"User {} generated the PDF report related to appointment {}", mail, appointmentId);
|
||||||
|
|
||||||
|
String reportContent =
|
||||||
|
this.appointmentService
|
||||||
|
.getAppointmentById(appointmentId)
|
||||||
|
.getAppointmentReport()
|
||||||
|
.getReportContent();
|
||||||
|
|
||||||
|
// PDF generation
|
||||||
|
Document document = new Document();
|
||||||
|
PdfWriter.getInstance(document, new FileOutputStream("Report" + appointmentId + ".pdf"));
|
||||||
|
document.open();
|
||||||
|
|
||||||
|
Paragraph title =
|
||||||
|
new Paragraph(
|
||||||
|
new Phrase(
|
||||||
|
"Compte Rendu - Réunion du "
|
||||||
|
+ this.appointmentService
|
||||||
|
.getAppointmentById(appointmentId)
|
||||||
|
.getAppointmentDate()
|
||||||
|
.toString(),
|
||||||
|
FontFactory.getFont(
|
||||||
|
FontFactory.HELVETICA,
|
||||||
|
20,
|
||||||
|
Font.BOLDITALIC,
|
||||||
|
BaseColor.BLACK)));
|
||||||
|
title.setAlignment(Element.ALIGN_CENTER);
|
||||||
|
document.add(title);
|
||||||
|
|
||||||
|
Font subsection =
|
||||||
|
FontFactory.getFont(FontFactory.HELVETICA, 14, Font.UNDERLINE, BaseColor.DARK_GRAY);
|
||||||
|
Font body = FontFactory.getFont(FontFactory.COURIER, 12, BaseColor.BLACK);
|
||||||
|
|
||||||
|
String[] split = reportContent.split(" ");
|
||||||
|
|
||||||
|
String tmp = "";
|
||||||
|
int counter = 1;
|
||||||
|
for (String s : split) {
|
||||||
|
if (s.equals("//")) {
|
||||||
|
Chunk chunk = new Chunk(tmp, body);
|
||||||
|
document.add(chunk);
|
||||||
|
document.add(new Paragraph("\n"));
|
||||||
|
tmp = "";
|
||||||
|
Paragraph paragraph = new Paragraph("Point n°" + counter + " : ", subsection);
|
||||||
|
document.add(paragraph);
|
||||||
|
document.add(new Paragraph("\n"));
|
||||||
|
counter++;
|
||||||
|
} else {
|
||||||
|
tmp = tmp.concat(s + " ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Chunk chunk = new Chunk(tmp, body);
|
||||||
|
document.add(chunk);
|
||||||
|
document.add(new Paragraph("\n"));
|
||||||
|
|
||||||
|
document.close();
|
||||||
|
|
||||||
|
// Replace uri with website address
|
||||||
|
Files.copy(
|
||||||
|
new URI(
|
||||||
|
"http://localhost:8080/shared/projects/appointments/report/"
|
||||||
|
+ appointmentId)
|
||||||
|
.toURL()
|
||||||
|
.openStream(),
|
||||||
|
Paths.get("Report" + appointmentId + ".pdf"),
|
||||||
|
StandardCopyOption.REPLACE_EXISTING);
|
||||||
|
|
||||||
|
// delete file, we don't want to stock all reports on the server
|
||||||
|
File file = new File("Report" + appointmentId + ".pdf");
|
||||||
|
if (!file.delete()) {
|
||||||
|
logger.warn("Failed to delete report {}", file.getAbsolutePath());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void createAppointmentRequest(Appointment appointment, String mail) {
|
||||||
|
long projectId =
|
||||||
|
appointment
|
||||||
|
.getAppointmentListSectionCell()
|
||||||
|
.getFirst()
|
||||||
|
.getProjectSectionCell()
|
||||||
|
.getIdProject();
|
||||||
|
if (!utilsService.isAllowedToCheckProject(mail, projectId)) {
|
||||||
|
logger.warn(
|
||||||
|
"User {} tried to create for the project {} but is not allowed to.",
|
||||||
|
mail,
|
||||||
|
projectId);
|
||||||
|
throw new ResponseStatusException(
|
||||||
|
HttpStatus.UNAUTHORIZED, "You're not allowed to check this project");
|
||||||
|
}
|
||||||
|
logger.info("User {} tried to create an appointment for project {}", mail, projectId);
|
||||||
|
Appointment newAppointment = this.appointmentService.addNewAppointment(appointment);
|
||||||
|
newAppointment
|
||||||
|
.getAppointmentListSectionCell()
|
||||||
|
.forEach(
|
||||||
|
sectionCell -> {
|
||||||
|
sectionCell.updateAppointmentSectionCell(newAppointment);
|
||||||
|
});
|
||||||
|
newAppointment.getAppointmentReport().setAppointmentReport(newAppointment);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,62 @@
|
|||||||
|
package enseirb.myinpulse.service;
|
||||||
|
|
||||||
|
import enseirb.myinpulse.model.Administrator;
|
||||||
|
import enseirb.myinpulse.model.Entrepreneur;
|
||||||
|
import enseirb.myinpulse.model.Project;
|
||||||
|
import enseirb.myinpulse.model.User;
|
||||||
|
import enseirb.myinpulse.service.database.AdministratorService;
|
||||||
|
import enseirb.myinpulse.service.database.EntrepreneurService;
|
||||||
|
import enseirb.myinpulse.service.database.ProjectService;
|
||||||
|
import enseirb.myinpulse.service.database.UserService;
|
||||||
|
|
||||||
|
import org.apache.logging.log4j.LogManager;
|
||||||
|
import org.apache.logging.log4j.Logger;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.web.server.ResponseStatusException;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class UtilsService {
|
||||||
|
|
||||||
|
protected static final Logger logger = LogManager.getLogger();
|
||||||
|
|
||||||
|
private final UserService userService;
|
||||||
|
private final ProjectService projectService;
|
||||||
|
private final EntrepreneurService entrepreneurService;
|
||||||
|
private final AdministratorService administratorService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
UtilsService(
|
||||||
|
ProjectService projectService,
|
||||||
|
UserService userService,
|
||||||
|
EntrepreneurService entrepreneurService,
|
||||||
|
AdministratorService administratorService) {
|
||||||
|
this.userService = userService;
|
||||||
|
this.projectService = projectService;
|
||||||
|
this.entrepreneurService = entrepreneurService;
|
||||||
|
this.administratorService = administratorService;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: test?
|
||||||
|
public Boolean isAllowedToCheckProject(String mail, long projectId) {
|
||||||
|
if (isAnAdmin(mail)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
User user = this.userService.getUserByEmail(mail);
|
||||||
|
Entrepreneur entrepreneur = this.entrepreneurService.getEntrepreneurById(user.getIdUser());
|
||||||
|
Project project = this.projectService.getProjectById(projectId);
|
||||||
|
return entrepreneur.getProjectParticipation() == project;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: test
|
||||||
|
Boolean isAnAdmin(String mail) {
|
||||||
|
try {
|
||||||
|
long userId = this.userService.getUserByEmail(mail).getIdUser();
|
||||||
|
Administrator a = this.administratorService.getAdministratorById(userId);
|
||||||
|
return true;
|
||||||
|
} catch (ResponseStatusException e) {
|
||||||
|
logger.info(e);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,60 @@
|
|||||||
|
package enseirb.myinpulse.service.database;
|
||||||
|
|
||||||
|
import enseirb.myinpulse.model.Administrator;
|
||||||
|
import enseirb.myinpulse.repository.AdministratorRepository;
|
||||||
|
|
||||||
|
import org.apache.logging.log4j.LogManager;
|
||||||
|
import org.apache.logging.log4j.Logger;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.http.HttpStatus;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.web.server.ResponseStatusException;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class AdministratorService {
|
||||||
|
protected static final Logger logger = LogManager.getLogger();
|
||||||
|
|
||||||
|
private final AdministratorRepository administratorRepository;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
AdministratorService(AdministratorRepository administratorRepository) {
|
||||||
|
this.administratorRepository = administratorRepository;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Iterable<Administrator> allAdministrators() {
|
||||||
|
return this.administratorRepository.findAll();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Administrator getAdministratorById(long id) {
|
||||||
|
Optional<Administrator> administrator = this.administratorRepository.findById(id);
|
||||||
|
if (administrator.isEmpty()) {
|
||||||
|
logger.error("No administrator found with id {}", id);
|
||||||
|
throw new ResponseStatusException(
|
||||||
|
HttpStatus.NOT_FOUND, "Cet administrateur n'existe pas");
|
||||||
|
}
|
||||||
|
return administrator.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Administrator getAdministratorByPrimaryMain(String primaryMail) {
|
||||||
|
Optional<Administrator> administrator =
|
||||||
|
this.administratorRepository.findByPrimaryMail(primaryMail);
|
||||||
|
if (administrator.isEmpty()) {
|
||||||
|
logger.error("No administrator found with the mail {}", primaryMail);
|
||||||
|
throw new ResponseStatusException(
|
||||||
|
HttpStatus.NOT_FOUND, "Cet administrateur n'existe pas");
|
||||||
|
}
|
||||||
|
return administrator.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Administrator addAdministrator(Administrator administrator) {
|
||||||
|
return this.administratorRepository.save(administrator);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
public Administrator getAdministratorByProject(Project project) {
|
||||||
|
r
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
@ -0,0 +1,61 @@
|
|||||||
|
package enseirb.myinpulse.service.database;
|
||||||
|
|
||||||
|
import enseirb.myinpulse.model.Annotation;
|
||||||
|
import enseirb.myinpulse.repository.AnnotationRepository;
|
||||||
|
|
||||||
|
import org.apache.logging.log4j.LogManager;
|
||||||
|
import org.apache.logging.log4j.Logger;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.http.HttpStatus;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.web.server.ResponseStatusException;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class AnnotationService {
|
||||||
|
|
||||||
|
protected static final Logger logger = LogManager.getLogger();
|
||||||
|
|
||||||
|
private final AnnotationRepository annotationRepository;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
AnnotationService(AnnotationRepository annotationRepository) {
|
||||||
|
this.annotationRepository = annotationRepository;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Iterable<Annotation> getAllAnnotations() {
|
||||||
|
return annotationRepository.findAll();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Annotation getAnnotationById(Long id) {
|
||||||
|
Optional<Annotation> annotation = annotationRepository.findById(id);
|
||||||
|
if (annotation.isEmpty()) {
|
||||||
|
logger.error("getAnnotationById : No annotation found with id {}", id);
|
||||||
|
throw new ResponseStatusException(
|
||||||
|
HttpStatus.NOT_FOUND, "Cette annotation n'existe pas");
|
||||||
|
}
|
||||||
|
return annotation.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Annotation addNewAnnotation(Annotation annotation) {
|
||||||
|
return this.annotationRepository.save(annotation);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void deleteAnnotationById(Long id) {
|
||||||
|
this.annotationRepository.deleteById(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Annotation updateAnnotation(Long id, String comment) {
|
||||||
|
Optional<Annotation> annotation = annotationRepository.findById(id);
|
||||||
|
if (annotation.isEmpty()) {
|
||||||
|
logger.error("updateAnnotation : No annotation found with id {}", id);
|
||||||
|
throw new ResponseStatusException(
|
||||||
|
HttpStatus.NOT_FOUND, "Cette annotation n'existe pas");
|
||||||
|
}
|
||||||
|
if (comment != null) {
|
||||||
|
annotation.get().setComment(comment);
|
||||||
|
}
|
||||||
|
return this.annotationRepository.save(annotation.get());
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,79 @@
|
|||||||
|
package enseirb.myinpulse.service.database;
|
||||||
|
|
||||||
|
import enseirb.myinpulse.model.Appointment;
|
||||||
|
import enseirb.myinpulse.repository.AppointmentRepository;
|
||||||
|
|
||||||
|
import org.apache.logging.log4j.LogManager;
|
||||||
|
import org.apache.logging.log4j.Logger;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.http.HttpStatus;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.web.server.ResponseStatusException;
|
||||||
|
|
||||||
|
import java.time.LocalDate;
|
||||||
|
import java.time.LocalTime;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class AppointmentService {
|
||||||
|
|
||||||
|
private static final Logger logger = LogManager.getLogger(AppointmentService.class);
|
||||||
|
|
||||||
|
private AppointmentRepository appointmentRepository;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
AppointmentService(AppointmentRepository appointmentRepository) {
|
||||||
|
this.appointmentRepository = appointmentRepository;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Iterable<Appointment> getallAppointments() {
|
||||||
|
return this.appointmentRepository.findAll();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Appointment getAppointmentById(Long id) {
|
||||||
|
Optional<Appointment> appointment = this.appointmentRepository.findById(id);
|
||||||
|
if (appointment.isEmpty()) {
|
||||||
|
logger.error("getAppointmentById : No appointment found with id {}", id);
|
||||||
|
throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Ce rendez vous n'existe pas");
|
||||||
|
}
|
||||||
|
return appointment.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Appointment addNewAppointment(Appointment appointment) {
|
||||||
|
return this.appointmentRepository.save(appointment);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void deleteAppointmentById(Long id) {
|
||||||
|
this.appointmentRepository.deleteById(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Appointment updateAppointment(
|
||||||
|
Long id,
|
||||||
|
LocalDate appointmentDate,
|
||||||
|
LocalTime appointmentTime,
|
||||||
|
LocalTime appointmentDuration,
|
||||||
|
String appointmentPlace,
|
||||||
|
String appointmentSubject) {
|
||||||
|
Optional<Appointment> appointment = this.appointmentRepository.findById(id);
|
||||||
|
if (appointment.isEmpty()) {
|
||||||
|
logger.error("updateAppointment : No appointment found with id {}", id);
|
||||||
|
throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Ce rendez vous n'existe pas");
|
||||||
|
}
|
||||||
|
if (appointmentDate != null) {
|
||||||
|
appointment.get().setAppointmentDate(appointmentDate);
|
||||||
|
}
|
||||||
|
if (appointmentTime != null) {
|
||||||
|
appointment.get().setAppointmentTime(appointmentTime);
|
||||||
|
}
|
||||||
|
if (appointmentDuration != null) {
|
||||||
|
appointment.get().setAppointmentDuration(appointmentDuration);
|
||||||
|
}
|
||||||
|
if (appointmentPlace != null) {
|
||||||
|
appointment.get().setAppointmentPlace(appointmentPlace);
|
||||||
|
}
|
||||||
|
if (appointmentSubject != null) {
|
||||||
|
appointment.get().setAppointmentSubject(appointmentSubject);
|
||||||
|
}
|
||||||
|
return this.appointmentRepository.save(appointment.get());
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,67 @@
|
|||||||
|
package enseirb.myinpulse.service.database;
|
||||||
|
|
||||||
|
import enseirb.myinpulse.model.Entrepreneur;
|
||||||
|
import enseirb.myinpulse.model.Project;
|
||||||
|
import enseirb.myinpulse.repository.EntrepreneurRepository;
|
||||||
|
|
||||||
|
import org.apache.logging.log4j.LogManager;
|
||||||
|
import org.apache.logging.log4j.Logger;
|
||||||
|
import org.springframework.http.HttpStatus;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.web.server.ResponseStatusException;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class EntrepreneurService {
|
||||||
|
|
||||||
|
protected static final Logger logger = LogManager.getLogger();
|
||||||
|
|
||||||
|
private final EntrepreneurRepository entrepreneurRepository;
|
||||||
|
|
||||||
|
EntrepreneurService(EntrepreneurRepository entrepreneurRepository) {
|
||||||
|
this.entrepreneurRepository = entrepreneurRepository;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Iterable<Entrepreneur> getAllEntrepreneurs() {
|
||||||
|
return this.entrepreneurRepository.findAll();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Entrepreneur getEntrepreneurById(Long id) {
|
||||||
|
Optional<Entrepreneur> entrepreneur = entrepreneurRepository.findById(id);
|
||||||
|
if (entrepreneur.isEmpty()) {
|
||||||
|
logger.error("getEntrepreneurById : No entrepreneur found with id {}", id);
|
||||||
|
throw new ResponseStatusException(
|
||||||
|
HttpStatus.NOT_FOUND, "Cet entrepreneur n'existe pas");
|
||||||
|
}
|
||||||
|
return entrepreneur.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Entrepreneur addEntrepreneur(Entrepreneur entrepreneur) {
|
||||||
|
return this.entrepreneurRepository.save(entrepreneur);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Entrepreneur updateEntrepreneur(
|
||||||
|
Long id, String school, String course, Boolean sneeStatus) {
|
||||||
|
Optional<Entrepreneur> entrepreneur = entrepreneurRepository.findById(id);
|
||||||
|
if (entrepreneur.isEmpty()) {
|
||||||
|
logger.error("updateEntrepreneur : No entrepreneur found with id {}", id);
|
||||||
|
throw new ResponseStatusException(
|
||||||
|
HttpStatus.NOT_FOUND, "Cet entrepreneur n'existe pas");
|
||||||
|
}
|
||||||
|
if (school != null) {
|
||||||
|
entrepreneur.get().setSchool(school);
|
||||||
|
}
|
||||||
|
if (course != null) {
|
||||||
|
entrepreneur.get().setCourse(course);
|
||||||
|
}
|
||||||
|
if (sneeStatus != null) {
|
||||||
|
entrepreneur.get().setSneeStatus(sneeStatus);
|
||||||
|
}
|
||||||
|
return this.entrepreneurRepository.save(entrepreneur.get());
|
||||||
|
}
|
||||||
|
|
||||||
|
public Iterable<Entrepreneur> GetEntrepreneurByProject(Project project) {
|
||||||
|
return this.entrepreneurRepository.getEntrepreneurByProjectParticipation(project);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,124 @@
|
|||||||
|
package enseirb.myinpulse.service.database;
|
||||||
|
|
||||||
|
import static enseirb.myinpulse.model.ProjectDecisionValue.PENDING;
|
||||||
|
|
||||||
|
import enseirb.myinpulse.model.Administrator;
|
||||||
|
import enseirb.myinpulse.model.Project;
|
||||||
|
import enseirb.myinpulse.model.ProjectDecisionValue;
|
||||||
|
import enseirb.myinpulse.repository.ProjectRepository;
|
||||||
|
|
||||||
|
import org.apache.logging.log4j.LogManager;
|
||||||
|
import org.apache.logging.log4j.Logger;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.http.HttpStatus;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.web.server.ResponseStatusException;
|
||||||
|
|
||||||
|
import java.time.LocalDate;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class ProjectService {
|
||||||
|
|
||||||
|
protected static final Logger logger = LogManager.getLogger();
|
||||||
|
|
||||||
|
private final ProjectRepository projectRepository;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
ProjectService(ProjectRepository projectRepository) {
|
||||||
|
this.projectRepository = projectRepository;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Iterable<Project> getAllProjects() {
|
||||||
|
return this.projectRepository.findAll();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Project getProjectById(Long id) {
|
||||||
|
Optional<Project> project = this.projectRepository.findById(id);
|
||||||
|
if (project.isEmpty()) {
|
||||||
|
logger.error("No project found with id {}", id);
|
||||||
|
throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Ce projet n'existe pas");
|
||||||
|
}
|
||||||
|
return project.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Iterable<Project> getProjectsByAdminId(Administrator administrator) {
|
||||||
|
return this.projectRepository.findByProjectAdministrator(administrator);
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: validation
|
||||||
|
public Project addNewProject(Project project) {
|
||||||
|
return this.projectRepository.save(project);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Project updateProject(
|
||||||
|
Long id,
|
||||||
|
String projectName,
|
||||||
|
byte[] logo,
|
||||||
|
LocalDate creationDate,
|
||||||
|
ProjectDecisionValue projectStatus,
|
||||||
|
Administrator administrator) {
|
||||||
|
Optional<Project> project = this.projectRepository.findById(id);
|
||||||
|
|
||||||
|
if (project.isEmpty()) {
|
||||||
|
logger.error("Project with id {} not found.", id);
|
||||||
|
throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Ce projet n'existe pas");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (projectName != null) {
|
||||||
|
project.get().setProjectName(projectName);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (logo != null) {
|
||||||
|
project.get().setLogo(logo);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (creationDate != null) {
|
||||||
|
project.get().setCreationDate(creationDate);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (projectStatus != null) {
|
||||||
|
// TODO: check if this is really useful
|
||||||
|
/*
|
||||||
|
if (!validateStatus(projectStatus)) {
|
||||||
|
logger.error("updateProjectStatus: Invalid status {}", projectStatus);
|
||||||
|
throw new ResponseStatusException(
|
||||||
|
HttpStatus.NOT_ACCEPTABLE, "Ce status n'est pas accepté");
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
project.get().setProjectStatus(projectStatus);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (administrator != null) {
|
||||||
|
project.get().setProjectAdministrator(administrator);
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.projectRepository.save(project.get());
|
||||||
|
}
|
||||||
|
|
||||||
|
public Boolean validateStatus(String status) {
|
||||||
|
return List.of("PENDING", "ACTIVE", "ENDED").contains(status);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Iterable<Project> getPendingProjects() {
|
||||||
|
return this.projectRepository.findByProjectStatus(PENDING);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void deleteProjectById(Long id) {
|
||||||
|
this.projectRepository.deleteById(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Project getProjectByName(String name, boolean noerror) {
|
||||||
|
Optional<Project> project = this.projectRepository.findByProjectName(name);
|
||||||
|
if (project.isEmpty()) {
|
||||||
|
if (noerror) logger.error("No project found with name {}", name);
|
||||||
|
throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Ce projet n'existe pas");
|
||||||
|
}
|
||||||
|
return project.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Project getProjectByName(String name) {
|
||||||
|
return getProjectByName(name, false);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,60 @@
|
|||||||
|
package enseirb.myinpulse.service.database;
|
||||||
|
|
||||||
|
import enseirb.myinpulse.model.Report;
|
||||||
|
import enseirb.myinpulse.repository.ReportRepository;
|
||||||
|
|
||||||
|
import org.apache.logging.log4j.LogManager;
|
||||||
|
import org.apache.logging.log4j.Logger;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.http.HttpStatus;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.web.server.ResponseStatusException;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class ReportService {
|
||||||
|
|
||||||
|
protected static final Logger logger = LogManager.getLogger();
|
||||||
|
|
||||||
|
private final ReportRepository reportRepository;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
ReportService(ReportRepository reportRepository) {
|
||||||
|
this.reportRepository = reportRepository;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Iterable<Report> getAllReports() {
|
||||||
|
return this.reportRepository.findAll();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Report getReportById(Long id) {
|
||||||
|
Optional<Report> report = this.reportRepository.findById(id);
|
||||||
|
if (report.isEmpty()) {
|
||||||
|
logger.error("getReportById : No report found with id {}", id);
|
||||||
|
throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Ce compte rendu n'existe pas");
|
||||||
|
}
|
||||||
|
return report.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: do some validation
|
||||||
|
public Report addNewReport(Report report) {
|
||||||
|
return this.reportRepository.save(report);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void deleteReportById(Long id) {
|
||||||
|
this.reportRepository.deleteById(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Report updateReport(Long id, String reportContent) {
|
||||||
|
Optional<Report> report = this.reportRepository.findById(id);
|
||||||
|
if (report.isEmpty()) {
|
||||||
|
logger.error("updateReport : No report found with id {}", id);
|
||||||
|
throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Ce compte rendu n'existe pas");
|
||||||
|
}
|
||||||
|
if (reportContent != null) {
|
||||||
|
report.get().setReportContent(reportContent);
|
||||||
|
}
|
||||||
|
return this.reportRepository.save(report.get());
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,93 @@
|
|||||||
|
package enseirb.myinpulse.service.database;
|
||||||
|
|
||||||
|
import enseirb.myinpulse.model.Appointment;
|
||||||
|
import enseirb.myinpulse.model.Project;
|
||||||
|
import enseirb.myinpulse.model.SectionCell;
|
||||||
|
import enseirb.myinpulse.repository.SectionCellRepository;
|
||||||
|
|
||||||
|
import org.apache.logging.log4j.LogManager;
|
||||||
|
import org.apache.logging.log4j.Logger;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.http.HttpStatus;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.web.server.ResponseStatusException;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class SectionCellService {
|
||||||
|
|
||||||
|
protected static final Logger logger = LogManager.getLogger();
|
||||||
|
|
||||||
|
private final SectionCellRepository sectionCellRepository;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
SectionCellService(SectionCellRepository sectionCellRepository) {
|
||||||
|
this.sectionCellRepository = sectionCellRepository;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Iterable<SectionCell> getAllSectionCells() {
|
||||||
|
return this.sectionCellRepository.findAll();
|
||||||
|
}
|
||||||
|
|
||||||
|
public SectionCell getSectionCellById(Long id) {
|
||||||
|
Optional<SectionCell> sectionCell = this.sectionCellRepository.findById(id);
|
||||||
|
if (sectionCell.isEmpty()) {
|
||||||
|
logger.error("getSectionCellById : No sectionCell found with id {}", id);
|
||||||
|
throw new ResponseStatusException(
|
||||||
|
HttpStatus.NOT_FOUND, "Cette cellule de section n'existe pas");
|
||||||
|
}
|
||||||
|
return sectionCell.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
public SectionCell addNewSectionCell(SectionCell sectionCell) {
|
||||||
|
return this.sectionCellRepository.save(sectionCell);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void removeSectionCellById(Long id) {
|
||||||
|
this.sectionCellRepository.deleteById(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
public SectionCell updateSectionCell(
|
||||||
|
Long id, Long sectionId, String contentSectionCell, LocalDateTime modificationDate) {
|
||||||
|
Optional<SectionCell> sectionCell = this.sectionCellRepository.findById(id);
|
||||||
|
if (sectionCell.isEmpty()) {
|
||||||
|
logger.error("updateSectionCell : No sectionCell found with id {}", id);
|
||||||
|
throw new ResponseStatusException(
|
||||||
|
HttpStatus.NOT_FOUND, "Cette cellule de section n'existe pas");
|
||||||
|
}
|
||||||
|
if (sectionId != null) {
|
||||||
|
sectionCell.get().setSectionId(sectionId);
|
||||||
|
}
|
||||||
|
if (contentSectionCell != null) {
|
||||||
|
sectionCell.get().setContentSectionCell(contentSectionCell);
|
||||||
|
}
|
||||||
|
if (modificationDate != null) {
|
||||||
|
sectionCell.get().setModificationDate(modificationDate);
|
||||||
|
}
|
||||||
|
return this.sectionCellRepository.save(sectionCell.get());
|
||||||
|
}
|
||||||
|
|
||||||
|
public Iterable<SectionCell> getSectionCellsByProject(Project project, Long sectionId) {
|
||||||
|
return this.sectionCellRepository.findByProjectSectionCellAndSectionId(project, sectionId);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getProjectId(Long sectionCellId) {
|
||||||
|
SectionCell sectionCell = getSectionCellById(sectionCellId);
|
||||||
|
Project sectionProject = sectionCell.getProjectSectionCell();
|
||||||
|
return sectionProject.getIdProject();
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Appointment> getAppointmentsBySectionCellId(Long sectionCellId) {
|
||||||
|
SectionCell sectionCell = getSectionCellById(sectionCellId);
|
||||||
|
return sectionCell.getAppointmentSectionCell();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Iterable<SectionCell> getSectionCellsByProjectAndSectionIdBeforeDate(
|
||||||
|
Project project, long sectionId, LocalDateTime date) {
|
||||||
|
return sectionCellRepository.findByProjectSectionCellAndSectionIdAndModificationDateBefore(
|
||||||
|
project, sectionId, date);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,81 @@
|
|||||||
|
package enseirb.myinpulse.service.database;
|
||||||
|
|
||||||
|
import enseirb.myinpulse.model.User;
|
||||||
|
import enseirb.myinpulse.repository.UserRepository;
|
||||||
|
|
||||||
|
import org.apache.logging.log4j.LogManager;
|
||||||
|
import org.apache.logging.log4j.Logger;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.http.HttpStatus;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.web.bind.annotation.PathVariable;
|
||||||
|
import org.springframework.web.bind.annotation.RequestBody;
|
||||||
|
import org.springframework.web.server.ResponseStatusException;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class UserService {
|
||||||
|
|
||||||
|
protected static final Logger logger = LogManager.getLogger();
|
||||||
|
|
||||||
|
private final UserRepository userRepository;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
UserService(UserRepository userRepository) {
|
||||||
|
this.userRepository = userRepository;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Iterable<User> getAllUsers() {
|
||||||
|
return this.userRepository.findAll();
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO
|
||||||
|
public User getUserByEmail(String email) {
|
||||||
|
Optional<User> opt_user = this.userRepository.findByPrimaryMail(email);
|
||||||
|
|
||||||
|
if (opt_user.isEmpty()) {
|
||||||
|
logger.error("getUserByEmail : No user found with email {}", email);
|
||||||
|
throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Cet utilisateur n'existe pas");
|
||||||
|
}
|
||||||
|
return opt_user.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Iterable<User> allUsers() {
|
||||||
|
return this.userRepository.findAll();
|
||||||
|
}
|
||||||
|
|
||||||
|
public User addUser(@RequestBody User user) {
|
||||||
|
return this.userRepository.save(user);
|
||||||
|
}
|
||||||
|
|
||||||
|
public User updateUser(
|
||||||
|
@PathVariable Long id,
|
||||||
|
String userSurname,
|
||||||
|
String userName,
|
||||||
|
String primaryMail,
|
||||||
|
String secondaryMail,
|
||||||
|
String phoneNumber) {
|
||||||
|
Optional<User> user = userRepository.findById(id);
|
||||||
|
if (user.isEmpty()) {
|
||||||
|
logger.error("updateUser : No user found with id {}", id);
|
||||||
|
throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Cet utilisateur n'existe pas");
|
||||||
|
}
|
||||||
|
if (userName != null) {
|
||||||
|
user.get().setUserName(userName);
|
||||||
|
}
|
||||||
|
if (userSurname != null) {
|
||||||
|
user.get().setUserSurname(userSurname);
|
||||||
|
}
|
||||||
|
if (primaryMail != null) {
|
||||||
|
user.get().setPrimaryMail(primaryMail);
|
||||||
|
}
|
||||||
|
if (secondaryMail != null) {
|
||||||
|
user.get().setSecondaryMail(secondaryMail);
|
||||||
|
}
|
||||||
|
if (phoneNumber != null) {
|
||||||
|
user.get().setPhoneNumber(phoneNumber);
|
||||||
|
}
|
||||||
|
return this.userRepository.save(user.get());
|
||||||
|
}
|
||||||
|
}
|
@ -1,11 +1,8 @@
|
|||||||
spring.application.name=myinpulse
|
spring.application.name=myinpulse
|
||||||
spring.security.oauth2.resourceserver.jwt.jwk-set-uri=http://localhost:7080/realms/test/protocol/openid-connect/certs
|
spring.security.oauth2.resourceserver.jwt.jwk-set-uri=http://localhost:7080/realms/test/protocol/openid-connect/certs
|
||||||
spring.security.oauth2.resourceserver.jwt.issuer-uri=http://localhost:7080/realms/test
|
spring.security.oauth2.resourceserver.jwt.issuer-uri=http://localhost:7080/realms/test
|
||||||
logging.level.org.springframework.security=DEBUG
|
spring.datasource.url=jdbc:postgresql://${DATABASE_URL}/${BACKEND_DB}
|
||||||
spring.datasource.url=jdbc:postgresql://localhost:5432/${MyINPulse_DB}
|
spring.datasource.username=${BACKEND_USER}
|
||||||
spring.datasource.username=${POSTGRES_USER}
|
spring.datasource.password=${BACKEND_PASSWORD}
|
||||||
spring.datasource.password=${POSTGRES_PASSWORD}
|
|
||||||
spring.jpa.hibernate.ddl-auto=update
|
spring.jpa.hibernate.ddl-auto=update
|
||||||
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
|
logging.pattern.console=%d{yyyy-MMM-dd HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{15}) - %msg %n
|
||||||
|
|
||||||
spring.data.rest.base-path=/my/base/path
|
|
@ -1,52 +1,88 @@
|
|||||||
INSERT INTO projets (nom_projet, logo, date_creation, status_projet) VALUES
|
TRUNCATE project, user_inpulse, entrepreneur, administrator, section_cell, appointment, report, annotation CASCADE;
|
||||||
('Eau du robinet', decode('013d7d16d7ad4fefb61bd95b765c8ceb', 'hex'), TO_DATE('01-OCT-2023', 'DD-MON-YYYY'), 'En cours'),
|
|
||||||
('Air oxygéné', decode('150647a0984e8f228cd14b54', 'hex'), TO_DATE('04-APR-2024', 'DD-MON-YYYY'), 'En cours'),
|
|
||||||
('Débat concours', decode('022024abd5486e245c145dda65116f', 'hex'), TO_DATE('22-NOV-2023', 'DD-MON-YYYY'), 'Suspendu'),
|
|
||||||
('HDeirbMI', decode('ab548d6c1d595a2975e6476f544d14c55a', 'hex'), TO_DATE('07-DEC-2024', 'DD-MON-YYYY'), 'Lancement');
|
|
||||||
|
|
||||||
|
SELECT setval('annotation_id_annotation_seq', 1, false);
|
||||||
|
SELECT setval('appointment_id_appointment_seq', 1, false);
|
||||||
|
SELECT setval('make_appointment_id_make_appointment_seq', 1, false);
|
||||||
|
SELECT setval('project_id_project_seq', 1, false);
|
||||||
|
SELECT setval('report_id_report_seq', 1, false);
|
||||||
|
SELECT setval('section_cell_id_section_cell_seq', 1, false);
|
||||||
|
SELECT setval('user_inpulse_id_user_seq', 1, false);
|
||||||
|
|
||||||
INSERT INTO utilisateurs (nom, prenom, mail_principal, mail_secondaire, numero_telephone) VALUES
|
INSERT INTO user_inpulse (user_surname, user_name, primary_mail, secondary_mail, phone_number)
|
||||||
('Dupont', 'Dupond', 'super@mail.fr', 'super2@mail.fr', '06 45 72 45 98'),
|
VALUES ('Dupont', 'Dupond', 'super@mail.fr', 'super2@mail.fr', '06 45 72 45 98'),
|
||||||
('Martin', 'Matin', 'genial@mail.fr', 'genial2@mail.fr', '06 52 14 58 73'),
|
('Martin', 'Matin', 'genial@mail.fr', 'genial2@mail.fr', '06 52 14 58 73'),
|
||||||
('Charvet', 'Lautre', 'mieux@tmail.fr', 'mieux2@tmail.fr', '07 49 82 16 35'),
|
('Charvet', 'Lautre', 'mieux@tmail.fr', 'mieux2@tmail.fr', '07 49 82 16 35'),
|
||||||
('Leguez', 'Theo', 'bof@mesmails.fr', 'bof2@mesmails.fr', '+33 6 78 14 25 29'),
|
('Leguez', 'Theo', 'bof@mesmails.fr', 'bof2@mesmails.fr', '+33 6 78 14 25 29'),
|
||||||
('Kia', 'Bi', 'special@mail.fr', 'special2@mail.fr', '07 65 31 38 95');
|
('Kia', 'Bi', 'special@mail.fr', 'special2@mail.fr', '07 65 31 38 95'),
|
||||||
|
('Ducaillou', 'Pierre', 'maildefou@xyz.fr', 'maildefou2@xyz.fr', '06 54 78 12 62'),
|
||||||
|
('Janine', 'Dave', 'janine@labri.fr', 'janine2@labri.fr', '06 87 12 45 95');
|
||||||
|
|
||||||
INSERT INTO entrepreneurs (ecole, filiere, status_snee) VALUES
|
INSERT INTO administrator (id_administrator)
|
||||||
('ENSEIRB-MATMECA', 'INFO', TRUE),
|
VALUES (7);
|
||||||
('ENSC', 'Cognitique', TRUE),
|
|
||||||
('ENSEIRB-MATMECA', 'MATMECA', FALSE),
|
|
||||||
('SupOptique', 'Classique', TRUE),
|
|
||||||
('ENSEGID', 'Géoscience', FALSE),
|
|
||||||
('ENSMAC', 'Matériaux composites - Mécanique', FALSE);
|
|
||||||
|
|
||||||
INSERT INTO sections (titre, contenu_section, date_modification) VALUES
|
INSERT INTO project (project_name, logo, creation_date, project_status, id_administrator)
|
||||||
("Problème", "les problèmes...", TO_DATE('15-JAN-2025', 'DD-MON-YYYY')),
|
VALUES ('Eau du robinet', decode('013d7d16d7ad4fefb61bd95b765c8ceb', 'hex'), TO_DATE('01-OCT-2023', 'DD-MON-YYYY'),
|
||||||
("Segment de client", "Le segment AB passant le client n°8 est de longueur 32mm.
|
'En cours', 7),
|
||||||
Le segment BC a quant à lui un longueur de 28mm. Quelle la longueur du segment AC ?", TO_DATE('12-OCT-2022', 'DD-MON-YYYY')),
|
('Air oxygéné', decode('150647a0984e8f228cd14b54', 'hex'), TO_DATE('04-APR-2024', 'DD-MON-YYYY'), 'En cours', 7),
|
||||||
("Proposition de valeur unique", "'Son prix est de 2594€' 'Ah oui c'est unique en effet'", TO_DATE('25-MAY-2024', 'DD-MON-YYYY')),
|
('Débat concours', decode('022024abd5486e245c145dda65116f', 'hex'), TO_DATE('22-NOV-2023', 'DD-MON-YYYY'),
|
||||||
("Solution", "Un problème ? Une solution", TO_DATE('08-FEB-2024', 'DD-MON-YYYY')),
|
'Suspendu', 7),
|
||||||
("Canaux", "Ici nous avons la Seine, là-bas le Rhin, oh et plus loin le canal de Suez", TO_DATE('19-JUL-2023', 'DD-MON-YYYY')),
|
('HDeirbMI', decode('ab548d6c1d595a2975e6476f544d14c55a', 'hex'), TO_DATE('07-DEC-2024', 'DD-MON-YYYY'),
|
||||||
("Sources de revenus", "Y'en n'a pas on est pas payé. Enfin y'a du café quoi", TO_DATE('12-JAN-2025', 'DD-MON-YYYY')),
|
'Lancement', 7);
|
||||||
("Structure des coûts", "'Ah oui là ça va faire au moins 1000€ par mois', Eirbware", TO_DATE('06-FEB-2025', 'DD-MON-YYYY')),
|
|
||||||
("Indicateurs clés", "On apprend les clés comme des badges, ça se fait", TO_DATE('05-FEB-2025', 'DD-MON-YYYY')),
|
|
||||||
("Avantages concurrentiel", "On est meilleur", TO_DATE('23-APR-2024', 'DD-MON-YYYY'));
|
|
||||||
|
|
||||||
INSERT INTO rendez_vous (date_rdv, heure_rdv, duree_rdv, lieu_rdv, sujet_rdv) VALUES
|
|
||||||
(TO_DATE('24-DEC-2023', 'DD-MON-YYYY'), '00:00:00', '00:37:53', "À la maison", "Ouvrir les cadeaux"),
|
|
||||||
(TO_DATE('15-AUG-2024', 'DD-MON-YYYY'), '22:35:00', '00:12:36', "Sur les quais ou dans un champ probablement", "BOUM BOUM les feux d'artifices (on fête quoi déjà ?)"),
|
|
||||||
(TO_DATE('29-FEB-2023', 'DD-MON-YYYY'), '14:20:00', '00:20:00', "Salle TD 15", "Ah mince c'est pas une année bissextile !"),
|
|
||||||
(TO_DATE('23-JAN-2024', 'DD-MON-YYYY'), '12:56:27', '11:03:33', "Là où le vent nous porte", "Journée la plus importante de l'année"),
|
|
||||||
(TO_DATE('25-AUG-2025', 'DD-MON-YYYY'), '00:09:00', '01:00:00', "Euh c'est par où l'amphi 56 ?", "Rentrée scolaire (il fait trop froid c'est quoi ça on est en août)");
|
|
||||||
|
|
||||||
|
|
||||||
INSERT INTO comptes_rendus (contenu_compte_rendu) VALUES
|
INSERT INTO entrepreneur (school, course, snee_status, id_entrepreneur, id_project_participation, id_project_proposed)
|
||||||
("Ah oui ça c'est super, ah ouais j'aime bien, bien vu de penser à ça"),
|
VALUES ('ENSEIRB-MATMECA', 'INFO', TRUE, 1, 4, 4),
|
||||||
("Bonne réunion"),
|
('ENSC', 'Cognitique', TRUE, 2, 2, null),
|
||||||
("Ouais, j'ai rien compris mais niquel on fait comme vous avez dit"),
|
('ENSEIRB-MATMECA', 'MATMECA', FALSE, 3, 3, 3),
|
||||||
("Non non ça va pas du tout ce que tu me proposes, faut tout refaire"),
|
('SupOptique', 'Classique', TRUE, 4, 1, 1),
|
||||||
("Réponse de la DSI : non"),
|
('ENSEGID', 'Géoscience', FALSE, 5, 1, null),
|
||||||
("Trop dommage qu'Apple ait sorti leur logiciel avant nous, on avait la même idée et tout on aurait tellement pu leur faire de la concurrence");
|
('ENSMAC', 'Matériaux composites - Mécanique', FALSE, 6, 2, 2);
|
||||||
|
|
||||||
|
|
||||||
|
INSERT INTO section_cell (title, content_section_cell, modification_date, id_project)
|
||||||
|
VALUES ('Problème', 'les problèmes...', TO_TIMESTAMP('15-JAN-2025 09:30:20', 'DD-MON-YYYY, HH24:MI:SS'), 2),
|
||||||
|
('Segment de client', 'Le segment AB passant le client n°8 est de longueur 32mm.
|
||||||
|
Le segment BC a quant à lui un longueur de 28mm. Quelle la longueur du segment AC ?',
|
||||||
|
TO_TIMESTAMP('12-OCT-2022 17:47:38', 'DD-MON-YYYY, HH24:MI:SS'), 3),
|
||||||
|
('Proposition de valeur unique', '''Son prix est de 2594€'' ''Ah oui c''est unique en effet',
|
||||||
|
TO_TIMESTAMP('25-MAY-2024 11:12:04', 'DD-MON-YYYY, HH24:MI:SS'), 2),
|
||||||
|
('Solution', 'Un problème ? Une solution', TO_TIMESTAMP('08-FEB-2024 10:17:53', 'DD-MON-YYYY, HH24:MI:SS'), 1),
|
||||||
|
('Canaux', 'Ici nous avons la Seine, là-bas le Rhin, oh et plus loin le canal de Suez',
|
||||||
|
TO_TIMESTAMP('19-JUL-2023 19:22:45', 'DD-MON-YYYY, HH24:MI:SS'), 4),
|
||||||
|
('Sources de revenus', 'Y''en n''a pas on est pas payé. Enfin y''a du café quoi',
|
||||||
|
TO_TIMESTAMP('12-JAN-2025 11:40:26', 'DD-MON-YYYY, HH24:MI:SS'), 1),
|
||||||
|
('Structure des coûts', '''Ah oui là ça va faire au moins 1000€ par mois'', Eirbware',
|
||||||
|
TO_TIMESTAMP('06-FEB-2025 13:04:06', 'DD-MON-YYYY, HH24:MI:SS'), 3),
|
||||||
|
('Indicateurs clés', 'On apprend les clés comme des badges, ça se fait',
|
||||||
|
TO_TIMESTAMP('05-FEB-2025 12:42:38', 'DD-MON-YYYY, HH24:MI:SS'), 4),
|
||||||
|
('Avantages concurrentiel', 'On est meilleur', TO_TIMESTAMP('23-APR-2024 16:24:02', 'DD-MON-YYYY, HH24:MI:SS'),
|
||||||
|
2);
|
||||||
|
|
||||||
|
INSERT INTO appointment (appointment_date, appointment_time, appointment_duration, appointment_place,
|
||||||
|
appointment_subject)
|
||||||
|
VALUES (TO_DATE('24-DEC-2023', 'DD-MON-YYYY'), '00:00:00', '00:37:53', 'À la maison', 'Ouvrir les cadeaux'),
|
||||||
|
(TO_DATE('15-AUG-2024', 'DD-MON-YYYY'), '22:35:00', '00:12:36', 'Sur les quais ou dans un champ probablement',
|
||||||
|
'BOUM BOUM les feux d''artifices (on fête quoi déjà ?)'),
|
||||||
|
(TO_DATE('28-FEB-2023', 'DD-MON-YYYY'), '14:20:00', '00:20:00', 'Salle TD 15',
|
||||||
|
'Ah mince c''est pas une année bissextile !'),
|
||||||
|
(TO_DATE('23-JAN-2024', 'DD-MON-YYYY'), '12:56:27', '11:03:33', 'Là où le vent nous porte',
|
||||||
|
'Journée la plus importante de l''année'),
|
||||||
|
(TO_DATE('25-AUG-2025', 'DD-MON-YYYY'), '00:09:00', '01:00:00', 'Euh c''est par où l''amphi 56 ?',
|
||||||
|
'Rentrée scolaire (il fait trop froid c''est quoi ça on est en août)');
|
||||||
|
|
||||||
|
INSERT INTO report (report_content, id_appointment)
|
||||||
|
VALUES ('Ah oui ça c''est super, ah ouais j''aime bien, bien vu de penser à ça', 1),
|
||||||
|
('Bonne réunion', 3),
|
||||||
|
('Ouais, j''ai rien compris mais niquel on fait comme vous avez dit', 3),
|
||||||
|
('Non non ça va pas du tout ce que tu me proposes, faut tout refaire', 4),
|
||||||
|
('Réponse de la DSI : non', 2),
|
||||||
|
('Trop dommage qu''Apple ait sorti leur logiciel avant nous, on avait la même idée et tout on aurait tellement pu leur faire de la concurrence',
|
||||||
|
5);
|
||||||
|
|
||||||
|
INSERT INTO annotation (comment, id_administrator, id_section_cell)
|
||||||
|
VALUES ('faut changer ça hein', 7, 5),
|
||||||
|
('??? sérieusement, vous pensez que c''est une bonne idée ?', 7, 7),
|
||||||
|
('ok donc ça c''est votre business plan, bah glhf la team', 7, 2);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
2
MyINPulse-back/src/main/resources/delete.sql
Normal file
2
MyINPulse-back/src/main/resources/delete.sql
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
DROP TABLE IF EXISTS administrateurs, projets, utilisateurs, entrepreneurs, sections, rendez_vous, comptes_rendus, concerner CASCADE;
|
||||||
|
DROP TABLE IF EXISTS administrator, project, user_inpulse, entrepreneur, section_cell, appointment, make_appointment, report, annotation, concern CASCADE;
|
@ -1,122 +0,0 @@
|
|||||||
DROP TABLE IF EXISTS projets CASCADE;
|
|
||||||
DROP TABLE IF EXISTS utilisateurs CASCADE;
|
|
||||||
DROP TABLE IF EXISTS entrepreneurs CASCADE;
|
|
||||||
DROP TABLE IF EXISTS administrateurs CASCADE;
|
|
||||||
DROP TABLE IF EXISTS sections CASCADE;
|
|
||||||
DROP TABLE IF EXISTS rendez_vous CASCADE;
|
|
||||||
DROP TABLE IF EXISTS comptes_rendus CASCADE;
|
|
||||||
DROP TABLE IF EXISTS concerner CASCADE;
|
|
||||||
DROP TABLE IF EXISTS formes CASCADE;
|
|
||||||
|
|
||||||
CREATE TABLE projets
|
|
||||||
(
|
|
||||||
id_projet SERIAL NOT NULL,
|
|
||||||
nom_projet VARCHAR(255) ,
|
|
||||||
logo BYTEA ,
|
|
||||||
date_creation DATE ,
|
|
||||||
status_projet VARCHAR(255) ,
|
|
||||||
CONSTRAINT pk_projet PRIMARY KEY (id_projet) );
|
|
||||||
|
|
||||||
|
|
||||||
CREATE TABLE utilisateurs
|
|
||||||
(
|
|
||||||
id_utilisateur SERIAL NOT NULL,
|
|
||||||
nom_utilisateur VARCHAR(255) ,
|
|
||||||
prenom_utilisateur VARCHAR(255) ,
|
|
||||||
mail_principal VARCHAR(255) ,
|
|
||||||
mail_secondaire VARCHAR(255) ,
|
|
||||||
numero_telephone VARCHAR(15) ,
|
|
||||||
CONSTRAINT pk_utilisateur PRIMARY KEY (id_utilisateur) );
|
|
||||||
|
|
||||||
CREATE TABLE entrepreneurs
|
|
||||||
(
|
|
||||||
id_entrepreneur SERIAL REFERENCES utilisateurs (id_utilisateur),
|
|
||||||
ecole VARCHAR(255) ,
|
|
||||||
filiere VARCHAR(255) ,
|
|
||||||
status_snee BOOLEAN ,
|
|
||||||
CONSTRAINT pk_entrepreneur PRIMARY KEY (id_entrepreneur) );
|
|
||||||
|
|
||||||
CREATE TABLE administrateurs
|
|
||||||
(
|
|
||||||
id_administrateur SERIAL REFERENCES utilisateurs (id_utilisateur),
|
|
||||||
CONSTRAINT pk_administrateur PRIMARY KEY (id_administrateur) );
|
|
||||||
|
|
||||||
CREATE TABLE sections
|
|
||||||
(
|
|
||||||
id_section SERIAL NOT NULL,
|
|
||||||
titre VARCHAR(255) ,
|
|
||||||
contenu_section TEXT ,
|
|
||||||
date_modification TIMESTAMP ,
|
|
||||||
CONSTRAINT pk_section PRIMARY KEY (id_section) );
|
|
||||||
|
|
||||||
CREATE TABLE rendez_vous
|
|
||||||
(
|
|
||||||
id_rdv SERIAL NOT NULL,
|
|
||||||
date_rdv DATE ,
|
|
||||||
heure_rdv TIME ,
|
|
||||||
duree_rdv TIME ,
|
|
||||||
lieu_rdv VARCHAR(255) ,
|
|
||||||
sujet_rdv TEXT ,
|
|
||||||
CONSTRAINT pk_rdv PRIMARY KEY (id_rdv) );
|
|
||||||
|
|
||||||
CREATE TABLE comptes_rendus
|
|
||||||
(
|
|
||||||
id_compte_rendu SERIAL NOT NULL,
|
|
||||||
contenu_compte_rendu TEXT ,
|
|
||||||
CONSTRAINT pk_compte_rendu PRIMARY KEY (id_compte_rendu) );
|
|
||||||
|
|
||||||
CREATE TABLE concerner
|
|
||||||
(
|
|
||||||
id_section SERIAL REFERENCES sections (id_section),
|
|
||||||
id_rdv SERIAL REFERENCES sections (id_rdv),
|
|
||||||
CONSTRAINT pk_concerner PRIMARY KEY (id_section, id_rdv) );
|
|
||||||
|
|
||||||
|
|
||||||
ALTER TABLE projets
|
|
||||||
ADD CONSTRAINT fk1_projet FOREIGN KEY (id_administrateur)
|
|
||||||
REFERENCES administrateurs (id_administrateur)
|
|
||||||
ON DELETE CASCADE;
|
|
||||||
|
|
||||||
ALTER TABLE projets
|
|
||||||
ADD CONSTRAINT fk2_projet FOREIGN KEY (id_entrepreneur_participation)
|
|
||||||
REFERENCES entrepreneurs (id_entrepreneur)
|
|
||||||
ON DELETE CASCADE;
|
|
||||||
|
|
||||||
ALTER TABLE entrepreneurs
|
|
||||||
ADD CONSTRAINT fk1_entrepreneur FOREIGN KEY (id_projet_propose)
|
|
||||||
REFERENCES projets (id_projet)
|
|
||||||
ON DELETE CASCADE;
|
|
||||||
|
|
||||||
ALTER TABLE sections
|
|
||||||
ADD CONSTRAINT fk1_section FOREIGN KEY (id_projet)
|
|
||||||
REFERENCES projets (id_projet)
|
|
||||||
ON DELETE CASCADE;
|
|
||||||
|
|
||||||
ALTER TABLE sections
|
|
||||||
ADD CONSTRAINT fk2_section FOREIGN KEY (id_administrateur)
|
|
||||||
REFERENCES administrateurs (id_administrateur)
|
|
||||||
ON DELETE CASCADE;
|
|
||||||
|
|
||||||
ALTER TABLE rendez-vous
|
|
||||||
ADD CONSTRAINT fk1_rdv FOREIGN KEY (id_entrepreneur)
|
|
||||||
REFERENCES entrepreneurs (id_entrepreneur)
|
|
||||||
ON DELETE CASCADE;
|
|
||||||
|
|
||||||
ALTER TABLE rendez-vous
|
|
||||||
ADD CONSTRAINT fk2_rdv FOREIGN KEY (id_administrateur)
|
|
||||||
REFERENCES administrateurs (id_administrateur)
|
|
||||||
ON DELETE CASCADE;
|
|
||||||
|
|
||||||
ALTER TABLE comptes-rendus
|
|
||||||
ADD CONSTRAINT fk1_compte_rendu FOREIGN KEY (id_rdv)
|
|
||||||
REFERENCES rendez_vous (id_rdv)
|
|
||||||
ON DELETE CASCADE;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,224 @@
|
|||||||
|
package enseirb.myinpulse;
|
||||||
|
|
||||||
|
import static enseirb.myinpulse.model.ProjectDecisionValue.*;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.*;
|
||||||
|
|
||||||
|
import enseirb.myinpulse.model.Administrator;
|
||||||
|
import enseirb.myinpulse.model.Entrepreneur;
|
||||||
|
import enseirb.myinpulse.model.Project;
|
||||||
|
import enseirb.myinpulse.model.ProjectDecision;
|
||||||
|
import enseirb.myinpulse.service.AdminApiService;
|
||||||
|
import enseirb.myinpulse.service.database.AdministratorService;
|
||||||
|
import enseirb.myinpulse.service.database.EntrepreneurService;
|
||||||
|
import enseirb.myinpulse.service.database.ProjectService;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.BeforeAll;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.boot.test.context.SpringBootTest;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
import org.springframework.web.server.ResponseStatusException;
|
||||||
|
|
||||||
|
import java.time.LocalDate;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@SpringBootTest
|
||||||
|
@Transactional
|
||||||
|
public class AdminApiServiceTest {
|
||||||
|
private static long administratorid;
|
||||||
|
private static Administrator administrator;
|
||||||
|
private static Entrepreneur entrepreneur;
|
||||||
|
@Autowired private AdminApiService adminApiService;
|
||||||
|
@Autowired private ProjectService projectService;
|
||||||
|
|
||||||
|
@BeforeAll
|
||||||
|
static void setup(
|
||||||
|
@Autowired AdministratorService administratorService,
|
||||||
|
@Autowired ProjectService projectService,
|
||||||
|
@Autowired EntrepreneurService entrepreneurService) {
|
||||||
|
administratorService.addAdministrator(
|
||||||
|
new Administrator(
|
||||||
|
"admin",
|
||||||
|
"admin",
|
||||||
|
"testAdminEmpty@example.com",
|
||||||
|
"testAdmin@example.com",
|
||||||
|
""));
|
||||||
|
administrator =
|
||||||
|
administratorService.addAdministrator(
|
||||||
|
new Administrator(
|
||||||
|
"admin2",
|
||||||
|
"admin2",
|
||||||
|
"testAdminFull@example.com",
|
||||||
|
"testAdmin@example.com",
|
||||||
|
""));
|
||||||
|
administratorid = administrator.getIdUser();
|
||||||
|
entrepreneur =
|
||||||
|
new Entrepreneur(
|
||||||
|
"JeSuisUnEntrepreneurDeCompet",
|
||||||
|
"EtUé",
|
||||||
|
"Entrepreneur@inpulse.com",
|
||||||
|
"mail2",
|
||||||
|
"phone",
|
||||||
|
"Ensimag nan jdeconne ENSEIRB (-matmeca mais on s'en fout)",
|
||||||
|
"info ofc",
|
||||||
|
false);
|
||||||
|
entrepreneurService.addEntrepreneur(entrepreneur);
|
||||||
|
projectService.addNewProject(
|
||||||
|
new Project(
|
||||||
|
"sampleProjectAdminApiService",
|
||||||
|
null,
|
||||||
|
LocalDate.now(),
|
||||||
|
ACTIVE,
|
||||||
|
administratorService.getAdministratorByPrimaryMain(
|
||||||
|
"testAdminFull@example.com")));
|
||||||
|
}
|
||||||
|
|
||||||
|
private <T> List<T> IterableToList(Iterable<T> iterable) {
|
||||||
|
List<T> l = new ArrayList<>();
|
||||||
|
iterable.forEach(l::add);
|
||||||
|
return l;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void getProjectOfAdminIsEmpty() {
|
||||||
|
Iterable<Project> projects =
|
||||||
|
adminApiService.getProjectsOfAdmin("testAdminEmpty@example.com");
|
||||||
|
assertEquals(0, IterableToList(projects).size());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void getProjectOfInexistantAdminFails() {
|
||||||
|
String nonExistentAdminEmail = "testInexistantAdmin@example.com";
|
||||||
|
|
||||||
|
assertThrows(
|
||||||
|
ResponseStatusException.class,
|
||||||
|
() -> {
|
||||||
|
adminApiService.getProjectsOfAdmin(nonExistentAdminEmail);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void getProjectOfAdminNotEmpty() {
|
||||||
|
Iterable<Project> projects =
|
||||||
|
adminApiService.getProjectsOfAdmin("testAdminFull@example.com");
|
||||||
|
List<Project> l = IterableToList(projects);
|
||||||
|
assertEquals(1, l.size());
|
||||||
|
Project p = l.getFirst();
|
||||||
|
assertEquals(p.getProjectName(), "sampleProjectAdminApiService");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void getPendingProjectsEmpty() {
|
||||||
|
assertEquals(0, IterableToList(this.adminApiService.getPendingProjects()).size());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void getPendingProjectsNotEmpty() {
|
||||||
|
this.projectService.addNewProject(
|
||||||
|
new Project(
|
||||||
|
"PendingProjectAdminApiService1", null, LocalDate.now(), PENDING, null));
|
||||||
|
this.projectService.addNewProject(
|
||||||
|
new Project(
|
||||||
|
"PendingProjectAdminApiService2", null, LocalDate.now(), PENDING, null));
|
||||||
|
Iterable<Project> pendingProjects = this.adminApiService.getPendingProjects();
|
||||||
|
List<Project> pendingProjectsList = IterableToList(pendingProjects);
|
||||||
|
assertEquals(2, pendingProjectsList.size());
|
||||||
|
assertTrue(
|
||||||
|
List.of("PendingProjectAdminApiService1", "PendingProjectAdminApiService2")
|
||||||
|
.contains(pendingProjectsList.getFirst().getProjectName()));
|
||||||
|
assertTrue(
|
||||||
|
List.of("PendingProjectAdminApiService1", "PendingProjectAdminApiService2")
|
||||||
|
.contains(pendingProjectsList.getLast().getProjectName()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void validateInexistantProject() {
|
||||||
|
ProjectDecision d = new ProjectDecision(-1, 0, 1);
|
||||||
|
assertThrows(ResponseStatusException.class, () -> this.adminApiService.validateProject(d));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void validateExistantProject() {
|
||||||
|
Project p =
|
||||||
|
new Project("PendingProjectAdminApiService2", null, LocalDate.now(), PENDING, null);
|
||||||
|
this.projectService.addNewProject(p);
|
||||||
|
assertEquals(PENDING, p.getProjectStatus());
|
||||||
|
ProjectDecision d = new ProjectDecision(p.getIdProject(), administratorid, 1);
|
||||||
|
this.adminApiService.validateProject(d);
|
||||||
|
assertEquals(ACTIVE, p.getProjectStatus());
|
||||||
|
|
||||||
|
// Check if the project was really updated in the database
|
||||||
|
assertEquals(0, IterableToList(this.adminApiService.getPendingProjects()).size());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void refuseExistantProject() {
|
||||||
|
Project p =
|
||||||
|
new Project("PendingProjectAdminApiService2", null, LocalDate.now(), PENDING, null);
|
||||||
|
this.projectService.addNewProject(p);
|
||||||
|
assertEquals(PENDING, p.getProjectStatus());
|
||||||
|
ProjectDecision d = new ProjectDecision(p.getIdProject(), administratorid, 0);
|
||||||
|
this.adminApiService.validateProject(d);
|
||||||
|
assertEquals(REJECTED, p.getProjectStatus());
|
||||||
|
|
||||||
|
// Check if the project was really updated in the database
|
||||||
|
assertEquals(0, IterableToList(this.adminApiService.getPendingProjects()).size());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void addProject() {
|
||||||
|
assertEquals(0, IterableToList(this.adminApiService.getPendingProjects()).size());
|
||||||
|
Project p1 =
|
||||||
|
new Project("PendingProjectAdminApiService2", null, LocalDate.now(), PENDING, null);
|
||||||
|
this.adminApiService.addNewProject(p1);
|
||||||
|
|
||||||
|
assertEquals(1, IterableToList(this.adminApiService.getPendingProjects()).size());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void addProjectToAdmin() {
|
||||||
|
assertEquals(0, administrator.getListProject().size());
|
||||||
|
Project p1 = new Project("assProjectToAdmin", null, LocalDate.now(), ACTIVE, administrator);
|
||||||
|
this.adminApiService.addNewProject(p1);
|
||||||
|
assertEquals(1, administrator.getListProject().size());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void addProjectToUser() {
|
||||||
|
assertNull(entrepreneur.getProjectParticipation());
|
||||||
|
Project p1 =
|
||||||
|
new Project("assProjectToAdmin", null, LocalDate.now(), ACTIVE, null, entrepreneur);
|
||||||
|
this.adminApiService.addNewProject(p1);
|
||||||
|
assertEquals(p1, entrepreneur.getProjectParticipation());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void addProjectWithManyUsers() {
|
||||||
|
Entrepreneur e1 = new Entrepreneur();
|
||||||
|
Entrepreneur e2 = new Entrepreneur();
|
||||||
|
Entrepreneur e3 = new Entrepreneur();
|
||||||
|
assertNull(e1.getProjectParticipation());
|
||||||
|
assertNull(e2.getProjectParticipation());
|
||||||
|
assertNull(e3.getProjectParticipation());
|
||||||
|
Project p1 = new Project("assProjectToAdmin", null, LocalDate.now(), ACTIVE, null, null);
|
||||||
|
p1.updateListEntrepreneurParticipation(e1);
|
||||||
|
p1.updateListEntrepreneurParticipation(e2);
|
||||||
|
p1.updateListEntrepreneurParticipation(e3);
|
||||||
|
this.adminApiService.addNewProject(p1);
|
||||||
|
assertEquals(p1, e1.getProjectParticipation());
|
||||||
|
assertEquals(p1, e2.getProjectParticipation());
|
||||||
|
assertEquals(p1, e3.getProjectParticipation());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void addDuplicateProject() {
|
||||||
|
Project p1 =
|
||||||
|
new Project("PendingProjectAdminApiService2", null, LocalDate.now(), PENDING, null);
|
||||||
|
Project p2 =
|
||||||
|
new Project("PendingProjectAdminApiService2", null, LocalDate.now(), PENDING, null);
|
||||||
|
this.adminApiService.addNewProject(p1);
|
||||||
|
assertThrows(ResponseStatusException.class, () -> this.adminApiService.addNewProject(p2));
|
||||||
|
}
|
||||||
|
}
|
@ -1,5 +1,6 @@
|
|||||||
package enseirb.myinpulse;
|
package enseirb.myinpulse;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.DisplayName;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import org.springframework.boot.test.context.SpringBootTest;
|
import org.springframework.boot.test.context.SpringBootTest;
|
||||||
|
|
||||||
@ -7,5 +8,6 @@ import org.springframework.boot.test.context.SpringBootTest;
|
|||||||
class MyinpulseApplicationTests {
|
class MyinpulseApplicationTests {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@DisplayName("contextLoad => Test if the context can load, i.e. the application can start")
|
||||||
void contextLoads() {}
|
void contextLoads() {}
|
||||||
}
|
}
|
||||||
|
10
MyINPulse-back/src/test/resources/application.properties
Normal file
10
MyINPulse-back/src/test/resources/application.properties
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
spring.datasource.driver-class-name=org.h2.Driver
|
||||||
|
spring.datasource.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1
|
||||||
|
spring.datasource.username=sa
|
||||||
|
spring.datasource.password=sa
|
||||||
|
spring.sql.init.mode=never
|
||||||
|
spring.application.name=myinpulse-test
|
||||||
|
spring.security.oauth2.resourceserver.jwt.jwk-set-uri=http://localhost:7080/realms/test/protocol/openid-connect/certs
|
||||||
|
spring.security.oauth2.resourceserver.jwt.issuer-uri=http://localhost:7080/realms/test
|
||||||
|
spring.jpa.hibernate.ddl-auto=update
|
||||||
|
logging.pattern.console=%d{yyyy-MMM-dd HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{15}) - %msg %n
|
22
config/.env.dev
Normal file
22
config/.env.dev
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
POSTGRES_DB=postgres_db
|
||||||
|
POSTGRES_USER=postgres
|
||||||
|
POSTGRES_PASSWORD=postgres_db_user_password
|
||||||
|
|
||||||
|
KEYCLOAK_ADMIN=admin
|
||||||
|
KEYCLOAK_ADMIN_PASSWORD=admin
|
||||||
|
KEYCLOAK_HOSTNAME=localhost
|
||||||
|
KEYCLOAK_DB=keycloak_db
|
||||||
|
KEYCLOAK_USER=keycloak_db_user
|
||||||
|
KEYCLOAK_PASSWORD=keycloak_db_user_password
|
||||||
|
|
||||||
|
BACKEND_DB=backend_db
|
||||||
|
BACKEND_USER=backend_db_user
|
||||||
|
BACKEND_PASSWORD=backend_db_user_password
|
||||||
|
|
||||||
|
DATABASE_URL=localhost:5433
|
||||||
|
|
||||||
|
VITE_KEYCLOAK_URL=http://localhost:7080
|
||||||
|
VITE_KEYCLOAK_CLIENT_ID=myinpulse-dev
|
||||||
|
VITE_KEYCLOAK_REALM=test
|
||||||
|
VITE_APP_URL=http://localhost:5173
|
||||||
|
VITE_BACKEND_URL=http://localhost:8081/
|
@ -48,4 +48,4 @@ services:
|
|||||||
# container_name: MyINPulse-back
|
# container_name: MyINPulse-back
|
||||||
# ports:
|
# ports:
|
||||||
# - "8081:8080"
|
# - "8081:8080"
|
||||||
|
#
|
@ -12,3 +12,11 @@ KEYCLOAK_PASSWORD=keycloak_db_user_password
|
|||||||
BACKEND_DB=backend_db
|
BACKEND_DB=backend_db
|
||||||
BACKEND_USER=backend_db_user
|
BACKEND_USER=backend_db_user
|
||||||
BACKEND_PASSWORD=backend_db_user_password
|
BACKEND_PASSWORD=backend_db_user_password
|
||||||
|
|
||||||
|
DATABASE_URL=localhost:5433
|
||||||
|
|
||||||
|
VITE_KEYCLOAK_URL=http://localhost:7080
|
||||||
|
VITE_KEYCLOAK_CLIENT_ID=myinpulse
|
||||||
|
VITE_KEYCLOAK_REALM=test
|
||||||
|
VITE_APP_URL=http://localhost:8080
|
||||||
|
VITE_BACKEND_URL=http://localhost:8081/
|
@ -1,5 +0,0 @@
|
|||||||
VITE_KEYCLOAK_URL=http://localhost:7080
|
|
||||||
VITE_KEYCLOAK_CLIENT_ID=myinpulse
|
|
||||||
VITE_KEYCLOAK_REALM=test
|
|
||||||
VITE_APP_URL=http://localhost:8080
|
|
||||||
VITE_BACKEND_URL=http://localhost:8081/
|
|
52
config/dev.docker-compose.yaml
Normal file
52
config/dev.docker-compose.yaml
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
services:
|
||||||
|
postgres:
|
||||||
|
env_file: .env
|
||||||
|
build:
|
||||||
|
context: postgres/
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
container_name: MyINPulse-DB
|
||||||
|
ports:
|
||||||
|
- 5433:5432
|
||||||
|
volumes:
|
||||||
|
- ./postgres/data:/var/lib/postgresql/data
|
||||||
|
|
||||||
|
|
||||||
|
keycloak:
|
||||||
|
container_name: MyINPulse-keycloak
|
||||||
|
build:
|
||||||
|
context: ./keycloak
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
args:
|
||||||
|
KC_DB: postgres
|
||||||
|
KC_DB_URL: jdbc:postgresql://postgres/${POSTGRES_DB}
|
||||||
|
KC_DB_USERNAME: ${POSTGRES_USER}
|
||||||
|
KC_DB_PASSWORD: ${POSTGRES_PASSWORD}
|
||||||
|
environment:
|
||||||
|
KC_HOSTNAME_PORT: 7080
|
||||||
|
KC_HOSTNAME_STRICT_BACKCHANNEL: "true"
|
||||||
|
KC_BOOTSTRAP_ADMIN_USERNAME: ${KEYCLOAK_ADMIN}
|
||||||
|
KC_BOOTSTRAP_ADMIN_PASSWORD: ${KEYCLOAK_ADMIN_PASSWORD}
|
||||||
|
KC_LOG_LEVEL: info
|
||||||
|
command: ["start-dev", "--http-port", "7080", "--https-port", "7443", "--hostname", "${KEYCLOAK_HOSTNAME}"]
|
||||||
|
ports:
|
||||||
|
- "7080:7080"
|
||||||
|
- "7443:7443"
|
||||||
|
depends_on:
|
||||||
|
- postgres
|
||||||
|
|
||||||
|
#front:
|
||||||
|
# build:
|
||||||
|
# context: ./front/
|
||||||
|
# dockerfile: Dockerfile
|
||||||
|
# container_name: MyINPulse-front
|
||||||
|
# ports:
|
||||||
|
# - "8080:80"
|
||||||
|
|
||||||
|
#back:
|
||||||
|
# build:
|
||||||
|
# context: ./MyINPulse-back/
|
||||||
|
# dockerfile: Dockerfile
|
||||||
|
# container_name: MyINPulse-back
|
||||||
|
# ports:
|
||||||
|
# - "8081:8080"
|
||||||
|
|
22
config/dev.env
Normal file
22
config/dev.env
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
POSTGRES_DB=postgres_db
|
||||||
|
POSTGRES_USER=postgres
|
||||||
|
POSTGRES_PASSWORD=postgres_db_user_password
|
||||||
|
|
||||||
|
KEYCLOAK_ADMIN=admin
|
||||||
|
KEYCLOAK_ADMIN_PASSWORD=admin
|
||||||
|
KEYCLOAK_HOSTNAME=localhost
|
||||||
|
KEYCLOAK_DB=keycloak_db
|
||||||
|
KEYCLOAK_USER=keycloak_db_user
|
||||||
|
KEYCLOAK_PASSWORD=keycloak_db_user_password
|
||||||
|
|
||||||
|
BACKEND_DB=backend_db
|
||||||
|
BACKEND_USER=backend_db_user
|
||||||
|
BACKEND_PASSWORD=backend_db_user_password
|
||||||
|
|
||||||
|
DATABASE_URL=localhost:5433
|
||||||
|
|
||||||
|
VITE_KEYCLOAK_URL=http://localhost:7080
|
||||||
|
VITE_KEYCLOAK_CLIENT_ID=myinpulse-dev
|
||||||
|
VITE_KEYCLOAK_REALM=test
|
||||||
|
VITE_APP_URL=http://localhost:5173
|
||||||
|
VITE_BACKEND_URL=http://localhost:8081/
|
@ -42,11 +42,11 @@ services:
|
|||||||
# ports:
|
# ports:
|
||||||
# - "8080:80"
|
# - "8080:80"
|
||||||
|
|
||||||
back:
|
#back:
|
||||||
build:
|
# build:
|
||||||
context: ./MyINPulse-back/
|
# context: ./MyINPulse-back/
|
||||||
dockerfile: Dockerfile
|
# dockerfile: Dockerfile
|
||||||
container_name: MyINPulse-back
|
# container_name: MyINPulse-back
|
||||||
ports:
|
# ports:
|
||||||
- "8081:8080"
|
# - "8081:8080"
|
||||||
|
|
@ -12,3 +12,11 @@ KEYCLOAK_PASSWORD=keycloak_db_user_password
|
|||||||
BACKEND_DB=backend_db
|
BACKEND_DB=backend_db
|
||||||
BACKEND_USER=backend_db_user
|
BACKEND_USER=backend_db_user
|
||||||
BACKEND_PASSWORD=backend_db_user_password
|
BACKEND_PASSWORD=backend_db_user_password
|
||||||
|
|
||||||
|
DATABASE_URL=MyINPulse-DB
|
||||||
|
|
||||||
|
VITE_KEYCLOAK_URL=http://localhost:7080
|
||||||
|
VITE_KEYCLOAK_CLIENT_ID=myinpulse-dev
|
||||||
|
VITE_KEYCLOAK_REALM=test
|
||||||
|
VITE_APP_URL=http://localhost:5173
|
||||||
|
VITE_BACKEND_URL=http://localhost:8081/
|
@ -1,5 +0,0 @@
|
|||||||
VITE_KEYCLOAK_URL=http://localhost:7080
|
|
||||||
VITE_KEYCLOAK_CLIENT_ID=myinpulse-dev
|
|
||||||
VITE_KEYCLOAK_REALM=test
|
|
||||||
VITE_APP_URL=http://localhost:5173
|
|
||||||
VITE_BACKEND_URL=http://localhost:8081/
|
|
@ -30,10 +30,10 @@ services:
|
|||||||
KC_BOOTSTRAP_ADMIN_USERNAME: ${KEYCLOAK_ADMIN}
|
KC_BOOTSTRAP_ADMIN_USERNAME: ${KEYCLOAK_ADMIN}
|
||||||
KC_BOOTSTRAP_ADMIN_PASSWORD: ${KEYCLOAK_ADMIN_PASSWORD}
|
KC_BOOTSTRAP_ADMIN_PASSWORD: ${KEYCLOAK_ADMIN_PASSWORD}
|
||||||
KC_LOG_LEVEL: info
|
KC_LOG_LEVEL: info
|
||||||
command: ["start-dev", "--http-port", "7080", "--https-port", "7443", "--hostname", "${KEYCLOAK_HOSTNAME}"]
|
command: ["start-dev", "--http-port", "7080", "--https-port", "7443", "--hostname", "${KEYCLOAK_HOSTNAME}"] # TODO: remove start-dev
|
||||||
ports:
|
#ports:
|
||||||
- "7080:7080"
|
# - "7080:7080"
|
||||||
- "7443:7443"
|
# - "7443:7443"
|
||||||
depends_on:
|
depends_on:
|
||||||
- postgres
|
- postgres
|
||||||
|
|
||||||
@ -45,11 +45,11 @@ services:
|
|||||||
ports:
|
ports:
|
||||||
- "8080:80"
|
- "8080:80"
|
||||||
|
|
||||||
back:
|
#back:
|
||||||
build:
|
# build:
|
||||||
context: ./MyINPulse-back/
|
# context: ./MyINPulse-back/
|
||||||
dockerfile: Dockerfile
|
# dockerfile: Dockerfile
|
||||||
container_name: MyINPulse-back
|
# container_name: MyINPulse-back
|
||||||
ports:
|
# #ports:
|
||||||
- "8081:8080"
|
# # - "8081:8080"
|
||||||
|
|
@ -12,3 +12,11 @@ KEYCLOAK_PASSWORD=keycloak_db_user_password
|
|||||||
BACKEND_DB=backend_db
|
BACKEND_DB=backend_db
|
||||||
BACKEND_USER=backend_db_user
|
BACKEND_USER=backend_db_user
|
||||||
BACKEND_PASSWORD=backend_db_user_password
|
BACKEND_PASSWORD=backend_db_user_password
|
||||||
|
|
||||||
|
DATABASE_URL=MyINPulse-DB
|
||||||
|
|
||||||
|
VITE_KEYCLOAK_URL=https://0549cd63f912d5dc9b31278d6f.eirb.fr
|
||||||
|
VITE_KEYCLOAK_CLIENT_ID=myinpulse-eirb
|
||||||
|
VITE_KEYCLOAK_REALM=test
|
||||||
|
VITE_APP_URL=https://0549cd63f912d5dc9b31278d6f.piair.dev
|
||||||
|
VITE_BACKEND_URL=http://TODO/
|
@ -1,5 +0,0 @@
|
|||||||
VITE_KEYCLOAK_URL=https://0549cd63f912d5dc9b31278d6f.eirb.fr
|
|
||||||
VITE_KEYCLOAK_CLIENT_ID=myinpulse-eirb
|
|
||||||
VITE_KEYCLOAK_REALM=test
|
|
||||||
VITE_APP_URL=https://0549cd63f912d5dc9b31278d6f.piair.dev
|
|
||||||
VITE_BACKEND_URL=http://TODO/
|
|
12
documentation/Doc.txt
Normal file
12
documentation/Doc.txt
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
Format des comptes rendus de réunion :
|
||||||
|
Texte organisé par bullet point, chaque bullet point est séparé par "//" pour pouvoir être correctement généré.
|
||||||
|
|
||||||
|
Exemple :
|
||||||
|
Le texte "// blablabla // oui bonjour"
|
||||||
|
donne le résultat
|
||||||
|
|
||||||
|
Point n°1 :
|
||||||
|
blablabla
|
||||||
|
|
||||||
|
Point n°2 :
|
||||||
|
oui bonjour
|
13
documentation/openapi/notes.md
Normal file
13
documentation/openapi/notes.md
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
## API Endpoints notes
|
||||||
|
|
||||||
|
### EntrepreneurApi and SharedApi
|
||||||
|
#### Endpoint Name Changes
|
||||||
|
- `/entrepreneur/lcsection/modify/{sectionId}` → `/entrepreneur/sectionCell/modify/{sectionId}`
|
||||||
|
|
||||||
|
### Admin api
|
||||||
|
- `/admin/appointments/report/{appointmentId}` has no PUT and DELETE
|
||||||
|
- `/admin/request-join` and `/admin/request-join/decision/{joinRequestId}` have not yet been implemented
|
||||||
|
|
||||||
|
### Unauth api
|
||||||
|
- `/unauth/request-join/{projectId}` has not yet been implemented
|
||||||
|
|
11
documentation/openapi/run_doc.sh
Executable file
11
documentation/openapi/run_doc.sh
Executable file
@ -0,0 +1,11 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
cd ./swagger-ui
|
||||||
|
|
||||||
|
if [ ! -d "./node_modules/" ]
|
||||||
|
then
|
||||||
|
npm install
|
||||||
|
npm install swagger-cli
|
||||||
|
fi
|
||||||
|
|
||||||
|
npm start
|
353
documentation/openapi/src/adminApi.yaml
Normal file
353
documentation/openapi/src/adminApi.yaml
Normal file
@ -0,0 +1,353 @@
|
|||||||
|
# Admin API Endpoints
|
||||||
|
paths:
|
||||||
|
/admin/projects:
|
||||||
|
get:
|
||||||
|
operationId: getAdminProjects
|
||||||
|
summary: Get projects associated with the admin
|
||||||
|
tags:
|
||||||
|
- Admin API
|
||||||
|
security:
|
||||||
|
- MyINPulse: [MyINPulse-admin]
|
||||||
|
description: Retrieves a list of projects managed by the requesting admin, including details for overview.
|
||||||
|
responses:
|
||||||
|
"200":
|
||||||
|
description: OK - List of projects returned successfully.
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
$ref: "./main.yaml#/components/schemas/project"
|
||||||
|
"400":
|
||||||
|
description: Bad Request - Invalid project data provided (e.g., missing required fields).
|
||||||
|
"401":
|
||||||
|
description: Unauthorized - Authentication required or invalid token.
|
||||||
|
|
||||||
|
post:
|
||||||
|
operationId: addProjectManually
|
||||||
|
summary: Manually add a new project
|
||||||
|
description: Creates a new project with the provided details. (NOTE that this meant for manually inserting projects, for example importing already existing projects).
|
||||||
|
tags:
|
||||||
|
- Admin API
|
||||||
|
security:
|
||||||
|
- MyINPulse: [MyINPulse-admin]
|
||||||
|
requestBody:
|
||||||
|
required: true
|
||||||
|
description: Project details to create. `idProject` and `creationDate` will be ignored if sent and set by the server.
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: "./main.yaml#/components/schemas/project"
|
||||||
|
responses:
|
||||||
|
"201": # Use 201 Created for successful creation
|
||||||
|
description: Created - Project added successfully. Returns the created project.
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: "./main.yaml#/components/schemas/project"
|
||||||
|
"409":
|
||||||
|
description: Bad Request - Project already exists.
|
||||||
|
"401":
|
||||||
|
description: Unauthorized.
|
||||||
|
|
||||||
|
|
||||||
|
/admin/projects/pending:
|
||||||
|
get:
|
||||||
|
operationId: getPendingProjects
|
||||||
|
summary: Get projects awaiting validation
|
||||||
|
tags:
|
||||||
|
- Admin API
|
||||||
|
security:
|
||||||
|
- MyINPulse: [MyINPulse-admin]
|
||||||
|
description: Retrieves a list of projects submitted by entrepreneurs that are pending admin approval.
|
||||||
|
responses:
|
||||||
|
"200":
|
||||||
|
description: OK - List of pending projects returned.
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
$ref: "./main.yaml#/components/schemas/project" # Assuming pending projects use the same schema
|
||||||
|
"401":
|
||||||
|
description: Unauthorized.
|
||||||
|
|
||||||
|
/admin/request-join:
|
||||||
|
get:
|
||||||
|
operationId: getPendingProjects
|
||||||
|
summary: Get entrepreneurs project join requests
|
||||||
|
tags:
|
||||||
|
- Admin API
|
||||||
|
security:
|
||||||
|
- MyINPulse: [MyINPulse-admin]
|
||||||
|
description: Retrieves a list of pending requests from entrepreneurs to join an existing project.
|
||||||
|
responses:
|
||||||
|
"200":
|
||||||
|
description: OK - List of pending project join requests.
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
$ref: "./main.yaml#/components/schemas/joinRequest"
|
||||||
|
"401":
|
||||||
|
description: Unauthorized.
|
||||||
|
|
||||||
|
/admin/request-join/decision/{joinRequestId}:
|
||||||
|
post:
|
||||||
|
summary: Approve or reject a pending project join request
|
||||||
|
tags:
|
||||||
|
- Admin API
|
||||||
|
security:
|
||||||
|
- MyINPulse: [MyINPulse-admin]
|
||||||
|
parameters:
|
||||||
|
- in: path
|
||||||
|
name: joinRequestId
|
||||||
|
required: true
|
||||||
|
schema:
|
||||||
|
type: integer
|
||||||
|
description: The ID of the pending join request to decide upon.
|
||||||
|
|
||||||
|
description: |-
|
||||||
|
Allows an admin to make a decision on an ebtrepreneur's request to join an existing project awaiting validation.
|
||||||
|
If approved (isAccepted=true), the entrepreneur is linked to the project with ID joinRequestId.
|
||||||
|
If rejected (isAccepted=false), the pending request data might be archived or deleted based on business logic.
|
||||||
|
responses:
|
||||||
|
"200":
|
||||||
|
description: OK - No Content, decision processed successfully..
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
$ref: "./main.yaml#/components/schemas/joinRequestDecision"
|
||||||
|
"400":
|
||||||
|
description: Bad Request - Invalid input (e.g., missing decision).
|
||||||
|
"401":
|
||||||
|
description: Unauthorized.
|
||||||
|
|
||||||
|
|
||||||
|
/admin/projects/pending/decision:
|
||||||
|
post:
|
||||||
|
operationId: decidePendingProject
|
||||||
|
summary: Approve or reject a pending project
|
||||||
|
tags:
|
||||||
|
- Admin API
|
||||||
|
description: |-
|
||||||
|
Allows an admin to make a decision on a project awaiting validation.
|
||||||
|
If approved (isAccepted=true), the project status changes, and it's linked to the involved users.
|
||||||
|
If rejected (isAccepted=false), the pending project data might be archived or deleted based on business logic.
|
||||||
|
security:
|
||||||
|
- MyINPulse: [MyINPulse-admin]
|
||||||
|
parameters:
|
||||||
|
- in: path
|
||||||
|
name: pendingProjectId # Corrected typo and name change
|
||||||
|
required: true
|
||||||
|
schema:
|
||||||
|
type: integer
|
||||||
|
description: The ID of the pending project to decide upon.
|
||||||
|
example: 7
|
||||||
|
requestBody:
|
||||||
|
required: true
|
||||||
|
description: Decision payload.
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: './main.yaml#/components/schemas/projectDecision'
|
||||||
|
responses:
|
||||||
|
"204": # Use 204 No Content for successful action with no body
|
||||||
|
description: No Content - Decision processed successfully.
|
||||||
|
"400":
|
||||||
|
description: Bad Request - Invalid input (e.g., missing decision).
|
||||||
|
"401":
|
||||||
|
description: Unauthorized.
|
||||||
|
|
||||||
|
|
||||||
|
/admin/pending-accounts: # Path updated
|
||||||
|
get:
|
||||||
|
operationId: getPendingAccounts
|
||||||
|
summary: Get accounts awaiting validation
|
||||||
|
description: Retrieves a list of entrepreneur user accounts that are pending admin validation.
|
||||||
|
tags:
|
||||||
|
- Admin API
|
||||||
|
security:
|
||||||
|
- MyINPulse: [MyINPulse-admin]
|
||||||
|
responses:
|
||||||
|
"200":
|
||||||
|
description: OK - List of pending accounts returned.
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
$ref: "./main.yaml#/components/schemas/user-entrepreneur"
|
||||||
|
"401":
|
||||||
|
description: Unauthorized.
|
||||||
|
|
||||||
|
/admin/accounts/validate/{userId}:
|
||||||
|
post: # Changed to POST as it changes state
|
||||||
|
operationId: validateUserAccount
|
||||||
|
summary: Validate a pending user account
|
||||||
|
description: Marks the user account specified by userId as validated/active.
|
||||||
|
tags:
|
||||||
|
- Admin API
|
||||||
|
security:
|
||||||
|
- MyINPulse: [MyINPulse-admin]
|
||||||
|
parameters:
|
||||||
|
- in: path
|
||||||
|
name: userId
|
||||||
|
required: true
|
||||||
|
schema:
|
||||||
|
type: integer
|
||||||
|
description: The ID of the user account to validate.
|
||||||
|
example: 102
|
||||||
|
responses:
|
||||||
|
"204":
|
||||||
|
description: No Content - Account validated successfully.
|
||||||
|
"400":
|
||||||
|
description: Bad Request - Invalid user ID format.
|
||||||
|
|
||||||
|
"401":
|
||||||
|
description: Unauthorized.
|
||||||
|
|
||||||
|
/admin/appointments/upcoming:
|
||||||
|
get:
|
||||||
|
operationId: getUpcomingAppointments
|
||||||
|
summary: Get upcoming appointments for an admin
|
||||||
|
tags:
|
||||||
|
- Admin API
|
||||||
|
security:
|
||||||
|
- MyINPulse: [MyINPulse-admin]
|
||||||
|
description: Retrieves a list of appointments scheduled for an admin in the future.
|
||||||
|
responses:
|
||||||
|
"200":
|
||||||
|
description: OK - List of upcoming appointments.
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
$ref: "./main.yaml#/components/schemas/appointment"
|
||||||
|
"404":
|
||||||
|
description: no appointments found.
|
||||||
|
"401":
|
||||||
|
description: Unauthorized.
|
||||||
|
|
||||||
|
/admin/appointments/report/{appointmentId}:
|
||||||
|
post:
|
||||||
|
operationId: createAppointmentReport
|
||||||
|
summary: Create a report for an appointment
|
||||||
|
description: Creates and links a new report (e.g., meeting minutes) to the specified appointment using the provided content.
|
||||||
|
tags:
|
||||||
|
- Admin API
|
||||||
|
security:
|
||||||
|
- MyINPulse: [MyINPulse-admin]
|
||||||
|
parameters:
|
||||||
|
- in: path
|
||||||
|
name: appointmentId
|
||||||
|
required: true
|
||||||
|
schema:
|
||||||
|
type: integer
|
||||||
|
description: ID of the appointment to add a report to.
|
||||||
|
example: 303
|
||||||
|
requestBody:
|
||||||
|
required: true
|
||||||
|
description: Report content. `idReport` will be ignored if sent.
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: "./main.yaml#/components/schemas/report"
|
||||||
|
responses:
|
||||||
|
"201":
|
||||||
|
description: Created - Report created and linked successfully. Returns the created report.
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema: { $ref: "./main.yaml#/components/schemas/report" }
|
||||||
|
"400":
|
||||||
|
description: Bad Request - Invalid input (e.g., missing content, invalid appointment ID format).
|
||||||
|
"401":
|
||||||
|
description: Unauthorized.
|
||||||
|
|
||||||
|
put: # Changed to PUT for update/replacement
|
||||||
|
operationId: updateAppointmentReport
|
||||||
|
summary: Update an existing appointment report
|
||||||
|
description: Updates the content of an existing report linked to the specified appointment. Replaces the entire report content.
|
||||||
|
tags:
|
||||||
|
- Admin API
|
||||||
|
security:
|
||||||
|
- MyINPulse: [MyINPulse-admin]
|
||||||
|
parameters:
|
||||||
|
- in: path
|
||||||
|
name: appointmentId
|
||||||
|
required: true
|
||||||
|
schema:
|
||||||
|
type: integer
|
||||||
|
description: ID of the appointment whose report needs updating.
|
||||||
|
example: 303
|
||||||
|
requestBody:
|
||||||
|
required: true
|
||||||
|
description: New report content. `idReport` in the body should match the existing report's ID or will be ignored.
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: "./main.yaml#/components/schemas/report"
|
||||||
|
responses:
|
||||||
|
"200":
|
||||||
|
description: OK - Report updated successfully. Returns the updated report.
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema: { $ref: "./main.yaml#/components/schemas/report" }
|
||||||
|
"400":
|
||||||
|
description: Bad Request - Invalid input (e.g., missing content).
|
||||||
|
"401":
|
||||||
|
description: Unauthorized.
|
||||||
|
|
||||||
|
|
||||||
|
/admin/projects/{projectId}:
|
||||||
|
delete:
|
||||||
|
operationId: removeProject
|
||||||
|
summary: Remove a project
|
||||||
|
description: Permanently removes the project specified by projectId and potentially related data (use with caution).
|
||||||
|
tags:
|
||||||
|
- Admin API
|
||||||
|
security:
|
||||||
|
- MyINPulse: [MyINPulse-admin]
|
||||||
|
parameters:
|
||||||
|
- in: path
|
||||||
|
name: projectId
|
||||||
|
required: true
|
||||||
|
schema:
|
||||||
|
type: integer
|
||||||
|
description: The ID of the project to remove.
|
||||||
|
example: 12
|
||||||
|
responses:
|
||||||
|
"204":
|
||||||
|
description: No Content - Project removed successfully.
|
||||||
|
"400":
|
||||||
|
description: Bad Request - Invalid project ID format.
|
||||||
|
"401":
|
||||||
|
description: Unauthorized.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/admin/make-admin/{userId}:
|
||||||
|
post:
|
||||||
|
operationId: grantAdminRights
|
||||||
|
summary: Grant admin rights to a user
|
||||||
|
tags:
|
||||||
|
- Admin API
|
||||||
|
security:
|
||||||
|
- MyINPulse: [MyINPulse-admin]
|
||||||
|
description: Elevates the specified user to also have administrator privileges. Assumes the user already exists.
|
||||||
|
parameters:
|
||||||
|
- in: path
|
||||||
|
name: userId
|
||||||
|
required: true
|
||||||
|
schema:
|
||||||
|
type: integer
|
||||||
|
description: The ID of the user to grant admin rights.
|
||||||
|
example: 103
|
||||||
|
responses:
|
||||||
|
"204": # Use 204 No Content
|
||||||
|
description: No Content - Admin rights granted successfully.
|
||||||
|
"400":
|
||||||
|
description: Bad Request - Invalid user ID format or user is already an admin.
|
||||||
|
"401":
|
||||||
|
description: Unauthorized.
|
112
documentation/openapi/src/entrepreneurApi.yaml
Normal file
112
documentation/openapi/src/entrepreneurApi.yaml
Normal file
@ -0,0 +1,112 @@
|
|||||||
|
# Entrepreneur API Endpoints
|
||||||
|
paths:
|
||||||
|
/entrepreneur/projects/request:
|
||||||
|
post:
|
||||||
|
operationId: requestProjectCreation
|
||||||
|
summary: Request creation and validation of a new project
|
||||||
|
tags:
|
||||||
|
- Entrepreneurs API
|
||||||
|
description: |-
|
||||||
|
Submits a request for a new project. The project details are provided in the request body.
|
||||||
|
The requesting entrepreneur (identified by the token) will be associated to it.
|
||||||
|
The project is created with a 'pending' status, awaiting admin approval.
|
||||||
|
security:
|
||||||
|
- MyINPulse: [MyINPulse-entrepreneur]
|
||||||
|
requestBody:
|
||||||
|
required: true
|
||||||
|
description: Project details for the request. `status`, `creationDate` are required by the model when being sent but is ignored by the server;
|
||||||
|
primarily expects a valid `projectId`, `name`, `logo`.
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: "./main.yaml#/components/schemas/project"
|
||||||
|
responses:
|
||||||
|
"202":
|
||||||
|
description: Accepted - Project creation request received and is pending validation.
|
||||||
|
"400":
|
||||||
|
description: Bad Request - Invalid input (e.g., missing name).
|
||||||
|
"401":
|
||||||
|
description: Unauthorized.
|
||||||
|
|
||||||
|
/entrepreneur/sectionCells: # Base path
|
||||||
|
post:
|
||||||
|
operationId: addSectionCell
|
||||||
|
summary: Add a cell to a Lean Canvas section
|
||||||
|
description: Adds a new cell (like a sticky note) with the provided content to a specific section of the entrepreneur's project's Lean Canvas. Assumes project context is known based on user's token.
|
||||||
|
`idSectionCell` and `modificationDate` are server-generated so they're values in the request are ignored by the server.
|
||||||
|
tags:
|
||||||
|
- Entrepreneurs API
|
||||||
|
security:
|
||||||
|
- MyINPulse: [MyINPulse-entrepreneur]
|
||||||
|
requestBody:
|
||||||
|
required: true
|
||||||
|
description: Section cell details. `idSectionCell` and `modificationDate` will be ignored if sent.
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: "./main.yaml#/components/schemas/sectionCell"
|
||||||
|
responses:
|
||||||
|
"201":
|
||||||
|
description: Created - Section cell added successfully. Returns the created cell.
|
||||||
|
"400":
|
||||||
|
description: Bad Request - Invalid input (e.g., missing content or sectionId).
|
||||||
|
"401":
|
||||||
|
description: Unauthorized.
|
||||||
|
|
||||||
|
/entrepreneur/sectionCells/{sectionCellId}:
|
||||||
|
put:
|
||||||
|
operationId: modifySectionCell
|
||||||
|
summary: Modify data in a Lean Canvas section cell
|
||||||
|
description: Updates the content of an existing Lean Canvas section cell specified by `sectionCellId`. The server "updates" (it keeps a record of the previous version to keep a history of all the sectionCells and creates a new ones with the specified modifications) the `modificationDate`.
|
||||||
|
tags:
|
||||||
|
- Entrepreneurs API
|
||||||
|
security:
|
||||||
|
- MyINPulse: [MyINPulse-entrepreneur]
|
||||||
|
parameters:
|
||||||
|
- in: path
|
||||||
|
name: sectionCellId
|
||||||
|
required: true
|
||||||
|
schema:
|
||||||
|
type: integer
|
||||||
|
description: The ID of the section cell to modify.
|
||||||
|
example: 508
|
||||||
|
requestBody:
|
||||||
|
required: true
|
||||||
|
description: Updated section cell details. `sectionCellId` "the path parameter" is the only id that's consideredn the `sectionCellId` id in the request body is ignored. `modificationDate` should be updated by the server.
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: "./main.yaml#/components/schemas/sectionCell"
|
||||||
|
responses:
|
||||||
|
"200":
|
||||||
|
description: OK - Section cell updated successfully. Returns the updated cell.
|
||||||
|
"404":
|
||||||
|
description: Bad Request - Invalid input or ID mismatch.
|
||||||
|
"401":
|
||||||
|
description: Unauthorized.
|
||||||
|
|
||||||
|
delete:
|
||||||
|
operationId: removeSectionCell
|
||||||
|
summary: Remove a Lean Canvas section cell
|
||||||
|
description: Deletes the Lean Canvas section cell specified by `sectionCellId`.
|
||||||
|
tags:
|
||||||
|
- Entrepreneurs API
|
||||||
|
security:
|
||||||
|
- MyINPulse: [MyINPulse-entrepreneur]
|
||||||
|
parameters:
|
||||||
|
- in: path
|
||||||
|
name: sectionCellId
|
||||||
|
required: true
|
||||||
|
schema:
|
||||||
|
type: integer
|
||||||
|
description: The ID of the section cell to remove.
|
||||||
|
example: 509
|
||||||
|
responses:
|
||||||
|
"204":
|
||||||
|
description: No Content - Section cell removed successfully.
|
||||||
|
"400":
|
||||||
|
description: Bad Request - Invalid ID format.
|
||||||
|
"404":
|
||||||
|
description: Bad Request - sectionCell not found.
|
||||||
|
"401":
|
||||||
|
description: Unauthorized.
|
146
documentation/openapi/src/main.yaml
Normal file
146
documentation/openapi/src/main.yaml
Normal file
@ -0,0 +1,146 @@
|
|||||||
|
openapi: 3.0.3
|
||||||
|
info:
|
||||||
|
title: MyInpulse Backend API
|
||||||
|
description: This serves as an OpenAPI documentation for the MyInpulse backend service, covering operations for Entrepreneurs, Admins, and shared functionalities.
|
||||||
|
version: 0.2.1
|
||||||
|
|
||||||
|
tags:
|
||||||
|
- name: Entrepreneurs API
|
||||||
|
description: API endpoints primarily for Entrepreneur users.
|
||||||
|
- name: Admin API
|
||||||
|
description: API endpoints restricted to Admin users for management tasks.
|
||||||
|
- name: Shared API
|
||||||
|
description: API endpoints accessible by both Entrepreneurs and Admins.
|
||||||
|
- name: Unauth API
|
||||||
|
description: API endpoints related to user account management.
|
||||||
|
|
||||||
|
components:
|
||||||
|
schemas:
|
||||||
|
user:
|
||||||
|
$ref: "models.yaml#/user"
|
||||||
|
user-entrepreneur:
|
||||||
|
$ref: "models.yaml#/user-entrepreneur"
|
||||||
|
user-admin:
|
||||||
|
$ref: "models.yaml#/user-admin"
|
||||||
|
sectionCell:
|
||||||
|
$ref: "models.yaml#/sectionCell"
|
||||||
|
project:
|
||||||
|
$ref: "models.yaml#/project"
|
||||||
|
report:
|
||||||
|
$ref: "models.yaml#/report"
|
||||||
|
appointment:
|
||||||
|
$ref: "models.yaml#/appointment"
|
||||||
|
joinRequest:
|
||||||
|
$ref: "models.yaml#/joinRequest"
|
||||||
|
projectDecision:
|
||||||
|
$ref: "models.yaml#/projectDecision"
|
||||||
|
joinRequestDecision:
|
||||||
|
$ref: "models.yaml#/joinRequestDecision"
|
||||||
|
|
||||||
|
securitySchemes:
|
||||||
|
MyINPulse:
|
||||||
|
type: oauth2
|
||||||
|
description: OAuth2 authentication using Keycloak.
|
||||||
|
flows:
|
||||||
|
implicit:
|
||||||
|
authorizationUrl: '{keycloakBaseUrl}/realms/{keycloakRealm}/protocol/openid-connect/auth'
|
||||||
|
scopes:
|
||||||
|
MyINPulse-admin: Grants administrator access.
|
||||||
|
MyINPulse-entrepreneur: Grants standard entrepreneur user access.
|
||||||
|
|
||||||
|
servers:
|
||||||
|
- url: '{serverProtocol}://{serverHost}:{serverPort}'
|
||||||
|
description: API Server
|
||||||
|
variables:
|
||||||
|
serverProtocol:
|
||||||
|
enum: [http, https]
|
||||||
|
default: http
|
||||||
|
serverHost:
|
||||||
|
default: localhost
|
||||||
|
serverPort:
|
||||||
|
enum: ['8081']
|
||||||
|
default: '8081'
|
||||||
|
keycloakBaseUrl:
|
||||||
|
default: http://localhost:7080
|
||||||
|
description: Base URL for the Keycloak server.
|
||||||
|
keycloakRealm:
|
||||||
|
default: MyInpulseRealm
|
||||||
|
description: Keycloak realm name.
|
||||||
|
|
||||||
|
paths:
|
||||||
|
# _ _ _ _ _ _
|
||||||
|
# | | | |_ __ __ _ _ _| |_| |__ / \ _ __ (_)
|
||||||
|
# | | | | '_ \ / _` | | | | __| '_ \ / _ \ | '_ \| |
|
||||||
|
# | |_| | | | | (_| | |_| | |_| | | |/ ___ \| |_) | |
|
||||||
|
# \___/|_| |_|\__,_|\__,_|\__|_| |_/_/ \_\ .__/|_|
|
||||||
|
# |_|
|
||||||
|
|
||||||
|
/unauth/finalize:
|
||||||
|
$ref: "./unauthApi.yaml#/paths/~1unauth~1finalize"
|
||||||
|
/unauth/request-join/{projectId}:
|
||||||
|
$ref: "./unauthApi.yaml#/paths/~1unauth~1request-join~1{projectId}"
|
||||||
|
|
||||||
|
# _ ____ __ __ ___ _ _ _ ____ ___
|
||||||
|
# / \ | _ \| \/ |_ _| \ | | / \ | _ \_ _|
|
||||||
|
# / _ \ | | | | |\/| || || \| | / _ \ | |_) | |
|
||||||
|
# / ___ \| |_| | | | || || |\ | / ___ \| __/| |
|
||||||
|
# /_/ \_\____/|_| |_|___|_| \_| /_/ \_\_| |___|
|
||||||
|
#
|
||||||
|
/admin/pending-accounts:
|
||||||
|
$ref: "./adminApi.yaml#/paths/~1admin~1pending-accounts"
|
||||||
|
/admin/accounts/validate/{userId}:
|
||||||
|
$ref: "./adminApi.yaml#/paths/~1admin~1accounts~1validate~1{userId}"
|
||||||
|
/admin/request-join:
|
||||||
|
$ref: "./adminApi.yaml#/paths/~1admin~1request-join"
|
||||||
|
/admin/request-join/decision/{joinRequestId}:
|
||||||
|
$ref: "./adminApi.yaml#/paths/~1admin~1request-join~1decision~1{joinRequestId}"
|
||||||
|
/admin/projects:
|
||||||
|
$ref: "./adminApi.yaml#/paths/~1admin~1projects"
|
||||||
|
/admin/projects/pending:
|
||||||
|
$ref: "./adminApi.yaml#/paths/~1admin~1projects~1pending"
|
||||||
|
/admin/projects/pending/decision:
|
||||||
|
$ref: "./adminApi.yaml#/paths/~1admin~1projects~1pending~1decision"
|
||||||
|
/admin/appointments/report/{appointmentId}:
|
||||||
|
$ref: "./adminApi.yaml#/paths/~1admin~1appointments~1report~1{appointmentId}"
|
||||||
|
/admin/appointments/upcoming:
|
||||||
|
$ref: "./adminApi.yaml#/paths/~1admin~1appointments~1upcoming"
|
||||||
|
/admin/projects/{projectId}:
|
||||||
|
$ref: "./adminApi.yaml#/paths/~1admin~1projects~1{projectId}"
|
||||||
|
/admin/make-admin/{userId}:
|
||||||
|
$ref: "./adminApi.yaml#/paths/~1admin~1make-admin~1{userId}"
|
||||||
|
|
||||||
|
# ____ _ _ _ ____ ___
|
||||||
|
# / ___|| |__ __ _ _ __ ___ __| | / \ | _ \_ _|
|
||||||
|
# \___ \| '_ \ / _` | '__/ _ \/ _` | / _ \ | |_) | |
|
||||||
|
# ___) | | | | (_| | | | __/ (_| | / ___ \| __/| |
|
||||||
|
# |____/|_| |_|\__,_|_| \___|\__,_| /_/ \_\_| |___|
|
||||||
|
#
|
||||||
|
/shared/projects/sectionCells/{projectId}/{sectionId}/{date}:
|
||||||
|
$ref: "./sharedApi.yaml#/paths/~1shared~1projects~1sectionCells~1{projectId}~1{sectionId}~1{date}"
|
||||||
|
/shared/projects/entrepreneurs/{projectId}:
|
||||||
|
$ref: "./sharedApi.yaml#/paths/~1shared~1projects~1entrepreneurs~1{projectId}"
|
||||||
|
/shared/projects/admin/{projectId}:
|
||||||
|
$ref: "./sharedApi.yaml#/paths/~1shared~1projects~1admin~1{projectId}"
|
||||||
|
/shared/projects/appointments/{projectId}:
|
||||||
|
$ref: "./sharedApi.yaml#/paths/~1shared~1projects~1appointments~1{projectId}"
|
||||||
|
/shared/appointments/report/{appointmentId}:
|
||||||
|
$ref: "./sharedApi.yaml#/paths/~1shared~1appointments~1report~1{appointmentId}"
|
||||||
|
/shared/appointments/request:
|
||||||
|
$ref: "./sharedApi.yaml#/paths/~1shared~1appointments~1request"
|
||||||
|
|
||||||
|
# _____ _ _ _____ ____ _____ ____ ____ _____ _ _ _____ _ _ ____
|
||||||
|
# | ____| \ | |_ _| _ \| ____| _ \| _ \| ____| \ | | ____| | | | _ \
|
||||||
|
# | _| | \| | | | | |_) | _| | |_) | |_) | _| | \| | _| | | | | |_) |
|
||||||
|
# | |___| |\ | | | | _ <| |___| __/| _ <| |___| |\ | |___| |_| | _ <
|
||||||
|
# |_____|_|_\_| |_| |_| \_\_____|_| |_| \_\_____|_| \_|_____|\___/|_| \_\
|
||||||
|
# / \ | _ \_ _|
|
||||||
|
# / _ \ | |_) | |
|
||||||
|
# / ___ \| __/| |
|
||||||
|
# /_/ \_\_| |___|
|
||||||
|
#
|
||||||
|
/entrepreneur/projects/request:
|
||||||
|
$ref: "./entrepreneurApi.yaml#/paths/~1entrepreneur~1projects~1request"
|
||||||
|
/entrepreneur/sectionCells:
|
||||||
|
$ref: "./entrepreneurApi.yaml#/paths/~1entrepreneur~1sectionCells"
|
||||||
|
/entrepreneur/sectionCells/{sectionCellId}:
|
||||||
|
$ref: "./entrepreneurApi.yaml#/paths/~1entrepreneur~1sectionCells~1{sectionCellId}"
|
210
documentation/openapi/src/models.yaml
Normal file
210
documentation/openapi/src/models.yaml
Normal file
@ -0,0 +1,210 @@
|
|||||||
|
# models.yaml
|
||||||
|
user:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
idUser:
|
||||||
|
type: integer
|
||||||
|
description: Unique identifier for the user.
|
||||||
|
#readOnly: true # Typically generated by the server
|
||||||
|
example: 101
|
||||||
|
userSurname:
|
||||||
|
type: string
|
||||||
|
description: User's surname (last name).
|
||||||
|
example: "Doe"
|
||||||
|
userName:
|
||||||
|
type: string
|
||||||
|
description: User's given name (first name).
|
||||||
|
example: "John"
|
||||||
|
primaryMail:
|
||||||
|
type: string
|
||||||
|
format: email
|
||||||
|
description: User's primary email address.
|
||||||
|
example: "john.doe@example.com"
|
||||||
|
secondaryMail:
|
||||||
|
type: string
|
||||||
|
format: email
|
||||||
|
description: User's secondary email address (optional).
|
||||||
|
example: "j.doe@personal.com"
|
||||||
|
phoneNumber:
|
||||||
|
type: string
|
||||||
|
description: User's phone number.
|
||||||
|
example: "+33612345678" # Example using international format
|
||||||
|
|
||||||
|
user-entrepreneur:
|
||||||
|
allOf:
|
||||||
|
- $ref: "#/user"
|
||||||
|
- type: object
|
||||||
|
properties:
|
||||||
|
school:
|
||||||
|
type: string
|
||||||
|
description: The school the entrepreneur attends/attended.
|
||||||
|
example: "ENSEIRB-MATMECA"
|
||||||
|
course:
|
||||||
|
type: string
|
||||||
|
description: The specific course or program of study.
|
||||||
|
example: "Electronics"
|
||||||
|
sneeStatus:
|
||||||
|
type: boolean
|
||||||
|
description: Indicates if the user has SNEE status (Statut National d'Étudiant-Entrepreneur).
|
||||||
|
example: true
|
||||||
|
example: # Added full object example
|
||||||
|
idUser: 101
|
||||||
|
userSurname: "Doe"
|
||||||
|
userName: "John"
|
||||||
|
primaryMail: "john.doe@example.com"
|
||||||
|
secondaryMail: "j.doe@personal.com"
|
||||||
|
phoneNumber: "+33612345678"
|
||||||
|
school: "ENSEIRB-MATMECA"
|
||||||
|
course: "Electronics"
|
||||||
|
sneeStatus: true
|
||||||
|
|
||||||
|
user-admin:
|
||||||
|
allOf:
|
||||||
|
- $ref: "#/user"
|
||||||
|
# No additional properties needed for this example
|
||||||
|
example: # Added full object example
|
||||||
|
idUser: 55
|
||||||
|
userSurname: "Admin"
|
||||||
|
userName: "Super"
|
||||||
|
primaryMail: "admin@myinpulse.com"
|
||||||
|
phoneNumber: "+33512345678"
|
||||||
|
|
||||||
|
sectionCell:
|
||||||
|
type: object
|
||||||
|
description: Represents a cell (like a sticky note) within a specific section of a project's Lean Canvas.
|
||||||
|
properties:
|
||||||
|
idSectionCell:
|
||||||
|
type: integer
|
||||||
|
description: Unique identifier for the section cell.
|
||||||
|
#readOnly: true # Generated by server
|
||||||
|
example: 508
|
||||||
|
sectionId:
|
||||||
|
type: integer
|
||||||
|
description: Identifier of the Lean Canvas section this cell belongs to (e.g., 1 for Problem, 2 for Solution).
|
||||||
|
example: 1
|
||||||
|
contentSectionCell:
|
||||||
|
type: string
|
||||||
|
description: The text content of the section cell.
|
||||||
|
example: "Users find it hard to track project progress."
|
||||||
|
modificationDate:
|
||||||
|
type: string
|
||||||
|
format: date # Using Java LocalDate -> YYYY-MM-DD
|
||||||
|
description: The date when this cell was last modified.
|
||||||
|
#readOnly: true # Typically updated by the server on modification
|
||||||
|
example: "yyyy-MM-dd HH:mm"
|
||||||
|
|
||||||
|
project:
|
||||||
|
type: object
|
||||||
|
description: Represents a project being managed or developed.
|
||||||
|
properties:
|
||||||
|
idProject:
|
||||||
|
type: integer
|
||||||
|
description: Unique identifier for the project.
|
||||||
|
#readOnly: true # Generated by server
|
||||||
|
example: 12
|
||||||
|
projectName:
|
||||||
|
type: string
|
||||||
|
description: The name of the project.
|
||||||
|
example: "MyInpulse Mobile App"
|
||||||
|
creationDate:
|
||||||
|
type: string
|
||||||
|
format: date # Using Java LocalDate -> YYYY-MM-DD
|
||||||
|
description: The date when the project was created in the system.
|
||||||
|
#readOnly: true # Set by server
|
||||||
|
example: "yyyy-MM-dd HH:mm"
|
||||||
|
logo:
|
||||||
|
type: string
|
||||||
|
format: byte
|
||||||
|
description: Base64 encoded string representing the project logo image.
|
||||||
|
example: "/*Base64 encoded string representing the project logo image*/"
|
||||||
|
status:
|
||||||
|
type: string
|
||||||
|
enum: [PENDING, ACTIVE, ENDED, ABORTED, REJECTED]
|
||||||
|
description: Corresponds to a status enum internal to the backend, it's value in in requests
|
||||||
|
incoming to the server should be ignored as the client shouldn't be specifying them.
|
||||||
|
example: "NaN"
|
||||||
|
|
||||||
|
joinRequest:
|
||||||
|
type: object
|
||||||
|
description: Represents a request from an entrepreneur to join an already existing project.
|
||||||
|
properties:
|
||||||
|
idProject:
|
||||||
|
type: integer
|
||||||
|
description: the ID of the project the entrepreneur wants to join.
|
||||||
|
example: 42
|
||||||
|
entrepreneur:
|
||||||
|
$ref: "#/user-entrepreneur"
|
||||||
|
|
||||||
|
|
||||||
|
report:
|
||||||
|
type: object
|
||||||
|
description: Represents a report associated with an appointment.
|
||||||
|
properties:
|
||||||
|
idReport:
|
||||||
|
type: integer
|
||||||
|
description: Unique identifier for the report.
|
||||||
|
#readOnly: true # Generated by server
|
||||||
|
example: 987
|
||||||
|
reportContent:
|
||||||
|
type: string
|
||||||
|
description: The textual content of the report. Could be plain text or Markdown (specify if known).
|
||||||
|
example: "Discussed roadmap milestones for Q3. Agreed on preliminary UI mockups."
|
||||||
|
|
||||||
|
appointment: # Corrected typo
|
||||||
|
type: object
|
||||||
|
description: Represents a scheduled meeting or appointment.
|
||||||
|
properties:
|
||||||
|
idAppointment: # Assuming there's an ID
|
||||||
|
type: integer
|
||||||
|
description: Unique identifier for the appointment.
|
||||||
|
#readOnly: true
|
||||||
|
example: 303
|
||||||
|
appointmentDate:
|
||||||
|
type: string
|
||||||
|
format: date # Using Java LocalDate -> YYYY-MM-DD
|
||||||
|
description: The date of the appointment.
|
||||||
|
example: "2025-05-10"
|
||||||
|
appointmentTime:
|
||||||
|
type: string
|
||||||
|
format: time # Using Java LocalTime -> HH:mm:ss
|
||||||
|
description: The time of the appointment (local time).
|
||||||
|
example: "14:30:00"
|
||||||
|
appointmentDuration:
|
||||||
|
type: string
|
||||||
|
description: Duration of the appointment in ISO 8601 duration format (e.g., PT1H30M for 1 hour 30 minutes).
|
||||||
|
example: "PT1H" # Example for 1 hour
|
||||||
|
appointmentPlace:
|
||||||
|
type: string
|
||||||
|
description: Location or meeting link for the appointment.
|
||||||
|
example: "Meeting Room 3 / https://meet.example.com/abc-def-ghi"
|
||||||
|
appointmentSubject:
|
||||||
|
type: string
|
||||||
|
description: The main topic or subject of the appointment.
|
||||||
|
example: "Q3 Roadmap Planning"
|
||||||
|
# Consider adding project ID or user IDs if relevant association exists
|
||||||
|
|
||||||
|
projectDecision:
|
||||||
|
type: object
|
||||||
|
description: Represents a decision from an admin to accept a pending project.
|
||||||
|
properties:
|
||||||
|
projectId:
|
||||||
|
type: integer
|
||||||
|
description: The ID of the project the entrepreneur wants to join.
|
||||||
|
example: 12
|
||||||
|
adminId:
|
||||||
|
type: integer
|
||||||
|
description: The ID of the project the admin who will supervise the project in case of admission.
|
||||||
|
example: 2
|
||||||
|
isAccepted:
|
||||||
|
type: boolean
|
||||||
|
description: The boolean value of the decision.
|
||||||
|
example: "true"
|
||||||
|
|
||||||
|
joinRequestDecision:
|
||||||
|
type: object
|
||||||
|
description: Represents a decision from an admin to accept a pending project join request.
|
||||||
|
properties:
|
||||||
|
isAccepted:
|
||||||
|
type: boolean
|
||||||
|
description: The boolean value of the decision.
|
||||||
|
example: "true"
|
197
documentation/openapi/src/sharedApi.yaml
Normal file
197
documentation/openapi/src/sharedApi.yaml
Normal file
@ -0,0 +1,197 @@
|
|||||||
|
# Shared API Endpoints
|
||||||
|
paths:
|
||||||
|
|
||||||
|
/shared/projects/sectionCells/{projectId}/{sectionId}/{date}:
|
||||||
|
get:
|
||||||
|
operationId: getSectionCellsByDate
|
||||||
|
summary: Get project section cells modified on a specific date
|
||||||
|
tags:
|
||||||
|
- Shared API
|
||||||
|
security:
|
||||||
|
- MyINPulse: [MyINPulse-entrepreneur, MyINPulse-admin]
|
||||||
|
description: Retrieves section cells belonging to a specific section of a project, filtered by the last modification date. Requires user to have access to the project.
|
||||||
|
parameters:
|
||||||
|
- in: path
|
||||||
|
name: projectId
|
||||||
|
required: true
|
||||||
|
schema: { type: integer }
|
||||||
|
description: ID of the project.
|
||||||
|
- in: path
|
||||||
|
name: sectionId
|
||||||
|
required: true
|
||||||
|
schema: { type: integer }
|
||||||
|
description: ID of the Lean Canvas section.
|
||||||
|
- in: path
|
||||||
|
name: date
|
||||||
|
required: true
|
||||||
|
schema: { type: string, format: date } # Expect YYYY-MM-DD
|
||||||
|
description: The modification date to filter by (YYYY-MM-DD HH:mm).
|
||||||
|
responses:
|
||||||
|
"200":
|
||||||
|
description: OK - List of section cells matching the criteria.
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
$ref: "./main.yaml#/components/schemas/sectionCell"
|
||||||
|
"400":
|
||||||
|
description: Bad Request - Invalid parameter format.
|
||||||
|
"401":
|
||||||
|
description: Unauthorized.
|
||||||
|
|
||||||
|
|
||||||
|
/shared/projects/entrepreneurs/{projectId}:
|
||||||
|
get:
|
||||||
|
operationId: getProjectEntrepreneurs
|
||||||
|
summary: Get entrepreneurs associated with a project
|
||||||
|
tags:
|
||||||
|
- Shared API
|
||||||
|
security:
|
||||||
|
- MyINPulse: [MyINPulse-entrepreneur, MyINPulse-admin]
|
||||||
|
description: Retrieves a list of entrepreneur users associated with the specified project. Requires access to the project.
|
||||||
|
parameters:
|
||||||
|
- in: path
|
||||||
|
name: projectId
|
||||||
|
required: true
|
||||||
|
schema: { type: integer }
|
||||||
|
description: ID of the project.
|
||||||
|
responses:
|
||||||
|
"200":
|
||||||
|
description: OK - List of entrepreneurs.
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
$ref: "./main.yaml#/components/schemas/user-entrepreneur"
|
||||||
|
"401":
|
||||||
|
description: Unauthorized.
|
||||||
|
"403":
|
||||||
|
description: Forbidden - User does not have access to this project.
|
||||||
|
"404":
|
||||||
|
description: Not Found - Project not found.
|
||||||
|
|
||||||
|
/shared/projects/admin/{projectId}: # Path updated
|
||||||
|
get:
|
||||||
|
operationId: getProjectAdmin
|
||||||
|
summary: Get admin associated with a project
|
||||||
|
tags:
|
||||||
|
- Shared API
|
||||||
|
security:
|
||||||
|
- MyINPulse: [MyINPulse-entrepreneur, MyINPulse-admin]
|
||||||
|
description: Retrieves a list of admin users associated with the specified project. Requires access to the project.
|
||||||
|
parameters:
|
||||||
|
- in: path
|
||||||
|
name: projectId
|
||||||
|
required: true
|
||||||
|
schema: { type: integer }
|
||||||
|
description: ID of the project.
|
||||||
|
responses:
|
||||||
|
"200":
|
||||||
|
description: OK - admin.
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: "./main.yaml#/components/schemas/user-admin"
|
||||||
|
"401":
|
||||||
|
description: Unauthorized.
|
||||||
|
"403":
|
||||||
|
description: Forbidden - User does not have access to this project.
|
||||||
|
"404":
|
||||||
|
description: Not Found - Project not found.
|
||||||
|
|
||||||
|
|
||||||
|
/shared/projects/appointments/{projectId}:
|
||||||
|
get:
|
||||||
|
operationId: getProjectAppointments
|
||||||
|
summary: Get appointments related to a project
|
||||||
|
tags:
|
||||||
|
- Shared API
|
||||||
|
security:
|
||||||
|
- MyINPulse: [MyINPulse-entrepreneur, MyINPulse-admin]
|
||||||
|
description: Retrieves a list of appointments associated with the specified project. Requires access to the project.
|
||||||
|
parameters:
|
||||||
|
- in: path
|
||||||
|
name: projectId
|
||||||
|
required: true
|
||||||
|
schema: { type: integer }
|
||||||
|
description: ID of the project.
|
||||||
|
responses:
|
||||||
|
"200":
|
||||||
|
description: OK - List of appointments.
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
$ref: "./main.yaml#/components/schemas/appointment"
|
||||||
|
"401":
|
||||||
|
description: Unauthorized.
|
||||||
|
|
||||||
|
|
||||||
|
/shared/appointments/report/{appointmentId}: # Path updated
|
||||||
|
get:
|
||||||
|
operationId: getAppointmentReport # Shared endpoint implies read-only access might be possible
|
||||||
|
summary: Get the report for an appointment
|
||||||
|
tags:
|
||||||
|
- Shared API
|
||||||
|
security:
|
||||||
|
- MyINPulse: [MyINPulse-entrepreneur, MyINPulse-admin]
|
||||||
|
description: Retrieves the report associated with a specific appointment. Requires user to have access to the appointment/project.
|
||||||
|
parameters:
|
||||||
|
- in: path
|
||||||
|
name: appointmentId
|
||||||
|
required: true
|
||||||
|
schema: { type: integer }
|
||||||
|
description: ID of the appointment.
|
||||||
|
responses:
|
||||||
|
"200":
|
||||||
|
description: OK - Report PDF returned.
|
||||||
|
content:
|
||||||
|
application/pdf:
|
||||||
|
schema:
|
||||||
|
schema:
|
||||||
|
type: string
|
||||||
|
format: binary
|
||||||
|
"401":
|
||||||
|
description: Unauthorized.
|
||||||
|
|
||||||
|
|
||||||
|
/shared/appointments/request:
|
||||||
|
post:
|
||||||
|
operationId: requestAppointment
|
||||||
|
summary: Request a new appointment
|
||||||
|
tags:
|
||||||
|
- Shared API
|
||||||
|
security:
|
||||||
|
- MyINPulse: [MyINPulse-entrepreneur, MyINPulse-admin]
|
||||||
|
description: Allows a user (entrepreneur or admin) to request a new appointment, potentially with another user or regarding a project. Details in the body. The request might need confirmation or create a pending appointment.
|
||||||
|
requestBody:
|
||||||
|
required: true
|
||||||
|
description: Details of the appointment request.
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: "./main.yaml#/components/schemas/appointment" # Assuming request uses same model structure
|
||||||
|
example:
|
||||||
|
value:
|
||||||
|
appointmentDate: "2025-06-01"
|
||||||
|
appointmentTime: "10:00:00"
|
||||||
|
appointmentDuration: "PT1H"
|
||||||
|
appointmentPlace: "Online"
|
||||||
|
appointmentSubject: "Follow-up on prototype"
|
||||||
|
# Potentially add projectId or targetUserId here
|
||||||
|
responses:
|
||||||
|
"202": # Accepted seems appropriate for a request
|
||||||
|
description: Accepted - Appointment request submitted.
|
||||||
|
content:
|
||||||
|
application/json: # Optionally return the pending appointment data
|
||||||
|
schema:
|
||||||
|
$ref: "./main.yaml#/components/schemas/appointment"
|
||||||
|
"400":
|
||||||
|
description: Bad Request - Invalid appointment details.
|
||||||
|
|
||||||
|
"401":
|
||||||
|
description: Unauthorized.
|
||||||
|
|
62
documentation/openapi/src/unauthApi.yaml
Normal file
62
documentation/openapi/src/unauthApi.yaml
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
|
||||||
|
# _ _ _ _ _ _
|
||||||
|
# | | | |_ __ __ _ _ _| |_| |__ / \ _ __ (_)
|
||||||
|
# | | | | '_ \ / _` | | | | __| '_ \ / _ \ | '_ \| |
|
||||||
|
# | |_| | | | | (_| | |_| | |_| | | |/ ___ \| |_) | |
|
||||||
|
# \___/|_| |_|\__,_|\__,_|\__|_| |_/_/ \_\ .__/|_|
|
||||||
|
# |_|
|
||||||
|
|
||||||
|
paths:
|
||||||
|
/unauth/finalize:
|
||||||
|
post:
|
||||||
|
summary: Finalize account setup using authentication token
|
||||||
|
description: |-
|
||||||
|
Completes the user account creation/setup process in the MyInpulse system.
|
||||||
|
This endpoint requires the user to be authenticated via Keycloak (e.g., after initial login).
|
||||||
|
User details (name, email, etc.) are extracted from the authenticated user's token (e.g., Keycloak JWT).
|
||||||
|
No request body is needed. The account is marked as pending admin validation upon successful finalization.
|
||||||
|
tags:
|
||||||
|
- Unauth API
|
||||||
|
responses:
|
||||||
|
"201":
|
||||||
|
description: Created - Account finalized and pending admin validation. Returns the user profile.
|
||||||
|
"400":
|
||||||
|
description: Bad Request - Problem processing the token or user data derived from it.
|
||||||
|
"401":
|
||||||
|
description: Unauthorized - Valid authentication token required.
|
||||||
|
/unauth/request-join/{projectId}:
|
||||||
|
post:
|
||||||
|
summary: Request to join an existing project
|
||||||
|
description: Submits a request for the authenticated user (keycloack authenticated) to join the project specified by projectId. Their role is then changed to entrepreneur in server and Keycloak. This requires approval from a project admin.
|
||||||
|
tags:
|
||||||
|
- Unauth API
|
||||||
|
parameters:
|
||||||
|
- in: path
|
||||||
|
name: projectId
|
||||||
|
required: true
|
||||||
|
schema:
|
||||||
|
type: integer
|
||||||
|
description: The ID of the project to request joining.
|
||||||
|
example: 15
|
||||||
|
responses: # Moved responses block to correct level
|
||||||
|
"202":
|
||||||
|
description: Accepted - Join request submitted and pending approval.
|
||||||
|
"400":
|
||||||
|
description: Bad Request - Invalid project ID format
|
||||||
|
"409":
|
||||||
|
description: Already member/request pending.
|
||||||
|
"401":
|
||||||
|
description: Unauthorized.
|
||||||
|
/unauth/request-admin-role:
|
||||||
|
post:
|
||||||
|
summary: Request to join an existing project
|
||||||
|
description: Submits a request for the authenticated user (keycloack authenticated) to become an admin. Their role is then changed to admin in server and Keycloak. This requires approval from a project admin.
|
||||||
|
tags:
|
||||||
|
- Unauth API
|
||||||
|
responses:
|
||||||
|
"202":
|
||||||
|
description: Accepted - Become admin request submitted and pending approval.
|
||||||
|
"400":
|
||||||
|
description: Bad Request - Invalid project ID format or already member/request pending.
|
||||||
|
"401":
|
||||||
|
description: Unauthorized.
|
14
documentation/openapi/swagger-ui/main.js
Normal file
14
documentation/openapi/swagger-ui/main.js
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
const express = require("express");
|
||||||
|
const swaggerUi = require("swagger-ui-express");
|
||||||
|
const yaml = require("js-yaml");
|
||||||
|
const fs = require("fs");
|
||||||
|
|
||||||
|
const app = express();
|
||||||
|
|
||||||
|
const swaggerDocument = yaml.load(fs.readFileSync("../src/bundled.yaml", "utf8"));
|
||||||
|
|
||||||
|
app.use("/api-docs", swaggerUi.serve, swaggerUi.setup(swaggerDocument));
|
||||||
|
|
||||||
|
app.listen(3000, () => {
|
||||||
|
console.log("Swagger UI running at http://localhost:3000/api-docs");
|
||||||
|
});
|
2179
documentation/openapi/swagger-ui/package-lock.json
generated
Normal file
2179
documentation/openapi/swagger-ui/package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user