BookController.java

package org.darkroomlibrary.controller;

import org.darkroomlibrary.aop.NormalizePageQuery;
import org.darkroomlibrary.aop.RequireRole;
import org.darkroomlibrary.domain.type.UserRole;
import org.darkroomlibrary.web.response.ApiResponse;
import org.darkroomlibrary.web.dto.query.BookPageQuery;
import org.darkroomlibrary.domain.model.Book;
import org.darkroomlibrary.web.view.MetricPoint;
import org.darkroomlibrary.service.BookService;
import org.springframework.web.bind.annotation.*;

import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import java.util.List;

/**
 * 图书控制器
 */
@RestController
@RequestMapping("/book")
public class BookController {

    @Resource
    private BookService bookService;

    /**
     * 新增图书
     *
     * @param book 图书信息
     * @return ApiResponse<Void>
     */
    @RequireRole({UserRole.ADMIN, UserRole.SUPER_ADMIN})
    @PostMapping("/save")
    @ResponseBody
    public ApiResponse<Void> save(@Valid @RequestBody Book book) {
        return bookService.save(book);
    }

    /**
     * 修改图书
     *
     * @param book 图书信息
     * @return ApiResponse<Void>
     */
    @RequireRole({UserRole.ADMIN, UserRole.SUPER_ADMIN})
    @PutMapping("/update")
    @ResponseBody
    public ApiResponse<Void> update(@Valid @RequestBody Book book) {
        return bookService.update(book);
    }

    /**
     * 批量删除图书(软删除)
     *
     * @param ids 图书ID集合
     * @return ApiResponse<Void>
     */
    @RequireRole({UserRole.ADMIN, UserRole.SUPER_ADMIN})
    @PostMapping("/batchDelete")
    @ResponseBody
    public ApiResponse<Void> batchDelete(@RequestBody List<Integer> ids) {
        return bookService.batchDelete(ids);
    }

    /**
     * 恢复已删除的图书
     *
     * @param ids 图书ID集合
     * @return ApiResponse<Void>
     */
    @RequireRole({UserRole.ADMIN, UserRole.SUPER_ADMIN})
    @PostMapping("/restore")
    @ResponseBody
    public ApiResponse<Void> restore(@RequestBody List<Integer> ids) {
        return bookService.restore(ids);
    }

    /**
     * 分页查询图书
     *
     * @param dto 查询参数
     * @return ApiResponse<List<Book>>
     */
    @NormalizePageQuery
    @PostMapping("/query")
    @ResponseBody
    public ApiResponse<List<Book>> query(@RequestBody BookPageQuery dto) {
        return bookService.query(dto);
    }

    /**
     * 统计近N天新增图书
     */
    @RequireRole({UserRole.ADMIN, UserRole.SUPER_ADMIN})
    @GetMapping("/queryByDays/{day}")
    @ResponseBody
    public ApiResponse<List<MetricPoint>> queryByDays(@PathVariable Integer day) {
        return bookService.queryByDays(day);
    }
}