diff --git a/.gitea/workflows/back.yaml b/.gitea/workflows/back.yaml index bd6f476..31aa219 100644 --- a/.gitea/workflows/back.yaml +++ b/.gitea/workflows/back.yaml @@ -12,8 +12,7 @@ jobs: with: distribution: 'temurin' # See 'Supported distributions' for available options java-version: '21' + - uses: axel-op/googlejavaformat-action@v3 with: - args: "--set-exit-if-changed --skip-sorting-imports --aosp" - - name: Print diffs - run: git --no-pager diff --exit-code \ No newline at end of file + args: "--set-exit-if-changed --skip-sorting-imports --aosp -n" \ No newline at end of file diff --git a/Makefile b/Makefile index 26d5ccb..617387b 100644 --- a/Makefile +++ b/Makefile @@ -1,13 +1,16 @@ help: - @echo "make [clean dev-front prod dev-back]" + @echo "make [clean dev-front prod dev-back dev]" 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 @docker compose down @rm -f docker-compose.yaml @rm -f .env @rm -f front/MyINPulse-front/.env - + @rm -f MyINPulse-back/.env # Install npm packages front/MyINPulse-front/.installed: @@ -18,24 +21,37 @@ vite: ./front/MyINPulse-front/.installed dev-front: clean vite - @cp config/frontdev.front.env front/MyINPulse-front/.env - @cp config/frontdev.main.env .env + @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 @docker compose up -d --build @cd ./front/MyINPulse-front/ && npm run dev prod: clean - @cp config/prod.front.env front/MyINPulse-front/.env - @cp config/prod.main.env .env + @cp config/prod.env front/MyINPulse-front/.env + @cp config/prod.env .env + @cp config/prod.env .env @cp config/prod.docker-compose.yaml docker-compose.yaml @docker compose up -d --build dev-back: - @cp config/backdev.front.env front/MyINPulse-front/.env - @cp config/backdev.main.env .env + @cp config/backdev.env front/MyINPulse-front/.env + @cp config/backdev.env .env + @cp config/backdev.env MyINPulse-back/.env @cp config/backdev.docker-compose.yaml docker-compose.yaml @docker compose up -d --build - @echo "cd MyINPulse-back" - @echo "./gradlew bootRun --args='--server.port=8081'" \ No newline at end of file + @echo "cd MyINPulse-back" && echo 'export $$(cat .env | xargs)' + @echo "./gradlew bootRun --args='--server.port=8081'" + +dev: clean vite + @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 & diff --git a/MyINPulse-back/build.gradle b/MyINPulse-back/build.gradle index 5d1c2fd..abb4635 100644 --- a/MyINPulse-back/build.gradle +++ b/MyINPulse-back/build.gradle @@ -21,8 +21,8 @@ dependencies { 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-data-jpa' - implementation('org.springframework.boot:spring-boot-starter-validation') - implementation('org.springframework.boot:spring-boot-starter-data-rest') + implementation 'org.springframework.boot:spring-boot-starter-validation' + implementation 'org.springframework.boot:spring-boot-starter-data-rest' implementation 'org.postgresql:postgresql' testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' diff --git a/MyINPulse-back/src/main/java/enseirb/myinpulse/api/GetUserInfo.java b/MyINPulse-back/src/main/java/enseirb/myinpulse/api/GetUserInfo.java index 63aef48..ad008f0 100644 --- a/MyINPulse-back/src/main/java/enseirb/myinpulse/api/GetUserInfo.java +++ b/MyINPulse-back/src/main/java/enseirb/myinpulse/api/GetUserInfo.java @@ -1,43 +1,24 @@ 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") + @GetMapping("/unauth/random") public boolean rand() { - System.err.println("HELLO"); return Math.random() > 0.5; } - @CrossOrigin(methods = {RequestMethod.GET, RequestMethod.OPTIONS}) - @GetMapping("/random2") + @GetMapping("/admin/random") public boolean rand2() { - System.err.println("HELLO2"); return Math.random() > 0.5; } - @CrossOrigin(methods = {RequestMethod.GET, RequestMethod.OPTIONS}) - @GetMapping("/random3") + @GetMapping("/entrepreneur/random") public boolean rand3() { - System.err.println("HELLO"); return Math.random() > 0.5; } } diff --git a/MyINPulse-back/src/main/java/enseirb/myinpulse/config/WebSecurityCustomConfiguration.java b/MyINPulse-back/src/main/java/enseirb/myinpulse/config/WebSecurityCustomConfiguration.java index 43a9889..b8f0e4f 100644 --- a/MyINPulse-back/src/main/java/enseirb/myinpulse/config/WebSecurityCustomConfiguration.java +++ b/MyINPulse-back/src/main/java/enseirb/myinpulse/config/WebSecurityCustomConfiguration.java @@ -1,6 +1,10 @@ package enseirb.myinpulse.config; +import static org.springframework.security.authorization.AuthorityAuthorizationManager.hasRole; + import enseirb.myinpulse.security.KeycloakJwtRolesConverter; + +import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; @@ -12,39 +16,53 @@ import org.springframework.web.cors.UrlBasedCorsConfigurationSource; import java.util.Arrays; import java.util.List; -import static org.springframework.security.authorization.AuthorityAuthorizationManager.hasRole; - @Configuration public class WebSecurityCustomConfiguration { // 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 public CorsConfigurationSource corsConfigurationSource() { CorsConfiguration configuration = new CorsConfiguration(); - configuration.setAllowedOrigins(List.of("*")); + configuration.setAllowedOrigins(List.of(frontendUrl)); configuration.setAllowedMethods(Arrays.asList("GET", "OPTIONS")); configuration.setAllowedHeaders( - Arrays.asList( - "authorization", - "content-type", - "x-auth-token")); // Do not remove, this fixes the CORS errors when - // unauthenticated + Arrays.asList("authorization", "content-type", "x-auth-token")); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration("/**", configuration); return source; } + /** + * Configure the authorisation required for each path. + * + *

