feat: add project acceptance collection service

This commit is contained in:
2026-08-19 15:28:14 +08:00
parent 175b38138e
commit 2da7f4f328
8 changed files with 1321 additions and 2 deletions

55
app.py
View File

@@ -13,6 +13,15 @@ from auth_service import (
)
from config import Config
from database import init_database
from acceptance_service import (
create_acceptance_task,
get_acceptance_resources,
get_acceptance_task,
list_acceptance_notes,
list_acceptance_tasks,
resume_acceptance_task,
resume_unfinished_acceptance_tasks,
)
from rule_service import (
delete_rule_document,
get_rule_document,
@@ -37,6 +46,18 @@ def create_app() -> Flask:
app = Flask(__name__)
init_database()
def local_dev_user():
if not Config.LOCAL_AUTH_BYPASS or request.remote_addr not in {"127.0.0.1", "::1"}:
return None
return {
"id": "local-dev",
"name": "本地开发用户",
"account": "local-dev",
"avatar": "",
"union_id": "",
"open_id": "",
}
@app.before_request
def assign_request_id():
g.request_id = request.headers.get("X-Request-Id") or f"req_{secrets.token_hex(10)}"
@@ -45,7 +66,7 @@ def create_app() -> Flask:
open_paths = ("/health", "/api/v1/auth/", "/api/v1/skill/")
if request.path == "/health" or any(request.path.startswith(path) for path in open_paths):
return None
user = get_user_by_session_token(request.cookies.get(Config.SESSION_COOKIE_NAME))
user = local_dev_user() or get_user_by_session_token(request.cookies.get(Config.SESSION_COOKIE_NAME))
if user is None and request.path.startswith("/api/"):
return jsonify({
"error": {"code": "UNAUTHORIZED", "message": "请先通过钉钉授权登录"},
@@ -190,7 +211,7 @@ def create_app() -> Flask:
@app.route("/api/v1/auth/me", methods=["GET"])
def auth_me():
user = get_user_by_session_token(request.cookies.get(Config.SESSION_COOKIE_NAME))
user = local_dev_user() or get_user_by_session_token(request.cookies.get(Config.SESSION_COOKIE_NAME))
if not user:
raise TaskError("UNAUTHORIZED", "请先通过钉钉授权登录", 401)
return jsonify({"data": {"user": user}, "request_id": g.request_id})
@@ -212,6 +233,35 @@ def create_app() -> Flask:
task = create_task(payload)
return jsonify({"data": task, "request_id": g.request_id}), 201
@app.route("/api/v1/acceptance-tasks", methods=["POST"])
def create_project_acceptance_task():
payload = request.get_json(silent=True) or {}
current_user = getattr(g, "current_user", None) or {}
payload["created_by_id"] = current_user.get("id") or payload.get("created_by_id")
payload["created_by_name"] = current_user.get("name") or payload.get("created_by_name")
task = create_acceptance_task(payload)
return jsonify({"data": task, "request_id": g.request_id}), 201
@app.route("/api/v1/acceptance-resources", methods=["GET"])
def query_project_acceptance_resources():
return jsonify({"data": get_acceptance_resources(), "request_id": g.request_id})
@app.route("/api/v1/acceptance-tasks", methods=["GET"])
def query_project_acceptance_tasks():
return jsonify({"data": list_acceptance_tasks(), "request_id": g.request_id})
@app.route("/api/v1/acceptance-tasks/<task_id>", methods=["GET"])
def get_project_acceptance_task(task_id: str):
return jsonify({"data": get_acceptance_task(task_id), "request_id": g.request_id})
@app.route("/api/v1/acceptance-tasks/<task_id>/notes", methods=["GET"])
def get_project_acceptance_notes(task_id: str):
return jsonify({"data": list_acceptance_notes(task_id), "request_id": g.request_id})
@app.route("/api/v1/acceptance-tasks/<task_id>/resume", methods=["POST"])
def resume_project_acceptance_task(task_id: str):
return jsonify({"data": resume_acceptance_task(task_id), "request_id": g.request_id})
@app.route("/api/v1/tasks", methods=["GET"])
def query_research_tasks():
result = list_tasks(
@@ -286,6 +336,7 @@ def create_app() -> Flask:
return jsonify({"data": delete_rule_document(), "request_id": g.request_id})
resume_unfinished_tasks()
resume_unfinished_acceptance_tasks()
return app