Added support for multiple languages

This commit is contained in:
2024-04-16 16:02:48 +03:00
parent aded63f9d5
commit c5855fced7
52 changed files with 973 additions and 409 deletions

View File

@ -0,0 +1,3 @@
-- Add down migration script here
ALTER TABLE master_pass
DROP COLUMN locale;

View File

@ -0,0 +1,3 @@
-- Add up migration script here
ALTER TABLE master_pass
ADD COLUMN locale SMALLINT UNSIGNED NOT NULL DEFAULT 1;

View File

@ -2,6 +2,7 @@
#![allow(clippy::missing_errors_doc)]
pub mod account;
pub mod locale;
pub mod master_pass;
pub mod prelude;

50
entity/src/locale.rs Normal file
View File

@ -0,0 +1,50 @@
use crate::prelude::*;
use sqlx::{mysql::MySqlQueryResult as QueryResult, query, query_as};
#[derive(Clone, Copy, Default)]
#[allow(clippy::module_name_repetitions)]
pub enum LocaleType {
#[default]
Eng = 1,
Ru = 2,
}
impl TryFrom<u8> for LocaleType {
type Error = ();
fn try_from(value: u8) -> Result<Self, Self::Error> {
match value {
1 => Ok(Self::Eng),
2 => Ok(Self::Ru),
_ => Err(()),
}
}
}
impl From<LocaleType> for u8 {
fn from(value: LocaleType) -> Self {
value as Self
}
}
impl LocaleType {
pub async fn get_from_db(user_id: u64, db: &Pool) -> crate::Result<Option<Self>> {
let result: Option<(u8,)> = query_as("SELECT locale FROM master_pass WHERE user_id = ?")
.bind(user_id)
.fetch_optional(db)
.await?;
Ok(result.and_then(|val| val.0.try_into().ok()))
}
pub async fn update(self, user_id: u64, db: &Pool) -> crate::Result<bool> {
let result: QueryResult = query!(
"UPDATE master_pass SET locale = ? WHERE user_id = ?",
u8::from(self),
user_id
)
.execute(db)
.await?;
Ok(result.rows_affected() == 1)
}
}

View File

@ -1,4 +1,4 @@
use super::Pool;
use crate::{locale::LocaleType, Pool};
use sqlx::{prelude::FromRow, query, query_as, Executor, MySql};
#[derive(Clone, Debug, PartialEq, FromRow, Eq)]
@ -11,12 +11,14 @@ pub struct MasterPass {
impl MasterPass {
// Inserts the master password into DB
#[inline]
pub async fn insert(&self, pool: &Pool) -> crate::Result<()> {
pub async fn insert(&self, pool: &Pool, locale: LocaleType) -> crate::Result<()> {
let locale: u8 = locale.into();
query!(
"INSERT INTO master_pass VALUES (?, ?, ?)",
"INSERT INTO master_pass VALUES (?, ?, ?, ?)",
self.user_id,
self.salt,
self.password_hash
self.password_hash,
locale
)
.execute(pool)
.await
@ -26,7 +28,7 @@ impl MasterPass {
/// Gets the master password from the database
#[inline]
pub async fn get(user_id: u64, pool: &Pool) -> crate::Result<Option<Self>> {
query_as("SELECT * FROM master_pass WHERE user_id = ?")
query_as("SELECT user_id, salt, password_hash FROM master_pass WHERE user_id = ?")
.bind(user_id)
.fetch_optional(pool)
.await