supernote.models.auth

Module for authentication API data models.

The following endpoints are supported:

  • /api/official/user/account/login/equipment
  • /api/official/user/account/login/new
  • /api/official/user/query/random/code
  • /api/official/user/sms/login
  • /api/user/sms/validcode/send
  • /api/user/query/token
  • /api/user/validcode/pre-auth
  • /api/user/logout (empty body)
  1"""Module for authentication API data models.
  2
  3The following endpoints are supported:
  4- /api/official/user/account/login/equipment
  5- /api/official/user/account/login/new
  6- /api/official/user/query/random/code
  7- /api/official/user/sms/login
  8- /api/user/sms/validcode/send
  9- /api/user/query/token
 10- /api/user/validcode/pre-auth
 11- /api/user/logout (empty body)
 12"""
 13
 14from dataclasses import dataclass, field
 15
 16from mashumaro import field_options
 17from mashumaro.config import BaseConfig
 18from mashumaro.mixins.json import DataClassJSONMixin
 19
 20from .base import BaseEnum, BaseResponse
 21
 22COUNTRY_CODE = 1
 23BROWSER = "Chrome142"
 24LANGUAGE = "en"
 25
 26
 27class Equipment(BaseEnum):
 28    """Device type."""
 29
 30    WEB = 1
 31    APP = 2
 32    TERMINAL = 3
 33    USER_PLATFORM = 4
 34
 35
 36def _deserialize_int_equipment(value: str) -> Equipment:
 37    return Equipment(int(value))
 38
 39
 40@dataclass
 41class UserCheckDTO(DataClassJSONMixin):
 42    """Request to check user existence."""
 43
 44    email: str
 45    country_code: str = field(metadata=field_options(alias="countryCode"), default="")
 46    telephone: str = ""
 47    user_name: str = field(metadata=field_options(alias="userName"), default="")
 48    domain: str = ""
 49
 50    class Config(BaseConfig):
 51        serialize_by_alias = True
 52
 53
 54class LoginMethod(str, BaseEnum):
 55    """Method for logging in to account."""
 56
 57    PHONE = "1"
 58    EMAIL = "2"
 59    WECHAT = "3"
 60
 61
 62@dataclass
 63class LoginDTO(DataClassJSONMixin):
 64    """Request to login.
 65
 66    This is used by the following POST endpoints:
 67        /api/official/user/account/login/equipment
 68        /api/official/user/account/login/new
 69    """
 70
 71    account: str
 72    """User account (must be an email address)."""
 73
 74    password: str
 75    """Hashed password. Schema: SHA256(MD5(pwd) + randomCode)) or MD5(pwd + randomCode)."""
 76
 77    timestamp: str
 78    """Client timestamp in milliseconds."""
 79
 80    login_method: LoginMethod = field(metadata=field_options(alias="loginMethod"))
 81    """Login method."""
 82
 83    language: str = LANGUAGE
 84    """Language code."""
 85
 86    country_code: int | None = field(
 87        metadata=field_options(alias="countryCode"), default=None
 88    )
 89    """Country code."""
 90
 91    browser: str = BROWSER
 92    """Browser name (user agent info)."""
 93
 94    equipment: Equipment = field(
 95        metadata=field_options(deserialize=_deserialize_int_equipment),
 96        default=Equipment.WEB,
 97    )
 98    """Device type."""
 99
