Skip to content

Commit ab3ab9e

Browse files
committed
get projects list works
1 parent ad7d5e1 commit ab3ab9e

File tree

6 files changed

+40
-61
lines changed

6 files changed

+40
-61
lines changed

omicron-common/src/api/external/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ pub type CreateResult<T> = Result<T, Error>;
4343
pub type DeleteResult = Result<(), Error>;
4444
/** Result of a list operation that returns an ObjectStream */
4545
pub type ListResult<T> = Result<ObjectStream<T>, Error>;
46+
pub type ListResultVec<T> = Result<Vec<T>, Error>;
4647
/** Result of a lookup operation for the specified type */
4748
pub type LookupResult<T> = Result<T, Error>;
4849
/** Result of an update operation for the specified type */

omicron-nexus/src/db/datastore.rs

Lines changed: 0 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,6 @@ use super::sql::SqlString;
5454
use super::sql::SqlValueSet;
5555
use super::sql::Table;
5656
use super::sql_operations::sql_fetch_page_by;
57-
use super::sql_operations::sql_fetch_page_from_table;
5857
use super::sql_operations::sql_fetch_row_by;
5958
use super::sql_operations::sql_fetch_row_raw;
6059
use super::sql_operations::sql_insert;
@@ -125,34 +124,6 @@ impl DataStore {
125124
sql_row_value(&row, "id")
126125
}
127126

128-
/// List a page of projects by id
129-
pub async fn projects_list_by_id(
130-
&self,
131-
pagparams: &DataPageParams<'_, Uuid>,
132-
) -> ListResult<db::model::Project> {
133-
let client = self.pool.acquire().await?;
134-
sql_fetch_page_from_table::<LookupByUniqueId, Project>(
135-
&client,
136-
(),
137-
pagparams,
138-
)
139-
.await
140-
}
141-
142-
/// List a page of projects by name
143-
pub async fn projects_list_by_name(
144-
&self,
145-
pagparams: &DataPageParams<'_, Name>,
146-
) -> ListResult<db::model::Project> {
147-
let client = self.pool.acquire().await?;
148-
sql_fetch_page_by::<
149-
LookupByUniqueName,
150-
Project,
151-
<Project as Table>::Model,
152-
>(&client, (), pagparams, Project::ALL_COLUMNS)
153-
.await
154-
}
155-
156127
/// Updates a project by name (clobbering update -- no etag)
157128
pub async fn project_update(
158129
&self,

omicron-nexus/src/db/sql_operations.rs

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -67,26 +67,6 @@ where
6767
R::Model::try_from(&row)
6868
}
6969

70-
/// Fetch a page of rows from a table using the specified lookup
71-
pub async fn sql_fetch_page_from_table<'a, L, T>(
72-
client: &'a tokio_postgres::Client,
73-
scope_key: L::ScopeKey,
74-
pagparams: &'a DataPageParams<'a, L::ItemKey>,
75-
) -> ListResult<T::Model>
76-
where
77-
L: LookupKey<'a, T>,
78-
L::ScopeKey: 'a,
79-
T: Table,
80-
{
81-
sql_fetch_page_by::<L, T, T::Model>(
82-
client,
83-
scope_key,
84-
pagparams,
85-
T::ALL_COLUMNS,
86-
)
87-
.await
88-
}
89-
9070
/// Like `fetch_page_from_table`, but the caller can specify which columns
9171
/// to select and how to interpret the row
9272
pub async fn sql_fetch_page_by<'a, L, T, R>(

