Files
urldb/handlers/cks_handler.go

335 lines
8.1 KiB
Go
Raw Normal View History

2025-07-10 13:58:28 +08:00
package handlers
import (
"net/http"
"strconv"
2025-07-17 01:43:22 +08:00
"strings"
2025-07-10 13:58:28 +08:00
2025-07-17 14:08:52 +08:00
panutils "github.com/ctwj/panResManage/common"
"github.com/ctwj/panResManage/db/converter"
"github.com/ctwj/panResManage/db/dto"
"github.com/ctwj/panResManage/db/entity"
2025-07-10 13:58:28 +08:00
"github.com/gin-gonic/gin"
)
// GetCks 获取Cookie列表
func GetCks(c *gin.Context) {
cks, err := repoManager.CksRepository.FindAll()
if err != nil {
2025-07-11 17:45:16 +08:00
ErrorResponse(c, err.Error(), http.StatusInternalServerError)
2025-07-10 13:58:28 +08:00
return
}
responses := converter.ToCksResponseList(cks)
2025-07-11 17:45:16 +08:00
SuccessResponse(c, responses)
2025-07-10 13:58:28 +08:00
}
// CreateCks 创建Cookie
func CreateCks(c *gin.Context) {
var req dto.CreateCksRequest
if err := c.ShouldBindJSON(&req); err != nil {
2025-07-11 17:45:16 +08:00
ErrorResponse(c, err.Error(), http.StatusBadRequest)
2025-07-10 13:58:28 +08:00
return
}
2025-07-17 01:43:22 +08:00
// 获取平台信息以确定服务类型
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实体
2025-07-10 13:58:28 +08:00
cks := &entity.Cks{
2025-07-17 01:43:22 +08:00
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,
2025-07-10 13:58:28 +08:00
}
2025-07-17 01:43:22 +08:00
err = repoManager.CksRepository.Create(cks)
2025-07-10 13:58:28 +08:00
if err != nil {
2025-07-11 17:45:16 +08:00
ErrorResponse(c, err.Error(), http.StatusInternalServerError)
2025-07-10 13:58:28 +08:00
return
}
2025-07-11 17:45:16 +08:00
SuccessResponse(c, gin.H{
2025-07-17 01:43:22 +08:00
"message": "账号创建成功",
2025-07-11 17:45:16 +08:00
"cks": converter.ToCksResponse(cks),
2025-07-10 13:58:28 +08:00
})
}
2025-07-17 01:43:22 +08:00
// 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
}
2025-07-11 17:45:16 +08:00
// 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)
}
2025-07-10 13:58:28 +08:00
// UpdateCks 更新Cookie
func UpdateCks(c *gin.Context) {
idStr := c.Param("id")
id, err := strconv.ParseUint(idStr, 10, 32)
if err != nil {
2025-07-11 17:45:16 +08:00
ErrorResponse(c, "无效的ID", http.StatusBadRequest)
2025-07-10 13:58:28 +08:00
return
}
var req dto.UpdateCksRequest
if err := c.ShouldBindJSON(&req); err != nil {
2025-07-11 17:45:16 +08:00
ErrorResponse(c, err.Error(), http.StatusBadRequest)
2025-07-10 13:58:28 +08:00
return
}
cks, err := repoManager.CksRepository.FindByID(uint(id))
if err != nil {
2025-07-11 17:45:16 +08:00
ErrorResponse(c, "Cookie不存在", http.StatusNotFound)
2025-07-10 13:58:28 +08:00
return
}
if req.PanID != 0 {
cks.PanID = req.PanID
}
2025-07-11 17:45:16 +08:00
if req.Idx != 0 {
cks.Idx = req.Idx
}
2025-07-10 13:58:28 +08:00
if req.Ck != "" {
cks.Ck = req.Ck
}
2025-07-11 10:01:48 +08:00
cks.IsValid = req.IsValid
2025-07-11 17:45:16 +08:00
if req.LeftSpace != 0 {
cks.LeftSpace = req.LeftSpace
}
2025-07-17 01:43:22 +08:00
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
}
2025-07-10 13:58:28 +08:00
if req.Remark != "" {
cks.Remark = req.Remark
}
err = repoManager.CksRepository.Update(cks)
if err != nil {
2025-07-11 17:45:16 +08:00
ErrorResponse(c, err.Error(), http.StatusInternalServerError)
2025-07-10 13:58:28 +08:00
return
}
2025-07-11 17:45:16 +08:00
SuccessResponse(c, gin.H{"message": "Cookie更新成功"})
2025-07-10 13:58:28 +08:00
}
// DeleteCks 删除Cookie
func DeleteCks(c *gin.Context) {
idStr := c.Param("id")
id, err := strconv.ParseUint(idStr, 10, 32)
if err != nil {
2025-07-11 17:45:16 +08:00
ErrorResponse(c, "无效的ID", http.StatusBadRequest)
2025-07-10 13:58:28 +08:00
return
}
err = repoManager.CksRepository.Delete(uint(id))
if err != nil {
2025-07-11 17:45:16 +08:00
ErrorResponse(c, err.Error(), http.StatusInternalServerError)
2025-07-10 13:58:28 +08:00
return
}
2025-07-11 17:45:16 +08:00
SuccessResponse(c, gin.H{"message": "Cookie删除成功"})
2025-07-10 13:58:28 +08:00
}
2025-07-11 17:45:16 +08:00
// GetCksByID 根据ID获取Cookie详情使用全局repoManager
func GetCksByIDGlobal(c *gin.Context) {
2025-07-10 13:58:28 +08:00
idStr := c.Param("id")
id, err := strconv.ParseUint(idStr, 10, 32)
if err != nil {
2025-07-11 17:45:16 +08:00
ErrorResponse(c, "无效的ID", http.StatusBadRequest)
2025-07-10 13:58:28 +08:00
return
}
cks, err := repoManager.CksRepository.FindByID(uint(id))
if err != nil {
2025-07-11 17:45:16 +08:00
ErrorResponse(c, "Cookie不存在", http.StatusNotFound)
2025-07-10 13:58:28 +08:00
return
}
response := converter.ToCksResponse(cks)
2025-07-11 17:45:16 +08:00
SuccessResponse(c, response)
2025-07-10 13:58:28 +08:00
}
2025-07-17 01:43:22 +08:00
// 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),
})
}