aboutsummaryrefslogtreecommitdiffstats
path: root/rust/src
diff options
context:
space:
mode:
Diffstat (limited to 'rust/src')
-rw-r--r--rust/src/auth.rs4
-rw-r--r--rust/src/bin/fatcat-auth.rs6
-rw-r--r--rust/src/bin/fatcat-export.rs4
-rw-r--r--rust/src/bin/fatcatd.rs12
-rw-r--r--rust/src/editing.rs9
-rw-r--r--rust/src/endpoint_handlers.rs3
-rw-r--r--rust/src/endpoints.rs4
-rw-r--r--rust/src/entity_crud.rs14
-rw-r--r--rust/src/errors.rs11
-rw-r--r--rust/src/server.rs4
10 files changed, 49 insertions, 22 deletions
diff --git a/rust/src/auth.rs b/rust/src/auth.rs
index e7526389..8e7160bb 100644
--- a/rust/src/auth.rs
+++ b/rust/src/auth.rs
@@ -1,4 +1,8 @@
//! Editor bearer token authentication
+//!
+//! Code for dealing with API bearer tokens (macaroons), which encode the editor identifier as well
+//! as additional constraints (eg, to a particular endpoint or time span). Includes helpers for
+//! role-based authentication (RBAC).
use data_encoding::BASE64;
use macaroon::{Format, Macaroon, Verifier};
diff --git a/rust/src/bin/fatcat-auth.rs b/rust/src/bin/fatcat-auth.rs
index 85132023..0ba543b4 100644
--- a/rust/src/bin/fatcat-auth.rs
+++ b/rust/src/bin/fatcat-auth.rs
@@ -2,9 +2,9 @@
use clap::{App, SubCommand};
-use fatcat::{auth, editing, server};
use fatcat::errors::Result;
use fatcat::identifiers::FatcatId;
+use fatcat::{auth, editing, server};
use std::process;
use std::str::FromStr;
@@ -66,7 +66,9 @@ fn main() -> Result<()> {
}
// Then the ones that do
- let db_conn = server::database_worker_pool()?.get().expect("database pool");
+ let db_conn = server::database_worker_pool()?
+ .get()
+ .expect("database pool");
let confectionary = auth::env_confectionary()?;
match m.subcommand() {
("list-editors", Some(_subm)) => {
diff --git a/rust/src/bin/fatcat-export.rs b/rust/src/bin/fatcat-export.rs
index d6764dc6..0f5d04ac 100644
--- a/rust/src/bin/fatcat-export.rs
+++ b/rust/src/bin/fatcat-export.rs
@@ -15,15 +15,15 @@ use clap::{App, Arg};
use fatcat::entity_crud::*;
use fatcat::errors::Result;
use fatcat::identifiers::FatcatId;
-use fatcat::server::{DbConn, self};
+use fatcat::server::{self, DbConn};
use fatcat_api_spec::models::*;
use std::str::FromStr;
use uuid::Uuid;
-use std::thread;
use crossbeam_channel as channel;
use std::io::prelude::*;
use std::io::{BufReader, BufWriter};
+use std::thread;
const CHANNEL_BUFFER_LEN: usize = 200;
diff --git a/rust/src/bin/fatcatd.rs b/rust/src/bin/fatcatd.rs
index 816ea1f0..75a6f000 100644
--- a/rust/src/bin/fatcatd.rs
+++ b/rust/src/bin/fatcatd.rs
@@ -5,6 +5,8 @@ extern crate slog;
#[macro_use]
extern crate hyper;
+use cadence::prelude::*;
+use cadence::{BufferedUdpMetricSink, QueuingMetricSink, StatsdClient};
use clap::{App, Arg};
use fatcat::errors::Result;
use fatcat::server;
@@ -15,8 +17,6 @@ use iron_slog::{DefaultLogFormatter, LoggerMiddleware};
use sentry::integrations::panic;
use slog::{Drain, Logger};
use std::env;
-use cadence::{StatsdClient, QueuingMetricSink, BufferedUdpMetricSink};
-use cadence::prelude::*;
use std::net::UdpSocket;
// HTTP header middleware
@@ -32,7 +32,6 @@ impl AfterMiddleware for XClacksOverheadMiddleware {
}
}
-
/// Create custom server, wire it to the autogenerated router,
/// and pass it to the web server.
fn main() -> Result<()> {
@@ -70,7 +69,7 @@ fn main() -> Result<()> {
match env::var("FATCAT_STATSD_HOST") {
Err(_) => {
info!(logger, "no metrics recipient configured");
- },
+ }
Ok(host) => {
let port: u16 = match env::var("FATCAT_STATSD_PORT") {
Err(_) => cadence::DEFAULT_PORT,
@@ -80,7 +79,10 @@ fn main() -> Result<()> {
socket.set_nonblocking(true).unwrap();
let udp_sink = BufferedUdpMetricSink::from((host.as_ref(), port), socket).unwrap();
let queuing_sink = QueuingMetricSink::from(udp_sink);
- info!(logger, "sending statsd metrics via UDP to: {}:{}", host, port);
+ info!(
+ logger,
+ "sending statsd metrics via UDP to: {}:{}", host, port
+ );
server.metrics = StatsdClient::from_sink("fatcat.api", queuing_sink);
//server.metrics = StatsdClient::from_udp_host("fatcat.api", (host.as_ref(), port))?;
server.metrics.incr("restart").unwrap();
diff --git a/rust/src/editing.rs b/rust/src/editing.rs
index 9dac30ac..4fca30d6 100644
--- a/rust/src/editing.rs
+++ b/rust/src/editing.rs
@@ -1,8 +1,13 @@
+//! Helpers and types for dealing with the edit lifecycle.
+//!
+//! Does not contain the core code for creating/updating/reading/deleting the Editor, Annotation,
+//! and Changelog objects, which lives under `editing_crud`.
+
use crate::database_models::*;
use crate::database_schema::*;
use crate::entity_crud::EntityCrud;
-use crate::errors::{Result, FatcatError};
-use crate::identifiers::{FatcatId, check_username};
+use crate::errors::{FatcatError, Result};
+use crate::identifiers::{check_username, FatcatId};
use crate::server::DbConn;
use diesel;
use diesel::prelude::*;
diff --git a/rust/src/endpoint_handlers.rs b/rust/src/endpoint_handlers.rs
index 78044054..01b5eb5c 100644
--- a/rust/src/endpoint_handlers.rs
+++ b/rust/src/endpoint_handlers.rs
@@ -1,6 +1,9 @@
//! API endpoint handlers
//!
//! This module contains actual implementations of endpoints with rust-style type signatures.
+//!
+//! The remaining functions here should probably be refactored away. The 'get_release_files' style
+//! functions should go in entity_crud (or some new
use crate::database_models::*;
use crate::database_schema::*;
diff --git a/rust/src/endpoints.rs b/rust/src/endpoints.rs
index 8c7700f1..3a95f746 100644
--- a/rust/src/endpoints.rs
+++ b/rust/src/endpoints.rs
@@ -14,6 +14,7 @@ use crate::entity_crud::{EntityCrud, ExpandFlags, HideFlags};
use crate::errors::*;
use crate::identifiers::FatcatId;
use crate::server::*;
+use cadence::prelude::*;
use diesel::Connection;
use fatcat_api_spec::models;
use fatcat_api_spec::models::*;
@@ -22,7 +23,6 @@ use futures::{self, Future};
use sentry::integrations::failure::capture_fail;
use std::str::FromStr;
use uuid::{self, Uuid};
-use cadence::prelude::*;
// This makes response matching below *much* more terse
use crate::errors::FatcatError::*;
@@ -764,7 +764,7 @@ impl Api for Server {
success: true,
message: "horray!".to_string(),
})
- },
+ }
Err(fe) => generic_auth_err_responses!(fe, AcceptEditgroupResponse),
};
Box::new(futures::done(Ok(ret)))
diff --git a/rust/src/entity_crud.rs b/rust/src/entity_crud.rs
index a0101de8..3d9b5165 100644
--- a/rust/src/entity_crud.rs
+++ b/rust/src/entity_crud.rs
@@ -1,3 +1,10 @@
+//! Create/Update/Read/Delete methods for all entity types
+//!
+//! This module is very large (perhaps it should be split into per-entity files?), but it basically
+//! comes down to implementing the EntityCrud trait for each of the entity types. *All* entity
+//! reads and mutations should go through this file, which defines the mechanics of translation
+//! between the SQL schema and API (swagger) JSON models.
+
use crate::database_models::*;
use crate::database_schema::*;
use crate::editing::EditContext;
@@ -5,7 +12,6 @@ use crate::endpoint_handlers::get_release_files;
use crate::errors::*;
use crate::identifiers::*;
use crate::server::DbConn;
-use chrono;
use diesel::prelude::*;
use diesel::{self, insert_into};
use fatcat_api_spec::models::*;
@@ -295,8 +301,10 @@ macro_rules! generic_db_get_rev {
fn db_get_rev(conn: &DbConn, rev_id: Uuid, hide: HideFlags) -> Result<Self> {
let rev = match $rev_table::table.find(rev_id).first(conn) {
Ok(rev) => rev,
- Err(diesel::result::Error::NotFound) =>
- Err(FatcatError::NotFound(stringify!($rev_table).to_string(), rev_id.to_string()))?,
+ Err(diesel::result::Error::NotFound) => Err(FatcatError::NotFound(
+ stringify!($rev_table).to_string(),
+ rev_id.to_string(),
+ ))?,
Err(e) => Err(e)?,
};
diff --git a/rust/src/errors.rs b/rust/src/errors.rs
index 19ba2f82..ec2b949b 100644
--- a/rust/src/errors.rs
+++ b/rust/src/errors.rs
@@ -116,9 +116,13 @@ impl Into<models::ErrorResponse> for FatcatError {
impl From<diesel::result::Error> for FatcatError {
fn from(inner: diesel::result::Error) -> FatcatError {
match inner {
- diesel::result::Error::NotFound => FatcatError::NotFound("unknown".to_string(), "N/A".to_string()),
- diesel::result::Error::DatabaseError(_, _) => FatcatError::ConstraintViolation(inner.to_string()),
- _ => FatcatError::InternalError(inner.to_string())
+ diesel::result::Error::NotFound => {
+ FatcatError::NotFound("unknown".to_string(), "N/A".to_string())
+ }
+ diesel::result::Error::DatabaseError(_, _) => {
+ FatcatError::ConstraintViolation(inner.to_string())
+ }
+ _ => FatcatError::InternalError(inner.to_string()),
}
}
}
@@ -178,4 +182,3 @@ impl From<failure::Error> for FatcatError {
FatcatError::InternalError(error.to_string())
}
}
-
diff --git a/rust/src/server.rs b/rust/src/server.rs
index c7cfa363..42ae9a07 100644
--- a/rust/src/server.rs
+++ b/rust/src/server.rs
@@ -1,14 +1,14 @@
//! API endpoint handlers
-use crate::auth::{AuthConfectionary, self};
+use crate::auth::{self, AuthConfectionary};
use crate::errors::Result;
+use cadence::{NopMetricSink, StatsdClient};
use chrono;
use diesel;
use diesel::pg::PgConnection;
use diesel::r2d2::ConnectionManager;
use dotenv::dotenv;
use std::env;
-use cadence::{StatsdClient, NopMetricSink};
#[cfg(feature = "postgres")]
embed_migrations!("../migrations/");