Контекст: В БД есть таблицы moderation_log, payments, subscriptions, visitor_sessions, но для них нет Go-структур в backend/internal/models/. Без моделей эти таблицы недоступны через сервисный слой.
-- 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
);
// 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).
payments.user_id → users.id, visitor_sessions.place_id → places.idmoderation_log(target_type, target_id), payments(user_id), subscriptions(user_id), visitor_sessions(session_id)| Модель | Нужна для | Приоритет |
|---|---|---|
ModerationLog |
аудит soft/hard delete | Высокий — нужен сразу для deleted-статуса |
Payment |
оплата бронирований/подписок | Средний |
Subscription |
тарифы фотографов/студий | Средний |
VisitorSession |
аналитика посещений | Низкий |
Schema review PhotoPlaces 2026-06. Таблицы созданы миграциями, но не имеют Go-моделей.
#golang #database #models #technical-debt