diff --git a/db/init/000_init.sql b/db/init/000_init.sql index add1b83e..88fb7203 100644 --- a/db/init/000_init.sql +++ b/db/init/000_init.sql @@ -89,6 +89,13 @@ CREATE TABLE IF NOT EXISTS content_warnings ); CREATE UNIQUE INDEX content_warnings_warning on content_warnings(warning); +CREATE TABLE IF NOT EXISTS board_categories +( + id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL, + string_id TEXT NOT NULL, + name TEXT NOT NULL +); + CREATE TABLE IF NOT EXISTS boards ( id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL, @@ -100,6 +107,7 @@ CREATE TABLE IF NOT EXISTS boards /* Reference to the id of the image on external storage provider. */ avatar_reference_id TEXT, parent_realm_id BIGINT REFERENCES realms(id) ON DELETE RESTRICT NOT NULL, + board_category_id BIGINT REFERENCES board_categories(id) ON DELETE RESTRICT NOT NULL, settings JSONB NOT NULL ); CREATE UNIQUE INDEX boards_string_id on boards(string_id); diff --git a/db/test_db_init/000_insert.sql b/db/test_db_init/000_insert.sql index 9ac37a7b..bd2051ee 100644 --- a/db/test_db_init/000_insert.sql +++ b/db/test_db_init/000_insert.sql @@ -15,18 +15,25 @@ OVERRIDING SYSTEM VALUE VALUES 'We''re very nice here.', NULL); -INSERT INTO Boards(id, string_id, slug, tagline, avatar_reference_id, parent_realm_id, settings) +INSERT INTO board_categories (id, string_id, name) +OVERRIDING SYSTEM VALUE VALUES + (1, '9449bcab-fa55-4b0e-9ce0-438501e5fa79', 'main'), + (2, 'dc3e5824-5395-4cad-ae90-9bf7efeb3896', 'fandom'), + (3, '6443b26c-9247-4b23-b5df-8752356796ce', 'tests'), + (4, '02852b3d-47d6-42cc-a47e-6924b8a13d28', 'admin'); + +INSERT INTO Boards(id, string_id, slug, board_category_id, tagline, avatar_reference_id, parent_realm_id, settings) OVERRIDING SYSTEM VALUE VALUES - (1, '2fb151eb-c600-4fe4-a542-4662487e5496', 'main_street', 'For BobaBoard-related discussions.', 'villains.png', 1, '{ "accentColor": "#ff5252" }'), - (2, 'c6d3d10e-8e49-4d73-b28a-9d652b41beec', 'gore', 'Blood! Blood! Blood!', 'gore.png', 1, '{ "accentColor": "#f96680" }'), - (3, '4b30fb7c-2aca-4333-aa56-ae8623a92b65', 'anime', 'I wish I had a funny one for this.', 'anime.png', 1, '{ "accentColor": "#24d282"}'), - (4, 'db8dc5b3-5b4a-4bfe-a303-e176c9b00b83', 'long', 'A board to test with many posts.', 'onceler-board.png', 1, '{ "accentColor": "#00b8ff"}'), - (5, '0e0d1ee6-f996-4415-89c1-c9dc1fe991dc', 'memes', 'A board to test collections view.', 'kink-meme.png', 1, '{ "accentColor": "#7b00ff"}'), - (6, '2bdce2fa-12e0-461b-b0fb-1a2e67227434', 'muted', 'A board to test for thread muting.', 'https://firebasestorage.googleapis.com/v0/b/bobaboard-fb.appspot.com/o/images%2Fbobaland%2Fc26e8ce9-a547-4ff4-9486-7a2faca4d873%2Feded338a-e0e5-4a97-a368-5ae525c0eec4?alt=media&token=914f84b7-a581-430e-bb09-695f653e8e02', 1, '{ "accentColor": "#9b433b" }'), - (7, '58a10fba-dd66-4862-83fd-c0a233c59599', 'ssshh', 'A board to test for board muting.', 'https://firebasestorage.googleapis.com/v0/b/bobaboard-fb.appspot.com/o/images%2Fbobaland%2Fc26e8ce9-a547-4ff4-9486-7a2faca4d873%2F7a4c4b8c-dce4-49ad-b292-f799473fbcd6?alt=media&token=f0aa1b5a-80ba-4c32-8bc3-5aa5633cf4e4', 1, '{ "accentColor": "#00A0B0" }'), - (8, '76ebaab0-6c3e-4d7b-900f-f450625a5ed3','restricted', 'A board to test for logged-in only view', 'https://firebasestorage.googleapis.com/v0/b/bobaboard-fb.appspot.com/o/images%2Fgore%2Fe4e263cf-ee98-4902-9c14-c10299210e01.png?alt=media&token=7c170411-9401-4d4e-9f66-5d6dfee2fccd', 1, '{ "accentColor": "#234a69"}'), - (9, 'bb62b150-62ae-40a8-8ce2-7e5cdeae9d0b','delisted', 'A board to test for link-only view', 'https://firebasestorage.googleapis.com/v0/b/bobaboard-fb.appspot.com/o/images%2Fbobaland%2Fc26e8ce9-a547-4ff4-9486-7a2faca4d873%2Fc3b86805-4df7-4b1a-9fa2-b96b5165a636?alt=media&token=7652d44a-38cb-40cc-82ef-908cd4265840', 1, '{ "accentColor": "#fa8628"}'), - (10, '2895f9c8-8419-4ab8-b33d-3ad18e77a589','MODS', 'HELP! I NEED AN ADULT!', 'https://firebasestorage.googleapis.com/v0/b/bobaboard-fb.appspot.com/o/images%2Fbobaland%2Fc26e8ce9-a547-4ff4-9486-7a2faca4d873%2Fc3b86805-4df7-4b1a-9fa2-b96b5165a636?alt=media&token=7652d44a-38cb-40cc-82ef-908cd4265840', 2, '{ "accentColor": "#fa8628"}'); + (1, '2fb151eb-c600-4fe4-a542-4662487e5496', 'main_street', 1, 'For BobaBoard-related discussions.', 'villains.png', 1, '{ "accentColor": "#ff5252" }'), + (2, 'c6d3d10e-8e49-4d73-b28a-9d652b41beec', 'gore', 2, 'Blood! Blood! Blood!', 'gore.png', 1, '{ "accentColor": "#f96680" }'), + (3, '4b30fb7c-2aca-4333-aa56-ae8623a92b65', 'anime', 2, 'I wish I had a funny one for this.', 'anime.png', 1, '{ "accentColor": "#24d282"}'), + (4, 'db8dc5b3-5b4a-4bfe-a303-e176c9b00b83', 'long', 3, 'A board to test with many posts.', 'onceler-board.png', 1, '{ "accentColor": "#00b8ff"}'), + (5, '0e0d1ee6-f996-4415-89c1-c9dc1fe991dc', 'memes', 2, 'A board to test collections view.', 'kink-meme.png', 1, '{ "accentColor": "#7b00ff"}'), + (6, '2bdce2fa-12e0-461b-b0fb-1a2e67227434', 'muted', 3, 'A board to test for thread muting.', 'https://firebasestorage.googleapis.com/v0/b/bobaboard-fb.appspot.com/o/images%2Fbobaland%2Fc26e8ce9-a547-4ff4-9486-7a2faca4d873%2Feded338a-e0e5-4a97-a368-5ae525c0eec4?alt=media&token=914f84b7-a581-430e-bb09-695f653e8e02', 1, '{ "accentColor": "#9b433b" }'), + (7, '58a10fba-dd66-4862-83fd-c0a233c59599', 'ssshh', 3, 'A board to test for board muting.', 'https://firebasestorage.googleapis.com/v0/b/bobaboard-fb.appspot.com/o/images%2Fbobaland%2Fc26e8ce9-a547-4ff4-9486-7a2faca4d873%2F7a4c4b8c-dce4-49ad-b292-f799473fbcd6?alt=media&token=f0aa1b5a-80ba-4c32-8bc3-5aa5633cf4e4', 1, '{ "accentColor": "#00A0B0" }'), + (8, '76ebaab0-6c3e-4d7b-900f-f450625a5ed3','restricted', 3, 'A board to test for logged-in only view', 'https://firebasestorage.googleapis.com/v0/b/bobaboard-fb.appspot.com/o/images%2Fgore%2Fe4e263cf-ee98-4902-9c14-c10299210e01.png?alt=media&token=7c170411-9401-4d4e-9f66-5d6dfee2fccd', 1, '{ "accentColor": "#234a69"}'), + (9, 'bb62b150-62ae-40a8-8ce2-7e5cdeae9d0b','delisted', 3, 'A board to test for link-only view', 'https://firebasestorage.googleapis.com/v0/b/bobaboard-fb.appspot.com/o/images%2Fbobaland%2Fc26e8ce9-a547-4ff4-9486-7a2faca4d873%2Fc3b86805-4df7-4b1a-9fa2-b96b5165a636?alt=media&token=7652d44a-38cb-40cc-82ef-908cd4265840', 1, '{ "accentColor": "#fa8628"}'), + (10, '2895f9c8-8419-4ab8-b33d-3ad18e77a589','MODS', 4, 'HELP! I NEED AN ADULT!', 'https://firebasestorage.googleapis.com/v0/b/bobaboard-fb.appspot.com/o/images%2Fbobaland%2Fc26e8ce9-a547-4ff4-9486-7a2faca4d873%2Fc3b86805-4df7-4b1a-9fa2-b96b5165a636?alt=media&token=7652d44a-38cb-40cc-82ef-908cd4265840', 2, '{ "accentColor": "#fa8628"}'); INSERT INTO board_description_sections (id, string_id, board_id,title, description, "type", "index") OVERRIDING SYSTEM VALUE VALUES diff --git a/server/boards/sql/all-boards.sql b/server/boards/sql/all-boards.sql index 39e31155..07615ea0 100644 --- a/server/boards/sql/all-boards.sql +++ b/server/boards/sql/all-boards.sql @@ -11,6 +11,7 @@ SELECT boards.tagline, boards.avatar_reference_id, boards.settings, + board_categories.string_id as board_categories_external_id, MAX(posts.last_activity) as last_post_at, MAX(comments.last_activity) as last_comment_at, GREATEST(MAX(COMMENTS.last_activity), MAX(posts.last_activity)) AS last_activity_at, @@ -107,5 +108,7 @@ LEFT JOIN LATERAL ( AND user_hidden_threads.thread_id IS NULL AND comments.parent_thread = threads.id) as comments ON 1=1 + JOIN board_categories + on boards.board_category_id = board_categories.id WHERE $/realm_external_id/ IS NULL OR realms.string_id = $/realm_external_id/ -GROUP BY boards.id, user_muted_boards.board_id, ordered_pinned_boards.INDEX, logged_out_restrictions, logged_in_base_restrictions, logged_in_user.id, realms.string_id +GROUP BY boards.id, user_muted_boards.board_id, ordered_pinned_boards.INDEX, logged_out_restrictions, logged_in_base_restrictions, logged_in_user.id, realms.string_id, board_categories.string_id diff --git a/server/boards/sql/board-by-external-id.sql b/server/boards/sql/board-by-external-id.sql index ba716b3b..d596c00b 100644 --- a/server/boards/sql/board-by-external-id.sql +++ b/server/boards/sql/board-by-external-id.sql @@ -9,6 +9,7 @@ SELECT boards.tagline, boards.avatar_reference_id as avatar_url, boards.settings, + board_categories.string_id as board_categories_external_id, realms.string_id as realm_external_id, COALESCE(json_agg(DISTINCT jsonb_build_object( 'id', bds.string_id, @@ -80,5 +81,7 @@ FROM boards ON boards.id = br.board_id LEFT JOIN logged_in_user ON 1=1 + JOIN board_categories + on boards.board_category_id = board_categories.id WHERE boards.string_id=${board_id} -GROUP BY boards.id, realms.string_id, umb.user_id, opb.index, br.logged_out_restrictions, br.logged_in_base_restrictions, logged_in_user.id +GROUP BY boards.id, realms.string_id, umb.user_id, opb.index, br.logged_out_restrictions, br.logged_in_base_restrictions, logged_in_user.id, board_categories.string_id diff --git a/server/boards/tests/data-all.test.ts b/server/boards/tests/data-all.test.ts index 94898bf7..3e7d7503 100644 --- a/server/boards/tests/data-all.test.ts +++ b/server/boards/tests/data-all.test.ts @@ -10,6 +10,7 @@ const extractBoardDetails = (boardData: any) => { slug: boardData.slug, external_id: boardData.string_id, realm_external_id: boardData.realm_external_id, + board_categories_external_id: boardData.board_categories_external_id, tagline: boardData.tagline, }; }; @@ -55,6 +56,7 @@ describe("Tests boards queries", () => { slug: "main_street", external_id: "2fb151eb-c600-4fe4-a542-4662487e5496", realm_external_id: TWISTED_MINDS_REALM_EXTERNAL_ID, + board_categories_external_id: "9449bcab-fa55-4b0e-9ce0-438501e5fa79", tagline: "For BobaBoard-related discussions.", }, { @@ -65,6 +67,7 @@ describe("Tests boards queries", () => { slug: "gore", external_id: "c6d3d10e-8e49-4d73-b28a-9d652b41beec", realm_external_id: TWISTED_MINDS_REALM_EXTERNAL_ID, + board_categories_external_id: "dc3e5824-5395-4cad-ae90-9bf7efeb3896", tagline: "Blood! Blood! Blood!", }, { @@ -75,6 +78,7 @@ describe("Tests boards queries", () => { slug: "anime", external_id: "4b30fb7c-2aca-4333-aa56-ae8623a92b65", realm_external_id: TWISTED_MINDS_REALM_EXTERNAL_ID, + board_categories_external_id: "dc3e5824-5395-4cad-ae90-9bf7efeb3896", tagline: "I wish I had a funny one for this.", }, { @@ -85,6 +89,7 @@ describe("Tests boards queries", () => { slug: "long", external_id: "db8dc5b3-5b4a-4bfe-a303-e176c9b00b83", realm_external_id: TWISTED_MINDS_REALM_EXTERNAL_ID, + board_categories_external_id: "6443b26c-9247-4b23-b5df-8752356796ce", tagline: "A board to test with many posts.", }, { @@ -95,6 +100,7 @@ describe("Tests boards queries", () => { slug: "memes", external_id: "0e0d1ee6-f996-4415-89c1-c9dc1fe991dc", realm_external_id: TWISTED_MINDS_REALM_EXTERNAL_ID, + board_categories_external_id: "dc3e5824-5395-4cad-ae90-9bf7efeb3896", tagline: "A board to test collections view.", }, { @@ -106,6 +112,7 @@ describe("Tests boards queries", () => { slug: "muted", external_id: "2bdce2fa-12e0-461b-b0fb-1a2e67227434", realm_external_id: TWISTED_MINDS_REALM_EXTERNAL_ID, + board_categories_external_id: "6443b26c-9247-4b23-b5df-8752356796ce", tagline: "A board to test for thread muting.", }, { @@ -117,6 +124,7 @@ describe("Tests boards queries", () => { slug: "ssshh", external_id: "58a10fba-dd66-4862-83fd-c0a233c59599", realm_external_id: TWISTED_MINDS_REALM_EXTERNAL_ID, + board_categories_external_id: "6443b26c-9247-4b23-b5df-8752356796ce", tagline: "A board to test for board muting.", }, { @@ -128,6 +136,7 @@ describe("Tests boards queries", () => { slug: "restricted", external_id: "76ebaab0-6c3e-4d7b-900f-f450625a5ed3", realm_external_id: TWISTED_MINDS_REALM_EXTERNAL_ID, + board_categories_external_id: "6443b26c-9247-4b23-b5df-8752356796ce", tagline: "A board to test for logged-in only view", }, { @@ -139,6 +148,7 @@ describe("Tests boards queries", () => { slug: "delisted", external_id: "bb62b150-62ae-40a8-8ce2-7e5cdeae9d0b", realm_external_id: TWISTED_MINDS_REALM_EXTERNAL_ID, + board_categories_external_id: "6443b26c-9247-4b23-b5df-8752356796ce", tagline: "A board to test for link-only view", }, ]); @@ -650,6 +660,7 @@ describe("Tests boards queries", () => { slug: "main_street", string_id: "2fb151eb-c600-4fe4-a542-4662487e5496", realm_external_id: TWISTED_MINDS_REALM_EXTERNAL_ID, + board_categories_external_id: "9449bcab-fa55-4b0e-9ce0-438501e5fa79", tagline: "For BobaBoard-related discussions.", logged_in_base_restrictions: [], logged_out_restrictions: [],