-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.py
More file actions
150 lines (111 loc) · 6.16 KB
/
main.py
File metadata and controls
150 lines (111 loc) · 6.16 KB
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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
from fastapi import FastAPI, Depends, Header, Path, Body
from fastapi.responses import JSONResponse
from sqlalchemy.ext.asyncio import AsyncSession
from schemas import (UserRegister, UserLogin, TaskCreate, TaskStatusUpdate)
from database import (init_db, get_db, create_user, get_user_by_token,
create_user_project, add_task_to_project, get_user_project,
set_task_is_complete, get_user_projects, auth_user, delete_user_project, delete_task)
from contextlib import asynccontextmanager
@asynccontextmanager
async def lifespan(app: FastAPI):
await init_db()
yield
app = FastAPI(lifespan=lifespan)
@app.get("/")
async def main():
return {"success": True, "message": "This is a future project with task management for users."}
@app.post("/register")
async def register(data: UserRegister, db: AsyncSession = Depends(get_db)):
result, status_code, message = await create_user(data.username, data.password, data.email, db)
if status_code != 200:
return JSONResponse(
status_code=status_code,
content={"success": False, "message": message}
)
return {"success": True, "message": message, "data": {"id": result.id, "username": result.username}}
@app.post("/login")
async def login(data: UserLogin, db: AsyncSession = Depends(get_db)):
result, status_code, message = await auth_user(data.username, data.password, db)
if status_code != 200:
return JSONResponse(
status_code=status_code,
content={"success": False, "message": message}
)
return {"success": True, "message": message, "data": {"access_token": result}}
@app.get("/users/me")
async def get_user(auth_token: str = Header(..., description="Токен аутентификации"), db: AsyncSession = Depends(get_db)):
user, status_code, message = await get_user_by_token(auth_token, db)
if status_code != 200:
return JSONResponse(
status_code=status_code,
content={"success": False, "message": message}
)
return {
"success": True,
"message": message,
"data": {
"id": user.id,
"username": user.username,
"email": user.email
}
}
@app.post("/projects")
async def create_project(auth_token: str = Header(..., description="Токен аутентификации"), name: str = Body(..., description="..."), db: AsyncSession = Depends(get_db)):
result, status_code, message = await create_user_project(auth_token, name, db)
if status_code != 200:
return JSONResponse(
status_code=status_code,
content={"success": False, "message": message}
)
return {"success": True, "message": message, "data": result}
@app.post("/projects/{project_id}/tasks")
async def create_task(project_id: int = Path(..., description="ID проекта"), auth_token: str = Header(..., description="Токен аутентификации"), task_data: TaskCreate = Body(..., description="Данные задачи"), db: AsyncSession = Depends(get_db)):
task, status_code, message = await add_task_to_project(auth_token, task_data.name, project_id, db)
if status_code != 200:
return JSONResponse(status_code=status_code, content={"success": False, "message": message})
return {"success": True, "message": message, "data": task}
@app.get("/projects/{project_id}")
async def get_project(project_id: int = Path(..., description="ID проекта"), auth_token: str = Header(..., description="Токен аутентификации"), db: AsyncSession = Depends(get_db)):
project, status_code, message = await get_user_project(auth_token, project_id, db)
if status_code != 200:
return JSONResponse(
status_code=status_code,
content={"success": False, "message": message}
)
return {"success": True, "message": message, "data": project}
@app.patch("/tasks/{task_id}")
async def set_complete_task(task_id: int = Path(..., description="ID задачи"), auth_token: str = Header(..., description="Токен авторизации"), task_data: TaskStatusUpdate = Body(..., description="Данные для обновления"), db: AsyncSession = Depends(get_db)):
task, status_code, message = await set_task_is_complete(auth_token, task_id, task_data.is_completed, db)
if status_code != 200:
return JSONResponse(
status_code=status_code,
content={"success": False, "message": message}
)
return {"success": True, "message": message, "data": task}
@app.get("/projects")
async def get_projects(auth_token: str = Header(..., description="Токен аутентификации"), db: AsyncSession = Depends(get_db)):
projects, status_code, message = await get_user_projects(auth_token, db)
if status_code != 200:
return JSONResponse(
status_code=status_code,
content={"success": False, "message": message}
)
return {"success": True, "message": message, "data": projects}
@app.delete("/projects/{project_id}")
async def delete_project(project_id: int = Path(..., description="ID проекта"), auth_token: str = Header(..., description="Токен аутентификации"), db: AsyncSession = Depends(get_db)):
result, status_code, message = await delete_user_project(auth_token, project_id, db)
if status_code != 200:
return JSONResponse(
status_code=status_code,
content={"success": False, "message": message}
)
return {"success": True, "message": message, "data": result}
@app.delete("/tasks/{task_id}")
async def delete_user_task(task_id: int = Path(..., description="ID задачи"), auth_token: str = Header(..., description="Токен аутентификации"), db: AsyncSession = Depends(get_db)):
result, status_code, message = await delete_task(auth_token, task_id, db)
if status_code != 200:
return JSONResponse(
status_code=status_code,
content={"success": False, "message": message}
)
return {"success": True, "message": message, "data": result}