100    equipment_no: str | None = field(
101        metadata=field_options(alias="equipmentNo"), default=None
102    )
103    """Device serial number (SN12345678) or other client identifier (WEB)."""
104
105    class Config(BaseConfig):
106        serialize_by_alias = True
107
108
109@dataclass(kw_only=True)
110class LoginVO(BaseResponse):
111    """Response from login endpoints."""
112
113    token: str
114    """JWT Access Token."""
115
116    counts: str
117    """Error count."""
118
119    user_name: str | None = field(
120        metadata=field_options(alias="userName"), default=None
121    )
122    """User nickname."""
123
124    is_bind: str = field(metadata=field_options(alias="isBind"), default="N")
125    """Is account bound."""
126
127    is_bind_equipment: str = field(
128        metadata=field_options(alias="isBindEquipment"), default="N"
129    )
130    """Is device bound (Terminal only)."""
131
132    sold_out_count: int = field(metadata=field_options(alias="soldOutCount"), default=0)
133    """Logout count."""
134
135
136@dataclass
137class RandomCodeDTO(DataClassJSONMixin):
138    """Request to get a random code.
139
140    This is used by the following POST endpoint:
141        /api/official/user/query/random/code
142    """
143
144    account: str
145    """User account (must be an email address)."""
146
147    country_code: int | None = field(
148        metadata=field_options(alias="countryCode"), default=None
149    )
150    """Country code."""
151
152    version: str | None = None
153    """Version."""
154
155    class Config(BaseConfig):
156        serialize_by_alias = True
157
158
159@dataclass(kw_only=True)
160class RandomCodeVO(BaseResponse):
161    """Response from random code endpoint."""
162
163    random_code: str = field(metadata=field_options(alias="randomCode"), default="")
164    """Server-side nonce (salt) used for password hashing."""
165
166    timestamp: str = ""
167    """Client timestamp in milliseconds."""
168
169
170@dataclass
171class QueryTokenDTO(DataClassJSONMixin):
172    """Request to token endpoint.
173
174    This is used by the following POST endpoint:
175        /api/user/query/token
176    """
177
178
179@dataclass(kw_only=True)
180class QueryTokenVO(BaseResponse):
181    """Response from token endpoint."""
182
183    token: str | None = None
184    """JWT Access Token."""
185
186    class Config(BaseConfig):
187        serialize_by_alias = True
188        omit_none = False
189        code_generation_options = ["TO_DICT_ADD_OMIT_NONE_FLAG"]
190
191
192class OSType(str, BaseEnum):
193    """OS Type."""
194
195    WINDOWS = "WINDOWS"
196    MACOS = "MACOS"
197    LINUX = "LINUX"
198    ANDROID = "ANDROID"
199    IOS = "IOS"
200
201
202@dataclass
203class UserVO(DataClassJSONMixin):
204    """User profile VO."""
205
206    user_name: str | None = field(
207        metadata=field_options(alias="userName"), default=None
208    )
209    email: str | None = None
210    phone: str | None = None
211    country_code: str | None = field(
212        metadata=field_options(alias="countryCode"), default=None
213    )
214    total_capacity: str = field(
215        metadata=field_options(alias="totalCapacity"), default="0"
216    )
217    file_server: str = field(metadata=field_options(alias="fileServer"), default="0")
218    avatars_url: str | None = field(
219        metadata=field_options(alias="avatarsUrl"), default=None
220    )
221    birthday: str | None = None
222    sex: str | None = None
223
224    class Config(BaseConfig):
225        serialize_by_alias = True
226        omit_none = True
227        code_generation_options = ["TO_DICT_ADD_OMIT_NONE_FLAG"]
228
229
230@dataclass
231class UserQueryByIdVO(BaseResponse):
232    """User query response."""
233
234    user: UserVO | None = None
235    is_user: bool = field(metadata=field_options(alias="isUser"), default=False)
236    equipment_no: str | None = field(
237        metadata=field_options(alias="equipmentNo"), default=None
238    )
239
240
241@dataclass
242class SmsLoginDTO(DataClassJSONMixin):
243    """Request to login via sms.
244
245    This is used by the following POST endpoint:
246        /api/user/sms/login
247    """
248
249    valid_code: str = field(metadata=field_options(alias="validCode"))
250    """SMS/Email verification code."""
251
252    valid_code_key: str = field(metadata=field_options(alias="validCodeKey"))
253    """Redis session key for the code (e.g., '{email}_validCode')."""
254
255    country_code: int = field(
256        metadata=field_options(alias="countryCode"), default=COUNTRY_CODE
257    )
258
259    telephone: str | None = None
260    """User phone number."""
261
262    timestamp: str | None = None
263    """Client timestamp in milliseconds."""
264
265    email: str | None = None
266    """User email."""
267
268    browser: str = BROWSER
269    """Browser name (user agent info)."""
270
271    equipment: Equipment = Equipment.WEB
272    """Device type."""
273
274    devices: OSType | None = OSType.WINDOWS
275    """OS Type: WINDOWS, MACOS, LINUX, ANDROID, IOS."""
276
277    class Config(BaseConfig):
278        serialize_by_alias = True
279
280
281@dataclass(kw_only=True)
282class SmsLoginVO(BaseResponse):
283    """Response from access token call."""
284
285    token: str
286
287
288@dataclass
289class UserPreAuthRequest(DataClassJSONMixin):
290    """Request for pre-auth.
291
292    This is used by the following POST endpoint:
293        /api/user/validcode/pre-auth
294    """
295
296    account: str
297
298
299@dataclass
300class UserPreAuthResponse(BaseResponse):
301    """Response from pre-auth."""
302
303    token: str = ""
304
305
306@dataclass
307class SendSmsDTO(DataClassJSONMixin):
308    """Request to send SMS code.
309
310    This is used by the following POST endpoint:
311        /api/user/sms/validcode/send
312    """
313
314    telephone: str
315    """User phone number."""
316
317    timestamp: str
318    """Client timestamp in milliseconds."""
319
320    token: str
321    """JWT Access Token."""
322
323    sign: str
324    """JWT Signature."""
325
326    extend: str | None = None
327    """JWT Extension."""
328
329    nationcode: int = field(
330        metadata=field_options(alias="nationcode"), default=COUNTRY_CODE
331    )
332    """Country code."""
333
334    class Config(BaseConfig):
335        serialize_by_alias = True
336
337
338@dataclass
339class SendSmsVO(BaseResponse):
340    """Response from send SMS."""
341
342    valid_code_key: str = field(
343        metadata=field_options(alias="validCodeKey"), default=""
344    )
345
346
347@dataclass
348class EmailDTO(DataClassJSONMixin):
349    """Request to send email code.
350
351    Used by:
352        /api/user/mail/validcode (POST)
353    """
354
355    email: str
356    """User email."""
357
358    language: str | None = None
359    """Language code."""
360
361    class Config(BaseConfig):
362        serialize_by_alias = True
363
364
365@dataclass
366class ValidCodeDTO(DataClassJSONMixin):
367    """Request to check validation code.
368
369    Used by:
370        /api/user/check/validcode (POST)
371    """
372
373    valid_code_key: str = field(metadata=field_options(alias="validCodeKey"))
374    """Key for the validation code."""
375
376    valid_code: str = field(metadata=field_options(alias="validCode"))
377    """The validation code."""
378
379    class Config(BaseConfig):
380        serialize_by_alias = True
COUNTRY_CODE = 1
BROWSER = 'Chrome142'
LANGUAGE = 'en'
class Equipment(supernote.models.base.BaseEnum):
28class Equipment(BaseEnum):
29    """Device type."""
30
31    WEB = 1
32    APP = 2
33    TERMINAL = 3
34    USER_PLATFORM = 4

