diff --git a/internal/db/models/ip_item_dao.go b/internal/db/models/ip_item_dao.go index ec21b4d7..603b2a5c 100644 --- a/internal/db/models/ip_item_dao.go +++ b/internal/db/models/ip_item_dao.go @@ -240,6 +240,20 @@ func (this *IPItemDAO) FindEnabledItemContainsIP(tx *dbs.Tx, listId int64, ip ui return one.(*IPItem), nil } +// FindEnabledItemsWithIP 根据IP查找Item +func (this *IPItemDAO) FindEnabledItemsWithIP(tx *dbs.Tx, ip string) (result []*IPItem, err error) { + _, err = this.Query(tx). + Attr("ipFrom", ip). + Attr("ipTo", ""). + Where("(expiredAt=0 OR expiredAt>:nowTime)"). + Param("nowTime", time.Now().Unix()). + Where("listId IN (SELECT id FROM " + SharedIPListDAO.Table + " WHERE state=1)"). + AscPk(). + Slice(&result). + FindAll() + return +} + // ExistsEnabledItem 检查IP是否存在 func (this *IPItemDAO) ExistsEnabledItem(tx *dbs.Tx, itemId int64) (bool, error) { return this.Query(tx). diff --git a/internal/rpc/services/service_ip_list.go b/internal/rpc/services/service_ip_list.go index a5a26292..3768da20 100644 --- a/internal/rpc/services/service_ip_list.go +++ b/internal/rpc/services/service_ip_list.go @@ -4,6 +4,7 @@ import ( "context" "github.com/TeaOSLab/EdgeAPI/internal/db/models" "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" + "github.com/iwind/TeaGo/lists" ) // IPListService IP名单相关服务 @@ -145,3 +146,48 @@ func (this *IPListService) ExistsEnabledIPList(ctx context.Context, req *pb.Exis } return &pb.ExistsEnabledIPListResponse{Exists: b}, nil } + +// FindEnabledIPListContainsIP 根据IP来搜索IP名单 +func (this *IPListService) FindEnabledIPListContainsIP(ctx context.Context, req *pb.FindEnabledIPListContainsIPRequest) (*pb.FindEnabledIPListContainsIPResponse, error) { + _, err := this.ValidateAdmin(ctx, 0) + if err != nil { + return nil, err + } + + var tx = this.NullTx() + items, err := models.SharedIPItemDAO.FindEnabledItemsWithIP(tx, req.Ip) + if err != nil { + return nil, err + } + + var pbLists = []*pb.IPList{} + var listIds = []int64{} + for _, item := range items { + if lists.ContainsInt64(listIds, int64(item.ListId)) { + continue + } + + list, err := models.SharedIPListDAO.FindEnabledIPList(tx, int64(item.ListId)) + if err != nil { + return nil, err + } + if list == nil { + continue + } + if list.IsPublic != 1 { + continue + } + pbLists = append(pbLists, &pb.IPList{ + Id: int64(list.Id), + IsOn: list.IsOn == 1, + Type: list.Type, + Name: list.Name, + Code: list.Code, + IsPublic: list.IsPublic == 1, + Description: "", + }) + + listIds = append(listIds, int64(item.ListId)) + } + return &pb.FindEnabledIPListContainsIPResponse{IpLists: pbLists}, nil +}