123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196 |
- package service
- import (
- "context"
- "fmt"
- v1 "github.com/go-nunu/nunu-layout-advanced/api/v1"
- "github.com/go-nunu/nunu-layout-advanced/internal/model"
- "github.com/go-nunu/nunu-layout-advanced/internal/repository"
- "github.com/spf13/viper"
- "strconv"
- "time"
- )
- type GameShieldService interface {
- SubmitGameShield(ctx context.Context, req *v1.GameShieldSubmitRequest) (string, error)
- EditGameShield(ctx context.Context, req *v1.GameShieldSubmitRequest) (string, error)
- DeleteGameShield(ctx context.Context, req int) (string, error)
- }
- func NewGameShieldService(
- service *Service,
- gameShieldRepository repository.GameShieldRepository,
- crawlerService CrawlerService,
- gameShieldPublicIpService GameShieldPublicIpService,
- duedate DuedateService,
- formatter FormatterService,
- parser ParserService,
- required RequiredService,
- conf *viper.Viper,
- ) GameShieldService {
- return &gameShieldService{
- Service: service,
- gameShieldRepository: gameShieldRepository,
- crawlerService: crawlerService,
- gameShieldPublicIpService: gameShieldPublicIpService,
- duedate: duedate,
- formatter: formatter,
- parser: parser,
- required: required,
- Url: conf.GetString("crawler.Url"),
- }
- }
- type gameShieldService struct {
- *Service
- config *viper.Viper
- crawlerService CrawlerService
- gameShieldRepository repository.GameShieldRepository
- gameShieldPublicIpService GameShieldPublicIpService
- duedate DuedateService
- formatter FormatterService
- Url string
- parser ParserService
- required RequiredService
- }
- func (service *gameShieldService) GetGameShieldrequired(ctx context.Context, req *v1.GameShieldSubmitRequest) (*v1.GetGameShieldRequiredResponse, error) {
- var res v1.GetGameShieldRequiredResponse
- var err error
- if req.Uid == 0 {
- return nil, fmt.Errorf("uid is required")
- }
- res.ExpiredAt, err = service.duedate.NextDueDate(ctx, req.Uid, req.HostId)
- if err != nil {
- return nil, err
- }
- nameCount, err := service.gameShieldRepository.GetGameShieldDuplicateName(ctx, req.AppName)
- if err != nil {
- return nil, err
- }
- if nameCount > 0 {
- return nil, fmt.Errorf("应用名称已存在")
- }
- res.Backend, err = service.formatter.FormatBackendData(ctx, req)
- if err != nil {
- return nil, err
- }
- res.Cookie, err = service.crawlerService.GetLoginCookie(ctx)
- if err != nil {
- return nil, err
- }
- return &res, nil
- }
- func (service *gameShieldService) SubmitGameShield(ctx context.Context, req *v1.GameShieldSubmitRequest) (string, error) {
- require, err := service.GetGameShieldrequired(ctx, req)
- if err != nil {
- return "", err
- }
- formData := map[string]interface{}{
- "app_name": req.AppName,
- "gateway_group_id": 4,
- "backend": require.Backend,
- "expired_at": require.ExpiredAt,
- "max_device_count": 0,
- }
- respBody, err := service.required.SendForm(ctx, "admin/info/rule/new", "admin/new/rule", formData)
- if err != nil {
- return "", err
- }
- // 解析响应内容中的 alert 消息
- res, err := service.parser.ParseAlert(string(respBody))
- if err != nil {
- return "", err
- }
- if res != "" {
- return "", fmt.Errorf(res)
- }
- KeyAndField, err := service.required.GetKeyAndField(ctx, req.AppName, "rule_id")
- if err != nil {
- return "", err
- }
- if err := service.gameShieldRepository.AddGameShield(ctx, &model.GameShield{
- AppName: req.AppName,
- GatewayGroupId: 2,
- Backend: require.Backend,
- RuleId: KeyAndField.FieldId,
- Key: KeyAndField.Key,
- AddTime: time.Now(),
- Uid: req.Uid,
- HostId: req.HostId,
- AppIp: req.AppIp,
- Checked: req.Checked,
- }); err != nil {
- return "", err
- }
- return res, nil
- }
- func (service *gameShieldService) EditGameShield(ctx context.Context, req *v1.GameShieldSubmitRequest) (string, error) {
- require, err := service.GetGameShieldrequired(ctx, req)
- if err != nil {
- return "", err
- }
- tokenUrl := service.Url + "admin/info/rule/edit?&__goadmin_edit_pk=" + strconv.Itoa(req.RuleId)
- tokens, err := service.crawlerService.GetFormTokens(ctx, tokenUrl, require.Cookie)
- if err != nil {
- return "", err
- }
- sendUrl := service.Url + "admin/edit/rule"
- formData := map[string]interface{}{
- "app_name": req.AppName,
- "gateway_group_id": 2,
- "backend": require.Backend,
- "rule_id": req.RuleId,
- "expired_at": require.ExpiredAt,
- "max_device_count": 0,
- "__go_admin_previous_": tokens["previous"],
- "__go_admin_t_": tokens["t"],
- }
- respBody, err := service.crawlerService.SendFormData(ctx, sendUrl, require.Cookie, formData)
- if err != nil {
- return "", err
- }
- // 解析响应内容中的 alert 消息
- res, err := service.parser.ParseAlert(string(respBody))
- if err != nil {
- return "", err
- }
- if res != "" {
- return "", fmt.Errorf(res)
- }
- KeyAndField, err := service.required.GetKeyAndField(ctx, req.AppName, "rule_id")
- if err != nil {
- return "", err
- }
- if err := service.gameShieldRepository.UpdateGameShield(ctx, &model.GameShield{
- AppName: req.AppName,
- GatewayGroupId: 2,
- Backend: require.Backend,
- RuleId: KeyAndField.FieldId,
- Key: KeyAndField.Key,
- Uid: req.Uid,
- HostId: req.HostId,
- AppIp: req.AppIp,
- Checked: req.Checked,
- }); err != nil {
- return "", err
- }
- return res, nil
- }
- func (service *gameShieldService) DeleteGameShield(ctx context.Context, id int) (string, error) {
- shieldInfo, err := service.gameShieldRepository.GetGameShieldById(ctx, int64(id))
- if err != nil {
- return "", err
- }
- res, err := service.crawlerService.DeleteRule(ctx, shieldInfo.RuleId, "admin/delete/rule?page=1&__pageSize=10&__sort=rule_id&__sort_type=desc")
- if err != nil {
- return "", err
- }
- if err := service.gameShieldRepository.DeleteGameShield(ctx, shieldInfo.RuleId); err != nil {
- return "", err
- }
- return res, nil
- }
|