diff --git a/back-skeleton/.mvn/wrapper/maven-wrapper.jar b/back-skeleton/.mvn/wrapper/maven-wrapper.jar deleted file mode 100644 index cb28b0e37c7d206feb564310fdeec0927af4123a..0000000000000000000000000000000000000000 Binary files a/back-skeleton/.mvn/wrapper/maven-wrapper.jar and /dev/null differ diff --git a/back-skeleton/.mvn/wrapper/maven-wrapper.properties b/back-skeleton/.mvn/wrapper/maven-wrapper.properties deleted file mode 100644 index 2e76e189d2c795e3959d558905c2f111f053d7d2..0000000000000000000000000000000000000000 --- a/back-skeleton/.mvn/wrapper/maven-wrapper.properties +++ /dev/null @@ -1,2 +0,0 @@ -distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.4/apache-maven-3.9.4-bin.zip -wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar diff --git a/back-skeleton/src/main/java/com/takima/backskeleton/DTO/StudentMapper.java b/back-skeleton/src/main/java/com/takima/backskeleton/DTO/StudentMapper.java index f2f8aab8bbdbe4cb3fc66a2e61fc225785ad0cd6..64d86d75209f7514c80a5f4cd59ea3022e5cae9a 100644 --- a/back-skeleton/src/main/java/com/takima/backskeleton/DTO/StudentMapper.java +++ b/back-skeleton/src/main/java/com/takima/backskeleton/DTO/StudentMapper.java @@ -13,7 +13,7 @@ public class StudentMapper { .birthdate(dto.getBirthdate()) .courses(dto.getCourses()) .major(dto.getMajor()) - .image(dto.getImage().isEmpty() ? dto.getImage().getBytes() : null) + .image(dto.getImage() == null ? null : dto.getImage().getBytes()) .build(); } diff --git a/back-skeleton/src/main/java/com/takima/backskeleton/services/StudentService.java b/back-skeleton/src/main/java/com/takima/backskeleton/services/StudentService.java index 272a2887ea4654fc9be463c1ff6489c150249239..f8a8b5a249d379197d182a09dd88e4a1350cb8de 100644 --- a/back-skeleton/src/main/java/com/takima/backskeleton/services/StudentService.java +++ b/back-skeleton/src/main/java/com/takima/backskeleton/services/StudentService.java @@ -6,13 +6,15 @@ import com.takima.backskeleton.DTO.StudentMapper; import com.takima.backskeleton.models.Student; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.NoSuchElementException; -@Component +@Service @RequiredArgsConstructor public class StudentService { private final StudentDao studentDao; @@ -28,10 +30,12 @@ public class StudentService { return studentDao.findById(id).orElseThrow(); } + @Transactional public void deleteById(Long id) { studentDao.deleteById(id); } + @Transactional public void addStudent(StudentDto studentDto) { Student student; try { @@ -42,6 +46,7 @@ public class StudentService { studentDao.save(student); } + @Transactional public void updateStudent(StudentDto studentDto, Long id) { studentDao.findById(id) .orElseThrow(() -> new NoSuchElementException("Student doesn't exist")); diff --git a/epf-front-skeleton-main/src/app/app.module.ts b/epf-front-skeleton-main/src/app/app.module.ts index f1dfdf41059d5bf70f78ad6570ff3ae8dd191a14..dcf8a2e0276b005f438af94910faec488652e26e 100644 --- a/epf-front-skeleton-main/src/app/app.module.ts +++ b/epf-front-skeleton-main/src/app/app.module.ts @@ -15,6 +15,7 @@ import { MatButtonModule } from "@angular/material/button" import { MajorsComponent } from "majors/majors.component" import { MajorStudentsComponent } from "majors/major-students/major-students.component" import { ResearchComponent } from "students/research/research.component" +import { HttpClientModule } from "@angular/common/http" @NgModule({ declarations: [ @@ -35,6 +36,7 @@ import { ResearchComponent } from "students/research/research.component" FormsModule, MatIconModule, MatButtonModule, + HttpClientModule, ], providers: [], bootstrap: [AppComponent], diff --git a/epf-front-skeleton-main/src/app/majors/major-students/major-students.component.html b/epf-front-skeleton-main/src/app/majors/major-students/major-students.component.html index 803456e3fc41810c90b4ac91157b4bae8eacfe58..cd8c378bf9d759ba0bb1b8afb038fdf9a17147c9 100644 --- a/epf-front-skeleton-main/src/app/majors/major-students/major-students.component.html +++ b/epf-front-skeleton-main/src/app/majors/major-students/major-students.component.html @@ -15,7 +15,7 @@ <tr *ngFor="let student of (studentsFromMajor.students)"> <td>{{ student.firstName }}</td> <td>{{ student.lastName }}</td> - <td>{{ student.birthDate | date : "dd/MM/yyyy" }}</td> + <td>{{ student.birthdate | date : "dd/MM/yyyy" }}</td> <td>{{ student.major!!.name }}</td> </tr> </ng-container> diff --git a/epf-front-skeleton-main/src/app/models/student.model.ts b/epf-front-skeleton-main/src/app/models/student.model.ts index af821a27cf9180b36a7d3668ada7153cd22433b3..c9d7f015b6709569af44e16fd22b8cad56aa4ad0 100644 --- a/epf-front-skeleton-main/src/app/models/student.model.ts +++ b/epf-front-skeleton-main/src/app/models/student.model.ts @@ -6,7 +6,7 @@ export interface Student { image?: string firstName: string lastName: string - birthDate?: Date + birthdate?: Date courses?: Course[] major: Major } diff --git a/epf-front-skeleton-main/src/app/services/constantsMock.service.ts b/epf-front-skeleton-main/src/app/services/constantsMock.service.ts index 17bd42bf05a0993b0157dc6ef34cca8ea3ef6ed7..05b709a46289a3acb5f451128103bf2d739f7405 100644 --- a/epf-front-skeleton-main/src/app/services/constantsMock.service.ts +++ b/epf-front-skeleton-main/src/app/services/constantsMock.service.ts @@ -34,7 +34,7 @@ export class ConstantsMockService { firstName: "Harry", lastName: "Cover", major: this.mem, - birthDate: new Date("1998-10-10"), + birthdate: new Date("1998-10-10"), courses: [this.german, this.termo], id: 1n, } @@ -42,7 +42,7 @@ export class ConstantsMockService { firstName: "Jacques", lastName: "Climate", major: this.mee, - birthDate: new Date("1999-11-07"), + birthdate: new Date("1999-11-07"), courses: [this.german, this.termo], id: 2n, } @@ -50,7 +50,7 @@ export class ConstantsMockService { firstName: "Alain", lastName: "Parfait", major: this.min, - birthDate: new Date("1999-04-12"), + birthdate: new Date("1999-04-12"), courses: [this.german, this.ioT, this.java], id: 3n, } @@ -58,7 +58,7 @@ export class ConstantsMockService { firstName: "Cathy", lastName: "Mini", major: this.mde, - birthDate: new Date("1999-05-12"), + birthdate: new Date("1999-05-12"), courses: [this.spanish, this.math, this.java], id: 4n, } @@ -66,7 +66,7 @@ export class ConstantsMockService { firstName: "Côme", lastName: "Toulemonde", major: this.mis, - birthDate: new Date("1999-07-16"), + birthdate: new Date("1999-07-16"), courses: [this.spanish, this.anatomie, this.math], id: 5n, } diff --git a/epf-front-skeleton-main/src/app/services/course.service.ts b/epf-front-skeleton-main/src/app/services/course.service.ts index c79212d65b7f0f60dada444dd96c7aaca687372c..bddda45df6e6379d3a8d0d59fde1e4b3a808734a 100644 --- a/epf-front-skeleton-main/src/app/services/course.service.ts +++ b/epf-front-skeleton-main/src/app/services/course.service.ts @@ -2,16 +2,23 @@ import { Injectable } from "@angular/core" import { Observable } from "rxjs" import { Course } from "models/course.model" import { ConstantsMockService } from "./constantsMock.service" +import { HttpClient } from "@angular/common/http" @Injectable({ providedIn: "root", }) export class CourseService { - constructor(private constantsMockService: ConstantsMockService) { + constructor(private constantsMockService: ConstantsMockService, private http: HttpClient) { } - // FIXME : change to api call with httpclient + private coursesUrl = "http://localhost:8080/api/courses" + + // // FIXME : change to api call with httpclient + // findAll(): Observable<Course[]> { + // return new Observable((observer) => observer.next(this.constantsMockService.courses)) + // } + findAll(): Observable<Course[]> { - return new Observable((observer) => observer.next(this.constantsMockService.courses)) + return this.http.get<Course[]>(this.coursesUrl) } } diff --git a/epf-front-skeleton-main/src/app/services/major.service.ts b/epf-front-skeleton-main/src/app/services/major.service.ts index eac8a4a6a6f0923ef4bc5a679bf904a6433e3975..87cafcb4fa5d3bc8aeb4f571e743b5335b75294f 100644 --- a/epf-front-skeleton-main/src/app/services/major.service.ts +++ b/epf-front-skeleton-main/src/app/services/major.service.ts @@ -4,16 +4,23 @@ import { Major } from "models/major.model" import { MajorStudentsDto } from "models/dto/MajorStudentsDto" import { MajorsAndCoursesDto } from "models/dto/majorsAndCoursesDto" import { ConstantsMockService } from "./constantsMock.service" +import { HttpClient } from "@angular/common/http" @Injectable({ providedIn: "root", }) export class MajorService { - constructor(private constantsMockService: ConstantsMockService) { + constructor(private constantsMockService: ConstantsMockService, private http: HttpClient) { } + private majorUrl = "http://localhost:8080/majors" + + // findAll(): Observable<Major[]> { + // return new Observable((observer) => observer.next(this.constantsMockService.majors)) + // } + findAll(): Observable<Major[]> { - return new Observable((observer) => observer.next(this.constantsMockService.majors)) + return this.http.get<Major[]>(this.majorUrl) } findStudentsFromMajor(majorId: string): Observable<MajorStudentsDto> { diff --git a/epf-front-skeleton-main/src/app/services/student.service.ts b/epf-front-skeleton-main/src/app/services/student.service.ts index 12e9462d10ac43381ea014694e003efa0e738346..0522c9a49f4d27cedecba140baed24cde18d90cf 100644 --- a/epf-front-skeleton-main/src/app/services/student.service.ts +++ b/epf-front-skeleton-main/src/app/services/student.service.ts @@ -4,22 +4,38 @@ import { Student } from "models/student.model" import { Course } from "models/course.model" import { ConstantsMockService } from "./constantsMock.service" import { MajorsAndCoursesDto } from "models/dto/majorsAndCoursesDto" +import { HttpClient } from "@angular/common/http" @Injectable({ providedIn: "root", }) export class StudentService { - constructor(private constantsMockService: ConstantsMockService) { + constructor(private constantsMockService: ConstantsMockService, private http: HttpClient) { } - // FIXME : change to api call with httpclient + private studentsUrl = "http://localhost:8080/students" + findAll(): Observable<Student[]> { - return new Observable((observer) => observer.next(this.constantsMockService.students)) + return this.http.get<Student[]>(this.studentsUrl) } - // FIXME : unmock me ! findById(id: number): Observable<Student> { - return new Observable((observer) => observer.next(this.constantsMockService.students.find((s) => s.id === BigInt(id)))) + return this.http.get<Student>(this.studentsUrl + `/${id}` ) + } + + update(id: number, student: Student): Observable<Student> { + return this.http.post<Student>(this.studentsUrl + `/${id}`, student) + } + + create(student: Student): Observable<Student> { + return this.http.post<Student>(this.studentsUrl, student) + } + + delete(student: Student) { + const index = this.constantsMockService.students.indexOf(student) + if (index > -1) { + this.constantsMockService.students.splice(index, 1) + } } addCourseToStudent(student: Student, course: Course) { @@ -39,22 +55,15 @@ export class StudentService { return student } - save(student: Student) { - const index = this.constantsMockService.students.indexOf(student) - if (index > -1) { - this.constantsMockService.students.splice(index, 1, student) - } else { - student.id = BigInt(this.constantsMockService.students.length + 1) - this.constantsMockService.students.push(student) - } - } - - delete(student: Student) { - const index = this.constantsMockService.students.indexOf(student) - if (index > -1) { - this.constantsMockService.students.splice(index, 1) - } - } + // save(student: Student) { + // const index = this.constantsMockService.students.indexOf(student) + // if (index > -1) { + // this.constantsMockService.students.splice(index, 1, student) + // } else { + // student.id = BigInt(this.constantsMockService.students.length + 1) + // this.constantsMockService.students.push(student) + // } + // } searchByMajorAndCourse(majorsAndCoursesDto: MajorsAndCoursesDto): Observable<Student[]> { return new Observable((observer) => observer.next(this.constantsMockService.students.filter(s => s.major.id === majorsAndCoursesDto.majors[0].id && s.courses?.includes(majorsAndCoursesDto.courses[0])))) diff --git a/epf-front-skeleton-main/src/app/students/student-details/student-details.component.html b/epf-front-skeleton-main/src/app/students/student-details/student-details.component.html index 43a48fb0dafbafe219ee30432736d33a70ba25a4..ed5d893ca428b9c0239d023909dd972564557c8c 100644 --- a/epf-front-skeleton-main/src/app/students/student-details/student-details.component.html +++ b/epf-front-skeleton-main/src/app/students/student-details/student-details.component.html @@ -2,10 +2,10 @@ <h1>Student's personal data</h1> <form (ngSubmit)="save(student)" #studentForm="ngForm"> <div class="form-group"> - <label for="firstName">Picture</label> + <label for="image">Picture</label> <input type="file" class="form-control" id="image" - required - [(ngModel)]="student.image"> + + [(ngModel)]="student.image" name="image"> </div> <div class="form-group"> <label for="firstName">First Name</label> @@ -33,7 +33,7 @@ <label for="birthDate">Birthdate</label> <input type="date" class="form-control" id="birthDate" required - [ngModel]="student.birthDate | date:'yyyy-MM-dd'" name="birthDate" + [ngModel]="student.birthdate | date:'yyyy-MM-dd'" name="birthDate" #birthDate="ngModel" (ngModelChange)="updateBirthdate($event, student)"> <div [hidden]="birthDate.pristine && birthDate.untouched || birthDate.value !== today.toISOString().slice(0, 10)" class="alert alert-danger"> diff --git a/epf-front-skeleton-main/src/app/students/student-details/student-details.component.scss b/epf-front-skeleton-main/src/app/students/student-details/student-details.component.scss index 3a7aaf2a0efad79cb926f4dd4301099d8e500679..d9bf7edba0d899ad4e299e2ed57899de1dff358c 100644 --- a/epf-front-skeleton-main/src/app/students/student-details/student-details.component.scss +++ b/epf-front-skeleton-main/src/app/students/student-details/student-details.component.scss @@ -4,8 +4,7 @@ display: flex; flex-direction: column; padding: 30px; - color: theme.$white; - h1 { + color: theme.$white h1 { color: theme.$common-purple; font-size: xx-large; } diff --git a/epf-front-skeleton-main/src/app/students/student-details/student-details.component.ts b/epf-front-skeleton-main/src/app/students/student-details/student-details.component.ts index e090df44a181bc2e5aee1ad4ccab02d5cab025b5..ab90308aabc6c478b8ee5b629bdfec324370b365 100644 --- a/epf-front-skeleton-main/src/app/students/student-details/student-details.component.ts +++ b/epf-front-skeleton-main/src/app/students/student-details/student-details.component.ts @@ -43,12 +43,17 @@ export class StudentDetailsComponent { } save(student: Student) { - this.studentService.save(student) + const id = this._route.snapshot.params["id"] + if (id == "new") { + this.studentService.create(student).subscribe() + } else { + this.studentService.update(id, student).subscribe() // todo mettre à jour le listing + } this.router.navigate(["students"]) } // because the format of the date doesn't fit date picker updateBirthdate($event: any, student: Student) { - student.birthDate = new Date($event) + student.birthdate = new Date($event) } } diff --git a/epf-front-skeleton-main/src/app/students/student-details/student-details.resolver.ts b/epf-front-skeleton-main/src/app/students/student-details/student-details.resolver.ts index 57808c25414f266c6323998f3e945b14143ae20d..8616ba2c100be119979acc4f059e2803c8dcc7c0 100644 --- a/epf-front-skeleton-main/src/app/students/student-details/student-details.resolver.ts +++ b/epf-front-skeleton-main/src/app/students/student-details/student-details.resolver.ts @@ -16,6 +16,6 @@ export class StudentDetailsResolver implements Resolve<Student> { if (route.params["id"] == "new") { return new Observable((observer) => observer.next({firstName: "", lastName: "", major: {name: "", description: "", students: []}})) } - return this.studentService.findById(parseInt(route.paramMap.get("id")!!, 10)) + return this.studentService.findById(parseInt(route.params["id"], 10)) } } diff --git a/epf-front-skeleton-main/src/app/students/students.component.html b/epf-front-skeleton-main/src/app/students/students.component.html index ad3be37d0c16625cfa597bbf2f8145dd6792716e..35fb8955cc308168360ab18038f2cae6f8ca39e2 100644 --- a/epf-front-skeleton-main/src/app/students/students.component.html +++ b/epf-front-skeleton-main/src/app/students/students.component.html @@ -18,10 +18,11 @@ <tr *ngFor="let student of (students$ | async)" routerLink="/student-details/{{student.id}}"> <td> <img src="assets/defaultPicture.svg" alt="Photo manquante"> +<!-- todo remplacer cette image par celle récupéré dans le backend --> </td> <td>{{ student.firstName }}</td> <td>{{ student.lastName }}</td> - <td>{{ student.birthDate | date : "dd/MM/yyyy" }}</td> + <td>{{ student.birthdate | date : "dd/MM/yyyy" }}</td> <td>{{ student.major!!.name }}</td> <td> <button mat-icon-button color="warn" (click)="deleteStudent(student)">