atomic-missing-go-models.md 4.5 KB

Недостающие Go-модели для таблиц БД

Контекст: В БД есть таблицы 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
);

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_idusers.id, visitor_sessions.place_idplaces.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