articles_rs/articles/
models.rsuse chrono::{DateTime, Utc};
use serde::Serialize;
use uuid::Uuid;
use crate::article_repository::DbArticle;
#[derive(Debug, Serialize, Clone)]
pub struct Article {
pub id: Option<Uuid>,
pub title: String,
pub hero_image: String,
pub slug: String,
pub description: String,
pub author: Vec<String>,
pub status: String,
pub created: DateTime<Utc>,
pub content: String,
pub images: Vec<String>,
pub source: String,
pub published: Option<DateTime<Utc>>,
}
impl Article {
pub fn new(title: &str, slug: &str, description: &str, author: Vec<&str>) -> Self {
let now = Utc::now();
Article {
id: None,
title: title.to_string(),
hero_image: "".to_string(),
slug: slug.to_string(),
description: description.to_string(),
author: author.iter().map(|s| s.to_string()).collect(),
status: "NEW".to_string(),
created: now,
content: String::new(),
images: Vec::new(),
source: "".to_string(),
published: None,
}
}
pub fn add_image(&mut self, image_url: String) {
self.images.push(image_url);
}
pub fn add_images(&mut self, image_urls: Vec<String>) {
self.images.extend(image_urls);
}
}
impl From<DbArticle> for Article {
fn from(db_article: DbArticle) -> Self {
Article {
id: db_article.id,
title: db_article.title,
hero_image: db_article.hero_image,
slug: db_article.slug,
description: db_article.description,
author: db_article
.author
.split(",")
.map(|s| s.to_string())
.collect(),
status: db_article.status,
created: db_article.created,
content: db_article.content,
images: Vec::new(),
source: db_article.source,
published: db_article.published,
}
}
}
impl From<Article> for DbArticle {
fn from(article: Article) -> Self {
DbArticle {
id: article.id,
title: article.title,
hero_image: article.hero_image,
slug: article.slug,
description: article.description,
author: article.author.join(","),
status: article.status,
created: article.created,
content: article.content,
source: article.source,
published: article.published,
}
}
}