Compare commits
	
		
			42 Commits
		
	
	
		
			eed4e6f855
			...
			back-postg
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					820757c836 | ||
| 
						 | 
					730aa5f450 | ||
| 
						 | 
					dda3e5fcfd | ||
| 
						 | 
					5e8e875a37 | ||
| 
						 | 
					86e7dc7c75 | ||
| 
						 | 
					6235fe7e68 | ||
| 
						 | 
					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 | ||
| 
						 | 
					45bbe51897 | ||
| 
						 | 
					c715955758 | ||
| 
						 | 
					0fc4be2008 | ||
| 
						 | 
					c7ddc37bf9 | ||
| 
						 | 
					93bb46b017 | ||
| 
						 | 
					249d00177c | 
							
								
								
									
										18
									
								
								.gitea/workflows/back.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								.gitea/workflows/back.yaml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,18 @@
 | 
			
		||||
name: Format
 | 
			
		||||
 | 
			
		||||
on: [ push, pull_request ]
 | 
			
		||||
 | 
			
		||||
jobs:
 | 
			
		||||
 | 
			
		||||
  formatting:
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v4 # v2 minimum required
 | 
			
		||||
      - uses: actions/setup-java@v4
 | 
			
		||||
        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 -n"
 | 
			
		||||
							
								
								
									
										34
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										34
									
								
								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 "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 &
 | 
			
		||||
 
 | 
			
		||||
@@ -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'
 | 
			
		||||
 
 | 
			
		||||
@@ -1,22 +1,10 @@
 | 
			
		||||
package enseirb.myinpulse;
 | 
			
		||||
 | 
			
		||||
import enseirb.myinpulse.security.KeycloakJwtRolesConverter;
 | 
			
		||||
import org.springframework.boot.SpringApplication;
 | 
			
		||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
 | 
			
		||||
import org.springframework.context.annotation.Bean;
 | 
			
		||||
import org.springframework.core.convert.converter.Converter;
 | 
			
		||||
import org.springframework.security.authentication.AbstractAuthenticationToken;
 | 
			
		||||
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
 | 
			
		||||
import org.springframework.security.oauth2.jwt.*;
 | 
			
		||||
import org.springframework.security.web.SecurityFilterChain;
 | 
			
		||||
import org.springframework.web.cors.CorsConfiguration;
 | 
			
		||||
import org.springframework.web.cors.CorsConfigurationSource;
 | 
			
		||||
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
 | 
			
		||||
 | 
			
		||||
import java.util.*;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
 | 
			
		||||
import static org.springframework.security.authorization.AuthorityAuthorizationManager.hasRole;
 | 
			
		||||
 | 
			
		||||
@SpringBootApplication
 | 
			
		||||
public class MyinpulseApplication {
 | 
			
