@btst/stack 2.7.0 → 2.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/dist/packages/stack/src/plugins/blog/client/components/loading/post-navigation-skeleton.cjs +13 -0
- package/dist/packages/stack/src/plugins/blog/client/components/loading/post-navigation-skeleton.mjs +11 -0
- package/dist/packages/stack/src/plugins/blog/client/components/loading/recent-posts-carousel-skeleton.cjs +17 -0
- package/dist/packages/stack/src/plugins/blog/client/components/loading/recent-posts-carousel-skeleton.mjs +15 -0
- package/dist/packages/stack/src/plugins/blog/client/components/pages/post-page.internal.cjs +18 -7
- package/dist/packages/stack/src/plugins/blog/client/components/pages/post-page.internal.mjs +18 -7
- package/dist/packages/stack/src/plugins/blog/client/components/shared/post-navigation.cjs +48 -52
- package/dist/packages/stack/src/plugins/blog/client/components/shared/post-navigation.mjs +49 -53
- package/dist/packages/stack/src/plugins/blog/client/components/shared/recent-posts-carousel.cjs +34 -37
- package/dist/packages/stack/src/plugins/blog/client/components/shared/recent-posts-carousel.mjs +35 -38
- package/dist/packages/stack/src/plugins/blog/client/hooks/blog-hooks.cjs +4 -21
- package/dist/packages/stack/src/plugins/blog/client/hooks/blog-hooks.mjs +4 -21
- package/dist/packages/stack/src/plugins/comments/api/getters.cjs +284 -0
- package/dist/packages/stack/src/plugins/comments/api/getters.mjs +280 -0
- package/dist/packages/stack/src/plugins/comments/api/mutations.cjs +118 -0
- package/dist/packages/stack/src/plugins/comments/api/mutations.mjs +112 -0
- package/dist/packages/stack/src/plugins/comments/api/plugin.cjs +335 -0
- package/dist/packages/stack/src/plugins/comments/api/plugin.mjs +333 -0
- package/dist/packages/stack/src/plugins/comments/api/query-key-defs.cjs +60 -0
- package/dist/packages/stack/src/plugins/comments/api/query-key-defs.mjs +55 -0
- package/dist/packages/stack/src/plugins/comments/api/serializers.cjs +23 -0
- package/dist/packages/stack/src/plugins/comments/api/serializers.mjs +21 -0
- package/dist/packages/stack/src/plugins/comments/client/components/comment-count.cjs +46 -0
- package/dist/packages/stack/src/plugins/comments/client/components/comment-count.mjs +44 -0
- package/dist/packages/stack/src/plugins/comments/client/components/comment-form.cjs +86 -0
- package/dist/packages/stack/src/plugins/comments/client/components/comment-form.mjs +84 -0
- package/dist/packages/stack/src/plugins/comments/client/components/comment-thread.cjs +540 -0
- package/dist/packages/stack/src/plugins/comments/client/components/comment-thread.mjs +538 -0
- package/dist/packages/stack/src/plugins/comments/client/components/pages/moderation-page.cjs +64 -0
- package/dist/packages/stack/src/plugins/comments/client/components/pages/moderation-page.internal.cjs +426 -0
- package/dist/packages/stack/src/plugins/comments/client/components/pages/moderation-page.internal.mjs +424 -0
- package/dist/packages/stack/src/plugins/comments/client/components/pages/moderation-page.mjs +62 -0
- package/dist/packages/stack/src/plugins/comments/client/components/pages/my-comments-page.cjs +66 -0
- package/dist/packages/stack/src/plugins/comments/client/components/pages/my-comments-page.internal.cjs +256 -0
- package/dist/packages/stack/src/plugins/comments/client/components/pages/my-comments-page.internal.mjs +254 -0
- package/dist/packages/stack/src/plugins/comments/client/components/pages/my-comments-page.mjs +64 -0
- package/dist/packages/stack/src/plugins/comments/client/components/pages/resource-comments-page.cjs +86 -0
- package/dist/packages/stack/src/plugins/comments/client/components/pages/resource-comments-page.internal.cjs +191 -0
- package/dist/packages/stack/src/plugins/comments/client/components/pages/resource-comments-page.internal.mjs +189 -0
- package/dist/packages/stack/src/plugins/comments/client/components/pages/resource-comments-page.mjs +84 -0
- package/dist/packages/stack/src/plugins/comments/client/components/shared/page-wrapper.cjs +27 -0
- package/dist/packages/stack/src/plugins/comments/client/components/shared/page-wrapper.mjs +25 -0
- package/dist/packages/stack/src/plugins/comments/client/components/shared/pagination.cjs +37 -0
- package/dist/packages/stack/src/plugins/comments/client/components/shared/pagination.mjs +35 -0
- package/dist/packages/stack/src/plugins/comments/client/hooks/use-comments.cjs +476 -0
- package/dist/packages/stack/src/plugins/comments/client/hooks/use-comments.mjs +464 -0
- package/dist/packages/stack/src/plugins/comments/client/localization/comments-moderation.cjs +67 -0
- package/dist/packages/stack/src/plugins/comments/client/localization/comments-moderation.mjs +65 -0
- package/dist/packages/stack/src/plugins/comments/client/localization/comments-my.cjs +27 -0
- package/dist/packages/stack/src/plugins/comments/client/localization/comments-my.mjs +25 -0
- package/dist/packages/stack/src/plugins/comments/client/localization/comments-thread.cjs +30 -0
- package/dist/packages/stack/src/plugins/comments/client/localization/comments-thread.mjs +28 -0
- package/dist/packages/stack/src/plugins/comments/client/localization/index.cjs +13 -0
- package/dist/packages/stack/src/plugins/comments/client/localization/index.mjs +11 -0
- package/dist/packages/stack/src/plugins/comments/client/plugin.cjs +116 -0
- package/dist/packages/stack/src/plugins/comments/client/plugin.mjs +114 -0
- package/dist/packages/stack/src/plugins/comments/client/utils.cjs +41 -0
- package/dist/packages/stack/src/plugins/comments/client/utils.mjs +37 -0
- package/dist/packages/stack/src/plugins/comments/db.cjs +75 -0
- package/dist/packages/stack/src/plugins/comments/db.mjs +73 -0
- package/dist/packages/stack/src/plugins/comments/schemas.cjs +45 -0
- package/dist/packages/stack/src/plugins/comments/schemas.mjs +38 -0
- package/dist/packages/stack/src/plugins/kanban/client/components/forms/task-form.cjs +0 -1
- package/dist/packages/stack/src/plugins/kanban/client/components/forms/task-form.mjs +0 -1
- package/dist/packages/stack/src/plugins/kanban/client/components/pages/board-page.internal.cjs +39 -22
- package/dist/packages/stack/src/plugins/kanban/client/components/pages/board-page.internal.mjs +40 -23
- package/dist/packages/ui/src/components/avatar.mjs +1 -1
- package/dist/packages/ui/src/components/pagination-controls.cjs +64 -0
- package/dist/packages/ui/src/components/pagination-controls.mjs +62 -0
- package/dist/packages/ui/src/components/when-visible.cjs +39 -0
- package/dist/packages/ui/src/components/when-visible.mjs +37 -0
- package/dist/plugins/blog/client/hooks/index.d.cts +1 -1
- package/dist/plugins/blog/client/hooks/index.d.mts +1 -1
- package/dist/plugins/blog/client/hooks/index.d.ts +1 -1
- package/dist/plugins/blog/client/index.d.cts +24 -2
- package/dist/plugins/blog/client/index.d.mts +24 -2
- package/dist/plugins/blog/client/index.d.ts +24 -2
- package/dist/plugins/comments/api/index.cjs +21 -0
- package/dist/plugins/comments/api/index.d.cts +126 -0
- package/dist/plugins/comments/api/index.d.mts +126 -0
- package/dist/plugins/comments/api/index.d.ts +126 -0
- package/dist/plugins/comments/api/index.mjs +5 -0
- package/dist/plugins/comments/client/components/index.cjs +15 -0
- package/dist/plugins/comments/client/components/index.d.cts +125 -0
- package/dist/plugins/comments/client/components/index.d.mts +125 -0
- package/dist/plugins/comments/client/components/index.d.ts +125 -0
- package/dist/plugins/comments/client/components/index.mjs +5 -0
- package/dist/plugins/comments/client/hooks/index.cjs +17 -0
- package/dist/plugins/comments/client/hooks/index.d.cts +200 -0
- package/dist/plugins/comments/client/hooks/index.d.mts +200 -0
- package/dist/plugins/comments/client/hooks/index.d.ts +200 -0
- package/dist/plugins/comments/client/hooks/index.mjs +1 -0
- package/dist/plugins/comments/client/index.cjs +9 -0
- package/dist/plugins/comments/client/index.d.cts +262 -0
- package/dist/plugins/comments/client/index.d.mts +262 -0
- package/dist/plugins/comments/client/index.d.ts +262 -0
- package/dist/plugins/comments/client/index.mjs +2 -0
- package/dist/plugins/comments/client.css +2 -0
- package/dist/plugins/comments/query-keys.cjs +113 -0
- package/dist/plugins/comments/query-keys.d.cts +71 -0
- package/dist/plugins/comments/query-keys.d.mts +71 -0
- package/dist/plugins/comments/query-keys.d.ts +71 -0
- package/dist/plugins/comments/query-keys.mjs +111 -0
- package/dist/plugins/comments/style.css +15 -0
- package/dist/plugins/kanban/api/index.d.cts +1 -1
- package/dist/plugins/kanban/api/index.d.mts +1 -1
- package/dist/plugins/kanban/api/index.d.ts +1 -1
- package/dist/plugins/kanban/client/hooks/index.d.cts +1 -1
- package/dist/plugins/kanban/client/hooks/index.d.mts +1 -1
- package/dist/plugins/kanban/client/hooks/index.d.ts +1 -1
- package/dist/plugins/kanban/client/index.d.cts +1 -1
- package/dist/plugins/kanban/client/index.d.mts +1 -1
- package/dist/plugins/kanban/client/index.d.ts +1 -1
- package/dist/plugins/kanban/query-keys.d.cts +1 -1
- package/dist/plugins/kanban/query-keys.d.mts +1 -1
- package/dist/plugins/kanban/query-keys.d.ts +1 -1
- package/dist/shared/{stack.FeaWkglm.d.ts → stack.BxFl46lB.d.cts} +24 -1
- package/dist/shared/stack.C-b3Sn8j.d.cts +142 -0
- package/dist/shared/stack.C-b3Sn8j.d.mts +142 -0
- package/dist/shared/stack.C-b3Sn8j.d.ts +142 -0
- package/dist/shared/stack.CJE9sAjV.d.ts +335 -0
- package/dist/shared/stack.CmHRdhl8.d.cts +335 -0
- package/dist/shared/{stack.CNLHlv7r.d.mts → stack.DOZ1EXjM.d.mts} +6 -12
- package/dist/shared/{stack.FeaWkglm.d.mts → stack.DRpeDS6X.d.ts} +24 -1
- package/dist/shared/{stack.CQAZwXhV.d.cts → stack.DX-tQ93o.d.cts} +6 -12
- package/dist/shared/stack.Dcz6636A.d.mts +335 -0
- package/dist/shared/{stack.FeaWkglm.d.cts → stack.Jb0kQDJC.d.mts} +24 -1
- package/dist/shared/stack.Ldfkr5b2.d.cts +112 -0
- package/dist/shared/stack.Ldfkr5b2.d.mts +112 -0
- package/dist/shared/stack.Ldfkr5b2.d.ts +112 -0
- package/dist/shared/{stack.D3BsrpAz.d.ts → stack.VF6FhyZw.d.ts} +6 -12
- package/package.json +69 -4
- package/src/plugins/blog/client/components/loading/post-navigation-skeleton.tsx +10 -0
- package/src/plugins/blog/client/components/loading/recent-posts-carousel-skeleton.tsx +18 -0
- package/src/plugins/blog/client/components/pages/post-page.internal.tsx +23 -8
- package/src/plugins/blog/client/components/shared/post-navigation.tsx +0 -5
- package/src/plugins/blog/client/components/shared/recent-posts-carousel.tsx +1 -5
- package/src/plugins/blog/client/hooks/blog-hooks.tsx +8 -33
- package/src/plugins/blog/client/overrides.ts +26 -1
- package/src/plugins/cms/client/components/shared/pagination.tsx +14 -42
- package/src/plugins/comments/api/getters.ts +444 -0
- package/src/plugins/comments/api/index.ts +21 -0
- package/src/plugins/comments/api/mutations.ts +206 -0
- package/src/plugins/comments/api/plugin.ts +628 -0
- package/src/plugins/comments/api/query-key-defs.ts +143 -0
- package/src/plugins/comments/api/serializers.ts +37 -0
- package/src/plugins/comments/client/components/comment-count.tsx +66 -0
- package/src/plugins/comments/client/components/comment-form.tsx +112 -0
- package/src/plugins/comments/client/components/comment-thread.tsx +799 -0
- package/src/plugins/comments/client/components/index.tsx +11 -0
- package/src/plugins/comments/client/components/pages/moderation-page.internal.tsx +550 -0
- package/src/plugins/comments/client/components/pages/moderation-page.tsx +70 -0
- package/src/plugins/comments/client/components/pages/my-comments-page.internal.tsx +367 -0
- package/src/plugins/comments/client/components/pages/my-comments-page.tsx +72 -0
- package/src/plugins/comments/client/components/pages/resource-comments-page.internal.tsx +225 -0
- package/src/plugins/comments/client/components/pages/resource-comments-page.tsx +97 -0
- package/src/plugins/comments/client/components/shared/page-wrapper.tsx +32 -0
- package/src/plugins/comments/client/components/shared/pagination.tsx +44 -0
- package/src/plugins/comments/client/hooks/index.tsx +13 -0
- package/src/plugins/comments/client/hooks/use-comments.tsx +717 -0
- package/src/plugins/comments/client/index.ts +14 -0
- package/src/plugins/comments/client/localization/comments-moderation.ts +75 -0
- package/src/plugins/comments/client/localization/comments-my.ts +32 -0
- package/src/plugins/comments/client/localization/comments-thread.ts +32 -0
- package/src/plugins/comments/client/localization/index.ts +11 -0
- package/src/plugins/comments/client/overrides.ts +164 -0
- package/src/plugins/comments/client/plugin.tsx +195 -0
- package/src/plugins/comments/client/utils.ts +67 -0
- package/src/plugins/comments/client.css +2 -0
- package/src/plugins/comments/db.ts +77 -0
- package/src/plugins/comments/query-keys.ts +189 -0
- package/src/plugins/comments/schemas.ts +72 -0
- package/src/plugins/comments/style.css +15 -0
- package/src/plugins/comments/types.ts +73 -0
- package/src/plugins/kanban/client/components/forms/task-form.tsx +0 -1
- package/src/plugins/kanban/client/components/pages/board-page.internal.tsx +46 -27
- package/src/plugins/kanban/client/overrides.ts +27 -1
- package/dist/shared/{stack.Rtcvl8sS.d.cts → stack.BOokfhZD.d.cts} +3 -3
- package/dist/shared/{stack.D4Cea8II.d.ts → stack.BvCR4-9H.d.ts} +3 -3
- package/dist/shared/{stack.HE_IvqV5.d.mts → stack.CWxAl9K3.d.mts} +3 -3
|
@@ -5,7 +5,6 @@ const client = require('@btst/stack/plugins/client');
|
|
|
5
5
|
const reactQuery = require('@tanstack/react-query');
|
|
6
6
|
const useDebounce = require('./use-debounce.cjs');
|
|
7
7
|
const React = require('react');
|
|
8
|
-
const reactIntersectionObserver = require('react-intersection-observer');
|
|
9
8
|
const plugins_blog_queryKeys = require('../../../../../../../plugins/blog/query-keys.cjs');
|
|
10
9
|
const context = require('@btst/stack/context');
|
|
11
10
|
|
|
@@ -342,27 +341,19 @@ function useNextPreviousPosts(createdAt, options = {}) {
|
|
|
342
341
|
basePath: apiBasePath
|
|
343
342
|
});
|
|
344
343
|
const queries = plugins_blog_queryKeys.createBlogQueryKeys(client$1, headers);
|
|
345
|
-
const { ref, inView } = reactIntersectionObserver.useInView({
|
|
346
|
-
// start a little early so the data is ready as it scrolls in
|
|
347
|
-
rootMargin: "200px 0px",
|
|
348
|
-
// run once; keep data cached after
|
|
349
|
-
triggerOnce: true
|
|
350
|
-
});
|
|
351
344
|
const dateValue = typeof createdAt === "string" ? new Date(createdAt) : createdAt;
|
|
352
345
|
const baseQuery = queries.posts.nextPrevious(dateValue);
|
|
353
346
|
const { data, isLoading, error, refetch } = reactQuery.useQuery({
|
|
354
347
|
...baseQuery,
|
|
355
348
|
...SHARED_QUERY_CONFIG,
|
|
356
|
-
enabled: (options.enabled ?? true) &&
|
|
349
|
+
enabled: (options.enabled ?? true) && !!client$1
|
|
357
350
|
});
|
|
358
351
|
return {
|
|
359
352
|
previousPost: data?.previous ?? null,
|
|
360
353
|
nextPost: data?.next ?? null,
|
|
361
354
|
isLoading,
|
|
362
355
|
error,
|
|
363
|
-
refetch
|
|
364
|
-
ref,
|
|
365
|
-
inView
|
|
356
|
+
refetch
|
|
366
357
|
};
|
|
367
358
|
}
|
|
368
359
|
function useRecentPosts(options = {}) {
|
|
@@ -372,12 +363,6 @@ function useRecentPosts(options = {}) {
|
|
|
372
363
|
basePath: apiBasePath
|
|
373
364
|
});
|
|
374
365
|
const queries = plugins_blog_queryKeys.createBlogQueryKeys(client$1, headers);
|
|
375
|
-
const { ref, inView } = reactIntersectionObserver.useInView({
|
|
376
|
-
// start a little early so the data is ready as it scrolls in
|
|
377
|
-
rootMargin: "200px 0px",
|
|
378
|
-
// run once; keep data cached after
|
|
379
|
-
triggerOnce: true
|
|
380
|
-
});
|
|
381
366
|
const baseQuery = queries.posts.recent({
|
|
382
367
|
limit: options.limit ?? 5,
|
|
383
368
|
excludeSlug: options.excludeSlug
|
|
@@ -385,15 +370,13 @@ function useRecentPosts(options = {}) {
|
|
|
385
370
|
const { data, isLoading, error, refetch } = reactQuery.useQuery({
|
|
386
371
|
...baseQuery,
|
|
387
372
|
...SHARED_QUERY_CONFIG,
|
|
388
|
-
enabled: (options.enabled ?? true) &&
|
|
373
|
+
enabled: (options.enabled ?? true) && !!client$1
|
|
389
374
|
});
|
|
390
375
|
return {
|
|
391
376
|
recentPosts: data ?? [],
|
|
392
377
|
isLoading,
|
|
393
378
|
error,
|
|
394
|
-
refetch
|
|
395
|
-
ref,
|
|
396
|
-
inView
|
|
379
|
+
refetch
|
|
397
380
|
};
|
|
398
381
|
}
|
|
399
382
|
|
|
@@ -3,7 +3,6 @@ import { createApiClient } from '@btst/stack/plugins/client';
|
|
|
3
3
|
import { useInfiniteQuery, useSuspenseInfiniteQuery, useQuery, useSuspenseQuery, useQueryClient, useMutation } from '@tanstack/react-query';
|
|
4
4
|
import { useDebounce } from './use-debounce.mjs';
|
|
5
5
|
import { useRef, useEffect } from 'react';
|
|
6
|
-
import { useInView } from 'react-intersection-observer';
|
|
7
6
|
import { createBlogQueryKeys } from '../../../../../../../plugins/blog/query-keys.mjs';
|
|
8
7
|
import { usePluginOverrides } from '@btst/stack/context';
|
|
9
8
|
|
|
@@ -340,27 +339,19 @@ function useNextPreviousPosts(createdAt, options = {}) {
|
|
|
340
339
|
basePath: apiBasePath
|
|
341
340
|
});
|
|
342
341
|
const queries = createBlogQueryKeys(client, headers);
|
|
343
|
-
const { ref, inView } = useInView({
|
|
344
|
-
// start a little early so the data is ready as it scrolls in
|
|
345
|
-
rootMargin: "200px 0px",
|
|
346
|
-
// run once; keep data cached after
|
|
347
|
-
triggerOnce: true
|
|
348
|
-
});
|
|
349
342
|
const dateValue = typeof createdAt === "string" ? new Date(createdAt) : createdAt;
|
|
350
343
|
const baseQuery = queries.posts.nextPrevious(dateValue);
|
|
351
344
|
const { data, isLoading, error, refetch } = useQuery({
|
|
352
345
|
...baseQuery,
|
|
353
346
|
...SHARED_QUERY_CONFIG,
|
|
354
|
-
enabled: (options.enabled ?? true) &&
|
|
347
|
+
enabled: (options.enabled ?? true) && !!client
|
|
355
348
|
});
|
|
356
349
|
return {
|
|
357
350
|
previousPost: data?.previous ?? null,
|
|
358
351
|
nextPost: data?.next ?? null,
|
|
359
352
|
isLoading,
|
|
360
353
|
error,
|
|
361
|
-
refetch
|
|
362
|
-
ref,
|
|
363
|
-
inView
|
|
354
|
+
refetch
|
|
364
355
|
};
|
|
365
356
|
}
|
|
366
357
|
function useRecentPosts(options = {}) {
|
|
@@ -370,12 +361,6 @@ function useRecentPosts(options = {}) {
|
|
|
370
361
|
basePath: apiBasePath
|
|
371
362
|
});
|
|
372
363
|
const queries = createBlogQueryKeys(client, headers);
|
|
373
|
-
const { ref, inView } = useInView({
|
|
374
|
-
// start a little early so the data is ready as it scrolls in
|
|
375
|
-
rootMargin: "200px 0px",
|
|
376
|
-
// run once; keep data cached after
|
|
377
|
-
triggerOnce: true
|
|
378
|
-
});
|
|
379
364
|
const baseQuery = queries.posts.recent({
|
|
380
365
|
limit: options.limit ?? 5,
|
|
381
366
|
excludeSlug: options.excludeSlug
|
|
@@ -383,15 +368,13 @@ function useRecentPosts(options = {}) {
|
|
|
383
368
|
const { data, isLoading, error, refetch } = useQuery({
|
|
384
369
|
...baseQuery,
|
|
385
370
|
...SHARED_QUERY_CONFIG,
|
|
386
|
-
enabled: (options.enabled ?? true) &&
|
|
371
|
+
enabled: (options.enabled ?? true) && !!client
|
|
387
372
|
});
|
|
388
373
|
return {
|
|
389
374
|
recentPosts: data ?? [],
|
|
390
375
|
isLoading,
|
|
391
376
|
error,
|
|
392
|
-
refetch
|
|
393
|
-
ref,
|
|
394
|
-
inView
|
|
377
|
+
refetch
|
|
395
378
|
};
|
|
396
379
|
}
|
|
397
380
|
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
async function resolveAuthors(authorIds, resolveUser) {
|
|
4
|
+
const unique = [...new Set(authorIds)];
|
|
5
|
+
const map = /* @__PURE__ */ new Map();
|
|
6
|
+
if (!resolveUser || unique.length === 0) {
|
|
7
|
+
for (const id of unique) {
|
|
8
|
+
map.set(id, { name: "[deleted]", avatarUrl: null });
|
|
9
|
+
}
|
|
10
|
+
return map;
|
|
11
|
+
}
|
|
12
|
+
await Promise.all(
|
|
13
|
+
unique.map(async (id) => {
|
|
14
|
+
try {
|
|
15
|
+
const result = await resolveUser(id);
|
|
16
|
+
map.set(id, {
|
|
17
|
+
name: result?.name ?? "[deleted]",
|
|
18
|
+
avatarUrl: result?.avatarUrl ?? null
|
|
19
|
+
});
|
|
20
|
+
} catch {
|
|
21
|
+
map.set(id, { name: "[deleted]", avatarUrl: null });
|
|
22
|
+
}
|
|
23
|
+
})
|
|
24
|
+
);
|
|
25
|
+
return map;
|
|
26
|
+
}
|
|
27
|
+
function enrichComment(comment, authorMap, likedCommentIds, replyCount = 0) {
|
|
28
|
+
const author = authorMap.get(comment.authorId) ?? {
|
|
29
|
+
name: "[deleted]",
|
|
30
|
+
avatarUrl: null
|
|
31
|
+
};
|
|
32
|
+
return {
|
|
33
|
+
id: comment.id,
|
|
34
|
+
resourceId: comment.resourceId,
|
|
35
|
+
resourceType: comment.resourceType,
|
|
36
|
+
parentId: comment.parentId ?? null,
|
|
37
|
+
authorId: comment.authorId,
|
|
38
|
+
resolvedAuthorName: author.name,
|
|
39
|
+
resolvedAvatarUrl: author.avatarUrl,
|
|
40
|
+
body: comment.body,
|
|
41
|
+
status: comment.status,
|
|
42
|
+
likes: comment.likes,
|
|
43
|
+
isLikedByCurrentUser: likedCommentIds.has(comment.id),
|
|
44
|
+
editedAt: comment.editedAt?.toISOString() ?? null,
|
|
45
|
+
createdAt: comment.createdAt.toISOString(),
|
|
46
|
+
updatedAt: comment.updatedAt.toISOString(),
|
|
47
|
+
replyCount
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
function buildBaseConditions(params) {
|
|
51
|
+
const conditions = [];
|
|
52
|
+
if (params.resourceId) {
|
|
53
|
+
conditions.push({
|
|
54
|
+
field: "resourceId",
|
|
55
|
+
value: params.resourceId,
|
|
56
|
+
operator: "eq"
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
if (params.resourceType) {
|
|
60
|
+
conditions.push({
|
|
61
|
+
field: "resourceType",
|
|
62
|
+
value: params.resourceType,
|
|
63
|
+
operator: "eq"
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
if (params.parentId !== void 0) {
|
|
67
|
+
const parentValue = params.parentId === null || params.parentId === "null" ? null : params.parentId;
|
|
68
|
+
conditions.push({ field: "parentId", value: parentValue, operator: "eq" });
|
|
69
|
+
}
|
|
70
|
+
if (params.authorId) {
|
|
71
|
+
conditions.push({
|
|
72
|
+
field: "authorId",
|
|
73
|
+
value: params.authorId,
|
|
74
|
+
operator: "eq"
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
return conditions;
|
|
78
|
+
}
|
|
79
|
+
async function listComments(adapter, params, resolveUser) {
|
|
80
|
+
const limit = params.limit ?? 20;
|
|
81
|
+
const offset = params.offset ?? 0;
|
|
82
|
+
const sortDirection = params.sort ?? "asc";
|
|
83
|
+
const omitStatusFilter = !!params.authorId && !params.status;
|
|
84
|
+
const statusFilter = omitStatusFilter ? null : params.status ?? "approved";
|
|
85
|
+
const baseConditions = buildBaseConditions(params);
|
|
86
|
+
let comments;
|
|
87
|
+
let total;
|
|
88
|
+
if (!omitStatusFilter && statusFilter === "approved" && params.currentUserId) {
|
|
89
|
+
const [ownPendingAll, approvedCount] = await Promise.all([
|
|
90
|
+
adapter.findMany({
|
|
91
|
+
model: "comment",
|
|
92
|
+
where: [
|
|
93
|
+
...baseConditions,
|
|
94
|
+
{ field: "status", value: "pending", operator: "eq" },
|
|
95
|
+
{ field: "authorId", value: params.currentUserId, operator: "eq" }
|
|
96
|
+
],
|
|
97
|
+
sortBy: { field: "createdAt", direction: sortDirection }
|
|
98
|
+
}),
|
|
99
|
+
adapter.count({
|
|
100
|
+
model: "comment",
|
|
101
|
+
where: [
|
|
102
|
+
...baseConditions,
|
|
103
|
+
{ field: "status", value: "approved", operator: "eq" }
|
|
104
|
+
]
|
|
105
|
+
})
|
|
106
|
+
]);
|
|
107
|
+
total = approvedCount + ownPendingAll.length;
|
|
108
|
+
if (ownPendingAll.length === 0) {
|
|
109
|
+
comments = await adapter.findMany({
|
|
110
|
+
model: "comment",
|
|
111
|
+
limit,
|
|
112
|
+
offset,
|
|
113
|
+
where: [
|
|
114
|
+
...baseConditions,
|
|
115
|
+
{ field: "status", value: "approved", operator: "eq" }
|
|
116
|
+
],
|
|
117
|
+
sortBy: { field: "createdAt", direction: sortDirection }
|
|
118
|
+
});
|
|
119
|
+
} else {
|
|
120
|
+
const dateOp = sortDirection === "asc" ? "lt" : "gt";
|
|
121
|
+
const pendingWithPositions = await Promise.all(
|
|
122
|
+
ownPendingAll.map(async (p, i) => {
|
|
123
|
+
const approvedBefore = await adapter.count({
|
|
124
|
+
model: "comment",
|
|
125
|
+
where: [
|
|
126
|
+
...baseConditions,
|
|
127
|
+
{ field: "status", value: "approved", operator: "eq" },
|
|
128
|
+
{
|
|
129
|
+
field: "createdAt",
|
|
130
|
+
value: p.createdAt,
|
|
131
|
+
operator: dateOp
|
|
132
|
+
}
|
|
133
|
+
]
|
|
134
|
+
});
|
|
135
|
+
return { comment: p, mergedPosition: approvedBefore + i };
|
|
136
|
+
})
|
|
137
|
+
);
|
|
138
|
+
const pendingInWindow = pendingWithPositions.filter(
|
|
139
|
+
({ mergedPosition }) => mergedPosition >= offset && mergedPosition < offset + limit
|
|
140
|
+
);
|
|
141
|
+
const countPendingBeforeWindow = pendingWithPositions.filter(
|
|
142
|
+
({ mergedPosition }) => mergedPosition < offset
|
|
143
|
+
).length;
|
|
144
|
+
const approvedOffset = Math.max(0, offset - countPendingBeforeWindow);
|
|
145
|
+
const approvedLimit = limit - pendingInWindow.length;
|
|
146
|
+
const approvedPage = approvedLimit > 0 ? await adapter.findMany({
|
|
147
|
+
model: "comment",
|
|
148
|
+
limit: approvedLimit,
|
|
149
|
+
offset: approvedOffset,
|
|
150
|
+
where: [
|
|
151
|
+
...baseConditions,
|
|
152
|
+
{ field: "status", value: "approved", operator: "eq" }
|
|
153
|
+
],
|
|
154
|
+
sortBy: { field: "createdAt", direction: sortDirection }
|
|
155
|
+
}) : [];
|
|
156
|
+
const merged = [
|
|
157
|
+
...approvedPage,
|
|
158
|
+
...pendingInWindow.map(({ comment }) => comment)
|
|
159
|
+
];
|
|
160
|
+
merged.sort((a, b) => {
|
|
161
|
+
const diff = a.createdAt.getTime() - b.createdAt.getTime();
|
|
162
|
+
return sortDirection === "desc" ? -diff : diff;
|
|
163
|
+
});
|
|
164
|
+
comments = merged;
|
|
165
|
+
}
|
|
166
|
+
} else {
|
|
167
|
+
const where = [...baseConditions];
|
|
168
|
+
if (statusFilter !== null) {
|
|
169
|
+
where.push({
|
|
170
|
+
field: "status",
|
|
171
|
+
value: statusFilter,
|
|
172
|
+
operator: "eq"
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
const [found, count] = await Promise.all([
|
|
176
|
+
adapter.findMany({
|
|
177
|
+
model: "comment",
|
|
178
|
+
limit,
|
|
179
|
+
offset,
|
|
180
|
+
where,
|
|
181
|
+
sortBy: { field: "createdAt", direction: sortDirection }
|
|
182
|
+
}),
|
|
183
|
+
adapter.count({ model: "comment", where })
|
|
184
|
+
]);
|
|
185
|
+
comments = found;
|
|
186
|
+
total = count;
|
|
187
|
+
}
|
|
188
|
+
const authorIds = comments.map((c) => c.authorId);
|
|
189
|
+
const authorMap = await resolveAuthors(authorIds, resolveUser);
|
|
190
|
+
const likedCommentIds = /* @__PURE__ */ new Set();
|
|
191
|
+
if (params.currentUserId && comments.length > 0) {
|
|
192
|
+
const commentIds = comments.map((c) => c.id);
|
|
193
|
+
const likes = await Promise.all(
|
|
194
|
+
commentIds.map(
|
|
195
|
+
(commentId) => adapter.findOne({
|
|
196
|
+
model: "commentLike",
|
|
197
|
+
where: [
|
|
198
|
+
{ field: "commentId", value: commentId, operator: "eq" },
|
|
199
|
+
{
|
|
200
|
+
field: "authorId",
|
|
201
|
+
value: params.currentUserId,
|
|
202
|
+
operator: "eq"
|
|
203
|
+
}
|
|
204
|
+
]
|
|
205
|
+
})
|
|
206
|
+
)
|
|
207
|
+
);
|
|
208
|
+
likes.forEach((like, i) => {
|
|
209
|
+
if (like) likedCommentIds.add(commentIds[i]);
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
const replyCounts = /* @__PURE__ */ new Map();
|
|
213
|
+
const isTopLevelQuery = params.parentId === null || params.parentId === "null";
|
|
214
|
+
if (isTopLevelQuery && comments.length > 0) {
|
|
215
|
+
await Promise.all(
|
|
216
|
+
comments.map(async (c) => {
|
|
217
|
+
const approvedCount = await adapter.count({
|
|
218
|
+
model: "comment",
|
|
219
|
+
where: [
|
|
220
|
+
{ field: "parentId", value: c.id, operator: "eq" },
|
|
221
|
+
{ field: "status", value: "approved", operator: "eq" }
|
|
222
|
+
]
|
|
223
|
+
});
|
|
224
|
+
let ownPendingCount = 0;
|
|
225
|
+
if (params.currentUserId) {
|
|
226
|
+
ownPendingCount = await adapter.count({
|
|
227
|
+
model: "comment",
|
|
228
|
+
where: [
|
|
229
|
+
{ field: "parentId", value: c.id, operator: "eq" },
|
|
230
|
+
{ field: "status", value: "pending", operator: "eq" },
|
|
231
|
+
{
|
|
232
|
+
field: "authorId",
|
|
233
|
+
value: params.currentUserId,
|
|
234
|
+
operator: "eq"
|
|
235
|
+
}
|
|
236
|
+
]
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
replyCounts.set(c.id, approvedCount + ownPendingCount);
|
|
240
|
+
})
|
|
241
|
+
);
|
|
242
|
+
}
|
|
243
|
+
const items = comments.map(
|
|
244
|
+
(c) => enrichComment(c, authorMap, likedCommentIds, replyCounts.get(c.id) ?? 0)
|
|
245
|
+
);
|
|
246
|
+
return { items, total, limit, offset };
|
|
247
|
+
}
|
|
248
|
+
async function getCommentById(adapter, id, resolveUser, currentUserId) {
|
|
249
|
+
const comment = await adapter.findOne({
|
|
250
|
+
model: "comment",
|
|
251
|
+
where: [{ field: "id", value: id, operator: "eq" }]
|
|
252
|
+
});
|
|
253
|
+
if (!comment) return null;
|
|
254
|
+
const authorMap = await resolveAuthors([comment.authorId], resolveUser);
|
|
255
|
+
const likedCommentIds = /* @__PURE__ */ new Set();
|
|
256
|
+
if (currentUserId) {
|
|
257
|
+
const like = await adapter.findOne({
|
|
258
|
+
model: "commentLike",
|
|
259
|
+
where: [
|
|
260
|
+
{ field: "commentId", value: id, operator: "eq" },
|
|
261
|
+
{ field: "authorId", value: currentUserId, operator: "eq" }
|
|
262
|
+
]
|
|
263
|
+
});
|
|
264
|
+
if (like) likedCommentIds.add(id);
|
|
265
|
+
}
|
|
266
|
+
return enrichComment(comment, authorMap, likedCommentIds);
|
|
267
|
+
}
|
|
268
|
+
async function getCommentCount(adapter, params) {
|
|
269
|
+
const whereConditions = [
|
|
270
|
+
{ field: "resourceId", value: params.resourceId, operator: "eq" },
|
|
271
|
+
{ field: "resourceType", value: params.resourceType, operator: "eq" }
|
|
272
|
+
];
|
|
273
|
+
const statusFilter = params.status ?? "approved";
|
|
274
|
+
whereConditions.push({
|
|
275
|
+
field: "status",
|
|
276
|
+
value: statusFilter,
|
|
277
|
+
operator: "eq"
|
|
278
|
+
});
|
|
279
|
+
return adapter.count({ model: "comment", where: whereConditions });
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
exports.getCommentById = getCommentById;
|
|
283
|
+
exports.getCommentCount = getCommentCount;
|
|
284
|
+
exports.listComments = listComments;
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
async function resolveAuthors(authorIds, resolveUser) {
|
|
2
|
+
const unique = [...new Set(authorIds)];
|
|
3
|
+
const map = /* @__PURE__ */ new Map();
|
|
4
|
+
if (!resolveUser || unique.length === 0) {
|
|
5
|
+
for (const id of unique) {
|
|
6
|
+
map.set(id, { name: "[deleted]", avatarUrl: null });
|
|
7
|
+
}
|
|
8
|
+
return map;
|
|
9
|
+
}
|
|
10
|
+
await Promise.all(
|
|
11
|
+
unique.map(async (id) => {
|
|
12
|
+
try {
|
|
13
|
+
const result = await resolveUser(id);
|
|
14
|
+
map.set(id, {
|
|
15
|
+
name: result?.name ?? "[deleted]",
|
|
16
|
+
avatarUrl: result?.avatarUrl ?? null
|
|
17
|
+
});
|
|
18
|
+
} catch {
|
|
19
|
+
map.set(id, { name: "[deleted]", avatarUrl: null });
|
|
20
|
+
}
|
|
21
|
+
})
|
|
22
|
+
);
|
|
23
|
+
return map;
|
|
24
|
+
}
|
|
25
|
+
function enrichComment(comment, authorMap, likedCommentIds, replyCount = 0) {
|
|
26
|
+
const author = authorMap.get(comment.authorId) ?? {
|
|
27
|
+
name: "[deleted]",
|
|
28
|
+
avatarUrl: null
|
|
29
|
+
};
|
|
30
|
+
return {
|
|
31
|
+
id: comment.id,
|
|
32
|
+
resourceId: comment.resourceId,
|
|
33
|
+
resourceType: comment.resourceType,
|
|
34
|
+
parentId: comment.parentId ?? null,
|
|
35
|
+
authorId: comment.authorId,
|
|
36
|
+
resolvedAuthorName: author.name,
|
|
37
|
+
resolvedAvatarUrl: author.avatarUrl,
|
|
38
|
+
body: comment.body,
|
|
39
|
+
status: comment.status,
|
|
40
|
+
likes: comment.likes,
|
|
41
|
+
isLikedByCurrentUser: likedCommentIds.has(comment.id),
|
|
42
|
+
editedAt: comment.editedAt?.toISOString() ?? null,
|
|
43
|
+
createdAt: comment.createdAt.toISOString(),
|
|
44
|
+
updatedAt: comment.updatedAt.toISOString(),
|
|
45
|
+
replyCount
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
function buildBaseConditions(params) {
|
|
49
|
+
const conditions = [];
|
|
50
|
+
if (params.resourceId) {
|
|
51
|
+
conditions.push({
|
|
52
|
+
field: "resourceId",
|
|
53
|
+
value: params.resourceId,
|
|
54
|
+
operator: "eq"
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
if (params.resourceType) {
|
|
58
|
+
conditions.push({
|
|
59
|
+
field: "resourceType",
|
|
60
|
+
value: params.resourceType,
|
|
61
|
+
operator: "eq"
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
if (params.parentId !== void 0) {
|
|
65
|
+
const parentValue = params.parentId === null || params.parentId === "null" ? null : params.parentId;
|
|
66
|
+
conditions.push({ field: "parentId", value: parentValue, operator: "eq" });
|
|
67
|
+
}
|
|
68
|
+
if (params.authorId) {
|
|
69
|
+
conditions.push({
|
|
70
|
+
field: "authorId",
|
|
71
|
+
value: params.authorId,
|
|
72
|
+
operator: "eq"
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
return conditions;
|
|
76
|
+
}
|
|
77
|
+
async function listComments(adapter, params, resolveUser) {
|
|
78
|
+
const limit = params.limit ?? 20;
|
|
79
|
+
const offset = params.offset ?? 0;
|
|
80
|
+
const sortDirection = params.sort ?? "asc";
|
|
81
|
+
const omitStatusFilter = !!params.authorId && !params.status;
|
|
82
|
+
const statusFilter = omitStatusFilter ? null : params.status ?? "approved";
|
|
83
|
+
const baseConditions = buildBaseConditions(params);
|
|
84
|
+
let comments;
|
|
85
|
+
let total;
|
|
86
|
+
if (!omitStatusFilter && statusFilter === "approved" && params.currentUserId) {
|
|
87
|
+
const [ownPendingAll, approvedCount] = await Promise.all([
|
|
88
|
+
adapter.findMany({
|
|
89
|
+
model: "comment",
|
|
90
|
+
where: [
|
|
91
|
+
...baseConditions,
|
|
92
|
+
{ field: "status", value: "pending", operator: "eq" },
|
|
93
|
+
{ field: "authorId", value: params.currentUserId, operator: "eq" }
|
|
94
|
+
],
|
|
95
|
+
sortBy: { field: "createdAt", direction: sortDirection }
|
|
96
|
+
}),
|
|
97
|
+
adapter.count({
|
|
98
|
+
model: "comment",
|
|
99
|
+
where: [
|
|
100
|
+
...baseConditions,
|
|
101
|
+
{ field: "status", value: "approved", operator: "eq" }
|
|
102
|
+
]
|
|
103
|
+
})
|
|
104
|
+
]);
|
|
105
|
+
total = approvedCount + ownPendingAll.length;
|
|
106
|
+
if (ownPendingAll.length === 0) {
|
|
107
|
+
comments = await adapter.findMany({
|
|
108
|
+
model: "comment",
|
|
109
|
+
limit,
|
|
110
|
+
offset,
|
|
111
|
+
where: [
|
|
112
|
+
...baseConditions,
|
|
113
|
+
{ field: "status", value: "approved", operator: "eq" }
|
|
114
|
+
],
|
|
115
|
+
sortBy: { field: "createdAt", direction: sortDirection }
|
|
116
|
+
});
|
|
117
|
+
} else {
|
|
118
|
+
const dateOp = sortDirection === "asc" ? "lt" : "gt";
|
|
119
|
+
const pendingWithPositions = await Promise.all(
|
|
120
|
+
ownPendingAll.map(async (p, i) => {
|
|
121
|
+
const approvedBefore = await adapter.count({
|
|
122
|
+
model: "comment",
|
|
123
|
+
where: [
|
|
124
|
+
...baseConditions,
|
|
125
|
+
{ field: "status", value: "approved", operator: "eq" },
|
|
126
|
+
{
|
|
127
|
+
field: "createdAt",
|
|
128
|
+
value: p.createdAt,
|
|
129
|
+
operator: dateOp
|
|
130
|
+
}
|
|
131
|
+
]
|
|
132
|
+
});
|
|
133
|
+
return { comment: p, mergedPosition: approvedBefore + i };
|
|
134
|
+
})
|
|
135
|
+
);
|
|
136
|
+
const pendingInWindow = pendingWithPositions.filter(
|
|
137
|
+
({ mergedPosition }) => mergedPosition >= offset && mergedPosition < offset + limit
|
|
138
|
+
);
|
|
139
|
+
const countPendingBeforeWindow = pendingWithPositions.filter(
|
|
140
|
+
({ mergedPosition }) => mergedPosition < offset
|
|
141
|
+
).length;
|
|
142
|
+
const approvedOffset = Math.max(0, offset - countPendingBeforeWindow);
|
|
143
|
+
const approvedLimit = limit - pendingInWindow.length;
|
|
144
|
+
const approvedPage = approvedLimit > 0 ? await adapter.findMany({
|
|
145
|
+
model: "comment",
|
|
146
|
+
limit: approvedLimit,
|
|
147
|
+
offset: approvedOffset,
|
|
148
|
+
where: [
|
|
149
|
+
...baseConditions,
|
|
150
|
+
{ field: "status", value: "approved", operator: "eq" }
|
|
151
|
+
],
|
|
152
|
+
sortBy: { field: "createdAt", direction: sortDirection }
|
|
153
|
+
}) : [];
|
|
154
|
+
const merged = [
|
|
155
|
+
...approvedPage,
|
|
156
|
+
...pendingInWindow.map(({ comment }) => comment)
|
|
157
|
+
];
|
|
158
|
+
merged.sort((a, b) => {
|
|
159
|
+
const diff = a.createdAt.getTime() - b.createdAt.getTime();
|
|
160
|
+
return sortDirection === "desc" ? -diff : diff;
|
|
161
|
+
});
|
|
162
|
+
comments = merged;
|
|
163
|
+
}
|
|
164
|
+
} else {
|
|
165
|
+
const where = [...baseConditions];
|
|
166
|
+
if (statusFilter !== null) {
|
|
167
|
+
where.push({
|
|
168
|
+
field: "status",
|
|
169
|
+
value: statusFilter,
|
|
170
|
+
operator: "eq"
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
const [found, count] = await Promise.all([
|
|
174
|
+
adapter.findMany({
|
|
175
|
+
model: "comment",
|
|
176
|
+
limit,
|
|
177
|
+
offset,
|
|
178
|
+
where,
|
|
179
|
+
sortBy: { field: "createdAt", direction: sortDirection }
|
|
180
|
+
}),
|
|
181
|
+
adapter.count({ model: "comment", where })
|
|
182
|
+
]);
|
|
183
|
+
comments = found;
|
|
184
|
+
total = count;
|
|
185
|
+
}
|
|
186
|
+
const authorIds = comments.map((c) => c.authorId);
|
|
187
|
+
const authorMap = await resolveAuthors(authorIds, resolveUser);
|
|
188
|
+
const likedCommentIds = /* @__PURE__ */ new Set();
|
|
189
|
+
if (params.currentUserId && comments.length > 0) {
|
|
190
|
+
const commentIds = comments.map((c) => c.id);
|
|
191
|
+
const likes = await Promise.all(
|
|
192
|
+
commentIds.map(
|
|
193
|
+
(commentId) => adapter.findOne({
|
|
194
|
+
model: "commentLike",
|
|
195
|
+
where: [
|
|
196
|
+
{ field: "commentId", value: commentId, operator: "eq" },
|
|
197
|
+
{
|
|
198
|
+
field: "authorId",
|
|
199
|
+
value: params.currentUserId,
|
|
200
|
+
operator: "eq"
|
|
201
|
+
}
|
|
202
|
+
]
|
|
203
|
+
})
|
|
204
|
+
)
|
|
205
|
+
);
|
|
206
|
+
likes.forEach((like, i) => {
|
|
207
|
+
if (like) likedCommentIds.add(commentIds[i]);
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
const replyCounts = /* @__PURE__ */ new Map();
|
|
211
|
+
const isTopLevelQuery = params.parentId === null || params.parentId === "null";
|
|
212
|
+
if (isTopLevelQuery && comments.length > 0) {
|
|
213
|
+
await Promise.all(
|
|
214
|
+
comments.map(async (c) => {
|
|
215
|
+
const approvedCount = await adapter.count({
|
|
216
|
+
model: "comment",
|
|
217
|
+
where: [
|
|
218
|
+
{ field: "parentId", value: c.id, operator: "eq" },
|
|
219
|
+
{ field: "status", value: "approved", operator: "eq" }
|
|
220
|
+
]
|
|
221
|
+
});
|
|
222
|
+
let ownPendingCount = 0;
|
|
223
|
+
if (params.currentUserId) {
|
|
224
|
+
ownPendingCount = await adapter.count({
|
|
225
|
+
model: "comment",
|
|
226
|
+
where: [
|
|
227
|
+
{ field: "parentId", value: c.id, operator: "eq" },
|
|
228
|
+
{ field: "status", value: "pending", operator: "eq" },
|
|
229
|
+
{
|
|
230
|
+
field: "authorId",
|
|
231
|
+
value: params.currentUserId,
|
|
232
|
+
operator: "eq"
|
|
233
|
+
}
|
|
234
|
+
]
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
replyCounts.set(c.id, approvedCount + ownPendingCount);
|
|
238
|
+
})
|
|
239
|
+
);
|
|
240
|
+
}
|
|
241
|
+
const items = comments.map(
|
|
242
|
+
(c) => enrichComment(c, authorMap, likedCommentIds, replyCounts.get(c.id) ?? 0)
|
|
243
|
+
);
|
|
244
|
+
return { items, total, limit, offset };
|
|
245
|
+
}
|
|
246
|
+
async function getCommentById(adapter, id, resolveUser, currentUserId) {
|
|
247
|
+
const comment = await adapter.findOne({
|
|
248
|
+
model: "comment",
|
|
249
|
+
where: [{ field: "id", value: id, operator: "eq" }]
|
|
250
|
+
});
|
|
251
|
+
if (!comment) return null;
|
|
252
|
+
const authorMap = await resolveAuthors([comment.authorId], resolveUser);
|
|
253
|
+
const likedCommentIds = /* @__PURE__ */ new Set();
|
|
254
|
+
if (currentUserId) {
|
|
255
|
+
const like = await adapter.findOne({
|
|
256
|
+
model: "commentLike",
|
|
257
|
+
where: [
|
|
258
|
+
{ field: "commentId", value: id, operator: "eq" },
|
|
259
|
+
{ field: "authorId", value: currentUserId, operator: "eq" }
|
|
260
|
+
]
|
|
261
|
+
});
|
|
262
|
+
if (like) likedCommentIds.add(id);
|
|
263
|
+
}
|
|
264
|
+
return enrichComment(comment, authorMap, likedCommentIds);
|
|
265
|
+
}
|
|
266
|
+
async function getCommentCount(adapter, params) {
|
|
267
|
+
const whereConditions = [
|
|
268
|
+
{ field: "resourceId", value: params.resourceId, operator: "eq" },
|
|
269
|
+
{ field: "resourceType", value: params.resourceType, operator: "eq" }
|
|
270
|
+
];
|
|
271
|
+
const statusFilter = params.status ?? "approved";
|
|
272
|
+
whereConditions.push({
|
|
273
|
+
field: "status",
|
|
274
|
+
value: statusFilter,
|
|
275
|
+
operator: "eq"
|
|
276
|
+
});
|
|
277
|
+
return adapter.count({ model: "comment", where: whereConditions });
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
export { getCommentById, getCommentCount, listComments };
|