122 lines
4.5 KiB
Python
122 lines
4.5 KiB
Python
"""
|
|
|
|
AUTHOR:
|
|
|
|
Khushal P Soonderji
|
|
|
|
DATE:
|
|
|
|
Tuesday, 10th Sept., 2024.
|
|
|
|
OBJECTIVE:
|
|
|
|
To provide a data structure for the JSON received in the API calls to generate and verify timed OTPs.
|
|
|
|
REFERENCES:
|
|
|
|
N/A
|
|
|
|
DOWNLOADS:
|
|
|
|
N/A
|
|
|
|
"""
|
|
|
|
|
|
# *****************************************************************************************************************
|
|
# ***** ****
|
|
# *** IMPORT ***
|
|
# ***** ****
|
|
# *****************************************************************************************************************
|
|
|
|
|
|
# To make sibling directories accessible for imports:
|
|
import sys
|
|
sys.path.append(".")
|
|
sys.path.append("..")
|
|
|
|
# For making data models:
|
|
from pydantic import BaseModel, Field, field_validator, Extra, EmailStr
|
|
from typing import Optional, Any, Dict, List
|
|
from typing_extensions import Annotated
|
|
|
|
# My utils:
|
|
from utils_v2.string import regex
|
|
|
|
|
|
# *****************************************************************************************************************
|
|
# ***** ****
|
|
# *** MACROS / ONE-TIME INIT ***
|
|
# ***** ****
|
|
# *****************************************************************************************************************
|
|
|
|
|
|
# --- Nothing Yet
|
|
|
|
|
|
# *****************************************************************************************************************
|
|
# ***** ****
|
|
# *** VARIABLES ***
|
|
# ***** ****
|
|
# *****************************************************************************************************************
|
|
|
|
|
|
# --- Nothing Yet
|
|
|
|
|
|
# *****************************************************************************************************************
|
|
# ***** ****
|
|
# *** FUNCTIONS ***
|
|
# ***** ****
|
|
# *****************************************************************************************************************
|
|
|
|
|
|
class GenerateTimedOTP(BaseModel):
|
|
|
|
id: dict
|
|
attempts: Optional[int] = 3
|
|
seconds: Optional[int | float] = 30.0
|
|
|
|
class Config:
|
|
extra = "forbid"
|
|
|
|
def get(self, key: str, default = None):
|
|
return getattr(self, key, default)
|
|
|
|
@field_validator("attempts")
|
|
def validate_attempts(cls, value):
|
|
if not 1 <= value <= 10: raise ValueError("Attempts must be at least 1 and at most 10.")
|
|
return value
|
|
|
|
@field_validator("seconds")
|
|
def validate_expiry(cls, value):
|
|
if not 30 <= value <= 300: raise ValueError("Expiry must be at least 30s and at most 300s.")
|
|
return value
|
|
|
|
|
|
# ---------------------------------------------------------------------------------------------------------------------
|
|
|
|
|
|
class VerifyTimedOTP(BaseModel):
|
|
|
|
id: dict
|
|
otp: str
|
|
|
|
class Config:
|
|
extra = "forbid"
|
|
|
|
def get(self, key: str, default = None):
|
|
return getattr(self, key, default)
|
|
|
|
|
|
# *****************************************************************************************************************
|
|
# ***** ****
|
|
# *** MAIN PROGRAM ***
|
|
# ***** ****
|
|
# *****************************************************************************************************************
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
pass
|