subscription_usage_meters.rs

 1use crate::db::UserId;
 2use crate::llm::db::queries::subscription_usages::convert_chrono_to_time;
 3
 4use super::*;
 5
 6impl LlmDatabase {
 7    /// Returns all current subscription usage meters as of the given timestamp.
 8    pub async fn get_current_subscription_usage_meters(
 9        &self,
10        now: DateTimeUtc,
11    ) -> Result<Vec<(subscription_usage_meter::Model, subscription_usage::Model)>> {
12        let now = convert_chrono_to_time(now)?;
13
14        self.transaction(|tx| async move {
15            let result = subscription_usage_meter::Entity::find()
16                .inner_join(subscription_usage::Entity)
17                .filter(
18                    subscription_usage::Column::PeriodStartAt
19                        .lte(now)
20                        .and(subscription_usage::Column::PeriodEndAt.gte(now)),
21                )
22                .select_also(subscription_usage::Entity)
23                .all(&*tx)
24                .await?;
25
26            let result = result
27                .into_iter()
28                .filter_map(|(meter, usage)| {
29                    let usage = usage?;
30                    Some((meter, usage))
31                })
32                .collect();
33
34            Ok(result)
35        })
36        .await
37    }
38
39    /// Returns all current subscription usage meters for the given user as of the given timestamp.
40    pub async fn get_current_subscription_usage_meters_for_user(
41        &self,
42        user_id: UserId,
43        now: DateTimeUtc,
44    ) -> Result<Vec<(subscription_usage_meter::Model, subscription_usage::Model)>> {
45        let now = convert_chrono_to_time(now)?;
46
47        self.transaction(|tx| async move {
48            let result = subscription_usage_meter::Entity::find()
49                .inner_join(subscription_usage::Entity)
50                .filter(subscription_usage::Column::UserId.eq(user_id))
51                .filter(
52                    subscription_usage::Column::PeriodStartAt
53                        .lte(now)
54                        .and(subscription_usage::Column::PeriodEndAt.gte(now)),
55                )
56                .select_also(subscription_usage::Entity)
57                .all(&*tx)
58                .await?;
59
60            let result = result
61                .into_iter()
62                .filter_map(|(meter, usage)| {
63                    let usage = usage?;
64                    Some((meter, usage))
65                })
66                .collect();
67
68            Ok(result)
69        })
70        .await
71    }
72}