-
Notifications
You must be signed in to change notification settings - Fork 0
/
schemas.py
133 lines (91 loc) · 2.61 KB
/
schemas.py
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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
from datetime import datetime
from typing import Annotated, TypeAlias
import slugify
from pydantic import BaseModel, EmailStr, constr, AfterValidator, conset
from src.core.enums import UserRolesEnum, APIMethodsEnum
def remove_at_sign(str_id: str) -> str:
# add @ if it is not present
if not str_id.startswith("@"):
return str_id
return str_id[1:]
NoAtStr = Annotated[str, AfterValidator(remove_at_sign)]
class _UserSchema(BaseModel):
username: constr(to_lower=True)
name: str | None = None
bio: str | None = None
email: EmailStr | None = None
telegram: NoAtStr | None = None
instagram: NoAtStr | None = None
twitter: NoAtStr | None = None
class UserSignupSchema(_UserSchema):
password: constr(strip_whitespace=True, min_length=8)
class UserSchema(UserSignupSchema):
created: datetime
role: UserRolesEnum
totp_hash: str
class UserLoginSchema(BaseModel):
username: str
password: constr(strip_whitespace=True, min_length=8)
class UserOutSchema(_UserSchema):
telegram: str | None = None
instagram: str | None = None
twitter: str | None = None
class UserRegisterOutSchema(UserOutSchema):
qr_img: str
LinkTupleType: TypeAlias = tuple[APIMethodsEnum, str] | None
class LittleDraftSchema(BaseModel):
id: int
title: str
updated: datetime | None
link: LinkTupleType
class DraftSchema(BaseModel):
id: int
title: str
body: str
created: datetime
updated: datetime | None
username: str
draft_hash: str
class CreateDraftSchema(BaseModel):
title: str
body: str
class UpdateDraftSchema(BaseModel):
title: str
body: str
def _slugify(slug) -> str:
return slugify.slugify(slug)
Slug = Annotated[
constr(strip_whitespace=True, to_lower=True, min_length=1),
AfterValidator(_slugify),
]
class PublishDraftSchema(BaseModel):
tags: conset(
constr(strip_whitespace=True, to_lower=True, min_length=1),
min_length=1,
max_length=5,
)
slug: Slug
class PostSchema(BaseModel):
id: int
title: str
body: str
tags: set[str]
published: datetime
updated: datetime | None = None
comments_count: int
class CreateCommentReplySchema(BaseModel):
comment: constr(strip_whitespace=True, min_length=1, max_length=256)
class CommentReplySchema(BaseModel):
id: int
commented: datetime
comment: str
path: str | None = None
updated: datetime | None = None
parent_id: int | None = None
username: str
reply_count: int
class LittlePostSchema(BaseModel):
id: int
title: str
slug: str
published: datetime