Files
urldb/handlers/cks_handler.go
2025-07-17 14:08:52 +08:00

335 lines
8.1 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package handlers
import (
"net/http"
"strconv"
"strings"
panutils "github.com/ctwj/panResManage/common"
"github.com/ctwj/panResManage/db/converter"
"github.com/ctwj/panResManage/db/dto"
"github.com/ctwj/panResManage/db/entity"
"github.com/gin-gonic/gin"
)
// GetCks 获取Cookie列表
func GetCks(c *gin.Context) {
cks, err := repoManager.CksRepository.FindAll()
if err != nil {
ErrorResponse(c, err.Error(), http.StatusInternalServerError)
return
}
responses := converter.ToCksResponseList(cks)
SuccessResponse(c, responses)
}
// CreateCks 创建Cookie
func CreateCks(c *gin.Context) {
var req dto.CreateCksRequest
if err := c.ShouldBindJSON(&req); err != nil {
ErrorResponse(c, err.Error(), http.StatusBadRequest)
return
}
// 获取平台信息以确定服务类型
pan, err := repoManager.PanRepository.FindByID(req.PanID)
if err != nil {
ErrorResponse(c, "平台不存在", http.StatusBadRequest)
return
}
// 根据平台名称确定服务类型
var serviceType panutils.ServiceType
switch pan.Name {
case "quark":
serviceType = panutils.Quark
case "alipan":
serviceType = panutils.Alipan
case "baidu":
serviceType = panutils.BaiduPan
case "uc":
serviceType = panutils.UC
default:
ErrorResponse(c, "不支持的平台类型", http.StatusBadRequest)
return
}
// 创建网盘服务实例
factory := panutils.GetInstance()
service, err := factory.CreatePanServiceByType(serviceType, &panutils.PanConfig{})
if err != nil {
ErrorResponse(c, "创建网盘服务失败: "+err.Error(), http.StatusInternalServerError)
return
}
// 获取用户信息
userInfo, err := service.GetUserInfo(req.Ck)
if err != nil {
ErrorResponse(c, "无法获取用户信息,账号创建失败: "+err.Error(), http.StatusBadRequest)
return
}
leftSpaceBytes := userInfo.TotalSpace - userInfo.UsedSpace
// 创建Cks实体
cks := &entity.Cks{
PanID: req.PanID,
Idx: req.Idx,
Ck: req.Ck,
IsValid: userInfo.VIPStatus, // 根据VIP状态设置有效性
Space: userInfo.TotalSpace,
LeftSpace: leftSpaceBytes,
UsedSpace: userInfo.UsedSpace,
Username: userInfo.Username,
VipStatus: userInfo.VIPStatus,
ServiceType: userInfo.ServiceType,
Remark: req.Remark,
}
err = repoManager.CksRepository.Create(cks)
if err != nil {
ErrorResponse(c, err.Error(), http.StatusInternalServerError)
return
}
SuccessResponse(c, gin.H{
"message": "账号创建成功",
"cks": converter.ToCksResponse(cks),
})
}
// parseCapacityToBytes 将容量字符串转换为字节数
func parseCapacityToBytes(capacity string) int64 {
if capacity == "未知" || capacity == "" {
return 0
}
// 移除空格并转换为小写
capacity = strings.TrimSpace(strings.ToLower(capacity))
var multiplier int64 = 1
if strings.Contains(capacity, "gb") {
multiplier = 1024 * 1024 * 1024
capacity = strings.Replace(capacity, "gb", "", -1)
} else if strings.Contains(capacity, "mb") {
multiplier = 1024 * 1024
capacity = strings.Replace(capacity, "mb", "", -1)
} else if strings.Contains(capacity, "kb") {
multiplier = 1024
capacity = strings.Replace(capacity, "kb", "", -1)
} else if strings.Contains(capacity, "b") {
capacity = strings.Replace(capacity, "b", "", -1)
}
// 解析数字
capacity = strings.TrimSpace(capacity)
if capacity == "" {
return 0
}
// 尝试解析浮点数
if strings.Contains(capacity, ".") {
if val, err := strconv.ParseFloat(capacity, 64); err == nil {
return int64(val * float64(multiplier))
}
} else {
if val, err := strconv.ParseInt(capacity, 10, 64); err == nil {
return val * multiplier
}
}
return 0
}
// GetCksByID 根据ID获取Cookie详情
func GetCksByID(c *gin.Context) {
idStr := c.Param("id")
id, err := strconv.ParseUint(idStr, 10, 32)
if err != nil {
ErrorResponse(c, "无效的ID", http.StatusBadRequest)
return
}
cks, err := repoManager.CksRepository.FindByID(uint(id))
if err != nil {
ErrorResponse(c, "Cookie不存在", http.StatusNotFound)
return
}
response := converter.ToCksResponse(cks)
SuccessResponse(c, response)
}
// UpdateCks 更新Cookie
func UpdateCks(c *gin.Context) {
idStr := c.Param("id")
id, err := strconv.ParseUint(idStr, 10, 32)
if err != nil {
ErrorResponse(c, "无效的ID", http.StatusBadRequest)
return
}
var req dto.UpdateCksRequest
if err := c.ShouldBindJSON(&req); err != nil {
ErrorResponse(c, err.Error(), http.StatusBadRequest)
return
}
cks, err := repoManager.CksRepository.FindByID(uint(id))
if err != nil {
ErrorResponse(c, "Cookie不存在", http.StatusNotFound)
return
}
if req.PanID != 0 {
cks.PanID = req.PanID
}
if req.Idx != 0 {
cks.Idx = req.Idx
}
if req.Ck != "" {
cks.Ck = req.Ck
}
cks.IsValid = req.IsValid
if req.LeftSpace != 0 {
cks.LeftSpace = req.LeftSpace
}
if req.UsedSpace != 0 {
cks.UsedSpace = req.UsedSpace
}
if req.Username != "" {
cks.Username = req.Username
}
cks.VipStatus = req.VipStatus
if req.ServiceType != "" {
cks.ServiceType = req.ServiceType
}
if req.Remark != "" {
cks.Remark = req.Remark
}
err = repoManager.CksRepository.Update(cks)
if err != nil {
ErrorResponse(c, err.Error(), http.StatusInternalServerError)
return
}
SuccessResponse(c, gin.H{"message": "Cookie更新成功"})
}
// DeleteCks 删除Cookie
func DeleteCks(c *gin.Context) {
idStr := c.Param("id")
id, err := strconv.ParseUint(idStr, 10, 32)
if err != nil {
ErrorResponse(c, "无效的ID", http.StatusBadRequest)
return
}
err = repoManager.CksRepository.Delete(uint(id))
if err != nil {
ErrorResponse(c, err.Error(), http.StatusInternalServerError)
return
}
SuccessResponse(c, gin.H{"message": "Cookie删除成功"})
}
// GetCksByID 根据ID获取Cookie详情使用全局repoManager
func GetCksByIDGlobal(c *gin.Context) {
idStr := c.Param("id")
id, err := strconv.ParseUint(idStr, 10, 32)
if err != nil {
ErrorResponse(c, "无效的ID", http.StatusBadRequest)
return
}
cks, err := repoManager.CksRepository.FindByID(uint(id))
if err != nil {
ErrorResponse(c, "Cookie不存在", http.StatusNotFound)
return
}
response := converter.ToCksResponse(cks)
SuccessResponse(c, response)
}
// RefreshCapacity 刷新账号容量信息
func RefreshCapacity(c *gin.Context) {
idStr := c.Param("id")
id, err := strconv.ParseUint(idStr, 10, 32)
if err != nil {
ErrorResponse(c, "无效的ID", http.StatusBadRequest)
return
}
// 获取账号信息
cks, err := repoManager.CksRepository.FindByID(uint(id))
if err != nil {
ErrorResponse(c, "账号不存在", http.StatusNotFound)
return
}
// 获取平台信息以确定服务类型
pan, err := repoManager.PanRepository.FindByID(cks.PanID)
if err != nil {
ErrorResponse(c, "平台不存在", http.StatusBadRequest)
return
}
// 根据平台名称确定服务类型
var serviceType panutils.ServiceType
switch pan.Name {
case "quark":
serviceType = panutils.Quark
case "alipan":
serviceType = panutils.Alipan
case "baidu":
serviceType = panutils.BaiduPan
case "uc":
serviceType = panutils.UC
default:
ErrorResponse(c, "不支持的平台类型", http.StatusBadRequest)
return
}
// 创建网盘服务实例
factory := panutils.GetInstance()
service, err := factory.CreatePanServiceByType(serviceType, &panutils.PanConfig{})
if err != nil {
ErrorResponse(c, "创建网盘服务失败: "+err.Error(), http.StatusInternalServerError)
return
}
// 获取最新的用户信息
userInfo, err := service.GetUserInfo(cks.Ck)
if err != nil {
ErrorResponse(c, "无法获取用户信息,刷新失败: "+err.Error(), http.StatusBadRequest)
return
}
leftSpaceBytes := userInfo.TotalSpace - userInfo.UsedSpace
// 更新账号信息
cks.Username = userInfo.Username
cks.VipStatus = userInfo.VIPStatus
cks.ServiceType = userInfo.ServiceType
cks.Space = userInfo.TotalSpace
cks.LeftSpace = leftSpaceBytes
cks.UsedSpace = userInfo.UsedSpace
cks.IsValid = userInfo.VIPStatus // 根据VIP状态更新有效性
err = repoManager.CksRepository.Update(cks)
if err != nil {
ErrorResponse(c, err.Error(), http.StatusInternalServerError)
return
}
SuccessResponse(c, gin.H{
"message": "容量信息刷新成功",
"cks": converter.ToCksResponse(cks),
})
}