Lock submitted simulation answers

This commit is contained in:
hz
2026-07-30 16:54:12 -05:00
parent 9709bab9a9
commit 5488dec2c7
8 changed files with 142 additions and 10 deletions
+27 -2
View File
@@ -24,6 +24,7 @@ var pending_action := ""
var request_queue: Array = []
var request_access_token := ""
var last_failed_action := ""
var submit_recovery_attempts := 0
func _ready() -> void:
@@ -69,7 +70,7 @@ func start_next_block() -> void:
_send("start", HTTPClient.METHOD_POST, "/%s/blocks/start" % str(simulation.get("id", "")))
func save_response(question_id: String, choice_id: String, eliminated: Array, flagged: bool, elapsed_seconds: int) -> void:
func save_response(question_id: String, choice_id: String, eliminated: Array, flagged: bool, elapsed_seconds: int, is_submitted := false) -> void:
if simulation.is_empty():
return
_send("save", HTTPClient.METHOD_PUT, "/%s/responses" % str(simulation.get("id", "")), {
@@ -77,13 +78,15 @@ func save_response(question_id: String, choice_id: String, eliminated: Array, fl
"choiceId": choice_id,
"eliminatedChoiceIds": eliminated,
"flagged": flagged,
"elapsedSeconds": elapsed_seconds
"elapsedSeconds": elapsed_seconds,
"isSubmitted": is_submitted
})
func submit_block() -> void:
if simulation.is_empty():
return
submit_recovery_attempts = 0
_send("submit", HTTPClient.METHOD_POST, "/%s/blocks/submit" % str(simulation.get("id", "")))
@@ -156,6 +159,13 @@ func _on_request_completed(result: int, response_code: int, _headers: PackedStri
if result != HTTPRequest.RESULT_SUCCESS or response_code < 200 or response_code >= 300:
if _is_stale_submit_failure(action):
return
if _should_reconcile_submit_failure(action, response_code):
submit_recovery_attempts += 1
_send(
"submit_reconcile",
HTTPClient.METHOD_GET,
"/%s" % str(simulation.get("id", "")).uri_encode())
return
var server_message := body.get_string_from_utf8().strip_edges()
var error_parsed: Variant = JSON.parse_string(server_message)
if typeof(error_parsed) == TYPE_DICTIONARY:
@@ -205,12 +215,27 @@ func _on_request_completed(result: int, response_code: int, _headers: PackedStri
return
simulation = _normalize_simulation(parsed)
state_changed.emit()
if action == "submit":
submit_recovery_attempts = 0
elif action == "submit_reconcile":
if str(simulation.get("state", "")) == "block_active":
_send("submit", HTTPClient.METHOD_POST, "/%s/blocks/submit" % str(simulation.get("id", "")))
else:
submit_recovery_attempts = 0
func _is_stale_submit_failure(action: String) -> bool:
return action == "submit" and str(simulation.get("state", "")) in ["between_blocks", "completed"]
func _should_reconcile_submit_failure(action: String, response_code: int) -> bool:
return (
action == "submit" and
response_code == 409 and
submit_recovery_attempts == 0 and
str(simulation.get("state", "")) == "block_active")
func _process_request_queue() -> void:
if is_loading or request_queue.is_empty():
return