## Недостающие 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