package test import ( "fmt" "github.com/gofiber/fiber/v2" "gofiber.study.skcks.cn/common/errorx" "gofiber.study.skcks.cn/common/logger" "gofiber.study.skcks.cn/common/response" "gofiber.study.skcks.cn/controller/types" "gofiber.study.skcks.cn/global" "gofiber.study.skcks.cn/model/captcha" "gofiber.study.skcks.cn/services/waf" "gofiber.study.skcks.cn/services/wol" "strconv" "time" ) type Controller struct { *types.Controller } func (c *Controller) GetRouter() fiber.Router { return c.Router } func NewController(app *fiber.App) *Controller { return &Controller{ Controller: types.NewController(app, "/test"), } } // JwtEncode jwt token 生成测试 // // @Summary jwt token 生成测试 // @Description jwt token 生成测试 // @Tags Test // @Accept json // @Produce json // @Param vo body global.UserClaims true "userClaims" // @Success 200 {object} response.Response{data=string} // @Failure default {object} errorx.CodeErrorResponse // @Router /test/jwt [post] func (c *Controller) JwtEncode() { c.Router.Add(fiber.MethodPost, "/jwt", func(ctx *fiber.Ctx) error { claims := global.UserClaims{} err := ctx.BodyParser(&claims) if err = errorx.ParseError(err); err != nil { return ctx.JSON(err) } token, err := global.GetToken(claims) if err = errorx.ParseError(err); err != nil { return ctx.JSON(err) } return ctx.JSON(response.NewResponse(token)) }) } // JwtDecode jwt token 解析测试 // // @Summary jwt token 解析测试 // @Description jwt token 解析测试 // @Tags Test // @Accept json // @Produce json // @Param token query string true "token" // @Success 200 {object} response.Response{data=global.UserClaims} // @Failure default {object} errorx.CodeErrorResponse // @Router /test/jwt [get] func (c *Controller) JwtDecode() { c.Router.Add(fiber.MethodGet, "/jwt", func(ctx *fiber.Ctx) error { token := ctx.Query("token") claims, err := global.ParseToken(token) if err = errorx.ParseError(err); err != nil { return ctx.JSON(err) } return ctx.JSON(response.NewResponse(claims)) }) } // SonyFlakeTest sonyFlake id 生成测试 // // @Summary sonyFlake id 生成测试 // @Description sonyFlake id 生成测试 // @Tags Test // @Accept json // @Produce json // @Success 200 {object} response.Response{data=int} // @Failure default {object} errorx.CodeErrorResponse // @Router /test/sonyFlake [get] func (c *Controller) SonyFlakeTest() { c.Router.Add(fiber.MethodGet, "/sonyFlake", func(ctx *fiber.Ctx) error { id, err := global.SonyFlake.NextID() if err = errorx.ParseError(err); err != nil { return ctx.JSON(err) } return ctx.JSON(response.NewResponse(id)) }) } // NanoIdTest nanoid 生成测试 // // @Summary nanoid 生成测试 // @Description nanoid 生成测试 // @Tags Test // @Accept json // @Produce json // @Success 200 {object} response.Response{data=string} // @Failure default {object} errorx.CodeErrorResponse // @Router /test/nanoid [get] func (c *Controller) NanoIdTest() { c.Router.Add(fiber.MethodGet, "/nanoid", func(ctx *fiber.Ctx) error { id, err := global.GetNanoId() if err = errorx.ParseError(err); err != nil { return ctx.JSON(err) } return ctx.JSON(response.NewResponse(id)) }) } // GetCaptchaTest 验证码 生成测试 // // @Summary 验证码 生成测试 // @Description 验证码 生成测试 // @Tags Test // @Accept json // @Produce json // @Success 200 {object} response.Response{data=captcha.Captcha} // @Failure default {object} errorx.CodeErrorResponse // @Router /test/captcha/get [get] func (c *Controller) GetCaptchaTest() { c.Router.Add(fiber.MethodGet, "/captcha/get", func(ctx *fiber.Ctx) error { id, content, answer := global.Captcha.Driver.GenerateIdQuestionAnswer() item, err := global.Captcha.Driver.DrawCaptcha(content) err = global.Captcha.Store.Set(id, answer) if err != nil { return ctx.JSON(errorx.NewDefaultError("验证码生成失败")) } return ctx.JSON(response.NewResponse(captcha.Captcha{ Id: id, Base64: item.EncodeB64string(), Expire: time.Now().Add(time.Duration(global.Config.Captcha.Expire) * time.Second).Unix(), })) }) } // VerifyCaptchaTest 验证码 验证测试 // // @Summary 验证码 验证测试 // @Description 验证码 验证测试 // @Tags Test // @Accept json // @Produce json // @Param vo body captcha.VerifyCaptcha true "验证码验证" // @Success 200 {object} response.Response{data=string} // @Failure default {object} errorx.CodeErrorResponse // @Router /test/captcha/verify [post] func (c *Controller) VerifyCaptchaTest() { c.Router.Add(fiber.MethodPost, "/captcha/verify", func(ctx *fiber.Ctx) error { verifyCaptcha := &captcha.VerifyCaptcha{} if err := errorx.ParseError(ctx.BodyParser(verifyCaptcha)); err != nil { return ctx.JSON(err) } logger.Log.Debugf("verifyCaptcha %#v", verifyCaptcha) verify := global.Captcha.Store.Verify(verifyCaptcha.Id, verifyCaptcha.Captcha, true) if !verify { return ctx.JSON(errorx.NewDefaultError("验证码错误")) } return ctx.JSON(response.NewResponse("验证成功")) }) } // WafRateLimitTest waf 访问频率限制 测试 // // @Summary waf 访问频率限制 测试 // @Description waf 访问频率限制 测试 // @Tags Test // @Accept json // @Produce json // @Success 200 {object} response.Response{data=string} // @Failure default {object} errorx.CodeErrorResponse // @Router /test/waf/access [get] func (c *Controller) WafRateLimitTest() { c.Router.Add(fiber.MethodGet, "/waf/access", func(ctx *fiber.Ctx) error { logger.Log.Infof("ip: %v", ctx.GetReqHeaders()) ip := ctx.GetReqHeaders()["X-Forwarded-For"] if len(ip) == 0 { ip = ctx.IP() } access := waf.Service.Access(ip) if !access { return ctx.JSON(errorx.NewErrorWithCode(fiber.StatusTooManyRequests, "访问频率超过限制")) } return ctx.JSON(response.NewResponse("正常访问")) }) } // WolTest wol 测试 // // @Summary wol 测试 // @Description wol 测试 // @Tags Test // @Accept json // @Produce json // @Param mac query string true "mac" // @Success 200 {object} response.Response{data=string} // @Failure default {object} errorx.CodeErrorResponse // @Router /test/wol [get] func (c *Controller) WolTest() { c.Router.Add(fiber.MethodGet, "/wol", func(ctx *fiber.Ctx) error { mac := ctx.Query("mac") port, err := strconv.Atoi(ctx.Query("port", "9")) if err := errorx.ParseError(err); err != nil { return ctx.JSON(err) } err = wol.Services.WakeUp(mac, port) if err := errorx.ParseError(err); err != nil { return ctx.JSON(err) } else { return ctx.JSON(response.NewResponse(fmt.Sprintf("%s 唤醒成功", mac))) } }) }