saleor-apps-rs/sitemap-generator/src/sitemap/mod.rs

111 lines
3.1 KiB
Rust
Raw Normal View History

2024-07-03 14:07:04 +00:00
mod category;
mod collection;
mod event_handler;
mod page;
mod product;
use chrono::{DateTime, FixedOffset, SubsecRound};
use quick_xml::DeError;
use serde::{Deserialize, Serialize};
const SITEMAP_XMLNS: &str = "http://sitemaps.org/schemas/sitemap/0.9";
const SALEOR_REF_XMLNS: &str = "http://app-sitemap-generator.kremik.sk/xml-schemas/saleor-ref.xsd";
#[derive(Serialize, Deserialize, PartialEq, Eq, Debug)]
#[serde(rename = "urlset")]
pub struct UrlSet {
#[serde(rename = "@xmlns:saleor")]
xmlns_saleor: String,
#[serde(rename = "@xmlns")]
xmlns: String,
pub url: Vec<Url>,
}
#[derive(Serialize, Deserialize, PartialEq, Eq, Debug)]
pub struct Url {
pub loc: String,
pub lastmod: DateTime<FixedOffset>,
#[serde(rename = "saleor:ref")]
pub saleor_ref: SaleorRef,
}
pub enum RefType {
Product,
}
#[derive(Serialize, Deserialize, PartialEq, Eq, Debug)]
pub struct SaleorRef {
#[serde(rename = "saleor:id")]
pub id: String,
#[serde(rename = "saleor:type")]
pub typ: String,
#[serde(rename = "saleor:category-id")]
#[serde(skip_serializing_if = "Option::is_none")]
pub category_id: Option<String>,
pub
}
impl UrlSet {
/**
Icludes xml version header
*/
pub fn to_file(&self) -> Result<String, DeError> {
let init = quick_xml::se::to_string(self)?;
Ok(r#"<?xml version="1.0" encoding="UTF-8"?>"#.to_string() + "\n" + &init)
}
/**
adds static xmlns default strings
*/
pub fn new() -> Self {
let mut base_url = std::env::var("APP_API_BASE_URL").unwrap();
//Cuz apparently xml url thingy isn't actually an url so you can't https? Gosh I hate xml
if base_url.contains("https") {
base_url = base_url.replacen("https", "http", 1);
}
//Trailing / in url would mess stuff up
if base_url.chars().last().unwrap() == '/' {
base_url.pop();
}
let xmlns_saleor = format!("{base_url}/schemas/saleor-ref.xsd",);
Self {
xmlns: SITEMAP_XMLNS.to_string(),
xmlns_saleor,
url: vec![],
}
}
}
impl Url {
pub fn new_generic_url(id: String, slug: String) -> Self {
Self {
saleor_ref: SaleorRef {
product_id: None,
category_id: Some(id),
},
lastmod: chrono::offset::Utc::now().fixed_offset().round_subsecs(1),
// Have template string determine the url
loc: format!("https://example.com/{slug}"),
}
}
pub fn new_product_url(
category_id: String,
product_id: String,
category_slug: String,
product_slug: String,
) -> Self {
Self {
// Have template string determine the url
loc: format!("https://example.com/{category_slug}/{product_slug}"),
lastmod: chrono::offset::Utc::now().fixed_offset().round_subsecs(1),
saleor_ref: SaleorRef {
product_id: Some(product_id),
category_id: Some(category_id),
},
}
}
}