Device type.

WEB = <Equipment.WEB: 1>
APP = <Equipment.APP: 2>
TERMINAL = <Equipment.TERMINAL: 3>
USER_PLATFORM = <Equipment.USER_PLATFORM: 4>
@dataclass
class UserCheckDTO(mashumaro.mixins.json.DataClassJSONMixin):
41@dataclass
42class UserCheckDTO(DataClassJSONMixin):
43    """Request to check user existence."""
44
45    email: str
46    country_code: str = field(metadata=field_options(alias="countryCode"), default="")
47    telephone: str = ""
48    user_name: str = field(metadata=field_options(alias="userName"), default="")
49    domain: str = ""
50
51    class Config(BaseConfig):
52        serialize_by_alias = True

Request to check user existence.

UserCheckDTO( email: str, country_code: str = '', telephone: str = '', user_name: str = '', domain: str = '')
email: str
country_code: str = ''
telephone: str = ''
user_name: str = ''
domain: str = ''
def to_dict(self):

The type of the None singleton.

def from_dict(cls, d, *, dialect=None):

The type of the None singleton.

class UserCheckDTO.Config(mashumaro.config.BaseConfig):
51    class Config(BaseConfig):
52        serialize_by_alias = True
serialize_by_alias = True
class LoginMethod(builtins.str, supernote.models.base.BaseEnum):
55class LoginMethod(str, BaseEnum):
56    """Method for logging in to account."""
57
58    PHONE = "1"
59    EMAIL = "2"
60    WECHAT = "3"

