feat(cli): add command to generate signup links
							parent
							
								
									722317603d
								
							
						
					
					
						commit
						4d44216e17
					
				| 
						 | 
					@ -7,9 +7,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## [Unreleased](https://git.rustybever.be/Chewing_Bever/otter)
 | 
					## [Unreleased](https://git.rustybever.be/Chewing_Bever/otter)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
* CLI command to add new users
 | 
					 | 
				
			||||||
* Public sign-up page (disabled by default)
 | 
					* Public sign-up page (disabled by default)
 | 
				
			||||||
* Private sign-up links
 | 
					* Private sign-up links
 | 
				
			||||||
 | 
					* New CLI commands
 | 
				
			||||||
 | 
					    * Add users
 | 
				
			||||||
 | 
					    * Generate signup links
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## [0.2.1](https://git.rustybever.be/Chewing_Bever/otter/src/tag/0.2.1)
 | 
					## [0.2.1](https://git.rustybever.be/Chewing_Bever/otter/src/tag/0.2.1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,3 @@
 | 
				
			||||||
use chrono::Utc;
 | 
					 | 
				
			||||||
use rand::Rng;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
use crate::{AuthErr, Page, models};
 | 
					use crate::{AuthErr, Page, models};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// Admin view of the repository, providing methods only allowed by admins
 | 
					/// Admin view of the repository, providing methods only allowed by admins
 | 
				
			||||||
| 
						 | 
					@ -17,16 +14,4 @@ impl<'a> AdminRepository<'a> {
 | 
				
			||||||
    ) -> Result<Vec<models::User>, AuthErr> {
 | 
					    ) -> Result<Vec<models::User>, AuthErr> {
 | 
				
			||||||
        self.store.paginated_users(page, filter)
 | 
					        self.store.paginated_users(page, filter)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
    /// Generate a new unique signup link ID
 | 
					 | 
				
			||||||
    pub fn generate_signup_link(&self) -> Result<models::SignupLink, AuthErr> {
 | 
					 | 
				
			||||||
        let link = models::SignupLink {
 | 
					 | 
				
			||||||
            id: rand::thread_rng().r#gen(),
 | 
					 | 
				
			||||||
            time_created: Utc::now(),
 | 
					 | 
				
			||||||
        };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        self.store.insert_signup_link(&link)?;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        Ok(link)
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,7 +5,7 @@ use std::sync::Arc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use argon2::{Argon2, PasswordHash, PasswordHasher, PasswordVerifier, password_hash::SaltString};
 | 
					use argon2::{Argon2, PasswordHash, PasswordHasher, PasswordVerifier, password_hash::SaltString};
 | 
				
			||||||
use chrono::{TimeDelta, Utc};
 | 
					use chrono::{TimeDelta, Utc};
 | 
				
			||||||
use rand::rngs::OsRng;
 | 
					use rand::{Rng, rngs::OsRng};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use crate::{
 | 
					use crate::{
 | 
				
			||||||
    SignupLink, models,
 | 
					    SignupLink, models,
 | 
				
			||||||
| 
						 | 
					@ -126,4 +126,16 @@ impl GpodderRepository {
 | 
				
			||||||
    pub fn remove_signup_link(&self, id: i64) -> Result<bool, AuthErr> {
 | 
					    pub fn remove_signup_link(&self, id: i64) -> Result<bool, AuthErr> {
 | 
				
			||||||
        self.store.remove_signup_link(id)
 | 
					        self.store.remove_signup_link(id)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /// Generate a new unique signup link ID
 | 
				
			||||||
 | 
					    pub fn generate_signup_link(&self) -> Result<models::SignupLink, AuthErr> {
 | 
				
			||||||
 | 
					        let link = models::SignupLink {
 | 
				
			||||||
 | 
					            id: rand::thread_rng().r#gen(),
 | 
				
			||||||
 | 
					            time_created: Utc::now(),
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self.store.insert_signup_link(&link)?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Ok(link)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -18,7 +18,10 @@ pub enum Command {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#[derive(Subcommand)]
 | 
					#[derive(Subcommand)]
 | 
				
			||||||
pub enum UserCommand {
 | 
					pub enum UserCommand {
 | 
				
			||||||
 | 
					    /// Add a new user
 | 
				
			||||||
    Add { username: String, password: String },
 | 
					    Add { username: String, password: String },
 | 
				
			||||||
 | 
					    /// Generate a signup link ID
 | 
				
			||||||
 | 
					    GenerateSignupLink,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
impl Command {
 | 
					impl Command {
 | 
				
			||||||
| 
						 | 
					@ -59,6 +62,11 @@ impl UserCommand {
 | 
				
			||||||
            Self::Add { username, password } => {
 | 
					            Self::Add { username, password } => {
 | 
				
			||||||
                store.create_user(username, password)?;
 | 
					                store.create_user(username, password)?;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					            Self::GenerateSignupLink => {
 | 
				
			||||||
 | 
					                let link = store.generate_signup_link()?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                println!("/signup/{}", link.id);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        Ok(())
 | 
					        Ok(())
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue