use std::io::Read;
use crate::{db::Collectable, Config, Database, Error, ErrorKind, Image, Post, Result, User};
pub fn initialize(config: &Config, db: &Database) -> Result<()> {
users(config, db)?;
posts(config, db)?;
blog_posts(config, db)?;
Ok(())
}
pub fn users(config: &Config, db: &Database) -> Result<()> {
for user_ in &config.users {
let mut user = user_.user.clone();
if let Some(avatar_path) = &user_.avatar {
let mut bytes = vec![];
std::fs::File::open(avatar_path)?.read_to_end(&mut bytes);
let image = Image::new(bytes);
db.set(&image)?;
user.avatar = image.id;
} else {
user.avatar = crate::user::new_avatar_image(&db)?;
}
if let Some(mut existing_user) = db
.get_collection::<crate::User>()?
.into_iter()
.find(|u| u.email == user.email)
{
existing_user.is_admin = user.is_admin;
db.set(&existing_user)?;
} else {
db.set(&user)?;
}
}
Ok(())
}
#[derive(Clone, Debug, Deserialize)]
pub struct PostIntermediate {
#[serde(flatten)]
post: Post,
author: String,
image: String,
}
pub fn posts(config: &Config, db: &Database) -> Result<()> {
posts_raw(Post::get_collection_name(), "content/posts", config, db)
}
pub fn blog_posts(config: &Config, db: &Database) -> Result<()> {
posts_raw("blog_posts", "content/blog", config, db)
}
pub fn posts_raw(
collection_name: &str,
content_dir: &str,
config: &Config,
db: &Database,
) -> Result<()> {
db.clear_at(collection_name)?;
let posts = match std::fs::read_dir(content_dir) {
Ok(p) => p,
Err(e) => {
return Ok(());
}
};
for post in posts {
let post = post?.path();
if post.is_dir() {
continue;
};
let post = std::fs::read_to_string(post)?;
let frontmatter = post.splitn(3, "---").collect::<Vec<&str>>()[1];
let mut post_: PostIntermediate = serde_yaml::from_str(frontmatter)?;
post_.post.markdown = post;
let users = db.get_collection::<User>()?;
if let Some(user) = users.iter().find(|u| u.email == post_.author) {
post_.post.owner = user.id;
}
let mut bytes = vec![];
std::fs::File::open(post_.image)?.read_to_end(&mut bytes);
let image = Image::new(bytes);
db.set(&image)?;
post_.post.image = image.id;
db.set_at(collection_name, &post_.post)?;
}
Ok(())
}