From 7f0baa2a899ba87c726843740bed1b9d2fbae840 Mon Sep 17 00:00:00 2001
From: Paul Makles <paulmakles@gmail.com>
Date: Sun, 26 Jan 2020 11:53:33 +0000
Subject: [PATCH] Add user lookup.

---
 src/routes/account.rs |  1 -
 src/routes/mod.rs     |  2 +-
 src/routes/user.rs    | 35 +++++++++++++++++++++++++++++++++--
 3 files changed, 34 insertions(+), 4 deletions(-)

diff --git a/src/routes/account.rs b/src/routes/account.rs
index 8f9147a..17e556c 100644
--- a/src/routes/account.rs
+++ b/src/routes/account.rs
@@ -1,4 +1,3 @@
-use crate::auth::User;
 use crate::database;
 use crate::email;
 
diff --git a/src/routes/mod.rs b/src/routes/mod.rs
index 8b2aeb5..3ad8b1b 100644
--- a/src/routes/mod.rs
+++ b/src/routes/mod.rs
@@ -6,5 +6,5 @@ mod user;
 pub fn mount(rocket: Rocket) -> Rocket {
 	rocket
 		.mount("/api/account", routes![ account::create, account::verify_email, account::resend_email, account::login ])
-		.mount("/api/users", routes![ user::me ])
+		.mount("/api/users", routes![ user::me, user::lookup ])
 }
diff --git a/src/routes/user.rs b/src/routes/user.rs
index 7515ea2..a265b0b 100644
--- a/src/routes/user.rs
+++ b/src/routes/user.rs
@@ -1,7 +1,10 @@
 use crate::auth::User;
+use crate::database;
 
-use rocket_contrib::json::{ JsonValue };
-use bson::{ doc };
+use rocket_contrib::json::{ Json, JsonValue };
+use serde::{ Serialize, Deserialize };
+use mongodb::options::FindOptions;
+use bson::{ bson, doc };
 
 #[get("/@me")]
 pub fn me(user: User) -> JsonValue {
@@ -16,3 +19,31 @@ pub fn me(user: User) -> JsonValue {
 		"created_timestamp": id.datetime().timestamp(),
 	})
 }
+
+#[derive(Serialize, Deserialize)]
+pub struct Query {
+	username: String,
+}
+
+#[post("/lookup", data = "<query>")]
+pub fn lookup(_user: User, query: Json<Query>) -> JsonValue {
+	let col = database::get_db().collection("users");
+
+	let users = col.find(
+		doc! { "username": query.username.clone() },
+		FindOptions::builder().limit(10).build()
+	).expect("Failed user lookup");
+
+	let mut results = Vec::new();
+	for user in users {
+		let u = user.expect("Failed to unwrap user.");
+		results.push(
+			json!({
+				"id": u.get_str("_id").expect("DB[id]"),
+				"username": u.get_str("username").expect("DB[username]")
+			})
+		);
+	}
+
+	json!(results)
+}
-- 
GitLab