diff options
| author | Mitsuo Tokumori <[email protected]> | 2022-06-23 06:43:02 -0500 |
|---|---|---|
| committer | Mitsuo Tokumori <[email protected]> | 2022-06-23 06:43:02 -0500 |
| commit | b6f9f8a1edc37a4a03ef16ee48b3cd4a782bc3fc (patch) | |
| tree | 165123565a884b3ae10763f8420aa5c964f60053 /src | |
| download | springboot_restapi-b6f9f8a1edc37a4a03ef16ee48b3cd4a782bc3fc.tar.gz springboot_restapi-b6f9f8a1edc37a4a03ef16ee48b3cd4a782bc3fc.tar.bz2 springboot_restapi-b6f9f8a1edc37a4a03ef16ee48b3cd4a782bc3fc.zip | |
Diffstat (limited to 'src')
12 files changed, 461 insertions, 0 deletions
diff --git a/src/main/java/com/odiparpack/back/odiparback/OdiparbackApplication.java b/src/main/java/com/odiparpack/back/odiparback/OdiparbackApplication.java new file mode 100644 index 0000000..7de9ec2 --- /dev/null +++ b/src/main/java/com/odiparpack/back/odiparback/OdiparbackApplication.java @@ -0,0 +1,22 @@ +package com.odiparpack.back.odiparback; + +import com.odiparpack.back.odiparback.student.Student; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.time.LocalDate; +import java.time.Month; +import java.util.List; + +@SpringBootApplication +public class OdiparbackApplication { + + public static void main(String[] args) { + SpringApplication.run(OdiparbackApplication.class, args); + } + +} + + diff --git a/src/main/java/com/odiparpack/back/odiparback/student/Student.java b/src/main/java/com/odiparpack/back/odiparback/student/Student.java new file mode 100644 index 0000000..aaf89ab --- /dev/null +++ b/src/main/java/com/odiparpack/back/odiparback/student/Student.java @@ -0,0 +1,95 @@ +package com.odiparpack.back.odiparback.student; + +// Make sure to use this javax.persistence instead of Hibernate or other +// provider (of what?) +import javax.persistence.*; +import java.time.LocalDate; +import java.time.Period; + +@Entity // For Hibernate +@Table // Table in DB +public class Student { + @Id + @SequenceGenerator( + name = "student_sequence", + sequenceName = "student_sequence", + allocationSize = 1 + ) + @GeneratedValue( + strategy = GenerationType.SEQUENCE, + generator = "student_sequence" + ) + private Long id; + private String name; + private String email; + private LocalDate dob; + @Transient + private Integer age; + + public Student() { + } + + public Student(Long id, String name, String email, LocalDate dob) { + this.id = id; + this.name = name; + this.email = email; + this.dob = dob; + } + + public Student(String name, String email, LocalDate dob) { + this.name = name; + this.email = email; + this.dob = dob; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public LocalDate getDob() { + return dob; + } + + public void setDob(LocalDate dob) { + this.dob = dob; + } + + public Integer getAge() { + return Period.between(this.dob, LocalDate.now()).getYears(); + } + + public void setAge(Integer age) { + this.age = age; + } + + @Override + public String toString() { + return "Student{" + + "id=" + id + + ", name='" + name + '\'' + + ", email='" + email + '\'' + + ", dob=" + dob + + ", age=" + age + + '}'; + } +} diff --git a/src/main/java/com/odiparpack/back/odiparback/student/StudentController.java b/src/main/java/com/odiparpack/back/odiparback/student/StudentController.java new file mode 100644 index 0000000..ce3e6e0 --- /dev/null +++ b/src/main/java/com/odiparpack/back/odiparback/student/StudentController.java @@ -0,0 +1,41 @@ +package com.odiparpack.back.odiparback.student; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping(path = "api/v1/student") +public class StudentController { + + private final StudentService studentService; + + @Autowired + public StudentController(StudentService studentService) { + this.studentService = studentService; + } + + @GetMapping + public List<Student> getStudents() { + return studentService.getStudents(); + } + + @PostMapping + public void registerNewStudent(@RequestBody Student student) { + studentService.addNewStudent(student); + } + + @DeleteMapping(path = "{studentId}") + public void deleteStudent(@PathVariable("studentId") Long studentId) { + studentService.deleteStudent(studentId); + } + + @PutMapping(path = "{studentId}") + public void updateStudent( + @PathVariable Long studentId, + @RequestParam(required = false) String name, + @RequestParam(required = false) String email) { + studentService.updateStudent(studentId, name, email); + } +} diff --git a/src/main/java/com/odiparpack/back/odiparback/student/StudentRepository.java b/src/main/java/com/odiparpack/back/odiparback/student/StudentRepository.java new file mode 100644 index 0000000..2d0fc31 --- /dev/null +++ b/src/main/java/com/odiparpack/back/odiparback/student/StudentRepository.java @@ -0,0 +1,17 @@ +package com.odiparpack.back.odiparback.student; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; + +import java.util.Optional; + +@Repository +public interface StudentRepository extends JpaRepository<Student, Long> { + + // Transforms to an SQL such as: select * from student where email = ? + //@Query("SELECT s FROM Student s WHERE s.email = ?1") + // ^ JPQL + Optional<Student> findStudentByEmail(String email); + +} diff --git a/src/main/java/com/odiparpack/back/odiparback/student/StudentService.java b/src/main/java/com/odiparpack/back/odiparback/student/StudentService.java new file mode 100644 index 0000000..6831dd8 --- /dev/null +++ b/src/main/java/com/odiparpack/back/odiparback/student/StudentService.java @@ -0,0 +1,69 @@ +package com.odiparpack.back.odiparback.student; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.transaction.Transactional; +import java.time.LocalDate; +import java.time.Month; +import java.util.List; +import java.util.Objects; +import java.util.Optional; + +@Service +public class StudentService { + + private final StudentRepository studentRepository; + + @Autowired + public StudentService(StudentRepository studentRepository) { + this.studentRepository = studentRepository; + } + + public List<Student> getStudents() { + return studentRepository.findAll(); + } + + public void addNewStudent(Student student) { + /* check if the email is already registered, if so throw error */ + Optional<Student> studentOptional = + studentRepository.findStudentByEmail(student.getEmail()); + if (studentOptional.isPresent()) { + throw new IllegalStateException("email taken"); + // email validation is also possible here + } + studentRepository.save(student); + } + + public void deleteStudent(Long studentId) { + boolean exists = studentRepository.existsById(studentId); + if (!exists) { + throw new IllegalStateException( + "student with id " + studentId + " does not exists"); + } + studentRepository.deleteById(studentId); + } + + // "The entity goes into a managed state". Changes are seaved automatically + @Transactional + public void updateStudent(Long studentId, String name, String email) { + Student student = studentRepository.findById(studentId) + .orElseThrow(() -> new IllegalStateException( + "student with id " + studentId + " does not exist" + )); + /* check that attributes are valid before updating object/record */ + if (name != null && name.length() > 0 && + !Objects.equals(student.getName(), name)) { + student.setName(name); + } + if (email != null && email.length() > 0 && + !Objects.equals(student.getName(), email)) { + Optional<Student> studentOptional = studentRepository + .findStudentByEmail(email); + if (studentOptional.isPresent()) { + throw new IllegalStateException("email taken"); + } + student.setEmail(email); + } + } +} diff --git a/src/main/java/com/odiparpack/back/odiparback/student/studentConfig.java b/src/main/java/com/odiparpack/back/odiparback/student/studentConfig.java new file mode 100644 index 0000000..cd6668a --- /dev/null +++ b/src/main/java/com/odiparpack/back/odiparback/student/studentConfig.java @@ -0,0 +1,35 @@ +package com.odiparpack.back.odiparback.student; + +import org.springframework.boot.CommandLineRunner; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.time.LocalDate; +import java.time.Month; +import java.util.List; + +@Configuration +public class studentConfig { + + @Bean + CommandLineRunner commandLineRunner(StudentRepository repository) { + return args -> { + Student ana = new Student( + "Ana", + "[email protected]", + LocalDate.of(2000, Month.JANUARY, 5) + ); + + Student bob = new Student( + "Bob", + "[email protected]", + LocalDate.of(2000, Month.JANUARY, 5) + ); + + repository.saveAll( + List.of(ana, bob) + ); + }; + + } +} diff --git a/src/main/java/com/odiparpack/back/odiparback/usuario/Usuario.java b/src/main/java/com/odiparpack/back/odiparback/usuario/Usuario.java new file mode 100644 index 0000000..416ada1 --- /dev/null +++ b/src/main/java/com/odiparpack/back/odiparback/usuario/Usuario.java @@ -0,0 +1,39 @@ +package com.odiparpack.back.odiparback.usuario; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import javax.persistence.*; + +@Entity +@Table + +@NoArgsConstructor +@AllArgsConstructor +@Getter +@Setter +public class Usuario { + @Id + @SequenceGenerator( + name = "usuario_sequence", + sequenceName = "usuario_sequence", + allocationSize = 1 + ) + @GeneratedValue( + strategy = GenerationType.SEQUENCE, + generator = "usuario_sequence" + ) + private Long id; + private String usuario; + private String clave; + private String nombre; + private String apellido; + private String dni; + private String correo; + + @ManyToOne + private Usuario creador; + +} diff --git a/src/main/java/com/odiparpack/back/odiparback/usuario/UsuarioController.java b/src/main/java/com/odiparpack/back/odiparback/usuario/UsuarioController.java new file mode 100644 index 0000000..9ada36e --- /dev/null +++ b/src/main/java/com/odiparpack/back/odiparback/usuario/UsuarioController.java @@ -0,0 +1,49 @@ +package com.odiparpack.back.odiparback.usuario; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Optional; + +@RestController +@RequestMapping(path = "api/v1/usuario") +public class UsuarioController { + + private final UsuarioService usuarioService; + + @Autowired + public UsuarioController(UsuarioService usuarioService) { + this.usuarioService = usuarioService; + } + + @GetMapping + public List<Usuario> getAll() { + return usuarioService.getAll(); + } + + @GetMapping(path = "{id}") + public Optional<Usuario> get(@PathVariable Long id) { + return usuarioService.get(id); + } + + @PostMapping + public Long register(@RequestBody Usuario usuario) { + return usuarioService.register(usuario); + } + + @PostMapping(path = "0") + public void registerAll(@RequestBody List<Usuario> usuarios) { + usuarioService.registerAll(usuarios); + } + + @DeleteMapping(path = "{id}") + public void delete(@PathVariable("id") Long id) { + usuarioService.delete(id); + } + + @PutMapping + public void update(@RequestBody Usuario usuario) { + usuarioService.update(usuario); + } +} diff --git a/src/main/java/com/odiparpack/back/odiparback/usuario/UsuarioRepository.java b/src/main/java/com/odiparpack/back/odiparback/usuario/UsuarioRepository.java new file mode 100644 index 0000000..668a3d8 --- /dev/null +++ b/src/main/java/com/odiparpack/back/odiparback/usuario/UsuarioRepository.java @@ -0,0 +1,8 @@ +package com.odiparpack.back.odiparback.usuario; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface UsuarioRepository extends JpaRepository<Usuario, Long> { +} diff --git a/src/main/java/com/odiparpack/back/odiparback/usuario/UsuarioService.java b/src/main/java/com/odiparpack/back/odiparback/usuario/UsuarioService.java new file mode 100644 index 0000000..a42c2a5 --- /dev/null +++ b/src/main/java/com/odiparpack/back/odiparback/usuario/UsuarioService.java @@ -0,0 +1,60 @@ +package com.odiparpack.back.odiparback.usuario; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.transaction.Transactional; +import java.util.List; +import java.util.Optional; + +@Service +public class UsuarioService { + + private final UsuarioRepository usuarioRepository; + + @Autowired + public UsuarioService(UsuarioRepository usuarioRepository) { + this.usuarioRepository = usuarioRepository; + } + + public List<Usuario> getAll() { + return usuarioRepository.findAll(); + } + + public Optional<Usuario> get(Long id) { + return usuarioRepository.findById(id); + } + + public Long register(Usuario usuario) { + usuario.setId(null); // overwrite protection + usuario = usuarioRepository.save(usuario); + return usuario.getId(); + } + + public void registerAll(List<Usuario> usuarios) { + usuarioRepository.saveAll(usuarios); + } + + public void delete(Long id) { + boolean exists = usuarioRepository.existsById(id); + if (!exists) { + throw new IllegalStateException( + "usuario with id " + id + " does not exists"); + } + usuarioRepository.deleteById(id); + } + + // "Managed mode". Changes saved automatically + @Transactional + public void update(Usuario usuarioNew) { + Long id = usuarioNew.getId(); + if (usuarioNew.getId() == null || + !usuarioRepository.existsById(id)) { + throw new IllegalStateException( + "usuario id (" + id + ") doesn't exist" + ); + } + usuarioRepository.save(usuarioNew); + } + +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 0000000..1c129a0 --- /dev/null +++ b/src/main/resources/application.properties @@ -0,0 +1,13 @@ +# application.properties + +spring.datasource.url=jdbc:postgresql://localhost:5432/odiparback +spring.datasource.username=opp +spring.datasource.password=odiparfront + +# create-drop,update +spring.jpa.hibernate.ddl-auto=update +spring.jpa.show-sql=true +spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect +spring.jpa.properties.hibernate.format_sql=true + +server.error.include-message=always
\ No newline at end of file diff --git a/src/test/java/com/odiparpack/back/odiparback/OdiparbackApplicationTests.java b/src/test/java/com/odiparpack/back/odiparback/OdiparbackApplicationTests.java new file mode 100644 index 0000000..3117093 --- /dev/null +++ b/src/test/java/com/odiparpack/back/odiparback/OdiparbackApplicationTests.java @@ -0,0 +1,13 @@ +package com.odiparpack.back.odiparback; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.web.bind.annotation.GetMapping; + +@SpringBootTest +class OdiparbackApplicationTests { + + @Test + void contextLoads() { + } +} |
