Skip to content
Snippets Groups Projects
Commit 43c3e97d authored by Laurine LE NET's avatar Laurine LE NET
Browse files

Merge branch 'backend/begging' into 'main'

Backend/begging

See merge request llenet/java-angular!2
parents a13d8be9 49785fbd
No related branches found
No related tags found
No related merge requests found
Showing
with 415 additions and 0 deletions
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
## Set up ## Set up
1. Copie-colle le .env.sample en .env 1. Copie-colle le .env.sample en .env
2. Fait un `docker-compose up`
2. Rajoute le pluggin : https://plugins.jetbrains.com/plugin/7861-envfile 2. Rajoute le pluggin : https://plugins.jetbrains.com/plugin/7861-envfile
3. <img src="img-readme/img.png"> 3. <img src="img-readme/img.png">
3. <img src="img-readme/img_1.png"> 3. <img src="img-readme/img_1.png">
......
create table students
(
id SERIAL PRIMARY KEY,
first_name TEXT not null,
last_name TEXT not null,
birthdate date null,
major_id int null,
image bytea null
);
create table majors
(
id SERIAL PRIMARY KEY,
name TEXT not null,
description TEXT not null
);
create table courses
(
id SERIAL PRIMARY KEY,
name TEXT not null,
hours int not null
);
create table student_course
(
id SERIAL PRIMARY KEY,
student_id int not null,
course_id int not null
);
INSERT INTO majors (id, name, description) VALUES (1, 'MIN', 'Ouaiiis du code partout');
INSERT INTO students (id, first_name, last_name, birthdate, major_id, image) VALUES (1, 'Paul', 'Harrohide', '2002-06-15', 1, null);
INSERT INTO courses (id, name, hours) VALUES (1, 'Java', 30);
INSERT INTO student_course (id, student_id, course_id) VALUES (1, 1, 1);
...@@ -15,6 +15,8 @@ ...@@ -15,6 +15,8 @@
<description>Skeleton of an API project</description> <description>Skeleton of an API project</description>
<properties> <properties>
<java.version>17</java.version> <java.version>17</java.version>
<lombok.version>1.18.20</lombok.version>
<springdoc.version>2.2.0</springdoc.version>
</properties> </properties>
<dependencies> <dependencies>
<dependency> <dependency>
...@@ -36,6 +38,17 @@ ...@@ -36,6 +38,17 @@
<artifactId>spring-boot-starter-test</artifactId> <artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<version>${springdoc.version}</version>
</dependency>
</dependencies> </dependencies>
<build> <build>
......
package com.takima.backskeleton.DAO;
import com.takima.backskeleton.models.Major;
import com.takima.backskeleton.models.Student;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface MajorDao extends JpaRepository<Major, Long> {
@Query("SELECT m.students FROM Major m WHERE m.id= :majorId")
List<Student> getAllStudentsFromMajor(Long majorId);
}
package com.takima.backskeleton.DAO;
import com.takima.backskeleton.models.Student;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface StudentDao extends JpaRepository<Student, Long> {
@Query("SELECT s FROM Student s JOIN s.courses c WHERE c.id= :courseId AND s.major.id = :majorId ")
List<Student> findByMajorIdAndCourseId(int majorId, int courseId);
}
package com.takima.backskeleton.DTO;
import com.takima.backskeleton.models.Course;
import com.takima.backskeleton.models.Major;
import com.takima.backskeleton.models.Student;
import lombok.Builder;
import lombok.Getter;
import org.springframework.web.multipart.MultipartFile;
import java.time.Instant;
import java.util.List;
@Builder
@Getter
public class StudentDto {
private String firstName;
private String lastName;
private Instant birthdate;
private List<Course> courses;
private Major major;
private MultipartFile image;
}
package com.takima.backskeleton.DTO;
import com.takima.backskeleton.models.Student;
import java.io.IOException;
public class StudentMapper {
public static Student fromDto(StudentDto dto, Long id) throws IOException {
return new Student.Builder()
.id(id)
.firstName(dto.getFirstName())
.lastName(dto.getLastName())
.birthdate(dto.getBirthdate())
.courses(dto.getCourses())
.major(dto.getMajor())
.image(dto.getImage().isEmpty() ? dto.getImage().getBytes() : null)
.build();
}
public static StudentDto toDto (Student student){
return StudentDto.builder()
.firstName(student.getFirstName())
.lastName(student.getLastName())
.birthdate(student.getBirthdate())
.courses(student.getCourses())
.major(student.getMajor())
.build();
}
}
package com.takima.backskeleton.controllers;
import com.takima.backskeleton.models.Major;
import com.takima.backskeleton.models.Student;
import com.takima.backskeleton.services.MajorService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@CrossOrigin
@RequestMapping("majors")
@RestController
@RequiredArgsConstructor
public class MajorController {
private final MajorService majorService;
@GetMapping("")
public List<Major> findAll() {
return majorService.findAll();
}
@GetMapping("/{id}/students")
public List<Student> getStudentsOfMajor(@PathVariable Long id) {
return majorService.getStudentsOfMajor(id);
}
}
package com.takima.backskeleton.controllers;
import com.takima.backskeleton.DTO.StudentDto;
import com.takima.backskeleton.models.Student;
import com.takima.backskeleton.services.StudentService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@CrossOrigin
@RequestMapping("students")
@RestController
@RequiredArgsConstructor
public class StudentController {
private final StudentService studentService;
@GetMapping("")
public List<Student> listStudents(@RequestParam(required = false) Integer majorId, @RequestParam(required = false) Integer courseId) {
if (majorId != null && courseId !=null) {
return studentService.searchByMajorAndCourse(majorId, courseId);
}
return studentService.findAll();
}
@DeleteMapping("/{id}")
public void deleteStudent(@PathVariable Long id) {
studentService.deleteById(id);
}
@PostMapping("")
public void addStudent(@RequestBody StudentDto studentDto) {
studentService.addStudent(studentDto);
}
@PostMapping("/{id}")
public void updateStudent(@RequestBody StudentDto studentDto, @PathVariable Long id) {
studentService.updateStudent(studentDto, id);
}
}
package com.takima.backskeleton.models;
import com.fasterxml.jackson.annotation.JsonIgnore;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.NoArgsConstructor;
import java.util.List;
@Entity
@Table(name = "courses")
@NoArgsConstructor
@Getter
public class Course {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private Integer hours;
@ManyToMany(mappedBy = "courses")
@JsonIgnore
List<Student> students;
}
package com.takima.backskeleton.models;
import com.fasterxml.jackson.annotation.JsonIgnore;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.NoArgsConstructor;
import java.util.List;
@Entity
@Table(name = "majors")
@Getter
@NoArgsConstructor
public class Major {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String description;
@OneToMany(mappedBy = "major")
@JsonIgnore
private List<Student> students;
}
package com.takima.backskeleton.models;
import jakarta.persistence.*;
import lombok.Getter;
import java.time.Instant;
import java.util.List;
@Entity
@Table(name = "students")
@Getter
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "first_name")
private String firstName;
@Column(name = "last_name")
private String lastName;
private Instant birthdate;
@ManyToMany
@JoinTable(
name = "student_course",
joinColumns = @JoinColumn(name = "student_id"),
inverseJoinColumns = @JoinColumn(name = "course_id"))
private List<Course> courses;
@ManyToOne()
@JoinColumn(name = "major_id")
private Major major;
@Column(name = "image")
private byte[] image;
private Student(Builder builder) {
this.id = builder.id;
this.firstName = builder.firstName;
this.lastName = builder.lastName;
this.birthdate = builder.birthdate;
this.courses = builder.courses;
this.major = builder.major;
this.image = builder.image;
}
public Student() {
}
public static class Builder {
private Long id;
private String firstName;
private String lastName;
private Instant birthdate;
private List<Course> courses;
private Major major;
private byte[] image;
public Builder id (Long id) {
this.id = id;
return this;
}
public Builder firstName(String firstName) {
this.firstName = firstName;
return this;
}
public Builder lastName(String lastName) {
this.lastName = lastName;
return this;
}
public Builder courses(List<Course> courses) {
this.courses = courses;
return this;
}
public Builder major(Major major) {
this.major = major;
return this;
}
public Builder birthdate(Instant birthdate) {
this.birthdate = birthdate;
return this;
}
public Builder image(byte[] image) {
this.image = image;
return this;
}
public Student build() {
return new Student(this);
}
}
}
package com.takima.backskeleton.services;
import com.takima.backskeleton.DAO.MajorDao;
import com.takima.backskeleton.models.Major;
import com.takima.backskeleton.models.Student;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
@Component
@RequiredArgsConstructor
public class MajorService {
private final MajorDao majorDao;
public List<Major> findAll() {
Iterable<Major> it = majorDao.findAll();
List <Major> majors = new ArrayList<>();
it.forEach(majors::add);
return majors;
}
public List<Student> getStudentsOfMajor(Long id) {
return majorDao.getAllStudentsFromMajor(id);
}
}
package com.takima.backskeleton.services;
import com.takima.backskeleton.DAO.StudentDao;
import com.takima.backskeleton.DTO.StudentDto;
import com.takima.backskeleton.DTO.StudentMapper;
import com.takima.backskeleton.models.Student;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.NoSuchElementException;
@Component
@RequiredArgsConstructor
public class StudentService {
private final StudentDao studentDao;
public List<Student> findAll() {
Iterable<Student> it = studentDao.findAll();
List <Student> users = new ArrayList<>();
it.forEach(users::add);
return users ;
}
public void deleteById(Long id) {
studentDao.deleteById(id);
}
public void addStudent(StudentDto studentDto) {
Student student;
try {
student = StudentMapper.fromDto(studentDto, null);
} catch (IOException e) {
throw new RuntimeException("Error with Student image", e);
}
studentDao.save(student);
}
public void updateStudent(StudentDto studentDto, Long id) {
studentDao.findById(id)
.orElseThrow(() -> new NoSuchElementException("Student doesn't exist"));
Student student;
try {
student = StudentMapper.fromDto(studentDto, id);
} catch (IOException e) {
throw new RuntimeException("Error with Student image", e);
}
studentDao.save(student);
}
public List<Student> searchByMajorAndCourse(int majorId, int courseId) {
return studentDao.findByMajorIdAndCourseId(majorId, courseId);
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment