containers index endpoint

This commit is contained in:
Jake Hillion 2022-07-23 18:26:45 +01:00
parent 575f9577a9
commit 896898a216
10 changed files with 139 additions and 27 deletions

72
Cargo.lock generated
View File

@ -514,23 +514,26 @@ dependencies = [
[[package]]
name = "diesel"
version = "1.4.8"
version = "2.0.0-rc.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b28135ecf6b7d446b43e27e225622a038cc4e2930a1022f51cdb97ada19b8e4d"
checksum = "876a12f2d98c35d1dfaf74083664be5bb71606b72f4756f3792cdb1ddb192b46"
dependencies = [
"bitflags",
"byteorder",
"diesel_derives",
"itoa",
"pq-sys",
"r2d2",
"uuid",
]
[[package]]
name = "diesel_derives"
version = "1.4.1"
version = "2.0.0-rc.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "45f5098f628d02a7a0f68ddba586fb61e80edec3bdc1be3b921f4ceec60858d3"
checksum = "2497d9cefebedc40492310f3c94493e1d0bd5b11b5e1bfc0a7f4b106012203ea"
dependencies = [
"proc-macro-error",
"proc-macro2",
"quote",
"syn",
@ -538,10 +541,11 @@ dependencies = [
[[package]]
name = "diesel_migrations"
version = "1.4.0"
version = "2.0.0-rc.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bf3cde8413353dc7f5d72fa8ce0b99a560a359d2c5ef1e5817ca731cd9008f4c"
checksum = "af3e284b00439e362c3f55849a103f38b4c5a9918ae3cf34fca2268b6eb52fef"
dependencies = [
"diesel",
"migrations_internals",
"migrations_macros",
]
@ -867,8 +871,10 @@ dependencies = [
"diesel_migrations",
"log",
"rust-embed",
"serde",
"thiserror",
"tide",
"uuid",
]
[[package]]
@ -942,23 +948,23 @@ checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
[[package]]
name = "migrations_internals"
version = "1.4.1"
version = "2.0.0-rc.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2b4fc84e4af020b837029e017966f86a1c2d5e83e64b589963d5047525995860"
checksum = "e03913f1a1c044aa53b37c8f34011599bbf98914092a0444081555e9ca35022c"
dependencies = [
"diesel",
"serde",
"toml",
]
[[package]]
name = "migrations_macros"
version = "1.4.2"
version = "2.0.0-rc.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9753f12909fd8d923f75ae5c3258cae1ed3c8ec052e1b38c93c21a6d157f789c"
checksum = "9ccfa634200e9de9fe6497f568d54951e933e9e0ddf61058e52e24bda896de48"
dependencies = [
"migrations_internals",
"proc-macro2",
"quote",
"syn",
]
[[package]]
@ -1114,6 +1120,30 @@ dependencies = [
"vcpkg",
]
[[package]]
name = "proc-macro-error"
version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c"
dependencies = [
"proc-macro-error-attr",
"proc-macro2",
"quote",
"syn",
"version_check",
]
[[package]]
name = "proc-macro-error-attr"
version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869"
dependencies = [
"proc-macro2",
"quote",
"version_check",
]
[[package]]
name = "proc-macro-hack"
version = "0.5.19"
@ -1696,6 +1726,15 @@ version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c"
[[package]]
name = "toml"
version = "0.5.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7"
dependencies = [
"serde",
]
[[package]]
name = "typenum"
version = "1.15.0"
@ -1746,6 +1785,15 @@ dependencies = [
"serde",
]
[[package]]
name = "uuid"
version = "1.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dd6469f4314d5f1ffec476e05f17cc9a78bc7a27a6a857842170bdf8d6f98d2f"
dependencies = [
"serde",
]
[[package]]
name = "value-bag"
version = "1.0.0-alpha.9"

View File

@ -11,8 +11,11 @@ thiserror = "1"
async-std = "1"
serde = { version = "1.0", features = ["derive"] }
tide = "0.17.0-beta.1"
diesel = { version = "1.4", features = ["postgres", "r2d2"] }
diesel_migrations = "1.4"
diesel = { version = "2.0.0-rc.1", features = ["postgres", "r2d2", "uuid"] }
diesel_migrations = "2.0.0-rc.1"
uuid = { version = "1.1.2", features = ["serde"] }
rust-embed = { version = "6.2.0", features = ["interpolate-folder-path"]}

View File

@ -0,0 +1,3 @@
-- This file should undo anything in `up.sql`
drop table if exists containers;

View File

@ -0,0 +1,11 @@
-- Your SQL goes here
create table containers
(
id uuid default gen_random_uuid() not null
primary key,
parent uuid
constraint foreign_key_name
references containers,
name varchar not null
);

33
src/api/containers.rs Normal file
View File

@ -0,0 +1,33 @@
use super::State;
use crate::db;
use std::sync::Arc;
use diesel::Queryable;
use serde::Serialize;
use uuid::Uuid;
pub fn setup_routes(mut route: tide::Route<Arc<State>>) {
route.at("/").get(index);
}
#[derive(Queryable, Serialize)]
pub struct Container {
pub id: Uuid,
pub parent: Option<Uuid>,
pub name: String,
}
async fn index(req: tide::Request<Arc<State>>) -> tide::Result {
use db::schema::containers::dsl::*;
use diesel::{QueryDsl, RunQueryDsl};
let mut connection = req.state().db.get().unwrap();
let items: Vec<Container> = containers
.limit(5)
.load::<Container>(&mut connection)
.expect("Error loading containers");
Ok(tide::Body::from_json(&items).unwrap().into())
}

View File

@ -1,17 +1,20 @@
mod containers;
use std::sync::Arc;
use diesel::pg::PgConnection;
use diesel::r2d2::{ConnectionManager, Pool};
pub struct State {
_db: Pool<ConnectionManager<PgConnection>>,
db: Pool<ConnectionManager<PgConnection>>,
}
pub fn serve(db: Pool<ConnectionManager<PgConnection>>) -> tide::Server<Arc<State>> {
let state = Arc::new(State { _db: db });
let state = Arc::new(State { db });
let mut app = tide::with_state(state);
app.at("/hello").get(|_| async { Ok("Hello, Jake!") });
containers::setup_routes(app.at("/containers/"));
app
}

View File

@ -6,5 +6,5 @@ pub enum Error {
Pool(#[from] diesel::r2d2::PoolError),
#[error("database migration failed: {0}")]
Migration(#[from] diesel::migration::RunMigrationsError),
Migration(Box<dyn std::error::Error + Send + Sync>),
}

View File

@ -4,7 +4,6 @@ mod error;
#[rustfmt::skip]
pub mod schema;
use crate::embedded_migrations;
pub use error::Error;
use std::env;
@ -12,13 +11,18 @@ use std::env;
use diesel::pg::PgConnection;
use diesel::r2d2::{ConnectionManager, Pool};
use diesel_migrations::{embed_migrations, EmbeddedMigrations, MigrationHarness};
pub const MIGRATIONS: EmbeddedMigrations = embed_migrations!();
pub(super) fn new() -> Result<Pool<ConnectionManager<PgConnection>>, Error> {
let database_url = env::var("DATABASE_URL").expect("DATABASE_URL must be set");
let pool = Pool::new(ConnectionManager::new(database_url))?;
let pool = Pool::new(ConnectionManager::<PgConnection>::new(database_url))?;
info!("starting db migrations...");
embedded_migrations::run(&pool.get()?)?;
pool.get()?
.run_pending_migrations(MIGRATIONS)
.map_err(|e| Error::Migration(e))?;
info!("db migrations complete");
Ok(pool)

View File

@ -1,6 +1,19 @@
table! {
containers (id) {
id -> Uuid,
parent -> Nullable<Uuid>,
name -> Varchar,
}
}
table! {
users (id) {
id -> Uuid,
nickname -> Varchar,
}
}
allow_tables_to_appear_in_same_query!(
containers,
users,
);

View File

@ -13,12 +13,6 @@ use std::io;
#[macro_use]
extern crate diesel;
// embed diesel migrations
#[macro_use]
extern crate diesel_migrations;
embed_migrations!();
fn main() -> Result<(), io::Error> {
log::with_level(
std::env::var("LOG")