Найти в Дзене
Computer Pro

Twitter-clone на FastAPI. Удаляем твиты. Часть 6

Продолжаем развивать проект клона твиттера. Как "затвитить" с картинкой мы теперь умеем: Теперь исходя из ТЗ нужно уметь удалять свои твиты. Как я и писал в предыдущей статье - в моем коде есть недоработки. Автор твита не видит в ленте свой твит, потому что по условию ТЗ об этом ничего не было сказано. Так как проект не "боевой", а "учебный", то некоторые моменты во фронде не предусмотрены. Например, я не должен видеть кнопку "Удалить" если я не являюсь автором твита. Я нажал на эту кнопку - посмотрим что же произошло "под капотом": Роут у нас уже есть, пишем обработчик события для DELETE-запроса. Минимально рабочий код-заглушка выглядит так: При нажатии на кнопку удаления твита, выскочит всплывающая кнопка, которая, как бы подтверждает удаление данного твита: Ну значит роут сработал и должен вернуть именно то что у меня написано. Интересно, а если в коде-заглушке True изменить на False??? Однако! Фронту оказалось пофигу что там приходит в ответе True или False он всё так же выдает зел
Просто картинка. Колёсный пароход Н.В.Гоголь. Северная Двина (в трех километрах от Архангельска, август 2024)
Просто картинка. Колёсный пароход Н.В.Гоголь. Северная Двина (в трех километрах от Архангельска, август 2024)

Продолжаем развивать проект клона твиттера. Как "затвитить" с картинкой мы теперь умеем:

Теперь исходя из ТЗ нужно уметь удалять свои твиты. Как я и писал в предыдущей статье - в моем коде есть недоработки. Автор твита не видит в ленте свой твит, потому что по условию ТЗ об этом ничего не было сказано. Так как проект не "боевой", а "учебный", то некоторые моменты во фронде не предусмотрены. Например, я не должен видеть кнопку "Удалить" если я не являюсь автором твита.

-2

Я нажал на эту кнопку - посмотрим что же произошло "под капотом":

-3

Роут у нас уже есть, пишем обработчик события для DELETE-запроса. Минимально рабочий код-заглушка выглядит так:

-4

При нажатии на кнопку удаления твита, выскочит всплывающая кнопка, которая, как бы подтверждает удаление данного твита:

-5

Ну значит роут сработал и должен вернуть именно то что у меня написано. Интересно, а если в коде-заглушке True изменить на False??? Однако! Фронту оказалось пофигу что там приходит в ответе True или False он всё так же выдает зелененькое сообщение что твит удалён! Ну да ладно...

Делаем из кода-заглушки функционал. Добавим в тело обработки запроса обращение к базе данных:

Пока функция не написана и подсвечивается красным
Пока функция не написана и подсвечивается красным

Напишем функцию удаления твита (пока проверку подлинности пользователя не провожу):

-7

Запись о твите успешно удалена из БД и твит исчез из ленты, но физически файл картинки я удалять не стал, потому как это экспериментальные данные и файлы еще будут нужны.

-8
-9

Как можно видеть, твит с пятью лайками исчез, а так же запись о прикрепленном изображении и лайках, это был твит с tweet_id = 5:

-10
-11
-12

Да, выяснилось что модели у меня были написаны не очень корректно, потому как при удалении алхимия ругалась на связи твита с лайками и изображениями. Я было ломанулся делать отдельные функции для этого. Но подумал, постойте, есть жеж ondelete="CASCADE"!!! Которая и должна об этом позаботиться и удалить все связаннные с твитом записи! Нужно было дописать в моделях Image и Like:

-13
-14

После чего удаление твита стало работать одной строкой, верней двумя: stmt = delete(Tweet).where(Tweet.id == tweet_id)
await session.execute(stmt)
...одна формирует запрос, вторая его выполняет.

Теперь нужно сделать физическое удаление файла с жесткого диска, которое в коде выше было, но пока закомментированно.

Чтобы удалить файл, нужно знать имя этого файла и полный путь к нему. То есть это нужно вытащить из твита до его удаления:

-15

После того как сохранили путь к файлу, можно удалить запись о данном твите из базы данных. А после этого можно и сам файл удалить:

-16
-17

В плане удаления твитов осталось сделать одно - чтобы эти твиты мог удалять только их автор. Реализуем проверку пользователя, его ли это твит или нет, вставим эту проверку аккурат после получения самого твита который пользователь собирается удалить. Полная логика удаления твита:

-18

В проверке пользователя используется кастомный обработчик ошибок:

-19

Плюс, я разобрался с одним "косяком" который оставил на потом - теперь я могу видеть в ленте свои твиты, чуть чуть модернизировал получение твитов:

-20

Теперь генерируется список user_id-подписок текущего пользователя + id самого текущего пользователя и все это дело передается в функцию фильтрации. Иначе я не смог бы проверить удаление своего собственного твита, потому-что я его не вижу)))

И вот, теперь при попытке удалить не свой твит, на фронте возникает сообщение:

-21

А на бэкенде, сработал лог ошибки. Но ничего не поломалось:

-22

Но при этом, свой твит, я удалить могу:

-23
-24
-25

Ну вот, твиты я научился удалять. Я понимаю что код еще сырой и его нужно допиливать, но проект медленно но верно движется к финалу!


Данный цикл статей не инструкция к тому как нужно делать. Это больше похоже на лайвкодинг, с публикацией шагов, что и как я делал. Дабы в процессе написания статьи самому более глубоко проникнуться в тему, а так же помочь другим людям, которые, возможно, тупанули на каком-то моменте и не знают как сдвинуться с мёртвой точки.

Надеюсь кому-то это было полезно. Всем пока.

Продолжение следует...