From 2cc5ea67ba2c5a7b5e49a4dcceb462d53793cb99 Mon Sep 17 00:00:00 2001 From: Brandon Thomas Date: Sun, 31 May 2020 19:39:03 -0400 Subject: [PATCH] Endpoint to serve sentences as JSON --- Cargo.lock | 2 + tts_service/Cargo.toml | 4 +- .../down.sql | 3 +- .../2020-05-31-184234_create_sentences/up.sql | 4 +- tts_service/src/database/connector.rs | 1 - tts_service/src/database/model.rs | 22 +++++++--- tts_service/src/endpoints/legacy_speak.rs | 2 +- tts_service/src/endpoints/mod.rs | 1 + tts_service/src/endpoints/sentences.rs | 40 +++++++++++++++++++ tts_service/src/main.rs | 2 + tts_service/src/schema.rs | 4 +- 11 files changed, 71 insertions(+), 14 deletions(-) create mode 100644 tts_service/src/endpoints/sentences.rs diff --git a/Cargo.lock b/Cargo.lock index 3e4a65a18b..6163ba47fe 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -536,6 +536,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "num-integer 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -737,6 +738,7 @@ version = "1.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "chrono 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", "diesel_derives 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "mysqlclient-sys 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "percent-encoding 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/tts_service/Cargo.toml b/tts_service/Cargo.toml index 452961b6a0..654da0a43c 100644 --- a/tts_service/Cargo.toml +++ b/tts_service/Cargo.toml @@ -19,8 +19,8 @@ actix-rt = "1.0.0" actix-utils = "1.0.3" actix-web = "2.0.0" anyhow = "1.0.30" -chrono = "0.4.11" -diesel = { version = "1.4.4", features = ["mysql", "r2d2"] } +chrono = { version = "0.4.11", features = ["serde"] } +diesel = { version = "1.4.4", features = ["mysql", "r2d2", "chrono"] } dotenv = "0.15.0" # for diesel env_logger = "0.7.1" hound = "3.4.0" # wav codec diff --git a/tts_service/migrations/2020-05-31-184234_create_sentences/down.sql b/tts_service/migrations/2020-05-31-184234_create_sentences/down.sql index 291a97c5ce..5951346814 100644 --- a/tts_service/migrations/2020-05-31-184234_create_sentences/down.sql +++ b/tts_service/migrations/2020-05-31-184234_create_sentences/down.sql @@ -1 +1,2 @@ --- This file should undo anything in `up.sql` \ No newline at end of file + +DROP TABLE sentences; diff --git a/tts_service/migrations/2020-05-31-184234_create_sentences/up.sql b/tts_service/migrations/2020-05-31-184234_create_sentences/up.sql index b2097d14bc..27991de62d 100644 --- a/tts_service/migrations/2020-05-31-184234_create_sentences/up.sql +++ b/tts_service/migrations/2020-05-31-184234_create_sentences/up.sql @@ -3,8 +3,8 @@ CREATE TABLE sentences ( id INT PRIMARY KEY AUTO_INCREMENT, sentence varchar(1024) NOT NULL, - speaker varchar(15) DEFAULT NULL, - ip_address varchar(30) DEFAULT NULL, + speaker varchar(15) NOT NULL, + ip_address varchar(30) NOT NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, fulltext(sentence), key(ip_address) diff --git a/tts_service/src/database/connector.rs b/tts_service/src/database/connector.rs index a7067fd9b6..8c2013192d 100644 --- a/tts_service/src/database/connector.rs +++ b/tts_service/src/database/connector.rs @@ -1,6 +1,5 @@ use anyhow::Result as AnyhowResult; use diesel::mysql::MysqlConnection; -use diesel::prelude::*; use diesel::r2d2::ConnectionManager; use diesel::r2d2::Pool; use diesel::r2d2::PooledConnection; diff --git a/tts_service/src/database/model.rs b/tts_service/src/database/model.rs index b80f47fd36..edaab2f0aa 100644 --- a/tts_service/src/database/model.rs +++ b/tts_service/src/database/model.rs @@ -1,10 +1,11 @@ -use diesel::prelude::*; -use crate::schema::sentences; use anyhow::Result as AnyhowResult; -use crate::database::connector::DatabaseConnector; -use chrono::NaiveDateTime; +use chrono::{NaiveDateTime, DateTime, Utc}; +use crate::database::connector::{DatabaseConnector, MysqlPooledConnection}; +use crate::schema::sentences; +//use crate::schema::sentences::dsl::*; +use diesel::prelude::*; -#[derive(Queryable)] +#[derive(Queryable, Serialize, Debug)] pub struct Sentence { pub id: i32, pub sentence: String, @@ -31,3 +32,14 @@ impl NewSentence { Ok(()) } } + +impl Sentence { + + pub fn load(db_connector: &DatabaseConnector, limit: i64) -> AnyhowResult> { + let pooled_connection : MysqlPooledConnection = db_connector.get_pooled_connection()?; + let results = sentences::table + .load::(&pooled_connection)?; + Ok(results) + } +} + diff --git a/tts_service/src/endpoints/legacy_speak.rs b/tts_service/src/endpoints/legacy_speak.rs index f0a355bec4..013e868724 100644 --- a/tts_service/src/endpoints/legacy_speak.rs +++ b/tts_service/src/endpoints/legacy_speak.rs @@ -58,7 +58,7 @@ pub async fn legacy_get_speak(request: HttpRequest, info!("Speaker: {}, Text: {}", speaker, text); - let mut app_state = app_state.into_inner(); + let app_state = app_state.into_inner(); // NB: There is also `request.connection_info().remote()`, which contains // proxy info via X-Forwarded-For, etc. diff --git a/tts_service/src/endpoints/mod.rs b/tts_service/src/endpoints/mod.rs index b34e10fb66..a4d0119002 100644 --- a/tts_service/src/endpoints/mod.rs +++ b/tts_service/src/endpoints/mod.rs @@ -3,6 +3,7 @@ pub mod legacy_speak; pub mod liveness; pub mod models; pub mod readiness; +pub mod sentences; pub mod speak; pub mod speakers; pub mod tts; \ No newline at end of file diff --git a/tts_service/src/endpoints/sentences.rs b/tts_service/src/endpoints/sentences.rs new file mode 100644 index 0000000000..0dec3298ea --- /dev/null +++ b/tts_service/src/endpoints/sentences.rs @@ -0,0 +1,40 @@ +use actix_web::web::{ + Data, + Json, +}; +use actix_web::http::StatusCode; +use actix_web::{HttpRequest, get, HttpResponse, Responder, Either}; + +use std::sync::Arc; +use crate::AppState; +use crate::config::{ModelConfigs, Speaker}; +use crate::database::model::Sentence; +use anyhow::Error; + +#[derive(Serialize, Debug)] +pub struct SentencesResult { + sentences: Vec, +} + +#[get("/sentences")] +pub async fn get_sentences( + _request: HttpRequest, + app_state: Data> +) -> Either, std::io::Result>{ + let app_state = app_state.into_inner(); + + let limit = 100; + let sentences = match Sentence::load(&app_state.database_connector, limit) { + Err(e) => { + error!("Couldn't query database for sentences: {:?}", e); + return Either::B(Ok(HttpResponse::build(StatusCode::INTERNAL_SERVER_ERROR) + .content_type("text/plain") + .body("Couldn't query database database"))); + }, + Ok(results) => results, + }; + + Either::A(Json(SentencesResult { + sentences: sentences, + })) +} diff --git a/tts_service/src/main.rs b/tts_service/src/main.rs index c59cb6c489..253c69b247 100644 --- a/tts_service/src/main.rs +++ b/tts_service/src/main.rs @@ -46,6 +46,7 @@ use crate::model::model_cache::ModelCache; use crate::model::old_model::TacoMelModel; use crate::text::text_to_arpabet_encoding; use crate::database::connector::DatabaseConnector; +use crate::endpoints::sentences::get_sentences; const BIND_ADDRESS : &'static str = "BIND_ADDRESS"; const ASSET_DIRECTORY : &'static str = "ASSET_DIRECTORY"; @@ -208,6 +209,7 @@ async fn run_server(app_state: AppState, server_args: ServerArgs) -> std::io::Re .service(get_liveness) .service(get_models) .service(get_speakers) + .service(get_sentences) .app_data(arc.clone()) ) .bind(bind_address)? diff --git a/tts_service/src/schema.rs b/tts_service/src/schema.rs index 65a66bc369..a25dab0aa8 100644 --- a/tts_service/src/schema.rs +++ b/tts_service/src/schema.rs @@ -2,8 +2,8 @@ table! { sentences (id) { id -> Integer, sentence -> Varchar, - speaker -> Nullable, - ip_address -> Nullable, + speaker -> Varchar, + ip_address -> Varchar, created_at -> Datetime, } }