#359 Код-ревью API поиска авторов
Сделать код-ревью:
/**
* API поиска авторов и их книг по имени автора (полное ФИО или часть имени в любом регистре).
* Также компонент при каждом поиске обновляет статистику по частоте использования поисковой строки (сбрасывается раз в сутки другой системой)
* При обнаружении популярного запроса (> 1000 запросов в сутки), по которому находится много авторов, отправляется алерт.
* Алерт должен отправляться не более 1 раза за сутки для каждого запроса
* Все классы на самом деле находятся в разных файлах, однако здесь представлены в одном месте для удобства
*/
@RestController
public class AuthorController {
@Autowired
private AuthorSearchService service;
@GetMapping("/authors")
public List<AuthorDto> readAllAuthors(@RequestParam String query) {
List<Author> authors = service.search(query);
return authors.stream().map(el -> {
return new Mapper().map(el);
}).collect(Collectors.toList());
}
}
@Component
public class AuthorSearchService {
@Autowired
private AuthorsRepository authorsRepository;
@Autowired
private StatisticsRepository statisticsRepository;
private AlertRestClient arc = new AlertRestClient();
// В query может быть как полностью ФИО, так и часть имени, например "Вадим Панов" или "панов"
@Transactional
public List<Author> search(String query) {
List<Author> authors = authorsRepository.findByNameContainingIgnoreCase(query);
Statistics s = statisticsRepository.findById(query).orElse(null);
if (s == null) s = new Statistics(query);
s.setNumbers(s.getNumbers() + 1);
statisticsRepository.save(s);
if (s.getNumbers() > 1000 && authors.size() > 1000) {
System.out.println("too popular search with too much data, sending an alert...");
arc.send(query, s.getNumbers(), authors.size());
}
return authors;
}
}
@Entity
@Data
public class Author {
@Id
@GeneratedValue
private Long id;
private String name;
@OneToMany(mappedBy = "author")
private List<Book> books;
public Author(String name) {
this.name = name;
}
}
@Entity
@Data
public class Statistics {
@Id
private String query;
private int numbers;
public Statistics(String query) {
this.query = query;
}
}
@Data
public class AuthorDto {
private Long id;
private String name;
private List<Book> books;
}
@Entity
@Data
public class Book {
private Long id;
private String name;
}
Разбор вопроса
Войди, чтобы начать диалог
Ментор ведёт диалог по текущему вопросу и учитывает предыдущие сообщения.
Войти
Доступно с Premium
Это лишь одно из решений, доступных с Premium. А ещё:
- 250+ продвинутых лекций
- 1300+ практических заданий
- 500+ решений задач с реальных собеседований
- Именные сертификаты Java Hub
- Расширенный доступ к AI-ментору