Added support for multiple languages
This commit is contained in:
3
entity/migrations/0002_locales.down.sql
Normal file
3
entity/migrations/0002_locales.down.sql
Normal file
@ -0,0 +1,3 @@
|
||||
-- Add down migration script here
|
||||
ALTER TABLE master_pass
|
||||
DROP COLUMN locale;
|
3
entity/migrations/0002_locales.up.sql
Normal file
3
entity/migrations/0002_locales.up.sql
Normal file
@ -0,0 +1,3 @@
|
||||
-- Add up migration script here
|
||||
ALTER TABLE master_pass
|
||||
ADD COLUMN locale SMALLINT UNSIGNED NOT NULL DEFAULT 1;
|
@ -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
50
entity/src/locale.rs
Normal 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)
|
||||
}
|
||||
}
|
@ -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
|
||||
|
Reference in New Issue
Block a user