admin endpoints are under /admin/* and entrepreneur are under /entrepreneur/* + * + *

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 public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.authorizeHttpRequests( authorize -> authorize - .requestMatchers("/random2") + .requestMatchers("/entrepreneur/**") .access(hasRole("REALM_MyINPulse-entrepreneur")) - .requestMatchers("/random") + .requestMatchers("/admin/**") .access(hasRole("REALM_MyINPulse-admin")) - .requestMatchers("/random3") + .requestMatchers("/unauth/**") .permitAll() .anyRequest() .authenticated()) diff --git a/MyINPulse-back/src/main/java/enseirb/myinpulse/postgres_db/controller/AdministrateursController.java b/MyINPulse-back/src/main/java/enseirb/myinpulse/postgres_db/controller/AdministrateursController.java index 2a5d05e..b9a8259 100644 --- a/MyINPulse-back/src/main/java/enseirb/myinpulse/postgres_db/controller/AdministrateursController.java +++ b/MyINPulse-back/src/main/java/enseirb/myinpulse/postgres_db/controller/AdministrateursController.java @@ -2,12 +2,14 @@ package enseirb.myinpulse.postgres_db.controller; import enseirb.myinpulse.postgres_db.model.Administrateurs; import enseirb.myinpulse.postgres_db.repository.AdministrateursRepository; -import java.util.Optional; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.*; import org.springframework.web.server.ResponseStatusException; +import java.util.Optional; + @RestController public class AdministrateursController { diff --git a/MyINPulse-back/src/main/java/enseirb/myinpulse/postgres_db/controller/ComptesRendusController.java b/MyINPulse-back/src/main/java/enseirb/myinpulse/postgres_db/controller/ComptesRendusController.java index 3862118..77ec2f8 100644 --- a/MyINPulse-back/src/main/java/enseirb/myinpulse/postgres_db/controller/ComptesRendusController.java +++ b/MyINPulse-back/src/main/java/enseirb/myinpulse/postgres_db/controller/ComptesRendusController.java @@ -2,12 +2,14 @@ package enseirb.myinpulse.postgres_db.controller; import enseirb.myinpulse.postgres_db.model.ComptesRendus; import enseirb.myinpulse.postgres_db.repository.ComptesRendusRepository; -import java.util.Optional; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.*; import org.springframework.web.server.ResponseStatusException; +import java.util.Optional; + @RestController public class ComptesRendusController { diff --git a/MyINPulse-back/src/main/java/enseirb/myinpulse/postgres_db/controller/EntrepreneursController.java b/MyINPulse-back/src/main/java/enseirb/myinpulse/postgres_db/controller/EntrepreneursController.java index 8fdc1dd..d97298c 100644 --- a/MyINPulse-back/src/main/java/enseirb/myinpulse/postgres_db/controller/EntrepreneursController.java +++ b/MyINPulse-back/src/main/java/enseirb/myinpulse/postgres_db/controller/EntrepreneursController.java @@ -2,12 +2,14 @@ package enseirb.myinpulse.postgres_db.controller; import enseirb.myinpulse.postgres_db.model.Entrepreneurs; import enseirb.myinpulse.postgres_db.repository.EntrepreneursRepository; -import java.util.Optional; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.*; import org.springframework.web.server.ResponseStatusException; +import java.util.Optional; + @RestController public class EntrepreneursController { diff --git a/MyINPulse-back/src/main/java/enseirb/myinpulse/postgres_db/controller/ProjetsController.java b/MyINPulse-back/src/main/java/enseirb/myinpulse/postgres_db/controller/ProjetsController.java index d0909b0..b6bb230 100644 --- a/MyINPulse-back/src/main/java/enseirb/myinpulse/postgres_db/controller/ProjetsController.java +++ b/MyINPulse-back/src/main/java/enseirb/myinpulse/postgres_db/controller/ProjetsController.java @@ -2,13 +2,15 @@ package enseirb.myinpulse.postgres_db.controller; import enseirb.myinpulse.postgres_db.model.Projets; import enseirb.myinpulse.postgres_db.repository.ProjetsRepository; -import java.time.LocalDate; -import java.util.Optional; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.*; import org.springframework.web.server.ResponseStatusException; +import java.time.LocalDate; +import java.util.Optional; + @RestController public class ProjetsController { diff --git a/MyINPulse-back/src/main/java/enseirb/myinpulse/postgres_db/controller/SectionsController.java b/MyINPulse-back/src/main/java/enseirb/myinpulse/postgres_db/controller/SectionsController.java index 01f94ae..716d434 100644 --- a/MyINPulse-back/src/main/java/enseirb/myinpulse/postgres_db/controller/SectionsController.java +++ b/MyINPulse-back/src/main/java/enseirb/myinpulse/postgres_db/controller/SectionsController.java @@ -2,13 +2,15 @@ package enseirb.myinpulse.postgres_db.controller; import enseirb.myinpulse.postgres_db.model.Sections; import enseirb.myinpulse.postgres_db.repository.SectionsRepository; -import java.time.LocalDateTime; -import java.util.Optional; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.*; import org.springframework.web.server.ResponseStatusException; +import java.time.LocalDateTime; +import java.util.Optional; + @RestController public class SectionsController { diff --git a/MyINPulse-back/src/main/java/enseirb/myinpulse/postgres_db/controller/UtilisateursController.java b/MyINPulse-back/src/main/java/enseirb/myinpulse/postgres_db/controller/UtilisateursController.java index c46d688..410b5b5 100644 --- a/MyINPulse-back/src/main/java/enseirb/myinpulse/postgres_db/controller/UtilisateursController.java +++ b/MyINPulse-back/src/main/java/enseirb/myinpulse/postgres_db/controller/UtilisateursController.java @@ -2,12 +2,14 @@ package enseirb.myinpulse.postgres_db.controller; import enseirb.myinpulse.postgres_db.model.Utilisateurs; import enseirb.myinpulse.postgres_db.repository.UtilisateursRepository; -import java.util.Optional; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.*; import org.springframework.web.server.ResponseStatusException; +import java.util.Optional; + @RestController public class UtilisateursController { diff --git a/MyINPulse-back/src/main/java/enseirb/myinpulse/postgres_db/model/Administrateurs.java b/MyINPulse-back/src/main/java/enseirb/myinpulse/postgres_db/model/Administrateurs.java index 0f91f9a..dbf2ea9 100644 --- a/MyINPulse-back/src/main/java/enseirb/myinpulse/postgres_db/model/Administrateurs.java +++ b/MyINPulse-back/src/main/java/enseirb/myinpulse/postgres_db/model/Administrateurs.java @@ -3,6 +3,7 @@ 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; diff --git a/MyINPulse-back/src/main/java/enseirb/myinpulse/postgres_db/model/Projets.java b/MyINPulse-back/src/main/java/enseirb/myinpulse/postgres_db/model/Projets.java index b49c12f..e543549 100644 --- a/MyINPulse-back/src/main/java/enseirb/myinpulse/postgres_db/model/Projets.java +++ b/MyINPulse-back/src/main/java/enseirb/myinpulse/postgres_db/model/Projets.java @@ -2,6 +2,7 @@ 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; diff --git a/MyINPulse-back/src/main/java/enseirb/myinpulse/postgres_db/model/RendezVous.java b/MyINPulse-back/src/main/java/enseirb/myinpulse/postgres_db/model/RendezVous.java index 3bf380d..2763bbb 100644 --- a/MyINPulse-back/src/main/java/enseirb/myinpulse/postgres_db/model/RendezVous.java +++ b/MyINPulse-back/src/main/java/enseirb/myinpulse/postgres_db/model/RendezVous.java @@ -12,30 +12,14 @@ import java.util.List; @Table(name = "rendez_vous") public class RendezVous { - @Id - @NotNull - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id_rdv; - - private LocalDate date_rdv; - - private LocalTime heure_rdv; - - private LocalTime duree_rdv; - - @Column(length = 255) - private String lieu_rdv; - - private String sujet_rdv; - @OneToMany(mappedBy = "rendezVousEntrepreneurs", fetch = FetchType.LAZY, orphanRemoval = true) - private List ListEntrepreneurs = new ArrayList<>(); + private final List ListEntrepreneurs = new ArrayList<>(); @OneToMany(mappedBy = "rendezVousAdministrateurs", fetch = FetchType.LAZY, orphanRemoval = true) - private List ListAdministrateurs = new ArrayList<>(); + private final List ListAdministrateurs = new ArrayList<>(); @OneToMany(mappedBy = "rendezVousComptesRendus", fetch = FetchType.LAZY, orphanRemoval = true) - private List ListComptesRendus = new ArrayList<>(); + private final List ListComptesRendus = new ArrayList<>(); @ManyToMany( fetch = FetchType.LAZY, @@ -46,6 +30,20 @@ public class RendezVous { inverseJoinColumns = @JoinColumn(name = "id_section")) List ListSections = new ArrayList<>(); + @Id + @NotNull + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id_rdv; + + private LocalDate date_rdv; + private LocalTime heure_rdv; + private LocalTime duree_rdv; + + @Column(length = 255) + private String lieu_rdv; + + private String sujet_rdv; + public RendezVous() {} public RendezVous( diff --git a/MyINPulse-back/src/main/java/enseirb/myinpulse/postgres_db/repository/AdministrateursRepository.java b/MyINPulse-back/src/main/java/enseirb/myinpulse/postgres_db/repository/AdministrateursRepository.java index b59d2c0..0454e64 100644 --- a/MyINPulse-back/src/main/java/enseirb/myinpulse/postgres_db/repository/AdministrateursRepository.java +++ b/MyINPulse-back/src/main/java/enseirb/myinpulse/postgres_db/repository/AdministrateursRepository.java @@ -1,6 +1,7 @@ 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; diff --git a/MyINPulse-back/src/main/java/enseirb/myinpulse/postgres_db/repository/ComptesRendusRepository.java b/MyINPulse-back/src/main/java/enseirb/myinpulse/postgres_db/repository/ComptesRendusRepository.java index e4de376..168fd87 100644 --- a/MyINPulse-back/src/main/java/enseirb/myinpulse/postgres_db/repository/ComptesRendusRepository.java +++ b/MyINPulse-back/src/main/java/enseirb/myinpulse/postgres_db/repository/ComptesRendusRepository.java @@ -1,6 +1,7 @@ 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; diff --git a/MyINPulse-back/src/main/java/enseirb/myinpulse/postgres_db/repository/EntrepreneursRepository.java b/MyINPulse-back/src/main/java/enseirb/myinpulse/postgres_db/repository/EntrepreneursRepository.java index bb09b74..fc288f5 100644 --- a/MyINPulse-back/src/main/java/enseirb/myinpulse/postgres_db/repository/EntrepreneursRepository.java +++ b/MyINPulse-back/src/main/java/enseirb/myinpulse/postgres_db/repository/EntrepreneursRepository.java @@ -1,6 +1,7 @@ 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; diff --git a/MyINPulse-back/src/main/java/enseirb/myinpulse/postgres_db/repository/ProjetsRepository.java b/MyINPulse-back/src/main/java/enseirb/myinpulse/postgres_db/repository/ProjetsRepository.java index 37f5d8e..d9d2e59 100644 --- a/MyINPulse-back/src/main/java/enseirb/myinpulse/postgres_db/repository/ProjetsRepository.java +++ b/MyINPulse-back/src/main/java/enseirb/myinpulse/postgres_db/repository/ProjetsRepository.java @@ -1,6 +1,7 @@ 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; diff --git a/MyINPulse-back/src/main/java/enseirb/myinpulse/postgres_db/repository/RendezVousRepository.java b/MyINPulse-back/src/main/java/enseirb/myinpulse/postgres_db/repository/RendezVousRepository.java index 93074f8..2856de3 100644 --- a/MyINPulse-back/src/main/java/enseirb/myinpulse/postgres_db/repository/RendezVousRepository.java +++ b/MyINPulse-back/src/main/java/enseirb/myinpulse/postgres_db/repository/RendezVousRepository.java @@ -1,6 +1,7 @@ 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; diff --git a/MyINPulse-back/src/main/java/enseirb/myinpulse/postgres_db/repository/SectionsRepository.java b/MyINPulse-back/src/main/java/enseirb/myinpulse/postgres_db/repository/SectionsRepository.java index cc25ab1..4d68027 100644 --- a/MyINPulse-back/src/main/java/enseirb/myinpulse/postgres_db/repository/SectionsRepository.java +++ b/MyINPulse-back/src/main/java/enseirb/myinpulse/postgres_db/repository/SectionsRepository.java @@ -1,6 +1,7 @@ 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; diff --git a/MyINPulse-back/src/main/java/enseirb/myinpulse/postgres_db/repository/UtilisateursRepository.java b/MyINPulse-back/src/main/java/enseirb/myinpulse/postgres_db/repository/UtilisateursRepository.java index 28aca29..de8371c 100644 --- a/MyINPulse-back/src/main/java/enseirb/myinpulse/postgres_db/repository/UtilisateursRepository.java +++ b/MyINPulse-back/src/main/java/enseirb/myinpulse/postgres_db/repository/UtilisateursRepository.java @@ -1,6 +1,7 @@ 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; diff --git a/MyINPulse-back/src/main/java/enseirb/myinpulse/security/KeycloakJwtRolesConverter.java b/MyINPulse-back/src/main/java/enseirb/myinpulse/security/KeycloakJwtRolesConverter.java index dba41cc..c73b82a 100644 --- a/MyINPulse-back/src/main/java/enseirb/myinpulse/security/KeycloakJwtRolesConverter.java +++ b/MyINPulse-back/src/main/java/enseirb/myinpulse/security/KeycloakJwtRolesConverter.java @@ -1,5 +1,7 @@ package enseirb.myinpulse.security; +import static java.util.stream.Collectors.toSet; + import org.springframework.core.convert.converter.Converter; import org.springframework.security.authentication.AbstractAuthenticationToken; import org.springframework.security.core.GrantedAuthority; @@ -14,8 +16,6 @@ import java.util.Map; import java.util.stream.Collectors; import java.util.stream.Stream; -import static java.util.stream.Collectors.toSet; - public class KeycloakJwtRolesConverter implements Converter { /** Prefix used for realm level roles. */ public static final String PREFIX_REALM_ROLE = "ROLE_REALM_"; diff --git a/MyINPulse-back/src/main/resources/application.properties b/MyINPulse-back/src/main/resources/application.properties index e67e4f6..08dccb9 100644 --- a/MyINPulse-back/src/main/resources/application.properties +++ b/MyINPulse-back/src/main/resources/application.properties @@ -2,11 +2,7 @@ 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.issuer-uri=http://localhost:7080/realms/test logging.level.org.springframework.security=DEBUG -#spring.datasource.url=jdbc:postgresql://postgres/${POSTGRES_DB} -spring.datasource.url=jdbc:postgresql://localhost:5433/backend_db -spring.datasource.username=backend_db_user -spring.datasource.password=backend_db_user_password +spring.datasource.url=jdbc:postgresql://${DATABASE_URL}/${BACKEND_DB} +spring.datasource.username=${BACKEND_USER} +spring.datasource.password=${BACKEND_PASSWORD} spring.jpa.hibernate.ddl-auto=update -spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect - -spring.data.rest.base-path=/my/base/path \ No newline at end of file diff --git a/MyINPulse-back/src/main/resources/data.sql b/MyINPulse-back/src/main/resources/data.sql index eb4eb9a..a94541b 100644 --- a/MyINPulse-back/src/main/resources/data.sql +++ b/MyINPulse-back/src/main/resources/data.sql @@ -1,10 +1,13 @@ TRUNCATE projets, utilisateurs, entrepreneurs, sections, rendez_vous, comptes_rendus CASCADE; -INSERT INTO projets (nom_projet, logo, date_creation, status_projet) VALUES -('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'); +INSERT INTO projets (nom_projet, logo, date_creation, status_projet) +VALUES ('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'); INSERT INTO utilisateurs (nom_utilisateur, prenom_utilisateur, mail_principal, mail_secondaire, numero_telephone) VALUES ('Dupont', 'Dupond', 'super@mail.fr', 'super2@mail.fr', '06 45 72 45 98'), diff --git a/MyINPulse-back/src/main/resources/schema.sql b/MyINPulse-back/src/main/resources/schema.sql index f1f8b08..aae3f91 100644 --- a/MyINPulse-back/src/main/resources/schema.sql +++ b/MyINPulse-back/src/main/resources/schema.sql @@ -10,12 +10,13 @@ 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) ); + 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 ( @@ -29,87 +30,99 @@ CONSTRAINT pk_utilisateur PRIMARY KEY (id_utilisateur) ); CREATE TABLE entrepreneurs ( -ecole VARCHAR(255) , -filiere VARCHAR(255) , -status_snee BOOLEAN , -CONSTRAINT pk_entrepreneur PRIMARY KEY (id_utilisateur), -INHERITS (utilisateurs) ); + 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 ( -CONSTRAINT pk_administrateur PRIMARY KEY (id_utilisateur), -INHERITS (utilisateurs) ); + 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) ); + 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) ); + 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 +CREATE TABLE comptes_rendus ( -id_compte_rendu SERIAL NOT NULL, -contenu_compte_rendu TEXT , -CONSTRAINT pk_compte_rendu PRIMARY KEY (id_compte_rendu) ); + 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) ); + 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; + 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 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 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 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 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 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; +ALTER TABLE comptes-rendus + ADD CONSTRAINT fk1_compte_rendu FOREIGN KEY (id_rdv) + REFERENCES rendez_vous (id_rdv) + ON +DELETE +CASCADE; diff --git a/config/frontdev.main.env b/config/backdev.env similarity index 64% rename from config/frontdev.main.env rename to config/backdev.env index 26c2803..a7e5517 100644 --- a/config/frontdev.main.env +++ b/config/backdev.env @@ -12,3 +12,11 @@ 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 +VITE_KEYCLOAK_REALM=test +VITE_APP_URL=http://localhost:8080 +VITE_BACKEND_URL=http://localhost:8081/ diff --git a/config/backdev.front.env b/config/backdev.front.env deleted file mode 100644 index 27cf54e..0000000 --- a/config/backdev.front.env +++ /dev/null @@ -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/ diff --git a/config/dev.docker-compose.yaml b/config/dev.docker-compose.yaml new file mode 100644 index 0000000..d66d92a --- /dev/null +++ b/config/dev.docker-compose.yaml @@ -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" + \ No newline at end of file diff --git a/config/dev.env b/config/dev.env new file mode 100644 index 0000000..bcd45f3 --- /dev/null +++ b/config/dev.env @@ -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/ diff --git a/config/backdev.main.env b/config/frontdev.env similarity index 56% rename from config/backdev.main.env rename to config/frontdev.env index 2a597c3..ed4a23b 100644 --- a/config/backdev.main.env +++ b/config/frontdev.env @@ -11,4 +11,12 @@ KEYCLOAK_PASSWORD=keycloak_db_user_password BACKEND_DB=backend_db BACKEND_USER=backend_db_user -BACKEND_PASSWORD=backend_db_user_password \ No newline at end of file +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/ diff --git a/config/frontdev.front.env b/config/frontdev.front.env deleted file mode 100644 index 5eba221..0000000 --- a/config/frontdev.front.env +++ /dev/null @@ -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/ diff --git a/config/prod.docker-compose.yaml b/config/prod.docker-compose.yaml index 51f2d76..496efb3 100644 --- a/config/prod.docker-compose.yaml +++ b/config/prod.docker-compose.yaml @@ -30,10 +30,10 @@ services: 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" + command: ["start-dev", "--http-port", "7080", "--https-port", "7443", "--hostname", "${KEYCLOAK_HOSTNAME}"] # TODO: remove start-dev + #ports: + # - "7080:7080" + # - "7443:7443" depends_on: - postgres @@ -50,6 +50,6 @@ services: context: ./MyINPulse-back/ dockerfile: Dockerfile container_name: MyINPulse-back - ports: - - "8081:8080" + #ports: + # - "8081:8080" \ No newline at end of file diff --git a/config/prod.main.env b/config/prod.env similarity index 61% rename from config/prod.main.env rename to config/prod.env index 179d92c..2fb8da9 100644 --- a/config/prod.main.env +++ b/config/prod.env @@ -12,3 +12,11 @@ KEYCLOAK_PASSWORD=keycloak_db_user_password BACKEND_DB=backend_db BACKEND_USER=backend_db_user 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/ diff --git a/config/prod.front.env b/config/prod.front.env deleted file mode 100644 index cb42a37..0000000 --- a/config/prod.front.env +++ /dev/null @@ -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/