#359 Код-ревью API поиска авторов

Компании:
Т-Банк Right Line
Темы:
SpringSpring Data JPAТранзакцииКод ревью

Сделать код-ревью:

/**
  * 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;
}

Разбор вопроса

Ментор
Ответь как на реальном собеседовании. Я задам уточняющие вопросы, а затем сравню твой ответ с эталонным и покажу точность в %.
Войди, чтобы начать диалог Ментор ведёт диалог по текущему вопросу и учитывает предыдущие сообщения.
Войти