package controller import ( "github.com/gin-gonic/gin" "github.com/skip2/go-qrcode" "hy2xs-admin/model/dto" "hy2xs-admin/model/vo" "hy2xs-admin/service" "strconv" "strings" "time" ) func resolvePeerID(c *gin.Context) (*int64, bool) { raw := strings.TrimSpace(c.Param("id")) if raw == "" { return nil, false } parsed, err := strconv.ParseInt(raw, 10, 64) if err != nil || parsed <= 0 { return nil, false } return &parsed, true } func Hysteria2Auth(c *gin.Context) { var req dto.Hysteria2AuthDto if err := c.ShouldBindJSON(&req); err != nil { vo.Hysteria2AuthBadRequest(c) return } if req.Addr == nil || req.Auth == nil || req.Tx == nil { vo.Hysteria2AuthBadRequest(c) return } id, username, err := service.Hysteria2Auth(*req.Auth) if err != nil || username == "" { vo.Hysteria2AuthFail("", c) return } // Обновление времени последнего подключения now := time.Now().UnixMilli() if err = service.UpdatePeerLastConnectionAt(id, now); err != nil { vo.Fail(err.Error(), c) return } vo.Hysteria2AuthSuccess(username, c) } func Hysteria2Kick(c *gin.Context) { hysteria2KickDto, err := validateField(c, dto.Hysteria2KickDto{}) if err != nil { return } err = service.Hysteria2Kick(hysteria2KickDto.Ids, *hysteria2KickDto.KickUtilTime) if err != nil { vo.Fail(err.Error(), c) return } vo.Success(nil, c) } func Hysteria2ChangeVersion(c *gin.Context) { vo.Fail("Смена версии Hysteria2 отключена: runtime управляется install-оркестратором HY2XS", c) } func ListRelease(c *gin.Context) { vo.Success([]string{}, c) } func Hysteria2Url(c *gin.Context) { hysteria2UrlDto := dto.Hysteria2UrlDto{} if id, ok := resolvePeerID(c); ok { hysteria2UrlDto.AccountId = id } else { var err error hysteria2UrlDto, err = validateField(c, dto.Hysteria2UrlDto{}) if err != nil { return } } url, err := service.Hysteria2Url(*hysteria2UrlDto.AccountId) if err != nil { vo.Fail(err.Error(), c) return } // Генерация QR-кода qrCode, err := qrcode.Encode(url, qrcode.Medium, 300) if err != nil { vo.Fail(err.Error(), c) return } hysteria2UrlVo := vo.Hysteria2UrlVo{ Url: url, QrCode: qrCode, } vo.Success(hysteria2UrlVo, c) }