add basic chapter content view
This commit is contained in:
parent
be6b86ee28
commit
107ad5dfa5
5 changed files with 54 additions and 48 deletions
|
@ -1,18 +0,0 @@
|
||||||
use actix_web::{get, web, Scope};
|
|
||||||
|
|
||||||
/// scope to handle all reading related pages
|
|
||||||
pub fn reading_scope() -> Scope {
|
|
||||||
web::scope("/b").service(book_view).service(chapter_view)
|
|
||||||
}
|
|
||||||
|
|
||||||
/// route to view info for a specific book
|
|
||||||
#[get("/{book}")]
|
|
||||||
async fn book_view(book: web::Path<String>) -> String {
|
|
||||||
format!("This is the info for {book}")
|
|
||||||
}
|
|
||||||
|
|
||||||
/// view for reading a chapter
|
|
||||||
#[get("/{book}/{chapter})")]
|
|
||||||
async fn chapter_view(path: web::Path<(String, String)>) -> String {
|
|
||||||
format!("This is {} of {}", path.0, path.1)
|
|
||||||
}
|
|
|
@ -8,7 +8,7 @@ mod sqlite;
|
||||||
|
|
||||||
/// Utility for interacting with the database
|
/// Utility for interacting with the database
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub enum DataBase {
|
pub enum DbInterface {
|
||||||
/// Used for Sqlite database
|
/// Used for Sqlite database
|
||||||
Sqlite(sqlx::Pool<Sqlite>),
|
Sqlite(sqlx::Pool<Sqlite>),
|
||||||
/// Used for Postgres database
|
/// Used for Postgres database
|
||||||
|
@ -33,7 +33,7 @@ impl From<sqlx::Error> for DbError {
|
||||||
}
|
}
|
||||||
type DbResult<T> = Result<T, DbError>;
|
type DbResult<T> = Result<T, DbError>;
|
||||||
|
|
||||||
impl DataBase {
|
impl DbInterface {
|
||||||
/// Database backed by SQLite
|
/// Database backed by SQLite
|
||||||
pub async fn sqlite() -> Self {
|
pub async fn sqlite() -> Self {
|
||||||
// Check if db exists, if not create it.
|
// Check if db exists, if not create it.
|
||||||
|
@ -88,63 +88,63 @@ impl DataBase {
|
||||||
/// Tries to fetch a book from the database
|
/// Tries to fetch a book from the database
|
||||||
pub async fn get_book(&self, id: u32) -> DbResult<models::Book> {
|
pub async fn get_book(&self, id: u32) -> DbResult<models::Book> {
|
||||||
match self {
|
match self {
|
||||||
DataBase::Sqlite(pool) => sqlite::sqlite_book(pool, id).await,
|
DbInterface::Sqlite(pool) => sqlite::sqlite_book(pool, id).await,
|
||||||
DataBase::Postgres(pool) => todo!(),
|
DbInterface::Postgres(pool) => todo!(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Tries to create a book and returns the book's id if successful
|
/// Tries to create a book and returns the book's id if successful
|
||||||
pub async fn create_book(
|
pub async fn create_book(
|
||||||
&self,
|
&self,
|
||||||
title: String,
|
title: &String,
|
||||||
description: String,
|
description: &String,
|
||||||
author_id: u32,
|
author_id: u32,
|
||||||
) -> DbResult<u32> {
|
) -> DbResult<u32> {
|
||||||
match self {
|
match self {
|
||||||
DataBase::Sqlite(pool) => {
|
DbInterface::Sqlite(pool) => {
|
||||||
sqlite::sqlite_book_create(pool, title, description, author_id).await
|
sqlite::sqlite_book_create(pool, title, description, author_id).await
|
||||||
}
|
}
|
||||||
DataBase::Postgres(pool) => todo!(),
|
DbInterface::Postgres(pool) => todo!(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Tries to fetch a chapter from the database
|
/// Tries to fetch a chapter from the database
|
||||||
pub async fn get_chapter(&self, id: u32) -> DbResult<models::Chapter> {
|
pub async fn get_chapter(&self, id: u32) -> DbResult<models::Chapter> {
|
||||||
match self {
|
match self {
|
||||||
DataBase::Sqlite(pool) => sqlite::sqlite_chapter(pool, id).await,
|
DbInterface::Sqlite(pool) => sqlite::sqlite_chapter(pool, id).await,
|
||||||
DataBase::Postgres(pool) => todo!(),
|
DbInterface::Postgres(pool) => todo!(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Tries to create a chapter and returns the chapter's id if successfu
|
/// Tries to create a chapter and returns the chapter's id if successfu
|
||||||
pub async fn create_chapter(
|
pub async fn create_chapter(
|
||||||
&self,
|
&self,
|
||||||
title: String,
|
title: &String,
|
||||||
text: String,
|
text: &String,
|
||||||
book_id: u32,
|
book_id: u32,
|
||||||
author_id: u32,
|
author_id: u32,
|
||||||
) -> DbResult<u32> {
|
) -> DbResult<u32> {
|
||||||
match self {
|
match self {
|
||||||
DataBase::Sqlite(pool) => {
|
DbInterface::Sqlite(pool) => {
|
||||||
sqlite::sqlite_chapter_create(pool, title, text, book_id, author_id).await
|
sqlite::sqlite_chapter_create(pool, title, text, book_id, author_id).await
|
||||||
}
|
}
|
||||||
DataBase::Postgres(pool) => todo!(),
|
DbInterface::Postgres(pool) => todo!(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Tries to fetch a user from the database
|
/// Tries to fetch a user from the database
|
||||||
pub async fn get_user(&self, id: u32) -> DbResult<models::User> {
|
pub async fn get_user(&self, id: u32) -> DbResult<models::User> {
|
||||||
match self {
|
match self {
|
||||||
DataBase::Sqlite(pool) => sqlite::sqlite_user(pool, id).await,
|
DbInterface::Sqlite(pool) => sqlite::sqlite_user(pool, id).await,
|
||||||
DataBase::Postgres(pool) => todo!(),
|
DbInterface::Postgres(pool) => todo!(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Tries to create a user and returns the user's id if successful
|
/// Tries to create a user and returns the user's id if successful
|
||||||
pub async fn create_user(&self, name: String) -> DbResult<u32> {
|
pub async fn create_user(&self, name: &String) -> DbResult<u32> {
|
||||||
match self {
|
match self {
|
||||||
DataBase::Sqlite(pool) => sqlite::sqlite_user_create(pool, name).await,
|
DbInterface::Sqlite(pool) => sqlite::sqlite_user_create(pool, name).await,
|
||||||
DataBase::Postgres(pool) => todo!(),
|
DbInterface::Postgres(pool) => todo!(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,8 +23,8 @@ pub async fn sqlite_book(pool: &Pool<Sqlite>, id: u32) -> DbResult<Book> {
|
||||||
|
|
||||||
pub async fn sqlite_book_create(
|
pub async fn sqlite_book_create(
|
||||||
pool: &Pool<Sqlite>,
|
pool: &Pool<Sqlite>,
|
||||||
title: String,
|
title: &String,
|
||||||
description: String,
|
description: &String,
|
||||||
author_id: u32,
|
author_id: u32,
|
||||||
) -> DbResult<u32> {
|
) -> DbResult<u32> {
|
||||||
let id = sqlx::query("INSERT INTO books (title, description, author_id, book_creation_date) VALUES ( ?1, ?2, ?3, ?4 )")
|
let id = sqlx::query("INSERT INTO books (title, description, author_id, book_creation_date) VALUES ( ?1, ?2, ?3, ?4 )")
|
||||||
|
@ -57,8 +57,8 @@ pub async fn sqlite_chapter(pool: &Pool<Sqlite>, id: u32) -> DbResult<Chapter> {
|
||||||
|
|
||||||
pub async fn sqlite_chapter_create(
|
pub async fn sqlite_chapter_create(
|
||||||
pool: &Pool<Sqlite>,
|
pool: &Pool<Sqlite>,
|
||||||
title: String,
|
title: &String,
|
||||||
text: String,
|
text: &String,
|
||||||
book_id: u32,
|
book_id: u32,
|
||||||
author_id: u32,
|
author_id: u32,
|
||||||
) -> DbResult<u32> {
|
) -> DbResult<u32> {
|
||||||
|
@ -89,7 +89,7 @@ pub async fn sqlite_user(pool: &Pool<Sqlite>, id: u32) -> DbResult<User> {
|
||||||
Ok(user)
|
Ok(user)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn sqlite_user_create(pool: &Pool<Sqlite>, name: String) -> DbResult<u32> {
|
pub async fn sqlite_user_create(pool: &Pool<Sqlite>, name: &String) -> DbResult<u32> {
|
||||||
let id = sqlx::query("INSERT INTO users (name) VALUES ( ? )")
|
let id = sqlx::query("INSERT INTO users (name) VALUES ( ? )")
|
||||||
.bind(name)
|
.bind(name)
|
||||||
.execute(pool)
|
.execute(pool)
|
||||||
|
|
12
src/main.rs
12
src/main.rs
|
@ -1,9 +1,9 @@
|
||||||
use actix_web::{get, App, HttpServer};
|
use actix_web::{get, web, App, HttpServer};
|
||||||
use log::info;
|
use log::info;
|
||||||
|
|
||||||
mod books;
|
|
||||||
mod config;
|
mod config;
|
||||||
mod db;
|
mod db;
|
||||||
|
mod reading;
|
||||||
|
|
||||||
#[actix_web::main]
|
#[actix_web::main]
|
||||||
async fn main() -> Result<(), std::io::Error> {
|
async fn main() -> Result<(), std::io::Error> {
|
||||||
|
@ -13,14 +13,14 @@ async fn main() -> Result<(), std::io::Error> {
|
||||||
.init();
|
.init();
|
||||||
|
|
||||||
let config = config::parse_config();
|
let config = config::parse_config();
|
||||||
let db = db::DataBase::sqlite().await;
|
let db = db::DbInterface::sqlite().await;
|
||||||
|
|
||||||
info!("Server starting...");
|
info!("Server starting...");
|
||||||
HttpServer::new(move || {
|
HttpServer::new(move || {
|
||||||
App::new()
|
App::new()
|
||||||
.app_data(config)
|
.app_data(web::Data::new(config))
|
||||||
.app_data(db.clone())
|
.app_data(web::Data::new(db.clone()))
|
||||||
.service(books::reading_scope())
|
.service(reading::reading_scope())
|
||||||
.service(hello)
|
.service(hello)
|
||||||
})
|
})
|
||||||
.bind((config.binding_ip, config.port))?
|
.bind((config.binding_ip, config.port))?
|
||||||
|
|
24
src/reading/mod.rs
Normal file
24
src/reading/mod.rs
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
use actix_web::{get, web, Scope};
|
||||||
|
|
||||||
|
use crate::db::DbInterface;
|
||||||
|
|
||||||
|
/// scope to handle all reading related pages
|
||||||
|
pub fn reading_scope() -> Scope {
|
||||||
|
web::scope("/r").service(book_view).service(chapter_view)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// route to view info for a specific book
|
||||||
|
#[get("/b/{book}")]
|
||||||
|
async fn book_view(book: web::Path<u32>, db: web::Data<DbInterface>) -> Option<String> {
|
||||||
|
Some(format!(
|
||||||
|
"This is the info for {}",
|
||||||
|
db.get_book(*book).await.ok()?.title
|
||||||
|
))
|
||||||
|
}
|
||||||
|
|
||||||
|
/// view for reading a chapter
|
||||||
|
#[get("/c/{chapter})")]
|
||||||
|
async fn chapter_view(id: web::Path<u32>, db: web::Data<DbInterface>) -> Option<String> {
|
||||||
|
let chapter = db.get_chapter(*id).await.ok()?;
|
||||||
|
Some(format!("Text: {}", chapter.text))
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue