#!/usr/bin/env python3 # -*- coding: utf-8 -*- """用户同步接口 - POST方式同步单个或批量用户到dapi模块并返回apikey""" from datetime import datetime # 获取参数 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() # 检查dapi模块是否提供了create_user_apikey函数 create_apikey_func = create_user_apikey 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) # 确保机构存在 org = await sor.R('organization', {'id': user_orgid}) if not org: await sor.C('organization', {'id': user_orgid, 'orgname': user_data.get('name', user_data.get('username', user_id))}) await sor.C('orgtypes', {'id': getID(), 'orgid': user_orgid, 'orgtypeid': 'customer'}) # 确保用户存在 usr = await sor.R('users', {'id': user_id}) if not usr: await sor.C('users', { '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(user_data.get('password', '111111')) }) # 创建apikey if create_apikey_func: result = await create_apikey_func( 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) # 手动创建apikey existing = await sor.R('downapikey', {'dappid': dappid, 'duserid': user_id, 'dorgid': user_orgid}) if existing: f = get_serverenv('password_decode') apikey = f(existing[0].apikey) return json.dumps({'status': 'success', 'data': [{'user_id': user_id, 'apikey': apikey, 'status': 'existing'}]}, ensure_ascii=False) apikey_id = getID() apikey_value = getID() ns = { 'id': apikey_id, '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) 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': 'user.id和user.orgid必填'}) continue # 确保机构存在 org = await sor.R('organization', {'id': user_orgid}) if not org: await sor.C('organization', {'id': user_orgid, 'orgname': user_data.get('name', user_data.get('username', user_id))}) await sor.C('orgtypes', {'id': getID(), 'orgid': user_orgid, 'orgtypeid': 'customer'}) # 确保用户存在 usr = await sor.R('users', {'id': user_id}) if not usr: await sor.C('users', { '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(user_data.get('password', '111111')) }) # 创建apikey if create_apikey_func: result = await create_apikey_func( 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, 'username': user_data.get('username', ''), 'apikey': result.get('apikey', ''), 'status': result.get('message', 'created'), 'result_status': result.get('status') }) else: existing = await sor.R('downapikey', {'dappid': dappid, 'duserid': user_id, 'dorgid': user_orgid}) if existing: f = get_serverenv('password_decode') apikey = f(existing[0].apikey) result_data.append({'user_id': user_id, 'apikey': apikey, 'status': 'existing'}) else: apikey_id = getID() apikey_value = getID() ns = { 'id': apikey_id, '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) result_data.append({'user_id': user_id, 'apikey': apikey_value, 'status': 'created'}) return json.dumps({'status': 'success', 'data': result_data, 'total': len(result_data)}, ensure_ascii=False) else: return json.dumps({'status': 'error', 'message': 'action参数必须是single或batch'}, ensure_ascii=False)