This commit is contained in:
vladislav 2026-09-10 07:20:48 -04:00
parent ce16d4ea1b
commit 978cadf11b
Signed by: Vladislav
GPG Key ID: D97C9E5E4860EE45
4 changed files with 70 additions and 0 deletions

View File

@ -4219,6 +4219,30 @@
], ],
"display_name": ".venv" "display_name": ".venv"
}, },
{
"cell_type": "code",
"execution_count": null,
"id": "c7c3772b",
"metadata": {},
"outputs": [],
"source": [
"@app.post(\"/api/admin/delete-user\")\n",
"async def delete_user(\n",
" payload: DeleteUserRequest,\n",
" user: Dict = Security(get_current_user, scopes=[\"admin\"]),\n",
"):\n",
" try:\n",
" result = users_collection.delete_one({\"_id\": ObjectId(payload._id)})\n",
" except Exception:\n",
" raise HTTPException(status_code=400, detail=\"Неверный ID пользователя\")\n",
"\n",
" if result.deleted_count == 0:\n",
" raise HTTPException(status_code=404, detail=\"Пользователь не найден\")\n",
"\n",
" return {\"ok\": True}\n"
],
"display_name": ".venv"
},
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": null,

16
main.py
View File

@ -3251,6 +3251,22 @@ async def unsubscribe(
""" """
@app.post("/api/admin/delete-user")
async def delete_user(
payload: DeleteUserRequest,
user: Dict = Security(get_current_user, scopes=["admin"]),
):
try:
result = users_collection.delete_one({"_id": ObjectId(payload._id)})
except Exception:
raise HTTPException(status_code=400, detail="Неверный ID пользователя")
if result.deleted_count == 0:
raise HTTPException(status_code=404, detail="Пользователь не найден")
return {"ok": True}
@app.get("/profile/admin/users", response_class=HTMLResponse) @app.get("/profile/admin/users", response_class=HTMLResponse)
async def profile_admin_statistics( async def profile_admin_statistics(
request: Request, request: Request,

View File

@ -70,6 +70,10 @@ class UserLoginForm(OAuth2PasswordRequestForm):
pass pass
class DeleteUserRequest(BaseModel):
_id: str
class LoginRequest(BaseModel): class LoginRequest(BaseModel):
identifier: str identifier: str
password: str password: str

View File

@ -42,6 +42,7 @@
<th>Телефон</th> <th>Телефон</th>
<th>Место проживания</th> <th>Место проживания</th>
<th>Дата рождения</th> <th>Дата рождения</th>
<th>...</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -54,11 +55,36 @@
<td>{{doc.phone or ""}}</td> <td>{{doc.phone or ""}}</td>
<td>{{doc.living_place or ""}}</td> <td>{{doc.living_place or ""}}</td>
<td>{{doc.birthday or ""}}</td> <td>{{doc.birthday or ""}}</td>
<td><button onclick="deleteUser('{{doc._id}}')">Удалить</button></td>
</tr> </tr>
{% endfor %} {% endfor %}
</tbody> </tbody>
</table> </table>
<script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
async function deleteUser(params) {
try {
const res = await fetch('/api/admin/delete-user', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
_id: params,
})
});
const data = await res.json();
if (res.ok) {
showToast({ message: "Пользователь удален", status: 'success' });
} else {
showToast({ message: data.detail || "Ошибка", status: 'error' });
}
} catch (err) {
showToast({ message: "Ошибка соединения с сервером", status: 'error' });
}
}
// @license-end
</script>
<script> <script>
// @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause // @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
function normalizeText(str) { function normalizeText(str) {