Newer
Older
simple-opds / src / main / java / ru / mcs / sopds / controller / WebController.java
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";
    }
}