From 9bbe06136d95e3bb301417e94f610a2696cd5090 Mon Sep 17 00:00:00 2001 From: Kane Bruce <54819806+csm-kb@users.noreply.github.com> Date: Sun, 2 Mar 2025 04:46:52 -0700 Subject: [PATCH 1/7] supabase: ensure seed + holostars migrations are idempotent --- .../20250202170734_add_holostars.sql | 18 +++++---- supabase/seed.sql | 37 ++++++++++++++++--- 2 files changed, 41 insertions(+), 14 deletions(-) diff --git a/supabase/migrations/20250202170734_add_holostars.sql b/supabase/migrations/20250202170734_add_holostars.sql index 4b07672..6cb5794 100644 --- a/supabase/migrations/20250202170734_add_holostars.sql +++ b/supabase/migrations/20250202170734_add_holostars.sql @@ -1,11 +1,11 @@ -- First transaction: Add new enum values -ALTER TYPE "Generation" ADD VALUE 'STARS Gen 1'; -ALTER TYPE "Generation" ADD VALUE 'STARS Gen 2'; -ALTER TYPE "Generation" ADD VALUE 'STARS Gen 3'; -ALTER TYPE "Generation" ADD VALUE 'UPROAR!!'; -ALTER TYPE "Generation" ADD VALUE 'TEMPUS HQ'; -ALTER TYPE "Generation" ADD VALUE 'TEMPUS VG'; -ALTER TYPE "Generation" ADD VALUE 'ARMIS'; +ALTER TYPE "Generation" ADD VALUE IF NOT EXISTS 'STARS Gen 1'; +ALTER TYPE "Generation" ADD VALUE IF NOT EXISTS 'STARS Gen 2'; +ALTER TYPE "Generation" ADD VALUE IF NOT EXISTS 'STARS Gen 3'; +ALTER TYPE "Generation" ADD VALUE IF NOT EXISTS 'UPROAR!!'; +ALTER TYPE "Generation" ADD VALUE IF NOT EXISTS 'TEMPUS HQ'; +ALTER TYPE "Generation" ADD VALUE IF NOT EXISTS 'TEMPUS VG'; +ALTER TYPE "Generation" ADD VALUE IF NOT EXISTS 'ARMIS'; -- Commit the first transaction COMMIT; @@ -41,4 +41,6 @@ INSERT INTO talents ( ('Jurard T Rexford', 'ジュラルド・ティー・レクスフォード', 'ARMIS', '🦖'), ('Goldbullet', 'ゴールドブレット', 'ARMIS', '🦅'), ('Octavio', 'オクタビオ', 'ARMIS', 'ထ'), - ('Crimzon Ruze', 'クリムゾン・ルーズ', 'ARMIS', '💢'); \ No newline at end of file + ('Crimzon Ruze', 'クリムゾン・ルーズ', 'ARMIS', '💢') +ON CONFLICT (name_en) DO NOTHING +; \ No newline at end of file diff --git a/supabase/seed.sql b/supabase/seed.sql index 18e588c..b04b5cd 100644 --- a/supabase/seed.sql +++ b/supabase/seed.sql @@ -8,13 +8,15 @@ INSERT INTO badges ( '2024-08-24 21:00:00+00', '2024-08-26 00:00:00+00', st_point(-73.957268, 40.645969) -); +) +ON CONFLICT (id) DO NOTHING; INSERT INTO talents ( - id, name_en, name_jp, gen, fanmark + name_en, name_jp, gen, fanmark ) VALUES ( - 1, 'Shiori Novella', 'シオリ・ノヴェラ', 'Advent', '👁️‍🗨️' -); + 'Shiori Novella', 'シオリ・ノヴェラ', 'Advent', '👁️‍🗨️' +) +ON CONFLICT (name_en) DO NOTHING; INSERT INTO auth.users ( id, instance_id, email, raw_user_meta_data @@ -23,7 +25,13 @@ INSERT INTO auth.users ( '00000000-0000-0000-0000-000000000000', 'test@example.com', '{"provider": "discord"}' -); +) +ON CONFLICT (id) DO UPDATE +SET + instance_id = EXCLUDED.instance_id, + email = EXCLUDED.email, + raw_user_meta_data = EXCLUDED.raw_user_meta_data +; INSERT INTO profiles ( id, nickname, avatar_url, talent_ids, badge_ids @@ -41,6 +49,21 @@ SET badge_ids = EXCLUDED.badge_ids ; +INSERT INTO auth.users ( + id, instance_id, email, raw_user_meta_data +) VALUES ( + '8c7ee6e2-3f5d-4dad-b6d7-d04f2012ccc2', + '00000000-0000-0000-0000-000000000001', + 'john@holo.live', + '{"provider": "discord"}' +) +ON CONFLICT (id) DO UPDATE +SET + instance_id = EXCLUDED.instance_id, + email = EXCLUDED.email, + raw_user_meta_data = EXCLUDED.raw_user_meta_data +; + INSERT INTO profiles ( id, nickname, nickname_jp, bio, talent_ids, badge_ids, location, avatar_url ) VALUES ( @@ -52,4 +75,6 @@ INSERT INTO profiles ( array [1], 'JPN', 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/4QCwRXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUAAAABAAAAYgEbAAUAAAABAAAAagEoAAMAAAABAAIAAAExAAIAAAANAAAAcgEyAAIAAAAUAAAAgIdpAAQAAAABAAAAlAAAAAAAAABgAAAAAQAAAGAAAAABR0lNUCAyLjEwLjM0AAAyMDI0OjA4OjA5IDA5OjIzOjEwAAABoAEAAwAAAAEAAQAAAAAAAAAA/+EMzWh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8APD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4NCjx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDQuNC4wLUV4aXYyIj4NCgk8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPg0KCQk8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpHSU1QPSJodHRwOi8vd3d3LmdpbXAub3JnL3htcC8iIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1wTU06RG9jdW1lbnRJRD0iZ2ltcDpkb2NpZDpnaW1wOmIwMGQ5NmIwLTdlOGMtNGI4Ni05MTFmLWQ1Y2RiMzE5OGZhNyIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDowZTM4OWYzZS03YmI3LTQ3NjUtOTBiZS05ZWE0YThkNzZiYTUiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDoxZjE0Yzg1NC1kZDEwLTRmODAtYTc3Ni0xYzE0NTRkNWFmMjQiIGRjOkZvcm1hdD0iaW1hZ2UvanBlZyIgR0lNUDpBUEk9IjIuMCIgR0lNUDpQbGF0Zm9ybT0iV2luZG93cyIgR0lNUDpUaW1lU3RhbXA9IjE3MjMyMTY5OTI4NDY5ODciIEdJTVA6VmVyc2lvbj0iMi4xMC4zNCIgeG1wOkNyZWF0b3JUb29sPSJHSU1QIDIuMTAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjQ6MDg6MDlUMDk6MjM6MTAtMDY6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDI0OjA4OjA5VDA5OjIzOjEwLTA2OjAwIj4NCgkJCTx4bXBNTTpIaXN0b3J5Pg0KCQkJCTxyZGY6U2VxPg0KCQkJCQk8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0OmNoYW5nZWQ9Ii8iIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6ZDM3N2Q5ODctNGU3Yi00ZjM5LTliZGQtMmI3ZDc3NWNhNGZmIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJHaW1wIDIuMTAgKFdpbmRvd3MpIiBzdEV2dDp3aGVuPSIyMDI0LTA4LTA5VDA5OjIzOjEyIi8+DQoJCQkJPC9yZGY6U2VxPg0KCQkJPC94bXBNTTpIaXN0b3J5Pg0KCQk8L3JkZjpEZXNjcmlwdGlvbj4NCgk8L3JkZjpSREY+DQo8L3g6eG1wbWV0YT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3hwYWNrZXQgZW5kPSd3Jz8+/+ICsElDQ19QUk9GSUxFAAEBAAACoGxjbXMEQAAAbW50clJHQiBYWVogB+gACAAJAA8ACQAxYWNzcE1TRlQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPbWAAEAAAAA0y1sY21zAAAAAAAAAAAAAAAAAAAAAAAAAAAA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' -) \ No newline at end of file +) +ON CONFLICT (id) DO NOTHING +; \ No newline at end of file From dd2cf7bb0f762bb9c8183b5a3afa6b32fb4a8e0c Mon Sep 17 00:00:00 2001 From: Kane Bruce <54819806+csm-kb@users.noreply.github.com> Date: Sun, 2 Mar 2025 19:39:13 -0700 Subject: [PATCH 2/7] supabase: migrations to cover initial talent seeding --- .../20250202170734_add_holostars.sql | 15 +++- .../20250202170735_seed_talents.sql | 89 +++++++++++++++++++ .../20250202170736_add_justice_flowglow.sql | 24 +++++ .../migrations/20250202170737_add_sana.sql | 10 +++ .../20250202170738_change_alum_statuses.sql | 7 ++ supabase/seed.sql | 49 +++------- 6 files changed, 153 insertions(+), 41 deletions(-) create mode 100644 supabase/migrations/20250202170735_seed_talents.sql create mode 100644 supabase/migrations/20250202170736_add_justice_flowglow.sql create mode 100644 supabase/migrations/20250202170737_add_sana.sql create mode 100644 supabase/migrations/20250202170738_change_alum_statuses.sql diff --git a/supabase/migrations/20250202170734_add_holostars.sql b/supabase/migrations/20250202170734_add_holostars.sql index 6cb5794..1dc02c5 100644 --- a/supabase/migrations/20250202170734_add_holostars.sql +++ b/supabase/migrations/20250202170734_add_holostars.sql @@ -13,34 +13,45 @@ COMMIT; -- Second transaction: Insert new records INSERT INTO talents ( name_en, name_jp, gen, fanmark -) VALUES +) VALUES + -- STARS Gen 1 ('Hanasaki Miyabi', '花咲みやび', 'STARS Gen 1', '🌺'), ('Kanade Izuru', '奏手イヅル', 'STARS Gen 1', '🎸'), ('Arurandeisu', 'アルランディス', 'STARS Gen 1', '🍕'), ('Rikka', '律可', 'STARS Gen 1', '⚙️'), ('Kagami Kira', '鏡見キラ', 'Alum', '💙'), ('Yakushiji Suzaku', '薬師寺朱雀', 'Alum', '💊'), + -- STARS Gen 2 ('Astel Leda', 'アステル・レダ', 'STARS Gen 2', '🎭'), ('Kishido Temma', '岸堂天真', 'STARS Gen 2', '🦔💨'), ('Yukoku Roberu', '夕刻ロベル', 'STARS Gen 2', '🍷'), + -- STARS Gen 3 ('Kageyama Shien', '影山シエン', 'STARS Gen 3', '🟣'), ('Aragami Oga', '荒咬オウガ', 'STARS Gen 3', '🐃'), ('Tsukishita Kaoru', '月下カオル', 'Alum', '💅'), + -- UPROAR!! ('Yatogami Fuma', '夜十神封魔', 'UPROAR!!', '🦝'), ('Utsugi Uyu', '羽継烏有', 'UPROAR!!', '🃏'), ('Minase Rio', '水無世燐央', 'UPROAR!!', '🕯️'), ('Hizaki Gamma', '緋崎ガンマ', 'Alum', '🖌️'), + -- TEMPUS HQ ('Regis Altare', 'リージス・アルテア', 'TEMPUS HQ', '🎇'), ('Axel Syrios', 'アクセル・シリオス', 'TEMPUS HQ', '⛓️'), ('Magni Dezmond', 'マグニ・デズモンド', 'Alum', '🧤'), ('Noir Vesper', 'ノワール・ヴェスパー', 'Alum', '📗'), + -- TEMPUS VG ('Gavis Bettel', 'ガビス・ベッテル', 'TEMPUS VG', '🎩'), ('Machina X Flayon', 'マキナ・X・フレオン', 'TEMPUS VG', '🪫'), ('Banzoin Hakka', '万象院ハッカ', 'TEMPUS VG', '🔅'), ('Josuiji Shinri', '定水寺シンリ', 'TEMPUS VG', '🏹'), + -- ARMIS ('Jurard T Rexford', 'ジュラルド・ティー・レクスフォード', 'ARMIS', '🦖'), ('Goldbullet', 'ゴールドブレット', 'ARMIS', '🦅'), ('Octavio', 'オクタビオ', 'ARMIS', 'ထ'), ('Crimzon Ruze', 'クリムゾン・ルーズ', 'ARMIS', '💢') -ON CONFLICT (name_en) DO NOTHING +ON CONFLICT (name_en) DO UPDATE +SET + name_jp = EXCLUDED.name_jp, + fanmark = EXCLUDED.fanmark, + gen = EXCLUDED.gen ; \ No newline at end of file diff --git a/supabase/migrations/20250202170735_seed_talents.sql b/supabase/migrations/20250202170735_seed_talents.sql new file mode 100644 index 0000000..8e31d2a --- /dev/null +++ b/supabase/migrations/20250202170735_seed_talents.sql @@ -0,0 +1,89 @@ +INSERT INTO talents ( + name_en, name_jp, fanmark, gen +) VALUES + -- JP: Gen 0 + ('Tokino Sora', 'ときのそら', '🐻', 'Gen 0'), + ('Roboco-san', 'ロボ子さん', '🤖', 'Gen 0'), + ('Sakura Miko', 'さくらみこ', '🌸', 'Gen 0'), + ('Hoshimachi Suisei', '星街すいせい', '☄️', 'Gen 0'), + ('AZKi', 'AZKi', '⚒️', 'Gen 0'), + -- JP: Gen 1 + ('Shirakami Fubuki', '白上フブキ', '🌽', 'Gen 1'), + ('Natsuiro Matsuri', '夏色まつり', '🏮', 'Gen 1'), + ('Akai Haato', '赤井はあと', '❤️‍🔥', 'Gen 1'), + ('Aki Rosenthal', 'アキ・ローゼンタール', '🍎', 'Gen 1'), + ('Yozora Mel', '夜空メル', '🌟', 'Gen 1'), + -- JP: Gen 2 + ('Minato Aqua', '湊あくあ', '⚓️', 'Gen 2'), + ('Murasaki Shion', '紫咲シオン', '🌙', 'Gen 2'), + ('Nakiri Ayame', '百鬼あやめ', '😈', 'Gen 2'), + ('Yuzuki Choco', '癒月ちょこ', '💋', 'Gen 2'), + ('Oozora Subaru', '大空スバル', '🚑', 'Gen 2'), + -- JP: GAMERS + ('Ookami Mio', '大神ミオ', '🌲', 'GAMERS'), + ('Nekomata Okayu', '猫又おかゆ', '🍙', 'GAMERS'), + ('Inugami Korone', '戌神ころね', '🥐', 'GAMERS'), + -- JP: Gen 3 + ('Usada Pekora', '兎田ぺこら', '👯', 'Gen 3'), + ('Shiranui Flare', '不知火フレア', '🔥', 'Gen 3'), + ('Shirogane Noel', '白銀ノエル', '⚔️', 'Gen 3'), + ('Houshou Marine', '宝鐘マリン', '🏴‍☠️', 'Gen 3'), + -- JP: Gen 4 + ('Amane Kanata', '天音かなた', '💫', 'Gen 4'), + ('Tsunomaki Watame', '角巻わため', '🐏', 'Gen 4'), + ('Tokoyami Towa', '常闇トワ', '👾', 'Gen 4'), + ('Himemori Luna', '姫森ルーナ', '🍬', 'Gen 4'), + -- JP: Gen 5 + ('Yukihana Lamy', '雪花ラミィ', '☃️', 'Gen 5'), + ('Momosuzu Nene', '桃鈴ねね', '🍑', 'Gen 5'), + ('Shishiro Botan', '獅白ぼたん', '♌', 'Gen 5'), + ('Omaru Polka', '尾丸ポルカ', '🎪', 'Gen 5'), + -- JP: holoX + ('La+ Darknesss', 'ラプラス・ダークネス', '🛸', 'holoX'), + ('Takane Lui', '鷹嶺ルイ', '🥀', 'holoX'), + ('Hakui Koyori', '博衣こより', '🧪', 'holoX'), + ('Sakamata Chloe', '沙花叉クロヱ', '🎣', 'holoX'), + ('Kazama Iroha', '風真いろは', '🍃', 'holoX'), + -- ID + ('Ayunda Risu', 'アユンダ・リス', '🐿️', 'Indonesia'), + ('Moona Hoshinova', 'ムーナ・ホシノヴァ', '🔮', 'Indonesia'), + ('Airani Iofifteen', 'アイラニ・イオフィフティーン', '🎨', 'Indonesia'), + ('Kureiji Ollie', 'クレイジー・オリー', '🧟‍♀️', 'Indonesia'), + ('Anya Melfissa', 'アーニャ・メルフィッサ', '🍂', 'Indonesia'), + ('Pavolia Reine', 'パヴォリア・レイネ', '🦚', 'Indonesia'), + ('Vestia Zeta', 'ベスティア・ゼータ', '📜', 'Indonesia'), + ('Kaela Kovalskia', 'カエラ・コヴァルスキア', '🔨', 'Indonesia'), + ('Kobo Kanaeru', 'こぼ・かなえる', '☔', 'Indonesia'), + -- EN: Myth + ('Mori Calliope', 'もりかりおぺ', '💀', 'Myth'), + ('Takanashi Kiara', 'たかなしきあら', '🐔', 'Myth'), + ('Ninomae Ina''nis', '一伊那尓栖/にのまえいなにす', '🐙', 'Myth'), + ('Gawr Gura', 'がうる・ぐら', '🔱', 'Myth'), + ('Watson Amelia', 'ワトソン・アメリア', '🔎', 'Myth'), + -- EN: Promise + ('IRyS', 'IRyS', '💎', 'Promise'), + ('Ceres Fauna', 'セレス・ファウナ', '🌿', 'Promise'), + ('Ouro Kronii', 'オーロ・クロニー', '⌛', 'Promise'), + ('Nanashi Mumei', '七詩ムメイ', '🪶', 'Promise'), + ('Hakos Baelz', 'ハコス・ベールズ', '🎲', 'Promise'), + -- EN: Advent + ('Shiori Novella', 'シオリ・ノヴェラ', '👁️‍🗨️', 'Advent'), + ('Koseki Bijou', '古石ビジュー', '🗿', 'Advent'), + ('Nerissa Ravencroft', 'ネリッサ・レイヴンクロフト', '🎼', 'Advent'), + ('Fuwawa Abyssgard', 'フワワ・アビスガード', '🐾🩵', 'Advent'), + ('Mococo Abyssgard', 'モココ・アビスガード', '🐾🩷 ', 'Advent'), + -- JP: ReGLOSS + ('Hiodoshi Ao', '火威青', '🖋️', 'ReGLOSS'), + ('Otonose Kanade', '音乃瀬奏', '🎹✨', 'ReGLOSS'), + ('Ichijou Ririka', '一条莉々華', '🌃', 'ReGLOSS'), + ('Juufuutei Raden', '儒烏風亭らでん', '🐚', 'ReGLOSS'), + ('Todoroki Hajime', '轟はじめ', '🐧⚡️', 'ReGLOSS'), + -- Office Staff + ('A-chan', '友人A', '👓', 'Office Staff'), + ('Harusaki Nodoka', '春先のどか', '📝', 'Office Staff') +ON CONFLICT (name_en) DO UPDATE +SET + name_jp = EXCLUDED.name_jp, + fanmark = EXCLUDED.fanmark, + gen = EXCLUDED.gen +; \ No newline at end of file diff --git a/supabase/migrations/20250202170736_add_justice_flowglow.sql b/supabase/migrations/20250202170736_add_justice_flowglow.sql new file mode 100644 index 0000000..272efde --- /dev/null +++ b/supabase/migrations/20250202170736_add_justice_flowglow.sql @@ -0,0 +1,24 @@ +ALTER TYPE "Generation" ADD VALUE IF NOT EXISTS 'Justice'; +ALTER TYPE "Generation" ADD VALUE IF NOT EXISTS 'FLOW GLOW'; +COMMIT; + +INSERT INTO talents ( + name_en, name_jp, fanmark, gen +) VALUES + -- Justice + ('Elizabeth Rose Bloodflame', 'エリザベス・ローズ・ブラッドフレイム', '💄', 'Justice'), + ('Gigi Murin', 'ジジ・ムリン', '👧', 'Justice'), + ('Cecilia Immergreen', 'セシリア・イマーグリーン', '🍵', 'Justice'), + ('Raora Panthera', 'ラオーラ・パンテーラ', '🐱', 'Justice'), + -- FLOW GLOW + ('Isaki Riona', '響咲リオナ', '🎤👑', 'FLOW GLOW'), + ('Koganei Niko', '虎金妃笑虎', '☺️🐅', 'FLOW GLOW'), + ('Mizumiya Su', '水宮枢', '💬', 'FLOW GLOW'), + ('Rindo Chihaya', '輪堂 千速', '🎧🔧', 'FLOW GLOW'), + ('Kikirara Vivi', '綺々羅々ヴィヴィ', '💅✨', 'FLOW GLOW') +ON CONFLICT (name_en) DO UPDATE +SET + name_jp = EXCLUDED.name_jp, + fanmark = EXCLUDED.fanmark, + gen = EXCLUDED.gen +; \ No newline at end of file diff --git a/supabase/migrations/20250202170737_add_sana.sql b/supabase/migrations/20250202170737_add_sana.sql new file mode 100644 index 0000000..f27af91 --- /dev/null +++ b/supabase/migrations/20250202170737_add_sana.sql @@ -0,0 +1,10 @@ +INSERT INTO talents ( + name_en, name_jp, fanmark, gen +) VALUES + ('Tsukumo Sana', '九十九 佐命', '🪐', 'Alum') +ON CONFLICT (name_en) DO UPDATE +SET + name_jp = EXCLUDED.name_jp, + fanmark = EXCLUDED.fanmark, + gen = EXCLUDED.gen +; \ No newline at end of file diff --git a/supabase/migrations/20250202170738_change_alum_statuses.sql b/supabase/migrations/20250202170738_change_alum_statuses.sql new file mode 100644 index 0000000..b5d1d10 --- /dev/null +++ b/supabase/migrations/20250202170738_change_alum_statuses.sql @@ -0,0 +1,7 @@ +UPDATE talents + SET gen = 'Alum' +WHERE name_en in ( + 'Watson Amelia', + 'Ceres Fauna', + 'Sakamata Chloe' +); \ No newline at end of file diff --git a/supabase/seed.sql b/supabase/seed.sql index b04b5cd..4beb910 100644 --- a/supabase/seed.sql +++ b/supabase/seed.sql @@ -1,7 +1,6 @@ INSERT INTO badges ( - id, name, type, external_url, event_start, event_end, location + name, type, external_url, event_start, event_end, location ) VALUES ( - 1, 'hololive English 2nd Concert -Breaking Dimensions-', 'concert', 'https://breakingdimensions.hololivepro.com/', @@ -9,14 +8,16 @@ INSERT INTO badges ( '2024-08-26 00:00:00+00', st_point(-73.957268, 40.645969) ) -ON CONFLICT (id) DO NOTHING; +ON CONFLICT (name) DO UPDATE +SET + type = EXCLUDED.type, + external_url = EXCLUDED.external_url, + event_start = EXCLUDED.event_start, + event_end = EXCLUDED.event_end, + location = EXCLUDED.location +; -INSERT INTO talents ( - name_en, name_jp, gen, fanmark -) VALUES ( - 'Shiori Novella', 'シオリ・ノヴェラ', 'Advent', '👁️‍🗨️' -) -ON CONFLICT (name_en) DO NOTHING; +------ INSERT INTO auth.users ( id, instance_id, email, raw_user_meta_data @@ -47,34 +48,4 @@ SET avatar_url = EXCLUDED.avatar_url, talent_ids = EXCLUDED.talent_ids, badge_ids = EXCLUDED.badge_ids -; - -INSERT INTO auth.users ( - id, instance_id, email, raw_user_meta_data -) VALUES ( - '8c7ee6e2-3f5d-4dad-b6d7-d04f2012ccc2', - '00000000-0000-0000-0000-000000000001', - 'john@holo.live', - '{"provider": "discord"}' -) -ON CONFLICT (id) DO UPDATE -SET - instance_id = EXCLUDED.instance_id, - email = EXCLUDED.email, - raw_user_meta_data = EXCLUDED.raw_user_meta_data -; - -INSERT INTO profiles ( - id, nickname, nickname_jp, bio, talent_ids, badge_ids, location, avatar_url -) VALUES ( - '8c7ee6e2-3f5d-4dad-b6d7-d04f2012ccc2', - 'John Hololive', - 'ジョン・ホロライブ', - 'ジョンです~!', - array [1], - array [1], - 'JPN', - 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/4QCwRXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUAAAABAAAAYgEbAAUAAAABAAAAagEoAAMAAAABAAIAAAExAAIAAAANAAAAcgEyAAIAAAAUAAAAgIdpAAQAAAABAAAAlAAAAAAAAABgAAAAAQAAAGAAAAABR0lNUCAyLjEwLjM0AAAyMDI0OjA4OjA5IDA5OjIzOjEwAAABoAEAAwAAAAEAAQAAAAAAAAAA/+EMzWh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8APD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4NCjx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDQuNC4wLUV4aXYyIj4NCgk8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPg0KCQk8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpHSU1QPSJodHRwOi8vd3d3LmdpbXAub3JnL3htcC8iIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1wTU06RG9jdW1lbnRJRD0iZ2ltcDpkb2NpZDpnaW1wOmIwMGQ5NmIwLTdlOGMtNGI4Ni05MTFmLWQ1Y2RiMzE5OGZhNyIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDowZTM4OWYzZS03YmI3LTQ3NjUtOTBiZS05ZWE0YThkNzZiYTUiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDoxZjE0Yzg1NC1kZDEwLTRmODAtYTc3Ni0xYzE0NTRkNWFmMjQiIGRjOkZvcm1hdD0iaW1hZ2UvanBlZyIgR0lNUDpBUEk9IjIuMCIgR0lNUDpQbGF0Zm9ybT0iV2luZG93cyIgR0lNUDpUaW1lU3RhbXA9IjE3MjMyMTY5OTI4NDY5ODciIEdJTVA6VmVyc2lvbj0iMi4xMC4zNCIgeG1wOkNyZWF0b3JUb29sPSJHSU1QIDIuMTAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjQ6MDg6MDlUMDk6MjM6MTAtMDY6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDI0OjA4OjA5VDA5OjIzOjEwLTA2OjAwIj4NCgkJCTx4bXBNTTpIaXN0b3J5Pg0KCQkJCTxyZGY6U2VxPg0KCQkJCQk8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0OmNoYW5nZWQ9Ii8iIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6ZDM3N2Q5ODctNGU3Yi00ZjM5LTliZGQtMmI3ZDc3NWNhNGZmIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJHaW1wIDIuMTAgKFdpbmRvd3MpIiBzdEV2dDp3aGVuPSIyMDI0LTA4LTA5VDA5OjIzOjEyIi8+DQoJCQkJPC9yZGY6U2VxPg0KCQkJPC94bXBNTTpIaXN0b3J5Pg0KCQk8L3JkZjpEZXNjcmlwdGlvbj4NCgk8L3JkZjpSREY+DQo8L3g6eG1wbWV0YT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3hwYWNrZXQgZW5kPSd3Jz8+/+ICsElDQ19QUk9GSUxFAAEBAAACoGxjbXMEQAAAbW50clJHQiBYWVogB+gACAAJAA8ACQAxYWNzcE1TRlQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPbWAAEAAAAA0y1sY21zAAAAAAAAAAAAAAAAAAAAAAAAAAAA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' -) -ON CONFLICT (id) DO NOTHING ; \ No newline at end of file From fbcf1b949fd94ac4a73b2606caf623891a7284ef Mon Sep 17 00:00:00 2001 From: Kane Bruce <54819806+csm-kb@users.noreply.github.com> Date: Sun, 2 Mar 2025 19:39:29 -0700 Subject: [PATCH 3/7] supabase: migration for adding sort keys to talents by gen --- .../20250302115105_add_talents_sort_key.sql | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 supabase/migrations/20250302115105_add_talents_sort_key.sql diff --git a/supabase/migrations/20250302115105_add_talents_sort_key.sql b/supabase/migrations/20250302115105_add_talents_sort_key.sql new file mode 100644 index 0000000..2e02a54 --- /dev/null +++ b/supabase/migrations/20250302115105_add_talents_sort_key.sql @@ -0,0 +1,46 @@ +ALTER TABLE talents + ADD COLUMN IF NOT EXISTS sort_order INTEGER NOT NULL DEFAULT 0 +; + +-- Set gen debut orders, grouped by branch +WITH debut_order AS ( + SELECT gen, sort_order FROM ( + VALUES + -- Hololive: JP + ('Gen 0', 0), + ('Gen 1', 1), + ('Gen 2', 2), + ('GAMERS', 3), + ('Gen 3', 4), + ('Gen 4', 5), + ('Gen 5', 6), + ('holoX', 7), + -- Hololive: DEV_IS + ('ReGLOSS', 100), + ('FLOW GLOW', 101), + -- Hololive: ID + ('Indonesia', 200), + -- Hololive: EN + ('Myth', 300), + ('Promise', 301), + ('Advent', 302), + ('Justice', 303), + -- Holostars: JP + ('STARS Gen 1', 1000), + ('STARS Gen 2', 1001), + ('STARS Gen 3', 1002), + ('UPROAR!!', 1003), + -- Holostars: EN + ('TEMPUS HQ', 1100), + ('TEMPUS VG', 1101), + ('ARMIS', 1102), + -- Cover + ('Alum', 2000), + ('Office Staff', 2001) + ) s(gen, sort_order) +) +UPDATE talents + SET sort_order = debut_order.sort_order +FROM debut_order +WHERE talents.gen = debut_order.gen::"Generation" +; \ No newline at end of file From c6d087f241849bd8c619891267192a66a07394e9 Mon Sep 17 00:00:00 2001 From: Kane Bruce <54819806+csm-kb@users.noreply.github.com> Date: Sun, 2 Mar 2025 20:23:14 -0700 Subject: [PATCH 4/7] mypass: use sort_order to order talent fetch --- src/routes/mypass/edit/+page.server.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/routes/mypass/edit/+page.server.ts b/src/routes/mypass/edit/+page.server.ts index 7990d68..15fbb0a 100644 --- a/src/routes/mypass/edit/+page.server.ts +++ b/src/routes/mypass/edit/+page.server.ts @@ -40,7 +40,11 @@ export const load = (async ({ locals }) => { return {}; } - const { data: talents, error: error2 } = await supabase.from('talents').select('*'); + const { data: talents, error: error2 } = ( + await supabase.from('talents') + .select('*') + .order('sort_order', { ascending: true }) + ); if (error2) { console.error('error2', error); From 6177cc1afa20fc993b0ae4bc660242a37f3b91a1 Mon Sep 17 00:00:00 2001 From: Kane Bruce <54819806+csm-kb@users.noreply.github.com> Date: Sun, 2 Mar 2025 20:23:48 -0700 Subject: [PATCH 5/7] mypass: expose form errors on edit page --- src/routes/mypass/edit/+page.svelte | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/routes/mypass/edit/+page.svelte b/src/routes/mypass/edit/+page.svelte index 6266694..1f7b95e 100644 --- a/src/routes/mypass/edit/+page.svelte +++ b/src/routes/mypass/edit/+page.svelte @@ -2,12 +2,12 @@ import { fade } from 'svelte/transition'; import Avatar from '$lib/components/Avatar.svelte'; - import type { PageData } from './$types'; + import type { ActionData, PageData } from './$types'; import type { Talent } from '../../../custom'; import FormTextInput from '$lib/components/FormTextInput.svelte'; interface Props { - form: any; + form: ActionData; data: PageData; } @@ -158,6 +158,14 @@ + {#if !form?.success && form?.errors !== undefined} + + {/if} +