Method for logging in to account.

PHONE = <LoginMethod.PHONE: '1'>
EMAIL = <LoginMethod.EMAIL: '2'>
WECHAT = <LoginMethod.WECHAT: '3'>
@dataclass
class LoginDTO(mashumaro.mixins.json.DataClassJSONMixin):
 63@dataclass
 64class LoginDTO(DataClassJSONMixin):
 65    """Request to login.
 66
 67    This is used by the following POST endpoints:
 68        /api/official/user/account/login/equipment
 69        /api/official/user/account/login/new
 70    """
 71
 72    account: str
 73    """User account (must be an email address)."""
 74
 75    password: str
 76    """Hashed password. Schema: SHA256(MD5(pwd) + randomCode)) or MD5(pwd + randomCode)."""
 77
 78    timestamp: str
 79    """Client timestamp in milliseconds."""
 80
 81    login_method: LoginMethod = field(metadata=field_options(alias="loginMethod"))
 82    """Login method."""
 83
 84    language: str = LANGUAGE
 85    """Language code."""
 86
 87    country_code: int | None = field(
 88        metadata=field_options(alias="countryCode"), default=None
 89    )
 90    """Country code."""
 91
 92    browser: str = BROWSER
 93    """Browser name (user agent info)."""
 94
 95    equipment: Equipment = field(
 96        metadata=field_options(deserialize=_deserialize_int_equipment),
 97        default=Equipment.WEB,
 98    )
 99    """Device type."""
100
101    equipment_no: str | None = field(
102        metadata=field_options(alias="equipmentNo"), default=None
103    )
104    """Device serial number (SN12345678) or other client identifier (WEB)."""
105
106    class Config(BaseConfig):
107        serialize_by_alias = True

Request to login.

This is used by the following POST endpoints: /api/official/user/account/login/equipment /api/official/user/account/login/new

LoginDTO( account: str, password: str, timestamp: str, login_method: LoginMethod, language: str = 'en', country_code: int | None = None, browser: str = 'Chrome142', equipment: Equipment = <Equipment.WEB: 1>, equipment_no: str | None = None)
account: str

User account (must be an email address).

password: str

Hashed password. Schema: SHA256(MD5(pwd) + randomCode)) or MD5(pwd + randomCode).

timestamp: str

Client timestamp in milliseconds.

login_method: LoginMethod

Login method.

language: str = 'en'

Language code.

country_code: int | None = None

Country code.

browser: str = 'Chrome142'

Browser name (user agent info).

equipment: Equipment = <Equipment.WEB: 1>

Device type.

equipment_no: str | None = None

Device serial number (SN12345678) or other client identifier (WEB).

def to_dict(self):

The type of the None singleton.

def from_dict(cls, d, *, dialect=None):

The type of the None singleton.

class LoginDTO.Config(mashumaro.config.BaseConfig):
106    class Config(BaseConfig):
107        serialize_by_alias = True
serialize_by_alias = True
@dataclass(kw_only=True)
class LoginVO(supernote.models.base.BaseResponse):
110@dataclass(kw_only=True)
111class LoginVO(BaseResponse):
112    """Response from login endpoints."""
113
114    token: str
115    """JWT Access Token."""
116
117    counts: str
118    """Error count."""
119
120    user_name: str | None = field(
121        metadata=field_options(alias="userName"), default=None
122    )
123    """User nickname."""
124
125    is_bind: str = field(metadata=field_options(alias="isBind"), default="N")
126    """Is account bound."""
127
128    is_bind_equipment: str = field(
129        metadata=field_options(alias="isBindEquipment"), default="N"
130    )
131    """Is device bound (Terminal only)."""
132
133    sold_out_count: int = field(metadata=field_options(alias="soldOutCount"), default=0)
134    """Logout count."""

