This commit is contained in:
Antonio Scandurra 2022-06-24 17:21:58 +02:00
parent 9fcebe783c
commit b0eb692760
2 changed files with 78 additions and 14 deletions

View file

@ -31,6 +31,7 @@ pub fn routes(rpc_server: &Arc<rpc::Server>, state: Arc<AppState>) -> Router<Bod
) )
.route("/users/:id/access_tokens", post(create_access_token)) .route("/users/:id/access_tokens", post(create_access_token))
.route("/bulk_users", post(create_users)) .route("/bulk_users", post(create_users))
.route("/users_with_no_invites", get(get_users_with_no_invites))
.route("/invite_codes/:code", get(get_user_for_invite_code)) .route("/invite_codes/:code", get(get_user_for_invite_code))
.route("/panic", post(trace_panic)) .route("/panic", post(trace_panic))
.route("/rpc_server_snapshot", get(get_rpc_server_snapshot)) .route("/rpc_server_snapshot", get(get_rpc_server_snapshot))
@ -228,6 +229,21 @@ async fn create_users(
Ok(Json(users)) Ok(Json(users))
} }
struct GetUsersWithNoInvites {
invited_by_another_user: bool,
}
async fn get_users_with_no_invites(
Query(params): Query<GetUsersWithNoInvites>,
Extension(app): Extension<Arc<AppState>>,
) -> Result<Json<Vec<User>>> {
Ok(Json(
app.db
.get_users_with_no_invites(params.invited_by_another_user)
.await?,
))
}
#[derive(Debug, Deserialize)] #[derive(Debug, Deserialize)]
struct Panic { struct Panic {
version: String, version: String,

View file

@ -25,6 +25,7 @@ pub trait Db: Send + Sync {
async fn fuzzy_search_users(&self, query: &str, limit: u32) -> Result<Vec<User>>; async fn fuzzy_search_users(&self, query: &str, limit: u32) -> Result<Vec<User>>;
async fn get_user_by_id(&self, id: UserId) -> Result<Option<User>>; async fn get_user_by_id(&self, id: UserId) -> Result<Option<User>>;
async fn get_users_by_ids(&self, ids: Vec<UserId>) -> Result<Vec<User>>; async fn get_users_by_ids(&self, ids: Vec<UserId>) -> Result<Vec<User>>;
async fn get_users_with_no_invites(&self, invited_by_another_user: bool) -> Result<Vec<User>>;
async fn get_user_by_github_login(&self, github_login: &str) -> Result<Option<User>>; async fn get_user_by_github_login(&self, github_login: &str) -> Result<Option<User>>;
async fn set_user_is_admin(&self, id: UserId, is_admin: bool) -> Result<()>; async fn set_user_is_admin(&self, id: UserId, is_admin: bool) -> Result<()>;
async fn set_user_connected_once(&self, id: UserId, connected_once: bool) -> Result<()>; async fn set_user_connected_once(&self, id: UserId, connected_once: bool) -> Result<()>;
@ -260,6 +261,18 @@ impl Db for PostgresDb {
.await?) .await?)
} }
async fn get_users_with_no_invites(&self, invited_by_another_user: bool) -> Result<Vec<User>> {
let query = "
SELECT users.*
FROM users
WHERE invite_count = 0
";
Ok(sqlx::query_as(query)
.bind(&ids)
.fetch_all(&self.pool)
.await?)
}
async fn get_user_by_github_login(&self, github_login: &str) -> Result<Option<User>> { async fn get_user_by_github_login(&self, github_login: &str) -> Result<Option<User>> {
let query = "SELECT * FROM users WHERE github_login = $1 LIMIT 1"; let query = "SELECT * FROM users WHERE github_login = $1 LIMIT 1";
Ok(sqlx::query_as(query) Ok(sqlx::query_as(query)
@ -1363,21 +1376,56 @@ pub mod tests {
let user = db.create_user("user_1", None, false).await.unwrap(); let user = db.create_user("user_1", None, false).await.unwrap();
let project = db.register_project(user).await.unwrap(); let project = db.register_project(user).await.unwrap();
db.update_worktree_extensions(project, 100, Default::default()).await.unwrap(); db.update_worktree_extensions(project, 100, Default::default())
db.update_worktree_extensions(project, 100, [("rs".to_string(), 5), ("md".to_string(), 3)].into_iter().collect()).await.unwrap(); .await
db.update_worktree_extensions(project, 100, [("rs".to_string(), 6), ("md".to_string(), 5)].into_iter().collect()).await.unwrap(); .unwrap();
db.update_worktree_extensions(project, 101, [("ts".to_string(), 2), ("md".to_string(), 1)].into_iter().collect()).await.unwrap(); db.update_worktree_extensions(
project,
100,
[("rs".to_string(), 5), ("md".to_string(), 3)]
.into_iter()
.collect(),
)
.await
.unwrap();
db.update_worktree_extensions(
project,
100,
[("rs".to_string(), 6), ("md".to_string(), 5)]
.into_iter()
.collect(),
)
.await
.unwrap();
db.update_worktree_extensions(
project,
101,
[("ts".to_string(), 2), ("md".to_string(), 1)]
.into_iter()
.collect(),
)
.await
.unwrap();
assert_eq!(db.get_project_extensions(project).await.unwrap(), [ assert_eq!(
(100, [ db.get_project_extensions(project).await.unwrap(),
("rs".into(), 6), [
("md".into(), 5), (
].into_iter().collect::<HashMap<_, _>>()), 100,
(101, [ [("rs".into(), 6), ("md".into(), 5),]
("ts".into(), 2), .into_iter()
("md".into(), 1), .collect::<HashMap<_, _>>()
].into_iter().collect::<HashMap<_, _>>()) ),
].into_iter().collect()); (
101,
[("ts".into(), 2), ("md".into(), 1),]
.into_iter()
.collect::<HashMap<_, _>>()
)
]
.into_iter()
.collect()
);
} }
#[tokio::test(flavor = "multi_thread")] #[tokio::test(flavor = "multi_thread")]