# --- Step 6: Assign System Roles via API (The Definitive Fix) ---
echo"🛡️ Step 6: Assigning System Roles to Automation User..."
# We use the main site admin's token for this one-time setup task, as it's guaranteed to have permissions.
ADMIN_SETUP_TOKEN_RESPONSE=$(curl --fail-sS-L-X POST "$MOODLE_URL/login/token.php"--data-urlencode"username=$MOODLE_ADMIN_USER"--data-urlencode"password=$MOODLE_ADMIN_PASS"--data-urlencode"service=moodle_mobile_app")
AUTOMATION_USER_ID=$(docker exec"$DB_CONTAINER_NAME" mysql -u root -p"$DB_ROOT_PASSWORD""$DB_NAME"-se"SELECT id FROM mdl_user WHERE username='$AUTOMATION_USER_NAME';")
MANAGER_ROLE_ID=$(docker exec"$DB_CONTAINER_NAME" mysql -u root -p"$DB_ROOT_PASSWORD""$DB_NAME"-se"SELECT id FROM mdl_role WHERE shortname='manager';")
COURSE_CREATOR_ROLE_ID=$(docker exec"$DB_CONTAINER_NAME" mysql -u root -p"$DB_ROOT_PASSWORD""$DB_NAME"-se"SELECT id FROM mdl_role WHERE shortname='coursecreator';")
SYSTEM_CONTEXT_ID=10 # The ID for the System context is always 1
# Assign Manager and Course Creator roles to the automation user
curl --fail-sS-L-X POST "$MOODLE_URL/webservice/rest/server.php"\
echo"❌ Failed to parse a valid Course ID from the API response."
echo"Full API Response:"
echo"$COURSE_RESPONSE" | jq .
exit 1
fi
echo"✅ Successfully created course '$COURSE_SHORTNAME' with ID: $NEW_COURSE_ID"
# --- END OF ROBUST ERROR CHECK ---
# --- Step 5: Enroll Admin User into the New Course ---
echo"🧑🏫 Step 5: Enrolling you as a teacher in the new course..."
# First, get the User ID for your admin user
AUTOMATION_USER_ID=$(docker exec"$DB_CONTAINER_NAME" mysql -u root -p"$DB_ROOT_PASSWORD""$DB_NAME"-se"SELECT id FROM mdl_user WHERE username='$AUTOMATION_USER_NAME';")
# The roleid for a Teacher is typically 3 (editingteacher) or 4 (teacher). We'll use 3.
TEACHER_ROLE_ID=3
# Add the enrol_manual_enrol_users function to our service
docker exec-i"$DB_CONTAINER_NAME" mysql -u root -p"$DB_ROOT_PASSWORD""$DB_NAME"-e"INSERT IGNORE INTO mdl_external_services_functions (externalserviceid, functionname) VALUES ((SELECT id FROM mdl_external_services WHERE shortname = '$CUSTOM_SERVICE_NAME'), 'enrol_manual_enrol_users');"
STUDENT_USER_ID=$(docker exec"$DB_CONTAINER_NAME" mysql -u root -p"$DB_ROOT_PASSWORD""$DB_NAME"-se"SELECT id FROM mdl_user WHERE username='$STUDENT_USER_NAME';")
# Role 5 is the standard 'Student' role
STUDENT_ROLE_ID=5
STUDENT_ENROL_RESPONSE=$(curl --fail-sS-L-X POST "$MOODLE_URL/webservice/rest/server.php"\
if[-z"$STUDENT_TOKEN"]||["$STUDENT_TOKEN"=="null"];then echo"❌ Failed to get API token for student. Response: $STUDENT_TOKEN_RESPONSE"&&exit 1;fi
echo" -> Successfully obtained token for student. $STUDENT_TOKEN"
echo" -> Uploading student submission file..."
STUDENT_FILE_UPLOAD_RESPONSE=$(curl --fail-sS-L-X POST "$MOODLE_URL/webservice/upload.php"-F"token=$STUDENT_TOKEN"-F"filearea=draft"-F"itemid=0"-F"file=@$DTA_STUDENT_SUBMISSION_FILE")
STUDENT_FILE_ITEMID=$(echo"$STUDENT_FILE_UPLOAD_RESPONSE" | jq -r'if type=="array" then .[0].itemid else .itemid end')
if echo"$SAVE_RESPONSE" | jq -e'if type=="object" and .exception then true else false end'> /dev/null;then
echo"❌ Moodle API returned an exception during submission save:"
echo"$SAVE_RESPONSE" | jq .
exit 1
fi
echo"✅ Submission successfully sent to Moodle, which has triggered the backend grading."
# --- Step 7: Verify Grade and Feedback in Moodle Database ---
echo"🧐 Step 7: Verifying grade and feedback has been posted back to Moodle..."
echo" -> Waiting 20 seconds for DTA backend to make the callback..."
sleep 20
SUBMISSION_ID=$(docker exec"$DB_CONTAINER_NAME" mysql -u root -p"$DB_ROOT_PASSWORD""$DB_NAME"-se"SELECT id FROM mdl_assign_submission WHERE assignment = '$NEW_ASSIGNMENT_ID' AND userid = '$STUDENT_USER_ID';")
SUMMARY_COUNT=$(docker exec"$DB_CONTAINER_NAME" mysql -u root -p"$DB_ROOT_PASSWORD""$DB_NAME"-se"SELECT COUNT(*) FROM mdl_assignsubmission_dta_summary WHERE submission_id = '$SUBMISSION_ID';")
if["$SUMMARY_COUNT"-eq 0 ];then
echo"❌ ERROR: No feedback summary found in the database for submission ID $SUBMISSION_ID."
echo"The backend callback likely failed. Check the backend logs:"
docker logs backend
exit 1
fi
echo"--- FINAL MOODLE DATABASE STATUS ---"
echo"✅ Found DTA summary record in the database."
echo"Detailed Test Results from mdl_assignsubmission_dta_result:"
docker exec"$DB_CONTAINER_NAME" mysql -u root -p"$DB_ROOT_PASSWORD""$DB_NAME"-e"SELECT name, state, failure_type, failure_reason FROM mdl_assignsubmission_dta_result WHERE submission_id = '$SUBMISSION_ID';"
STATUS_RESPONSE=$(curl --fail-sS-L-X POST "$MOODLE_URL/webservice/rest/server.php"\
echo"🎉 SUCCESS! The submission is marked as 'graded' in the Moodle GUI."
else
echo"⚠️ WARNING: The submission status is '$GRADE_STATUS', not 'graded'. The backend wrote to its custom tables but may have failed to update the core gradebook."
exit 1
fi
echo"🎉🎉 Moodle automation complete. The environment is fully configured. 🎉🎉"
# --- Step 6: Assign System Roles via API (The Definitive Fix) ---
echo"🛡️ Step 6: Assigning System Roles to Automation User..."
# We use the main site admin's token for this one-time setup task, as it's guaranteed to have permissions.
ADMIN_SETUP_TOKEN_RESPONSE=$(curl --fail-sS-L-X POST "$MOODLE_URL/login/token.php"--data-urlencode"username=$MOODLE_ADMIN_USER"--data-urlencode"password=$MOODLE_ADMIN_PASS"--data-urlencode"service=moodle_mobile_app")
AUTOMATION_USER_ID=$(docker exec"$DB_CONTAINER_NAME" mysql -u root -p"$DB_ROOT_PASSWORD""$DB_NAME"-se"SELECT id FROM mdl_user WHERE username='$AUTOMATION_USER_NAME';")
MANAGER_ROLE_ID=$(docker exec"$DB_CONTAINER_NAME" mysql -u root -p"$DB_ROOT_PASSWORD""$DB_NAME"-se"SELECT id FROM mdl_role WHERE shortname='manager';")
COURSE_CREATOR_ROLE_ID=$(docker exec"$DB_CONTAINER_NAME" mysql -u root -p"$DB_ROOT_PASSWORD""$DB_NAME"-se"SELECT id FROM mdl_role WHERE shortname='coursecreator';")
SYSTEM_CONTEXT_ID=10 # The ID for the System context is always 1
# Assign Manager and Course Creator roles to the automation user
curl --fail-sS-L-X POST "$MOODLE_URL/webservice/rest/server.php"\
echo"❌ Failed to parse a valid Course ID from the API response."
echo"Full API Response:"
echo"$COURSE_RESPONSE" | jq .
exit 1
fi
echo"✅ Successfully created course '$COURSE_SHORTNAME' with ID: $NEW_COURSE_ID"
# --- END OF ROBUST ERROR CHECK ---
# --- Step 5: Enroll Admin User into the New Course ---
echo"🧑🏫 Step 5: Enrolling you as a teacher in the new course..."
# First, get the User ID for your admin user
AUTOMATION_USER_ID=$(docker exec"$DB_CONTAINER_NAME" mysql -u root -p"$DB_ROOT_PASSWORD""$DB_NAME"-se"SELECT id FROM mdl_user WHERE username='$AUTOMATION_USER_NAME';")
# The roleid for a Teacher is typically 3 (editingteacher) or 4 (teacher). We'll use 3.
TEACHER_ROLE_ID=3
# Add the enrol_manual_enrol_users function to our service
docker exec-i"$DB_CONTAINER_NAME" mysql -u root -p"$DB_ROOT_PASSWORD""$DB_NAME"-e"INSERT IGNORE INTO mdl_external_services_functions (externalserviceid, functionname) VALUES ((SELECT id FROM mdl_external_services WHERE shortname = '$CUSTOM_SERVICE_NAME'), 'enrol_manual_enrol_users');"
STUDENT_USER_ID=$(docker exec"$DB_CONTAINER_NAME" mysql -u root -p"$DB_ROOT_PASSWORD""$DB_NAME"-se"SELECT id FROM mdl_user WHERE username='$STUDENT_USER_NAME';")
# Role 5 is the standard 'Student' role
STUDENT_ROLE_ID=5
STUDENT_ENROL_RESPONSE=$(curl --fail-sS-L-X POST "$MOODLE_URL/webservice/rest/server.php"\
if[-z"$STUDENT_TOKEN"]||["$STUDENT_TOKEN"=="null"];then echo"❌ Failed to get API token for student. Response: $STUDENT_TOKEN_RESPONSE"&&exit 1;fi
echo" -> Successfully obtained token for student. $STUDENT_TOKEN"
echo" -> Uploading student submission file..."
STUDENT_FILE_UPLOAD_RESPONSE=$(curl --fail-sS-L-X POST "$MOODLE_URL/webservice/upload.php"-F"token=$STUDENT_TOKEN"-F"filearea=draft"-F"itemid=0"-F"file=@$DTA_STUDENT_SUBMISSION_FILE")
STUDENT_FILE_ITEMID=$(echo"$STUDENT_FILE_UPLOAD_RESPONSE" | jq -r'if type=="array" then .[0].itemid else .itemid end')
if echo"$SAVE_RESPONSE" | jq -e'if type=="object" and .exception then true else false end'> /dev/null;then
echo"❌ Moodle API returned an exception during submission save:"
echo"$SAVE_RESPONSE" | jq .
exit 1
fi
echo"✅ Submission successfully sent to Moodle, which has triggered the backend grading."
# --- Step 7: Verify Grade and Feedback in Moodle Database ---
echo"🧐 Step 7: Verifying grade and feedback has been posted back to Moodle..."
echo" -> Waiting 20 seconds for DTA backend to make the callback..."
sleep 20
SUBMISSION_ID=$(docker exec"$DB_CONTAINER_NAME" mysql -u root -p"$DB_ROOT_PASSWORD""$DB_NAME"-se"SELECT id FROM mdl_assign_submission WHERE assignment = '$NEW_ASSIGNMENT_ID' AND userid = '$STUDENT_USER_ID';")
SUMMARY_COUNT=$(docker exec"$DB_CONTAINER_NAME" mysql -u root -p"$DB_ROOT_PASSWORD""$DB_NAME"-se"SELECT COUNT(*) FROM mdl_assignsubmission_dta_summary WHERE submission_id = '$SUBMISSION_ID';")
if["$SUMMARY_COUNT"-eq 0 ];then
echo"❌ ERROR: No feedback summary found in the database for submission ID $SUBMISSION_ID."
echo"The backend callback likely failed. Check the backend logs:"
docker logs backend
exit 1
fi
echo"--- FINAL MOODLE DATABASE STATUS ---"
echo"✅ Found DTA summary record in the database."
echo"Detailed Test Results from mdl_assignsubmission_dta_result:"
docker exec"$DB_CONTAINER_NAME" mysql -u root -p"$DB_ROOT_PASSWORD""$DB_NAME"-e"SELECT name, state, failure_type, failure_reason FROM mdl_assignsubmission_dta_result WHERE submission_id = '$SUBMISSION_ID';"
STATUS_RESPONSE=$(curl --fail-sS-L-X POST "$MOODLE_URL/webservice/rest/server.php"\
echo"🎉 SUCCESS! The submission is marked as 'graded' in the Moodle GUI."
else
echo"⚠️ WARNING: The submission status is '$GRADE_STATUS', not 'graded'. The backend wrote to its custom tables but may have failed to update the core gradebook."
exit 1
fi
echo"🎉🎉 Moodle automation complete. The environment is fully configured. 🎉🎉"