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}