rbac/wwwroot/usersync/index.dspy

125 lines
4.9 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""用户同步接口 - 检查用户是否存在,不存在则参照 register.dspy 逻辑创建用户和机构"""
from datetime import datetime
from appPublic.dictObject import DictObject
action = params_kw.get('action', 'batch')
dappid = params_kw.get('dappid', '')
if not dappid:
return json.dumps({'status': 'error', 'message': 'dappid参数必填'}, ensure_ascii=False)
dbname = get_module_dbname('dapi')
db = DBPools()
async with db.sqlorContext(dbname) as sor:
if action == 'single':
user_data = params_kw.get('user', {})
user_id = user_data.get('id', '')
user_orgid = user_data.get('orgid', '')
if not user_id or not user_orgid:
return json.dumps({'status': 'error', 'message': 'user.id和user.orgid必填'}, ensure_ascii=False)
# 1. 检查用户是否存在
users = await sor.R('users', {'id': user_id})
if not users:
# 用户不存在,执行注册逻辑
# 确保机构存在
orgs = await sor.R('organization', {'id': user_orgid})
if not orgs:
org_name = user_data.get('name', user_data.get('username', user_id))
await create_org(sor, DictObject(id=user_orgid, orgname=org_name))
debug(f"Created org: {user_orgid}")
# 创建用户
pwd = user_data.get('password', '111111')
ns = DictObject(
id=user_id,
orgid=user_orgid,
username=user_data.get('username', user_id),
name=user_data.get('name', ''),
email=user_data.get('email', ''),
password=password_encode(pwd),
created_at=timestampstr(),
login_fail_count=0
)
await create_user(sor, ns)
debug(f"Created user: {user_id}")
# 2. 处理 Apikey
if create_user_apikey:
result = await create_user_apikey(sor, dappid, user_id, user_orgid, **{k: v for k, v in user_data.items() if k not in ['id', 'orgid']})
return json.dumps(result, ensure_ascii=False)
existing_key = await sor.R('downapikey', {'dappid': dappid, 'duserid': user_id, 'dorgid': user_orgid})
if existing_key:
f = get_serverenv('password_decode')
apikey = f(existing_key[0].apikey)
return json.dumps({'status': 'success', 'data': [{'user_id': user_id, 'apikey': apikey, 'status': 'existing'}]}, ensure_ascii=False)
apikey_value = getID()
ns_key = {
'id': getID(), 'dappid': dappid, 'dorgid': user_orgid, 'duserid': user_id,
'orgid': user_orgid, 'userid': user_id, 'apikey': password_encode(apikey_value),
'enabled': '1', 'created_at': datetime.now().strftime('%Y-%m-%d'), 'expired_date': '9999-12-31'
}
await sor.C('downapikey', ns_key)
return json.dumps({'status': 'success', 'data': [{'user_id': user_id, 'apikey': apikey_value, 'status': 'created'}]}, ensure_ascii=False)
elif action == 'batch':
users_list = params_kw.get('users', [])
if not users_list:
return json.dumps({'status': 'error', 'message': 'users必填'}, ensure_ascii=False)
result_data = []
for user_data in users_list:
user_id = user_data.get('id', '')
user_orgid = user_data.get('orgid', '')
if not user_id or not user_orgid:
result_data.append({'user_id': user_id, 'status': 'error', 'message': 'id/orgid必填'})
continue
# 1. 检查/创建用户
users = await sor.R('users', {'id': user_id})
if not users:
orgs = await sor.R('organization', {'id': user_orgid})
if not orgs:
org_name = user_data.get('name', user_data.get('username', user_id))
await create_org(sor, DictObject(id=user_orgid, orgname=org_name))
pwd = user_data.get('password', '111111')
ns = DictObject(
id=user_id, orgid=user_orgid,
username=user_data.get('username', user_id),
name=user_data.get('name', ''), email=user_data.get('email', ''),
password=password_encode(pwd), created_at=timestampstr(), login_fail_count=0
)
await create_user(sor, ns)
debug(f"Batch created user: {user_id}")
# 2. 处理 Apikey
if create_user_apikey:
result = await create_user_apikey(sor, dappid, user_id, user_orgid, **{k: v for k, v in user_data.items() if k not in ['id', 'orgid']})
result_data.append({'user_id': user_id, 'apikey': result.get('apikey', ''), 'status': result.get('status')})
else:
existing_key = await sor.R('downapikey', {'dappid': dappid, 'duserid': user_id, 'dorgid': user_orgid})
if existing_key:
f = get_serverenv('password_decode')
apikey = f(existing_key[0].apikey)
result_data.append({'user_id': user_id, 'apikey': apikey, 'status': 'existing'})
else:
apikey_value = getID()
ns_key = {
'id': getID(), 'dappid': dappid, 'dorgid': user_orgid, 'duserid': user_id,
'orgid': user_orgid, 'userid': user_id, 'apikey': password_encode(apikey_value),
'enabled': '1', 'created_at': datetime.now().strftime('%Y-%m-%d'), 'expired_date': '9999-12-31'
}
await sor.C('downapikey', ns_key)
result_data.append({'user_id': user_id, 'apikey': apikey_value, 'status': 'created'})
return json.dumps({'status': 'success', 'data': result_data}, ensure_ascii=False)