Контекст: Добавлен статус deleted для Place (мягкое удаление пользователем) и модальное окно с кнопкой полного удаления для админа. API контракт не документирован.
graph LR
User[Пользователь] -->|Soft Delete| PATCH["PATCH /places/{id} {status:deleted}"]
Admin[Администратор] -->|Full Delete| DEL["DELETE /places/{id}?hard=true"]
PATCH -->|SET status='deleted'| DB[(PostgreSQL)]
DEL -->|CASCADE + MinIO cleanup| DB
DEL -->|Delete files| S3[(MinIO)]
PATCH /places/{id}){ "status": "deleted" } (любые другие поля игнорируются для deleted)UPDATE places SET status = 'deleted' WHERE id = $1 AND owner_id = $2200 OK с обновлённым placeDELETE /places/{id}?hard=true)admin/superadmin)hard=true (обязательно)UploadHandler.RemoveFile)moderation_log (нужна модель ModerationLog)204 No ContentDELETE /places/{id} без hard=true — 400 Bad RequestСейчас PATCH status=deleted не пишет в moderation_log. Нужно:
// services/places.go
func (s *PlaceService) SoftDelete(ctx context.Context, placeID, userID string) error {
// 1. Проверить права
// 2. UPDATE status = 'deleted'
// 3. s.moderationRepo.Log(ctx, ModerationLog{
// ModeratorID: userID,
// TargetType: "place",
// TargetID: placeID,
// Action: "soft_delete",
// NewStatus: "deleted",
// })
}
Нет способа восстановить место (кроме прямого PATCH админом). Нужен отдельный эндпоинт или разрешить PATCH /places/{id} {status:active} владельцу, если место в deleted.
Сейчас фильтр ?status=deleted не реализован в GET /places. Нужен для админской вкладки "Удалённые".
ModerationLog модели// handlers/places.go — ⚠️ заглушка
func (h *PlaceHandler) HardDelete(w http.ResponseWriter, r *http.Request) {
// НЕТ записи в audit log — нужно добавить после создания ModerationLog модели
}
// services/places_test.go
func TestPlaceService_SoftDelete(t *testing.T) {
// given: создано место ownerID=userA
// when: SoftDelete(ctx, placeID, userA)
// then: статус места == "deleted"
// when: SoftDelete(ctx, placeID, userB) // не владелец
// then: ошибка (403)
}
// Если админ не передал hard=true — 400
// Если не админ — 403
// Если успешно — 204, место не существует в БД
// Если место уже deleted — 404 (не надо удалять дважды)
Реализация admin/page.tsx вкладка "Удалённые" + кнопка полного удаления.
#api #contract #security #golang #frontend