224 lines
5.6 KiB
Go
224 lines
5.6 KiB
Go
package handlers
|
|
|
|
import (
|
|
"strconv"
|
|
"strings"
|
|
|
|
"hyapi-server/internal/application/user"
|
|
"hyapi-server/internal/application/user/dto/commands"
|
|
"hyapi-server/internal/application/user/dto/queries"
|
|
securityServices "hyapi-server/internal/domains/security/services"
|
|
"hyapi-server/internal/shared/interfaces"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
"go.uber.org/zap"
|
|
)
|
|
|
|
// AdminBlacklistHandler 管理端黑名单
|
|
type AdminBlacklistHandler struct {
|
|
userApp user.UserApplicationService
|
|
blacklist *securityServices.BlacklistService
|
|
response interfaces.ResponseBuilder
|
|
logger *zap.Logger
|
|
}
|
|
|
|
func NewAdminBlacklistHandler(
|
|
userApp user.UserApplicationService,
|
|
blacklist *securityServices.BlacklistService,
|
|
response interfaces.ResponseBuilder,
|
|
logger *zap.Logger,
|
|
) *AdminBlacklistHandler {
|
|
return &AdminBlacklistHandler{
|
|
userApp: userApp,
|
|
blacklist: blacklist,
|
|
response: response,
|
|
logger: logger,
|
|
}
|
|
}
|
|
|
|
func (h *AdminBlacklistHandler) operatorID(c *gin.Context) string {
|
|
if v, ok := c.Get("user_id"); ok {
|
|
if id, ok := v.(string); ok {
|
|
return id
|
|
}
|
|
}
|
|
return ""
|
|
}
|
|
|
|
func (h *AdminBlacklistHandler) pageParams(c *gin.Context) (int, int) {
|
|
page, pageSize := 1, 20
|
|
if v := c.Query("page"); v != "" {
|
|
if n, err := strconv.Atoi(v); err == nil && n > 0 {
|
|
page = n
|
|
}
|
|
}
|
|
if v := c.Query("page_size"); v != "" {
|
|
if n, err := strconv.Atoi(v); err == nil && n > 0 && n <= 100 {
|
|
pageSize = n
|
|
}
|
|
}
|
|
return page, pageSize
|
|
}
|
|
|
|
// ListUsers 用户黑名单列表
|
|
func (h *AdminBlacklistHandler) ListUsers(c *gin.Context) {
|
|
page, pageSize := h.pageParams(c)
|
|
flag := true
|
|
q := &queries.ListUsersQuery{
|
|
Page: page,
|
|
PageSize: pageSize,
|
|
Phone: c.Query("phone"),
|
|
IsBlacklisted: &flag,
|
|
}
|
|
resp, err := h.userApp.ListUsers(c.Request.Context(), q)
|
|
if err != nil {
|
|
h.logger.Error("查询用户黑名单失败", zap.Error(err))
|
|
h.response.BadRequest(c, "查询失败")
|
|
return
|
|
}
|
|
h.response.Success(c, resp, "ok")
|
|
}
|
|
|
|
// AddUser 按手机号或用户ID加入黑名单
|
|
func (h *AdminBlacklistHandler) AddUser(c *gin.Context) {
|
|
op := h.operatorID(c)
|
|
if op == "" {
|
|
h.response.Unauthorized(c, "未登录")
|
|
return
|
|
}
|
|
var body struct {
|
|
UserID string `json:"user_id"`
|
|
Phone string `json:"phone"`
|
|
Reason string `json:"reason" binding:"required"`
|
|
Source string `json:"source"`
|
|
}
|
|
if err := c.ShouldBindJSON(&body); err != nil {
|
|
h.response.BadRequest(c, "请填写纳入原因")
|
|
return
|
|
}
|
|
|
|
userID := strings.TrimSpace(body.UserID)
|
|
if userID == "" {
|
|
phone := strings.TrimSpace(body.Phone)
|
|
if phone == "" {
|
|
h.response.BadRequest(c, "请提供用户ID或手机号")
|
|
return
|
|
}
|
|
list, err := h.userApp.ListUsers(c.Request.Context(), &queries.ListUsersQuery{
|
|
Page: 1,
|
|
PageSize: 50,
|
|
Phone: phone,
|
|
})
|
|
if err != nil || list == nil || len(list.Items) == 0 {
|
|
h.response.BadRequest(c, "未找到该手机号用户")
|
|
return
|
|
}
|
|
for _, item := range list.Items {
|
|
if item.Phone == phone {
|
|
userID = item.ID
|
|
break
|
|
}
|
|
}
|
|
if userID == "" {
|
|
userID = list.Items[0].ID
|
|
}
|
|
}
|
|
|
|
cmd := &commands.BlacklistUserCommand{
|
|
UserID: userID,
|
|
OperatorUserID: op,
|
|
Reason: body.Reason,
|
|
Source: body.Source,
|
|
}
|
|
if err := h.userApp.BlacklistUser(c.Request.Context(), cmd); err != nil {
|
|
h.response.BadRequest(c, err.Error())
|
|
return
|
|
}
|
|
h.response.Success(c, gin.H{"user_id": userID}, "已列入用户黑名单")
|
|
}
|
|
|
|
// RemoveUser 移出用户黑名单
|
|
func (h *AdminBlacklistHandler) RemoveUser(c *gin.Context) {
|
|
op := h.operatorID(c)
|
|
userID := c.Param("user_id")
|
|
if userID == "" {
|
|
h.response.BadRequest(c, "用户ID不能为空")
|
|
return
|
|
}
|
|
if err := h.userApp.UnblacklistUser(c.Request.Context(), &commands.UnblacklistUserCommand{
|
|
UserID: userID,
|
|
OperatorUserID: op,
|
|
}); err != nil {
|
|
h.response.BadRequest(c, err.Error())
|
|
return
|
|
}
|
|
h.response.Success(c, nil, "已移出用户黑名单")
|
|
}
|
|
|
|
// ListIPs IP 黑名单
|
|
func (h *AdminBlacklistHandler) ListIPs(c *gin.Context) {
|
|
page, pageSize := h.pageParams(c)
|
|
list, total, err := h.blacklist.ListIP(c.Request.Context(), page, pageSize, c.Query("keyword"))
|
|
if err != nil {
|
|
h.response.BadRequest(c, "查询失败")
|
|
return
|
|
}
|
|
h.response.Success(c, gin.H{
|
|
"items": list,
|
|
"total": total,
|
|
"page": page,
|
|
"size": pageSize,
|
|
}, "ok")
|
|
}
|
|
|
|
// AddIP 添加 IP 黑名单
|
|
func (h *AdminBlacklistHandler) AddIP(c *gin.Context) {
|
|
op := h.operatorID(c)
|
|
var body struct {
|
|
IP string `json:"ip" binding:"required"`
|
|
Reason string `json:"reason" binding:"required"`
|
|
Source string `json:"source"`
|
|
}
|
|
if err := c.ShouldBindJSON(&body); err != nil {
|
|
h.response.BadRequest(c, "请填写IP和原因")
|
|
return
|
|
}
|
|
entry, err := h.blacklist.AddIP(c.Request.Context(), body.IP, body.Reason, body.Source, op)
|
|
if err != nil {
|
|
h.response.BadRequest(c, err.Error())
|
|
return
|
|
}
|
|
h.response.Success(c, entry, "已加入IP黑名单")
|
|
}
|
|
|
|
// RemoveIP 移除 IP 黑名单
|
|
func (h *AdminBlacklistHandler) RemoveIP(c *gin.Context) {
|
|
idStr := c.Param("id")
|
|
id, err := strconv.ParseUint(idStr, 10, 64)
|
|
if err != nil {
|
|
h.response.BadRequest(c, "无效ID")
|
|
return
|
|
}
|
|
if err := h.blacklist.RemoveIP(c.Request.Context(), id); err != nil {
|
|
h.response.BadRequest(c, err.Error())
|
|
return
|
|
}
|
|
h.response.Success(c, nil, "已移除IP黑名单")
|
|
}
|
|
|
|
// ListHits 拦截记录
|
|
func (h *AdminBlacklistHandler) ListHits(c *gin.Context) {
|
|
page, pageSize := h.pageParams(c)
|
|
list, total, err := h.blacklist.ListHits(c.Request.Context(), page, pageSize, c.Query("hit_type"), c.Query("keyword"))
|
|
if err != nil {
|
|
h.response.BadRequest(c, "查询失败")
|
|
return
|
|
}
|
|
h.response.Success(c, gin.H{
|
|
"items": list,
|
|
"total": total,
|
|
"page": page,
|
|
"size": pageSize,
|
|
}, "ok")
|
|
}
|