Add account type
This commit is contained in:
1
moneymgr_backend/assets/cash.svg
Normal file
1
moneymgr_backend/assets/cash.svg
Normal file
@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3,6H21V18H3V6M12,9A3,3 0 0,1 15,12A3,3 0 0,1 12,15A3,3 0 0,1 9,12A3,3 0 0,1 12,9M7,8A2,2 0 0,1 5,10V14A2,2 0 0,1 7,16H17A2,2 0 0,1 19,14V10A2,2 0 0,1 17,8H7Z" /></svg>
|
After Width: | Height: | Size: 237 B |
1
moneymgr_backend/assets/credit-card.svg
Normal file
1
moneymgr_backend/assets/credit-card.svg
Normal file
@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20,8H4V6H20M20,18H4V12H20M20,4H4C2.89,4 2,4.89 2,6V18A2,2 0 0,0 4,20H20A2,2 0 0,0 22,18V6C22,4.89 21.1,4 20,4Z" /></svg>
|
After Width: | Height: | Size: 190 B |
1
moneymgr_backend/assets/saving.svg
Normal file
1
moneymgr_backend/assets/saving.svg
Normal file
@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M16,9C20,11 21,18 21,18C21,18 22,22 16,22C10,22 8,22 8,22C2,22 3,18 3,18C3,18 4,11 8,9M14,4L12,2L10,4L6,2L8,7H16L18,2L14,4Z" /></svg>
|
After Width: | Height: | Size: 202 B |
@ -43,6 +43,7 @@ CREATE TABLE accounts
|
||||
user_id INTEGER NOT NULL REFERENCES users ON DELETE CASCADE,
|
||||
time_create BIGINT NOT NULL,
|
||||
time_update BIGINT NOT NULL,
|
||||
type VARCHAR(1) NOT NULL DEFAULT 'C',
|
||||
default_account BOOLEAN NOT NULL DEFAULT false
|
||||
);
|
||||
|
||||
@ -52,7 +53,7 @@ CREATE TABLE movements
|
||||
account_id INTEGER NOT NULL REFERENCES accounts ON DELETE CASCADE,
|
||||
time BIGINT NOT NULL,
|
||||
label VARCHAR(200) NOT NULL,
|
||||
file_id INT REFERENCES files ON DELETE RESTRICT,
|
||||
file_id INT REFERENCES files ON DELETE RESTRICT,
|
||||
amount REAL NOT NULL,
|
||||
checked BOOLEAN NOT NULL DEFAULT false,
|
||||
time_create BIGINT NOT NULL,
|
||||
|
@ -1,5 +1,7 @@
|
||||
//! # Project constants
|
||||
|
||||
use crate::models::accounts::AccountType;
|
||||
|
||||
/// Length of generated tokens
|
||||
pub const TOKENS_LEN: usize = 50;
|
||||
|
||||
@ -24,3 +26,30 @@ pub const MAX_UPLOAD_FILE_SIZE: usize = 15 * 1024 * 1024;
|
||||
|
||||
/// Minimum elapsed time before a file can be deleted by garbage collector (2 hours)
|
||||
pub const MIN_FILE_LIFETIME: u64 = 3600 * 2;
|
||||
|
||||
/// Description of an account type
|
||||
#[derive(serde::Serialize, Debug)]
|
||||
pub struct AccountTypeDesc {
|
||||
label: &'static str,
|
||||
code: AccountType,
|
||||
icon: &'static str,
|
||||
}
|
||||
|
||||
/// Enumeration of accounts types
|
||||
pub const ACCOUNT_TYPES: [AccountTypeDesc; 3] = [
|
||||
AccountTypeDesc {
|
||||
label: "Cash",
|
||||
code: AccountType::Cash,
|
||||
icon: include_str!("../assets/cash.svg"),
|
||||
},
|
||||
AccountTypeDesc {
|
||||
label: "Bank",
|
||||
code: AccountType::Bank,
|
||||
icon: include_str!("../assets/credit-card.svg"),
|
||||
},
|
||||
AccountTypeDesc {
|
||||
label: "Saving",
|
||||
code: AccountType::Saving,
|
||||
icon: include_str!("../assets/saving.svg"),
|
||||
},
|
||||
];
|
||||
|
@ -1,4 +1,5 @@
|
||||
use crate::app_config::AppConfig;
|
||||
use crate::constants::{ACCOUNT_TYPES, AccountTypeDesc};
|
||||
use actix_web::HttpResponse;
|
||||
|
||||
/// Serve robots.txt (disallow ranking)
|
||||
@ -57,6 +58,7 @@ impl Default for ServerConstraints {
|
||||
struct ServerConfig {
|
||||
auth_disabled: bool,
|
||||
oidc_provider_name: &'static str,
|
||||
accounts_types: &'static [AccountTypeDesc],
|
||||
constraints: ServerConstraints,
|
||||
}
|
||||
|
||||
@ -66,6 +68,7 @@ impl Default for ServerConfig {
|
||||
auth_disabled: AppConfig::get().is_auth_disabled(),
|
||||
oidc_provider_name: AppConfig::get().openid_provider().name,
|
||||
constraints: Default::default(),
|
||||
accounts_types: &ACCOUNT_TYPES,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,10 +1,31 @@
|
||||
use crate::models::users::UserID;
|
||||
use crate::schema::*;
|
||||
use diesel::prelude::*;
|
||||
use std::fmt::{Display, Formatter};
|
||||
|
||||
#[derive(Debug, Clone, Copy, serde::Serialize, serde::Deserialize, PartialEq, Eq)]
|
||||
pub struct AccountID(pub i32);
|
||||
|
||||
#[derive(Debug, Clone, Copy, serde::Serialize, serde::Deserialize, PartialEq, Eq)]
|
||||
pub enum AccountType {
|
||||
#[serde(rename = "C")]
|
||||
Cash,
|
||||
#[serde(rename = "B")]
|
||||
Bank,
|
||||
#[serde(rename = "S")]
|
||||
Saving,
|
||||
}
|
||||
|
||||
impl Display for AccountType {
|
||||
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
|
||||
write!(
|
||||
f,
|
||||
"{}",
|
||||
serde_json::to_string(self).unwrap().replace('"', "")
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Queryable, Debug, Clone, serde::Serialize)]
|
||||
pub struct Account {
|
||||
id: i32,
|
||||
@ -12,6 +33,7 @@ pub struct Account {
|
||||
user_id: i32,
|
||||
pub time_create: i64,
|
||||
pub time_update: i64,
|
||||
r#type: String,
|
||||
pub default_account: bool,
|
||||
}
|
||||
|
||||
@ -23,13 +45,22 @@ impl Account {
|
||||
pub fn user_id(&self) -> UserID {
|
||||
UserID(self.user_id)
|
||||
}
|
||||
|
||||
pub fn account_type(&self) -> AccountType {
|
||||
serde_json::from_str(format!("\"{}\"", self.r#type).as_str()).unwrap()
|
||||
}
|
||||
|
||||
pub fn set_account_type(&mut self, t: AccountType) {
|
||||
self.r#type = t.to_string();
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Insertable)]
|
||||
#[derive(Insertable, Debug)]
|
||||
#[diesel(table_name = accounts)]
|
||||
pub struct NewAccount<'a> {
|
||||
pub name: &'a str,
|
||||
pub user_id: i32,
|
||||
pub time_create: i64,
|
||||
pub time_update: i64,
|
||||
pub type_: String,
|
||||
}
|
||||
|
@ -8,6 +8,9 @@ diesel::table! {
|
||||
user_id -> Int4,
|
||||
time_create -> Int8,
|
||||
time_update -> Int8,
|
||||
#[sql_name = "type"]
|
||||
#[max_length = 1]
|
||||
type_ -> Varchar,
|
||||
default_account -> Bool,
|
||||
}
|
||||
}
|
||||
|
@ -1,6 +1,6 @@
|
||||
use crate::connections::db_connection::db;
|
||||
use crate::controllers::server_controller::ServerConstraints;
|
||||
use crate::models::accounts::{Account, AccountID, NewAccount};
|
||||
use crate::models::accounts::{Account, AccountID, AccountType, NewAccount};
|
||||
use crate::models::users::UserID;
|
||||
use crate::schema::accounts;
|
||||
use crate::utils::time_utils::time;
|
||||
@ -10,6 +10,7 @@ use diesel::prelude::*;
|
||||
#[derive(serde::Deserialize)]
|
||||
pub struct UpdateAccountQuery {
|
||||
pub name: String,
|
||||
pub r#type: AccountType,
|
||||
}
|
||||
|
||||
impl UpdateAccountQuery {
|
||||
@ -31,6 +32,7 @@ pub async fn create(user_id: UserID, query: &UpdateAccountQuery) -> anyhow::Resu
|
||||
user_id: user_id.0,
|
||||
time_create: time() as i64,
|
||||
time_update: time() as i64,
|
||||
type_: query.r#type.to_string(),
|
||||
};
|
||||
|
||||
let res: Account = diesel::insert_into(accounts::table)
|
||||
@ -48,6 +50,7 @@ pub async fn update(id: AccountID, q: &UpdateAccountQuery) -> anyhow::Result<()>
|
||||
.set((
|
||||
accounts::dsl::time_update.eq(time() as i64),
|
||||
accounts::dsl::name.eq(&q.name),
|
||||
accounts::dsl::type_.eq(&q.r#type.to_string()),
|
||||
))
|
||||
.execute(&mut db()?)?;
|
||||
|
||||
|
Reference in New Issue
Block a user