Response from login endpoints.

LoginVO( success: bool = True, error_code: str | None = None, error_msg: str | None = None, *, token: str, counts: str, user_name: str | None = None, is_bind: str = 'N', is_bind_equipment: str = 'N', sold_out_count: int = 0)
token: str

JWT Access Token.

counts: str

Error count.

user_name: str | None = None

User nickname.

is_bind: str = 'N'

Is account bound.

is_bind_equipment: str = 'N'

Is device bound (Terminal only).

sold_out_count: int = 0

Logout count.

def to_dict(self):

The type of the None singleton.

def from_dict(cls, d, *, dialect=None):

The type of the None singleton.

@dataclass
class RandomCodeDTO(mashumaro.mixins.json.DataClassJSONMixin):
137@dataclass
138class RandomCodeDTO(DataClassJSONMixin):
139    """Request to get a random code.
140
141    This is used by the following POST endpoint:
142        /api/official/user/query/random/code
143    """
144
145    account: str
146    """User account (must be an email address)."""
147
148    country_code: int | None = field(
149        metadata=field_options(alias="countryCode"), default=None
150    )
151    """Country code."""
152
153    version: str | None = None
154    """Version."""
155
156    class Config(BaseConfig):
157        serialize_by_alias = True

Request to get a random code.

This is used by the following POST endpoint: /api/official/user/query/random/code

RandomCodeDTO( account: str, country_code: int | None = None, version: str | None = None)
account: str

User account (must be an email address).

country_code: int | None = None

Country code.

version: str | None = None

Version.

def to_dict(self):

The type of the None singleton.

def from_dict(cls, d, *, dialect=None):

The type of the None singleton.

class RandomCodeDTO.Config(mashumaro.config.BaseConfig):
156    class Config(BaseConfig):
157        serialize_by_alias = True
serialize_by_alias = True
@dataclass(kw_only=True)
class RandomCodeVO(supernote.models.base.BaseResponse):
160@dataclass(kw_only=True)
161class RandomCodeVO(BaseResponse):
162    """Response from random code endpoint."""
163
164    random_code: str = field(metadata=field_options(alias="randomCode"), default="")
165    """Server-side nonce (salt) used for password hashing."""
166
167    timestamp: str = ""
168    """Client timestamp in milliseconds."""

Response from random code endpoint.

RandomCodeVO( success: bool = True, error_code: str | None = None, error_msg: str | None = None, *, random_code: str = '', timestamp: str = '')
random_code: str = ''

Server-side nonce (salt) used for password hashing.

timestamp: str = ''

Client timestamp in milliseconds.

def to_dict(self):

The type of the None singleton.

def from_dict(cls, d, *, dialect=None):

The type of the None singleton.

@dataclass
class QueryTokenDTO(mashumaro.mixins.json.DataClassJSONMixin):
171@dataclass
172class QueryTokenDTO(DataClassJSONMixin):
173    """Request to token endpoint.
174
175    This is used by the following POST endpoint:
176        /api/user/query/token
177    """

Request to token endpoint.

This is used by the following POST endpoint: /api/user/query/token

def to_dict(self):

The type of the None singleton.

def from_dict(cls, d, *, dialect=None):

The type of the None singleton.

@dataclass(kw_only=True)
class QueryTokenVO(supernote.models.base.BaseResponse):
180@dataclass(kw_only=True)
181class QueryTokenVO(BaseResponse):
182    """Response from token endpoint."""
183
184    token: str | None = None
185    """JWT Access Token."""
186
187    class Config(BaseConfig):
188        serialize_by_alias = True
189        omit_none = False
190        code_generation_options = ["TO_DICT_ADD_OMIT_NONE_FLAG"]

Response from token endpoint.

QueryTokenVO( success: bool = True, error_code: str | None = None, error_msg: str | None = None, *, token: str | None = None)
token: str | None = None

JWT Access Token.

def to_dict(self, *, omit_none=False):

The type of the None singleton.

