/*
 * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved.
 *
 * https://www.mall4j.com/
 *
 * 未经允许，不可做商业用途！
 *
 * 版权所有，侵权必究！
 */

package com.yami.shop.sys.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.yami.shop.sys.model.SysLog;
import org.springframework.beans.factory.annotation.Autowired;
import com.yami.shop.common.response.ServerResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.yami.shop.common.util.PageParam;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.yami.shop.sys.service.SysLogService;

import cn.hutool.core.util.StrUtil;

/**
 * SysLogController类，主要用于处理系统日志相关的请求操作，是一个Spring RESTful风格的控制器。
 * 它提供了获取系统日志列表等相关接口，通过调用对应的服务层方法与数据库交互来获取和返回数据。
 *
 * @author lgh
 */
@RestController
@RequestMapping("/sys/log")
public class SysLogController {

    /**
     * 通过Spring的依赖注入自动装配SysLogService实例，用于调用服务层的业务逻辑方法，
     * 比如获取系统日志数据、进行分页查询等操作都依赖此服务层对象来完成。
     */
    @Autowired
    private SysLogService sysLogService;

    /**
     * 处理获取系统日志列表的请求方法，返回分页后的系统日志信息。
     * 该方法接收前端传入的SysLog对象（可能包含查询条件，如用户名、操作内容等）和PageParam对象（用于分页相关参数设置）。
     * 会根据传入的条件进行模糊查询，并返回分页后的系统日志数据响应给前端。
     * 同时，通过@PreAuthorize注解进行权限校验，只有拥有'sys:log:page'权限的用户才能访问此接口。
     *
     * @param sysLog 包含可能的查询条件的系统日志对象，例如用户名、操作内容等字段可作为查询过滤条件。
     * @param page 分页参数对象，包含了如页码、每页数量等分页相关的信息。
     * @return ServerResponseEntity<IPage<SysLog>> 返回包含分页系统日志信息的响应实体，如果查询成功则状态码为成功，
     * 数据体中包含分页后的系统日志列表；如果出现异常等情况则返回相应的错误信息。
     */
    @GetMapping("/page")
    @PreAuthorize("@pms.hasPermission('sys:log:page')")
    public ServerResponseEntity<IPage<SysLog>> page(SysLog sysLog, PageParam<SysLog> page) {
        // 使用LambdaQueryWrapper构建查询条件，根据传入的sysLog对象中的用户名和操作内容进行模糊查询。
        // 只有当用户名或操作内容不为空字符串时，才添加对应的模糊查询条件。
        IPage<SysLog> sysLogs = sysLogService.page(page,
                new LambdaQueryWrapper<SysLog>()
                       .like(StrUtil.isNotBlank(sysLog.getUsername()), SysLog::getUsername, sysLog.getUsername())
                       .like(StrUtil.isNotBlank(sysLog.getOperation()), SysLog::getOperation, sysLog.getOperation()));
        return ServerResponseEntity.success(sysLogs);
    }
}