initial commit

This commit is contained in:
2025-11-29 00:28:21 +05:00
parent 46229acc82
commit ec3b03a935
76 changed files with 13492 additions and 0 deletions

View 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