def from_dict(cls, d, *, dialect=None):

The type of the None singleton.

class QueryTokenVO.Config(mashumaro.config.BaseConfig):
187    class Config(BaseConfig):
188        serialize_by_alias = True
189        omit_none = False
190        code_generation_options = ["TO_DICT_ADD_OMIT_NONE_FLAG"]
serialize_by_alias = True
omit_none = False
code_generation_options = ['TO_DICT_ADD_OMIT_NONE_FLAG']
class OSType(builtins.str, supernote.models.base.BaseEnum):
193class OSType(str, BaseEnum):
194    """OS Type."""
195
196    WINDOWS = "WINDOWS"
197    MACOS = "MACOS"
198    LINUX = "LINUX"
199    ANDROID = "ANDROID"
200    IOS = "IOS"

OS Type.

WINDOWS = <OSType.WINDOWS: 'WINDOWS'>
MACOS = <OSType.MACOS: 'MACOS'>
LINUX = <OSType.LINUX: 'LINUX'>
ANDROID = <OSType.ANDROID: 'ANDROID'>
IOS = <OSType.IOS: 'IOS'>
@dataclass
class UserVO(mashumaro.mixins.json.DataClassJSONMixin):
203@dataclass
204class UserVO(DataClassJSONMixin):
205    """User profile VO."""
206
207    user_name: str | None = field(
208        metadata=field_options(alias="userName"), default=None
209    )
210    email: str | None = None
211    phone: str | None = None
212    country_code: str | None = field(
213        metadata=field_options(alias="countryCode"), default=None
214    )
215    total_capacity: str = field(
216        metadata=field_options(alias="totalCapacity"), default="0"
217    )
218    file_server: str = field(metadata=field_options(alias="fileServer"), default="0")
219    avatars_url: str | None = field(
220        metadata=field_options(alias="avatarsUrl"), default=None
221    )
222    birthday: str | None = None
223    sex: str | None = None
224
225    class Config(BaseConfig):
226        serialize_by_alias = True
227        omit_none = True
228        code_generation_options = ["TO_DICT_ADD_OMIT_NONE_FLAG"]

User profile VO.

UserVO( user_name: str | None = None, email: str | None = None, phone: str | None = None, country_code: str | None = None, total_capacity: str = '0', file_server: str = '0', avatars_url: str | None = None, birthday: str | None = None, sex: str | None = None)
user_name: str | None = None
email: str | None = None
phone: str | None = None
country_code: str | None = None
total_capacity: str = '0'
file_server: str = '0'
avatars_url: str | None = None
birthday: str | None = None
sex: str | None = None
def to_dict(self, *, omit_none=True):

The type of the None singleton.

def from_dict(cls, d, *, dialect=None):

The type of the None singleton.

class UserVO.Config(mashumaro.config.BaseConfig):
225    class Config(BaseConfig):
226        serialize_by_alias = True
227        omit_none = True
228        code_generation_options = ["TO_DICT_ADD_OMIT_NONE_FLAG"]
serialize_by_alias = True
omit_none = True
code_generation_options = ['TO_DICT_ADD_OMIT_NONE_FLAG']
@dataclass
class UserQueryByIdVO(supernote.models.base.BaseResponse):
231@dataclass
232class UserQueryByIdVO(BaseResponse):
233    """User query response."""
234
235    user: UserVO | None = None
236    is_user: bool = field(metadata=field_options(alias="isUser"), default=False)
237    equipment_no: str | None = field(
238        metadata=field_options(alias="equipmentNo"), default=None
239    )

User query response.

UserQueryByIdVO( success: bool = True, error_code: str | None = None, error_msg: str | None = None, user: UserVO | None = None, is_user: bool = False, equipment_no: str | None = None)
user: UserVO | None = None
is_user: bool = False
equipment_no: str | None = None
def to_dict(self):

The type of the None singleton.

def from_dict(cls, d, *, dialect=None):

The type of the None singleton.

@dataclass
class SmsLoginDTO(mashumaro.mixins.json.DataClassJSONMixin):
242@dataclass
243class SmsLoginDTO(DataClassJSONMixin):
244    """Request to login via sms.
245
246    This is used by the following POST endpoint:
247        /api/user/sms/login
248    """
249
250    valid_code: str = field(metadata=field_options(alias="validCode"))
251    """SMS/Email verification code."""
252
253    valid_code_key: str = field(metadata=field_options(alias="validCodeKey"))
254    """Redis session key for the code (e.g., '{email}_validCode')."""
255
256    country_code: int = field(
257        metadata=field_options(alias="countryCode"), default=COUNTRY_CODE
258    )
259
260    telephone: str | None = None
261    """User phone number."""
262
263    timestamp: str | None = None
264    """Client timestamp in milliseconds."""
265
266    email: str | None = None
267    """User email."""
268
269    browser: str = BROWSER
270    """Browser name (user agent info)."""
271
272    equipment: Equipment = Equipment.WEB
273    """Device type."""
274
275    devices: OSType | None = OSType.WINDOWS
276    """OS Type: WINDOWS, MACOS, LINUX, ANDROID, IOS."""
277
278    class Config(BaseConfig):
279        serialize_by_alias = True

Request to login via sms.

This is used by the following POST endpoint: /api/user/sms/login

SmsLoginDTO( valid_code: str, valid_code_key: str, country_code: int = 1, telephone: str | None = None, timestamp: str | None = None, email: str | None = None, browser: str = 'Chrome142', equipment: Equipment = <Equipment.WEB: 1>, devices: OSType | None = <OSType.WINDOWS: 'WINDOWS'>)
valid_code: str

SMS/Email verification code.

valid_code_key: str

Redis session key for the code (e.g., '{email}_validCode').

country_code: int = 1
telephone: str | None = None

User phone number.

timestamp: str | None = None

Client timestamp in milliseconds.

email: str | None = None

User email.

browser: str = 'Chrome142'

Browser name (user agent info).

equipment: Equipment = <Equipment.WEB: 1>

Device type.

devices: OSType | None = <OSType.WINDOWS: 'WINDOWS'>

OS Type: WINDOWS, MACOS, LINUX, ANDROID, IOS.

def to_dict(self):

The type of the None singleton.

def from_dict(cls, d, *, dialect=None):

The type of the None singleton.

class SmsLoginDTO.Config(mashumaro.config.BaseConfig):
278    class Config(BaseConfig):
279        serialize_by_alias = True
serialize_by_alias = True
@dataclass(kw_only=True)
class SmsLoginVO(supernote.models.base.BaseResponse):
282@dataclass(kw_only=True)
283class SmsLoginVO(BaseResponse):
284    """Response from access token call."""
285
286    token: str

Response from access token call.

SmsLoginVO( success: bool = True, error_code: str | None = None, error_msg: str | None = None, *, token: str)
token: str
def to_dict(self):

The type of the None singleton.

def from_dict(cls, d, *, dialect=None):

The type of the None singleton.

@dataclass
class UserPreAuthRequest(mashumaro.mixins.json.DataClassJSONMixin):
289@dataclass
290class UserPreAuthRequest(DataClassJSONMixin):
291    """Request for pre-auth.
292
293    This is used by the following POST endpoint:
294        /api/user/validcode/pre-auth
295    """
296
297    account: str

Request for pre-auth.

This is used by the following POST endpoint: /api/user/validcode/pre-auth

UserPreAuthRequest(account: str)
account: str
def to_dict(self):

The type of the None singleton.

def from_dict(cls, d, *, dialect=None):

The type of the None singleton.

@dataclass
class UserPreAuthResponse(supernote.models.base.BaseResponse):
300@dataclass
301class UserPreAuthResponse(BaseResponse):
302    """Response from pre-auth."""
303
304    token: str = ""

Response from pre-auth.

UserPreAuthResponse( success: bool = True, error_code: str | None = None, error_msg: str | None = None, token: str = '')
token: str = ''
def to_dict(self):

The type of the None singleton.

def from_dict(cls, d, *, dialect=None):

The type of the None singleton.

