initial commit
This commit is contained in:
60
migrations/00006_create_volunteer_responses_table.sql
Normal file
60
migrations/00006_create_volunteer_responses_table.sql
Normal file
@@ -0,0 +1,60 @@
|
||||
-- +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
|
||||
Reference in New Issue
Block a user