000005_create_services_reviews_bookings.up.sql 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. CREATE TABLE services (
  2. id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  3. executor_id UUID NOT NULL REFERENCES users(id),
  4. title VARCHAR(255) NOT NULL,
  5. description TEXT,
  6. price INT NOT NULL,
  7. currency VARCHAR(3) DEFAULT 'RUB',
  8. duration_minutes INT,
  9. status VARCHAR(20) NOT NULL DEFAULT 'published'
  10. CHECK (status IN ('draft', 'published', 'archived')),
  11. rating DECIMAL(2,1) DEFAULT 0,
  12. reviews_count INT DEFAULT 0,
  13. created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
  14. updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),
  15. deleted_at TIMESTAMPTZ
  16. );
  17. CREATE INDEX idx_services_executor_id ON services(executor_id);
  18. CREATE INDEX idx_services_status ON services(status);
  19. CREATE INDEX idx_services_rating ON services(rating);
  20. CREATE TABLE service_images (
  21. id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  22. service_id UUID NOT NULL REFERENCES services(id) ON DELETE CASCADE,
  23. url TEXT NOT NULL,
  24. alt VARCHAR(255),
  25. sort_order INT DEFAULT 0,
  26. created_at TIMESTAMPTZ NOT NULL DEFAULT now()
  27. );
  28. CREATE INDEX idx_service_images_service_id ON service_images(service_id);
  29. CREATE TABLE service_tags (
  30. service_id UUID NOT NULL REFERENCES services(id) ON DELETE CASCADE,
  31. tag_id VARCHAR(50) NOT NULL REFERENCES tags(id),
  32. PRIMARY KEY (service_id, tag_id)
  33. );
  34. CREATE TABLE reviews (
  35. id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  36. user_id UUID NOT NULL REFERENCES users(id),
  37. target_type VARCHAR(10) NOT NULL CHECK (target_type IN ('place', 'service')),
  38. target_id UUID NOT NULL,
  39. rating SMALLINT NOT NULL CHECK (rating >= 1 AND rating <= 5),
  40. text TEXT,
  41. created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
  42. updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),
  43. deleted_at TIMESTAMPTZ,
  44. UNIQUE (user_id, target_type, target_id)
  45. );
  46. CREATE INDEX idx_reviews_target ON reviews(target_type, target_id);
  47. CREATE INDEX idx_reviews_user_id ON reviews(user_id);
  48. CREATE TABLE bookings (
  49. id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  50. place_id UUID NOT NULL REFERENCES places(id),
  51. user_id UUID NOT NULL REFERENCES users(id),
  52. start_time TIMESTAMPTZ NOT NULL,
  53. end_time TIMESTAMPTZ NOT NULL,
  54. status VARCHAR(20) NOT NULL DEFAULT 'pending'
  55. CHECK (status IN ('pending', 'confirmed', 'cancelled', 'completed')),
  56. total_price INT,
  57. currency VARCHAR(3) DEFAULT 'RUB',
  58. comment TEXT,
  59. created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
  60. updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
  61. );
  62. CREATE INDEX idx_bookings_place_id ON bookings(place_id);
  63. CREATE INDEX idx_bookings_user_id ON bookings(user_id);
  64. CREATE INDEX idx_bookings_time ON bookings(start_time, end_time);