use crate::constants::EVENTKY_PATH;
use crate::traits::{HasIdPath, HashId, TimestampId, Validatable};
use crate::*;
use pubky_app_specs::PubkyAppTag;
use wasm_bindgen::prelude::*;
#[wasm_bindgen]
#[derive(Debug, Clone)]
pub struct EventkyMeta {
id: String,
path: String,
url: String,
}
#[wasm_bindgen]
impl EventkyMeta {
#[wasm_bindgen(getter)]
pub fn id(&self) -> String {
self.id.clone()
}
#[wasm_bindgen(getter)]
pub fn path(&self) -> String {
self.path.clone()
}
#[wasm_bindgen(getter)]
pub fn url(&self) -> String {
self.url.clone()
}
}
impl EventkyMeta {
fn new(id: &str, pubky_id: &PubkyId, path: String) -> Self {
Self {
id: id.to_string(),
url: format!("{}{}{}", PROTOCOL, pubky_id, path),
path,
}
}
}
macro_rules! result_struct {
($struct_name:ident, $field_name:ident, $field_type:ty) => {
#[wasm_bindgen]
pub struct $struct_name {
$field_name: $field_type,
meta: EventkyMeta,
}
#[wasm_bindgen]
impl $struct_name {
#[wasm_bindgen(getter)]
pub fn $field_name(&self) -> $field_type {
self.$field_name.clone()
}
#[wasm_bindgen(getter)]
pub fn meta(&self) -> EventkyMeta {
self.meta.clone()
}
}
};
}
result_struct!(EventkyEventResult, event, PubkyAppEvent);
result_struct!(EventkyCalendarResult, calendar, PubkyAppCalendar);
result_struct!(EventkyAttendeeResult, attendee, PubkyAppAttendee);
result_struct!(EventkyTagResult, tag, PubkyAppTag);
#[wasm_bindgen]
pub struct EventkySpecsBuilder {
#[wasm_bindgen(skip)]
pubky_id: PubkyId,
}
#[wasm_bindgen]
impl EventkySpecsBuilder {
#[wasm_bindgen(constructor)]
pub fn new(pubky_id: String) -> Result<Self, String> {
let pubky_id = PubkyId::try_from(&pubky_id)?;
Ok(Self { pubky_id })
}
#[wasm_bindgen(js_name = createEvent)]
pub fn create_event(
&self,
uid: String,
dtstart: String,
summary: String,
) -> Result<EventkyEventResult, String> {
let event = PubkyAppEvent::new(uid, dtstart, summary);
let event_id = event.create_id();
event.validate(Some(&event_id))?;
let path = PubkyAppEvent::create_path(&event_id);
let meta = EventkyMeta::new(&event_id, &self.pubky_id, path);
Ok(EventkyEventResult { event, meta })
}
#[wasm_bindgen(js_name = createCalendar)]
pub fn create_calendar(
&self,
name: String,
timezone: String,
) -> Result<EventkyCalendarResult, String> {
let calendar = PubkyAppCalendar::new(name, timezone);
let calendar_id = calendar.create_id();
calendar.validate(Some(&calendar_id))?;
let path = PubkyAppCalendar::create_path(&calendar_id);
let meta = EventkyMeta::new(&calendar_id, &self.pubky_id, path);
Ok(EventkyCalendarResult { calendar, meta })
}
#[wasm_bindgen(js_name = createAttendee)]
pub fn create_attendee(
&self,
event_uri: String,
partstat: Option<String>,
recurrence_id: Option<String>,
) -> Result<EventkyAttendeeResult, String> {
let mut attendee = match partstat {
Some(p) => PubkyAppAttendee::with_status(event_uri, p),
None => PubkyAppAttendee::new(event_uri),
};
attendee.recurrence_id = recurrence_id;
let attendee = attendee.sanitize();
let attendee_id = attendee.create_id();
attendee.validate(Some(&attendee_id))?;
let path = PubkyAppAttendee::create_path(&attendee_id);
let meta = EventkyMeta::new(&attendee_id, &self.pubky_id, path);
Ok(EventkyAttendeeResult { attendee, meta })
}
#[wasm_bindgen(js_name = createTag)]
pub fn create_tag(&self, uri: String, label: String) -> Result<EventkyTagResult, String> {
let tag = PubkyAppTag::new(uri, label);
let tag_id = tag.create_id();
let path = format!("{}{}tags/{}", PUBLIC_PATH, EVENTKY_PATH, tag_id);
let meta = EventkyMeta::new(&tag_id, &self.pubky_id, path);
Ok(EventkyTagResult { tag, meta })
}
}