@dataclass
class SendSmsDTO(mashumaro.mixins.json.DataClassJSONMixin):
307@dataclass
308class SendSmsDTO(DataClassJSONMixin):
309    """Request to send SMS code.
310
311    This is used by the following POST endpoint:
312        /api/user/sms/validcode/send
313    """
314
315    telephone: str
316    """User phone number."""
317
318    timestamp: str
319    """Client timestamp in milliseconds."""
320
321    token: str
322    """JWT Access Token."""
323
324    sign: str
325    """JWT Signature."""
326
327    extend: str | None = None
328    """JWT Extension."""
329
330    nationcode: int = field(
331        metadata=field_options(alias="nationcode"), default=COUNTRY_CODE
332    )
333    """Country code."""
334
335    class Config(BaseConfig):
336        serialize_by_alias = True

Request to send SMS code.

This is used by the following POST endpoint: /api/user/sms/validcode/send

SendSmsDTO( telephone: str, timestamp: str, token: str, sign: str, extend: str | None = None, nationcode: int = 1)
telephone: str

User phone number.

timestamp: str

Client timestamp in milliseconds.

token: str

JWT Access Token.

sign: str

JWT Signature.

extend: str | None = None

JWT Extension.

nationcode: int = 1

Country code.

def to_dict(self):

The type of the None singleton.

def from_dict(cls, d, *, dialect=None):

The type of the None singleton.

class SendSmsDTO.Config(mashumaro.config.BaseConfig):
335    class Config(BaseConfig):
336        serialize_by_alias = True
serialize_by_alias = True
@dataclass
class SendSmsVO(supernote.models.base.BaseResponse):
339@dataclass
340class SendSmsVO(BaseResponse):
341    """Response from send SMS."""
342
343    valid_code_key: str = field(
344        metadata=field_options(alias="validCodeKey"), default=""
345    )

Response from send SMS.

SendSmsVO( success: bool = True, error_code: str | None = None, error_msg: str | None = None, valid_code_key: str = '')
valid_code_key: str = ''
def to_dict(self):

The type of the None singleton.

def from_dict(cls, d, *, dialect=None):

The type of the None singleton.

@dataclass
class EmailDTO(mashumaro.mixins.json.DataClassJSONMixin):
348@dataclass
349class EmailDTO(DataClassJSONMixin):
350    """Request to send email code.
351
352    Used by:
353        /api/user/mail/validcode (POST)
354    """
355
356    email: str
357    """User email."""
358
359    language: str | None = None
360    """Language code."""
361
362    class Config(BaseConfig):
363        serialize_by_alias = True

Request to send email code.

Used by: /api/user/mail/validcode (POST)

EmailDTO(email: str, language: str | None = None)
email: str

User email.

language: str | None = None

Language code.

def to_dict(self):

The type of the None singleton.

def from_dict(cls, d, *, dialect=None):

The type of the None singleton.

class EmailDTO.Config(mashumaro.config.BaseConfig):
362    class Config(BaseConfig):
363        serialize_by_alias = True
serialize_by_alias = True
@dataclass
class ValidCodeDTO(mashumaro.mixins.json.DataClassJSONMixin):
366@dataclass
367class ValidCodeDTO(DataClassJSONMixin):
368    """Request to check validation code.
369
370    Used by:
371        /api/user/check/validcode (POST)
372    """
373
374    valid_code_key: str = field(metadata=field_options(alias="validCodeKey"))
375    """Key for the validation code."""
376
377    valid_code: str = field(metadata=field_options(alias="validCode"))
378    """The validation code."""
379
380    class Config(BaseConfig):
381        serialize_by_alias = True

Request to check validation code.

Used by: /api/user/check/validcode (POST)

ValidCodeDTO(valid_code_key: str, valid_code: str)
valid_code_key: str

Key for the validation code.

valid_code: str

The validation code.

def to_dict(self):

The type of the None singleton.

def from_dict(cls, d, *, dialect=None):

The type of the None singleton.

class ValidCodeDTO.Config(mashumaro.config.BaseConfig):
380    class Config(BaseConfig):
381        serialize_by_alias = True
serialize_by_alias = True