-- +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