Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
103 lines
2.3 KiB
Go
103 lines
2.3 KiB
Go
package srv_ipblack
|
|
|
|
import (
|
|
"context"
|
|
"go.mongodb.org/mongo-driver/bson"
|
|
"go.mongodb.org/mongo-driver/bson/primitive"
|
|
"go.mongodb.org/mongo-driver/mongo/options"
|
|
"sync"
|
|
"time"
|
|
"videoweb/pub/common/log"
|
|
"videoweb/pub/common/srvdef"
|
|
"videoweb/pub/models/ipblackmod"
|
|
)
|
|
|
|
var (
|
|
ipBlackMap map[string]struct{}
|
|
lock sync.RWMutex
|
|
)
|
|
|
|
func Init() {
|
|
ctx := context.Background()
|
|
list, err := ipblackmod.FindManyIPBlackModel(ctx, bson.M{})
|
|
if err != nil {
|
|
log.Error("ipBlackInit FindManyIPBlackModel error", log.E(err))
|
|
return
|
|
}
|
|
tempMaps := make(map[string]struct{})
|
|
for _, v := range list {
|
|
tempMaps[v.Ip] = struct{}{}
|
|
}
|
|
lock.Lock()
|
|
defer lock.Unlock()
|
|
ipBlackMap = tempMaps
|
|
}
|
|
|
|
func CheckIp(ip string) bool {
|
|
lock.RLock()
|
|
defer lock.RUnlock()
|
|
if _, ok := ipBlackMap[ip]; ok {
|
|
return true
|
|
}
|
|
return false
|
|
}
|
|
|
|
func GetIpBlackList(ctx context.Context, req *GetIPBlackListReq) (*GetIPBlackListResp, *srvdef.SrvErr) {
|
|
filter := bson.M{}
|
|
if req.IP != nil && len(*req.IP) > 0 {
|
|
filter[ipblackmod.FN.IPBlackModel.Ip] = req.IP
|
|
}
|
|
count, err := ipblackmod.CountIPBlackModel(ctx, filter)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if count == 0 {
|
|
return &GetIPBlackListResp{
|
|
Total: 0,
|
|
List: make([]*ipblackmod.IPBlackModel, 0),
|
|
}, nil
|
|
}
|
|
opts := options.FindOptions{}
|
|
opts.SetSort(bson.M{ipblackmod.FN.IPBlackModel.CreatedAt: -1})
|
|
opts.SetLimit(req.PageSize)
|
|
opts.SetSkip((req.PageNum - 1) * req.PageSize)
|
|
list, err := ipblackmod.FindManyIPBlackModel(ctx, filter, &opts)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
resp := &GetIPBlackListResp{
|
|
Total: count,
|
|
List: list,
|
|
}
|
|
return resp, nil
|
|
}
|
|
|
|
func AddIpBlack(ctx context.Context, req *AddIPBlackListReq) *srvdef.SrvErr {
|
|
err := ipblackmod.InsertOneIPBlackModel(ctx, &ipblackmod.IPBlackModel{
|
|
ID: primitive.NewObjectID(),
|
|
Ip: req.Ip,
|
|
Desc: req.Desc,
|
|
CreatedAt: time.Now(),
|
|
UpdatedAt: time.Now(),
|
|
})
|
|
if err == nil {
|
|
lock.Lock()
|
|
defer lock.Unlock()
|
|
ipBlackMap[req.Ip] = struct{}{}
|
|
}
|
|
return err
|
|
}
|
|
|
|
func DelIpBlack(ctx context.Context, req *DelIpBlackListReq) *srvdef.SrvErr {
|
|
_, err := ipblackmod.DelOneIPBlackModel(ctx, bson.M{
|
|
ipblackmod.FN.IPBlackModel.Ip: req.Ip,
|
|
})
|
|
if err != nil {
|
|
lock.Lock()
|
|
defer lock.Unlock()
|
|
delete(ipBlackMap, req.Ip)
|
|
ipBlackMap[req.Ip] = struct{}{}
|
|
}
|
|
return err
|
|
}
|