Skip to content

Commit a584815

Browse files
author
ecureuill
committed
🔀 ✨ Destination
Merge branch 'feat/destinations'
2 parents 65ad493 + 7eb83df commit a584815

File tree

9 files changed

+443
-0
lines changed

9 files changed

+443
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
package ecureuill.milhasapi.controller;
2+
3+
import java.util.List;
4+
import java.util.stream.Collectors;
5+
6+
import org.springframework.beans.factory.annotation.Autowired;
7+
import org.springframework.http.HttpStatus;
8+
import org.springframework.http.ResponseEntity;
9+
import org.springframework.web.bind.annotation.DeleteMapping;
10+
import org.springframework.web.bind.annotation.GetMapping;
11+
import org.springframework.web.bind.annotation.PathVariable;
12+
import org.springframework.web.bind.annotation.PostMapping;
13+
import org.springframework.web.bind.annotation.PutMapping;
14+
import org.springframework.web.bind.annotation.RequestBody;
15+
import org.springframework.web.bind.annotation.RequestMapping;
16+
import org.springframework.web.bind.annotation.RequestParam;
17+
import org.springframework.web.bind.annotation.ResponseStatus;
18+
import org.springframework.web.bind.annotation.RestController;
19+
import org.springframework.web.server.ResponseStatusException;
20+
import org.springframework.web.util.UriComponentsBuilder;
21+
22+
import ecureuill.milhasapi.domain.destination.DestinationRepository;
23+
import ecureuill.milhasapi.domain.destination.DestinationUpdateRecord;
24+
import jakarta.transaction.Transactional;
25+
import jakarta.validation.Valid;
26+
import ecureuill.milhasapi.domain.destination.Destination;
27+
import ecureuill.milhasapi.domain.destination.DestinationCreateRecord;
28+
import ecureuill.milhasapi.domain.destination.DestinationDetailRecord;
29+
30+
@RestController
31+
@RequestMapping("/destinos")
32+
public class DestinationController {
33+
34+
@Autowired
35+
private DestinationRepository repository;
36+
37+
@PostMapping
38+
@Transactional
39+
@ResponseStatus(HttpStatus.CREATED)
40+
public ResponseEntity<DestinationDetailRecord> create(@Valid @RequestBody DestinationCreateRecord record, UriComponentsBuilder uriBuilder) {
41+
42+
var destination = repository.save(new Destination(record));
43+
44+
var uri = uriBuilder.path("destinos/{id}").buildAndExpand(destination.getId()).toUri();
45+
46+
return ResponseEntity.created(uri).body(new DestinationDetailRecord(destination));
47+
}
48+
49+
@GetMapping
50+
@ResponseStatus(HttpStatus.OK)
51+
public ResponseEntity<List<DestinationDetailRecord>> getAll(@RequestParam(name="name", required = false) String name) {
52+
53+
if(name != null){
54+
var result = repository.findAllByNameStartingWith(name);
55+
if (result.isEmpty()) {
56+
throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Nenhum destino foi encontrado", null);
57+
}
58+
59+
return ResponseEntity.ok().body(result.stream().map(DestinationDetailRecord::new).collect(Collectors.toList()));
60+
}
61+
62+
63+
return ResponseEntity.ok().body(repository.findAll().stream().map(DestinationDetailRecord::new).collect(Collectors.toList()));
64+
}
65+
66+
@GetMapping(value = "{id}")
67+
@ResponseStatus(HttpStatus.OK)
68+
public ResponseEntity<DestinationDetailRecord> getOne(@PathVariable Long id) {
69+
var data = repository.getReferenceById(id);
70+
71+
return ResponseEntity.ok().body(new DestinationDetailRecord(data));
72+
}
73+
74+
75+
@PutMapping(value = "/{id}")
76+
@Transactional
77+
@ResponseStatus(HttpStatus.OK)
78+
public ResponseEntity<DestinationDetailRecord> update(@PathVariable Long id, @Valid @RequestBody DestinationUpdateRecord record) {
79+
var destination = repository.getReferenceById(id);
80+
81+
destination.update(record);
82+
83+
return ResponseEntity.ok().body(new DestinationDetailRecord(destination));
84+
85+
}
86+
87+
@DeleteMapping(value = "{id}")
88+
@Transactional
89+
@ResponseStatus(HttpStatus.NO_CONTENT)
90+
public ResponseEntity<Void> delete(@PathVariable Long id) {
91+
repository.deleteById(id);
92+
93+
return ResponseEntity.noContent().build();
94+
}
95+
96+
97+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package ecureuill.milhasapi.domain.destination;
2+
3+
import java.math.BigDecimal;
4+
5+
import jakarta.persistence.Entity;
6+
import jakarta.persistence.GeneratedValue;
7+
import jakarta.persistence.GenerationType;
8+
import jakarta.persistence.Id;
9+
import jakarta.persistence.Table;
10+
import jakarta.validation.Valid;
11+
import lombok.AllArgsConstructor;
12+
import lombok.EqualsAndHashCode;
13+
import lombok.Getter;
14+
import lombok.NoArgsConstructor;
15+
16+
@Table(name = "destinations")
17+
@Entity(name = "Destination")
18+
@Getter
19+
@AllArgsConstructor
20+
@NoArgsConstructor
21+
@EqualsAndHashCode(of = "id")
22+
public class Destination {
23+
24+
@Id
25+
@GeneratedValue(strategy = GenerationType.IDENTITY)
26+
private Long id;
27+
private String name;
28+
private String photo;
29+
private BigDecimal Price;
30+
31+
public Destination(@Valid DestinationCreateRecord record) {
32+
this.name = record.name();
33+
this.photo = record.photo();
34+
this.Price = record.price();
35+
}
36+
37+
public void update(@Valid DestinationUpdateRecord record) {
38+
this.name = record.name();
39+
this.photo = record.photo();
40+
this.Price = record.price();
41+
}
42+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package ecureuill.milhasapi.domain.destination;
2+
3+
import java.math.BigDecimal;
4+
5+
import jakarta.validation.constraints.DecimalMin;
6+
import jakarta.validation.constraints.Digits;
7+
import jakarta.validation.constraints.NotBlank;
8+
9+
public record DestinationCreateRecord(
10+
@NotBlank
11+
String name,
12+
@NotBlank
13+
String photo,
14+
@DecimalMin(value = "0.0", inclusive = false)
15+
@Digits(integer = 5, fraction=2)
16+
BigDecimal price
17+
) {
18+
19+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package ecureuill.milhasapi.domain.destination;
2+
3+
import java.math.BigDecimal;
4+
5+
public record DestinationDetailRecord(
6+
Long id,
7+
String name,
8+
String photo,
9+
BigDecimal price
10+
) {
11+
public DestinationDetailRecord(Destination destination) {
12+
this(
13+
destination.getId(),
14+
destination.getName(),
15+
destination.getPhoto(),
16+
destination.getPrice()
17+
);
18+
}
19+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package ecureuill.milhasapi.domain.destination;
2+
3+
import java.util.List;
4+
5+
import org.springframework.data.jpa.repository.JpaRepository;
6+
7+
public interface DestinationRepository extends JpaRepository<Destination, Long>{
8+
9+
List<Destination> findAllByNameStartingWith(String name);
10+
11+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package ecureuill.milhasapi.domain.destination;
2+
3+
import java.math.BigDecimal;
4+
5+
import jakarta.validation.constraints.DecimalMin;
6+
import jakarta.validation.constraints.Digits;
7+
import jakarta.validation.constraints.NotBlank;
8+
9+
public record DestinationUpdateRecord(
10+
@NotBlank
11+
String name,
12+
@NotBlank
13+
String photo,
14+
@DecimalMin(value = "0.0", inclusive = false)
15+
@Digits(integer = 5, fraction=2)
16+
BigDecimal price
17+
) {
18+
19+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
create table destinations(
2+
id bigint not null auto_increment,
3+
name varchar(100) not null,
4+
photo varchar(100) not null,
5+
price decimal not null,
6+
primary key(id)
7+
);

‎src/test/java/ecureuill/milhasapi/GenerateData.java

+17
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package ecureuill.milhasapi;
22

3+
import java.math.BigDecimal;
34
import java.util.List;
45
import java.util.stream.Collectors;
56
import java.util.stream.IntStream;
67

8+
import ecureuill.milhasapi.domain.destination.Destination;
79
import ecureuill.milhasapi.domain.testimonial.Testimonial;
810
import net.datafaker.Faker;
911

@@ -24,4 +26,19 @@ public static List<Testimonial> randomTestimonials(int count) {
2426
.mapToObj(i -> randomTestimonial())
2527
.collect(Collectors.toList());
2628
}
29+
30+
public static Destination randomDestination(){
31+
return new Destination(
32+
faker.random().nextLong(),
33+
faker.address().cityName(),
34+
faker.internet().url(),
35+
new BigDecimal(200)
36+
);
37+
}
38+
39+
public static List<Destination> randomDestinations(int count) {
40+
return IntStream.range(0, count)
41+
.mapToObj(i -> randomDestination())
42+
.collect(Collectors.toList());
43+
}
2744
}

0 commit comments

Comments
 (0)