提交所有代码到 qiaoxinjiu 分支

This commit is contained in:
qiaoxinjiu
2026-05-11 14:29:16 +08:00
parent 01a4ac8ea1
commit 2fea5adb44
59 changed files with 4957 additions and 1603 deletions

View File

@@ -17,6 +17,7 @@ from .controller.rbacController import RbacController
from .controller.userController import UserController
from .controller.bugController import BugController, BugUploadController
from .controller.projectHookController import ProjectHookController
from .controller.automationController import AutomationController
api = Blueprint('api', __name__)
@@ -27,7 +28,7 @@ def api_before_request():
return None
token = request.headers.get('accessToken') or request.headers.get('accesstoken') or request.headers.get('Authorization')
if not token:
return ApiResponse.build_failure(40004, msg='未登录或缺少token')
return ApiResponse.build_failure(40001, msg='缺少token')
return None
@@ -728,6 +729,199 @@ def plan_progress():
return ApiResponse.build_success(20000, data=ret)
@api.route('/automation/case/run', methods=['POST'])
@login_required
@permission_required('automation:run')
def automation_case_run():
controller = AutomationController(request.get_json() or {})
try:
ret, err_msg = controller.case_run()
if err_msg:
return ApiResponse.build_failure(40009, msg=err_msg)
return ApiResponse.build_success(20000, data=ret)
finally:
controller.close_session()
@api.route('/automation/plan/run', methods=['POST'])
@login_required
@permission_required('automation:run')
def automation_plan_run():
controller = AutomationController(request.get_json() or {})
try:
ret, err_msg = controller.plan_run()
if err_msg:
return ApiResponse.build_failure(40009, msg=err_msg)
return ApiResponse.build_success(20000, data=ret)
finally:
controller.close_session()
@api.route('/automation/execution/list', methods=['GET'])
@login_required
@permission_required('automation:list')
def automation_execution_list():
controller = AutomationController(request.args)
try:
return ApiResponse.build_success(20000, data=controller.execution_list())
finally:
controller.close_session()
@api.route('/automation/execution/detail', methods=['GET'])
@login_required
@permission_required('automation:detail')
def automation_execution_detail():
controller = AutomationController(request.args)
try:
ret, err_msg = controller.execution_detail()
if err_msg:
return ApiResponse.build_failure(40011, msg=err_msg)
return ApiResponse.build_success(20000, data=ret)
finally:
controller.close_session()
@api.route('/automation/execution/case/list', methods=['GET'])
@login_required
@permission_required('automation:detail')
def automation_execution_case_list():
controller = AutomationController(request.args)
try:
ret, err_msg = controller.execution_case_list()
if err_msg:
return ApiResponse.build_failure(40011, msg=err_msg)
return ApiResponse.build_success(20000, data=ret)
finally:
controller.close_session()
@api.route('/automation/execution/poll', methods=['POST'])
@login_required
@permission_required('automation:detail')
def automation_execution_poll():
from ..api.service.jenkinsPollService import JenkinsPollService
from ..api.dao.automationDao import AutomationDao
req_data = request.get_json() or {}
execution_id = req_data.get('executionId') or req_data.get('execution_id')
from ..api.controller.baseCrudController import BaseCrudController
controller = BaseCrudController(req_data)
try:
if execution_id:
success, msg = JenkinsPollService.poll_jenkins_build_status(controller.session, execution_id)
if not success:
return ApiResponse.build_failure(40012, msg=msg)
execution = AutomationDao.get_execution_by_id(controller.session, execution_id)
return ApiResponse.build_success(20000, data=execution.to_dict() if execution else {'id': execution_id, 'message': msg})
else:
JenkinsPollService.poll_all_pending_executions(controller.session)
return ApiResponse.build_success(20000, data={'message': '轮询完成'})
finally:
controller.close_session()
@api.route('/automation/execution/case/pull', methods=['GET'])
def automation_execution_case_pull():
req_data = dict(request.args)
req_data['_callback_token'] = request.headers.get('X-CALLBACK-TOKEN', '')
controller = AutomationController(req_data)
try:
ret, err_msg = controller.execution_case_pull()
if err_msg:
return ApiResponse.build_failure(40011, msg=err_msg)
return ApiResponse.build_success(20000, data=ret)
finally:
controller.close_session()
@api.route('/automation/execution/queued', methods=['POST'])
def automation_execution_queued():
req_data = request.get_json() or {}
req_data['_callback_secret'] = request.headers.get('X-CALLBACK-SECRET', '')
controller = AutomationController(req_data)
try:
ok, err_msg = controller.validate_callback_secret()
if not ok:
return ApiResponse.build_failure(40004, msg=err_msg)
update_id, err_msg = controller.execution_queued()
if err_msg:
return ApiResponse.build_failure(40012, msg=err_msg)
return ApiResponse.build_success(20000, data={'id': update_id})
finally:
controller.close_session()
@api.route('/automation/execution/start', methods=['POST'])
def automation_execution_start():
req_data = request.get_json() or {}
req_data['_callback_secret'] = request.headers.get('X-CALLBACK-SECRET', '')
controller = AutomationController(req_data)
try:
ok, err_msg = controller.validate_callback_secret()
if not ok:
return ApiResponse.build_failure(40004, msg=err_msg)
update_id, err_msg = controller.execution_start()
if err_msg:
return ApiResponse.build_failure(40012, msg=err_msg)
return ApiResponse.build_success(20000, data={'id': update_id})
finally:
controller.close_session()
@api.route('/automation/execution/case/result', methods=['POST'])
def automation_execution_case_result():
req_data = request.get_json() or {}
req_data['_callback_secret'] = request.headers.get('X-CALLBACK-SECRET', '')
controller = AutomationController(req_data)
try:
ok, err_msg = controller.validate_callback_secret()
if not ok:
return ApiResponse.build_failure(40004, msg=err_msg)
update_id, err_msg = controller.execution_case_result()
if err_msg:
return ApiResponse.build_failure(40012, msg=err_msg)
return ApiResponse.build_success(20000, data={'id': update_id})
finally:
controller.close_session()
@api.route('/automation/execution/finish', methods=['POST'])
def automation_execution_finish():
req_data = request.get_json() or {}
req_data['_callback_secret'] = request.headers.get('X-CALLBACK-SECRET', '')
controller = AutomationController(req_data)
try:
ok, err_msg = controller.validate_callback_secret()
if not ok:
return ApiResponse.build_failure(40004, msg=err_msg)
update_id, err_msg = controller.execution_finish()
if err_msg:
return ApiResponse.build_failure(40012, msg=err_msg)
return ApiResponse.build_success(20000, data={'id': update_id})
finally:
controller.close_session()
@api.route('/automation/execution/abort', methods=['POST'])
def automation_execution_abort():
req_data = request.get_json() or {}
req_data['_callback_secret'] = request.headers.get('X-CALLBACK-SECRET', '')
controller = AutomationController(req_data)
try:
ok, err_msg = controller.validate_callback_secret()
if not ok:
return ApiResponse.build_failure(40004, msg=err_msg)
update_id, err_msg = controller.execution_abort()
if err_msg:
return ApiResponse.build_failure(40012, msg=err_msg)
return ApiResponse.build_success(20000, data={'id': update_id})
finally:
controller.close_session()
# =========================
# 报告接口
# =========================
@@ -1250,6 +1444,43 @@ def auth_login():
controller.close_session()
@api.route('/auth/refresh', methods=['POST'])
def auth_refresh():
from .utils.authMiddleware import validate_refresh_token, create_token, create_refresh_token, revoke_refresh_token, get_current_user_id
req_json = request.get_json() or {}
refresh_token = req_json.get('refreshToken') or req_json.get('refresh_token')
access_token = req_json.get('accessToken') or req_json.get('access_token')
if refresh_token:
user_id = validate_refresh_token(refresh_token)
if user_id:
revoke_refresh_token(refresh_token)
new_token, expire_seconds = create_token(user_id)
new_refresh_token, refresh_expire_seconds = create_refresh_token(user_id)
return ApiResponse.build_success(20000, data={
'token': new_token,
'token_type': 'Bearer',
'expires_in': expire_seconds,
'refresh_token': new_refresh_token,
'refresh_expires_in': refresh_expire_seconds
})
return ApiResponse.build_failure(40001, msg='refresh_token无效或已过期')
elif access_token:
user_id = get_current_user_id(access_token)
if user_id:
new_token, expire_seconds = create_token(user_id)
return ApiResponse.build_success(20000, data={
'token': new_token,
'token_type': 'Bearer',
'expires_in': expire_seconds
})
return ApiResponse.build_failure(451, msg='access_token无效或已过期')
return ApiResponse.build_failure(40003, msg='请提供refresh_token或access_token')
@api.route('/bug/list', methods=['GET'])
@login_required
@permission_required('bug:list')