fix: add openCustomerAccounts call and fix sync message in usersync

This commit is contained in:
yumoqing 2026-05-12 18:54:15 +08:00
parent 59c321d941
commit d57d165a08

View File

@ -1,6 +1,6 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
"""用户同步接口 - 检查用户是否存在,不存在则参照 register.dspy 逻辑创建用户和机构""" """用户同步接口 - 检查用户/机构是否存在,不存在则注册并开帐,然后创建/获取apikey"""
from datetime import datetime from datetime import datetime
from appPublic.dictObject import DictObject from appPublic.dictObject import DictObject
@ -22,19 +22,20 @@ async with db.sqlorContext(dbname) as sor:
if not user_id or not user_orgid: if not user_id or not user_orgid:
return json.dumps({'status': 'error', 'message': 'user.id和user.orgid必填'}, ensure_ascii=False) return json.dumps({'status': 'error', 'message': 'user.id和user.orgid必填'}, ensure_ascii=False)
# 1. 检查用户是否存在 # 1. 检查用户
users = await sor.R('users', {'id': user_id}) users = await sor.R('users', {'id': user_id})
if not users: if not users:
# 用户不存在,执行注册逻辑 debug(f"User {user_id} not found, registering...")
# 确保机构存在
# 1.1 确保机构存在
orgs = await sor.R('organization', {'id': user_orgid}) orgs = await sor.R('organization', {'id': user_orgid})
if not orgs: if not orgs:
org_name = user_data.get('name', user_data.get('username', user_id)) org_name = user_data.get('name', user_data.get('username', user_id))
await create_org(sor, DictObject(id=user_orgid, orgname=org_name)) await create_org(sor, DictObject(id=user_orgid, orgname=org_name))
debug(f"Created org: {user_orgid}") debug(f"Created org: {user_orgid}")
# 创建用户 # 1.2 创建用户
pwd = user_data.get('password', '111111') pwd = user_data.get('password', '111111')
ns = DictObject( ns = DictObject(
id=user_id, id=user_id,
@ -48,27 +49,40 @@ async with db.sqlorContext(dbname) as sor:
) )
await create_user(sor, ns) await create_user(sor, ns)
debug(f"Created user: {user_id}") debug(f"Created user: {user_id}")
# 1.3 开帐
try:
await openCustomerAccounts(sor, '0', user_orgid)
debug(f"Opened accounts for {user_orgid}")
except Exception as e:
exception(f"Failed to open accounts: {e}")
# 2. 处理 Apikey # 2. 处理 Apikey
if create_user_apikey: existing = await sor.R('downapikey', {'dappid': dappid, 'duserid': user_id, 'dorgid': user_orgid})
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:
if existing_key: apikey = password_decode(existing[0].apikey)
f = get_serverenv('password_decode') msg = '用户已同步获取现有apikey'
apikey = f(existing_key[0].apikey) else:
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)
apikey = apikey_value
msg = '用户同步成功apikey已创建'
apikey_value = getID() return json.dumps({
ns_key = { 'status': 'success',
'id': getID(), 'dappid': dappid, 'dorgid': user_orgid, 'duserid': user_id, 'data': [{
'orgid': user_orgid, 'userid': user_id, 'apikey': password_encode(apikey_value), 'user_id': user_id,
'enabled': '1', 'created_at': datetime.now().strftime('%Y-%m-%d'), 'expired_date': '9999-12-31' 'apikey': apikey,
} 'status': msg
await sor.C('downapikey', ns_key) }]
return json.dumps({'status': 'success', 'data': [{'user_id': user_id, 'apikey': apikey_value, 'status': 'created'}]}, ensure_ascii=False) }, ensure_ascii=False)
elif action == 'batch': elif action == 'batch':
users_list = params_kw.get('users', []) users_list = params_kw.get('users', [])
if not users_list: if not users_list:
@ -99,26 +113,33 @@ async with db.sqlorContext(dbname) as sor:
password=password_encode(pwd), created_at=timestampstr(), login_fail_count=0 password=password_encode(pwd), created_at=timestampstr(), login_fail_count=0
) )
await create_user(sor, ns) await create_user(sor, ns)
debug(f"Batch created user: {user_id}")
# 开帐
try:
await openCustomerAccounts(sor, '0', user_orgid)
except Exception as e:
exception(f"Failed to open accounts: {e}")
# 2. 处理 Apikey # 2. 处理 Apikey
if create_user_apikey: existing = await sor.R('downapikey', {'dappid': dappid, 'duserid': user_id, 'dorgid': user_orgid})
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']}) if existing:
result_data.append({'user_id': user_id, 'apikey': result.get('apikey', ''), 'status': result.get('status')}) apikey = password_decode(existing[0].apikey)
status_msg = '用户已同步'
else: else:
existing_key = await sor.R('downapikey', {'dappid': dappid, 'duserid': user_id, 'dorgid': user_orgid}) apikey_value = getID()
if existing_key: ns_key = {
f = get_serverenv('password_decode') 'id': getID(), 'dappid': dappid, 'dorgid': user_orgid, 'duserid': user_id,
apikey = f(existing_key[0].apikey) 'orgid': user_orgid, 'userid': user_id, 'apikey': password_encode(apikey_value),
result_data.append({'user_id': user_id, 'apikey': apikey, 'status': 'existing'}) 'enabled': '1', 'created_at': datetime.now().strftime('%Y-%m-%d'), 'expired_date': '9999-12-31'
else: }
apikey_value = getID() await sor.C('downapikey', ns_key)
ns_key = { apikey = apikey_value
'id': getID(), 'dappid': dappid, 'dorgid': user_orgid, 'duserid': user_id, status_msg = '同步成功'
'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' result_data.append({
} 'user_id': user_id,
await sor.C('downapikey', ns_key) 'apikey': apikey,
result_data.append({'user_id': user_id, 'apikey': apikey_value, 'status': 'created'}) 'status': status_msg
})
return json.dumps({'status': 'success', 'data': result_data}, ensure_ascii=False) return json.dumps({'status': 'success', 'data': result_data}, ensure_ascii=False)