Skip to content

Commit af90b2d

Browse files
Merge #1155
1155: Propose new MVC module layout r=carols10cents This pull request proposes a new module layout following a model-view-controller style. For now, the functionality is re-exported from the new locations and the `use` statements have been updated to use the new locations. If we define where things should be moved to now, it should be easier to split future changes into small, reviewable PRs. ## Controllers - `src/api/*` For now, this is an empty placeholder, but the api route declarations and endpoints would be moved here. (In a [separate branch](jtgeibel/crates.io@master...mvc-example) I have some examples where the existing logic is moved.) ## Views - `src/views/*` Currently this is JSON only and most existing types are prefixed with `Encodable`. The major exception to this is the types from the `cargo publish` endpoint, which has been moved to `views::krate_publish`. ## Models - `src/models/*` All of the Diesel types would move to here. Many of these were previously reexported from the crate root. Going forward, I think many of the `New*` structs can go away using the new syntax as shown in: https://github.com/rust-lang/crates.io/blob/e0e57b9843c2fb244997a2e47d8cedc40fa9b516/src/boot/categories.rs#L105-L109 # Future work We can consider additional top level modules. For instance, the outgoing email and github_auth functionality could be moved to a module for `external` services. Additionally, `src/pagination.rs` could be moved into `src/api/mod.rs` and a few more things could probably move to `util`. I'm not sure yet where something like the README rendering would fit in.
2 parents 6cb501f + 005e800 commit af90b2d

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+192
-158
lines changed

src/badge.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
use krate::Crate;
2-
use schema::badges;
3-
41
use diesel::pg::Pg;
52
use diesel::prelude::*;
63
use serde_json;
74
use std::collections::HashMap;
85

