(toggl-portal): Database work

This commit is contained in:
2023-11-02 16:00:55 +00:00
parent 8f39bf7d23
commit d47174efee
7 changed files with 63 additions and 11 deletions
+17
View File
@@ -0,0 +1,17 @@
use sea_orm::{NotSet, Set};
use crate::entity::time_entry::ActiveModel;
use crate::types::ReportEntry;
impl ReportEntry {
pub(crate) fn as_models(&self) -> Vec<ActiveModel> {
self.time_entries.iter().map(|inner| ActiveModel {
id: NotSet,
toggl_id: Set(inner.id as i64),
description: Set(self.description.clone()),
project_id: Set(self.project_id.map(|id| id as i64)),
start: Set(chrono::DateTime::parse_from_rfc3339(&inner.start).unwrap()),
stop: Set(chrono::DateTime::parse_from_rfc3339(&inner.start).unwrap()),
raw_json: Set(serde_json::to_value(inner).unwrap()),
}).collect()
}
}
+4 -3
View File
@@ -7,11 +7,12 @@ use serde::{Deserialize, Serialize};
#[sea_orm(table_name = "time_entry")]
pub struct Model {
#[sea_orm(primary_key)]
pub id: i64,
pub id: i32,
pub toggl_id: i64,
pub description: String,
pub project_id: Option<i64>,
pub start: DateTime,
pub stop: DateTime,
pub start: DateTimeWithTimeZone,
pub stop: DateTimeWithTimeZone,
#[sea_orm(column_type = "JsonBinary")]
pub raw_json: Json,
}
+22 -1
View File
@@ -12,11 +12,16 @@ use clap::Parser;
use serde_json::Value;
use std::collections::HashMap;
use std::net::SocketAddr;
use sea_orm::{DatabaseConnection, EntityTrait};
use sea_orm::sea_query::OnConflict;
use tower_http::trace::TraceLayer;
use migration::{Migrator, MigratorTrait};
use crate::entity::time_entry::{self, Entity as TimeEntry};
mod client;
mod types;
mod db;
mod entity;
#[derive(Debug, Clone, Parser)]
struct Config {
@@ -35,9 +40,25 @@ struct Config {
pub async fn report(
Extension(toggl_client): Extension<TogglClient>,
Extension(db): Extension<DatabaseConnection>,
Json(query): Json<TogglQuery>,
) -> Result<Json<Vec<ReportEntry>>> {
Ok(toggl_client.full_report(&query).await.map(Json)?)
let report = toggl_client.full_report(&query).await?;
let models = report.iter().flat_map(|entry| entry.as_models());
TimeEntry::insert_many(models)
.on_conflict(
OnConflict::column(time_entry::Column::TogglId)
.update_columns(vec![
time_entry::Column::Description,
time_entry::Column::ProjectId,
time_entry::Column::Start,
time_entry::Column::Stop,
time_entry::Column::RawJson,
]).to_owned()
).exec(&db).await?;
Ok(Json(report))
}
pub async fn current(