- Introduce interfaces for all major services (JWT, PostAI, Comment, Message, Notification, QRCodeLogin, Upload, Vote, etc.) to support dependency inversion. - Move query parameters from `internal/dto` to a new `internal/query` package to separate request payloads from data transfer objects. - Refactor `internal/router` to use embedded `RouterDeps` for cleaner dependency management. - Decouple handlers from repositories by injecting services instead of direct repository access, ensuring proper layering. - Improve database initialization by moving it from `internal/model` to `internal/database`. - Optimize message decryption by implementing a more efficient `BatchDecrypt` method in `MessageEncryptor` using a worker pool. - Enhance error handling and security by implementing fail-fast checks for encryption key length during startup. - Clean up unused code, including the `avatar` package and several unused DTOs.
188 lines
5.0 KiB
Go
188 lines
5.0 KiB
Go
package handler
|
|
|
|
import (
|
|
"context"
|
|
"strconv"
|
|
|
|
"with_you/internal/dto"
|
|
"with_you/internal/model"
|
|
"with_you/internal/pkg/response"
|
|
"with_you/internal/service"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
type AdminVerificationHandler struct {
|
|
adminVerificationService service.AdminVerificationService
|
|
userService service.UserService
|
|
}
|
|
|
|
func NewAdminVerificationHandler(
|
|
adminVerificationService service.AdminVerificationService,
|
|
userService service.UserService,
|
|
) *AdminVerificationHandler {
|
|
return &AdminVerificationHandler{
|
|
adminVerificationService: adminVerificationService,
|
|
userService: userService,
|
|
}
|
|
}
|
|
|
|
func (h *AdminVerificationHandler) ListVerifications(c *gin.Context) {
|
|
page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
|
|
pageSize, _ := strconv.Atoi(c.DefaultQuery("page_size", "20"))
|
|
status := c.Query("status")
|
|
keyword := c.Query("keyword")
|
|
|
|
if page <= 0 {
|
|
page = 1
|
|
}
|
|
if pageSize <= 0 || pageSize > 100 {
|
|
pageSize = 20
|
|
}
|
|
|
|
if status != "" && status != string(model.VerificationStatusPending) &&
|
|
status != string(model.VerificationStatusApproved) &&
|
|
status != string(model.VerificationStatusRejected) {
|
|
response.BadRequest(c, "无效的状态值")
|
|
return
|
|
}
|
|
|
|
records, total, err := h.adminVerificationService.ListVerifications(c.Request.Context(), page, pageSize, status, keyword)
|
|
if err != nil {
|
|
response.InternalServerError(c, "获取认证列表失败")
|
|
return
|
|
}
|
|
|
|
responses := make([]*dto.AdminVerificationListResponse, len(records))
|
|
for i, record := range records {
|
|
responses[i] = h.convertToAdminListResponse(c.Request.Context(), record)
|
|
}
|
|
|
|
response.Paginated(c, responses, total, page, pageSize)
|
|
}
|
|
|
|
func (h *AdminVerificationHandler) GetVerificationDetail(c *gin.Context) {
|
|
id := c.Param("id")
|
|
if id == "" {
|
|
response.BadRequest(c, "认证ID不能为空")
|
|
return
|
|
}
|
|
|
|
record, err := h.adminVerificationService.GetVerificationDetail(c.Request.Context(), id)
|
|
if err != nil {
|
|
response.NotFound(c, "认证记录不存在")
|
|
return
|
|
}
|
|
|
|
response.Success(c, h.convertToAdminDetailResponse(c.Request.Context(), record))
|
|
}
|
|
|
|
func (h *AdminVerificationHandler) ReviewVerification(c *gin.Context) {
|
|
reviewerID, exists := c.Get("user_id")
|
|
if !exists {
|
|
response.Unauthorized(c, "未授权")
|
|
return
|
|
}
|
|
|
|
id := c.Param("id")
|
|
if id == "" {
|
|
response.BadRequest(c, "认证ID不能为空")
|
|
return
|
|
}
|
|
|
|
var req dto.AdminReviewVerificationRequest
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
response.BadRequest(c, "请求参数错误: "+err.Error())
|
|
return
|
|
}
|
|
|
|
if !req.Approve && req.RejectReason == "" {
|
|
response.BadRequest(c, "拒绝时必须填写拒绝原因")
|
|
return
|
|
}
|
|
|
|
record, err := h.adminVerificationService.ReviewVerification(
|
|
c.Request.Context(),
|
|
reviewerID.(string),
|
|
id,
|
|
req.Approve,
|
|
req.RejectReason,
|
|
)
|
|
if err != nil {
|
|
response.HandleError(c, err, "审核失败")
|
|
return
|
|
}
|
|
|
|
response.Success(c, h.convertToAdminDetailResponse(c.Request.Context(), record))
|
|
}
|
|
|
|
func (h *AdminVerificationHandler) convertToAdminListResponse(ctx context.Context, record *model.VerificationRecord) *dto.AdminVerificationListResponse {
|
|
resp := &dto.AdminVerificationListResponse{
|
|
ID: record.ID,
|
|
UserID: record.UserID,
|
|
Identity: string(record.Identity),
|
|
Status: string(record.Status),
|
|
RealName: record.RealName,
|
|
StudentID: record.StudentID,
|
|
EmployeeID: record.EmployeeID,
|
|
Department: record.Department,
|
|
CreatedAt: dto.FormatTime(record.CreatedAt),
|
|
}
|
|
|
|
user, err := h.userService.GetUserByID(ctx, record.UserID)
|
|
if err == nil && user != nil {
|
|
resp.Username = user.Username
|
|
resp.Nickname = user.Nickname
|
|
resp.Avatar = user.Avatar
|
|
}
|
|
|
|
if record.ReviewedAt != nil {
|
|
resp.ReviewedAt = dto.FormatTime(*record.ReviewedAt)
|
|
if record.ReviewedBy != nil {
|
|
reviewer, err := h.userService.GetUserByID(ctx, *record.ReviewedBy)
|
|
if err == nil && reviewer != nil {
|
|
resp.ReviewerName = reviewer.Nickname
|
|
}
|
|
}
|
|
}
|
|
|
|
return resp
|
|
}
|
|
|
|
func (h *AdminVerificationHandler) convertToAdminDetailResponse(ctx context.Context, record *model.VerificationRecord) *dto.AdminVerificationDetailResponse {
|
|
resp := &dto.AdminVerificationDetailResponse{
|
|
ID: record.ID,
|
|
UserID: record.UserID,
|
|
Identity: string(record.Identity),
|
|
Status: string(record.Status),
|
|
RealName: record.RealName,
|
|
StudentID: record.StudentID,
|
|
EmployeeID: record.EmployeeID,
|
|
Department: record.Department,
|
|
ProofMaterials: record.ProofMaterials,
|
|
CreatedAt: dto.FormatTime(record.CreatedAt),
|
|
}
|
|
|
|
user, err := h.userService.GetUserByID(ctx, record.UserID)
|
|
if err == nil && user != nil {
|
|
resp.Username = user.Username
|
|
resp.Nickname = user.Nickname
|
|
resp.Avatar = user.Avatar
|
|
}
|
|
|
|
if record.ReviewedAt != nil {
|
|
resp.ReviewedAt = dto.FormatTime(*record.ReviewedAt)
|
|
}
|
|
if record.ReviewedBy != nil {
|
|
resp.ReviewedBy = *record.ReviewedBy
|
|
if reviewer, err := h.userService.GetUserByID(ctx, *record.ReviewedBy); err == nil && reviewer != nil {
|
|
resp.ReviewerName = reviewer.Nickname
|
|
}
|
|
}
|
|
if record.RejectReason != "" {
|
|
resp.RejectReason = record.RejectReason
|
|
}
|
|
|
|
return resp
|
|
}
|