add: littleweb full

This commit is contained in:
trisua 2025-07-08 13:35:23 -04:00
parent 3fc0872867
commit d67e7c9c33
32 changed files with 1699 additions and 71 deletions

View file

@ -1,8 +1,11 @@
use crate::model::{
auth::User,
littleweb::{Domain, DomainData, DomainTld},
permissions::{FinePermission, SecondaryPermission},
Error, Result,
use crate::{
database::NAME_REGEX,
model::{
auth::User,
littleweb::{Domain, DomainData, DomainTld},
permissions::{FinePermission, SecondaryPermission},
Error, Result,
},
};
use crate::{auto_method, DataManager};
use oiseau::{cache::Cache, execute, get, params, query_row, query_rows, PostgresRow};
@ -71,6 +74,8 @@ impl DataManager {
Ok(res.unwrap())
}
const MAXIMUM_FREE_DOMAINS: usize = 5;
/// Create a new domain in the database.
///
/// # Arguments
@ -83,6 +88,31 @@ impl DataManager {
return Err(Error::DataTooLong("name".to_string()));
}
// check number of domains
let owner = self.get_user_by_id(data.owner).await?;
if !owner.permissions.check(FinePermission::SUPPORTER) {
let domains = self.get_domains_by_user(data.owner).await?;
if domains.len() >= Self::MAXIMUM_FREE_DOMAINS {
return Err(Error::MiscError(
"You already have the maximum number of domains you can have".to_string(),
));
}
}
// check name
let regex = regex::RegexBuilder::new(NAME_REGEX)
.multi_line(true)
.build()
.unwrap();
if regex.captures(&data.name).is_some() {
return Err(Error::MiscError(
"Domain name contains invalid characters".to_string(),
));
}
// check for existing
if self
.get_domain_by_name_tld(&data.name, &data.tld)