Skip to content

Commit 5ef86a6

Browse files
committed
Move category api endpoints under controllers
1 parent 4e5be4b commit 5ef86a6

File tree

4 files changed

+97
-92
lines changed

4 files changed

+97
-92
lines changed

src/category.rs

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

6-
use db::RequestTransaction;
7-
use util::{CargoResult, RequestUtils};
8-
94
use models::Crate;
105
use schema::*;
116

@@ -180,90 +175,6 @@ impl<'a> NewCategory<'a> {
180175
}
181176
}
182177

183-
/// Handles the `GET /categories` route.
184-
pub fn index(req: &mut Request) -> CargoResult<Response> {
185-
let conn = req.db_conn()?;
186-
let (offset, limit) = req.pagination(10, 100)?;
187-
let query = req.query();
188-
let sort = query.get("sort").map_or("alpha", String::as_str);
189-
190-
let categories = Category::toplevel(&conn, sort, limit, offset)?;
191-
let categories = categories.into_iter().map(Category::encodable).collect();
192-
193-
// Query for the total count of categories
194-
let total = Category::count_toplevel(&conn)?;
195-
196-
#[derive(Serialize)]
197-
struct R {
198-
categories: Vec<EncodableCategory>,
199-
meta: Meta,
200-
}
201-
#[derive(Serialize)]
202-
struct Meta {
203-
total: i64,
204-
}
205-
206-
Ok(req.json(&R {
207-
categories: categories,
208-
meta: Meta { total: total },
209-
}))
210-
}
211-
212-
/// Handles the `GET /categories/:category_id` route.
213-
pub fn show(req: &mut Request) -> CargoResult<Response> {
214-
let slug = &req.params()["category_id"];
215-
let conn = req.db_conn()?;
216-
let cat = categories::table
217-
.filter(categories::slug.eq(::lower(slug)))
218-
.first::<Category>(&*conn)?;
219-
let subcats = cat.subcategories(&conn)?
220-
.into_iter()
221-
.map(Category::encodable)
222-
.collect();
223-
224-
let cat = cat.encodable();
225-
let cat_with_subcats = EncodableCategoryWithSubcategories {
226-
id: cat.id,
227-
category: cat.category,
228-
slug: cat.slug,
229-
description: cat.description,
230-
created_at: cat.created_at,
231-
crates_cnt: cat.crates_cnt,
232-
subcategories: subcats,
233-
};
234-
235-
#[derive(Serialize)]
236-
struct R {
237-
category: EncodableCategoryWithSubcategories,
238-
}
239-
Ok(req.json(&R {
240-
category: cat_with_subcats,
241-
}))
242-
}
243-
244-
/// Handles the `GET /category_slugs` route.
245-
pub fn slugs(req: &mut Request) -> CargoResult<Response> {
246-
let conn = req.db_conn()?;
247-
let slugs = categories::table
248-
.select((categories::slug, categories::slug))
249-
.order(categories::slug)
250-
.load(&*conn)?;
251-
252-
#[derive(Serialize, Queryable)]
253-
struct Slug {
254-
id: String,
255-
slug: String,
256-
}
257-
258-
#[derive(Serialize)]
259-
struct R {
260-
category_slugs: Vec<Slug>,
261-
}
262-
Ok(req.json(&R {
263-
category_slugs: slugs,
264-
}))
265-
}
266-
267178
#[cfg(test)]
268179
mod tests {
269180
use super::*;

src/controllers/category.rs

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
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 models::Category;
8+
use schema::categories;
9+
use views::{EncodableCategory, EncodableCategoryWithSubcategories};
10+
11+
/// Handles the `GET /categories` route.
12+
pub fn index(req: &mut Request) -> CargoResult<Response> {
13+
let conn = req.db_conn()?;
14+
let (offset, limit) = req.pagination(10, 100)?;
15+
let query = req.query();
16+
let sort = query.get("sort").map_or("alpha", String::as_str);
17+
18+
let categories = Category::toplevel(&conn, sort, limit, offset)?;
19+
let categories = categories.into_iter().map(Category::encodable).collect();
20+
21+
// Query for the total count of categories
22+
let total = Category::count_toplevel(&conn)?;
23+
24+
#[derive(Serialize)]
25+
struct R {
26+
categories: Vec<EncodableCategory>,
27+
meta: Meta,
28+
}
29+
#[derive(Serialize)]
30+
struct Meta {
31+
total: i64,
32+
}
33+
34+
Ok(req.json(&R {
35+
categories: categories,
36+
meta: Meta { total: total },
37+
}))
38+
}
39+
40+
/// Handles the `GET /categories/:category_id` route.
41+
pub fn show(req: &mut Request) -> CargoResult<Response> {
42+
let slug = &req.params()["category_id"];
43+
let conn = req.db_conn()?;
44+
let cat = categories::table
45+
.filter(categories::slug.eq(::lower(slug)))
46+
.first::<Category>(&*conn)?;
47+
let subcats = cat.subcategories(&conn)?
48+
.into_iter()
49+
.map(Category::encodable)
50+
.collect();
51+
52+
let cat = cat.encodable();
53+
let cat_with_subcats = EncodableCategoryWithSubcategories {
54+
id: cat.id,
55+
category: cat.category,
56+
slug: cat.slug,
57+
description: cat.description,
58+
created_at: cat.created_at,
59+
crates_cnt: cat.crates_cnt,
60+
subcategories: subcats,
61+
};
62+
63+
#[derive(Serialize)]
64+
struct R {
65+
category: EncodableCategoryWithSubcategories,
66+
}
67+
Ok(req.json(&R {
68+
category: cat_with_subcats,
69+
}))
70+
}
71+
72+
/// Handles the `GET /category_slugs` route.
73+
pub fn slugs(req: &mut Request) -> CargoResult<Response> {
74+
let conn = req.db_conn()?;
75+
let slugs = categories::table
76+
.select((categories::slug, categories::slug))
77+
.order(categories::slug)
78+
.load(&*conn)?;
79+
80+
#[derive(Serialize, Queryable)]
81+
struct Slug {
82+
id: String,
83+
slug: String,
84+
}
85+
86+
#[derive(Serialize)]
87+
struct R {
88+
category_slugs: Vec<Slug>,
89+
}
90+
Ok(req.json(&R {
91+
category_slugs: slugs,
92+
}))
93+
}

src/controllers/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@
22

33
pub mod helpers;
44

5+
pub mod category;
56
pub mod keyword;

src/lib.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -188,9 +188,9 @@ pub fn middleware(app: Arc<App>) -> MiddlewareBuilder {
188188
);
189189
api_router.get("/keywords", C(controllers::keyword::index));
190190
api_router.get("/keywords/:keyword_id", C(controllers::keyword::show));
191-
api_router.get("/categories", C(category::index));
192-
api_router.get("/categories/:category_id", C(category::show));
193-
api_router.get("/category_slugs", C(category::slugs));
191+
api_router.get("/categories", C(controllers::category::index));
192+
api_router.get("/categories/:category_id", C(controllers::category::show));
193+
api_router.get("/category_slugs", C(controllers::category::slugs));
194194
api_router.get("/users/:user_id", C(user::show));
195195
api_router.put("/users/:user_id", C(user::update_user));
196196
api_router.get("/users/:user_id/stats", C(user::stats));

0 commit comments

Comments
 (0)