to_ck/v2/handler_user.py
2021-05-08 18:24:31 +08:00

144 lines
3.9 KiB
Python

from collections import namedtuple
__all__ = 'HandlerUser', 'UserAct'
UserAct = namedtuple('User', ['obj', 'msg'])
class HandlerUser:
tb = 'user'
user_key = '#account_id'
def __init__(self, db_client, db_name):
self.users = dict()
self.db_client = db_client
self.receive_data = []
self.db_name = db_name
def execute(self):
account_ids = set(item.msg.get('#account_id') for item in self.receive_data) - set(self.users)
if not account_ids:
return
self.get_users(account_ids)
for item in self.receive_data:
item.obj(item.msg)
self.receive_data.clear()
def get_users(self, account_ids: set):
where = f'`#account_id` in {tuple(account_ids)}'
res = self.db_client.get_all(self.db_name, 'user_view', where)
if res is None:
print('ck查询出错了')
return
for item in res.values():
self.users[item['#account_id']] = item
def get_user(self, account_id, data=None):
user = self.users.get(account_id)
if user:
return user
# user = self.db_client.get_one(self.db_name, f'{self.tb}_view', **{'#account_id': account_id})
# if user:
# self.users[account_id] = user
# return user
if not isinstance(data, dict):
return
user = dict()
data['#reg_time'] = data['#time']
self.merge(user, data)
self.users[account_id] = user
return user
def merge(self, a: dict, b: dict):
"""
将b 合并到 a
:param a:
:param b:
:return:
"""
for k, v in b.items():
if isinstance(v, dict):
self.merge(a, v)
else:
a[k] = v
def merge_once(self, a: dict, b: dict):
"""
a 存在的字段不接受b的合并
:param a:
:param b:
:return:
"""
for k, v in b.items():
if isinstance(v, dict):
self.merge_once(a, v)
else:
a[k] = v if a.get(k) is None else a[k]
def merge_add(self, a: dict, b: dict):
"""
b 的properties 属性累加到a
:param a:
:param b:
:return:
"""
if 'properties' not in b or not isinstance(b['properties'], dict):
return
for k, v in b['properties'].items():
if not isinstance(v, int):
raise ValueError('需要提供数值类型累加')
a[k] = a.setdefault(k, 0) + v
def merge_unset(self, a: dict, b: dict):
"""
清除 a 中 b的properties
:param db:
:param data:
:return:
"""
if 'properties' not in b or not isinstance(b['properties'], list):
return
for k in b['properties']:
if k in a:
del a[k]
def user_set(self, data: dict):
"""
注意
data 结构包含 properties
user 为一层 k v
将data 合并到 user
:param db:
:param data:
:return:
"""
account_id = data[self.user_key]
user = self.get_user(account_id, data)
self.merge(user, data)
def user_setOnce(self, data: dict):
account_id = data[self.user_key]
user = self.get_user(account_id, data)
self.merge_once(user, data)
def user_add(self, data: dict):
account_id = data[self.user_key]
user = self.get_user(account_id, data)
self.merge_add(user, data)
def user_unset(self, data: dict):
account_id = data[self.user_key]
user = self.get_user(account_id)
self.merge_unset(user, data)
def user_append(self, data: dict):
pass
def user_del(self, data: dict):
pass
@property
def buffer_pool(self):
return self.tb, self.users