Some work on the sqlite store

This commit is contained in:
Lennart
2024-02-06 12:36:00 +01:00
parent 74ff20ddd7
commit 488bce0792
2 changed files with 80 additions and 20 deletions

View File

@@ -1,54 +1,113 @@
use std::sync::Arc;
use anyhow::{anyhow, Result}; use anyhow::{anyhow, Result};
use async_trait::async_trait; use async_trait::async_trait;
use sqlx::SqlitePool; use sqlx::SqlitePool;
use crate::calendar::{Calendar, CalendarStore}; use crate::{
calendar::{Calendar, CalendarStore},
event::Event,
};
#[derive(Debug)] #[derive(Debug)]
pub struct SqliteCalendarStore { pub struct SqliteCalendarStore {
db: Arc<SqlitePool>, db: SqlitePool,
} }
impl SqliteCalendarStore { impl SqliteCalendarStore {
pub fn new(db: Arc<SqlitePool>) -> Self { pub fn new(db: SqlitePool) -> Self {
Self { db } Self { db }
} }
} }
#[derive(Debug, Clone)]
struct EventRow {
uid: String,
ics: String,
}
impl TryFrom<EventRow> for Event {
type Error = anyhow::Error;
fn try_from(value: EventRow) -> Result<Self> {
Event::from_ics(value.uid, value.ics)
}
}
#[async_trait] #[async_trait]
impl CalendarStore for SqliteCalendarStore { impl CalendarStore for SqliteCalendarStore {
async fn get_calendar(&self, id: &str) -> Result<Calendar> { async fn get_calendar(&self, id: &str) -> Result<Calendar> {
let a = sqlx::query_as!( let cal = sqlx::query_as!(
Calendar, Calendar,
"SELECT id, name, owner, description, color, timezone FROM calendars WHERE id = ?", "SELECT id, name, owner, description, color, timezone FROM calendars WHERE id = ?",
id id
); )
Err(anyhow!("ok wow")) .fetch_one(&self.db)
.await?;
Ok(cal)
} }
async fn get_calendars(&self, _owner: &str) -> Result<Vec<Calendar>> { async fn get_calendars(&self, _owner: &str) -> Result<Vec<Calendar>> {
Err(anyhow!("ok wow")) let cals = sqlx::query_as!(
Calendar,
"SELECT id, name, owner, description, color, timezone FROM calendars"
)
.fetch_all(&self.db)
.await?;
Ok(cals)
} }
async fn insert_calendar(&mut self, _cid: String, _calendar: Calendar) -> Result<()> { async fn insert_calendar(&mut self, cid: String, calendar: Calendar) -> Result<()> {
Err(anyhow!("ok wow")) // TODO: :(
let name = calendar.name;
let description = calendar.description;
let owner = calendar.owner;
let color = calendar.color;
let timezone = calendar.timezone;
sqlx::query!("INSERT INTO calendars (id, name, description, owner, color, timezone) VALUES (?, ?, ?, ?, ?, ?)", cid, name, description, owner, color, timezone).execute(&self.db).await?;
Ok(())
} }
async fn get_events(&self, _cid: &str) -> Result<Vec<crate::event::Event>> { async fn get_events(&self, cid: &str) -> Result<Vec<Event>> {
Err(anyhow!("ok wow")) let events = sqlx::query_as!(EventRow, "SELECT uid, ics FROM events WHERE cid = ?", cid)
.fetch_all(&self.db)
.await?
.iter_mut()
// TODO: this is an ugly bodge :(
.filter_map(|row| row.clone().try_into().ok())
.collect();
Ok(events)
} }
async fn get_event(&self, _cid: &str, _uid: &str) -> Result<crate::event::Event> { async fn get_event(&self, cid: &str, uid: &str) -> Result<Event> {
Err(anyhow!("ok wow")) let event = sqlx::query_as!(
EventRow,
"SELECT uid, ics FROM events where cid = ? AND uid = ?",
cid,
uid
)
.fetch_one(&self.db)
.await?
.try_into()?;
Ok(event)
} }
async fn upsert_event(&mut self, _cid: String, _uid: String, _ics: String) -> Result<()> { async fn upsert_event(&mut self, cid: String, uid: String, ics: String) -> Result<()> {
Err(anyhow!("ok wow")) // Do this extra step to ensure that the input is actually valid
let _ = Event::from_ics(uid.to_owned(), ics.to_owned())?;
sqlx::query!(
"INSERT INTO events (cid, uid, ics) VALUES (?, ?, ?)",
cid,
uid,
ics,
)
.execute(&self.db)
.await?;
Ok(())
} }
async fn delete_event(&mut self, _cid: &str, _uid: &str) -> Result<()> { async fn delete_event(&mut self, cid: &str, uid: &str) -> Result<()> {
Err(anyhow!("ok wow")) sqlx::query!("DELETE FROM events WHERE cid = ? AND uid = ?", cid, uid)
.execute(&self.db)
.await?;
Ok(())
} }
} }

View File

@@ -10,7 +10,8 @@ CREATE TABLE calendars (
CREATE TABLE events ( CREATE TABLE events (
uid TEXT NOT NULL, uid TEXT NOT NULL,
cid TEXT NOT NULL, cid TEXT NOT NULL,
ics TEXT NOT NULL,
PRIMARY KEY (cid, uid), PRIMARY KEY (cid, uid),
FOREIGN KEY (cid) REFERENCES calendars(uid) FOREIGN KEY (cid) REFERENCES calendars(id)
); );