forked from jmug/cactoide
feat: add search bar for /discovery and seed.sql for populating random data
This commit is contained in:
77
database/seed.sql
Normal file
77
database/seed.sql
Normal file
@@ -0,0 +1,77 @@
|
||||
BEGIN;
|
||||
|
||||
-- Optional: start clean (will also remove RSVPs via CASCADE)
|
||||
TRUNCATE TABLE events CASCADE;
|
||||
|
||||
-- -----------------------------
|
||||
-- Seed 100 events
|
||||
-- -----------------------------
|
||||
WITH params AS (
|
||||
SELECT
|
||||
ARRAY[
|
||||
'Budapest', 'Berlin', 'Paris', 'Madrid', 'Rome', 'Vienna', 'Prague',
|
||||
'Warsaw', 'Amsterdam', 'Lisbon', 'Copenhagen', 'Dublin', 'Athens',
|
||||
'Zurich', 'Helsinki', 'Oslo', 'Stockholm', 'Brussels', 'Munich', 'Milan'
|
||||
]::text[] AS cities,
|
||||
ARRAY['Hall','Park','Rooftop','Auditorium','Conference Center','Café','Online']::text[] AS venues,
|
||||
ARRAY['Tech Talk','Meetup','Workshop','Concert','Yoga','Brunch','Game Night','Hackathon','Book Club','Networking']::text[] AS themes
|
||||
),
|
||||
to_insert AS (
|
||||
SELECT
|
||||
-- 8-char ID (hex)
|
||||
LEFT(ENCODE(gen_random_bytes(4), 'hex'), 8) AS id,
|
||||
-- Make varied names by mixing a theme and city
|
||||
(SELECT themes[(gs % array_length(themes,1)) + 1] FROM params) || ' @ ' ||
|
||||
(SELECT cities[(gs % array_length(cities,1)) + 1] FROM params) AS name,
|
||||
-- Spread dates across past and future (centered around today)
|
||||
(CURRENT_DATE + (gs - 50))::date AS date,
|
||||
-- Varied times: between 08:00 and 19:xx
|
||||
make_time( (8 + (gs % 12))::int, (gs*7 % 60)::int, 0)::time AS time,
|
||||
-- City + venue
|
||||
(SELECT cities[(gs % array_length(cities,1)) + 1] FROM params) || ' ' ||
|
||||
(SELECT venues[(gs % array_length(venues,1)) + 1] FROM params) AS location,
|
||||
-- Alternate types
|
||||
CASE WHEN gs % 2 = 0 THEN 'limited' ELSE 'unlimited' END AS type,
|
||||
-- Only set attendee_limit for limited events
|
||||
CASE WHEN gs % 2 = 0 THEN 10 + (gs % 40) ELSE NULL END AS attendee_limit,
|
||||
-- Rotate through 20 user_ids
|
||||
'user_' || ((gs % 20) + 1)::text AS user_id,
|
||||
-- Mix public/private
|
||||
CASE WHEN gs % 3 = 0 THEN 'private' ELSE 'public' END AS visibility
|
||||
FROM generate_series(1, 100) AS gs
|
||||
)
|
||||
INSERT INTO events (id, name, date, time, location, type, attendee_limit, user_id, visibility, created_at, updated_at)
|
||||
SELECT id, name, date, time, location, type, attendee_limit, user_id, visibility, NOW(), NOW()
|
||||
FROM to_insert;
|
||||
|
||||
-- -----------------------------
|
||||
-- Seed RSVPs
|
||||
-- - For limited events: 0..attendee_limit attendees
|
||||
-- - For unlimited events: 0..75 attendees
|
||||
-- -----------------------------
|
||||
WITH ev AS (
|
||||
SELECT e.id, e.type, e.attendee_limit
|
||||
FROM events e
|
||||
),
|
||||
counts AS (
|
||||
SELECT
|
||||
id,
|
||||
type,
|
||||
attendee_limit,
|
||||
CASE
|
||||
WHEN type = 'limited' THEN GREATEST(0, LEAST(attendee_limit, FLOOR(random() * (COALESCE(attendee_limit,0) + 1))::int))
|
||||
ELSE FLOOR(random() * 76)::int
|
||||
END AS rsvp_count
|
||||
FROM ev
|
||||
)
|
||||
INSERT INTO rsvps (event_id, name, user_id, created_at, updated_at)
|
||||
SELECT
|
||||
c.id AS event_id,
|
||||
'Attendee ' || c.id || '-' || g AS name,
|
||||
-- distribute user_ids across 200 synthetic users, deterministically mixed per event
|
||||
'user_' || ((ABS(HASHTEXT(c.id)) + g) % 200 + 1)::text AS user_id,
|
||||
NOW(), NOW()
|
||||
FROM counts c
|
||||
JOIN LATERAL generate_series(1, c.rsvp_count) AS g ON TRUE;
|
||||
|
||||
COMMIT;
|
||||
Reference in New Issue
Block a user