|
|
@@ -0,0 +1,108 @@
|
|
|
+## Недостающие Go-модели для таблиц БД
|
|
|
+
|
|
|
+**Контекст:** В БД есть таблицы `moderation_log`, `payments`, `subscriptions`, `visitor_sessions`, но для них нет Go-структур в `backend/internal/models/`. Без моделей эти таблицы недоступны через сервисный слой.
|
|
|
+
|
|
|
+## Какие модели нужны
|
|
|
+
|
|
|
+```sql
|
|
|
+-- moderation_log — аудит действий модераторов
|
|
|
+CREATE TABLE moderation_log (
|
|
|
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
|
+ moderator_id UUID NOT NULL REFERENCES users(id),
|
|
|
+ target_type VARCHAR(50) NOT NULL, -- 'place' | 'user' | 'review'
|
|
|
+ target_id UUID NOT NULL,
|
|
|
+ action VARCHAR(50) NOT NULL, -- 'soft_delete' | 'hard_delete' | 'restore' | 'ban'
|
|
|
+ old_status VARCHAR(50),
|
|
|
+ new_status VARCHAR(50),
|
|
|
+ comment TEXT,
|
|
|
+ created_at TIMESTAMPTZ DEFAULT NOW()
|
|
|
+);
|
|
|
+
|
|
|
+-- payments — платежи за бронирования/подписки
|
|
|
+CREATE TABLE payments (
|
|
|
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
|
+ user_id UUID NOT NULL REFERENCES users(id),
|
|
|
+ amount DECIMAL(10,2) NOT NULL,
|
|
|
+ currency VARCHAR(3) DEFAULT 'RUB',
|
|
|
+ status VARCHAR(20) NOT NULL DEFAULT 'pending', -- pending | completed | failed | refunded
|
|
|
+ payment_method VARCHAR(50),
|
|
|
+ description TEXT,
|
|
|
+ created_at TIMESTAMPTZ DEFAULT NOW(),
|
|
|
+ updated_at TIMESTAMPTZ DEFAULT NOW()
|
|
|
+);
|
|
|
+
|
|
|
+-- subscriptions — подписки фотографов/студий
|
|
|
+CREATE TABLE subscriptions (
|
|
|
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
|
+ user_id UUID NOT NULL REFERENCES users(id),
|
|
|
+ plan VARCHAR(50) NOT NULL, -- 'basic' | 'pro' | 'enterprise'
|
|
|
+ status VARCHAR(20) NOT NULL, -- 'active' | 'cancelled' | 'expired'
|
|
|
+ started_at TIMESTAMPTZ DEFAULT NOW(),
|
|
|
+ expires_at TIMESTAMPTZ,
|
|
|
+ created_at TIMESTAMPTZ DEFAULT NOW(),
|
|
|
+ updated_at TIMESTAMPTZ DEFAULT NOW()
|
|
|
+);
|
|
|
+
|
|
|
+-- visitor_sessions — сессии посетителей (анонимная аналитика)
|
|
|
+CREATE TABLE visitor_sessions (
|
|
|
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
|
+ session_id VARCHAR(255) NOT NULL,
|
|
|
+ place_id UUID REFERENCES places(id),
|
|
|
+ page_url TEXT,
|
|
|
+ referrer TEXT,
|
|
|
+ user_agent TEXT,
|
|
|
+ ip_hash VARCHAR(64),
|
|
|
+ entered_at TIMESTAMPTZ DEFAULT NOW(),
|
|
|
+ exited_at TIMESTAMPTZ
|
|
|
+);
|
|
|
+```
|
|
|
+
|
|
|
+## Go-модели (шаблон)
|
|
|
+
|
|
|
+```go
|
|
|
+// backend/internal/models/moderation.go
|
|
|
+package models
|
|
|
+
|
|
|
+import "time"
|
|
|
+
|
|
|
+type ModerationLog struct {
|
|
|
+ ID string `json:"id" validate:"required,uuid"`
|
|
|
+ ModeratorID string `json:"moderator_id" validate:"required,uuid"`
|
|
|
+ TargetType string `json:"target_type" validate:"required"`
|
|
|
+ TargetID string `json:"target_id" validate:"required,uuid"`
|
|
|
+ Action string `json:"action" validate:"required"`
|
|
|
+ OldStatus *string `json:"old_status,omitempty"`
|
|
|
+ NewStatus *string `json:"new_status,omitempty"`
|
|
|
+ Comment *string `json:"comment,omitempty"`
|
|
|
+ CreatedAt time.Time `json:"created_at"`
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+Аналогично для `Payment`, `Subscription`, `VisitorSession`. Поля `*string` для опциональных колонок (SQL NULL).
|
|
|
+
|
|
|
+## Что понадобится кроме моделей
|
|
|
+
|
|
|
+- **Repository слой**: CRUD-методы для каждой таблицы
|
|
|
+- **Миграции**: проверить, что таблицы уже созданы (если нет — добавить)
|
|
|
+- **Связи**: `payments.user_id` → `users.id`, `visitor_sessions.place_id` → `places.id`
|
|
|
+- **Индексы**: `moderation_log(target_type, target_id)`, `payments(user_id)`, `subscriptions(user_id)`, `visitor_sessions(session_id)`
|
|
|
+
|
|
|
+## Приоритет
|
|
|
+
|
|
|
+| Модель | Нужна для | Приоритет |
|
|
|
+|---|---|---|
|
|
|
+| `ModerationLog` | аудит soft/hard delete | **Высокий** — нужен сразу для deleted-статуса |
|
|
|
+| `Payment` | оплата бронирований/подписок | Средний |
|
|
|
+| `Subscription` | тарифы фотографов/студий | Средний |
|
|
|
+| `VisitorSession` | аналитика посещений | Низкий |
|
|
|
+
|
|
|
+## Связанные заметки
|
|
|
+
|
|
|
+- [[atomic-api-contract-deleted-fulldelete]] — API для deleted статуса
|
|
|
+- [[database-migrations]] — существующие миграции
|
|
|
+
|
|
|
+## Источник
|
|
|
+
|
|
|
+Schema review PhotoPlaces 2026-06. Таблицы созданы миграциями, но не имеют Go-моделей.
|
|
|
+
|
|
|
+#golang #database #models #technical-debt
|