|
1 | 1 | from uuid import UUID |
2 | | -from datetime import datetime, timedelta |
3 | 2 | from typing import List, Optional |
4 | 3 | from sqlalchemy.orm import Session |
| 4 | +from datetime import datetime, timedelta |
5 | 5 |
|
6 | 6 | from src.db.models import QueryUsage |
7 | 7 | from src.share.base_service import BaseService |
| 8 | +from src.user.services.user_service import UserService |
| 9 | +from src.share.staked_tokens import get_user_staked_tokens |
8 | 10 | from src.query_usage.repositories.query_usage_repository import QueryUsageRepository |
9 | 11 |
|
10 | 12 |
|
11 | 13 | class QueryUsageService(BaseService): |
12 | 14 | def __init__(self): |
13 | 15 | self.repository = QueryUsageRepository() |
| 16 | + self.user_service = UserService() |
14 | 17 |
|
15 | 18 | def create_query_usage(self, db_session: Session, query_usage: QueryUsage) -> QueryUsage: |
16 | 19 | """ |
@@ -65,3 +68,67 @@ def get_usage_setting(self, db_session: Session) -> List[QueryUsage]: |
65 | 68 | List[UsageSetting]: A list of all usage settings. |
66 | 69 | """ |
67 | 70 | return self.repository.get_usage_setting(db_session) |
| 71 | + |
| 72 | + def get_user_max_query_allowance(self, db_session: Session, user_id: UUID) -> int: |
| 73 | + """ |
| 74 | + Retrieves the maximum number of queries a user is allowed to make. |
| 75 | +
|
| 76 | + Args: |
| 77 | + db_session (Session): The database session. |
| 78 | + user_id (UUID): The ID of the user. |
| 79 | +
|
| 80 | + Returns: |
| 81 | + int: The maximum number of queries the user is allowed to make. |
| 82 | +
|
| 83 | + Raises: |
| 84 | + Exception: If the user has not staked any Morpheus tokens. |
| 85 | + """ |
| 86 | + user = self.user_service.get_user(db_session, user_id) |
| 87 | + |
| 88 | + whitelist = self.user_service.get_whitelist(db_session) |
| 89 | + |
| 90 | + # check user payment |
| 91 | + for wl in whitelist: |
| 92 | + if str(user_id) == str(wl.user_id): |
| 93 | + max_allowed_query = wl.max_query |
| 94 | + return max_allowed_query |
| 95 | + |
| 96 | + staked_morpheus = get_user_staked_tokens( |
| 97 | + wallet_address=user.wallet_address, provider="morpheus") |
| 98 | + |
| 99 | + if staked_morpheus == 0: |
| 100 | + raise Exception( |
| 101 | + "You need to stake Morpheus tokens to use this service") |
| 102 | + |
| 103 | + usage_setting = self.get_usage_setting( |
| 104 | + db_session) |
| 105 | + |
| 106 | + max_allowed_query = 0 |
| 107 | + for setting in usage_setting: |
| 108 | + if setting.provider == "morpheus": |
| 109 | + max_allowed_query = setting.max_query * \ |
| 110 | + (int(staked_morpheus) / 1e18) |
| 111 | + break |
| 112 | + |
| 113 | + return max_allowed_query |
| 114 | + |
| 115 | + def check_user_eligibility(self, db_session: Session, user_id: UUID, max_query_allowance: int) -> bool: |
| 116 | + """ |
| 117 | + Checks if a user is eligible to make a query based on their daily query limit. |
| 118 | +
|
| 119 | + Args: |
| 120 | + db_session (Session): The database session. |
| 121 | + user_id (UUID): The ID of the user. |
| 122 | + max_query_allowance (int): The number of queries the user is allowed to make. |
| 123 | +
|
| 124 | + Returns: |
| 125 | + bool: True if the user is eligible, False otherwise. |
| 126 | + """ |
| 127 | + user_query_usage_until_previous_24h = self.get_all_query_usages( |
| 128 | + db_session, user_id, "morpheus", timedelta(hours=24) |
| 129 | + ) |
| 130 | + |
| 131 | + if len(user_query_usage_until_previous_24h) >= max_query_allowance: |
| 132 | + return False |
| 133 | + |
| 134 | + return True |
0 commit comments