diff --git a/db/init/100_views.sql b/db/init/100_views.sql index de96e20e..1581f706 100644 --- a/db/init/100_views.sql +++ b/db/init/100_views.sql @@ -87,7 +87,7 @@ SELECT boards.slug as board_slug, realms.id as realm_id, realms.slug as realm_slug, - realms.string_id as realm_string_id, + realms.string_id as realm_external_id, first_post.id as first_post_id, first_post.string_id AS first_post_string_id, first_post.content AS content, diff --git a/db/test_db_init/050_memes_insert.sql b/db/test_db_init/050_memes_insert.sql index 2f6adfcc..603c3fcf 100644 --- a/db/test_db_init/050_memes_insert.sql +++ b/db/test_db_init/050_memes_insert.sql @@ -7,8 +7,9 @@ new_thread_id AS ( root_post_id AS ( INSERT INTO posts (string_id,parent_thread,parent_post,author,created,"content","type",whisper_tags,is_deleted,anonymity_type) OVERRIDING SYSTEM VALUE VALUES ('b2c57275-512e-4821-8cf8-b3ac76e1e044',(SELECT id FROM new_thread_id), NULL, 1,'2020-08-22 03:34:39.806','[{"insert":"Somnium Files Funny Memes"},{"attributes":{"header":2},"insert":""}]','text','{}',false,'everyone') - RETURNING id) -INSERT INTO posts (string_id,parent_thread,parent_post,author,created,"content","type",whisper_tags,is_deleted,anonymity_type) VALUES + RETURNING id), +post_inserts AS ( + INSERT INTO posts (string_id,parent_thread,parent_post,author,created,"content","type",whisper_tags,is_deleted,anonymity_type) VALUES ('d14e1001a-a22a-4673-8b8a-cd0423e38a3',(SELECT id FROM new_thread_id),(SELECT id FROM root_post_id),1,'2020-08-22 03:35:03.191','[{"insert":{"block-image":{"src":"https://firebasestorage.googleapis.com/v0/b/bobaboard-fb.appspot.com/o/images%2Fmemes%2F2765f36a-b4f9-4efe-96f2-cb34f055d032%2F45c75c3e-1086-4e72-8742-549335cdfbff?alt=media&token=97efd46b-f464-4620-a1d1-a97f61e96d91","spoilers":false,"width":1280,"height":720}}},{"insert":""}]','text','{}',false,'strangers') ,('a16d4b39-4e63-434f-9502-3c1e67cb253b',(SELECT id FROM new_thread_id),(SELECT id FROM root_post_id),1,'2020-08-22 03:35:24.049','[{"insert":{"block-image":{"src":"https://firebasestorage.googleapis.com/v0/b/bobaboard-fb.appspot.com/o/images%2Fmemes%2F2765f36a-b4f9-4efe-96f2-cb34f055d032%2F768fced9-5f46-42f0-8aeb-ad135b412ae9?alt=media&token=0840c22f-0781-4a83-8f17-f41338772c99","spoilers":false,"width":690,"height":388}}},{"insert":""}]','text','{}',false,'strangers') ,('41b1ed49-2235-4100d-bbf5-d7bd304a2d6',(SELECT id FROM new_thread_id),(SELECT id FROM root_post_id),1,'2020-08-22 03:35:44.507','[{"insert":{"block-image":{"src":"https://firebasestorage.googleapis.com/v0/b/bobaboard-fb.appspot.com/o/images%2Fmemes%2F2765f36a-b4f9-4efe-96f2-cb34f055d032%2F0c9c7e0e-2bc0-4a71-9c6e-201890f8bbf8?alt=media&token=caa232a5-9cb6-46c7-8968-c979364d255d","spoilers":false,"width":3840,"height":2160}}},{"insert":""}]','text','{}',false,'strangers') @@ -144,8 +145,14 @@ INSERT INTO posts (string_id,parent_thread,parent_post,author,created,"content", ,('d169fd3a-e819-4401-bbf4-950e82598901',(SELECT id FROM new_thread_id),(SELECT id FROM root_post_id),1,'2020-08-22 03:35:44.507','[{"insert":{"block-image":{"src":"https://firebasestorage.googleapis.com/v0/b/bobaboard-fb.appspot.com/o/images%2Fmemes%2F2765f36a-b4f9-4efe-96f2-cb34f055d032%2F0c9c7e0e-2bc0-4a71-9c6e-201890f8bbf8?alt=media&token=caa232a5-9cb6-46c7-8968-c979364d255d","spoilers":false,"width":3840,"height":2160}}},{"insert":""}]','text','{}',false,'strangers') ,('cf781193-4cff-466c-8b34-a38b94ec8014',(SELECT id FROM new_thread_id),(SELECT id FROM root_post_id),1,'2020-08-22 03:36:18.729','[{"insert":{"block-image":{"src":"https://firebasestorage.googleapis.com/v0/b/bobaboard-fb.appspot.com/o/images%2Fmemes%2F2765f36a-b4f9-4efe-96f2-cb34f055d032%2F7707f104-044c-4111-b422-74e11ccef4a2?alt=media&token=7cdf3edb-0d63-467e-ade6-05447cc602c3","spoilers":false,"width":1920,"height":1080}}},{"insert":""}]','text','{}',false,'strangers') ,('b8321446-3ebe-4177-80ce-7a5adcb38e36',(SELECT id FROM new_thread_id),(SELECT id FROM root_post_id),1,'2020-08-22 03:36:55.850','[{"insert":{"block-image":{"src":"https://firebasestorage.googleapis.com/v0/b/bobaboard-fb.appspot.com/o/images%2Fmemes%2F2765f36a-b4f9-4efe-96f2-cb34f055d032%2F894374bd-fed2-42af-a21e-18ed9c5040fc?alt=media&token=f5afda1f-2a14-43a3-9717-7cdc0aeddc2d","spoilers":false,"width":3840,"height":2160}}},{"insert":""}]','text','{}',false,'strangers') -; +) +INSERT INTO user_thread_identities(thread_id, user_id, identity_id) + VALUES + ((SELECT id FROM new_thread_id), + (SELECT id FROM Users WHERE username = 'bobatan'), + (SELECT id FROM secret_identities WHERE display_name = 'Old Time-y Anon')); + INSERT INTO categories(category) VALUES ('aiba'), ('release'); diff --git a/server/feeds/queries.ts b/server/feeds/queries.ts index fc10b9e7..514d568a 100644 --- a/server/feeds/queries.ts +++ b/server/feeds/queries.ts @@ -9,6 +9,59 @@ const info = debug("bobaserver:feeds:queries-info"); const log = debug("bobaserver:feeds:queries-log"); const DEFAULT_PAGE_SIZE = 10; + +export const getRealmActivityByExternalId = async({ + realmExternalId, + firebaseId, + cursor, + pageSize, +}: { + realmExternalId: string; + firebaseId: string | null; + cursor: string | null; + pageSize?: number; +}): Promise => { + const decodedCursor = cursor ? decodeCursor(cursor) : null; + + const finalPageSize = + decodedCursor?.page_size || pageSize || DEFAULT_PAGE_SIZE; + const rows = await pool.manyOrNone(sql.getRealmActivity, { + realm_id: realmExternalId, + firebase_id: firebaseId, + last_activity_cursor: decodedCursor?.last_activity_cursor || null, + page_size: finalPageSize, + }); + + if (!rows) { + log(`Realm not found: ${realmExternalId}`); + return null; + }; + + if (rows.length == 1 && rows[0].thread_id == null) { + // Only one row with just the null thread) + log(`Realm empty: ${realmExternalId}`); + return { cursor: null, activity: [] }; + }; + + let result = rows; + let nextCursor = null; + info(`Got getRealmActivityByExternalId query result`, result); + if (result.length > finalPageSize) { + nextCursor = encodeCursor({ + last_activity_cursor: + result[result.length - 1].thread_last_activity_at_micro, + page_size: finalPageSize, + }); + // remove last element from array + result.pop(); + }; + + log( + `Fetched realm ${realmExternalId} activity data for user ${firebaseId}` + ); + return { cursor: nextCursor, activity: rows }; +}; + export const getBoardActivityByExternalId = async ({ boardExternalId, firebaseId, diff --git a/server/feeds/routes.ts b/server/feeds/routes.ts index e41bf8aa..b602001b 100644 --- a/server/feeds/routes.ts +++ b/server/feeds/routes.ts @@ -5,6 +5,7 @@ import { } from "utils/response-utils"; import { getBoardActivityByExternalId, + getRealmActivityByExternalId, getUserActivity, getUserStarFeed, } from "./queries"; @@ -21,6 +22,77 @@ const log = debug("bobaserver:feeds:routes"); const router = express.Router(); +/** + * @openapi + * /feeds/realms/{realm_id}: + * get: + * summary: Get latest activity on entire realm + * operationId: getRealmActivity + * tags: + * - /feeds/ + * parameters: + * - name: realm_id + * in: path + * description: The external id of the realm to fetch the activity of. + * required: true + * schema: + * type: string + * - name: cursor + * in: query + * description: The cursor to start feeding the activity of the board from. + * schema: + * type: string + * allowEmptyValue: true + * responses: + * 404: + * description: The realm was not found. + * 200: + * description: The realm's activity. + * content: + * application/json: + * schema: + * $ref: "#/components/schemas/FeedActivity" + */ +router.get("/realms/:realm_id", ensureLoggedIn, async (req, res) => { + const { realm_id: realmExternalId } = req.params; + const { cursor } = req.query; + log( + `Fetching activity data for realm with slug ${realmExternalId} with cursor ${cursor}` + ); + + log(cursor); + const result = await getRealmActivityByExternalId({ + realmExternalId, + firebaseId: req.currentUser?.uid || null, + cursor: (cursor as string) || null, + }); + info(`Found activity for realm ${realmExternalId}:`, result); + + if (!result) { + throw new NotFound404Error( + `Realm with id ${realmExternalId} was not found` + ); + } + if (!result.activity.length) { + res.sendStatus(204); + return; + } + + const threadsWithIdentity = result.activity.map(makeServerThreadSummary); + const response: ZodFeed = { + cursor: { + next: result.cursor, + }, + activity: threadsWithIdentity, + }; + + response.activity.map((post) => ensureNoIdentityLeakage(post)); + log( + `Returning board activity data for board ${realmExternalId} for user ${req.currentUser?.uid}.` + ); + res.status(200).json(FeedActivitySchema.parse(response)); +}); + /** * @openapi * /feeds/boards/{board_id}: diff --git a/server/feeds/sql/board-activity-by-external-id.sql b/server/feeds/sql/board-activity-by-external-id.sql index e7cf994a..3ffe4266 100644 --- a/server/feeds/sql/board-activity-by-external-id.sql +++ b/server/feeds/sql/board-activity-by-external-id.sql @@ -4,7 +4,7 @@ SELECT board_slug, board_external_id as board_id, realm_slug, - realm_string_id as realm_id, + realm_external_id as realm_id, TO_CHAR(last_update_timestamp, 'YYYY-MM-DD"T"HH24:MI:SS.00"Z') as thread_last_activity_at, thread_details.default_view, -- Amount details diff --git a/server/feeds/sql/index.ts b/server/feeds/sql/index.ts index 142f5aff..69f114e1 100644 --- a/server/feeds/sql/index.ts +++ b/server/feeds/sql/index.ts @@ -2,6 +2,9 @@ import { QueryFile } from "pg-promise"; import path from "path"; export default { + getRealmActivity: new QueryFile( + path.join(__dirname, "realm-activity.sql") + ), getUserFeedActivity: new QueryFile( path.join(__dirname, "user-feed-activity.sql") ), diff --git a/server/feeds/sql/realm-activity.sql b/server/feeds/sql/realm-activity.sql new file mode 100644 index 00000000..a861d4b4 --- /dev/null +++ b/server/feeds/sql/realm-activity.sql @@ -0,0 +1,65 @@ +SELECT + -- Thread details (DbThreadType) + thread_external_id as thread_id, + board_slug, + board_external_id as board_id, + realm_slug, + realm_external_id as realm_id, + TO_CHAR(last_update_timestamp, 'YYYY-MM-DD"T"HH24:MI:SS.00"Z') as thread_last_activity_at, + thread_details.default_view, + -- Amount details + COALESCE(posts_amount, 0) as thread_total_posts_amount, + COALESCE(threads_amount, 0) as thread_direct_threads_amount, + COALESCE(comments_amount, 0) as thread_total_comments_amount, + COALESCE(new_posts_board_amount, 0) as thread_new_posts_amount, + COALESCE(new_comments_board_amount, 0) as thread_new_comments_amount, + COALESCE(muted, FALSE) as muted, + COALESCE(hidden, FALSE) as hidden, + COALESCE(starred, FALSE) as starred, + -- Contribution details (DbContributionType) + first_post_string_id as post_id, + thread_external_id as parent_thread_id, + NULL as parent_post_id, + board_slug as parent_board_slug, + board_external_id as parent_board_id, + -- Author details + author, + username, + user_avatar, + secret_identity_name, + secret_identity_avatar, + secret_identity_color, + accessory_avatar, + COALESCE(friend_thread, FALSE) as friend, + COALESCE(own_thread, FALSE) as self, + TO_CHAR(first_post_timestamp, 'YYYY-MM-DD"T"HH24:MI:SS.00"Z"') as created_at, + -- Generic details + content, + -- Contribution tags + index_tags, + category_tags, + content_warnings, + whisper_tags, + COALESCE(own_thread, FALSE) as is_own, + COALESCE(is_new_board, FALSE) as is_new, + -- This last activity must have the .US at the end or it will trigger a bug + -- where some posts are skipped by the last activity cursor. + -- See documentation on the queries JS file. + TO_CHAR(last_update_timestamp, 'YYYY-MM-DD"T"HH24:MI:SS.US') as thread_last_activity_at_micro +FROM threads +INNER JOIN thread_details + ON threads.id = thread_details.thread_id AND thread_details.realm_external_id = ${realm_id} +LEFT JOIN thread_identities + ON thread_identities.user_id = thread_details.author AND thread_identities.thread_id = thread_details.thread_id +LEFT JOIN thread_user_details + ON ${firebase_id} IS NOT NULL AND thread_user_details.user_id = (SELECT id FROM users WHERE users.firebase_id = ${firebase_id} LIMIT 1) + AND thread_details.thread_id = thread_user_details.thread_id +WHERE + -- Activity cursor conditions + thread_details.realm_external_id = ${realm_id} + AND last_update_timestamp <= COALESCE(${last_activity_cursor}, NOW()) + AND is_new IS TRUE + AND muted IS FALSE + AND hidden IS FALSE +ORDER BY thread_last_activity_at DESC +LIMIT ${page_size} + 1 diff --git a/server/feeds/sql/star-feed-activity.sql b/server/feeds/sql/star-feed-activity.sql index 859cf85c..79b921ef 100644 --- a/server/feeds/sql/star-feed-activity.sql +++ b/server/feeds/sql/star-feed-activity.sql @@ -19,7 +19,7 @@ SELECT NULL as parent_post_id, board_slug as parent_board_slug, realm_slug, - realm_string_id as realm_id, + realm_external_id as realm_id, -- Author details author, author_identity.username, diff --git a/server/feeds/sql/user-feed-activity.sql b/server/feeds/sql/user-feed-activity.sql index 14cc9d8d..28b0c653 100644 --- a/server/feeds/sql/user-feed-activity.sql +++ b/server/feeds/sql/user-feed-activity.sql @@ -5,7 +5,7 @@ SELECT board_slug, board_external_id as board_id, realm_slug, - realm_string_id as realm_id, + realm_external_id as realm_id, TO_CHAR(last_update_timestamp, 'YYYY-MM-DD"T"HH24:MI:SS.00"Z"') as thread_last_activity_at, thread_details.default_view, -- Amount details @@ -69,6 +69,6 @@ WHERE AND (${own_only} IS FALSE OR own_thread IS TRUE) AND muted IS FALSE AND hidden IS FALSE - AND realm_string_id = ${realm_id} + AND realm_external_id = ${realm_id} ORDER BY thread_last_activity_at DESC LIMIT ${page_size} + 1 diff --git a/server/feeds/tests/REST/REST-realm-feed.test.ts b/server/feeds/tests/REST/REST-realm-feed.test.ts new file mode 100644 index 00000000..d9dc528f --- /dev/null +++ b/server/feeds/tests/REST/REST-realm-feed.test.ts @@ -0,0 +1,32 @@ +import { BOBATAN_USER_ID, ONCEST_USER_ID } from "test/data/auth"; +import { setLoggedInUser, startTestServer } from "utils/test-utils"; + +import { BOBATAN_REALM_FEED } from "test/data/realmfeed"; +import { TWISTED_MINDS_REALM_EXTERNAL_ID } from "test/data/realms"; +import debug from "debug"; +import request from "supertest"; +import router from "../../routes"; + +jest.mock("handlers/auth"); + +const log = debug("bobaserver:board:routes"); + + describe("Tests Realm Activity Feed Endpoint", () => { + const server = startTestServer(router); + + test("should return realm activity data" , async () => { + setLoggedInUser(BOBATAN_USER_ID) + const res = await request(server.app).get(`/realms/${TWISTED_MINDS_REALM_EXTERNAL_ID}`); + + expect(res.status).toBe(200); + expect(res.body).toEqual(BOBATAN_REALM_FEED); + }); + + test("should return 401 when user isn't logged in", async () => { + const res = await request(server.app).get(`/realms/${TWISTED_MINDS_REALM_EXTERNAL_ID}`); + + expect(res.status).toBe(401); + expect(res.body).toEqual({message: "No authenticated user found."}); + }); + }); + \ No newline at end of file diff --git a/server/feeds/tests/queries.test.ts b/server/feeds/tests/queries.test.ts index f7debad5..970b0d4c 100644 --- a/server/feeds/tests/queries.test.ts +++ b/server/feeds/tests/queries.test.ts @@ -2,6 +2,7 @@ import { BOBATAN_USER_ID, ONCEST_USER_ID } from "test/data/auth"; import { FAVORITE_CHARACTER_THREAD_ID, FAVORITE_MURDER_THREAD_ID, + FUNNY_MEMES_THREAD_ID, } from "test/data/threads"; import { TWISTED_MINDS_REALM_EXTERNAL_ID } from "test/data/realms"; @@ -75,6 +76,19 @@ describe("feed activity queries", () => { thread_last_activity_at: "2020-10-04T05:44:00.00Z", threads_amount: 0, }, + { + comments_amount: 0, + created_at: "2020-08-22T03:34:39.00Z", + is_new: false, + new_comments_amount: 0, + new_posts_amount: 0, + post_id: "b2c57275-512e-4821-8cf8-b3ac76e1e044", + posts_amount: 136, + thread_id: FUNNY_MEMES_THREAD_ID, + thread_last_activity_at: "2020-08-22T03:36:55.00Z", + thread_last_activity_at_micro: "2020-08-22T03:36:55.850000", + threads_amount: 135, + }, { comments_amount: 0, created_at: "2020-04-24T05:42:00.00Z", @@ -140,6 +154,19 @@ describe("feed activity queries", () => { thread_last_activity_at: "2020-10-04T05:44:00.00Z", threads_amount: 0, }, + { + comments_amount: 0, + created_at: "2020-08-22T03:34:39.00Z", + is_new: false, + new_comments_amount: 0, + new_posts_amount: 0, + post_id: "b2c57275-512e-4821-8cf8-b3ac76e1e044", + posts_amount: 136, + thread_id: FUNNY_MEMES_THREAD_ID, + thread_last_activity_at: "2020-08-22T03:36:55.00Z", + thread_last_activity_at_micro: "2020-08-22T03:36:55.850000", + threads_amount: 135, + }, { comments_amount: 2, created_at: "2020-04-30T03:23:00.00Z", @@ -180,7 +207,7 @@ describe("feed activity queries", () => { })) as ZodDbFeedType; expect(feed.cursor).toBe( - "eyJsYXN0X2FjdGl2aXR5X2N1cnNvciI6IjIwMjAtMDUtMjNUMDU6NTI6MDAuMDAwMDAwIiwicGFnZV9zaXplIjoxfQ==" + "eyJsYXN0X2FjdGl2aXR5X2N1cnNvciI6IjIwMjAtMDgtMjJUMDM6MzY6NTUuODUwMDAwIiwicGFnZV9zaXplIjoxfQ==" ); expect(feed.activity.map(extractActivity)).toEqual([ { diff --git a/server/feeds/tests/user-feed.test.ts b/server/feeds/tests/user-feed.test.ts index 9d63c583..45230f40 100644 --- a/server/feeds/tests/user-feed.test.ts +++ b/server/feeds/tests/user-feed.test.ts @@ -2,6 +2,7 @@ import { BOBATAN_USER_ID, ONCEST_USER_ID } from "test/data/auth"; import { FAVORITE_CHARACTER_THREAD_ID, FAVORITE_MURDER_THREAD_ID, + FUNNY_MEMES_THREAD_ID, } from "test/data/threads"; import { TWISTED_MINDS_REALM_EXTERNAL_ID } from "test/data/realms"; @@ -66,6 +67,19 @@ describe("feed activity queries", () => { thread_last_activity_at_micro: "2020-10-04T05:44:00.000000", threads_amount: 0, }, + { + comments_amount: 0, + created_at: "2020-08-22T03:34:39.00Z", + is_new: false, + new_comments_amount: 0, + new_posts_amount: 0, + post_id: "b2c57275-512e-4821-8cf8-b3ac76e1e044", + posts_amount: 136, + thread_id: FUNNY_MEMES_THREAD_ID, + thread_last_activity_at: "2020-08-22T03:36:55.00Z", + thread_last_activity_at_micro: "2020-08-22T03:36:55.850000", + threads_amount: 135, + }, { comments_amount: 0, created_at: "2020-04-24T05:42:00.00Z", @@ -139,6 +153,19 @@ describe("feed activity queries", () => { thread_last_activity_at_micro: "2020-10-04T05:44:00.000000", threads_amount: 0, }, + { + comments_amount: 0, + created_at: "2020-08-22T03:34:39.00Z", + is_new: false, + new_comments_amount: 0, + new_posts_amount: 0, + post_id: "b2c57275-512e-4821-8cf8-b3ac76e1e044", + posts_amount: 136, + thread_id: FUNNY_MEMES_THREAD_ID, + thread_last_activity_at: "2020-08-22T03:36:55.00Z", + thread_last_activity_at_micro: "2020-08-22T03:36:55.850000", + threads_amount: 135, + }, { comments_amount: 2, created_at: "2020-04-30T03:23:00.00Z", @@ -183,7 +210,7 @@ describe("feed activity queries", () => { } expect(feed.cursor).toBe( - "eyJsYXN0X2FjdGl2aXR5X2N1cnNvciI6IjIwMjAtMDUtMjNUMDU6NTI6MDAuMDAwMDAwIiwicGFnZV9zaXplIjoxfQ==" + "eyJsYXN0X2FjdGl2aXR5X2N1cnNvciI6IjIwMjAtMDgtMjJUMDM6MzY6NTUuODUwMDAwIiwicGFnZV9zaXplIjoxfQ==" ); expect(feed.activity.map(extractActivity)).toEqual([ { @@ -207,7 +234,7 @@ describe("feed activity queries", () => { firebaseId: BOBATAN_USER_ID, realmExternalId: TWISTED_MINDS_REALM_EXTERNAL_ID, cursor: - "eyJsYXN0X2FjdGl2aXR5X2N1cnNvciI6IjIwMjAtMDUtMjNUMDU6NTI6MDAuMDAwMDAwIiwicGFnZV9zaXplIjoxfQ==", + "eyJsYXN0X2FjdGl2aXR5X2N1cnNvciI6IjIwMjAtMDgtMjJUMDM6MzY6NTUuODUwMDAwIiwicGFnZV9zaXplIjoxfQ==", updatedOnly: false, ownOnly: false, pageSize: 1, @@ -219,17 +246,17 @@ describe("feed activity queries", () => { expect(feed.activity.map(extractActivity)).toEqual([ { - comments_amount: 2, - created_at: "2020-04-30T03:23:00.00Z", + comments_amount: 0, + created_at: "2020-08-22T03:34:39.00Z", is_new: false, new_comments_amount: 0, new_posts_amount: 0, - post_id: "11b85dac-e122-40e0-b09a-8829c5e0250e", - posts_amount: 3, - thread_id: FAVORITE_CHARACTER_THREAD_ID, - thread_last_activity_at: "2020-05-23T05:52:00.00Z", - thread_last_activity_at_micro: "2020-05-23T05:52:00.000000", - threads_amount: 2, + post_id: "b2c57275-512e-4821-8cf8-b3ac76e1e044", + posts_amount: 136, + thread_id: FUNNY_MEMES_THREAD_ID, + thread_last_activity_at: "2020-08-22T03:36:55.00Z", + thread_last_activity_at_micro: "2020-08-22T03:36:55.850000", + threads_amount: 135, }, ]); }); diff --git a/server/subscriptions/tests/queries.test.ts b/server/subscriptions/tests/queries.test.ts index ca61b38c..76810cba 100644 --- a/server/subscriptions/tests/queries.test.ts +++ b/server/subscriptions/tests/queries.test.ts @@ -12,8 +12,8 @@ describe("Tests posts queries", () => { subscription_name: "aiba!", subscription_external_id: "a87800a6-21e5-46dd-a979-a901cdcea563", last_updated_at: "2020-08-22T03:36:18.00Z", - secret_identity_name: null, - secret_identity_avatar: null, + secret_identity_avatar: "https://firebasestorage.googleapis.com/v0/b/bobaboard-fb.appspot.com/o/images%2Fgore%2F5c2c3867-2323-4209-8bd4-9dfcc88808f3%2Fd931f284-5c22-422d-9343-e509cfb44ffc.png?alt=media&token=94e52fff-4e6b-4110-94c3-90b8800f541c", + secret_identity_name: "Old Time-y Anon", secret_identity_color: null, secret_identity_accessory: null, post_content: diff --git a/server/subscriptions/tests/routes/get-subscription.test.ts b/server/subscriptions/tests/routes/get-subscription.test.ts index 73047353..c317b167 100644 --- a/server/subscriptions/tests/routes/get-subscription.test.ts +++ b/server/subscriptions/tests/routes/get-subscription.test.ts @@ -34,10 +34,8 @@ const AIBA_SUBSCRIPTION_RESULT: SubscriptionFeed = { own: false, parent_post_id: null, secret_identity: { - // @ts-ignore This post has no identity in the DB currently. - name: null, - // @ts-ignore This post has no identity in the DB currently. - avatar: null, + avatar: "https://firebasestorage.googleapis.com/v0/b/bobaboard-fb.appspot.com/o/images%2Fgore%2F5c2c3867-2323-4209-8bd4-9dfcc88808f3%2Fd931f284-5c22-422d-9343-e509cfb44ffc.png?alt=media&token=94e52fff-4e6b-4110-94c3-90b8800f541c", + name: "Old Time-y Anon", }, tags: { category_tags: [], @@ -97,10 +95,8 @@ describe("Tests threads REST API", () => { own: false, parent_post_id: null, secret_identity: { - // @ts-ignore This post has no identity in the DB currently. - name: null, - // @ts-ignore This post has no identity in the DB currently. - avatar: null, + avatar: "https://firebasestorage.googleapis.com/v0/b/bobaboard-fb.appspot.com/o/images%2Fgore%2F5c2c3867-2323-4209-8bd4-9dfcc88808f3%2Fd931f284-5c22-422d-9343-e509cfb44ffc.png?alt=media&token=94e52fff-4e6b-4110-94c3-90b8800f541c", + name: "Old Time-y Anon", }, tags: { category_tags: [], diff --git a/test/data/realmfeed.ts b/test/data/realmfeed.ts new file mode 100644 index 00000000..2be7df27 --- /dev/null +++ b/test/data/realmfeed.ts @@ -0,0 +1,439 @@ +import { TWISTED_MINDS_REALM_EXTERNAL_ID } from "./realms"; + +export const BOBATAN_REALM_FEED = { + cursor: { + next: 'eyJsYXN0X2FjdGl2aXR5X2N1cnNvciI6IjIwMjAtMDQtMThUMDU6NDI6MDAuMDAwMDAwIiwicGFnZV9zaXplIjoxMH0=' + }, + activity: [ + { + id: '1cf90c6b-7b81-4662-a6c6-1ab5f69e8daf', + parent_board_slug: 'ssshh', + parent_board_id: '58a10fba-dd66-4862-83fd-c0a233c59599', + parent_realm_slug: 'twisted-minds', + parent_realm_id: TWISTED_MINDS_REALM_EXTERNAL_ID, + starter: { + id: '6c42474d-00b4-472b-b246-1c6f69db570a', + parent_thread_id: '1cf90c6b-7b81-4662-a6c6-1ab5f69e8daf', + parent_post_id: null, + content: `[{"insert":"Shhhh!!! Don't tell boba-tan this post is here!"}]`, + created_at: '2022-10-24T08:40:00.00Z', + secret_identity: { + name: 'The Prophet', + avatar: 'https://firebasestorage.googleapis.com/v0/b/bobaboard-fb.appspot.com/o/images%2Fbobaland%2Fundefined%2Fbe6d2b51-8192-4b78-a140-fecd1ec54f71?alt=media&token=4a13133b-f8fb-478b-9be4-22fa0f4a97c8', + color: null, + accessory: null + }, + user_identity: null, + new: true, + own: false, + friend: false, + total_comments_amount: 0, + new_comments_amount: 0, + tags: { + whisper_tags: [ 'pls......' ], + index_tags: [], + category_tags: [], + content_warnings: [] + } + }, + default_view: 'thread', + new: true, + muted: false, + hidden: false, + starred: false, + new_posts_amount: 1, + new_comments_amount: 0, + total_comments_amount: 0, + total_posts_amount: 1, + direct_threads_amount: 0, + last_activity_at: '2022-10-24T08:40:00.00Z' + }, + { + id: '7d88a537-f23f-46de-970e-29ae392cd5f9', + parent_board_slug: 'long', + parent_board_id: 'db8dc5b3-5b4a-4bfe-a303-e176c9b00b83', + parent_realm_slug: 'twisted-minds', + parent_realm_id: TWISTED_MINDS_REALM_EXTERNAL_ID, + starter: { + id: '995d80d3-d8b9-445d-9723-e39f7a682665', + parent_thread_id: '7d88a537-f23f-46de-970e-29ae392cd5f9', + parent_post_id: null, + content: '[{"insert":"Post 26!"}]', + created_at: '2020-04-25T05:42:00.00Z', + secret_identity: { + name: 'DragonFucker', + avatar: 'https://pbs.twimg.com/profile_images/473496567366705152/JyHRKG7g.jpeg', + color: null, + accessory: null + }, + user_identity: null, + new: true, + own: false, + friend: false, + total_comments_amount: 0, + new_comments_amount: 0, + tags: { + whisper_tags: [], + index_tags: [], + category_tags: [ 'even' ], + content_warnings: [] + } + }, + default_view: 'thread', + new: true, + muted: false, + hidden: false, + starred: false, + new_posts_amount: 1, + new_comments_amount: 0, + total_comments_amount: 0, + total_posts_amount: 1, + direct_threads_amount: 0, + last_activity_at: '2020-04-25T05:42:00.00Z' + }, + { + id: 'b27710a8-0a9f-4c09-b3a5-54668bab7051', + parent_board_slug: 'anime', + parent_board_id: '4b30fb7c-2aca-4333-aa56-ae8623a92b65', + parent_realm_slug: 'twisted-minds', + parent_realm_id: TWISTED_MINDS_REALM_EXTERNAL_ID, + starter: { + id: '987f795b-d60d-4016-af82-8684411f7785', + parent_thread_id: 'b27710a8-0a9f-4c09-b3a5-54668bab7051', + parent_post_id: null, + content: '[{"insert":"Stuff will be inserted here!"}]', + created_at: '2020-04-24T05:42:00.00Z', + secret_identity: { + name: 'DragonFucker', + avatar: 'https://pbs.twimg.com/profile_images/473496567366705152/JyHRKG7g.jpeg', + color: null, + accessory: null + }, + user_identity: null, + new: true, + own: false, + friend: false, + total_comments_amount: 0, + new_comments_amount: 0, + tags: { + whisper_tags: [ 'this is a test post' ], + index_tags: [], + category_tags: [], + content_warnings: [] + } + }, + default_view: 'thread', + new: true, + muted: false, + hidden: false, + starred: false, + new_posts_amount: 1, + new_comments_amount: 2, + total_comments_amount: 2, + total_posts_amount: 1, + direct_threads_amount: 0, + last_activity_at: '2020-04-24T05:44:00.00Z' + }, + { + id: 'b3f4174e-c9e2-4f79-9d22-7232aa48744e', + parent_board_slug: 'restricted', + parent_board_id: '76ebaab0-6c3e-4d7b-900f-f450625a5ed3', + parent_realm_slug: 'twisted-minds', + parent_realm_id: TWISTED_MINDS_REALM_EXTERNAL_ID, + starter: { + id: 'd1c0784b-0b72-40d0-801d-eb718b5ad011', + parent_thread_id: 'b3f4174e-c9e2-4f79-9d22-7232aa48744e', + parent_post_id: null, + content: `[{"insert":"You can't see me!"}]`, + created_at: '2020-04-24T05:42:00.00Z', + secret_identity: { + name: 'The OG OG Komaeda', + avatar: 'https://firebasestorage.googleapis.com/v0/b/bobaboard-fb.appspot.com/o/images%2Fbobaland%2Fundefined%2F1237fd9e-cd40-41b8-8ee7-11c865f27b6b?alt=media&token=4bb418a6-cb45-435c-85ed-7bdcb294f5b5', + color: null, + accessory: null + }, + user_identity: null, + new: true, + own: false, + friend: false, + total_comments_amount: 0, + new_comments_amount: 0, + tags: { + whisper_tags: [ 'this is a test post' ], + index_tags: [], + category_tags: [], + content_warnings: [] + } + }, + default_view: 'thread', + new: true, + muted: false, + hidden: false, + starred: false, + new_posts_amount: 1, + new_comments_amount: 1, + total_comments_amount: 1, + total_posts_amount: 1, + direct_threads_amount: 0, + last_activity_at: '2020-04-24T05:44:00.00Z' + }, + { + id: 'd1ec7d2a-c237-41f7-bc67-77727a61a501', + parent_board_slug: 'long', + parent_board_id: 'db8dc5b3-5b4a-4bfe-a303-e176c9b00b83', + parent_realm_slug: 'twisted-minds', + parent_realm_id: TWISTED_MINDS_REALM_EXTERNAL_ID, + starter: { + id: 'e93eed13-105b-486d-bdd2-9e797983192b', + parent_thread_id: 'd1ec7d2a-c237-41f7-bc67-77727a61a501', + parent_post_id: null, + content: '[{"insert":"Post 25!"}]', + created_at: '2020-04-24T05:42:00.00Z', + secret_identity: { + name: 'DragonFucker', + avatar: 'https://pbs.twimg.com/profile_images/473496567366705152/JyHRKG7g.jpeg', + color: null, + accessory: null + }, + user_identity: null, + new: true, + own: false, + friend: false, + total_comments_amount: 0, + new_comments_amount: 0, + tags: { + whisper_tags: [], + index_tags: [], + category_tags: [ 'odd' ], + content_warnings: [] + } + }, + default_view: 'thread', + new: true, + muted: false, + hidden: false, + starred: false, + new_posts_amount: 1, + new_comments_amount: 0, + total_comments_amount: 0, + total_posts_amount: 1, + direct_threads_amount: 0, + last_activity_at: '2020-04-24T05:42:00.00Z' + }, + { + id: 'c55314b4-0b61-41c9-aa2f-b7fa28adf651', + parent_board_slug: 'long', + parent_board_id: 'db8dc5b3-5b4a-4bfe-a303-e176c9b00b83', + parent_realm_slug: 'twisted-minds', + parent_realm_id: TWISTED_MINDS_REALM_EXTERNAL_ID, + starter: { + id: '6c698c20-754a-42d2-b60f-7f73ca2c6fa0', + parent_thread_id: 'c55314b4-0b61-41c9-aa2f-b7fa28adf651', + parent_post_id: null, + content: '[{"insert":"Post 24!"}]', + created_at: '2020-04-23T05:42:00.00Z', + secret_identity: { + name: 'DragonFucker', + avatar: 'https://pbs.twimg.com/profile_images/473496567366705152/JyHRKG7g.jpeg', + color: null, + accessory: null + }, + user_identity: null, + new: true, + own: false, + friend: false, + total_comments_amount: 0, + new_comments_amount: 0, + tags: { + whisper_tags: [], + index_tags: [], + category_tags: [ 'even' ], + content_warnings: [] + } + }, + default_view: 'thread', + new: true, + muted: false, + hidden: false, + starred: false, + new_posts_amount: 1, + new_comments_amount: 0, + total_comments_amount: 0, + total_posts_amount: 1, + direct_threads_amount: 0, + last_activity_at: '2020-04-23T05:42:00.00Z' + }, + { + id: '031cd7f4-cbaa-46d0-aaa4-911df0e097b5', + parent_board_slug: 'long', + parent_board_id: 'db8dc5b3-5b4a-4bfe-a303-e176c9b00b83', + parent_realm_slug: 'twisted-minds', + parent_realm_id: TWISTED_MINDS_REALM_EXTERNAL_ID, + starter: { + id: '9adb9e1b-2013-4359-9743-ad9998444dae', + parent_thread_id: '031cd7f4-cbaa-46d0-aaa4-911df0e097b5', + parent_post_id: null, + content: '[{"insert":"Post 23!"}]', + created_at: '2020-04-22T05:42:00.00Z', + secret_identity: { + name: 'DragonFucker', + avatar: 'https://pbs.twimg.com/profile_images/473496567366705152/JyHRKG7g.jpeg', + color: null, + accessory: null + }, + user_identity: null, + new: true, + own: false, + friend: false, + total_comments_amount: 0, + new_comments_amount: 0, + tags: { + whisper_tags: [], + index_tags: [], + category_tags: [ 'odd' ], + content_warnings: [] + } + }, + default_view: 'thread', + new: true, + muted: false, + hidden: false, + starred: false, + new_posts_amount: 1, + new_comments_amount: 0, + total_comments_amount: 0, + total_posts_amount: 1, + direct_threads_amount: 0, + last_activity_at: '2020-04-22T05:42:00.00Z' + }, + { + id: '00174331-d4c5-4254-8178-afbd46f45275', + parent_board_slug: 'long', + parent_board_id: 'db8dc5b3-5b4a-4bfe-a303-e176c9b00b83', + parent_realm_slug: 'twisted-minds', + parent_realm_id: TWISTED_MINDS_REALM_EXTERNAL_ID, + starter: { + id: '8cb16008-1efd-4c5d-a1aa-0b738fcc68c0', + parent_thread_id: '00174331-d4c5-4254-8178-afbd46f45275', + parent_post_id: null, + content: '[{"insert":"Post 22!"}]', + created_at: '2020-04-21T05:42:00.00Z', + secret_identity: { + name: 'DragonFucker', + avatar: 'https://pbs.twimg.com/profile_images/473496567366705152/JyHRKG7g.jpeg', + color: null, + accessory: null + }, + user_identity: null, + new: true, + own: false, + friend: false, + total_comments_amount: 0, + new_comments_amount: 0, + tags: { + whisper_tags: [], + index_tags: [], + category_tags: [ 'even' ], + content_warnings: [] + } + }, + default_view: 'thread', + new: true, + muted: false, + hidden: false, + starred: false, + new_posts_amount: 1, + new_comments_amount: 0, + total_comments_amount: 0, + total_posts_amount: 1, + direct_threads_amount: 0, + last_activity_at: '2020-04-21T05:42:00.00Z' + }, + { + id: '23e35e53-57dd-4fa2-8911-89276a99af59', + parent_board_slug: 'long', + parent_board_id: 'db8dc5b3-5b4a-4bfe-a303-e176c9b00b83', + parent_realm_slug: 'twisted-minds', + parent_realm_id: TWISTED_MINDS_REALM_EXTERNAL_ID, + starter: { + id: '0480192a-e816-4eb3-b927-50ef2c620fc0', + parent_thread_id: '23e35e53-57dd-4fa2-8911-89276a99af59', + parent_post_id: null, + content: '[{"insert":"Post 21 (with microseconds)!"}]', + created_at: '2020-04-20T05:42:00.00Z', + secret_identity: { + name: 'DragonFucker', + avatar: 'https://pbs.twimg.com/profile_images/473496567366705152/JyHRKG7g.jpeg', + color: null, + accessory: null + }, + user_identity: null, + new: true, + own: false, + friend: false, + total_comments_amount: 0, + new_comments_amount: 0, + tags: { + whisper_tags: [], + index_tags: [], + category_tags: [ 'odd' ], + content_warnings: [] + } + }, + default_view: 'thread', + new: true, + muted: false, + hidden: false, + starred: false, + new_posts_amount: 1, + new_comments_amount: 0, + total_comments_amount: 0, + total_posts_amount: 1, + direct_threads_amount: 0, + last_activity_at: '2020-04-20T05:42:00.00Z' + }, + { + id: '8799b916-0837-4bfb-b972-5e7fb0b3d68b', + parent_board_slug: 'long', + parent_board_id: 'db8dc5b3-5b4a-4bfe-a303-e176c9b00b83', + parent_realm_slug: 'twisted-minds', + parent_realm_id: TWISTED_MINDS_REALM_EXTERNAL_ID, + starter: { + id: '9bbcd916-a17c-47ee-80ca-376eb8f1d3bb', + parent_thread_id: '8799b916-0837-4bfb-b972-5e7fb0b3d68b', + parent_post_id: null, + content: '[{"insert":"Post 20!"}]', + created_at: '2020-04-19T05:42:00.00Z', + secret_identity: { + name: 'DragonFucker', + avatar: 'https://pbs.twimg.com/profile_images/473496567366705152/JyHRKG7g.jpeg', + color: null, + accessory: null + }, + user_identity: null, + new: true, + own: false, + friend: false, + total_comments_amount: 0, + new_comments_amount: 0, + tags: { + whisper_tags: [], + index_tags: [], + category_tags: [ 'even' ], + content_warnings: [] + } + }, + default_view: 'thread', + new: true, + muted: false, + hidden: false, + starred: false, + new_posts_amount: 1, + new_comments_amount: 0, + total_comments_amount: 0, + total_posts_amount: 1, + direct_threads_amount: 0, + last_activity_at: '2020-04-19T05:42:00.00Z' + } + ] + }; \ No newline at end of file diff --git a/test/data/threads.ts b/test/data/threads.ts index 937ae1a0..1cada7e6 100644 --- a/test/data/threads.ts +++ b/test/data/threads.ts @@ -17,6 +17,7 @@ export const EXCELLENT_THREAD_ID = "8b2646af-2778-487e-8e44-7ae530c2549c"; export const FAVORITE_CHARACTER_THREAD_ID = "29d1b2da-3289-454a-9089-2ed47db4967b"; export const FAVORITE_MURDER_THREAD_ID = "a5c903df-35e8-43b2-a41a-208c43154671"; +export const FUNNY_MEMES_THREAD_ID = "2765f36a-b4f9-4efe-96f2-cb34f055d032"; export const RESTRICTED_THREAD_ID = "b3f4174e-c9e2-4f79-9d22-7232aa48744e"; export const NULL_ID = "00000000-0000-0000-0000-000000000000";