omicron-nexus/src/http_entrypoints_external.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -163,21 +163,21 @@ async fn projects_get(
163163
let params = ScanByNameOrId::from_query(&query)?;
164164
let field = pagination_field_for_scan_params(params);
165165

166-
let project_stream = match field {
166+
let projects = match field {
167167
PagField::Id => {
168168
let page_selector = data_page_params_nameid_id(&rqctx, &query)?;
169-
nexus.projects_list_by_id(&page_selector).await?
169+
nexus.projects_list_by_id(&page_selector)?
170170
}
171171

172172
PagField::Name => {
173173
let page_selector = data_page_params_nameid_name(&rqctx, &query)?;
174-
nexus.projects_list_by_name(&page_selector).await?
174+
nexus.projects_list_by_name(&page_selector)?
175175
}
176176
};
177177

178-
let view_list =
179-
to_list::<db::model::Project, Project>(project_stream).await;
180-
Ok(HttpResponseOk(ScanByNameOrId::results_page(&query, view_list)?))
178+
// TODO filter out non-ok things like to_list does
179+
let projects = projects.into_iter().map(|p| p.into()).collect();
180+
Ok(HttpResponseOk(ScanByNameOrId::results_page(&query, projects)?))
181181
}
182182

183183
/**

omicron-nexus/src/nexus.rs

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ use omicron_common::api::external::IdentityMetadataCreateParams;
2626
use omicron_common::api::external::InstanceCreateParams;
2727
use omicron_common::api::external::InstanceState;
2828
use omicron_common::api::external::ListResult;
29+
use omicron_common::api::external::ListResultVec;
2930
use omicron_common::api::external::LookupResult;
3031
use omicron_common::api::external::Name;
3132
use omicron_common::api::external::ProjectCreateParams;
@@ -346,18 +347,36 @@ impl Nexus {
346347
.map_err(|e| e.into())
347348
}
348349

349-
pub async fn projects_list_by_name(
350+
pub fn projects_list_by_name(
350351
&self,
351352
pagparams: &DataPageParams<'_, Name>,
352-
) -> ListResult<db::model::Project> {
353-
self.db_datastore.projects_list_by_name(pagparams).await
353+
) -> ListResultVec<db::model::DieselProject> {
354+
use db::diesel_schema::project::dsl::*;
355+
let conn = self.dpool.get().unwrap();
356+
// TODO these are incompatible arm types
357+
// let order = match pagparams.direction {
358+
// PaginationOrder::Ascending => name.asc(),
359+
// PaginationOrder::Descending => name.desc(),
360+
// };
361+
project
362+
.limit(pagparams.limit.get().into())
363+
.order(name.asc())
364+
.load::<db::model::DieselProject>(&*conn)
365+
.map_err(|e| e.into())
354366
}
355367

356-
pub async fn projects_list_by_id(
368+
pub fn projects_list_by_id(
357369
&self,
358370
pagparams: &DataPageParams<'_, Uuid>,
359-
) -> ListResult<db::model::Project> {
360-
self.db_datastore.projects_list_by_id(pagparams).await
371+
) -> ListResultVec<db::model::DieselProject> {
372+
use db::diesel_schema::project::dsl::*;
373+
let conn = self.dpool.get().unwrap();
374+
// TODO figure out order here too
375+
project
376+
.limit(pagparams.limit.get().into())
377+
.order(id.asc())
378+
.load::<db::model::DieselProject>(&*conn)
379+
.map_err(|e| e.into())
361380
}
362381

363382
pub async fn project_delete(&self, name: &Name) -> DeleteResult {

omicron-nexus/tests/test_projects.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use omicron_common::api::external::ProjectCreateParams;
55
use std::convert::TryFrom;
66

77
use dropshot::test_util::object_get;
8+
use dropshot::test_util::objects_list_page;
89
use dropshot::test_util::objects_post;
910
use dropshot::test_util::ClientTestContext;
1011

@@ -32,6 +33,13 @@ async fn test_projects() {
3233
let project: Project = object_get(&client, &p2_url).await;
3334
assert_eq!(project.identity.name, p2_name);
3435

36+
let projects =
37+
objects_list_page::<Project>(client, "/projects").await.items;
38+
assert_eq!(projects.len(), 2);
39+
// alphabetical order for now
40+
assert_eq!(projects[0].identity.name, p2_name);
41+
assert_eq!(projects[1].identity.name, p1_name);
42+
3543
cptestctx.teardown().await;
3644
}
3745

0 commit comments

Comments
 (0)