backend-api #6
@@ -26,8 +26,7 @@ public class Project {
 | 
			
		||||
    private byte[] logo;
 | 
			
		||||
    private LocalDate creationDate;
 | 
			
		||||
 | 
			
		||||
    @Column(length = 255)
 | 
			
		||||
    private String projectStatus;
 | 
			
		||||
    @Column private ProjectDecisionValue projectStatus;
 | 
			
		||||
 | 
			
		||||
    @ManyToOne(fetch = FetchType.LAZY)
 | 
			
		||||
    @JoinColumn(name = "idAdministrator")
 | 
			
		||||
@@ -42,11 +41,12 @@ public class Project {
 | 
			
		||||
            String projectName,
 | 
			
		||||
            byte[] logo,
 | 
			
		||||
            LocalDate creationDate,
 | 
			
		||||
            String projectStatus,
 | 
			
		||||
            ProjectDecisionValue projectStatus,
 | 
			
		||||
            Administrator projectAdministrator) {
 | 
			
		||||
        this.projectName = projectName;
 | 
			
		||||
        this.logo = logo;
 | 
			
		||||
        this.creationDate = creationDate;
 | 
			
		||||
        // this.projectStatus = (long) projectStatus.ordinal();
 | 
			
		||||
        this.projectStatus = projectStatus;
 | 
			
		||||
        this.projectAdministrator = projectAdministrator;
 | 
			
		||||
    }
 | 
			
		||||
@@ -83,11 +83,11 @@ public class Project {
 | 
			
		||||
        this.creationDate = creationDate;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getProjectStatus() {
 | 
			
		||||
    public ProjectDecisionValue getProjectStatus() {
 | 
			
		||||
        return projectStatus;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setProjectStatus(String projectStatus) {
 | 
			
		||||
    public void setProjectStatus(ProjectDecisionValue projectStatus) {
 | 
			
		||||
        this.projectStatus = projectStatus;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -4,4 +4,22 @@ public class ProjectDecision {
 | 
			
		||||
    public long projectId;
 | 
			
		||||
    public long adminId;
 | 
			
		||||
    public long isAccepted;
 | 
			
		||||
 | 
			
		||||
    public ProjectDecision(long projectId, long adminId, long isAccepted) {
 | 
			
		||||
        this.projectId = projectId;
 | 
			
		||||
        this.adminId = adminId;
 | 
			
		||||
        this.isAccepted = isAccepted;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public String toString() {
 | 
			
		||||
        return "ProjectDecision{"
 | 
			
		||||
                + "projectId="
 | 
			
		||||
                + projectId
 | 
			
		||||
                + ", adminId="
 | 
			
		||||
                + adminId
 | 
			
		||||
                + ", isAccepted="
 | 
			
		||||
                + isAccepted
 | 
			
		||||
                + '}';
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,9 @@
 | 
			
		||||
package enseirb.myinpulse.model;
 | 
			
		||||
 | 
			
		||||
public enum ProjectDecisionValue {
 | 
			
		||||
    PENDING,
 | 
			
		||||
    ACTIVE,
 | 
			
		||||
    ENDED,
 | 
			
		||||
    ABORTED,
 | 
			
		||||
    REJECTED,
 | 
			
		||||
}
 | 
			
		||||
@@ -2,13 +2,18 @@ package enseirb.myinpulse.repository;
 | 
			
		||||
 | 
			
		||||
import enseirb.myinpulse.model.Administrator;
 | 
			
		||||
import enseirb.myinpulse.model.Project;
 | 
			
		||||
import enseirb.myinpulse.model.ProjectDecisionValue;
 | 
			
		||||
 | 
			
		||||
import org.springframework.data.jpa.repository.JpaRepository;
 | 
			
		||||
import org.springframework.data.rest.core.annotation.RepositoryRestResource;
 | 
			
		||||
 | 
			
		||||
import java.util.Optional;
 | 
			
		||||
 | 
			
		||||
@RepositoryRestResource
 | 
			
		||||
public interface ProjectRepository extends JpaRepository<Project, Long> {
 | 
			
		||||
    Iterable<Project> findByProjectAdministrator(Administrator administrator);
 | 
			
		||||
 | 
			
		||||
    Iterable<Project> findByProjectStatus(String status);
 | 
			
		||||
    Iterable<Project> findByProjectStatus(ProjectDecisionValue status);
 | 
			
		||||
 | 
			
		||||
    Optional<Project> findByProjectName(String projectName);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,8 @@
 | 
			
		||||
package enseirb.myinpulse.service;
 | 
			
		||||
 | 
			
		||||
import static enseirb.myinpulse.model.ProjectDecisionValue.ACTIVE;
 | 
			
		||||
import static enseirb.myinpulse.model.ProjectDecisionValue.REJECTED;
 | 
			
		||||
 | 
			
		||||
import enseirb.myinpulse.model.*;
 | 
			
		||||
import enseirb.myinpulse.service.database.AdministratorService;
 | 
			
		||||
import enseirb.myinpulse.service.database.ProjectService;
 | 
			
		||||
@@ -44,7 +47,7 @@ public class AdminApiService {
 | 
			
		||||
        this.reportService = reportService;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // TODO: test
 | 
			
		||||
    // TODO: check if tests are sufficients - peer verification required
 | 
			
		||||
    public Iterable<Project> getProjectsOfAdmin(String mail) {
 | 
			
		||||
        return projectService.getProjectsByAdminId(
 | 
			
		||||
                administratorService.getAdministratorById(
 | 
			
		||||
@@ -54,27 +57,38 @@ public class AdminApiService {
 | 
			
		||||
    // TODO
 | 
			
		||||
    public Iterable<Appointment> getUpcomingAppointments(String mail) {
 | 
			
		||||
        logger.info("User {} check their upcoming appointments", mail);
 | 
			
		||||
        throw new ResponseStatusException(HttpStatus.NOT_IMPLEMENTED, "Not implemented yet");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // TODO: test
 | 
			
		||||
    // TODO: check if tests are sufficient - peer verification required
 | 
			
		||||
    public Iterable<Project> getPendingProjects() {
 | 
			
		||||
        return this.projectService.getPendingProjects();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // TODO: test
 | 
			
		||||
    // TODO: check if tests are sufficient - peer verification required
 | 
			
		||||
    public void validateProject(ProjectDecision decision) {
 | 
			
		||||
        projectService.updateProject(
 | 
			
		||||
                decision.projectId,
 | 
			
		||||
                null,
 | 
			
		||||
                null,
 | 
			
		||||
                null,
 | 
			
		||||
                "ACTIVE",
 | 
			
		||||
                this.administratorService.getAdministratorById(decision.projectId));
 | 
			
		||||
                (decision.isAccepted == 1) ? ACTIVE : REJECTED,
 | 
			
		||||
                this.administratorService.getAdministratorById(decision.adminId));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // TODO: solve todo + test
 | 
			
		||||
    // TODO: check if tests are sufficient - peer verification required
 | 
			
		||||
    public void addNewProject(Project project) {
 | 
			
		||||
        projectService.addNewProject(project); // TODO: how can the front know the ID ?
 | 
			
		||||
        project.setIdProject(null);
 | 
			
		||||
        // We remove it from the request to be sure that it will be auto generated
 | 
			
		||||
        try {
 | 
			
		||||
            this.projectService.getProjectByName(project.getProjectName(), true);
 | 
			
		||||
            throw new ResponseStatusException(HttpStatus.CONFLICT, "Project already exists");
 | 
			
		||||
        } catch (ResponseStatusException e) {
 | 
			
		||||
            if (e.getStatusCode() == HttpStatus.CONFLICT) {
 | 
			
		||||
                throw new ResponseStatusException(HttpStatus.CONFLICT, "Project already exists");
 | 
			
		||||
            }
 | 
			
		||||
            projectService.addNewProject(project);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void createAppointmentReport(long appointmentId, Report report, String mail) {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,7 @@
 | 
			
		||||
package enseirb.myinpulse.service;
 | 
			
		||||
 | 
			
		||||
import static enseirb.myinpulse.model.ProjectDecisionValue.PENDING;
 | 
			
		||||
 | 
			
		||||
import enseirb.myinpulse.model.Project;
 | 
			
		||||
import enseirb.myinpulse.model.SectionCell;
 | 
			
		||||
import enseirb.myinpulse.service.database.ProjectService;
 | 
			
		||||
@@ -114,7 +116,7 @@ public class EntrepreneurApiService {
 | 
			
		||||
            throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Le projet fourni est vide");
 | 
			
		||||
        }
 | 
			
		||||
        logger.info("User {} created a new project with id {}", mail, project.getIdProject());
 | 
			
		||||
        project.setProjectStatus("PENDING");
 | 
			
		||||
        project.setProjectStatus(PENDING);
 | 
			
		||||
        projectService.addNewProject(project);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,10 @@
 | 
			
		||||
package enseirb.myinpulse.service.database;
 | 
			
		||||
 | 
			
		||||
import static enseirb.myinpulse.model.ProjectDecisionValue.PENDING;
 | 
			
		||||
 | 
			
		||||
import enseirb.myinpulse.model.Administrator;
 | 
			
		||||
import enseirb.myinpulse.model.Project;
 | 
			
		||||
import enseirb.myinpulse.model.ProjectDecisionValue;
 | 
			
		||||
import enseirb.myinpulse.repository.ProjectRepository;
 | 
			
		||||
 | 
			
		||||
import org.apache.logging.log4j.LogManager;
 | 
			
		||||
@@ -54,7 +57,7 @@ public class ProjectService {
 | 
			
		||||
            String projectName,
 | 
			
		||||
            byte[] logo,
 | 
			
		||||
            LocalDate creationDate,
 | 
			
		||||
            String projectStatus,
 | 
			
		||||
            ProjectDecisionValue projectStatus,
 | 
			
		||||
            Administrator administrator) {
 | 
			
		||||
        Optional<Project> project = this.projectRepository.findById(id);
 | 
			
		||||
 | 
			
		||||
@@ -76,11 +79,14 @@ public class ProjectService {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (projectStatus != null) {
 | 
			
		||||
            // TODO: check if this is really useful
 | 
			
		||||
            /*
 | 
			
		||||
            if (!validateStatus(projectStatus)) {
 | 
			
		||||
                logger.error("updateProjectStatus: Invalid status {}", projectStatus);
 | 
			
		||||
                throw new ResponseStatusException(
 | 
			
		||||
                        HttpStatus.NOT_ACCEPTABLE, "Ce status n'est pas accepté");
 | 
			
		||||
            }
 | 
			
		||||
            */
 | 
			
		||||
            project.get().setProjectStatus(projectStatus);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -96,10 +102,23 @@ public class ProjectService {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public Iterable<Project> getPendingProjects() {
 | 
			
		||||
        return this.projectRepository.findByProjectStatus("PENDING");
 | 
			
		||||
        return this.projectRepository.findByProjectStatus(PENDING);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void deleteProjectById(Long id) {
 | 
			
		||||
        this.projectRepository.deleteById(id);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public Project getProjectByName(String name, boolean noerror) {
 | 
			
		||||
        Optional<Project> project = this.projectRepository.findByProjectName(name);
 | 
			
		||||
        if (project.isEmpty()) {
 | 
			
		||||
            if (noerror) logger.error("No project found with name {}", name);
 | 
			
		||||
            throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Ce projet n'existe pas");
 | 
			
		||||
        }
 | 
			
		||||
        return project.get();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public Project getProjectByName(String name) {
 | 
			
		||||
        return getProjectByName(name, false);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,10 +1,12 @@
 | 
			
		||||
package enseirb.myinpulse;
 | 
			
		||||
 | 
			
		||||
import static org.junit.jupiter.api.Assertions.assertEquals;
 | 
			
		||||
import static org.junit.jupiter.api.Assertions.assertThrows;
 | 
			
		||||
import static enseirb.myinpulse.model.ProjectDecisionValue.*;
 | 
			
		||||
 | 
			
		||||
import static org.junit.jupiter.api.Assertions.*;
 | 
			
		||||
 | 
			
		||||
import enseirb.myinpulse.model.Administrator;
 | 
			
		||||
import enseirb.myinpulse.model.Project;
 | 
			
		||||
import enseirb.myinpulse.model.ProjectDecision;
 | 
			
		||||
import enseirb.myinpulse.service.AdminApiService;
 | 
			
		||||
import enseirb.myinpulse.service.database.AdministratorService;
 | 
			
		||||
import enseirb.myinpulse.service.database.ProjectService;
 | 
			
		||||
@@ -23,7 +25,9 @@ import java.util.List;
 | 
			
		||||
@SpringBootTest
 | 
			
		||||
@Transactional
 | 
			
		||||
public class AdminApiServiceTest {
 | 
			
		||||
    private static long administratorid;
 | 
			
		||||
    @Autowired private AdminApiService adminApiService;
 | 
			
		||||
    @Autowired private ProjectService projectService;
 | 
			
		||||
 | 
			
		||||
    @BeforeAll
 | 
			
		||||
    static void setup(
 | 
			
		||||
@@ -36,6 +40,7 @@ public class AdminApiServiceTest {
 | 
			
		||||
                        "testAdminEmpty@example.com",
 | 
			
		||||
                        "testAdmin@example.com",
 | 
			
		||||
                        ""));
 | 
			
		||||
        Administrator a =
 | 
			
		||||
                administratorService.addAdministrator(
 | 
			
		||||
                        new Administrator(
 | 
			
		||||
                                "admin2",
 | 
			
		||||
@@ -43,23 +48,28 @@ public class AdminApiServiceTest {
 | 
			
		||||
                                "testAdminFull@example.com",
 | 
			
		||||
                                "testAdmin@example.com",
 | 
			
		||||
                                ""));
 | 
			
		||||
        administratorid = a.getIdUser();
 | 
			
		||||
        projectService.addNewProject(
 | 
			
		||||
                new Project(
 | 
			
		||||
                        "sampleProjectAdminApiService",
 | 
			
		||||
                        null,
 | 
			
		||||
                        LocalDate.now(),
 | 
			
		||||
                        "ONGOING",
 | 
			
		||||
                        ACTIVE,
 | 
			
		||||
                        administratorService.getAdministratorByPrimaryMain(
 | 
			
		||||
                                "testAdminFull@example.com")));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private <T> List<T> IterableToList(Iterable<T> iterable) {
 | 
			
		||||
        List<T> l = new ArrayList<>();
 | 
			
		||||
        iterable.forEach(l::add);
 | 
			
		||||
        return l;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    void getProjectOfAdminIsEmpty() {
 | 
			
		||||
        Iterable<Project> projects =
 | 
			
		||||
                adminApiService.getProjectsOfAdmin("testAdminEmpty@example.com");
 | 
			
		||||
        List<Project> l = new ArrayList<>();
 | 
			
		||||
        projects.forEach(l::add);
 | 
			
		||||
        assertEquals(0, l.size());
 | 
			
		||||
        assertEquals(0, IterableToList(projects).size());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
@@ -77,10 +87,87 @@ public class AdminApiServiceTest {
 | 
			
		||||
    void getProjectOfAdminNotEmpty() {
 | 
			
		||||
        Iterable<Project> projects =
 | 
			
		||||
                adminApiService.getProjectsOfAdmin("testAdminFull@example.com");
 | 
			
		||||
        List<Project> l = new ArrayList<>();
 | 
			
		||||
        projects.forEach(l::add);
 | 
			
		||||
        List<Project> l = IterableToList(projects);
 | 
			
		||||
        assertEquals(1, l.size());
 | 
			
		||||
        Project p = l.getFirst();
 | 
			
		||||
        assertEquals(p.getProjectName(), "sampleProjectAdminApiService");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    void getPendingProjectsEmpty() {
 | 
			
		||||
        assertEquals(0, IterableToList(this.adminApiService.getPendingProjects()).size());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    void getPendingProjectsNotEmpty() {
 | 
			
		||||
        this.projectService.addNewProject(
 | 
			
		||||
                new Project(
 | 
			
		||||
                        "PendingProjectAdminApiService1", null, LocalDate.now(), PENDING, null));
 | 
			
		||||
        this.projectService.addNewProject(
 | 
			
		||||
                new Project(
 | 
			
		||||
                        "PendingProjectAdminApiService2", null, LocalDate.now(), PENDING, null));
 | 
			
		||||
        Iterable<Project> pendingProjects = this.adminApiService.getPendingProjects();
 | 
			
		||||
        List<Project> pendingProjectsList = IterableToList(pendingProjects);
 | 
			
		||||
        assertEquals(2, pendingProjectsList.size());
 | 
			
		||||
        assertTrue(
 | 
			
		||||
                List.of("PendingProjectAdminApiService1", "PendingProjectAdminApiService2")
 | 
			
		||||
                        .contains(pendingProjectsList.getFirst().getProjectName()));
 | 
			
		||||
        assertTrue(
 | 
			
		||||
                List.of("PendingProjectAdminApiService1", "PendingProjectAdminApiService2")
 | 
			
		||||
                        .contains(pendingProjectsList.getLast().getProjectName()));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    void validateInexistantProject() {
 | 
			
		||||
        ProjectDecision d = new ProjectDecision(-1, 0, 1);
 | 
			
		||||
        assertThrows(ResponseStatusException.class, () -> this.adminApiService.validateProject(d));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    void validateExistantProject() {
 | 
			
		||||
        Project p =
 | 
			
		||||
                new Project("PendingProjectAdminApiService2", null, LocalDate.now(), PENDING, null);
 | 
			
		||||
        this.projectService.addNewProject(p);
 | 
			
		||||
        assertEquals(PENDING, p.getProjectStatus());
 | 
			
		||||
        ProjectDecision d = new ProjectDecision(p.getIdProject(), administratorid, 1);
 | 
			
		||||
        this.adminApiService.validateProject(d);
 | 
			
		||||
        assertEquals(ACTIVE, p.getProjectStatus());
 | 
			
		||||
 | 
			
		||||
        // Check if the project was really updated in the database
 | 
			
		||||
        assertEquals(0, IterableToList(this.adminApiService.getPendingProjects()).size());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    void refuseExistantProject() {
 | 
			
		||||
        Project p =
 | 
			
		||||
                new Project("PendingProjectAdminApiService2", null, LocalDate.now(), PENDING, null);
 | 
			
		||||
        this.projectService.addNewProject(p);
 | 
			
		||||
        assertEquals(PENDING, p.getProjectStatus());
 | 
			
		||||
        ProjectDecision d = new ProjectDecision(p.getIdProject(), administratorid, 0);
 | 
			
		||||
        this.adminApiService.validateProject(d);
 | 
			
		||||
        assertEquals(REJECTED, p.getProjectStatus());
 | 
			
		||||
 | 
			
		||||
        // Check if the project was really updated in the database
 | 
			
		||||
        assertEquals(0, IterableToList(this.adminApiService.getPendingProjects()).size());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    void addProject() {
 | 
			
		||||
        assertEquals(0, IterableToList(this.adminApiService.getPendingProjects()).size());
 | 
			
		||||
        Project p1 =
 | 
			
		||||
                new Project("PendingProjectAdminApiService2", null, LocalDate.now(), PENDING, null);
 | 
			
		||||
        this.adminApiService.addNewProject(p1);
 | 
			
		||||
 | 
			
		||||
        assertEquals(1, IterableToList(this.adminApiService.getPendingProjects()).size());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    void addDuplicateProject() {
 | 
			
		||||
        Project p1 =
 | 
			
		||||
                new Project("PendingProjectAdminApiService2", null, LocalDate.now(), PENDING, null);
 | 
			
		||||
        Project p2 =
 | 
			
		||||
                new Project("PendingProjectAdminApiService2", null, LocalDate.now(), PENDING, null);
 | 
			
		||||
        this.adminApiService.addNewProject(p1);
 | 
			
		||||
        assertThrows(ResponseStatusException.class, () -> this.adminApiService.addNewProject(p2));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user