|
6 | 6 |
|
7 | 7 | use crate::controllers::prelude::*;
|
8 | 8 | use crate::models::{
|
9 |
| - Category, Crate, CrateCategory, CrateDownload, CrateKeyword, CrateVersions, Keyword, Version, |
| 9 | + Category, Crate, CrateCategory, CrateDownload, CrateKeyword, CrateVersions, Keyword, User, |
| 10 | + Version, |
10 | 11 | };
|
11 | 12 | use crate::schema::*;
|
12 | 13 | use crate::views::{
|
@@ -106,9 +107,13 @@ pub fn show(req: &mut dyn Request) -> CargoResult<Response> {
|
106 | 107 | let conn = req.db_conn()?;
|
107 | 108 | let krate = Crate::by_name(name).first::<Crate>(&*conn)?;
|
108 | 109 |
|
109 |
| - let mut versions = krate.all_versions().load::<Version>(&*conn)?; |
110 |
| - versions.sort_by(|a, b| b.num.cmp(&a.num)); |
111 |
| - let ids = versions.iter().map(|v| v.id).collect(); |
| 110 | + let mut versions_and_publishers: Vec<(Version, Option<User>)> = krate |
| 111 | + .all_versions() |
| 112 | + .left_outer_join(users::table) |
| 113 | + .select((versions::all_columns, users::all_columns.nullable())) |
| 114 | + .load(&*conn)?; |
| 115 | + versions_and_publishers.sort_by(|a, b| b.0.num.cmp(&a.0.num)); |
| 116 | + let ids = versions_and_publishers.iter().map(|v| v.0.id).collect(); |
112 | 117 |
|
113 | 118 | let kws = CrateKeyword::belonging_to(&krate)
|
114 | 119 | .inner_join(keywords::table)
|
@@ -146,9 +151,9 @@ pub fn show(req: &mut dyn Request) -> CargoResult<Response> {
|
146 | 151 | false,
|
147 | 152 | recent_downloads,
|
148 | 153 | ),
|
149 |
| - versions: versions |
| 154 | + versions: versions_and_publishers |
150 | 155 | .into_iter()
|
151 |
| - .map(|v| v.encodable(&krate.name)) |
| 156 | + .map(|(v, pb)| v.encodable(&krate.name, pb)) |
152 | 157 | .collect(),
|
153 | 158 | keywords: kws.into_iter().map(|k| k.encodable()).collect(),
|
154 | 159 | categories: cats.into_iter().map(|k| k.encodable()).collect(),
|
@@ -185,11 +190,15 @@ pub fn versions(req: &mut dyn Request) -> CargoResult<Response> {
|
185 | 190 | let crate_name = &req.params()["crate_id"];
|
186 | 191 | let conn = req.db_conn()?;
|
187 | 192 | let krate = Crate::by_name(crate_name).first::<Crate>(&*conn)?;
|
188 |
| - let mut versions = krate.all_versions().load::<Version>(&*conn)?; |
189 |
| - versions.sort_by(|a, b| b.num.cmp(&a.num)); |
190 |
| - let versions = versions |
| 193 | + let mut versions_and_publishers: Vec<(Version, Option<User>)> = krate |
| 194 | + .all_versions() |
| 195 | + .left_outer_join(users::table) |
| 196 | + .select((versions::all_columns, users::all_columns.nullable())) |
| 197 | + .load(&*conn)?; |
| 198 | + versions_and_publishers.sort_by(|a, b| b.0.num.cmp(&a.0.num)); |
| 199 | + let versions = versions_and_publishers |
191 | 200 | .into_iter()
|
192 |
| - .map(|v| v.encodable(crate_name)) |
| 201 | + .map(|(v, pb)| v.encodable(crate_name, pb)) |
193 | 202 | .collect();
|
194 | 203 |
|
195 | 204 | #[derive(Serialize)]
|
@@ -218,10 +227,15 @@ pub fn reverse_dependencies(req: &mut dyn Request) -> CargoResult<Response> {
|
218 | 227 | let versions = versions::table
|
219 | 228 | .filter(versions::id.eq(any(version_ids)))
|
220 | 229 | .inner_join(crates::table)
|
221 |
| - .select((versions::all_columns, crates::name)) |
222 |
| - .load::<(Version, String)>(&*conn)? |
| 230 | + .left_outer_join(users::table) |
| 231 | + .select(( |
| 232 | + versions::all_columns, |
| 233 | + crates::name, |
| 234 | + users::all_columns.nullable(), |
| 235 | + )) |
| 236 | + .load::<(Version, String, Option<User>)>(&*conn)? |
223 | 237 | .into_iter()
|
224 |
| - .map(|(version, krate_name)| version.encodable(&krate_name)) |
| 238 | + .map(|(version, krate_name, published_by)| version.encodable(&krate_name, published_by)) |
225 | 239 | .collect();
|
226 | 240 |
|
227 | 241 | #[derive(Serialize)]
|
|
0 commit comments