6+
use models::Crate;
7+
use schema::badges;
8+
99
#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)]
1010
#[serde(rename_all = "kebab-case", tag = "badge_type", content = "attributes")]
1111
pub enum Badge {

src/bin/delete-crate.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use std::env;
1515
use std::io;
1616
use std::io::prelude::*;
1717

18-
use cargo_registry::Crate;
18+
use cargo_registry::models::Crate;
1919
use cargo_registry::schema::crates;
2020

2121
#[allow(dead_code)]

src/bin/delete-version.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use std::env;
1515
use std::io;
1616
use std::io::prelude::*;
1717

18-
use cargo_registry::{Crate, Version};
18+
use cargo_registry::models::{Crate, Version};
1919
use cargo_registry::schema::versions;
2020

2121
#[allow(dead_code)]

src/bin/render-readmes.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,12 @@ use std::thread;
3232
use tar::Archive;
3333
use url::Url;
3434

35-
use cargo_registry::{Config, Version};
36-
use cargo_registry::schema::*;
35+
use cargo_registry::Config;
3736
use cargo_registry::render::readme_to_html;
3837

38+
use cargo_registry::models::Version;
39+
use cargo_registry::schema::*;
40+
3941
const DEFAULT_PAGE_SIZE: usize = 25;
4042
const USAGE: &str = "
4143
Usage: render-readmes [options]

src/bin/transfer-crates.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,7 @@ use std::env;
1313
use std::io;
1414
use std::io::prelude::*;
1515

16-
use cargo_registry::{Crate, User};
17-
use cargo_registry::owner::OwnerKind;
16+
use cargo_registry::models::{Crate, OwnerKind, User};
1817
use cargo_registry::schema::*;
1918

2019
fn main() {

src/bin/update-downloads.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use diesel::prelude::*;
88
use std::env;
99
use std::time::Duration;
1010

11-
use cargo_registry::VersionDownload;
11+
use cargo_registry::models::VersionDownload;
1212
use cargo_registry::schema::*;
1313

1414
static LIMIT: i64 = 1000;
@@ -118,9 +118,7 @@ mod test {
118118
use diesel::insert_into;
119119
use super::*;
120120
use cargo_registry::env;
121-
use cargo_registry::krate::{Crate, NewCrate};
122-
use cargo_registry::user::{NewUser, User};
123-
use cargo_registry::version::{NewVersion, Version};
121+
use cargo_registry::models::{Crate, NewCrate, NewUser, NewVersion, User, Version};
124122

125123
fn conn() -> PgConnection {
126124
let conn = PgConnection::establish(&env("TEST_DATABASE_URL")).unwrap();

src/category.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,12 @@ use conduit::{Request, Response};
33
use conduit_router::RequestParams;
44
use diesel::*;
55

6-
use Crate;
76
use db::RequestTransaction;
8-
use schema::*;
97
use util::{CargoResult, RequestUtils};
108

9+
use models::Crate;
10+
use schema::*;
11+
1112
#[derive(Clone, Identifiable, Queryable, QueryableByName, Debug)]
1213
#[table_name = "categories"]
1314
pub struct Category {

src/controllers/helpers/mod.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
pub mod pagination;
2+
3+
pub use self::pagination::Paginate;

src/pagination.rs renamed to src/controllers/helpers/pagination.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ use diesel::query_builder::*;
33
use diesel::sql_types::BigInt;
44
use diesel::pg::Pg;
55

6+
#[derive(Debug)]
67
pub struct Paginated<T> {
78
query: T,
89
limit: i64,

src/controllers/mod.rs

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

src/crate_owner_invitation.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,12 @@ use diesel::prelude::*;
44
use serde_json;
55

66
use db::RequestTransaction;
7-
use schema::{crate_owner_invitations, crate_owners, crates, users};
87
use user::RequestUser;
98
use util::errors::{human, CargoResult};
109
use util::RequestUtils;
11-
use owner::{CrateOwner, OwnerKind};
10+
11+
use models::{CrateOwner, OwnerKind};
12+
use schema::{crate_owner_invitations, crate_owners, crates, users};
1213

1314
/// The model representing a row in the `crate_owner_invitations` database table.
1415
#[derive(Clone, Copy, Debug, PartialEq, Eq, Identifiable, Queryable)]

src/dependency.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@ use diesel::row::NamedRow;
55
use semver;
66

77
use git;
8-
use krate::Crate;
9-
use schema::*;
108
use util::{human, CargoResult};
11-
use version::Version;
9+
10+
use models::{Crate, Version};
11+
use schema::*;
1212

1313
#[derive(Identifiable, Associations, Debug)]
1414
#[belongs_to(Version)]
@@ -86,7 +86,7 @@ impl ReverseDependency {
8686

8787
pub fn add_dependencies(
8888
conn: &PgConnection,
89-
deps: &[::upload::CrateDependency],
89+
deps: &[::views::EncodableCrateDependency],
9090
target_version_id: i32,
9191
) -> CargoResult<Vec<git::Dependency>> {
9292
use diesel::insert_into;

src/download.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ use chrono::NaiveDate;
22
use diesel;
33
use diesel::prelude::*;
44

5+
use models::Version;
56
use schema::version_downloads;
6-
use version::Version;
77

88
#[derive(Queryable, Identifiable, Associations, Debug, Clone, Copy)]
99
#[belongs_to(Version)]

src/git.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,10 @@ use git2;
99
use serde_json;
1010

1111
use app::App;
12-
use dependency::Kind;
1312
use util::{internal, CargoResult};
1413

14+
use models::Kind;
15+
1516
#[derive(Serialize, Deserialize, Debug)]
1617
pub struct Crate {
1718
pub name: String,

src/keyword.rs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,16 @@
1-
#[allow(unused_imports)] // TODO: Remove when rustc 1.23 is stable
2-
use std::ascii::AsciiExt;
3-
41
use chrono::NaiveDateTime;
52
use conduit::{Request, Response};
63
use conduit_router::RequestParams;
74
use diesel::prelude::*;
85
use diesel;
96

10-
use Crate;
117
use db::RequestTransaction;
12-
use pagination::Paginate;
13-
use schema::*;
8+
use controllers::helpers::Paginate;
149
use util::{CargoResult, RequestUtils};
1510

11+
use models::Crate;
12+
use schema::*;
13+
1614
#[derive(Clone, Identifiable, Queryable, Debug)]
1715
pub struct Keyword {
1816
pub id: i32,

src/krate/downloads.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,13 @@ use conduit_router::RequestParams;
1010
use diesel::prelude::*;
1111

1212
use db::RequestTransaction;
13-
use download::{EncodableVersionDownload, VersionDownload};
14-
use schema::*;
1513
use util::{CargoResult, RequestUtils};
16-
use Version;
1714

18-
use super::{to_char, Crate};
15+
use views::EncodableVersionDownload;
16+
use models::{Crate, Version, VersionDownload};
17+
use schema::*;
18+
19+
use super::to_char;
1920

2021
/// Handles the `GET /crates/:crate_id/downloads` route.
2122
pub fn downloads(req: &mut Request) -> CargoResult<Response> {

src/krate/follow.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@ use diesel::prelude::*;
77
use diesel;
88

99
use db::RequestTransaction;
10-
use schema::*;
1110
use user::RequestUser;
1211
use util::{CargoResult, RequestUtils};
1312

14-
use super::{Crate, Follow};
13+
use models::{Crate, Follow};
14+
use schema::*;
1515

1616
fn follow_target(req: &mut Request) -> CargoResult<Follow> {
1717
let user = req.user()?;

src/krate/metadata.rs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,15 @@ use conduit_router::RequestParams;
99
use diesel::prelude::*;
1010

1111
use app::RequestApp;
12-
use category::{CrateCategory, EncodableCategory};
1312
use db::RequestTransaction;
14-
use dependency::EncodableDependency;
15-
use keyword::{CrateKeyword, EncodableKeyword};
16-
use schema::*;
1713
use util::{human, CargoResult, RequestUtils};
18-
use version::EncodableVersion;
19-
use {Category, Keyword, Version};
2014

21-
use super::{Crate, CrateDownload, EncodableCrate, ALL_COLUMNS};
15+
use views::{EncodableCategory, EncodableCrate, EncodableDependency, EncodableKeyword,
16+
EncodableVersion};
17+
use models::{Category, Crate, CrateCategory, CrateDownload, CrateKeyword, Keyword, Version};
18+
use schema::*;
19+
20+
use super::ALL_COLUMNS;
2221

2322
/// Handles the `GET /summary` route.
2423
pub fn summary(req: &mut Request) -> CargoResult<Response> {

src/krate/mod.rs

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,3 @@
1-
#[allow(unused_imports)] // TODO: Remove when rustc 1.23 is stable
2-
use std::ascii::AsciiExt;
3-
41
use chrono::{NaiveDate, NaiveDateTime};
52
use diesel::associations::Identifiable;
63
use diesel::prelude::*;
@@ -10,14 +7,14 @@ use semver;
107
use url::Url;
118

129
use app::App;
13-
use badge::EncodableBadge;
14-
use crate_owner_invitation::NewCrateOwnerInvitation;
15-
use dependency::ReverseDependency;
16-
use owner::{CrateOwner, Owner, OwnerKind};
17-
use schema::*;
1810
use util::{human, CargoResult};
11+
12+
use views::EncodableBadge;
13+
use models::{Badge, Category, CrateOwner, Keyword, NewCrateOwnerInvitation, Owner, OwnerKind,
14+
ReverseDependency, User, Version};
15+
16+
use schema::*;
1917
use with_count::*;
20-
use {Badge, Category, Keyword, User, Version};
2118

2219
pub mod search;
2320
pub mod publish;
@@ -560,6 +557,7 @@ mod tests {
560557
use super::*;
561558
use chrono::NaiveDate;
562559
use serde_json;
560+
use models::Crate;
563561

564562
#[test]
565563
fn documentation_blacklist_no_url_provided() {

src/krate/owners.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,12 @@ use serde_json;
77

88
use app::RequestApp;
99
use db::RequestTransaction;
10-
use owner::{rights, EncodableOwner, Owner, Rights, Team};
10+
use owner::rights;
1111
use user::RequestUser;
1212
use util::{human, CargoResult, RequestUtils};
13-
use User;
1413

15-
use super::Crate;
14+
use views::EncodableOwner;
15+
use models::{Crate, Owner, Rights, Team, User};
1616

1717
/// Handles the `GET /crates/:crate_id/owners` route.
1818
pub fn owners(req: &mut Request) -> CargoResult<Response> {

src/krate/publish.rs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,15 @@ use app::RequestApp;
1313
use db::RequestTransaction;
1414
use dependency;
1515
use git;
16-
use owner::{rights, Rights};
16+
use owner::rights;
1717
use render;
18-
use upload;
1918
use user::RequestUser;
2019
use util::{read_fill, read_le_u32};
2120
use util::{human, internal, CargoResult, ChainError, RequestUtils};
22-
use version::NewVersion;
23-
use {Badge, Category, Keyword, User};
2421

25-
use super::{EncodableCrate, NewCrate};
22+
use views::EncodableCrate;
23+
use views::EncodableCrateUpload;
24+
use models::{Badge, Category, Keyword, NewCrate, NewVersion, Rights, User};
2625

2726
/// Handles the `PUT /crates/new` route.
2827
/// Used by `cargo publish` to publish a new crate or to publish a new version of an
@@ -193,7 +192,7 @@ pub fn publish(req: &mut Request) -> CargoResult<Response> {
193192
/// This function parses the JSON headers to interpret the data and validates
194193
/// the data during and after the parsing. Returns crate metadata and user
195194
/// information.
196-
fn parse_new_headers(req: &mut Request) -> CargoResult<(upload::NewCrate, User)> {
195+
fn parse_new_headers(req: &mut Request) -> CargoResult<(EncodableCrateUpload, User)> {
197196
// Read the json upload request
198197
let amt = u64::from(read_le_u32(req.body())?);
199198
let max = req.app().config.max_upload_size;
@@ -203,7 +202,7 @@ fn parse_new_headers(req: &mut Request) -> CargoResult<(upload::NewCrate, User)>
203202
let mut json = vec![0; amt as usize];
204203
read_fill(req.body(), &mut json)?;
205204
let json = String::from_utf8(json).map_err(|_| human("json body was not valid utf-8"))?;
206-
let new: upload::NewCrate = serde_json::from_str(&json)
205+
let new: EncodableCrateUpload = serde_json::from_str(&json)
207206
.map_err(|e| human(&format_args!("invalid upload request: {}", e)))?;
208207

209208
// Make sure required fields are provided

src/krate/search.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,15 @@ use diesel::prelude::*;
55
use diesel_full_text_search::*;
66

77
use db::RequestTransaction;
8-
use owner::OwnerKind;
9-
use pagination::Paginate;
10-
use schema::*;
8+
use controllers::helpers::Paginate;
119
use user::RequestUser;
1210
use util::{CargoResult, RequestUtils};
13-
use {Badge, Version};
1411

15-
use super::{canon_crate_name, Crate, EncodableCrate, ALL_COLUMNS};
12+
use views::EncodableCrate;
13+
use models::{Badge, Crate, OwnerKind, Version};
14+
use schema::*;
15+
16+
use super::{canon_crate_name, ALL_COLUMNS};
1617

1718
/// Handles the `GET /crates` route.
1819
/// Returns a list of crates. Called in a variety of scenarios in the

src/lib.rs

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -51,15 +51,7 @@ extern crate conduit_static;
5151
extern crate cookie;
5252

5353
pub use app::App;
54-
pub use self::badge::Badge;
55-
pub use self::category::Category;
5654
pub use config::Config;
57-
pub use self::dependency::Dependency;
58-
pub use self::download::VersionDownload;
59-
pub use self::keyword::Keyword;
60-
pub use self::krate::Crate;
61-
pub use self::user::User;
62-
pub use self::version::Version;
6355
pub use self::uploaders::{Bomb, Uploader};
6456

6557
use std::sync::Arc;
@@ -89,16 +81,18 @@ pub mod owner;
8981
pub mod render;
9082
pub mod schema;
9183
pub mod token;
92-
pub mod upload;
9384
pub mod uploaders;
9485
pub mod user;
9586
pub mod util;
9687
pub mod version;
9788
pub mod email;
9889
pub mod site_metadata;
9990

91+
pub mod controllers;
92+
pub mod models;
93+
pub mod views;
94+
10095
mod local_upload;
101-
mod pagination;
10296
mod with_count;
10397

10498
/// Used for setting different values depending on whether the app is being run in production,

0 commit comments

Comments
 (0)