61 lines
2.5 KiB
SQL
61 lines
2.5 KiB
SQL
-- +goose Up
|
|
-- +goose StatementBegin
|
|
|
|
-- =========================================
|
|
-- ENUM: response_status - Статусы отклика
|
|
-- =========================================
|
|
CREATE TYPE response_status AS ENUM (
|
|
'pending', -- Ожидает рассмотрения заявителем
|
|
'accepted', -- Принят (волонтёр взял заявку)
|
|
'rejected', -- Отклонён заявителем
|
|
'cancelled' -- Отменён волонтёром
|
|
);
|
|
|
|
COMMENT ON TYPE response_status IS 'Статусы отклика волонтёра на заявку';
|
|
|
|
-- =========================================
|
|
-- ТАБЛИЦА: volunteer_responses - Отклики волонтёров на заявки
|
|
-- =========================================
|
|
CREATE TABLE volunteer_responses (
|
|
id BIGSERIAL PRIMARY KEY,
|
|
|
|
-- Связи
|
|
request_id BIGINT NOT NULL REFERENCES requests(id) ON DELETE CASCADE,
|
|
volunteer_id BIGINT NOT NULL REFERENCES users(id),
|
|
|
|
-- Статус и сообщение
|
|
status response_status DEFAULT 'pending',
|
|
message TEXT,
|
|
|
|
-- Временные метки
|
|
responded_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
|
accepted_at TIMESTAMP WITH TIME ZONE,
|
|
rejected_at TIMESTAMP WITH TIME ZONE,
|
|
|
|
-- Аудит
|
|
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
-- Ограничение: один волонтёр может откликнуться на заявку только один раз
|
|
UNIQUE(request_id, volunteer_id)
|
|
);
|
|
|
|
-- Комментарии
|
|
COMMENT ON TABLE volunteer_responses IS 'Отклики волонтёров на заявки помощи';
|
|
COMMENT ON COLUMN volunteer_responses.message IS 'Сообщение волонтёра при отклике (опционально)';
|
|
COMMENT ON COLUMN volunteer_responses.responded_at IS 'Время создания отклика';
|
|
|
|
-- Индексы
|
|
CREATE INDEX idx_volunteer_responses_request_id ON volunteer_responses(request_id);
|
|
CREATE INDEX idx_volunteer_responses_volunteer_id ON volunteer_responses(volunteer_id);
|
|
CREATE INDEX idx_volunteer_responses_status ON volunteer_responses(status);
|
|
CREATE INDEX idx_volunteer_responses_volunteer_status ON volunteer_responses(volunteer_id, status);
|
|
|
|
-- +goose StatementEnd
|
|
|
|
-- +goose Down
|
|
-- +goose StatementBegin
|
|
DROP TABLE IF EXISTS volunteer_responses CASCADE;
|
|
DROP TYPE IF EXISTS response_status CASCADE;
|
|
-- +goose StatementEnd
|