Merge branch 'backend-api' of ssh://gitea.piair.dev:2222/piair/MyINPulse into backend-api
All checks were successful
Format / formatting (push) Successful in 6s
Build / build (push) Successful in 38s
CI / build (push) Successful in 10s
Format / formatting (pull_request) Successful in 5s

This commit is contained in:
Théo Le Lez 2025-03-19 12:06:00 +01:00
commit 137bc84c21
7 changed files with 131 additions and 14 deletions

View File

@ -9,6 +9,14 @@ jobs:
steps: steps:
- name: Checkout sources - name: Checkout sources
uses: actions/checkout@v4 uses: actions/checkout@v4
- name: Load .env file
uses: xom9ikk/dotenv@v2.3.0
with:
path: ./config/
mode: dev
load-mode: strict
- name: Setup Java - name: Setup Java
uses: actions/setup-java@v4 uses: actions/setup-java@v4
with: with:
@ -18,8 +26,8 @@ jobs:
- name: Setup Gradle - name: Setup Gradle
uses: gradle/actions/setup-gradle@v4 uses: gradle/actions/setup-gradle@v4
with: with:
cache-disabled: true cache-disabled: true # Once the code has been pushed once in main, this should be reenabled.
- name: init gradle - name: init gradle
working-directory: ./MyINPulse-back/ working-directory: ./MyINPulse-back/
run: ./gradlew build -x test # todo: run test, currently fail because no database is present run: ./gradlew build # todo: run test, currently fail because no database is present

View File

@ -19,8 +19,14 @@ front/MyINPulse-front/.installed:
vite: ./front/MyINPulse-front/.installed vite: ./front/MyINPulse-front/.installed
keycloak: ./keycloak/.installed
dev-front: clean vite keycloak/.installed:
@echo "running one time install"
@cd keycloak/CAS && sudo sh build.sh
@touch ./keycloak/.installed
dev-front: clean vite keycloak
@cp config/frontdev.env front/MyINPulse-front/.env @cp config/frontdev.env front/MyINPulse-front/.env
@cp config/frontdev.env .env @cp config/frontdev.env .env
@cp config/frontdev.env MyINPulse-back/.env @cp config/frontdev.env MyINPulse-back/.env
@ -28,7 +34,7 @@ dev-front: clean vite
@docker compose up -d --build @docker compose up -d --build
@cd ./front/MyINPulse-front/ && npm run dev @cd ./front/MyINPulse-front/ && npm run dev
prod: clean prod: clean keycloak
@cp config/prod.env front/MyINPulse-front/.env @cp config/prod.env front/MyINPulse-front/.env
@cp config/prod.env .env @cp config/prod.env .env
@cp config/prod.env .env @cp config/prod.env .env
@ -37,7 +43,7 @@ prod: clean
dev-back: dev-back: keycloak
@cp config/backdev.env front/MyINPulse-front/.env @cp config/backdev.env front/MyINPulse-front/.env
@cp config/backdev.env .env @cp config/backdev.env .env
@cp config/backdev.env MyINPulse-back/.env @cp config/backdev.env MyINPulse-back/.env
@ -46,7 +52,7 @@ dev-back:
@echo "cd MyINPulse-back" && echo 'export $$(cat .env | xargs)' @echo "cd MyINPulse-back" && echo 'export $$(cat .env | xargs)'
@echo "./gradlew bootRun --args='--server.port=8081'" @echo "./gradlew bootRun --args='--server.port=8081'"
dev: clean vite dev: clean vite keycloak
@cp config/dev.env front/MyINPulse-front/.env @cp config/dev.env front/MyINPulse-front/.env
@cp config/dev.env .env @cp config/dev.env .env
@cp config/dev.env MyINPulse-back/.env @cp config/dev.env MyINPulse-back/.env
@ -55,3 +61,13 @@ dev: clean vite
@echo "cd MyINPulse-back" && echo 'export $$(cat .env | xargs)' @echo "cd MyINPulse-back" && echo 'export $$(cat .env | xargs)'
@echo "./gradlew bootRun --args='--server.port=8081'" @echo "./gradlew bootRun --args='--server.port=8081'"
@cd ./front/MyINPulse-front/ && npm run dev & @cd ./front/MyINPulse-front/ && npm run dev &
test-back: clean keycloak
@cp config/dev.env front/MyINPulse-front/.env
@cp config/dev.env .env
@cp config/dev.env MyINPulse-back/.env
@cp config/dev.docker-compose.yaml docker-compose.yaml
@docker compose up -d --build
@echo "cd MyINPulse-back" && echo 'export $$(cat .env | xargs)'
@cd ./MyINPulse-back/ && ./gradlew test && ./gradlew jacocoTestReport
@firefox ./MyINPulse-back/build/jacocoHtml/index.html

