51 lines
1.6 KiB
Python
51 lines
1.6 KiB
Python
|
from datetime import datetime, timedelta
|
||
|
import decimal
|
||
|
from asyncpg import Connection
|
||
|
|
||
|
from ..models import Click
|
||
|
|
||
|
|
||
|
async def update_click_expiry(conn: Connection, user_id: int, period: int) -> decimal.Decimal:
|
||
|
cur_time = datetime.now()
|
||
|
cutoff_time = cur_time - timedelta(hours=period)
|
||
|
query = '''
|
||
|
WITH expired_values AS(
|
||
|
UPDATE clicks
|
||
|
SET expiry_info=jsonb_set(expiry_info, $1, 'true')
|
||
|
WHERE 1=1
|
||
|
AND time < $2
|
||
|
AND user_id =$3
|
||
|
AND not (expiry_info->>$4)::bool
|
||
|
RETURNING value
|
||
|
)
|
||
|
SELECT COALESCE(SUM(value), 0)
|
||
|
FROM expired_values
|
||
|
;
|
||
|
'''
|
||
|
period_key = f'period_{period}'
|
||
|
return await conn.fetchval(query, [period_key], cutoff_time, user_id, period_key)
|
||
|
|
||
|
|
||
|
async def store(conn: Connection, click: Click) -> int:
|
||
|
query = '''
|
||
|
INSERT INTO clicks(user_id, time, value, expiry_info)
|
||
|
VALUES($1, $2, $3, '{"period_24": false, "period_168": false}')
|
||
|
RETURNING id
|
||
|
;
|
||
|
'''
|
||
|
return await conn.fetchval(query, click.UserID, click.DateTime, click.Value)
|
||
|
|
||
|
|
||
|
async def bulk_store_copy(conn: Connection, click: Click, count: int) -> None:
|
||
|
args = [(click.UserID, click.DateTime. click.Value) for _ in range(count)]
|
||
|
query = '''
|
||
|
INSERT INTO clicks(user_id, time, values, expiry_info)
|
||
|
VALUES($1, $2, $3, '{"period_24": false, "period_168": false}')
|
||
|
;
|
||
|
'''
|
||
|
await conn.executemany(query, args)
|
||
|
|
||
|
|
||
|
async def delete_by_user_id(conn: Connection, user_id: int):
|
||
|
await conn.execute('DELETE FROM clicks WHERE user_id=$1', user_id)
|