Skip to content

Commit 6d0615e

Browse files
committed
change: unite ranking interface
1 parent a33aa73 commit 6d0615e

File tree

8 files changed

+320
-231
lines changed

8 files changed

+320
-231
lines changed

atcoder-problems-backend/src/server/mod.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ pub(crate) mod language_count;
44
pub(crate) mod problem_list;
55
pub(crate) mod progress_reset;
66
pub(crate) mod ranking;
7-
pub(crate) mod rated_point_sum_ranking;
87
pub(crate) mod services;
98
pub(crate) mod time_submissions;
109
pub(crate) mod user_info;
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
use super::{
2+
RankingRequest, RankingRequestFormat, RankingResponse, RankingSelector, UserRankRequest,
3+
UserRankResponse, UserRankSelector,
4+
};
5+
use crate::server::AppData;
6+
7+
use actix_web::{error, web, Result};
8+
use async_trait::async_trait;
9+
use sql_client::accepted_count::AcceptedCountClient;
10+
11+
pub(crate) struct AcRanking;
12+
13+
#[async_trait(?Send)]
14+
impl<A: Sync + Send + Clone + 'static> RankingSelector<A> for AcRanking {
15+
type Request = RankingRequest;
16+
type Response = RankingResponse;
17+
async fn fetch(
18+
data: web::Data<AppData<A>>,
19+
query: Self::Request,
20+
) -> Result<Vec<Self::Response>> {
21+
let conn = data.pg_pool.clone();
22+
let ranking = conn
23+
.load_accepted_count_in_range(query.range())
24+
.await
25+
.map_err(error::ErrorInternalServerError)?;
26+
Ok(ranking
27+
.into_iter()
28+
.map(|entry| RankingResponse {
29+
user_id: entry.user_id,
30+
count: entry.problem_count as i64,
31+
})
32+
.collect())
33+
}
34+
}
35+
36+
#[async_trait(?Send)]
37+
impl<A: Sync + Send + Clone + 'static> UserRankSelector<A> for AcRanking {
38+
type Request = UserRankRequest;
39+
type Response = UserRankResponse;
40+
async fn fetch(
41+
data: web::Data<AppData<A>>,
42+
query: Self::Request,
43+
) -> Result<Option<Self::Response>> {
44+
let conn = data.pg_pool.clone();
45+
let count = match conn.get_users_accepted_count(&query.user).await {
46+
Some(number) => number,
47+
None => return Ok(None),
48+
};
49+
let rank = conn
50+
.get_accepted_count_rank(count)
51+
.await
52+
.map_err(error::ErrorInternalServerError)?;
53+
Ok(Some(UserRankResponse { count, rank }))
54+
}
55+
}
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
use super::{
2+
LanguageRankingRequest, LanguageUserRankResponse, RankingRequestFormat, RankingResponse,
3+
RankingSelector, UserRankRequest, UserRankSelector,
4+
};
5+
use crate::server::AppData;
6+
7+
use actix_web::{error, web, Result};
8+
use async_trait::async_trait;
9+
use sql_client::language_count::LanguageCountClient;
10+
11+
pub(crate) struct LanguageRanking;
12+
13+
#[async_trait(?Send)]
14+
impl<A: Sync + Send + Clone + 'static> RankingSelector<A> for LanguageRanking {
15+
type Request = LanguageRankingRequest;
16+
type Response = RankingResponse;
17+
async fn fetch(
18+
data: web::Data<AppData<A>>,
19+
query: Self::Request,
20+
) -> Result<Vec<Self::Response>> {
21+
let conn = data.pg_pool.clone();
22+
let ranking = conn
23+
.load_language_count_in_range(&query.language, query.range())
24+
.await
25+
.map_err(error::ErrorInternalServerError)?;
26+
Ok(ranking
27+
.into_iter()
28+
.map(|entry| RankingResponse {
29+
user_id: entry.user_id,
30+
count: entry.problem_count as i64,
31+
})
32+
.collect())
33+
}
34+
}
35+
36+
#[async_trait(?Send)]
37+
impl<A: Sync + Send + Clone + 'static> UserRankSelector<A> for LanguageRanking {
38+
type Request = UserRankRequest;
39+
type Response = Vec<LanguageUserRankResponse>;
40+
async fn fetch(
41+
data: web::Data<AppData<A>>,
42+
query: Self::Request,
43+
) -> Result<Option<Self::Response>> {
44+
let conn = data.pg_pool.clone();
45+
let counts = conn
46+
.load_users_language_count(&query.user)
47+
.await
48+
.map_err(error::ErrorInternalServerError)?;
49+
let ranks = conn
50+
.load_users_language_count_rank(&query.user)
51+
.await
52+
.map_err(error::ErrorInternalServerError)?;
53+
let info = counts
54+
.into_iter()
55+
.zip(ranks)
56+
.map(|(c, r)| LanguageUserRankResponse {
57+
language: c.simplified_language,
58+
count: c.problem_count as i64,
59+
rank: r.rank,
60+
})
61+
.collect::<Vec<_>>();
62+
Ok(Some(info))
63+
}
64+
}

0 commit comments

Comments
 (0)