File size: 3,327 Bytes
ee37dcf
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
import time

from fastapi import  HTTPException,APIRouter
from .pydanticModel import *
from .dao import tableStore

router = APIRouter()

# 定义路由和函数
@router.post("/login")
@router.get("/login")
async def login(login: signIn):
    # ->"user info or throw error"
    # 检查email和password是否匹配
    table_store = tableStore(ots_client=router.ots_client,table_name=router.table_name)
    try:
        login_result = table_store.login(login.email, login.password)
        if login_result['ec']==200:
            return login_result
        else:
            raise HTTPException(status_code=400, detail="login failed in table store")
    except Exception as e:
        print(e)
        raise HTTPException(status_code=400, detail="sign in failed")

@router.get("/signUp")
@router.post("/signUp")
async def sign_up(signUp: signUp):
    # ->"user info or throw error"
    table_store = tableStore(ots_client=router.ots_client,table_name=router.table_name)
    try:
        signUp_result = table_store.userSignUp(signUp.email,signUp.password)
        if signUp_result['ec']==200:
            return signUp_result
        else:
            raise HTTPException(status_code=400, detail="sign up failed in table store")
    except Exception as e:
        raise HTTPException(status_code=400, detail="sign up failed")





@router.get("/purchase")
@router.post("/purchase")
async def purchase(plan: userPlan):
        #->bool or raise error
        # 提取plan价格和时间
        price = plan.price
        time_to_add = plan.duration_seconds
        email = plan.email
        password = plan.password
        table_store = tableStore(ots_client=router.ots_client, table_name=router.table_name)
        # 读取存储数据,如果存的expiredAt>now,那么从expiredAt加时间
        # 如果存的<now ,那么从now加时间 (总之是取两者较大+time_to_add)

        table_store.getUserInfo(email=email)
        cur_balance  = table_store.balance
        cur_expired_at = table_store.expired_at
        cur_time = int(time.time())
        user_password_stored = table_store.stored_password


        if cur_balance -price <0:
            raise HTTPException(status_code=400, detail="balance not enough")
        elif password!=user_password_stored:
            raise HTTPException(status_code=400, detail="auth not pass in purchase")
        else:
            expired_new = max(cur_expired_at, cur_time) + time_to_add
            balance_new = cur_balance -price
            # 更新余额和时间
            update_balance_result = table_store.updateColumnByPrimaryKey(
                key=router.key,
                key_value=email,
                update_column='balance',
                update_column_value=balance_new
            )
            if not update_balance_result:
                raise HTTPException(status_code=400, detail="updateBalance 结果失败")
            update_expired_result = table_store.updateColumnByPrimaryKey(
                key=router.key,
                key_value=email,
                update_column='expiredAt',
                update_column_value=expired_new
            )
            if not update_expired_result:
                raise HTTPException(status_code=400, detail="update_expired_result 结果失败")
            return True