/
BuildsRestController.java
136 lines (121 loc) · 4.81 KB
/
BuildsRestController.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
package com.drumonii.loltrollbuild.api;
import com.drumonii.loltrollbuild.config.Profiles.Disabled;
import com.drumonii.loltrollbuild.model.Build;
import com.drumonii.loltrollbuild.repository.*;
import com.drumonii.loltrollbuild.api.status.BadRequestException;
import com.drumonii.loltrollbuild.api.status.ResourceNotFoundException;
import com.drumonii.loltrollbuild.api.view.ApiViews;
import com.fasterxml.jackson.annotation.JsonView;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Example;
import org.springframework.data.domain.ExampleMatcher;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort.Direction;
import org.springframework.data.web.PageableDefault;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.BeanPropertyBindingResult;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
import javax.validation.Valid;
import java.util.Optional;
/**
* Repository REST controller for {@link Build}s.
*/
@RestController
@RequestMapping("${api.base-path}/builds")
// TODO: Restore @Disabled
public class BuildsRestController {
static final int PAGE_SIZE = 20;
@Autowired
private BuildsRepository buildsRepository;
@Autowired
private ChampionsRepository championsRepository;
@Autowired
private ItemsRepository itemsRepository;
@Autowired
private SummonerSpellsRepository summonerSpellsRepository;
@Autowired
private MapsRepository mapsRepository;
/**
* Gets a {@link Page} of {@link Build}s from the pagination and search parameters.
*
* @param pageable the {@link Pageable}
* @param build the search {@link Build} to define as the QBE
* @return the {@link Page} of {@link Build}s
*/
@GetMapping
public Page<Build> getBuilds(
@PageableDefault(size = PAGE_SIZE, sort = "id", direction = Direction.DESC) Pageable pageable, Build build) {
ExampleMatcher exampleMatcher = ExampleMatcher.matching()
.withIgnorePaths("id")
.withIgnoreNullValues();
Example<Build> example = Example.of(build, exampleMatcher);
return buildsRepository.findAll(example, pageable);
}
/**
* Gets a {@link Build} by its ID. If not found, returns a 404, or if some of its attributes no longer exist a 400,
* otherwise a 200.
*
* @param id the ID to lookup the {@link Build}
* @return the {@link Build}
*/
@JsonView({ ApiViews.LtbApi.class })
@GetMapping(path = "/{id}")
public Build getBuild(@PathVariable int id) {
Optional<Build> optionalBuild = buildsRepository.findById(id);
if (optionalBuild.isEmpty()) {
throw new ResourceNotFoundException("Unable to find a Build with Id: " + id);
}
Build build = optionalBuild.get();
build.setChampion(championsRepository.findById(build.getChampionId()).orElse(null));
build.setItem1(itemsRepository.findById(build.getItem1Id()).orElse(null));
build.setItem2(itemsRepository.findById(build.getItem2Id()).orElse(null));
build.setItem3(itemsRepository.findById(build.getItem3Id()).orElse(null));
build.setItem4(itemsRepository.findById(build.getItem4Id()).orElse(null));
build.setItem5(itemsRepository.findById(build.getItem5Id()).orElse(null));
build.setItem6(itemsRepository.findById(build.getItem6Id()).orElse(null));
build.setSummonerSpell1(summonerSpellsRepository.findById(build.getSummonerSpell1Id()).orElse(null));
build.setSummonerSpell2(summonerSpellsRepository.findById(build.getSummonerSpell2Id()).orElse(null));
build.setTrinket(itemsRepository.findById(build.getTrinketId()).orElse(null));
build.setMap(mapsRepository.findById(build.getMapId()).orElse(null));
BindingResult result = new BeanPropertyBindingResult(build, "build");
build.validate(build, result);
if (result.hasErrors()) {
throw new BadRequestException(result.getFieldErrors());
}
return build;
}
/**
* Saves a {@link Build}.
*
* @param build the {@link Build} to save, if valid
* @return the {@link Build}
*/
@JsonView({ ApiViews.LtbApi.class })
@PostMapping
@ResponseStatus(HttpStatus.CREATED)
@ResponseBody
public ResponseEntity<Build> saveBuild(@RequestBody @Valid Build build, BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
throw new BadRequestException(bindingResult.getFieldErrors());
}
Build savedBuild = buildsRepository.save(build);
return ResponseEntity.created(ServletUriComponentsBuilder.fromCurrentRequest()
.path("/{id}")
.buildAndExpand(savedBuild.getId())
.toUri())
.body(savedBuild);
}
/**
* Gets the number of saved {@link Build}s.
*
* @return the count of saved {@link Build}s
*/
@GetMapping(path = "/count")
public long countBuilds() {
return buildsRepository.count();
}
}