backend-api #6
@@ -6,15 +6,18 @@ import enseirb.myinpulse.postgres_db.repository.ComptesRendusRepository;
 | 
			
		||||
 | 
			
		||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
			
		||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
 | 
			
		||||
import org.springframework.web.bind.annotation.*;
 | 
			
		||||
import org.springframework.web.bind.annotation.GetMapping;
 | 
			
		||||
import org.springframework.web.bind.annotation.RestController;
 | 
			
		||||
 | 
			
		||||
import javax.management.relation.RoleNotFoundException;
 | 
			
		||||
 | 
			
		||||
@SpringBootApplication
 | 
			
		||||
@RestController
 | 
			
		||||
public class GetUserInfo {
 | 
			
		||||
 | 
			
		||||
    @GetMapping("/unauth/random")
 | 
			
		||||
    public boolean rand() {
 | 
			
		||||
    public boolean rand(@RequestHeader("Authorization") String token) throws RoleNotFoundException {
 | 
			
		||||
        System.err.println(token);
 | 
			
		||||
        return Math.random() > 0.5;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -47,6 +47,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());
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -53,6 +53,6 @@ public class EntrepreneursController {
 | 
			
		||||
        if (status_snee != null) {
 | 
			
		||||
            entrepreneur.get().setStatus_snee(status_snee);
 | 
			
		||||
        }
 | 
			
		||||
        return entrepreneur.get();
 | 
			
		||||
        return this.entrepreneursRepository.save(entrepreneur.get());
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -59,6 +59,6 @@ public class ProjetsController {
 | 
			
		||||
        if (status_projet != null) {
 | 
			
		||||
            projet.get().setStatus_projet(status_projet);
 | 
			
		||||
        }
 | 
			
		||||
        return projet.get();
 | 
			
		||||
        return this.projetsRepository.save(projet.get());
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -2,16 +2,14 @@ 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 org.springframework.web.server.ResponseStatusException;
 | 
			
		||||
 | 
			
		||||
import java.time.LocalDate;
 | 
			
		||||
import java.time.LocalDateTime;
 | 
			
		||||
import java.util.Optional;
 | 
			
		||||
 | 
			
		||||
@RestController
 | 
			
		||||
public class RendezVousController {
 | 
			
		||||
 | 
			
		||||
@@ -41,8 +39,8 @@ public class RendezVousController {
 | 
			
		||||
    public RendezVous updateRendezVous(
 | 
			
		||||
            @PathVariable Long id,
 | 
			
		||||
            LocalDate date_rdv,
 | 
			
		||||
            LocalDateTime heure_rdv,
 | 
			
		||||
            LocalDateTime duree_rdv,
 | 
			
		||||
            LocalTime heure_rdv,
 | 
			
		||||
            LocalTime duree_rdv,
 | 
			
		||||
            String lieu_rdv,
 | 
			
		||||
            String sujet_rdv) {
 | 
			
		||||
        Optional<RendezVous> rendezVous = this.rendezVousRepository.findById(id);
 | 
			
		||||
@@ -64,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());
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -55,6 +55,6 @@ public class SectionsController {
 | 
			
		||||
        if (date_modification != null) {
 | 
			
		||||
            section.get().setDate_modification(date_modification);
 | 
			
		||||
        }
 | 
			
		||||
        return section.get();
 | 
			
		||||
        return this.sectionsRepository.save(section.get());
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -62,6 +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,7 +9,7 @@ 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)
 | 
			
		||||
 
 | 
			
		||||
@@ -6,7 +6,7 @@ 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)
 | 
			
		||||
 
 | 
			
		||||
@@ -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;
 | 
			
		||||
 | 
			
		||||
@@ -36,8 +36,8 @@ public class RendezVous {
 | 
			
		||||
    private Long id_rdv;
 | 
			
		||||
 | 
			
		||||
    private LocalDate date_rdv;
 | 
			
		||||
    private LocalDateTime heure_rdv;
 | 
			
		||||
    private LocalDateTime duree_rdv;
 | 
			
		||||
    private LocalTime heure_rdv;
 | 
			
		||||
    private LocalTime duree_rdv;
 | 
			
		||||
 | 
			
		||||
    @Column(length = 255)
 | 
			
		||||
    private String lieu_rdv;
 | 
			
		||||
@@ -49,8 +49,8 @@ public class RendezVous {
 | 
			
		||||
    public RendezVous(
 | 
			
		||||
            Long id_rdv,
 | 
			
		||||
            LocalDate date_rdv,
 | 
			
		||||
            LocalDateTime heure_rdv,
 | 
			
		||||
            LocalDateTime duree_rdv,
 | 
			
		||||
            LocalTime heure_rdv,
 | 
			
		||||
            LocalTime duree_rdv,
 | 
			
		||||
            String lieu_rdv,
 | 
			
		||||
            String sujet_rdv) {
 | 
			
		||||
        this.id_rdv = id_rdv;
 | 
			
		||||
@@ -77,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;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -25,7 +25,7 @@ public class Utilisateurs {
 | 
			
		||||
    @Column(length = 255)
 | 
			
		||||
    private String mail_secondaire;
 | 
			
		||||
 | 
			
		||||
    @Column(length = 15)
 | 
			
		||||
    @Column(length = 20)
 | 
			
		||||
    private String numero_telephone;
 | 
			
		||||
 | 
			
		||||
    public Utilisateurs() {}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,3 +1,7 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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;
 | 
			
		||||
@@ -38,7 +42,7 @@ public class KeycloakJwtRolesConverter implements Converter<Jwt, AbstractAuthent
 | 
			
		||||
                source,
 | 
			
		||||
                Stream.concat(
 | 
			
		||||
                                new JwtGrantedAuthoritiesConverter().convert(source).stream(),
 | 
			
		||||
                                TEMPORARNAME(source).stream())
 | 
			
		||||
                                tokenRolesExtractor(source).stream())
 | 
			
		||||
                        .collect(toSet()));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -46,7 +50,7 @@ public class KeycloakJwtRolesConverter implements Converter<Jwt, AbstractAuthent
 | 
			
		||||
     * Extracts the realm and resource level roles from a JWT token distinguishing between them
 | 
			
		||||
     * 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<>();
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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;
 | 
			
		||||
}
 | 
			
		||||
@@ -1,3 +1,5 @@
 | 
			
		||||
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'),
 | 
			
		||||
@@ -7,56 +9,49 @@ VALUES ('Eau du robinet', decode('013d7d16d7ad4fefb61bd95b765c8ceb', 'hex'), TO_
 | 
			
		||||
       ('HDeirbMI', decode('ab548d6c1d595a2975e6476f544d14c55a', 'hex'), TO_DATE('07-DEC-2024', 'DD-MON-YYYY'),
 | 
			
		||||
        'Lancement');
 | 
			
		||||
 | 
			
		||||
INSERT INTO utilisateurs (nom_utilisateur, prenom_utilisateur, mail_principal, mail_secondaire, numero_telephone)
 | 
			
		||||
VALUES ('Dupont', 'Dupond', 'super@mail.fr', 'super2@mail.fr', '06 45 72 45 98'),
 | 
			
		||||
       ('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');
 | 
			
		||||
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'),
 | 
			
		||||
('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 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'));
 | 
			
		||||
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 rendez_vous (date_rdv, heure_rdv, duree_rdv, lieu_rdv, sujet_rdv)
 | 
			
		||||
VALUES (TO_DATE('24-DEC-2023', 'DD-MON-YYYY'), '00:00:00', '00:37:53', "À la maison", "Ouvrir les cadeaux"),
 | 
			
		||||
       (TO_DATE('15-AUG-2024', 'DD-MON-YYYY'), '22:35:00', '00:12:36', "Sur les quais ou dans un champ probablement",
 | 
			
		||||
        "BOUM BOUM les feux d'artifices (on fête quoi déjà ?)"),
 | 
			
		||||
       (TO_DATE('29-FEB-2023', 'DD-MON-YYYY'), '14:20:00', '00:20:00', "Salle TD 15",
 | 
			
		||||
        "Ah mince c'est pas une année bissextile !"),
 | 
			
		||||
       (TO_DATE('23-JAN-2024', 'DD-MON-YYYY'), '12:56:27', '11:03:33', "Là où le vent nous porte",
 | 
			
		||||
        "Journée la plus importante de l'année"),
 | 
			
		||||
       (TO_DATE('25-AUG-2025', 'DD-MON-YYYY'), '00:09:00', '01:00:00', "Euh c'est par où l'amphi 56 ?",
 | 
			
		||||
        "Rentrée scolaire (il fait trop froid c'est quoi ça on est en août)");
 | 
			
		||||
INSERT INTO sections (titre, contenu_section, date_modification) VALUES
 | 
			
		||||
('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 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");
 | 
			
		||||
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('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');
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										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;
 | 
			
		||||
@@ -20,14 +20,13 @@ CREATE TABLE projets
 | 
			
		||||
 | 
			
		||||
CREATE TABLE utilisateurs
 | 
			
		||||
(
 | 
			
		||||
    id_utilisateur     SERIAL NOT NULL,
 | 
			
		||||
    nom_utilisateur    VARCHAR(255),
 | 
			
		||||
    prenom_utilisateur VARCHAR(255),
 | 
			
		||||
    mail_principal     VARCHAR(255),
 | 
			
		||||
    mail_secondaire    VARCHAR(255),
 | 
			
		||||
    numero_telephone   VARCHAR(15),
 | 
			
		||||
    CONSTRAINT pk_utilisateur PRIMARY KEY (id_utilisateur)
 | 
			
		||||
);
 | 
			
		||||
id_utilisateur      SERIAL    NOT NULL,
 | 
			
		||||
nom_utilisateur     VARCHAR(255)      ,
 | 
			
		||||
prenom_utilisateur  VARCHAR(255)      ,
 | 
			
		||||
mail_principal      VARCHAR(255)      ,
 | 
			
		||||
mail_secondaire     VARCHAR(255)      ,
 | 
			
		||||
numero_telephone    VARCHAR(20)       ,
 | 
			
		||||
CONSTRAINT pk_utilisateur PRIMARY KEY (id_utilisateur) );
 | 
			
		||||
 | 
			
		||||
CREATE TABLE entrepreneurs
 | 
			
		||||
(
 | 
			
		||||
 
 | 
			
		||||
@@ -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