		||||
@@ -24,6 +12,4 @@ public class MyinpulseApplication {
 | 
			
		||||
    public static void main(String[] args) {
 | 
			
		||||
        SpringApplication.run(MyinpulseApplication.class, args);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -2,13 +2,14 @@ package enseirb.myinpulse.api;
 | 
			
		||||
 | 
			
		||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
 | 
			
		||||
import org.springframework.security.core.context.SecurityContextHolder;
 | 
			
		||||
import org.springframework.web.bind.annotation.*;
 | 
			
		||||
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;
 | 
			
		||||
 | 
			
		||||
import javax.management.relation.RoleNotFoundException;
 | 
			
		||||
 | 
			
		||||
@SpringBootApplication
 | 
			
		||||
@RestController
 | 
			
		||||
public class GetUserInfo {
 | 
			
		||||
@@ -21,23 +22,19 @@ public class GetUserInfo {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @CrossOrigin(methods = {RequestMethod.GET, RequestMethod.OPTIONS})
 | 
			
		||||
    @GetMapping("/random")
 | 
			
		||||
    public boolean rand(){
 | 
			
		||||
        System.err.println("HELLO");
 | 
			
		||||
    @GetMapping("/unauth/random")
 | 
			
		||||
    public boolean rand(@RequestHeader("Authorization") String token) throws RoleNotFoundException {
 | 
			
		||||
        System.err.println(token);
 | 
			
		||||
        return Math.random() > 0.5;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @CrossOrigin(methods = {RequestMethod.GET, RequestMethod.OPTIONS})
 | 
			
		||||
    @GetMapping("/random2")
 | 
			
		||||
    public boolean rand2(){
 | 
			
		||||
        System.err.println("HELLO2");
 | 
			
		||||
    @GetMapping("/admin/random")
 | 
			
		||||
    public boolean rand2() {
 | 
			
		||||
        return Math.random() > 0.5;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @CrossOrigin(methods = {RequestMethod.GET, RequestMethod.OPTIONS})
 | 
			
		||||
    @GetMapping("/random3")
 | 
			
		||||
    public boolean rand3(){
 | 
			
		||||
        System.err.println("HELLO");
 | 
			
		||||
    @GetMapping("/entrepreneur/random")
 | 
			
		||||
    public boolean rand3() {
 | 
			
		||||
        return Math.random() > 0.5;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -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,62 @@ 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
 | 
			
		||||
        UrlBasedCorsConfigurationSource source = new
 | 
			
		||||
                UrlBasedCorsConfigurationSource();
 | 
			
		||||
        configuration.setAllowedHeaders(
 | 
			
		||||
                Arrays.asList("authorization", "content-type", "x-auth-token"));
 | 
			
		||||
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
 | 
			
		||||
        source.registerCorsConfiguration("/**", configuration);
 | 
			
		||||
 | 
			
		||||
        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
 | 
			
		||||
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
 | 
			
		||||
        http
 | 
			
		||||
                .authorizeHttpRequests(authorize -> authorize
 | 
			
		||||
                        .requestMatchers("/random2").access(hasRole("REALM_MyINPulse-entrepreneur"))
 | 
			
		||||
                        .requestMatchers("/random").access(hasRole("REALM_MyINPulse-admin"))
 | 
			
		||||
                        .requestMatchers("/random3").permitAll()
 | 
			
		||||
                        .anyRequest().authenticated()
 | 
			
		||||
                )
 | 
			
		||||
                .oauth2ResourceServer(oauth2 -> oauth2
 | 
			
		||||
                        .jwt(jwt -> jwt.
 | 
			
		||||
                                jwtAuthenticationConverter(new KeycloakJwtRolesConverter())));
 | 
			
		||||
        http.authorizeHttpRequests(
 | 
			
		||||
                        authorize ->
 | 
			
		||||
                                authorize
 | 
			
		||||
                                        .requestMatchers("/entrepreneur/**")
 | 
			
		||||
                                        .access(hasRole("REALM_MyINPulse-entrepreneur"))
 | 
			
		||||
                                        .requestMatchers("/admin/**")
 | 
			
		||||
                                        .access(hasRole("REALM_MyINPulse-admin"))
 | 
			
		||||
                                        .requestMatchers("/unauth/**")
 | 
			
		||||
                                        .permitAll()
 | 
			
		||||
                                        .anyRequest()
 | 
			
		||||
                                        .authenticated())
 | 
			
		||||
                .oauth2ResourceServer(
 | 
			
		||||
                        oauth2 ->
 | 
			
		||||
                                oauth2.jwt(
 | 
			
		||||
                                        jwt ->
 | 
			
		||||
                                                jwt.jwtAuthenticationConverter(
 | 
			
		||||
                                                        new KeycloakJwtRolesConverter())));
 | 
			
		||||
        return http.build();
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,7 @@
 | 
			
		||||
package enseirb.myinpulse.exceptions;
 | 
			
		||||
 | 
			
		||||
public class RoleNotFoudException extends RuntimeException {
 | 
			
		||||
    public RoleNotFoudException(String message) {
 | 
			
		||||
        super(message);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,7 @@
 | 
			
		||||
package enseirb.myinpulse.exceptions;
 | 
			
		||||
 | 
			
		||||
public class UserNotFoundException extends RuntimeException {
 | 
			
		||||
    public UserNotFoundException(String message) {
 | 
			
		||||
        super(message);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,10 +1,11 @@
 | 
			
		||||
package enseirb.myinpulse.postgres_db.controller;
 | 
			
		||||
 | 
			
		||||
import enseirb.myinpulse.postgres_db.model.Administrateurs;
 | 
			
		||||
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;
 | 
			
		||||
@@ -12,8 +13,7 @@ import java.util.Optional;
 | 
			
		||||
@RestController
 | 
			
		||||
public class AdministrateursController {
 | 
			
		||||
 | 
			
		||||
    @Autowired
 | 
			
		||||
    AdministrateursRepository administrateursRepository;
 | 
			
		||||
    @Autowired AdministrateursRepository administrateursRepository;
 | 
			
		||||
 | 
			
		||||
    @GetMapping("/Administrateurs")
 | 
			
		||||
    @ResponseBody
 | 
			
		||||
@@ -22,11 +22,11 @@ public class AdministrateursController {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @GetMapping("/Administrateurs/{id}")
 | 
			
		||||
    public Administrateurs getAdministrateursById(@PathVariable Long 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");
 | 
			
		||||
            throw new ResponseStatusException(
 | 
			
		||||
                    HttpStatus.NOT_FOUND, "Cet administrateur n'existe pas");
 | 
			
		||||
        }
 | 
			
		||||
        return administrateur.get();
 | 
			
		||||
    }
 | 
			
		||||
@@ -35,5 +35,4 @@ public class AdministrateursController {
 | 
			
		||||
    public Administrateurs addAdministrateurs(@RequestBody Administrateurs administrateurs) {
 | 
			
		||||
        return this.administrateursRepository.save(administrateurs);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,10 +1,11 @@
 | 
			
		||||
package enseirb.myinpulse.postgres_db.controller;
 | 
			
		||||
 | 
			
		||||
import enseirb.myinpulse.postgres_db.model.ComptesRendus;
 | 
			
		||||
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;
 | 
			
		||||
@@ -12,8 +13,7 @@ import java.util.Optional;
 | 
			
		||||
@RestController
 | 
			
		||||
public class ComptesRendusController {
 | 
			
		||||
 | 
			
		||||
    @Autowired
 | 
			
		||||
    ComptesRendusRepository comptesRendusRepository;
 | 
			
		||||
    @Autowired ComptesRendusRepository comptesRendusRepository;
 | 
			
		||||
 | 
			
		||||
    @GetMapping("/ComptesRendus")
 | 
			
		||||
    @ResponseBody
 | 
			
		||||
@@ -44,6 +44,6 @@ public class ComptesRendusController {
 | 
			
		||||
        if (contenu_compte_rendu != null) {
 | 
			
		||||
            compteRendu.get().setContenu_compte_rendu(contenu_compte_rendu);
 | 
			
		||||
        }
 | 
			
		||||
        return compteRendu.get();
 | 
			
		||||
        return this.comptesRendusRepository.save(compteRendu.get());
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,21 +1,19 @@
 | 
			
		||||
package enseirb.myinpulse.postgres_db.controller;
 | 
			
		||||
 | 
			
		||||
import enseirb.myinpulse.postgres_db.model.Entrepreneurs;
 | 
			
		||||
import enseirb.myinpulse.postgres_db.repository.EntrepreneursRepository;
 | 
			
		||||
 | 
			
		||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
			
		||||
import org.springframework.http.HttpStatus;
 | 
			
		||||
import org.springframework.http.HttpStatusCode;
 | 
			
		||||
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;
 | 
			
		||||
    @Autowired EntrepreneursRepository entrepreneursRepository;
 | 
			
		||||
 | 
			
		||||
    @GetMapping("/Entrepreneurs")
 | 
			
		||||
    @ResponseBody
 | 
			
		||||
@@ -24,11 +22,11 @@ public class EntrepreneursController {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @GetMapping("/Entrepreneurs/{id}")
 | 
			
		||||
    public Entrepreneurs getEntrepreneursById(@PathVariable Long 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");
 | 
			
		||||
            throw new ResponseStatusException(
 | 
			
		||||
                    HttpStatus.NOT_FOUND, "Cet entrepreneur n'existe pas");
 | 
			
		||||
        }
 | 
			
		||||
        return entrepreneur.get();
 | 
			
		||||
    }
 | 
			
		||||
@@ -39,10 +37,12 @@ public class EntrepreneursController {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @PostMapping("/Entrepreneurs/{id}")
 | 
			
		||||
    public Entrepreneurs updateEntrepreneurs(@PathVariable Long id, String ecole, String filiere, Boolean status_snee) {
 | 
			
		||||
    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");
 | 
			
		||||
            throw new ResponseStatusException(
 | 
			
		||||
                    HttpStatus.NOT_FOUND, "Cet entrepreneur n'existe pas");
 | 
			
		||||
        }
 | 
			
		||||
        if (ecole != null) {
 | 
			
		||||
            entrepreneur.get().setEcole(ecole);
 | 
			
		||||
@@ -53,7 +53,6 @@ public class EntrepreneursController {
 | 
			
		||||
        if (status_snee != null) {
 | 
			
		||||
            entrepreneur.get().setStatus_snee(status_snee);
 | 
			
		||||
        }
 | 
			
		||||
        return entrepreneur.get();
 | 
			
		||||
        return this.entrepreneursRepository.save(entrepreneur.get());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,10 +1,11 @@
 | 
			
		||||
package enseirb.myinpulse.postgres_db.controller;
 | 
			
		||||
 | 
			
		||||
import enseirb.myinpulse.postgres_db.model.Projets;
 | 
			
		||||
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;
 | 
			
		||||
@@ -13,8 +14,7 @@ import java.util.Optional;
 | 
			
		||||
@RestController
 | 
			
		||||
public class ProjetsController {
 | 
			
		||||
 | 
			
		||||
    @Autowired
 | 
			
		||||
    ProjetsRepository projetsRepository;
 | 
			
		||||
    @Autowired ProjetsRepository projetsRepository;
 | 
			
		||||
 | 
			
		||||
    @GetMapping("/Projets")
 | 
			
		||||
    @ResponseBody
 | 
			
		||||
@@ -23,8 +23,7 @@ public class ProjetsController {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @GetMapping("/Projets/{id}")
 | 
			
		||||
    public Projets getProjetsById(@PathVariable Long 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");
 | 
			
		||||
@@ -38,7 +37,12 @@ public class ProjetsController {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @PostMapping("/Projets/{id}")
 | 
			
		||||
    public Projets updateProjets(@PathVariable Long id, String nom_projet, Byte[] logo, LocalDate date_creation, String status_projet) {
 | 
			
		||||
    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");
 | 
			
		||||
@@ -55,7 +59,6 @@ public class ProjetsController {
 | 
			
		||||
        if (status_projet != null) {
 | 
			
		||||
            projet.get().setStatus_projet(status_projet);
 | 
			
		||||
        }
 | 
			
		||||
        return projet.get();
 | 
			
		||||
        return this.projetsRepository.save(projet.get());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -1,21 +1,19 @@
 | 
			
		||||
package enseirb.myinpulse.postgres_db.controller;
 | 
			
		||||
 | 
			
		||||
import enseirb.myinpulse.postgres_db.model.RendezVous;
 | 
			
		||||
import enseirb.myinpulse.postgres_db.repository.RendezVousRepository;
 | 
			
		||||
import java.time.LocalDate;
 | 
			
		||||
import java.time.LocalTime;
 | 
			
		||||
import java.util.Optional;
 | 
			
		||||
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;
 | 
			
		||||
    @Autowired RendezVousRepository rendezVousRepository;
 | 
			
		||||
 | 
			
		||||
    @GetMapping("/RendezVous")
 | 
			
		||||
    @ResponseBody
 | 
			
		||||
@@ -24,8 +22,7 @@ public class RendezVousController {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @GetMapping("/RendezVous/{id}")
 | 
			
		||||
    public RendezVous getRendezVousById(@PathVariable Long 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");
 | 
			
		||||
@@ -39,7 +36,13 @@ public class RendezVousController {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @PostMapping("/RendezVous/{id}")
 | 
			
		||||
    public RendezVous updateRendezVous(@PathVariable Long id, LocalDate date_rdv, LocalDateTime heure_rdv, LocalDateTime duree_rdv, String lieu_rdv, String sujet_rdv) {
 | 
			
		||||
    public RendezVous updateRendezVous(
 | 
			
		||||
            @PathVariable Long id,
 | 
			
		||||
            LocalDate date_rdv,
 | 
			
		||||
            LocalTime heure_rdv,
 | 
			
		||||
            LocalTime 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");
 | 
			
		||||
@@ -59,6 +62,6 @@ public class RendezVousController {
 | 
			
		||||
        if (sujet_rdv != null) {
 | 
			
		||||
            rendezVous.get().setSujet_rdv(sujet_rdv);
 | 
			
		||||
        }
 | 
			
		||||
        return rendezVous.get();
 | 
			
		||||
        return this.rendezVousRepository.save(rendezVous.get());
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,10 +1,11 @@
 | 
			
		||||
package enseirb.myinpulse.postgres_db.controller;
 | 
			
		||||
 | 
			
		||||
import enseirb.myinpulse.postgres_db.model.Sections;
 | 
			
		||||
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;
 | 
			
		||||
@@ -13,8 +14,7 @@ import java.util.Optional;
 | 
			
		||||
@RestController
 | 
			
		||||
public class SectionsController {
 | 
			
		||||
 | 
			
		||||
    @Autowired
 | 
			
		||||
    SectionsRepository sectionsRepository;
 | 
			
		||||
    @Autowired SectionsRepository sectionsRepository;
 | 
			
		||||
 | 
			
		||||
    @GetMapping("/Sections")
 | 
			
		||||
    @ResponseBody
 | 
			
		||||
@@ -23,8 +23,7 @@ public class SectionsController {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @GetMapping("/Sections/{id}")
 | 
			
		||||
    public Sections getSectionsById(@PathVariable Long 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");
 | 
			
		||||
@@ -38,7 +37,11 @@ public class SectionsController {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @PostMapping("/Sections/{id}")
 | 
			
		||||
    public Sections updateSections(@PathVariable Long id, String titre, String contenu_section, LocalDateTime date_modification) {
 | 
			
		||||
    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");
 | 
			
		||||
@@ -52,7 +55,6 @@ public class SectionsController {
 | 
			
		||||
        if (date_modification != null) {
 | 
			
		||||
            section.get().setDate_modification(date_modification);
 | 
			
		||||
        }
 | 
			
		||||
        return section.get();
 | 
			
		||||
        return this.sectionsRepository.save(section.get());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,10 +1,11 @@
 | 
			
		||||
package enseirb.myinpulse.postgres_db.controller;
 | 
			
		||||
 | 
			
		||||
import enseirb.myinpulse.postgres_db.model.Utilisateurs;
 | 
			
		||||
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;
 | 
			
		||||
@@ -12,8 +13,7 @@ import java.util.Optional;
 | 
			
		||||
@RestController
 | 
			
		||||
public class UtilisateursController {
 | 
			
		||||
 | 
			
		||||
    @Autowired
 | 
			
		||||
    UtilisateursRepository utilisateursRepository;
 | 
			
		||||
    @Autowired UtilisateursRepository utilisateursRepository;
 | 
			
		||||
 | 
			
		||||
    @GetMapping("/Utilisateurs")
 | 
			
		||||
    @ResponseBody
 | 
			
		||||
@@ -36,11 +36,18 @@ public class UtilisateursController {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @PostMapping("/Utilisateurs/{id}")
 | 
			
		||||
    public Utilisateurs updateUtilisateurs(@PathVariable Long id, String nom_utilisateur, String prenom_utilisateur, String mail_principal, String mail_secondaire, String numero_telephone) {
 | 
			
		||||
    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) {
 | 
			
		||||
        }
 | 
			
		||||
        if (nom_utilisateur != null) {
 | 
			
		||||
            utilisateur.get().setNom_utilisateur(nom_utilisateur);
 | 
			
		||||
        }
 | 
			
		||||
        if (prenom_utilisateur != null) {
 | 
			
		||||
@@ -55,7 +62,6 @@ public class UtilisateursController {
 | 
			
		||||
        if (numero_telephone != null) {
 | 
			
		||||
            utilisateur.get().setNumero_telephone(numero_telephone);
 | 
			
		||||
        }
 | 
			
		||||
        return utilisateur.get();
 | 
			
		||||
        return this.utilisateursRepository.save(utilisateur.get());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -9,26 +9,35 @@ import java.util.List;
 | 
			
		||||
 | 
			
		||||
@Entity
 | 
			
		||||
@Table(name = "administrateurs")
 | 
			
		||||
@PrimaryKeyJoinColumn(name = "id_administrateur")
 | 
			
		||||
 | 
			
		||||
@PrimaryKeyJoinColumn(name = "id_administrateur", referencedColumnName = "id_utilisateur")
 | 
			
		||||
public class Administrateurs extends Utilisateurs {
 | 
			
		||||
 | 
			
		||||
    @ManyToOne(fetch = FetchType.LAZY)
 | 
			
		||||
    @JoinColumn(name = "Projets.id_projets")
 | 
			
		||||
    private Projets projets;
 | 
			
		||||
    @JoinColumn(name = "id_projet")
 | 
			
		||||
    private Projets projetsAdministrateurs;
 | 
			
		||||
 | 
			
		||||
    @OneToMany(mappedBy = "administrateurs", fetch = FetchType.LAZY, orphanRemoval = true)
 | 
			
		||||
    @OneToMany(mappedBy = "administrateursSections", fetch = FetchType.LAZY, orphanRemoval = true)
 | 
			
		||||
    private List<Sections> ListSections = new ArrayList<>();
 | 
			
		||||
 | 
			
		||||
    @ManyToOne(fetch = FetchType.LAZY)
 | 
			
		||||
    @JoinColumn(name = "RendezVous.id_rdv")
 | 
			
		||||
    private RendezVous rendezVous;
 | 
			
		||||
    @JoinColumn(name = "id_rdv")
 | 
			
		||||
    private RendezVous rendezVousAdministrateurs;
 | 
			
		||||
 | 
			
		||||
    public Administrateurs() {
 | 
			
		||||
    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);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    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,7 +1,7 @@
 | 
			
		||||
package enseirb.myinpulse.postgres_db.model;
 | 
			
		||||
 | 
			
		||||
import jakarta.persistence.Entity;
 | 
			
		||||
import jakarta.persistence.*;
 | 
			
		||||
import jakarta.persistence.Entity;
 | 
			
		||||
import jakarta.persistence.Id;
 | 
			
		||||
import jakarta.persistence.Table;
 | 
			
		||||
import jakarta.validation.constraints.NotNull;
 | 
			
		||||
@@ -18,12 +18,10 @@ public class ComptesRendus {
 | 
			
		||||
    private String contenu_compte_rendu;
 | 
			
		||||
 | 
			
		||||
    @ManyToOne(fetch = FetchType.LAZY)
 | 
			
		||||
    @JoinColumn(name = "RendezVous.id_rdv")
 | 
			
		||||
    private RendezVous rendezVous;
 | 
			
		||||
    @JoinColumn(name = "id_rdv")
 | 
			
		||||
    private RendezVous rendezVousComptesRendus;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    public ComptesRendus() {
 | 
			
		||||
    }
 | 
			
		||||
    public ComptesRendus() {}
 | 
			
		||||
 | 
			
		||||
    public ComptesRendus(Long id_compte_rendu, String contenu_compte_rendu) {
 | 
			
		||||
        this.id_compte_rendu = id_compte_rendu;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,40 +1,54 @@
 | 
			
		||||
package enseirb.myinpulse.postgres_db.model;
 | 
			
		||||
 | 
			
		||||
import jakarta.persistence.Entity;
 | 
			
		||||
import jakarta.persistence.*;
 | 
			
		||||
import jakarta.persistence.Entity;
 | 
			
		||||
import jakarta.persistence.Table;
 | 
			
		||||
 | 
			
		||||
@Entity
 | 
			
		||||
@Table(name = "entrepreneurs")
 | 
			
		||||
@PrimaryKeyJoinColumn(name = "id_entrepreneur")
 | 
			
		||||
@PrimaryKeyJoinColumn(name = "id_entrepreneur", referencedColumnName = "id_utilisateur")
 | 
			
		||||
public class Entrepreneurs extends Utilisateurs {
 | 
			
		||||
 | 
			
		||||
    @Column(length=255)
 | 
			
		||||
    @Column(length = 255)
 | 
			
		||||
    private String ecole;
 | 
			
		||||
 | 
			
		||||
    @Column(length=255)
 | 
			
		||||
    @Column(length = 255)
 | 
			
		||||
    private String filiere;
 | 
			
		||||
 | 
			
		||||
    private boolean status_snee;
 | 
			
		||||
 | 
			
		||||
    @ManyToOne(fetch = FetchType.LAZY)
 | 
			
		||||
    @JoinColumn(name = "Projets.id_projets")
 | 
			
		||||
    private Projets projets_participation;
 | 
			
		||||
    @JoinColumn(name = "id_projet_participation", referencedColumnName = "id_projet")
 | 
			
		||||
    private Projets projetsParticipation;
 | 
			
		||||
 | 
			
		||||
    // @Column(insertable=false, updatable=false)
 | 
			
		||||
    @OneToOne(fetch = FetchType.LAZY)
 | 
			
		||||
    @JoinColumn(name = "Projets.id_projets")
 | 
			
		||||
    private Projets projets_propose;
 | 
			
		||||
    @JoinColumn(name = "id_projet_propose", referencedColumnName = "id_projet")
 | 
			
		||||
    private Projets projetsPropose;
 | 
			
		||||
 | 
			
		||||
    @ManyToOne(fetch = FetchType.LAZY)
 | 
			
		||||
    @JoinColumn(name = "RendezVous.id_rdv")
 | 
			
		||||
    private RendezVous rendezVous;
 | 
			
		||||
    @JoinColumn(name = "id_rdv")
 | 
			
		||||
    private RendezVous rendezVousEntrepreneurs;
 | 
			
		||||
 | 
			
		||||
    public Entrepreneurs() {}
 | 
			
		||||
 | 
			
		||||
    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);
 | 
			
		||||
    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;
 | 
			
		||||
 
 | 
			
		||||
@@ -16,35 +16,39 @@ public class Projets {
 | 
			
		||||
    @GeneratedValue(strategy = GenerationType.IDENTITY)
 | 
			
		||||
    private Long id_projet;
 | 
			
		||||
 | 
			
		||||
    @Column(length=255)
 | 
			
		||||
    @Column(length = 255)
 | 
			
		||||
    private String nom_projet;
 | 
			
		||||
 | 
			
		||||
    private Byte[] logo;
 | 
			
		||||
    private byte[] logo;
 | 
			
		||||
 | 
			
		||||
    private LocalDate date_creation;
 | 
			
		||||
 | 
			
		||||
    @Column(length=255)
 | 
			
		||||
    @Column(length = 255)
 | 
			
		||||
    private String status_projet;
 | 
			
		||||
 | 
			
		||||
    @OneToMany(mappedBy = "projets", fetch = FetchType.LAZY, orphanRemoval = true)
 | 
			
		||||
    @OneToMany(mappedBy = "projetsAdministrateurs", fetch = FetchType.LAZY, orphanRemoval = true)
 | 
			
		||||
    private List<Administrateurs> listAdministrateurs = new ArrayList<>();
 | 
			
		||||
 | 
			
		||||
    @OneToMany(mappedBy = "projets", fetch = FetchType.LAZY, orphanRemoval = true)
 | 
			
		||||
    @OneToMany(mappedBy = "projetsParticipation", fetch = FetchType.LAZY, orphanRemoval = true)
 | 
			
		||||
    private List<Entrepreneurs> ListEntrepreneursParticipation = new ArrayList<>();
 | 
			
		||||
 | 
			
		||||
    @OneToOne(mappedBy = "projets", fetch = FetchType.LAZY, orphanRemoval = true)
 | 
			
		||||
    private Entrepreneurs entrepreneurs_propose;
 | 
			
		||||
    @OneToOne(mappedBy = "projetsPropose", fetch = FetchType.LAZY, orphanRemoval = true)
 | 
			
		||||
    private Entrepreneurs entrepreneursPropose;
 | 
			
		||||
 | 
			
		||||
    @OneToMany(mappedBy = "projets", fetch = FetchType.LAZY, orphanRemoval = true)
 | 
			
		||||
    @OneToMany(mappedBy = "projetsSections", 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() {}
 | 
			
		||||
 | 
			
		||||
    public Projets(Long id_projet, String nom_projet, Byte[] logo, LocalDate date_creation, String status_projet) {
 | 
			
		||||
    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;
 | 
			
		||||
@@ -68,11 +72,11 @@ public class Projets {
 | 
			
		||||
        this.nom_projet = nom_projet;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public Byte[] getLogo() {
 | 
			
		||||
    public byte[] getLogo() {
 | 
			
		||||
        return logo;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setLogo(Byte[] logo) {
 | 
			
		||||
    public void setLogo(byte[] logo) {
 | 
			
		||||
        this.logo = logo;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -91,5 +95,4 @@ public class Projets {
 | 
			
		||||
    public void setStatus_projet(String status_projet) {
 | 
			
		||||
        this.status_projet = status_projet;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -4,7 +4,7 @@ import jakarta.persistence.*;
 | 
			
		||||
import jakarta.validation.constraints.NotNull;
 | 
			
		||||
 | 
			
		||||
import java.time.LocalDate;
 | 
			
		||||
import java.time.LocalDateTime;
 | 
			
		||||
import java.time.LocalTime;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
@@ -12,42 +12,47 @@ import java.util.List;
 | 
			
		||||
@Table(name = "rendez_vous")
 | 
			
		||||
public class RendezVous {
 | 
			
		||||
 | 
			
		||||
    @OneToMany(mappedBy = "rendezVousEntrepreneurs", fetch = FetchType.LAZY, orphanRemoval = true)
 | 
			
		||||
    private final List<Entrepreneurs> ListEntrepreneurs = new ArrayList<>();
 | 
			
		||||
 | 
			
		||||
    @OneToMany(mappedBy = "rendezVousAdministrateurs", fetch = FetchType.LAZY, orphanRemoval = true)
 | 
			
		||||
    private final List<Administrateurs> ListAdministrateurs = new ArrayList<>();
 | 
			
		||||
 | 
			
		||||
    @OneToMany(mappedBy = "rendezVousComptesRendus", fetch = FetchType.LAZY, orphanRemoval = true)
 | 
			
		||||
    private final List<ComptesRendus> ListComptesRendus = new ArrayList<>();
 | 
			
		||||
 | 
			
		||||
    @ManyToMany(
 | 
			
		||||
            fetch = FetchType.LAZY,
 | 
			
		||||
            cascade = {CascadeType.ALL})
 | 
			
		||||
    @JoinTable(
 | 
			
		||||
            name = "concerner",
 | 
			
		||||
            joinColumns = @JoinColumn(name = "id_rdv"),
 | 
			
		||||
            inverseJoinColumns = @JoinColumn(name = "id_section"))
 | 
			
		||||
    List<Sections> 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;
 | 
			
		||||
 | 
			
		||||
    private LocalDateTime heure_rdv;
 | 
			
		||||
 | 
			
		||||
    private LocalDateTime duree_rdv;
 | 
			
		||||
 | 
			
		||||
    @Column(length=255)
 | 
			
		||||
    @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<>();
 | 
			
		||||
    public RendezVous() {}
 | 
			
		||||
 | 
			
		||||
    @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) {
 | 
			
		||||
    public RendezVous(
 | 
			
		||||
            Long id_rdv,
 | 
			
		||||
            LocalDate date_rdv,
 | 
			
		||||
            LocalTime heure_rdv,
 | 
			
		||||
            LocalTime duree_rdv,
 | 
			
		||||
            String lieu_rdv,
 | 
			
		||||
            String sujet_rdv) {
 | 
			
		||||
        this.id_rdv = id_rdv;
 | 
			
		||||
        this.date_rdv = date_rdv;
 | 
			
		||||
        this.heure_rdv = heure_rdv;
 | 
			
		||||
@@ -72,19 +77,19 @@ public class RendezVous {
 | 
			
		||||
        this.date_rdv = date_rdv;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public LocalDateTime getHeure_rdv() {
 | 
			
		||||
    public LocalTime getHeure_rdv() {
 | 
			
		||||
        return heure_rdv;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setHeure_rdv(LocalDateTime heure_rdv) {
 | 
			
		||||
    public void setHeure_rdv(LocalTime heure_rdv) {
 | 
			
		||||
        this.heure_rdv = heure_rdv;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public LocalDateTime getDuree_rdv() {
 | 
			
		||||
    public LocalTime getDuree_rdv() {
 | 
			
		||||
        return duree_rdv;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setDuree_rdv(LocalDateTime duree_rdv) {
 | 
			
		||||
    public void setDuree_rdv(LocalTime duree_rdv) {
 | 
			
		||||
        this.duree_rdv = duree_rdv;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -103,5 +108,4 @@ public class RendezVous {
 | 
			
		||||
    public void setSujet_rdv(String sujet_rdv) {
 | 
			
		||||
        this.sujet_rdv = sujet_rdv;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -16,7 +16,7 @@ public class Sections {
 | 
			
		||||
    @GeneratedValue(strategy = GenerationType.IDENTITY)
 | 
			
		||||
    private Long id_section;
 | 
			
		||||
 | 
			
		||||
    @Column(length=255)
 | 
			
		||||
    @Column(length = 255)
 | 
			
		||||
    private String titre;
 | 
			
		||||
 | 
			
		||||
    private String contenu_section;
 | 
			
		||||
@@ -24,20 +24,23 @@ public class Sections {
 | 
			
		||||
    private LocalDateTime date_modification;
 | 
			
		||||
 | 
			
		||||
    @ManyToOne(fetch = FetchType.LAZY)
 | 
			
		||||
    @JoinColumn(name = "Projets.id_projets")
 | 
			
		||||
    private Projets projets;
 | 
			
		||||
    @JoinColumn(name = "id_projet")
 | 
			
		||||
    private Projets projetsSections;
 | 
			
		||||
 | 
			
		||||
    @ManyToOne(fetch = FetchType.LAZY)
 | 
			
		||||
    @JoinColumn(name = "Administrateurs.id_admnistrateur")
 | 
			
		||||
    private Administrateurs administrateurs;
 | 
			
		||||
    @JoinColumn(name = "id_admnistrateur")
 | 
			
		||||
    private Administrateurs administrateursSections;
 | 
			
		||||
 | 
			
		||||
    @ManyToMany(mappedBy = "sections")
 | 
			
		||||
    @ManyToMany(mappedBy = "ListSections")
 | 
			
		||||
    private List<RendezVous> rendezVous = new ArrayList<>();
 | 
			
		||||
 | 
			
		||||
    public Sections() {
 | 
			
		||||
    }
 | 
			
		||||
    public Sections() {}
 | 
			
		||||
 | 
			
		||||
    public Sections(Long id_section, String titre, String contenu_section, LocalDateTime date_modification) {
 | 
			
		||||
    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;
 | 
			
		||||
 
 | 
			
		||||
@@ -13,25 +13,30 @@ public class Utilisateurs {
 | 
			
		||||
    @GeneratedValue(strategy = GenerationType.IDENTITY)
 | 
			
		||||
    private Long id_utilisateur;
 | 
			
		||||
 | 
			
		||||
    @Column(length=255)
 | 
			
		||||
    @Column(length = 255)
 | 
			
		||||
    private String nom_utilisateur;
 | 
			
		||||
 | 
			
		||||
    @Column(length=255)
 | 
			
		||||
    @Column(length = 255)
 | 
			
		||||
    private String prenom_utilisateur;
 | 
			
		||||
 | 
			
		||||
    @Column(length=255)
 | 
			
		||||
    @Column(length = 255)
 | 
			
		||||
    private String mail_principal;
 | 
			
		||||
 | 
			
		||||
    @Column(length=255)
 | 
			
		||||
    @Column(length = 255)
 | 
			
		||||
    private String mail_secondaire;
 | 
			
		||||
 | 
			
		||||
    @Column(length=15)
 | 
			
		||||
    @Column(length = 20)
 | 
			
		||||
    private String numero_telephone;
 | 
			
		||||
 | 
			
		||||
    public Utilisateurs() {
 | 
			
		||||
    }
 | 
			
		||||
    public Utilisateurs() {}
 | 
			
		||||
 | 
			
		||||
    public Utilisateurs(String nom_utilisateur, Long id_utilisateur, String prenom_utilisateur, String mail_principal, String mail_secondaire, String numero_telephone) {
 | 
			
		||||
    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;
 | 
			
		||||
 
 | 
			
		||||
@@ -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;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,9 @@
 | 
			
		||||
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> {
 | 
			
		||||
}
 | 
			
		||||
public interface ComptesRendusRepository extends JpaRepository<ComptesRendus, Long> {}
 | 
			
		||||
 
 | 
			
		||||
@@ -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;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,9 @@
 | 
			
		||||
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> {
 | 
			
		||||
}
 | 
			
		||||
public interface ProjetsRepository extends JpaRepository<Projets, Long> {}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,9 @@
 | 
			
		||||
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> {
 | 
			
		||||
}
 | 
			
		||||
public interface RendezVousRepository extends JpaRepository<RendezVous, Long> {}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,9 @@
 | 
			
		||||
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> {
 | 
			
		||||
}
 | 
			
		||||
public interface SectionsRepository extends JpaRepository<Sections, Long> {}
 | 
			
		||||
 
 | 
			
		||||
@@ -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;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,11 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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.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,44 +20,37 @@ 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<Jwt, AbstractAuthenticationToken> {
 | 
			
		||||
    /**
 | 
			
		||||
     * Prefix used for realm level roles.
 | 
			
		||||
     */
 | 
			
		||||
    /** Prefix used for realm level roles. */
 | 
			
		||||
    public static final String PREFIX_REALM_ROLE = "ROLE_REALM_";
 | 
			
		||||
    /**
 | 
			
		||||
     * Prefix used in combination with the resource (client) name for resource level roles.
 | 
			
		||||
     */
 | 
			
		||||
 | 
			
		||||
    /** Prefix used in combination with the resource (client) name for resource level roles. */
 | 
			
		||||
    public static final String PREFIX_RESOURCE_ROLE = "ROLE_";
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Name of the claim containing the realm level roles
 | 
			
		||||
     */
 | 
			
		||||
    /** Name of the claim containing the realm level roles */
 | 
			
		||||
    private static final String CLAIM_REALM_ACCESS = "realm_access";
 | 
			
		||||
    /**
 | 
			
		||||
     * Name of the claim containing the resources (clients) the user has access to.
 | 
			
		||||
     */
 | 
			
		||||
 | 
			
		||||
    /** Name of the claim containing the resources (clients) the user has access to. */
 | 
			
		||||
    private static final String CLAIM_RESOURCE_ACCESS = "resource_access";
 | 
			
		||||
    /**
 | 
			
		||||
     * Name of the claim containing roles. (Applicable to realm and resource level.)
 | 
			
		||||
     */
 | 
			
		||||
 | 
			
		||||
    /** Name of the claim containing roles. (Applicable to realm and resource level.) */
 | 
			
		||||
    private static final String CLAIM_ROLES = "roles";
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public AbstractAuthenticationToken convert(Jwt source)
 | 
			
		||||
    {
 | 
			
		||||
        return new JwtAuthenticationToken(source, Stream.concat(new JwtGrantedAuthoritiesConverter().convert(source)
 | 
			
		||||
                        .stream(), TEMPORARNAME(source).stream())
 | 
			
		||||
    public AbstractAuthenticationToken convert(Jwt source) {
 | 
			
		||||
        return new JwtAuthenticationToken(
 | 
			
		||||
                source,
 | 
			
		||||
                Stream.concat(
 | 
			
		||||
                                new JwtGrantedAuthoritiesConverter().convert(source).stream(),
 | 
			
		||||
                                tokenRolesExtractor(source).stream())
 | 
			
		||||
                        .collect(toSet()));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Extracts the realm and resource level roles from a JWT token distinguishing between them using prefixes.
 | 
			
		||||
     * Extracts the realm and resource level roles from a JWT token distinguishing between them
 | 
			
		||||
     * using prefixes.
 | 
			
		||||
     */
 | 
			
		||||
    public Collection<GrantedAuthority> TEMPORARNAME(Jwt jwt) {
 | 
			
		||||
    public Collection<GrantedAuthority> tokenRolesExtractor(Jwt jwt) {
 | 
			
		||||
        // Collection that will hold the extracted roles
 | 
			
		||||
        Collection<GrantedAuthority> grantedAuthorities = new ArrayList<>();
 | 
			
		||||
 | 
			
		||||
@@ -66,7 +65,8 @@ public class KeycloakJwtRolesConverter implements Converter<Jwt, AbstractAuthent
 | 
			
		||||
            // Check if any roles are present
 | 
			
		||||
            if (roles != null && !roles.isEmpty()) {
 | 
			
		||||
                // Iterate of the roles and add them to the granted authorities
 | 
			
		||||
                Collection<GrantedAuthority> realmRoles = roles.stream()
 | 
			
		||||
                Collection<GrantedAuthority> realmRoles =
 | 
			
		||||
                        roles.stream()
 | 
			
		||||
                                // Prefix all realm roles with "ROLE_realm_"
 | 
			
		||||
                                .map(role -> new SimpleGrantedAuthority(PREFIX_REALM_ROLE + role))
 | 
			
		||||
                                .collect(Collectors.toList());
 | 
			
		||||
@@ -75,24 +75,33 @@ public class KeycloakJwtRolesConverter implements Converter<Jwt, AbstractAuthent
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Resource (client) roles
 | 
			
		||||
        // A user might have access to multiple resources all containing their own roles. Therefore, it is a map of
 | 
			
		||||
        // A user might have access to multiple resources all containing their own roles. Therefore,
 | 
			
		||||
        // it is a map of
 | 
			
		||||
        // resource each possibly containing a "roles" property.
 | 
			
		||||
        Map<String, Map<String, Collection<String>>> resourceAccess = jwt.getClaim(CLAIM_RESOURCE_ACCESS);
 | 
			
		||||
        Map<String, Map<String, Collection<String>>> resourceAccess =
 | 
			
		||||
                jwt.getClaim(CLAIM_RESOURCE_ACCESS);
 | 
			
		||||
 | 
			
		||||
        // Check if resources are assigned
 | 
			
		||||
        if (resourceAccess != null && !resourceAccess.isEmpty()) {
 | 
			
		||||
            // Iterate of all the resources
 | 
			
		||||
            resourceAccess.forEach((resource, resourceClaims) -> {
 | 
			
		||||
            resourceAccess.forEach(
 | 
			
		||||
                    (resource, resourceClaims) -> {
 | 
			
		||||
                        // Iterate of the "roles" claim inside the resource claims
 | 
			
		||||
                resourceClaims.get(CLAIM_ROLES).forEach(
 | 
			
		||||
                        // Add the role to the granted authority prefixed with ROLE_ and the name of the resource
 | 
			
		||||
                        role -> grantedAuthorities.add(new SimpleGrantedAuthority(PREFIX_RESOURCE_ROLE + resource + "_" + role))
 | 
			
		||||
                );
 | 
			
		||||
                        resourceClaims
 | 
			
		||||
                                .get(CLAIM_ROLES)
 | 
			
		||||
                                .forEach(
 | 
			
		||||
                                        // Add the role to the granted authority prefixed with ROLE_
 | 
			
		||||
                                        // and the name of the resource
 | 
			
		||||
                                        role ->
 | 
			
		||||
                                                grantedAuthorities.add(
 | 
			
		||||
                                                        new SimpleGrantedAuthority(
 | 
			
		||||
                                                                PREFIX_RESOURCE_ROLE
 | 
			
		||||
                                                                        + resource
 | 
			
		||||
                                                                        + "_"
 | 
			
		||||
                                                                        + role)));
 | 
			
		||||
                    });
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return grantedAuthorities;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,135 @@
 | 
			
		||||
package enseirb.myinpulse.utils.keycloak;
 | 
			
		||||
 | 
			
		||||
import static org.springframework.http.MediaType.APPLICATION_JSON;
 | 
			
		||||
 | 
			
		||||
import enseirb.myinpulse.exceptions.UserNotFoundException;
 | 
			
		||||
import enseirb.myinpulse.utils.keycloak.datatypes.RoleRepresentation;
 | 
			
		||||
import enseirb.myinpulse.utils.keycloak.datatypes.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,7 @@
 | 
			
		||||
package enseirb.myinpulse.utils.keycloak.datatypes;
 | 
			
		||||
 | 
			
		||||
public class RoleRepresentation {
 | 
			
		||||
    public String id;
 | 
			
		||||
    public String name;
 | 
			
		||||
    public String description;
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,6 @@
 | 
			
		||||
package enseirb.myinpulse.utils.keycloak.datatypes;
 | 
			
		||||
 | 
			
		||||
public class UserRepresentation {
 | 
			
		||||
    public String id;
 | 
			
		||||
    public String name;
 | 
			
		||||
}
 | 
			
		||||
@@ -2,10 +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://localhost:5432/${MyINPulse_DB}
 | 
			
		||||
spring.datasource.username=${POSTGRES_USER}
 | 
			
		||||
spring.datasource.password=${POSTGRES_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
 | 
			
		||||
@@ -1,52 +1,57 @@
 | 
			
		||||
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');
 | 
			
		||||
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 utilisateurs (nom, prenom, mail_principal, mail_secondaire, numero_telephone) VALUES
 | 
			
		||||
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'),
 | 
			
		||||
('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'),
 | 
			
		||||
('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');
 | 
			
		||||
 | 
			
		||||
INSERT INTO entrepreneurs (ecole, filiere, status_snee) VALUES
 | 
			
		||||
('ENSEIRB-MATMECA', 'INFO', TRUE),
 | 
			
		||||
('ENSC', 'Cognitique', TRUE),
 | 
			
		||||
('ENSEIRB-MATMECA', 'MATMECA', FALSE),
 | 
			
		||||
('SupOptique', 'Classique', TRUE),
 | 
			
		||||
('ENSEGID', 'Géoscience', FALSE),
 | 
			
		||||
('ENSMAC', 'Matériaux composites - Mécanique', FALSE);
 | 
			
		||||
 | 
			
		||||
INSERT INTO entrepreneurs (ecole, filiere, status_snee, id_entrepreneur) VALUES
 | 
			
		||||
('ENSEIRB-MATMECA', 'INFO', TRUE, 1),
 | 
			
		||||
('ENSC', 'Cognitique', TRUE, 2),
 | 
			
		||||
('ENSEIRB-MATMECA', 'MATMECA', FALSE, 3),
 | 
			
		||||
('SupOptique', 'Classique', TRUE, 4),
 | 
			
		||||
('ENSEGID', 'Géoscience', FALSE, 5),
 | 
			
		||||
('ENSMAC', 'Matériaux composites - Mécanique', FALSE, 6);
 | 
			
		||||
 | 
			
		||||
INSERT INTO sections (titre, contenu_section, date_modification) VALUES
 | 
			
		||||
("Problème", "les problèmes...", TO_DATE('15-JAN-2025', 'DD-MON-YYYY')),
 | 
			
		||||
("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_DATE('12-OCT-2022', 'DD-MON-YYYY')),
 | 
			
		||||
("Proposition de valeur unique", "'Son prix est de 2594€' 'Ah oui c'est unique en effet'", TO_DATE('25-MAY-2024', 'DD-MON-YYYY')),
 | 
			
		||||
("Solution", "Un problème ? Une solution", TO_DATE('08-FEB-2024', 'DD-MON-YYYY')),
 | 
			
		||||
("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')),
 | 
			
		||||
("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')),
 | 
			
		||||
("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'));
 | 
			
		||||
('Problème', 'les problèmes...', TO_TIMESTAMP('15-JAN-2025 09:30:20', 'DD-MON-YYYY, HH24:MI:SS')),
 | 
			
		||||
('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')),
 | 
			
		||||
('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')),
 | 
			
		||||
('Solution', 'Un problème ? Une solution', TO_TIMESTAMP('08-FEB-2024 10:17:53', 'DD-MON-YYYY, HH24:MI:SS')),
 | 
			
		||||
('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')),
 | 
			
		||||
('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')),
 | 
			
		||||
('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')),
 | 
			
		||||
('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')),
 | 
			
		||||
('Avantages concurrentiel', 'On est meilleur', TO_TIMESTAMP('23-APR-2024 16:24:02', 'DD-MON-YYYY, HH24:MI:SS'));
 | 
			
		||||
 | 
			
		||||
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)");
 | 
			
		||||
 | 
			
		||||
(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 comptes_rendus (contenu_compte_rendu) VALUES
 | 
			
		||||
("Ah oui ça c'est super, ah ouais j'aime bien, bien vu de penser à ça"),
 | 
			
		||||
("Bonne réunion"),
 | 
			
		||||
("Ouais, j'ai rien compris mais niquel on fait comme vous avez dit"),
 | 
			
		||||
("Non non ça va pas du tout ce que tu me proposes, faut tout refaire"),
 | 
			
		||||
("Réponse de la DSI : non"),
 | 
			
		||||
("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");
 | 
			
		||||
('Ah oui ça c''est super, ah ouais j''aime bien, bien vu de penser à ça'),
 | 
			
		||||
('Bonne réunion'),
 | 
			
		||||
('Ouais, j''ai rien compris mais niquel on fait comme vous avez dit'),
 | 
			
		||||
('Non non ça va pas du tout ce que tu me proposes, faut tout refaire'),
 | 
			
		||||
('Réponse de la DSI : non'),
 | 
			
		||||
('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');
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								MyINPulse-back/src/main/resources/delete.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								MyINPulse-back/src/main/resources/delete.sql
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
DROP TABLE IF EXISTS administrateurs, projets, utilisateurs, entrepreneurs, sections, rendez_vous, comptes_rendus, concerner CASCADE;
 | 
			
		||||
@@ -10,13 +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
 | 
			
		||||
(
 | 
			
		||||
@@ -25,51 +25,57 @@ nom_utilisateur     VARCHAR(255)      ,
 | 
			
		||||
prenom_utilisateur  VARCHAR(255)      ,
 | 
			
		||||
mail_principal      VARCHAR(255)      ,
 | 
			
		||||
mail_secondaire     VARCHAR(255)      ,
 | 
			
		||||
numero_telephone    VARCHAR(15)       ,
 | 
			
		||||
numero_telephone    VARCHAR(20)       ,
 | 
			
		||||
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) );
 | 
			
		||||
    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) );
 | 
			
		||||
    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
 | 
			
		||||
(
 | 
			
		||||
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
 | 
			
		||||
@@ -100,17 +106,23 @@ ALTER TABLE sections
 | 
			
		||||
ALTER TABLE rendez-vous
 | 
			
		||||
    ADD CONSTRAINT fk1_rdv FOREIGN KEY (id_entrepreneur)
 | 
			
		||||
    REFERENCES entrepreneurs (id_entrepreneur)
 | 
			
		||||
          ON DELETE CASCADE;
 | 
			
		||||
    ON
 | 
			
		||||
DELETE
 | 
			
		||||
CASCADE;
 | 
			
		||||
 | 
			
		||||
ALTER TABLE rendez-vous
 | 
			
		||||
    ADD CONSTRAINT fk2_rdv FOREIGN KEY (id_administrateur)
 | 
			
		||||
    REFERENCES administrateurs (id_administrateur)
 | 
			
		||||
          ON DELETE CASCADE;
 | 
			
		||||
    ON
 | 
			
		||||
DELETE
 | 
			
		||||
CASCADE;
 | 
			
		||||
 | 
			
		||||
ALTER TABLE comptes-rendus
 | 
			
		||||
    ADD CONSTRAINT fk1_compte_rendu FOREIGN KEY (id_rdv)
 | 
			
		||||
    REFERENCES rendez_vous (id_rdv)
 | 
			
		||||
          ON DELETE CASCADE;
 | 
			
		||||
    ON
 | 
			
		||||
DELETE
 | 
			
		||||
CASCADE;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,5 @@ import org.springframework.boot.test.context.SpringBootTest;
 | 
			
		||||
class MyinpulseApplicationTests {
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
	void contextLoads() {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
    void contextLoads() {}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -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/
 | 
			
		||||
@@ -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/
 | 
			
		||||
@@ -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=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_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"
 | 
			
		||||
  
 | 
			
		||||
@@ -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/
 | 
			
		||||
@@ -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/
 | 
			
		||||
@@ -14,7 +14,8 @@ axiosInstance.interceptors.response.use(
 | 
			
		||||
    async (error) => {
 | 
			
		||||
        const originalRequest = error.config;
 | 
			
		||||
        if (
 | 
			
		||||
            error.response.status === 401 &&
 | 
			
		||||
            ((error.response && error.response.status === 401) ||
 | 
			
		||||
                error.code == "ERR_NETWORK") &&
 | 
			
		||||
            !originalRequest._retry &&
 | 
			
		||||
            store.authenticated
 | 
			
		||||
        ) {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,9 @@
 | 
			
		||||
<script lang="ts" setup>
 | 
			
		||||
import { store } from "../main.ts";
 | 
			
		||||
import { callApi } from "@/services/api.ts";
 | 
			
		||||
import { ref } from "vue";
 | 
			
		||||
 | 
			
		||||
const CustomRequest = ref("");
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<template>
 | 
			
		||||
@@ -55,6 +58,14 @@ import { callApi } from "@/services/api.ts";
 | 
			
		||||
                <td>res</td>
 | 
			
		||||
                <td id="3"></td>
 | 
			
		||||
            </tr>
 | 
			
		||||
            <tr>
 | 
			
		||||
                <td>
 | 
			
		||||
                    <input v-model="CustomRequest" placeholder="edit me" />
 | 
			
		||||
                </td>
 | 
			
		||||
                <td>
 | 
			
		||||
                    <button @click="callApi(CustomRequest)">call</button>
 | 
			
		||||
                </td>
 | 
			
		||||
            </tr>
 | 
			
		||||
        </tbody>
 | 
			
		||||
    </table>
 | 
			
		||||
</template>
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user