View File

@ -37,7 +37,6 @@ public class Entrepreneur extends User {
public Entrepreneur() {} public Entrepreneur() {}
public Entrepreneur( public Entrepreneur(
Long idUser,
String userSurname, String userSurname,
String username, String username,
String primaryMail, String primaryMail,
@ -46,7 +45,7 @@ public class Entrepreneur extends User {
String school, String school,
String course, String course,
boolean sneeStatus) { boolean sneeStatus) {
super(idUser, userSurname, username, primaryMail, secondaryMail, phoneNumber); super(userSurname, username, primaryMail, secondaryMail, phoneNumber);
this.school = school; this.school = school;
this.course = course; this.course = course;
this.sneeStatus = sneeStatus; this.sneeStatus = sneeStatus;

View File

@ -28,6 +28,8 @@ public class User {
public User() {} public User() {}
// TODO: this should be removed as we shouldn't be able to chose the ID. Leaving it for
// compatibility purposes, as soon as it's not used anymore, delete it
public User( public User(
Long idUser, Long idUser,
String userSurname, String userSurname,
@ -43,6 +45,19 @@ public class User {
this.phoneNumber = phoneNumber; this.phoneNumber = phoneNumber;
} }
public User(
String userSurname,
String userName,
String primaryMail,
String secondaryMail,
String phoneNumber) {
this.userSurname = userSurname;
this.userName = userName;
this.primaryMail = primaryMail;
this.secondaryMail = secondaryMail;
this.phoneNumber = phoneNumber;
}
public Long getIdUser() { public Long getIdUser() {
return idUser; return idUser;
} }

View File

@ -105,7 +105,7 @@ public class AdminApiService {
// TODO: check if tests are sufficient - peer verification required // TODO: check if tests are sufficient - peer verification required
public void addNewProject(Project project) { public void addNewProject(Project project) {
project.setIdProject(null); project.setIdProject(null);
// We remove it from the request to be sure that it will be auto generated // We remove the ID from the request to be sure that it will be auto generated
try { try {
this.projectService.getProjectByName(project.getProjectName(), true); this.projectService.getProjectByName(project.getProjectName(), true);
throw new ResponseStatusException(HttpStatus.CONFLICT, "Project already exists"); throw new ResponseStatusException(HttpStatus.CONFLICT, "Project already exists");
@ -115,8 +115,14 @@ public class AdminApiService {
} }
} }
Project newProject = projectService.addNewProject(project); Project newProject = projectService.addNewProject(project);
newProject.getProjectAdministrator().updateListProject(newProject); if (project.getProjectAdministrator() != null) {
newProject.getEntrepreneurProposed().setProjectProposed(newProject); newProject.getProjectAdministrator().updateListProject(newProject);
}
if (newProject.getEntrepreneurProposed() != null) {
Entrepreneur proposed = newProject.getEntrepreneurProposed();
proposed.setProjectProposed(newProject);
proposed.setProjectParticipation(newProject);
}
newProject newProject
.getListEntrepreneurParticipation() .getListEntrepreneurParticipation()
.forEach( .forEach(

View File

@ -5,10 +5,12 @@ import static enseirb.myinpulse.model.ProjectDecisionValue.*;
import static org.junit.jupiter.api.Assertions.*; import static org.junit.jupiter.api.Assertions.*;
import enseirb.myinpulse.model.Administrator; import enseirb.myinpulse.model.Administrator;
import enseirb.myinpulse.model.Entrepreneur;
import enseirb.myinpulse.model.Project; import enseirb.myinpulse.model.Project;
import enseirb.myinpulse.model.ProjectDecision; import enseirb.myinpulse.model.ProjectDecision;
import enseirb.myinpulse.service.AdminApiService; import enseirb.myinpulse.service.AdminApiService;
import enseirb.myinpulse.service.database.AdministratorService; import enseirb.myinpulse.service.database.AdministratorService;
import enseirb.myinpulse.service.database.EntrepreneurService;
import enseirb.myinpulse.service.database.ProjectService; import enseirb.myinpulse.service.database.ProjectService;
import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeAll;
@ -26,13 +28,16 @@ import java.util.List;
@Transactional @Transactional
public class AdminApiServiceTest { public class AdminApiServiceTest {
private static long administratorid; private static long administratorid;
private static Administrator administrator;
private static Entrepreneur entrepreneur;
@Autowired private AdminApiService adminApiService; @Autowired private AdminApiService adminApiService;
@Autowired private ProjectService projectService; @Autowired private ProjectService projectService;
@BeforeAll @BeforeAll
static void setup( static void setup(
@Autowired AdministratorService administratorService, @Autowired AdministratorService administratorService,
@Autowired ProjectService projectService) { @Autowired ProjectService projectService,
@Autowired EntrepreneurService entrepreneurService) {
administratorService.addAdministrator( administratorService.addAdministrator(
new Administrator( new Administrator(
"admin", "admin",
@ -40,7 +45,7 @@ public class AdminApiServiceTest {
"testAdminEmpty@example.com", "testAdminEmpty@example.com",
"testAdmin@example.com", "testAdmin@example.com",
"")); ""));
Administrator a = administrator =
administratorService.addAdministrator( administratorService.addAdministrator(
new Administrator( new Administrator(
"admin2", "admin2",
@ -48,7 +53,18 @@ public class AdminApiServiceTest {
"testAdminFull@example.com", "testAdminFull@example.com",
"testAdmin@example.com", "testAdmin@example.com",
"")); ""));
administratorid = a.getIdUser(); administratorid = administrator.getIdUser();
entrepreneur =
new Entrepreneur(
"JeSuisUnEntrepreneurDeCompet",
"EtUé",
"Entrepreneur@inpulse.com",
"mail2",
"phone",
"Ensimag nan jdeconne ENSEIRB (-matmeca mais on s'en fout)",
"info ofc",
false);
entrepreneurService.addEntrepreneur(entrepreneur);
projectService.addNewProject( projectService.addNewProject(
new Project( new Project(
"sampleProjectAdminApiService", "sampleProjectAdminApiService",
@ -161,6 +177,41 @@ public class AdminApiServiceTest {
assertEquals(1, IterableToList(this.adminApiService.getPendingProjects()).size()); assertEquals(1, IterableToList(this.adminApiService.getPendingProjects()).size());
} }
@Test
void addProjectToAdmin() {
assertEquals(0, administrator.getListProject().size());
Project p1 = new Project("assProjectToAdmin", null, LocalDate.now(), ACTIVE, administrator);
this.adminApiService.addNewProject(p1);
assertEquals(1, administrator.getListProject().size());
}
@Test
void addProjectToUser() {
assertNull(entrepreneur.getProjectParticipation());
Project p1 =
new Project("assProjectToAdmin", null, LocalDate.now(), ACTIVE, null, entrepreneur);
this.adminApiService.addNewProject(p1);
assertEquals(p1, entrepreneur.getProjectParticipation());
}
@Test
void addProjectWithManyUsers() {
Entrepreneur e1 = new Entrepreneur();
Entrepreneur e2 = new Entrepreneur();
Entrepreneur e3 = new Entrepreneur();
assertNull(e1.getProjectParticipation());
assertNull(e2.getProjectParticipation());
assertNull(e3.getProjectParticipation());
Project p1 = new Project("assProjectToAdmin", null, LocalDate.now(), ACTIVE, null, null);
p1.updateListEntrepreneurParticipation(e1);
p1.updateListEntrepreneurParticipation(e2);
p1.updateListEntrepreneurParticipation(e3);
this.adminApiService.addNewProject(p1);
assertEquals(p1, e1.getProjectParticipation());
assertEquals(p1, e2.getProjectParticipation());
assertEquals(p1, e3.getProjectParticipation());
}
@Test @Test
void addDuplicateProject() { void addDuplicateProject() {
Project p1 = Project p1 =

22
config/.env.dev Normal file
View 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/