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}