module api_handling implicit none character(*), parameter::RESPONSE_JSON_OKAY = '{"status": "okay"}' character(*), parameter::RESPONSE_JSON_IDLE = '{"status": "idle"}' contains 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, task_text character(PLAYER_NAME_LENGTH)::player integer::job_i, task_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 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 resp%code = GEMINI_CODE_SUCCESS call resp%set_body_contents(RESPONSE_JSON_OKAY) ! 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 implicit none type(request), intent(in)::req type(response)::resp end function api_request_titan function api_request(req) result(resp) use server_response implicit none type(request), intent(in)::req type(response)::resp if(req%protocol == "gemini") then resp = api_request_gemini(req) else if(req%protocol == "titan") then resp = api_request_titan(req) end if end function api_request end module api_handling