subscription_usages.rs

 1use time::PrimitiveDateTime;
 2
 3use crate::db::UserId;
 4
 5use super::*;
 6
 7pub fn convert_chrono_to_time(datetime: DateTimeUtc) -> anyhow::Result<PrimitiveDateTime> {
 8    use chrono::{Datelike as _, Timelike as _};
 9
10    let date = time::Date::from_calendar_date(
11        datetime.year(),
12        time::Month::try_from(datetime.month() as u8).unwrap(),
13        datetime.day() as u8,
14    )?;
15
16    let time = time::Time::from_hms_nano(
17        datetime.hour() as u8,
18        datetime.minute() as u8,
19        datetime.second() as u8,
20        datetime.nanosecond(),
21    )?;
22
23    Ok(PrimitiveDateTime::new(date, time))
24}
25
26impl LlmDatabase {
27    pub async fn get_subscription_usage_for_period(
28        &self,
29        user_id: UserId,
30        period_start_at: DateTimeUtc,
31        period_end_at: DateTimeUtc,
32    ) -> Result<Option<subscription_usage::Model>> {
33        self.transaction(|tx| async move {
34            self.get_subscription_usage_for_period_in_tx(
35                user_id,
36                period_start_at,
37                period_end_at,
38                &tx,
39            )
40            .await
41        })
42        .await
43    }
44
45    async fn get_subscription_usage_for_period_in_tx(
46        &self,
47        user_id: UserId,
48        period_start_at: DateTimeUtc,
49        period_end_at: DateTimeUtc,
50        tx: &DatabaseTransaction,
51    ) -> Result<Option<subscription_usage::Model>> {
52        Ok(subscription_usage::Entity::find()
53            .filter(subscription_usage::Column::UserId.eq(user_id))
54            .filter(subscription_usage::Column::PeriodStartAt.eq(period_start_at))
55            .filter(subscription_usage::Column::PeriodEndAt.eq(period_end_at))
56            .one(tx)
57            .await?)
58    }
59}