module api_handling implicit none character(*), parameter::RESPONSE_JSON_OKAY = '{"status": "okay"}' character(*), parameter::RESPONSE_JSON_IDLE = '{"status": "idle"}' contains subroutine handle_task_request(req) use server_response use captain_db implicit none class(request)::req character(8)::job_text, task_text integer::job_i, task_i, ierr call req%path_component(5, job_text) read(job_text, *, iostat=ierr) job_i if(ierr == 0) then call req%path_component(7, task_text) read(task_text, *, iostat=ierr) task_i if(ierr == 0) then if(req%query_string == "starting" .or. req%query_string == "inprogress") then call update_task_status(job_i, task_i, JOB_STATUS_WORKING) else if(req%query_string == "complete") then call update_task_status(job_i, task_i, JOB_STATUS_SUCCESS) else if(req%query_string == "failed") then call update_task_status(job_i, task_i, JOB_STATUS_FAILURE) end if end if end if end subroutine handle_task_request function api_request_gemini(req) result(resp) use server_response use captain_db use special_filenames implicit none type(request), intent(in)::req type(response)::resp character(8)::job_text character(PLAYER_NAME_LENGTH)::player integer::job_i, player_i, instruction_i, ierr ! Complete - "/api/player/{name}/job/{jobid}/complete" ! Failed - "/api/player/{name}/job/{jobid}/failed" ! Task - "/api/player/{name}/job/{jobid}/task/{task num}" if(trim(req%component(2)) == "player" .and. trim(req%component(4)) == "job") then call req%path_component(5, job_text) read(job_text, *, iostat=ierr) job_i if(ierr == 0 .and. .not. is_final_job_status(job_i)) then if(trim(req%component(6)) == "complete") then call update_job_status(job_i, JOB_STATUS_SUCCESS) else if(trim(req%component(6)) == "failure") then call update_job_status(job_i, JOB_STATUS_FAILURE) end if end if if(ierr == 0 .and. trim(req%component(6)) == "task") then call handle_task_request(req) end if resp%code = GEMINI_CODE_SUCCESS call resp%set_body_contents(RESPONSE_JSON_OKAY) resp%body_mimetype = "application/json" ! Checkin - /api/player/{name}/checkin.json else if(trim(req%component(2)) == "player" .and. trim(req%component(4)) == "checkin.json") then ! Check for pending jobs call req%path_component(3, player) player_i = get_player_id(player) job_i = get_pending_job_for_player(player_i) if(job_i < 0) then resp%code = GEMINI_CODE_SUCCESS call resp%set_body_contents(RESPONSE_JSON_IDLE) else resp%code = GEMINI_CODE_SUCCESS instruction_i = get_job_instruction(job_i) resp%body_filename => get_instructions_static_filename(instruction_i) resp%temporary_file = .false. resp%body_mimetype = "application/json" end if end if end function api_request_gemini function api_request_titan(req) result(resp) use server_response use special_filenames implicit none type(titan_request), intent(in)::req type(response)::resp character(len=:), pointer::fullpath character(12)::job_text, task_text integer::job_id, task_num, ierr fullpath => null() ! Task - "/api/player/{name}/job/{jobid}/task/{task num}" if(trim(req%component(2)) == "player" .and. & trim(req%component(4)) == "job" .and. & trim(req%component(6)) == "task") then call req%path_component(5, job_text) read(job_text, *, iostat=ierr) job_id if(ierr /= 0) then resp%code = GEMINI_CODE_PERMFAIL return end if call req%path_component(5, task_text) read(task_text, *, iostat=ierr) task_num if(ierr /= 0) then resp%code = GEMINI_CODE_PERMFAIL return end if call handle_task_request(req) fullpath => get_task_result_static_filename(job_id, task_num) end if if(associated(fullpath)) then ! Write the file call req%write_to(fullpath) resp%code = GEMINI_CODE_SUCCESS call resp%set_body_contents(RESPONSE_JSON_OKAY) resp%body_mimetype = "application/json" else resp%code = GEMINI_CODE_PERMFAIL end if end function api_request_titan end module api_handling