Move api routes to /api and add /api/sessions

This commit is contained in:
2021-04-21 17:38:47 +02:00
parent 5fa1819bea
commit 5c43bb409e
12 changed files with 66 additions and 9 deletions

4
Cargo.lock generated
View File

@ -1,5 +1,7 @@
# This file is automatically @generated by Cargo. # This file is automatically @generated by Cargo.
# It is not intended for manual editing. # It is not intended for manual editing.
version = 3
[[package]] [[package]]
name = "addr2line" name = "addr2line"
version = "0.13.0" version = "0.13.0"
@ -1879,7 +1881,7 @@ checksum = "213701ba3370744dcd1a12960caa4843b3d68b4d1c0a5d575e0d65b2ee9d16c0"
[[package]] [[package]]
name = "stl" name = "stl"
version = "2.3.0" version = "2.4.0"
dependencies = [ dependencies = [
"bincode", "bincode",
"chrono", "chrono",

View File

@ -1,7 +1,7 @@
[package] [package]
name = "stl" name = "stl"
description = "studielogg aka scuffed toggl" description = "studielogg aka scuffed toggl"
version = "2.3.0" version = "2.4.0"
authors = ["Joakim Hulthe <joakim@hulthe.net>"] authors = ["Joakim Hulthe <joakim@hulthe.net>"]
license = "MPL-2.0" license = "MPL-2.0"
edition = "2018" edition = "2018"

0
src/database/category.rs Normal file
View File

View File

@ -1,4 +1,5 @@
pub mod unversioned; pub mod unversioned;
pub mod util;
pub mod v1; pub mod v1;
pub mod v2; pub mod v2;

View File

@ -0,0 +1,10 @@
use std::collections::HashMap;
use crate::database::v2;
pub fn get_category() -> () {
todo!()
}
pub fn get_all_categories() -> Result<HashMap< {
todo!()
}

View File

@ -0,0 +1,25 @@
use crate::database::latest::trees::categories;
use crate::status_json::StatusJson;
use bincode::{deserialize, serialize};
use std::collections::HashMap;
pub fn get_category(
tree: &sled::Tree,
key: &categories::K,
) -> Result<Option<categories::V>, StatusJson> {
Ok(match tree.get(serialize(key)?)? {
Some(raw) => Some(deserialize(&raw)?),
None => None,
})
}
pub fn get_all_categories(
tree: &sled::Tree,
) -> Result<HashMap<categories::K, categories::V>, StatusJson> {
Ok(tree
.iter()
.map(|result| {
result.map(|(k, v)| deserialize(&k).and_then(|k| deserialize(&v).map(|v| (k, v))))
})
.collect::<Result<Result<_, _>, _>>()??)
}

1
src/database/util/mod.rs Normal file
View File

@ -0,0 +1 @@
pub mod category;

View File

@ -61,7 +61,13 @@ async fn main() -> io::Result<()> {
routes::pages::session_edit, routes::pages::session_edit,
routes::pages::stats::single_stats, routes::pages::stats::single_stats,
routes::pages::stats::all_stats, routes::pages::stats::all_stats,
],
)
.mount(
"/api",
rocket::routes![
routes::api::edit_session, routes::api::edit_session,
routes::api::get_sessions,
routes::api::create_category, routes::api::create_category,
routes::api::start_session, routes::api::start_session,
routes::api::end_session, routes::api::end_session,

View File

@ -1,5 +1,6 @@
use crate::auth::Authorized; use crate::auth::Authorized;
use crate::database::latest::trees::{categories, sessions}; use crate::database::latest::trees::{categories, sessions};
use crate::database::util::category::get_all_categories;
use crate::routes::pages; use crate::routes::pages;
use crate::status_json::StatusJson; use crate::status_json::StatusJson;
use bincode::{deserialize, serialize}; use bincode::{deserialize, serialize};
@ -7,9 +8,20 @@ use chrono::{Duration, Local, NaiveDateTime, TimeZone};
use rocket::http::Status; use rocket::http::Status;
use rocket::request::{Form, FromForm}; use rocket::request::{Form, FromForm};
use rocket::response::Redirect; use rocket::response::Redirect;
use rocket::{post, uri, State}; use rocket::{get, post, uri, State};
use rocket_contrib::json::Json;
use rocket_contrib::uuid::Uuid; use rocket_contrib::uuid::Uuid;
use sled::Transactional; use sled::Transactional;
use std::collections::HashMap;
#[get("/sessions")]
pub fn get_sessions(
_auth: Authorized,
db: State<'_, sled::Db>,
) -> Result<Json<HashMap<categories::K, categories::V>>, StatusJson> {
let categories_tree = db.open_tree(categories::NAME)?;
Ok(Json(get_all_categories(&categories_tree)?))
}
#[derive(FromForm)] #[derive(FromForm)]
pub struct NewCategory { pub struct NewCategory {

View File

@ -8,7 +8,7 @@
<a href="/history">tillbaka</a> <a href="/history">tillbaka</a>
<br> <br>
<br> <br>
<form action="/session/{{session_id}}/edit" method="post"> <form action="/api/session/{{session_id}}/edit" method="post">
<input type="hidden" id="category" name="category" value="{{session.category}}"> <input type="hidden" id="category" name="category" value="{{session.category}}">
<input type="hidden" id="deleted" name="deleted" value="{{session.deleted}}"> <input type="hidden" id="deleted" name="deleted" value="{{session.deleted}}">
<span>Started:</span> <span>Started:</span>
@ -20,7 +20,7 @@
<button type="submit">spara</button> <button type="submit">spara</button>
</form> </form>
<br> <br>
<form action="/session/{{this.session_id}}/delete" method="post"> <form action="/api/session/{{this.session_id}}/delete" method="post">
<button type="submit">ta bort</button> <button type="submit">ta bort</button>
</form> </form>
</div> </div>

View File

@ -12,10 +12,10 @@
// Get the corresponding route to activate/inactivate the category // Get the corresponding route to activate/inactivate the category
let url; let url;
if(active) { if(active) {
url = "/category/" + id + "/end_session"; url = "/api/category/" + id + "/end_session";
cl.remove(toggled_class); cl.remove(toggled_class);
} else { } else {
url = "/category/" + id + "/start_session"; url = "/api/category/" + id + "/start_session";
cl.add(toggled_class); cl.add(toggled_class);
} }
@ -40,7 +40,7 @@
></div> ></div>
<span class="category_name">{{this.1.name}}</span> <span class="category_name">{{this.1.name}}</span>
{{#if this.1.started}} {{#if this.1.started}}
<form action="/category/{{this.0}}/bump_session/minutes/5", method="post"> <form action="/api/category/{{this.0}}/bump_session/minutes/5", method="post">
<button style="height: 100%; color: green;" type="submit">+5</button> <button style="height: 100%; color: green;" type="submit">+5</button>
</form> </form>
{{/if}} {{/if}}

View File

@ -4,7 +4,7 @@
<body> <body>
<h1 class="title">stl</h1> <h1 class="title">stl</h1>
<h2>Logga in</h2> <h2>Logga in</h2>
<form action="/login" method="post"> <form action="/api/login" method="post">
<input type="password" id="password" name="password"></input> <input type="password" id="password" name="password"></input>
</form> </form>
</body> </body>