添加获取目录下文件接口

This commit is contained in:
MeiK 2021-02-02 18:48:07 +08:00
parent 14bb325f0d
commit ea413f0bf3
2 changed files with 32 additions and 0 deletions

View File

@ -4,6 +4,15 @@ package river;
service River {
rpc Judge(stream JudgeRequest) returns (stream JudgeResponse) {}
rpc LanguageConfig(Empty) returns (LanguageConfigResponse) {}
rpc Ls(LsRequest) returns (LsResponse) {}
}
message LsRequest {
string dir = 1;
}
message LsResponse {
repeated string files = 1;
}
message Empty {

View File

@ -9,9 +9,12 @@ use river::judge_request::Data;
use river::river_server::{River, RiverServer};
use river::{
Empty, JudgeRequest, JudgeResponse, JudgeResultEnum, LanguageConfigResponse, LanguageItem,
LsRequest, LsResponse,
};
use std::path::Path;
use std::pin::Pin;
use tempfile::tempdir_in;
use tokio::fs::read_dir;
use tonic::transport::Server;
use tonic::{Request, Response, Status};
@ -124,6 +127,26 @@ impl River for RiverService {
};
Ok(Response::new(response))
}
async fn ls(&self, request: Request<LsRequest>) -> Result<Response<LsResponse>, Status> {
// TODO: 将获取文件的接口剥离出来,归入评测文件管理系统中
// TODO: 最终将会删除这个接口
// TODO: 目前有安全隐患,可以获取到任意目录文件
let dir = request.into_inner().dir;
let mut response = LsResponse { files: vec![] };
let directory_stream = match read_dir(Path::new("runtime/data").join(dir)).await {
Ok(val) => val,
Err(_) => return Ok(Response::new(response)),
};
let files: Vec<_> = directory_stream
.filter_map(|file| async move {
Some(file.unwrap().file_name().into_string().unwrap())
})
.collect()
.await;
response.files = files;
Ok(Response::new(response))
}
}
#[tokio::main]