summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore76
-rw-r--r--README.md16
-rw-r--r--pom.xml64
-rw-r--r--src/main/java/com/odiparpack/back/odiparback/OdiparbackApplication.java22
-rw-r--r--src/main/java/com/odiparpack/back/odiparback/student/Student.java95
-rw-r--r--src/main/java/com/odiparpack/back/odiparback/student/StudentController.java41
-rw-r--r--src/main/java/com/odiparpack/back/odiparback/student/StudentRepository.java17
-rw-r--r--src/main/java/com/odiparpack/back/odiparback/student/StudentService.java69
-rw-r--r--src/main/java/com/odiparpack/back/odiparback/student/studentConfig.java35
-rw-r--r--src/main/java/com/odiparpack/back/odiparback/usuario/Usuario.java39
-rw-r--r--src/main/java/com/odiparpack/back/odiparback/usuario/UsuarioController.java49
-rw-r--r--src/main/java/com/odiparpack/back/odiparback/usuario/UsuarioRepository.java8
-rw-r--r--src/main/java/com/odiparpack/back/odiparback/usuario/UsuarioService.java60
-rw-r--r--src/main/resources/application.properties13
-rw-r--r--src/test/java/com/odiparpack/back/odiparback/OdiparbackApplicationTests.java13
15 files changed, 617 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..68fad0c
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,76 @@
+HELP.md
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/
+
+# From: https://ucsb-cs48.github.io/javatopics/gitignore_maven/
+
+# Maven (from: https://github.com/github/gitignore/blob/master/Maven.gitignore)
+
+target/
+pom.xml.tag
+pom.xml.releaseBackup
+pom.xml.versionsBackup
+pom.xml.next
+release.properties
+dependency-reduced-pom.xml
+buildNumber.properties
+.mvn/timing.properties
+# https://github.com/takari/maven-wrapper#usage-without-binary-jar
+.mvn/wrapper/maven-wrapper.jar
+
+# Java (from: https://github.com/github/gitignore/blob/master/Java.gitignore)
+
+# Compiled class file
+*.class
+
+# Log file
+*.log
+
+# BlueJ files
+*.ctxt
+
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# Package Files #
+*.jar
+*.war
+*.nar
+*.ear
+*.zip
+*.tar.gz
+*.rar
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
+
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..acacb86
--- /dev/null
+++ b/README.md
@@ -0,0 +1,16 @@
+Based on [amigoscode Spring Boot
+tutorial](https://www.youtube.com/watch?v=9SGDpanrc8U)
+
+"Minimal" example for a Spring Boot RESTful API.
+
+`student` is a package that tries to implement a RESTful API with minimal
+boilerplate code. It uses Spring Data JPA and lombok.
+
+Dependencies are managed by Maven.
+
+It also depends on a Postgres DB, as specified in the `application.properties`
+file. An important property there is `spring.jpa.hibernate.ddl-auto`.
+Available values include `none` (production), `update` (develop), `create-drop`
+(testing).
+
+2022-06-23
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..a69fc77
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-parent</artifactId>
+ <version>2.7.0</version>
+ <relativePath/> <!-- lookup parent from repository -->
+ </parent>
+ <groupId>com.odiparpack.back</groupId>
+ <artifactId>odiparback</artifactId>
+ <version>0.0.1-SNAPSHOT</version>
+ <name>odiparback</name>
+ <description>REST server for DP1 project 2022-1</description>
+ <properties>
+ <java.version>17</java.version>
+ </properties>
+ <dependencies>
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-data-jpa</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-web</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.postgresql</groupId>
+ <artifactId>postgresql</artifactId>
+ <scope>runtime</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-test</artifactId>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.projectlombok</groupId>
+ <artifactId>lombok</artifactId>
+ <optional>true</optional>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-maven-plugin</artifactId>
+ <configuration>
+ <excludes>
+ <exclude>
+ <groupId>org.projectlombok</groupId>
+ <artifactId>lombok</artifactId>
+ </exclude>
+ </excludes>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+
+</project>
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",
+ LocalDate.of(2000, Month.JANUARY, 5)
+ );
+
+ Student bob = new Student(
+ "Bob",
+ 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() {
+ }
+}