package ru.mcs.sopds.controller;
import jakarta.servlet.http.HttpServletRequest;
import ru.mcs.sopds.entity.*;
import ru.mcs.sopds.service.BookService;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Controller
@RequiredArgsConstructor
public class WebController {
private final BookService bookService;
@GetMapping("/")
public String mainPage(Model model, HttpServletRequest request) {
// Основные данные для главной страницы
model.addAttribute("appTitle", "Simple OPDS Catalog");
model.addAttribute("breadcrumbs", Arrays.asList("Главная"));
model.addAttribute("currentPath", request.getRequestURI());
model.addAttribute("request", request);
// Статистика
Map<String, Long> stats = new HashMap<>();
stats.put("booksCount", bookService.getBooksCount());
stats.put("authorsCount", bookService.getAuthorsCount());
stats.put("seriesCount", bookService.getSeriesCount());
stats.put("genresCount", bookService.getGenresCount());
model.addAttribute("stats", stats);
model.addAttribute("recentBooks", bookService.getRecentBooks(12));
model.addAttribute("popularGenres", bookService.getPopularGenres(8));
return "main";
}
@GetMapping("/books")
public String books(
@RequestParam(defaultValue = "0") int page,
@RequestParam(required = false) Long genreId,
@RequestParam(required = false) String format,
@RequestParam(required = false) String lang,
Model model) {
Pageable pageable = PageRequest.of(page, 20);
Page<Book> books;
if (genreId != null) {
books = bookService.getBooksByGenre(genreId, pageable);
model.addAttribute("genre", bookService.getGenreById(genreId));
} else {
books = bookService.getAllBooks(pageable);
}
model.addAttribute("books", books);
model.addAttribute("allGenres", bookService.getAllGenres());
model.addAttribute("formats", List.of("fb2", "epub", "pdf", "mobi", "djvu"));
model.addAttribute("genreId", genreId);
model.addAttribute("format", format);
model.addAttribute("lang", lang);
model.addAttribute("pageUrl", "/books");
model.addAttribute("topGenres", bookService.getPopularGenres(5));
return "books";
}
@GetMapping("/authors")
public String authors(
@RequestParam(defaultValue = "0") int page,
@RequestParam(required = false) String letter,
Model model) {
Pageable pageable = PageRequest.of(page, 100);
Page<Author> authors;
if (letter != null && !letter.isEmpty()) {
authors = bookService.getAuthorsByLetter(letter, pageable);
} else {
authors = bookService.getAllAuthors(pageable);
}
model.addAttribute("authors", authors);
model.addAttribute("letter", letter);
model.addAttribute("topGenres", bookService.getPopularGenres(5));
return "authors";
}
@GetMapping("/genres")
public String genres(Model model) {
model.addAttribute("genres", bookService.getAllGenres());
model.addAttribute("topGenres", bookService.getPopularGenres(5));
return "genres";
}
@GetMapping("/series")
public String series(
@RequestParam(defaultValue = "0") int page,
Model model) {
Pageable pageable = PageRequest.of(page, 50);
Page<Series> series = bookService.getAllSeries(pageable);
model.addAttribute("series", series);
model.addAttribute("topGenres", bookService.getPopularGenres(5));
return "series";
}
@GetMapping("/book/{id}")
public String bookDetail(@PathVariable Long id, Model model) {
Book book = bookService.getBookById(id);
model.addAttribute("book", book);
model.addAttribute("topGenres", bookService.getPopularGenres(5));
return "book_detail";
}
@GetMapping("/books/author/{id}")
public String booksByAuthor(
@PathVariable Long id,
@RequestParam(defaultValue = "0") int page,
Model model) {
Pageable pageable = PageRequest.of(page, 20);
Author author = bookService.getAuthorById(id);
Page<Book> books = bookService.getBooksByAuthor(id, pageable);
model.addAttribute("author", author);
model.addAttribute("books", books);
model.addAttribute("pageUrl", "/books/author/" + id);
model.addAttribute("topGenres", bookService.getPopularGenres(5));
return "books";
}
@GetMapping("/books/series/{id}")
public String booksBySeries(
@PathVariable Long id,
@RequestParam(defaultValue = "0") int page,
Model model) {
Pageable pageable = PageRequest.of(page, 20);
Series series = bookService.getSeriesById(id);
Page<Book> books = bookService.getBooksBySeries(id, pageable);
model.addAttribute("series", series);
model.addAttribute("books", books);
model.addAttribute("pageUrl", "/books/series/" + id);
model.addAttribute("topGenres", bookService.getPopularGenres(5));
return "books";
}
@GetMapping("/books/genre/{id}")
public String booksByGenre(
@PathVariable Long id,
@RequestParam(defaultValue = "0") int page,
Model model) {
Pageable pageable = PageRequest.of(page, 20);
Genre genre = bookService.getGenreById(id);
Page<Book> books = bookService.getBooksByGenre(id, pageable);
model.addAttribute("genre", genre);
model.addAttribute("books", books);
model.addAttribute("pageUrl", "/books/genre/" + id);
model.addAttribute("topGenres", bookService.getPopularGenres(5));
return "books";
}
@GetMapping("/search")
public String search(
@RequestParam String q,
@RequestParam(defaultValue = "0") int page,
Model model) {
Pageable pageable = PageRequest.of(page, 20);
Page<Book> books = bookService.searchBooks(q, pageable);
model.addAttribute("books", books);
model.addAttribute("query", q);
model.addAttribute("pageUrl", "/search?q=" + q);
model.addAttribute("topGenres", bookService.getPopularGenres(5));
return "search";
}
}