diff --git a/src/main/java/org/springframework/samples/petclinic/api/OwnerRestController.java b/src/main/java/org/springframework/samples/petclinic/api/OwnerRestController.java new file mode 100644 index 000000000..0e9574338 --- /dev/null +++ b/src/main/java/org/springframework/samples/petclinic/api/OwnerRestController.java @@ -0,0 +1,46 @@ +package org.springframework.samples.petclinic.api; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.samples.petclinic.owner.Owner; +import org.springframework.web.bind.annotation.*; +import org.springframework.samples.petclinic.owner.OwnerRepository; +import org.springframework.samples.petclinic.api.dto.OwnerDto; +import org.springframework.samples.petclinic.api.mapper.OwnerMapper; + + +import java.util.Optional; + +@RestController +@RequestMapping("/api/owners") + +public class OwnerRestController { + private final OwnerRepository ownerRepository; + private final OwnerMapper ownerMapper; + + @Autowired + public OwnerRestController(OwnerRepository ownerRepository, OwnerMapper ownerMapper) { + this.ownerRepository = ownerRepository; + this.ownerMapper = ownerMapper; + } + + @GetMapping("/{id}") + public ResponseEntity getOwner(@PathVariable("id") int id) { + Optional ownerOpt = ownerRepository.findById(id); + if (ownerOpt.isPresent()) { + Owner own = ownerOpt.get(); + OwnerDto dto = ownerMapper.toDto(own); + return ResponseEntity.ok(dto); + } else { + return ResponseEntity.notFound().build(); + } + } + + @PostMapping + public ResponseEntity createOwner(@RequestBody OwnerDto ownerDto) { + Owner owner = ownerMapper.toEntity(ownerDto); + Owner savedOwner = ownerRepository.save(owner); + return ResponseEntity.status(HttpStatus.CREATED).body(ownerMapper.toDto(savedOwner)); + } +} diff --git a/src/main/java/org/springframework/samples/petclinic/api/dto/OwnerDto.java b/src/main/java/org/springframework/samples/petclinic/api/dto/OwnerDto.java new file mode 100644 index 000000000..4f4018ece --- /dev/null +++ b/src/main/java/org/springframework/samples/petclinic/api/dto/OwnerDto.java @@ -0,0 +1,59 @@ +package org.springframework.samples.petclinic.api.dto; + +public class OwnerDto { + + private Integer id; + private String firstName; + private String lastName; + private String address; + private String city; + private String telephone; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public String getTelephone() { + return telephone; + } + + public void setTelephone(String telephone) { + this.telephone = telephone; + } +} diff --git a/src/main/java/org/springframework/samples/petclinic/api/mapper/OwnerMapper.java b/src/main/java/org/springframework/samples/petclinic/api/mapper/OwnerMapper.java new file mode 100644 index 000000000..64b9b394b --- /dev/null +++ b/src/main/java/org/springframework/samples/petclinic/api/mapper/OwnerMapper.java @@ -0,0 +1,30 @@ +package org.springframework.samples.petclinic.api.mapper; + +import org.springframework.samples.petclinic.api.dto.OwnerDto; +import org.springframework.samples.petclinic.owner.Owner; +import org.springframework.stereotype.Component; + +@Component +public class OwnerMapper { + public OwnerDto toDto(Owner owner) { + OwnerDto dto = new OwnerDto(); + dto.setId(owner.getId()); + dto.setFirstName(owner.getFirstName()); + dto.setLastName(owner.getLastName()); + dto.setAddress(owner.getAddress()); + dto.setCity(owner.getCity()); + dto.setTelephone(owner.getTelephone()); + return dto; + } + + public Owner toEntity(OwnerDto dto) { + Owner owner = new Owner(); + owner.setId(dto.getId()); + owner.setFirstName(dto.getFirstName()); + owner.setLastName(dto.getLastName()); + owner.setAddress(dto.getAddress()); + owner.setCity(dto.getCity()); + owner.setTelephone(dto.getTelephone()); + return owner; + } +} diff --git a/src/main/java/org/springframework/samples/petclinic/model/BaseEntity.java b/src/main/java/org/springframework/samples/petclinic/model/BaseEntity.java index 3038bce3a..7110a9910 100644 --- a/src/main/java/org/springframework/samples/petclinic/model/BaseEntity.java +++ b/src/main/java/org/springframework/samples/petclinic/model/BaseEntity.java @@ -16,11 +16,9 @@ package org.springframework.samples.petclinic.model; import java.io.Serializable; +import java.time.LocalDateTime; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.MappedSuperclass; +import jakarta.persistence.*; /** * Simple JavaBean domain object with an id property. Used as a base class for objects @@ -36,6 +34,28 @@ public class BaseEntity implements Serializable { @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; + @Column + private LocalDateTime created; + @Column + private LocalDateTime updated; + @PrePersist + public void onCreate() { + LocalDateTime now = LocalDateTime.now(); + this.created = now; + this.updated = now; + } + @PreUpdate + public void onUpdate() { + this.updated = LocalDateTime.now(); + } + + + + + + + + public Integer getId() { return id; } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 6ed985654..828c48d96 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -23,3 +23,20 @@ logging.level.org.springframework=INFO # Maximum time static resources should be cached spring.web.resources.cache.cachecontrol.max-age=12h + +# launch H2 +spring.h2.console.enabled=true + +spring.datasource.url=jdbc:h2:./data/db/h2;AUTO_SERVER=TRUE +spring.datasource.driver-class-name=org.h2.Driver +spring.sql.init.mode=always + + + + + + + + + + diff --git a/src/main/resources/db/h2/data.sql b/src/main/resources/db/h2/data.sql index f232b1361..c5103f97d 100644 --- a/src/main/resources/db/h2/data.sql +++ b/src/main/resources/db/h2/data.sql @@ -1,13 +1,13 @@ -INSERT INTO vets VALUES (default, 'James', 'Carter'); -INSERT INTO vets VALUES (default, 'Helen', 'Leary'); -INSERT INTO vets VALUES (default, 'Linda', 'Douglas'); -INSERT INTO vets VALUES (default, 'Rafael', 'Ortega'); -INSERT INTO vets VALUES (default, 'Henry', 'Stevens'); -INSERT INTO vets VALUES (default, 'Sharon', 'Jenkins'); +INSERT INTO vets VALUES (default, 'James', 'Carter', now(), now()); +INSERT INTO vets VALUES (default, 'Helen', 'Leary', now(), now()); +INSERT INTO vets VALUES (default, 'Linda', 'Douglas', now(), now()); +INSERT INTO vets VALUES (default, 'Rafael', 'Ortega', now(), now()); +INSERT INTO vets VALUES (default, 'Henry', 'Stevens', now(), now()); +INSERT INTO vets VALUES (default, 'Sharon', 'Jenkins', now(), now()); -INSERT INTO specialties VALUES (default, 'radiology'); -INSERT INTO specialties VALUES (default, 'surgery'); -INSERT INTO specialties VALUES (default, 'dentistry'); +INSERT INTO specialties VALUES (default, 'radiology', now(), now()); +INSERT INTO specialties VALUES (default, 'surgery', now(), now()); +INSERT INTO specialties VALUES (default, 'dentistry', now(), now()); INSERT INTO vet_specialties VALUES (2, 1); INSERT INTO vet_specialties VALUES (3, 2); @@ -15,39 +15,39 @@ INSERT INTO vet_specialties VALUES (3, 3); INSERT INTO vet_specialties VALUES (4, 2); INSERT INTO vet_specialties VALUES (5, 1); -INSERT INTO types VALUES (default, 'cat'); -INSERT INTO types VALUES (default, 'dog'); -INSERT INTO types VALUES (default, 'lizard'); -INSERT INTO types VALUES (default, 'snake'); -INSERT INTO types VALUES (default, 'bird'); -INSERT INTO types VALUES (default, 'hamster'); +INSERT INTO types VALUES (default, 'cat', now(), now()); +INSERT INTO types VALUES (default, 'dog', now(), now()); +INSERT INTO types VALUES (default, 'lizard', now(), now()); +INSERT INTO types VALUES (default, 'snake', now(), now()); +INSERT INTO types VALUES (default, 'bird', now(), now()); +INSERT INTO types VALUES (default, 'hamster', now(), now()); -INSERT INTO owners VALUES (default, 'George', 'Franklin', '110 W. Liberty St.', 'Madison', '6085551023'); -INSERT INTO owners VALUES (default, 'Betty', 'Davis', '638 Cardinal Ave.', 'Sun Prairie', '6085551749'); -INSERT INTO owners VALUES (default, 'Eduardo', 'Rodriquez', '2693 Commerce St.', 'McFarland', '6085558763'); -INSERT INTO owners VALUES (default, 'Harold', 'Davis', '563 Friendly St.', 'Windsor', '6085553198'); -INSERT INTO owners VALUES (default, 'Peter', 'McTavish', '2387 S. Fair Way', 'Madison', '6085552765'); -INSERT INTO owners VALUES (default, 'Jean', 'Coleman', '105 N. Lake St.', 'Monona', '6085552654'); -INSERT INTO owners VALUES (default, 'Jeff', 'Black', '1450 Oak Blvd.', 'Monona', '6085555387'); -INSERT INTO owners VALUES (default, 'Maria', 'Escobito', '345 Maple St.', 'Madison', '6085557683'); -INSERT INTO owners VALUES (default, 'David', 'Schroeder', '2749 Blackhawk Trail', 'Madison', '6085559435'); -INSERT INTO owners VALUES (default, 'Carlos', 'Estaban', '2335 Independence La.', 'Waunakee', '6085555487'); +INSERT INTO owners VALUES (default, 'George', 'Franklin', '110 W. Liberty St.', 'Madison', '6085551023', now(), now()); +INSERT INTO owners VALUES (default, 'Betty', 'Davis', '638 Cardinal Ave.', 'Sun Prairie', '6085551749', now(), now()); +INSERT INTO owners VALUES (default, 'Eduardo', 'Rodriquez', '2693 Commerce St.', 'McFarland', '6085558763', now(), now()); +INSERT INTO owners VALUES (default, 'Harold', 'Davis', '563 Friendly St.', 'Windsor', '6085553198', now(), now()); +INSERT INTO owners VALUES (default, 'Peter', 'McTavish', '2387 S. Fair Way', 'Madison', '6085552765', now(), now()); +INSERT INTO owners VALUES (default, 'Jean', 'Coleman', '105 N. Lake St.', 'Monona', '6085552654', now(), now()); +INSERT INTO owners VALUES (default, 'Jeff', 'Black', '1450 Oak Blvd.', 'Monona', '6085555387', now(), now()); +INSERT INTO owners VALUES (default, 'Maria', 'Escobito', '345 Maple St.', 'Madison', '6085557683', now(), now()); +INSERT INTO owners VALUES (default, 'David', 'Schroeder', '2749 Blackhawk Trail', 'Madison', '6085559435', now(), now()); +INSERT INTO owners VALUES (default, 'Carlos', 'Estaban', '2335 Independence La.', 'Waunakee', '6085555487', now(), now()); -INSERT INTO pets VALUES (default, 'Leo', '2010-09-07', 1, 1); -INSERT INTO pets VALUES (default, 'Basil', '2012-08-06', 6, 2); -INSERT INTO pets VALUES (default, 'Rosy', '2011-04-17', 2, 3); -INSERT INTO pets VALUES (default, 'Jewel', '2010-03-07', 2, 3); -INSERT INTO pets VALUES (default, 'Iggy', '2010-11-30', 3, 4); -INSERT INTO pets VALUES (default, 'George', '2010-01-20', 4, 5); -INSERT INTO pets VALUES (default, 'Samantha', '2012-09-04', 1, 6); -INSERT INTO pets VALUES (default, 'Max', '2012-09-04', 1, 6); -INSERT INTO pets VALUES (default, 'Lucky', '2011-08-06', 5, 7); -INSERT INTO pets VALUES (default, 'Mulligan', '2007-02-24', 2, 8); -INSERT INTO pets VALUES (default, 'Freddy', '2010-03-09', 5, 9); -INSERT INTO pets VALUES (default, 'Lucky', '2010-06-24', 2, 10); -INSERT INTO pets VALUES (default, 'Sly', '2012-06-08', 1, 10); +INSERT INTO pets VALUES (default, 'Leo', '2010-09-07', 1, 1, now(), now()); +INSERT INTO pets VALUES (default, 'Basil', '2012-08-06', 6, 2, now(), now()); +INSERT INTO pets VALUES (default, 'Rosy', '2011-04-17', 2, 3, now(), now()); +INSERT INTO pets VALUES (default, 'Jewel', '2010-03-07', 2, 3, now(), now()); +INSERT INTO pets VALUES (default, 'Iggy', '2010-11-30', 3, 4, now(), now()); +INSERT INTO pets VALUES (default, 'George', '2010-01-20', 4, 5, now(), now()); +INSERT INTO pets VALUES (default, 'Samantha', '2012-09-04', 1, 6, now(), now()); +INSERT INTO pets VALUES (default, 'Max', '2012-09-04', 1, 6, now(), now()); +INSERT INTO pets VALUES (default, 'Lucky', '2011-08-06', 5, 7, now(), now()); +INSERT INTO pets VALUES (default, 'Mulligan', '2007-02-24', 2, 8, now(), now()); +INSERT INTO pets VALUES (default, 'Freddy', '2010-03-09', 5, 9, now(), now()); +INSERT INTO pets VALUES (default, 'Lucky', '2010-06-24', 2, 10, now(), now()); +INSERT INTO pets VALUES (default, 'Sly', '2012-06-08', 1, 10, now(), now()); -INSERT INTO visits VALUES (default, 7, '2013-01-01', 'rabies shot'); -INSERT INTO visits VALUES (default, 8, '2013-01-02', 'rabies shot'); -INSERT INTO visits VALUES (default, 8, '2013-01-03', 'neutered'); -INSERT INTO visits VALUES (default, 7, '2013-01-04', 'spayed'); +INSERT INTO visits VALUES (default, 7, '2013-01-01', 'rabies shot', now(), now()); +INSERT INTO visits VALUES (default, 8, '2013-01-02', 'rabies shot', now(), now()); +INSERT INTO visits VALUES (default, 8, '2013-01-03', 'neutered', now(), now()); +INSERT INTO visits VALUES (default, 7, '2013-01-04', 'spayed', now(), now()); diff --git a/src/main/resources/db/h2/schema.sql b/src/main/resources/db/h2/schema.sql index 4a6c322cb..37c9b9adf 100644 --- a/src/main/resources/db/h2/schema.sql +++ b/src/main/resources/db/h2/schema.sql @@ -10,13 +10,17 @@ DROP TABLE owners IF EXISTS; CREATE TABLE vets ( id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, first_name VARCHAR(30), - last_name VARCHAR(30) + last_name VARCHAR(30), + created TIMESTAMP, + updated TIMESTAMP ); CREATE INDEX vets_last_name ON vets (last_name); CREATE TABLE specialties ( id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, - name VARCHAR(80) + name VARCHAR(80), + created TIMESTAMP, + updated TIMESTAMP ); CREATE INDEX specialties_name ON specialties (name); @@ -29,7 +33,9 @@ ALTER TABLE vet_specialties ADD CONSTRAINT fk_vet_specialties_specialties FOREIG CREATE TABLE types ( id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, - name VARCHAR(80) + name VARCHAR(80), + created TIMESTAMP, + updated TIMESTAMP ); CREATE INDEX types_name ON types (name); @@ -39,7 +45,9 @@ CREATE TABLE owners ( last_name VARCHAR_IGNORECASE(30), address VARCHAR(255), city VARCHAR(80), - telephone VARCHAR(20) + telephone VARCHAR(20), + created TIMESTAMP, + updated TIMESTAMP ); CREATE INDEX owners_last_name ON owners (last_name); @@ -48,7 +56,9 @@ CREATE TABLE pets ( name VARCHAR(30), birth_date DATE, type_id INTEGER NOT NULL, - owner_id INTEGER + owner_id INTEGER, + created TIMESTAMP, + updated TIMESTAMP ); ALTER TABLE pets ADD CONSTRAINT fk_pets_owners FOREIGN KEY (owner_id) REFERENCES owners (id); ALTER TABLE pets ADD CONSTRAINT fk_pets_types FOREIGN KEY (type_id) REFERENCES types (id); @@ -58,7 +68,9 @@ CREATE TABLE visits ( id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, pet_id INTEGER, visit_date DATE, - description VARCHAR(255) + description VARCHAR(255), + created TIMESTAMP, + updated TIMESTAMP ); ALTER TABLE visits ADD CONSTRAINT fk_visits_pets FOREIGN KEY (pet_id) REFERENCES pets (id); CREATE INDEX visits_pet_id ON visits (pet_id);