Skip to content

Commit 4e5be4b

Browse files
committed
Move keyword api endpoints under controllers
1 parent 005e800 commit 4e5be4b

File tree

4 files changed

+70
-65
lines changed

4 files changed

+70
-65
lines changed

src/controllers/keyword.rs

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
use diesel::prelude::*;
2+
use conduit::{Request, Response};
3+
use conduit_router::RequestParams;
4+
use db::RequestTransaction;
5+
use util::{CargoResult, RequestUtils};
6+
7+
use controllers::helpers::Paginate;
8+
use models::Keyword;
9+
use views::EncodableKeyword;
10+
11+
/// Handles the `GET /keywords` route.
12+
pub fn index(req: &mut Request) -> CargoResult<Response> {
13+
use schema::keywords;
14+
15+
let conn = req.db_conn()?;
16+
let (offset, limit) = req.pagination(10, 100)?;
17+
let query = req.query();
18+
let sort = query.get("sort").map(|s| &s[..]).unwrap_or("alpha");
19+
20+
let mut query = keywords::table.into_boxed();
21+
22+
if sort == "crates" {
23+
query = query.order(keywords::crates_cnt.desc());
24+
} else {
25+
query = query.order(keywords::keyword.asc());
26+
}
27+
28+
let data = query
29+
.paginate(limit, offset)
30+
.load::<(Keyword, i64)>(&*conn)?;
31+
let total = data.get(0).map(|&(_, t)| t).unwrap_or(0);
32+
let kws = data.into_iter()
33+
.map(|(k, _)| k.encodable())
34+
.collect::<Vec<_>>();
35+
36+
#[derive(Serialize)]
37+
struct R {
38+
keywords: Vec<EncodableKeyword>,
39+
meta: Meta,
40+
}
41+
#[derive(Serialize)]
42+
struct Meta {
43+
total: i64,
44+
}
45+
46+
Ok(req.json(&R {
47+
keywords: kws,
48+
meta: Meta { total: total },
49+
}))
50+
}
51+
52+
/// Handles the `GET /keywords/:keyword_id` route.
53+
pub fn show(req: &mut Request) -> CargoResult<Response> {
54+
let name = &req.params()["keyword_id"];
55+
let conn = req.db_conn()?;
56+
57+
let kw = Keyword::find_by_keyword(&conn, name)?;
58+
59+
#[derive(Serialize)]
60+
struct R {
61+
keyword: EncodableKeyword,
62+
}
63+
Ok(req.json(&R {
64+
keyword: kw.encodable(),
65+
}))
66+
}

src/controllers/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
11
// TODO: All endpoints would be moved to submodules here
22

33
pub mod helpers;
4+
5+
pub mod keyword;

src/keyword.rs

Lines changed: 0 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,7 @@
11
use chrono::NaiveDateTime;
2-
use conduit::{Request, Response};
3-
use conduit_router::RequestParams;
42
use diesel::prelude::*;
53
use diesel;
64

7-
use db::RequestTransaction;
8-
use controllers::helpers::Paginate;
9-
use util::{CargoResult, RequestUtils};
10-
115
use models::Crate;
126
use schema::*;
137

@@ -107,63 +101,6 @@ impl Keyword {
107101
}
108102
}
109103

110-
/// Handles the `GET /keywords` route.
111-
pub fn index(req: &mut Request) -> CargoResult<Response> {
112-
use schema::keywords;
113-
114-
let conn = req.db_conn()?;
115-
let (offset, limit) = req.pagination(10, 100)?;
116-
let query = req.query();
117-
let sort = query.get("sort").map(|s| &s[..]).unwrap_or("alpha");
118-
119-
let mut query = keywords::table.into_boxed();
120-
121-
if sort == "crates" {
122-
query = query.order(keywords::crates_cnt.desc());
123-
} else {
124-
query = query.order(keywords::keyword.asc());
125-
}
126-
127-
let data = query
128-
.paginate(limit, offset)
129-
.load::<(Keyword, i64)>(&*conn)?;
130-
let total = data.get(0).map(|&(_, t)| t).unwrap_or(0);
131-
let kws = data.into_iter()
132-
.map(|(k, _)| k.encodable())
133-
.collect::<Vec<_>>();
134-
135-
#[derive(Serialize)]
136-
struct R {
137-
keywords: Vec<EncodableKeyword>,
138-
meta: Meta,
139-
}
140-
#[derive(Serialize)]
141-
struct Meta {
142-
total: i64,
143-
}
144-
145-
Ok(req.json(&R {
146-
keywords: kws,
147-
meta: Meta { total: total },
148-
}))
149-
}
150-
151-
/// Handles the `GET /keywords/:keyword_id` route.
152-
pub fn show(req: &mut Request) -> CargoResult<Response> {
153-
let name = &req.params()["keyword_id"];
154-
let conn = req.db_conn()?;
155-
156-
let kw = Keyword::find_by_keyword(&conn, name)?;
157-
158-
#[derive(Serialize)]
159-
struct R {
160-
keyword: EncodableKeyword,
161-
}
162-
Ok(req.json(&R {
163-
keyword: kw.encodable(),
164-
}))
165-
}
166-
167104
#[cfg(test)]
168105
mod tests {
169106
use super::*;

src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -186,8 +186,8 @@ pub fn middleware(app: Arc<App>) -> MiddlewareBuilder {
186186
"/crates/:crate_id/reverse_dependencies",
187187
C(krate::metadata::reverse_dependencies),
188188
);
189-
api_router.get("/keywords", C(keyword::index));
190-
api_router.get("/keywords/:keyword_id", C(keyword::show));
189+
api_router.get("/keywords", C(controllers::keyword::index));
190+
api_router.get("/keywords/:keyword_id", C(controllers::keyword::show));
191191
api_router.get("/categories", C(category::index));
192192
api_router.get("/categories/:category_id", C(category::show));
193193
api_router.get("/category_slugs", C(category::slugs));

0 commit comments

Comments
 (0)