@drodil/backstage-plugin-qeta-backend 3.48.2 → 3.49.0
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/dist/database/DatabaseQetaStore.cjs.js +11 -0
- package/dist/database/DatabaseQetaStore.cjs.js.map +1 -1
- package/dist/database/QetaStore.cjs.js.map +1 -1
- package/dist/database/stores/BaseStore.cjs.js +4 -3
- package/dist/database/stores/BaseStore.cjs.js.map +1 -1
- package/dist/database/stores/CollectionsStore.cjs.js +14 -1
- package/dist/database/stores/CollectionsStore.cjs.js.map +1 -1
- package/dist/database/stores/EntitiesStore.cjs.js +18 -1
- package/dist/database/stores/EntitiesStore.cjs.js.map +1 -1
- package/dist/database/stores/PostsStore.cjs.js +69 -0
- package/dist/database/stores/PostsStore.cjs.js.map +1 -1
- package/dist/database/stores/TagsStore.cjs.js +19 -2
- package/dist/database/stores/TagsStore.cjs.js.map +1 -1
- package/dist/database/stores/UsersStore.cjs.js +24 -12
- package/dist/database/stores/UsersStore.cjs.js.map +1 -1
- package/dist/service/routes/helpers.cjs.js +44 -11
- package/dist/service/routes/helpers.cjs.js.map +1 -1
- package/dist/service/routes/posts.cjs.js +32 -3
- package/dist/service/routes/posts.cjs.js.map +1 -1
- package/dist/service/types.cjs.js +41 -4
- package/dist/service/types.cjs.js.map +1 -1
- package/package.json +6 -6
|
@@ -432,6 +432,17 @@ class DatabaseQetaStore {
|
|
|
432
432
|
async getTotalViews(user_ref, lastDays, excludeUser) {
|
|
433
433
|
return this.statsStore.getTotalViews(user_ref, lastDays, excludeUser);
|
|
434
434
|
}
|
|
435
|
+
async suggestPosts(user_ref, title, content, tags, entities, filters, opts) {
|
|
436
|
+
return this.postsStore.suggestPosts(
|
|
437
|
+
user_ref,
|
|
438
|
+
title,
|
|
439
|
+
content,
|
|
440
|
+
tags,
|
|
441
|
+
entities,
|
|
442
|
+
filters,
|
|
443
|
+
opts
|
|
444
|
+
);
|
|
445
|
+
}
|
|
435
446
|
async cleanStats(days, date) {
|
|
436
447
|
return this.statsStore.cleanStats(days, date);
|
|
437
448
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DatabaseQetaStore.cjs.js","sources":["../../src/database/DatabaseQetaStore.ts"],"sourcesContent":["import {\n DatabaseService,\n resolvePackagePath,\n} from '@backstage/backend-plugin-api';\n\nimport {\n AnswerOptions,\n Answers,\n AttachmentParameters,\n CollectionOptions,\n CollectionPostRank,\n Collections,\n CommentOptions,\n EntitiesResponse,\n EntityResponse,\n MaybeAnswer,\n MaybeCollection,\n MaybePost,\n PostOptions,\n Posts,\n QetaStore,\n Templates,\n UserResponse,\n UsersResponse,\n} from './QetaStore';\nimport {\n AIResponse,\n AnswersQuery,\n Attachment,\n Collection,\n Comment as QetaComment,\n EntitiesQuery,\n EntityLinks,\n GlobalStat,\n Post,\n PostStatus,\n PostType,\n PostsQuery,\n Statistic,\n StatisticsRequestParameters,\n TagResponse,\n TagsQuery,\n TagsResponse,\n Template,\n UserCollectionsResponse,\n UserEntitiesResponse,\n UsersQuery,\n UserStat,\n UserTagsResponse,\n UserUsersResponse,\n} from '@drodil/backstage-plugin-qeta-common';\nimport { QetaFilters } from '../service/util';\nimport { PermissionCriteria } from '@backstage/plugin-permission-common';\nimport { TagDatabase } from '@drodil/backstage-plugin-qeta-node';\nimport { PostsStore } from './stores/PostsStore';\nimport { AnswersStore } from './stores/AnswersStore';\nimport { CommentsStore } from './stores/CommentsStore';\nimport { CollectionsStore } from './stores/CollectionsStore';\nimport { StatsStore } from './stores/StatsStore';\nimport { TagsStore } from './stores/TagsStore';\nimport { UsersStore } from './stores/UsersStore';\nimport { EntitiesStore } from './stores/EntitiesStore';\nimport { TemplatesStore } from './stores/TemplatesStore';\nimport { AttachmentsStore } from './stores/AttachmentsStore';\n\nconst migrationsDir = resolvePackagePath(\n '@drodil/backstage-plugin-qeta-backend',\n 'migrations',\n);\n\n// Local interfaces removed, imported from stores\n\nexport class DatabaseQetaStore implements QetaStore {\n private constructor(\n private readonly postsStore: PostsStore,\n private readonly answersStore: AnswersStore,\n private readonly commentsStore: CommentsStore,\n private readonly collectionsStore: CollectionsStore,\n private readonly statsStore: StatsStore,\n private readonly tagsStore: TagsStore,\n private readonly usersStore: UsersStore,\n private readonly entitiesStore: EntitiesStore,\n private readonly templatesStore: TemplatesStore,\n private readonly attachmentsStore: AttachmentsStore,\n ) {}\n\n static async create({\n database,\n skipMigrations,\n tagDatabase,\n }: {\n database: DatabaseService;\n skipMigrations?: boolean;\n tagDatabase?: TagDatabase;\n }): Promise<DatabaseQetaStore> {\n const client = await database.getClient();\n\n if (!database.migrations?.skip && !skipMigrations) {\n await client.migrate.latest({\n directory: migrationsDir,\n });\n }\n\n const commentsStore = new CommentsStore(client);\n const tagsStore = new TagsStore(client, tagDatabase);\n const entitiesStore = new EntitiesStore(client);\n const usersStore = new UsersStore(client);\n const templatesStore = new TemplatesStore(client, tagsStore, entitiesStore);\n const attachmentsStore = new AttachmentsStore(client);\n const postsStore = new PostsStore(\n client,\n commentsStore,\n tagsStore,\n entitiesStore,\n attachmentsStore,\n tagDatabase,\n );\n const answersStore = new AnswersStore(\n client,\n commentsStore,\n postsStore,\n attachmentsStore,\n );\n const collectionsStore = new CollectionsStore(\n client,\n postsStore,\n attachmentsStore,\n );\n const statsStore = new StatsStore(client);\n\n postsStore.setAnswersStore(answersStore);\n\n return new DatabaseQetaStore(\n postsStore,\n answersStore,\n commentsStore,\n collectionsStore,\n statsStore,\n tagsStore,\n usersStore,\n entitiesStore,\n templatesStore,\n attachmentsStore,\n );\n }\n\n async getPosts(\n user_ref: string,\n options: PostsQuery,\n filters?: PermissionCriteria<QetaFilters>,\n opts?: PostOptions,\n ): Promise<Posts> {\n return this.postsStore.getPosts(user_ref, options, filters, opts);\n }\n\n async getPost(\n user_ref: string,\n id: number,\n recordView?: boolean,\n options?: PostOptions,\n ): Promise<MaybePost> {\n return this.postsStore.getPost(user_ref, id, recordView, options);\n }\n\n async getPostByAnswerId(\n user_ref: string,\n answerId: number,\n recordView?: boolean,\n options?: PostOptions,\n ): Promise<MaybePost> {\n return this.postsStore.getPostByAnswerId(\n user_ref,\n answerId,\n recordView,\n options,\n );\n }\n\n async createPost(options: {\n user_ref: string;\n title: string;\n content: string;\n created: Date;\n author?: string;\n tags?: string[];\n entities?: string[];\n images?: number[];\n anonymous?: boolean;\n type?: PostType;\n headerImage?: string;\n url?: string;\n status?: PostStatus;\n opts?: PostOptions;\n }): Promise<Post> {\n return this.postsStore.createPost(options);\n }\n\n async updatePost(options: {\n user_ref: string;\n id: number;\n title?: string;\n content?: string;\n author?: string;\n tags?: string[];\n entities?: string[];\n images?: number[];\n headerImage?: string;\n url?: string;\n status?: PostStatus;\n opts?: PostOptions;\n }): Promise<MaybePost> {\n return this.postsStore.updatePost(options);\n }\n\n async deletePost(id: number, permanently?: boolean): Promise<boolean> {\n return this.postsStore.deletePost(id, permanently);\n }\n\n async votePost(\n user_ref: string,\n postId: number,\n score: number,\n ): Promise<boolean> {\n return this.postsStore.votePost(user_ref, postId, score);\n }\n\n async deletePostVote(user_ref: string, postId: number): Promise<boolean> {\n return this.postsStore.deletePostVote(user_ref, postId);\n }\n\n async favoritePost(user_ref: string, postId: number): Promise<boolean> {\n return this.postsStore.favoritePost(user_ref, postId);\n }\n\n async unfavoritePost(user_ref: string, postId: number): Promise<boolean> {\n return this.postsStore.unfavoritePost(user_ref, postId);\n }\n\n async getUsersWhoFavoritedPost(postId: number): Promise<string[]> {\n return this.postsStore.getUsersWhoFavoritedPost(postId);\n }\n\n async getAnswers(\n user_ref: string,\n options: AnswersQuery,\n filters?: PermissionCriteria<QetaFilters>,\n opts?: AnswerOptions,\n ): Promise<Answers> {\n return this.answersStore.getAnswers(user_ref, options, filters, opts);\n }\n\n async getAnswer(\n answerId: number,\n user_ref: string,\n options?: AnswerOptions,\n ): Promise<MaybeAnswer> {\n return this.answersStore.getAnswer(answerId, user_ref, options);\n }\n\n async answerPost(\n user_ref: string,\n questionId: number,\n answer: string,\n created: Date,\n images?: number[],\n anonymous?: boolean,\n options?: AnswerOptions,\n ): Promise<MaybeAnswer> {\n return this.answersStore.answerPost(\n user_ref,\n questionId,\n answer,\n created,\n images,\n anonymous,\n options,\n );\n }\n\n async updateAnswer(\n user_ref: string,\n questionId: number,\n answerId: number,\n answer: string,\n author?: string,\n images?: number[],\n options?: AnswerOptions,\n ): Promise<MaybeAnswer> {\n return this.answersStore.updateAnswer(\n user_ref,\n questionId,\n answerId,\n answer,\n author,\n images,\n options,\n );\n }\n\n async deleteAnswer(id: number): Promise<boolean> {\n return this.answersStore.deleteAnswer(id);\n }\n\n async voteAnswer(\n user_ref: string,\n answerId: number,\n score: number,\n ): Promise<boolean> {\n return this.answersStore.voteAnswer(user_ref, answerId, score);\n }\n\n async deleteAnswerVote(user_ref: string, answerId: number): Promise<boolean> {\n return this.answersStore.deleteAnswerVote(user_ref, answerId);\n }\n\n async markAnswerCorrect(postId: number, answerId: number): Promise<boolean> {\n return this.answersStore.markAnswerCorrect(postId, answerId);\n }\n\n async markAnswerIncorrect(\n postId: number,\n answerId: number,\n ): Promise<boolean> {\n return this.answersStore.markAnswerIncorrect(postId, answerId);\n }\n\n async clickPost(user_ref: string, postId: number): Promise<void> {\n const vote = await this.postsStore.getPostVote(user_ref, postId);\n const score = (vote?.score || 0) + 1;\n await this.postsStore.votePost(user_ref, postId, score);\n }\n\n async commentPost(\n post_id: number,\n user_ref: string,\n content: string,\n created: Date,\n ): Promise<MaybePost> {\n await this.commentsStore.commentPost(post_id, user_ref, content, created);\n return this.getPost(user_ref, post_id);\n }\n\n async commentAnswer(\n answer_id: number,\n user_ref: string,\n content: string,\n created: Date,\n ): Promise<MaybeAnswer> {\n await this.commentsStore.commentAnswer(\n answer_id,\n user_ref,\n content,\n created,\n );\n return this.getAnswer(answer_id, user_ref);\n }\n\n async updatePostComment(\n post_id: number,\n id: number,\n user_ref: string,\n content: string,\n ): Promise<MaybePost> {\n await this.commentsStore.updatePostComment(post_id, id, user_ref, content);\n return this.getPost(user_ref, post_id);\n }\n\n async updateAnswerComment(\n answer_id: number,\n id: number,\n user_ref: string,\n content: string,\n ): Promise<MaybeAnswer> {\n await this.commentsStore.updateAnswerComment(\n answer_id,\n id,\n user_ref,\n content,\n );\n return this.getAnswer(answer_id, user_ref);\n }\n\n async deletePostComment(\n post_id: number,\n id: number,\n user_ref: string,\n ): Promise<MaybePost> {\n await this.commentsStore.deletePostComment(post_id, id);\n return this.getPost(user_ref, post_id);\n }\n\n async deleteAnswerComment(\n answer_id: number,\n id: number,\n user_ref: string,\n ): Promise<MaybeAnswer> {\n await this.commentsStore.deleteAnswerComment(answer_id, id);\n return this.getAnswer(answer_id, user_ref);\n }\n\n async getCollections(\n user_ref: string,\n options: PostsQuery,\n opts?: CollectionOptions,\n ): Promise<Collections> {\n return this.collectionsStore.getCollections(user_ref, options, opts);\n }\n\n async getCollection(\n user_ref: string,\n id: number,\n options?: CollectionOptions,\n ): Promise<MaybeCollection> {\n return this.collectionsStore.getCollection(user_ref, id, options);\n }\n\n async createCollection(options: {\n user_ref: string;\n title: string;\n description?: string;\n created: Date;\n images?: number[];\n headerImage?: string;\n opts?: CollectionOptions;\n }): Promise<Collection> {\n return this.collectionsStore.createCollection(\n options,\n ) as Promise<Collection>;\n }\n\n async updateCollection(options: {\n id: number;\n user_ref: string;\n title: string;\n description?: string;\n images?: number[];\n headerImage?: string;\n opts?: CollectionOptions;\n }): Promise<MaybeCollection> {\n return this.collectionsStore.updateCollection(options);\n }\n\n async deleteCollection(id: number): Promise<boolean> {\n return this.collectionsStore.deleteCollection(id);\n }\n\n async addPostToCollection(\n user_ref: string,\n id: number,\n postId: number,\n options?: CollectionOptions,\n ): Promise<MaybeCollection> {\n return this.collectionsStore.addPostToCollection(\n user_ref,\n id,\n postId,\n options,\n );\n }\n\n async removePostFromCollection(\n user_ref: string,\n id: number,\n postId: number,\n options?: CollectionOptions,\n ): Promise<MaybeCollection> {\n return this.collectionsStore.removePostFromCollection(\n user_ref,\n id,\n postId,\n options,\n );\n }\n\n async getUsersForCollection(collectionId: number): Promise<string[]> {\n return this.collectionsStore.getUsersForCollection(collectionId);\n }\n\n async followCollection(\n user_ref: string,\n collectionId: number,\n ): Promise<boolean> {\n return this.collectionsStore.followCollection(user_ref, collectionId);\n }\n\n async unfollowCollection(\n user_ref: string,\n collectionId: number,\n ): Promise<boolean> {\n return this.collectionsStore.unfollowCollection(user_ref, collectionId);\n }\n\n async getUserCollections(\n user_ref: string,\n options?: CollectionOptions,\n ): Promise<UserCollectionsResponse> {\n return this.collectionsStore.getUserCollections(user_ref, options);\n }\n\n async getPostRank(\n collectionId: number,\n postId: number,\n ): Promise<number | null> {\n return this.collectionsStore.getPostRank(collectionId, postId);\n }\n\n async getTopRankedPostId(\n collectionId: number,\n ): Promise<CollectionPostRank | null> {\n return this.collectionsStore.getTopRankedPostId(collectionId);\n }\n\n async getBottomRankedPostId(\n collectionId: number,\n ): Promise<CollectionPostRank | null> {\n return this.collectionsStore.getBottomRankedPostId(collectionId);\n }\n\n async getNextRankedPostId(\n collectionId: number,\n postId: number,\n ): Promise<CollectionPostRank | null> {\n return this.collectionsStore.getNextRankedPostId(collectionId, postId);\n }\n\n async getPreviousRankedPostId(\n collectionId: number,\n postId: number,\n ): Promise<CollectionPostRank | null> {\n return this.collectionsStore.getPreviousRankedPostId(collectionId, postId);\n }\n\n async updatePostRank(\n collectionId: number,\n postId: number,\n rank: number,\n ): Promise<void> {\n return this.collectionsStore.updatePostRank(collectionId, postId, rank);\n }\n\n async getTags(\n options?: { noDescription?: boolean; ids?: number[] } & TagsQuery,\n filters?: PermissionCriteria<QetaFilters>,\n ): Promise<TagsResponse> {\n return this.tagsStore.getTags(options, filters);\n }\n\n async getTagExperts(tags: string[]): Promise<string[]> {\n return this.tagsStore.getTagExperts(tags);\n }\n\n async getTag(tag: string): Promise<TagResponse | null> {\n return this.tagsStore.getTag(tag);\n }\n\n async getTagById(id: number): Promise<TagResponse | null> {\n return this.tagsStore.getTagById(id);\n }\n\n async createTag(\n tag: string,\n description?: string,\n experts?: string[],\n ): Promise<TagResponse | null> {\n return this.tagsStore.createTag(tag, description, experts);\n }\n\n async updateTag(\n id: number,\n description?: string,\n experts?: string[],\n ): Promise<TagResponse | null> {\n return this.tagsStore.updateTag(id, description, experts);\n }\n\n async deleteTag(id: number): Promise<boolean> {\n return this.tagsStore.deleteTag(id);\n }\n\n async getEntities(\n options?: { entityRefs?: string[] } & EntitiesQuery,\n ): Promise<EntitiesResponse> {\n return this.entitiesStore.getEntities(options);\n }\n\n async getEntity(entity_ref: string): Promise<EntityResponse | null> {\n return this.entitiesStore.getEntity(entity_ref);\n }\n\n async getUsers(\n options?: { entityRefs?: string[] } & UsersQuery,\n ): Promise<UsersResponse> {\n return this.usersStore.getUsers(options);\n }\n\n async getUser(user_ref: string): Promise<UserResponse | null> {\n return this.usersStore.getUser(user_ref);\n }\n\n async getUserTags(\n user_ref: string,\n filters?: PermissionCriteria<QetaFilters>,\n ): Promise<UserTagsResponse> {\n return this.tagsStore.getUserTags(user_ref, filters);\n }\n\n async followTag(user_ref: string, tag: string): Promise<boolean> {\n return this.tagsStore.followTag(user_ref, tag);\n }\n\n async unfollowTag(user_ref: string, tag: string): Promise<boolean> {\n return this.tagsStore.unfollowTag(user_ref, tag);\n }\n\n async getUserEntities(user_ref: string): Promise<UserEntitiesResponse> {\n return this.entitiesStore.getUserEntities(user_ref);\n }\n\n async followEntity(user_ref: string, entityRef: string): Promise<boolean> {\n return this.entitiesStore.followEntity(user_ref, entityRef);\n }\n\n async unfollowEntity(user_ref: string, entityRef: string): Promise<boolean> {\n return this.entitiesStore.unfollowEntity(user_ref, entityRef);\n }\n\n async getUsersForTags(tags: string[]): Promise<string[]> {\n return this.tagsStore.getUsersForTags(tags);\n }\n\n async getUsersForEntities(entityRefs: string[]): Promise<string[]> {\n return this.entitiesStore.getUsersForEntities(entityRefs);\n }\n\n async getFollowedUsers(user_ref: string): Promise<UserUsersResponse> {\n return this.usersStore.getFollowedUsers(user_ref);\n }\n\n async followUser(\n user_ref: string,\n followedUserRef: string,\n ): Promise<boolean> {\n return this.usersStore.followUser(user_ref, followedUserRef);\n }\n\n async unfollowUser(\n user_ref: string,\n followedUserRef: string,\n ): Promise<boolean> {\n return this.usersStore.unfollowUser(user_ref, followedUserRef);\n }\n\n async getGlobalStats(): Promise<GlobalStat[]> {\n return this.statsStore.getGlobalStats();\n }\n\n async getUserStats(user_ref: string): Promise<UserStat[]> {\n return this.statsStore.getUserStats(user_ref);\n }\n\n async getTemplates(): Promise<Templates> {\n return this.templatesStore.getTemplates();\n }\n\n async getTemplate(id: number): Promise<Template | null> {\n return this.templatesStore.getTemplate(id);\n }\n\n async createTemplate(options: {\n title: string;\n description: string;\n questionTitle?: string;\n questionContent?: string;\n tags?: string[];\n entities?: string[];\n }): Promise<Template> {\n return this.templatesStore.createTemplate(options);\n }\n\n async deleteTemplate(id: number): Promise<boolean> {\n return this.templatesStore.deleteTemplate(id);\n }\n\n async updateTemplate(options: {\n id: number;\n title: string;\n description: string;\n questionTitle?: string;\n questionContent?: string;\n tags?: string[];\n entities?: string[];\n }): Promise<Template | null> {\n return this.templatesStore.updateTemplate(options);\n }\n\n async getAIAnswer(postId: number): Promise<AIResponse | null> {\n return this.postsStore.getAIAnswer(postId);\n }\n\n async saveAIAnswer(postId: number, response: AIResponse): Promise<void> {\n return this.postsStore.saveAIAnswer(postId, response);\n }\n\n async deleteAIAnswer(postId: number): Promise<boolean> {\n return this.postsStore.deleteAIAnswer(postId);\n }\n\n async postAttachment({\n uuid,\n locationType,\n locationUri,\n extension,\n mimeType,\n binaryImage,\n path,\n creator,\n }: AttachmentParameters): Promise<Attachment> {\n return this.attachmentsStore.postAttachment({\n uuid,\n locationType,\n locationUri,\n extension,\n mimeType,\n binaryImage,\n path,\n creator,\n });\n }\n\n async getAttachment(uuid: string): Promise<Attachment | undefined> {\n return this.attachmentsStore.getAttachment(uuid);\n }\n\n async deleteAttachment(uuid: string): Promise<boolean> {\n return this.attachmentsStore.deleteAttachment(uuid);\n }\n\n async getDeletableAttachments(dayLimit: number): Promise<Attachment[]> {\n return this.attachmentsStore.getDeletableAttachments(dayLimit);\n }\n\n // Stats\n\n async getMostUpvotedPosts({\n author,\n options,\n }: StatisticsRequestParameters): Promise<Statistic[]> {\n return this.statsStore.getMostUpvotedPosts({ author, options });\n }\n\n async getTotalPosts({\n author,\n options,\n }: StatisticsRequestParameters): Promise<Statistic[]> {\n return this.statsStore.getTotalPosts({ author, options });\n }\n\n async getMostUpvotedAnswers({\n author,\n options,\n }: StatisticsRequestParameters): Promise<Statistic[]> {\n return this.statsStore.getMostUpvotedAnswers({ author, options });\n }\n\n async getMostUpvotedCorrectAnswers({\n author,\n options,\n }: StatisticsRequestParameters): Promise<Statistic[]> {\n return this.statsStore.getMostUpvotedCorrectAnswers({ author, options });\n }\n\n async getTotalAnswers({\n author,\n options,\n }: StatisticsRequestParameters): Promise<Statistic[]> {\n return this.statsStore.getTotalAnswers({ author, options });\n }\n\n async getCount(\n table: string,\n filters?: { author?: string; type?: PostType },\n ): Promise<number> {\n return this.statsStore.getCount(table, filters);\n }\n\n async saveGlobalStats(date: Date): Promise<void> {\n return this.statsStore.saveGlobalStats(date);\n }\n\n async saveUserStats(user: UserResponse, date: Date): Promise<void> {\n return this.statsStore.saveUserStats(user, date);\n }\n\n async getTotalViews(\n user_ref: string,\n lastDays?: number,\n excludeUser?: boolean,\n ): Promise<number> {\n return this.statsStore.getTotalViews(user_ref, lastDays, excludeUser);\n }\n\n async cleanStats(days: number, date: Date): Promise<void> {\n return this.statsStore.cleanStats(days, date);\n }\n\n async getUsersCount(): Promise<number> {\n return this.usersStore.getUsersCount();\n }\n\n async getFollowingUsers(user_ref: string): Promise<string[]> {\n return this.usersStore.getFollowingUsers(user_ref);\n }\n\n async getEntityLinks(): Promise<EntityLinks[]> {\n return this.entitiesStore.getEntityLinks();\n }\n\n async getComments(\n options?: { ids?: number[] },\n opts?: CommentOptions,\n ): Promise<QetaComment[]> {\n return this.commentsStore.getComments(options, opts);\n }\n\n async getComment(\n commentId: number,\n opts?: CommentOptions & { postId?: number; answerId?: number },\n ): Promise<QetaComment | null> {\n return this.commentsStore.getComment(commentId, opts);\n }\n}\n"],"names":["resolvePackagePath","CommentsStore","TagsStore","EntitiesStore","UsersStore","TemplatesStore","AttachmentsStore","PostsStore","AnswersStore","CollectionsStore","StatsStore"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DatabaseQetaStore.cjs.js","sources":["../../src/database/DatabaseQetaStore.ts"],"sourcesContent":["import {\n DatabaseService,\n resolvePackagePath,\n} from '@backstage/backend-plugin-api';\n\nimport {\n AnswerOptions,\n Answers,\n AttachmentParameters,\n CollectionOptions,\n CollectionPostRank,\n Collections,\n CommentOptions,\n EntitiesResponse,\n EntityResponse,\n MaybeAnswer,\n MaybeCollection,\n MaybePost,\n PostOptions,\n Posts,\n QetaStore,\n Templates,\n UserResponse,\n UsersResponse,\n} from './QetaStore';\nimport {\n AIResponse,\n AnswersQuery,\n Attachment,\n Collection,\n Comment as QetaComment,\n EntitiesQuery,\n EntityLinks,\n GlobalStat,\n Post,\n PostStatus,\n PostType,\n PostsQuery,\n Statistic,\n StatisticsRequestParameters,\n TagResponse,\n TagsQuery,\n TagsResponse,\n Template,\n UserCollectionsResponse,\n UserEntitiesResponse,\n UsersQuery,\n UserStat,\n UserTagsResponse,\n UserUsersResponse,\n} from '@drodil/backstage-plugin-qeta-common';\nimport { QetaFilters } from '../service/util';\nimport { PermissionCriteria } from '@backstage/plugin-permission-common';\nimport { TagDatabase } from '@drodil/backstage-plugin-qeta-node';\nimport { PostsStore } from './stores/PostsStore';\nimport { AnswersStore } from './stores/AnswersStore';\nimport { CommentsStore } from './stores/CommentsStore';\nimport { CollectionsStore } from './stores/CollectionsStore';\nimport { StatsStore } from './stores/StatsStore';\nimport { TagsStore } from './stores/TagsStore';\nimport { UsersStore } from './stores/UsersStore';\nimport { EntitiesStore } from './stores/EntitiesStore';\nimport { TemplatesStore } from './stores/TemplatesStore';\nimport { AttachmentsStore } from './stores/AttachmentsStore';\n\nconst migrationsDir = resolvePackagePath(\n '@drodil/backstage-plugin-qeta-backend',\n 'migrations',\n);\n\n// Local interfaces removed, imported from stores\n\nexport class DatabaseQetaStore implements QetaStore {\n private constructor(\n private readonly postsStore: PostsStore,\n private readonly answersStore: AnswersStore,\n private readonly commentsStore: CommentsStore,\n private readonly collectionsStore: CollectionsStore,\n private readonly statsStore: StatsStore,\n private readonly tagsStore: TagsStore,\n private readonly usersStore: UsersStore,\n private readonly entitiesStore: EntitiesStore,\n private readonly templatesStore: TemplatesStore,\n private readonly attachmentsStore: AttachmentsStore,\n ) {}\n\n static async create({\n database,\n skipMigrations,\n tagDatabase,\n }: {\n database: DatabaseService;\n skipMigrations?: boolean;\n tagDatabase?: TagDatabase;\n }): Promise<DatabaseQetaStore> {\n const client = await database.getClient();\n\n if (!database.migrations?.skip && !skipMigrations) {\n await client.migrate.latest({\n directory: migrationsDir,\n });\n }\n\n const commentsStore = new CommentsStore(client);\n const tagsStore = new TagsStore(client, tagDatabase);\n const entitiesStore = new EntitiesStore(client);\n const usersStore = new UsersStore(client);\n const templatesStore = new TemplatesStore(client, tagsStore, entitiesStore);\n const attachmentsStore = new AttachmentsStore(client);\n const postsStore = new PostsStore(\n client,\n commentsStore,\n tagsStore,\n entitiesStore,\n attachmentsStore,\n tagDatabase,\n );\n const answersStore = new AnswersStore(\n client,\n commentsStore,\n postsStore,\n attachmentsStore,\n );\n const collectionsStore = new CollectionsStore(\n client,\n postsStore,\n attachmentsStore,\n );\n const statsStore = new StatsStore(client);\n\n postsStore.setAnswersStore(answersStore);\n\n return new DatabaseQetaStore(\n postsStore,\n answersStore,\n commentsStore,\n collectionsStore,\n statsStore,\n tagsStore,\n usersStore,\n entitiesStore,\n templatesStore,\n attachmentsStore,\n );\n }\n\n async getPosts(\n user_ref: string,\n options: PostsQuery,\n filters?: PermissionCriteria<QetaFilters>,\n opts?: PostOptions,\n ): Promise<Posts> {\n return this.postsStore.getPosts(user_ref, options, filters, opts);\n }\n\n async getPost(\n user_ref: string,\n id: number,\n recordView?: boolean,\n options?: PostOptions,\n ): Promise<MaybePost> {\n return this.postsStore.getPost(user_ref, id, recordView, options);\n }\n\n async getPostByAnswerId(\n user_ref: string,\n answerId: number,\n recordView?: boolean,\n options?: PostOptions,\n ): Promise<MaybePost> {\n return this.postsStore.getPostByAnswerId(\n user_ref,\n answerId,\n recordView,\n options,\n );\n }\n\n async createPost(options: {\n user_ref: string;\n title: string;\n content: string;\n created: Date;\n author?: string;\n tags?: string[];\n entities?: string[];\n images?: number[];\n anonymous?: boolean;\n type?: PostType;\n headerImage?: string;\n url?: string;\n status?: PostStatus;\n opts?: PostOptions;\n }): Promise<Post> {\n return this.postsStore.createPost(options);\n }\n\n async updatePost(options: {\n user_ref: string;\n id: number;\n title?: string;\n content?: string;\n author?: string;\n tags?: string[];\n entities?: string[];\n images?: number[];\n headerImage?: string;\n url?: string;\n status?: PostStatus;\n opts?: PostOptions;\n }): Promise<MaybePost> {\n return this.postsStore.updatePost(options);\n }\n\n async deletePost(id: number, permanently?: boolean): Promise<boolean> {\n return this.postsStore.deletePost(id, permanently);\n }\n\n async votePost(\n user_ref: string,\n postId: number,\n score: number,\n ): Promise<boolean> {\n return this.postsStore.votePost(user_ref, postId, score);\n }\n\n async deletePostVote(user_ref: string, postId: number): Promise<boolean> {\n return this.postsStore.deletePostVote(user_ref, postId);\n }\n\n async favoritePost(user_ref: string, postId: number): Promise<boolean> {\n return this.postsStore.favoritePost(user_ref, postId);\n }\n\n async unfavoritePost(user_ref: string, postId: number): Promise<boolean> {\n return this.postsStore.unfavoritePost(user_ref, postId);\n }\n\n async getUsersWhoFavoritedPost(postId: number): Promise<string[]> {\n return this.postsStore.getUsersWhoFavoritedPost(postId);\n }\n\n async getAnswers(\n user_ref: string,\n options: AnswersQuery,\n filters?: PermissionCriteria<QetaFilters>,\n opts?: AnswerOptions,\n ): Promise<Answers> {\n return this.answersStore.getAnswers(user_ref, options, filters, opts);\n }\n\n async getAnswer(\n answerId: number,\n user_ref: string,\n options?: AnswerOptions,\n ): Promise<MaybeAnswer> {\n return this.answersStore.getAnswer(answerId, user_ref, options);\n }\n\n async answerPost(\n user_ref: string,\n questionId: number,\n answer: string,\n created: Date,\n images?: number[],\n anonymous?: boolean,\n options?: AnswerOptions,\n ): Promise<MaybeAnswer> {\n return this.answersStore.answerPost(\n user_ref,\n questionId,\n answer,\n created,\n images,\n anonymous,\n options,\n );\n }\n\n async updateAnswer(\n user_ref: string,\n questionId: number,\n answerId: number,\n answer: string,\n author?: string,\n images?: number[],\n options?: AnswerOptions,\n ): Promise<MaybeAnswer> {\n return this.answersStore.updateAnswer(\n user_ref,\n questionId,\n answerId,\n answer,\n author,\n images,\n options,\n );\n }\n\n async deleteAnswer(id: number): Promise<boolean> {\n return this.answersStore.deleteAnswer(id);\n }\n\n async voteAnswer(\n user_ref: string,\n answerId: number,\n score: number,\n ): Promise<boolean> {\n return this.answersStore.voteAnswer(user_ref, answerId, score);\n }\n\n async deleteAnswerVote(user_ref: string, answerId: number): Promise<boolean> {\n return this.answersStore.deleteAnswerVote(user_ref, answerId);\n }\n\n async markAnswerCorrect(postId: number, answerId: number): Promise<boolean> {\n return this.answersStore.markAnswerCorrect(postId, answerId);\n }\n\n async markAnswerIncorrect(\n postId: number,\n answerId: number,\n ): Promise<boolean> {\n return this.answersStore.markAnswerIncorrect(postId, answerId);\n }\n\n async clickPost(user_ref: string, postId: number): Promise<void> {\n const vote = await this.postsStore.getPostVote(user_ref, postId);\n const score = (vote?.score || 0) + 1;\n await this.postsStore.votePost(user_ref, postId, score);\n }\n\n async commentPost(\n post_id: number,\n user_ref: string,\n content: string,\n created: Date,\n ): Promise<MaybePost> {\n await this.commentsStore.commentPost(post_id, user_ref, content, created);\n return this.getPost(user_ref, post_id);\n }\n\n async commentAnswer(\n answer_id: number,\n user_ref: string,\n content: string,\n created: Date,\n ): Promise<MaybeAnswer> {\n await this.commentsStore.commentAnswer(\n answer_id,\n user_ref,\n content,\n created,\n );\n return this.getAnswer(answer_id, user_ref);\n }\n\n async updatePostComment(\n post_id: number,\n id: number,\n user_ref: string,\n content: string,\n ): Promise<MaybePost> {\n await this.commentsStore.updatePostComment(post_id, id, user_ref, content);\n return this.getPost(user_ref, post_id);\n }\n\n async updateAnswerComment(\n answer_id: number,\n id: number,\n user_ref: string,\n content: string,\n ): Promise<MaybeAnswer> {\n await this.commentsStore.updateAnswerComment(\n answer_id,\n id,\n user_ref,\n content,\n );\n return this.getAnswer(answer_id, user_ref);\n }\n\n async deletePostComment(\n post_id: number,\n id: number,\n user_ref: string,\n ): Promise<MaybePost> {\n await this.commentsStore.deletePostComment(post_id, id);\n return this.getPost(user_ref, post_id);\n }\n\n async deleteAnswerComment(\n answer_id: number,\n id: number,\n user_ref: string,\n ): Promise<MaybeAnswer> {\n await this.commentsStore.deleteAnswerComment(answer_id, id);\n return this.getAnswer(answer_id, user_ref);\n }\n\n async getCollections(\n user_ref: string,\n options: PostsQuery,\n opts?: CollectionOptions,\n ): Promise<Collections> {\n return this.collectionsStore.getCollections(user_ref, options, opts);\n }\n\n async getCollection(\n user_ref: string,\n id: number,\n options?: CollectionOptions,\n ): Promise<MaybeCollection> {\n return this.collectionsStore.getCollection(user_ref, id, options);\n }\n\n async createCollection(options: {\n user_ref: string;\n title: string;\n description?: string;\n created: Date;\n images?: number[];\n headerImage?: string;\n opts?: CollectionOptions;\n }): Promise<Collection> {\n return this.collectionsStore.createCollection(\n options,\n ) as Promise<Collection>;\n }\n\n async updateCollection(options: {\n id: number;\n user_ref: string;\n title: string;\n description?: string;\n images?: number[];\n headerImage?: string;\n opts?: CollectionOptions;\n }): Promise<MaybeCollection> {\n return this.collectionsStore.updateCollection(options);\n }\n\n async deleteCollection(id: number): Promise<boolean> {\n return this.collectionsStore.deleteCollection(id);\n }\n\n async addPostToCollection(\n user_ref: string,\n id: number,\n postId: number,\n options?: CollectionOptions,\n ): Promise<MaybeCollection> {\n return this.collectionsStore.addPostToCollection(\n user_ref,\n id,\n postId,\n options,\n );\n }\n\n async removePostFromCollection(\n user_ref: string,\n id: number,\n postId: number,\n options?: CollectionOptions,\n ): Promise<MaybeCollection> {\n return this.collectionsStore.removePostFromCollection(\n user_ref,\n id,\n postId,\n options,\n );\n }\n\n async getUsersForCollection(collectionId: number): Promise<string[]> {\n return this.collectionsStore.getUsersForCollection(collectionId);\n }\n\n async followCollection(\n user_ref: string,\n collectionId: number,\n ): Promise<boolean> {\n return this.collectionsStore.followCollection(user_ref, collectionId);\n }\n\n async unfollowCollection(\n user_ref: string,\n collectionId: number,\n ): Promise<boolean> {\n return this.collectionsStore.unfollowCollection(user_ref, collectionId);\n }\n\n async getUserCollections(\n user_ref: string,\n options?: CollectionOptions,\n ): Promise<UserCollectionsResponse> {\n return this.collectionsStore.getUserCollections(user_ref, options);\n }\n\n async getPostRank(\n collectionId: number,\n postId: number,\n ): Promise<number | null> {\n return this.collectionsStore.getPostRank(collectionId, postId);\n }\n\n async getTopRankedPostId(\n collectionId: number,\n ): Promise<CollectionPostRank | null> {\n return this.collectionsStore.getTopRankedPostId(collectionId);\n }\n\n async getBottomRankedPostId(\n collectionId: number,\n ): Promise<CollectionPostRank | null> {\n return this.collectionsStore.getBottomRankedPostId(collectionId);\n }\n\n async getNextRankedPostId(\n collectionId: number,\n postId: number,\n ): Promise<CollectionPostRank | null> {\n return this.collectionsStore.getNextRankedPostId(collectionId, postId);\n }\n\n async getPreviousRankedPostId(\n collectionId: number,\n postId: number,\n ): Promise<CollectionPostRank | null> {\n return this.collectionsStore.getPreviousRankedPostId(collectionId, postId);\n }\n\n async updatePostRank(\n collectionId: number,\n postId: number,\n rank: number,\n ): Promise<void> {\n return this.collectionsStore.updatePostRank(collectionId, postId, rank);\n }\n\n async getTags(\n options?: { noDescription?: boolean; ids?: number[] } & TagsQuery,\n filters?: PermissionCriteria<QetaFilters>,\n ): Promise<TagsResponse> {\n return this.tagsStore.getTags(options, filters);\n }\n\n async getTagExperts(tags: string[]): Promise<string[]> {\n return this.tagsStore.getTagExperts(tags);\n }\n\n async getTag(tag: string): Promise<TagResponse | null> {\n return this.tagsStore.getTag(tag);\n }\n\n async getTagById(id: number): Promise<TagResponse | null> {\n return this.tagsStore.getTagById(id);\n }\n\n async createTag(\n tag: string,\n description?: string,\n experts?: string[],\n ): Promise<TagResponse | null> {\n return this.tagsStore.createTag(tag, description, experts);\n }\n\n async updateTag(\n id: number,\n description?: string,\n experts?: string[],\n ): Promise<TagResponse | null> {\n return this.tagsStore.updateTag(id, description, experts);\n }\n\n async deleteTag(id: number): Promise<boolean> {\n return this.tagsStore.deleteTag(id);\n }\n\n async getEntities(\n options?: { entityRefs?: string[] } & EntitiesQuery,\n ): Promise<EntitiesResponse> {\n return this.entitiesStore.getEntities(options);\n }\n\n async getEntity(entity_ref: string): Promise<EntityResponse | null> {\n return this.entitiesStore.getEntity(entity_ref);\n }\n\n async getUsers(\n options?: { entityRefs?: string[] } & UsersQuery,\n ): Promise<UsersResponse> {\n return this.usersStore.getUsers(options);\n }\n\n async getUser(user_ref: string): Promise<UserResponse | null> {\n return this.usersStore.getUser(user_ref);\n }\n\n async getUserTags(\n user_ref: string,\n filters?: PermissionCriteria<QetaFilters>,\n ): Promise<UserTagsResponse> {\n return this.tagsStore.getUserTags(user_ref, filters);\n }\n\n async followTag(user_ref: string, tag: string): Promise<boolean> {\n return this.tagsStore.followTag(user_ref, tag);\n }\n\n async unfollowTag(user_ref: string, tag: string): Promise<boolean> {\n return this.tagsStore.unfollowTag(user_ref, tag);\n }\n\n async getUserEntities(user_ref: string): Promise<UserEntitiesResponse> {\n return this.entitiesStore.getUserEntities(user_ref);\n }\n\n async followEntity(user_ref: string, entityRef: string): Promise<boolean> {\n return this.entitiesStore.followEntity(user_ref, entityRef);\n }\n\n async unfollowEntity(user_ref: string, entityRef: string): Promise<boolean> {\n return this.entitiesStore.unfollowEntity(user_ref, entityRef);\n }\n\n async getUsersForTags(tags: string[]): Promise<string[]> {\n return this.tagsStore.getUsersForTags(tags);\n }\n\n async getUsersForEntities(entityRefs: string[]): Promise<string[]> {\n return this.entitiesStore.getUsersForEntities(entityRefs);\n }\n\n async getFollowedUsers(user_ref: string): Promise<UserUsersResponse> {\n return this.usersStore.getFollowedUsers(user_ref);\n }\n\n async followUser(\n user_ref: string,\n followedUserRef: string,\n ): Promise<boolean> {\n return this.usersStore.followUser(user_ref, followedUserRef);\n }\n\n async unfollowUser(\n user_ref: string,\n followedUserRef: string,\n ): Promise<boolean> {\n return this.usersStore.unfollowUser(user_ref, followedUserRef);\n }\n\n async getGlobalStats(): Promise<GlobalStat[]> {\n return this.statsStore.getGlobalStats();\n }\n\n async getUserStats(user_ref: string): Promise<UserStat[]> {\n return this.statsStore.getUserStats(user_ref);\n }\n\n async getTemplates(): Promise<Templates> {\n return this.templatesStore.getTemplates();\n }\n\n async getTemplate(id: number): Promise<Template | null> {\n return this.templatesStore.getTemplate(id);\n }\n\n async createTemplate(options: {\n title: string;\n description: string;\n questionTitle?: string;\n questionContent?: string;\n tags?: string[];\n entities?: string[];\n }): Promise<Template> {\n return this.templatesStore.createTemplate(options);\n }\n\n async deleteTemplate(id: number): Promise<boolean> {\n return this.templatesStore.deleteTemplate(id);\n }\n\n async updateTemplate(options: {\n id: number;\n title: string;\n description: string;\n questionTitle?: string;\n questionContent?: string;\n tags?: string[];\n entities?: string[];\n }): Promise<Template | null> {\n return this.templatesStore.updateTemplate(options);\n }\n\n async getAIAnswer(postId: number): Promise<AIResponse | null> {\n return this.postsStore.getAIAnswer(postId);\n }\n\n async saveAIAnswer(postId: number, response: AIResponse): Promise<void> {\n return this.postsStore.saveAIAnswer(postId, response);\n }\n\n async deleteAIAnswer(postId: number): Promise<boolean> {\n return this.postsStore.deleteAIAnswer(postId);\n }\n\n async postAttachment({\n uuid,\n locationType,\n locationUri,\n extension,\n mimeType,\n binaryImage,\n path,\n creator,\n }: AttachmentParameters): Promise<Attachment> {\n return this.attachmentsStore.postAttachment({\n uuid,\n locationType,\n locationUri,\n extension,\n mimeType,\n binaryImage,\n path,\n creator,\n });\n }\n\n async getAttachment(uuid: string): Promise<Attachment | undefined> {\n return this.attachmentsStore.getAttachment(uuid);\n }\n\n async deleteAttachment(uuid: string): Promise<boolean> {\n return this.attachmentsStore.deleteAttachment(uuid);\n }\n\n async getDeletableAttachments(dayLimit: number): Promise<Attachment[]> {\n return this.attachmentsStore.getDeletableAttachments(dayLimit);\n }\n\n // Stats\n\n async getMostUpvotedPosts({\n author,\n options,\n }: StatisticsRequestParameters): Promise<Statistic[]> {\n return this.statsStore.getMostUpvotedPosts({ author, options });\n }\n\n async getTotalPosts({\n author,\n options,\n }: StatisticsRequestParameters): Promise<Statistic[]> {\n return this.statsStore.getTotalPosts({ author, options });\n }\n\n async getMostUpvotedAnswers({\n author,\n options,\n }: StatisticsRequestParameters): Promise<Statistic[]> {\n return this.statsStore.getMostUpvotedAnswers({ author, options });\n }\n\n async getMostUpvotedCorrectAnswers({\n author,\n options,\n }: StatisticsRequestParameters): Promise<Statistic[]> {\n return this.statsStore.getMostUpvotedCorrectAnswers({ author, options });\n }\n\n async getTotalAnswers({\n author,\n options,\n }: StatisticsRequestParameters): Promise<Statistic[]> {\n return this.statsStore.getTotalAnswers({ author, options });\n }\n\n async getCount(\n table: string,\n filters?: { author?: string; type?: PostType },\n ): Promise<number> {\n return this.statsStore.getCount(table, filters);\n }\n\n async saveGlobalStats(date: Date): Promise<void> {\n return this.statsStore.saveGlobalStats(date);\n }\n\n async saveUserStats(user: UserResponse, date: Date): Promise<void> {\n return this.statsStore.saveUserStats(user, date);\n }\n\n async getTotalViews(\n user_ref: string,\n lastDays?: number,\n excludeUser?: boolean,\n ): Promise<number> {\n return this.statsStore.getTotalViews(user_ref, lastDays, excludeUser);\n }\n\n async suggestPosts(\n user_ref: string,\n title: string,\n content: string,\n tags?: string[],\n entities?: string[],\n filters?: PermissionCriteria<QetaFilters>,\n opts?: PostOptions,\n ): Promise<Posts> {\n return this.postsStore.suggestPosts(\n user_ref,\n title,\n content,\n tags,\n entities,\n filters,\n opts,\n );\n }\n\n async cleanStats(days: number, date: Date): Promise<void> {\n return this.statsStore.cleanStats(days, date);\n }\n\n async getUsersCount(): Promise<number> {\n return this.usersStore.getUsersCount();\n }\n\n async getFollowingUsers(user_ref: string): Promise<string[]> {\n return this.usersStore.getFollowingUsers(user_ref);\n }\n\n async getEntityLinks(): Promise<EntityLinks[]> {\n return this.entitiesStore.getEntityLinks();\n }\n\n async getComments(\n options?: { ids?: number[] },\n opts?: CommentOptions,\n ): Promise<QetaComment[]> {\n return this.commentsStore.getComments(options, opts);\n }\n\n async getComment(\n commentId: number,\n opts?: CommentOptions & { postId?: number; answerId?: number },\n ): Promise<QetaComment | null> {\n return this.commentsStore.getComment(commentId, opts);\n }\n}\n"],"names":["resolvePackagePath","CommentsStore","TagsStore","EntitiesStore","UsersStore","TemplatesStore","AttachmentsStore","PostsStore","AnswersStore","CollectionsStore","StatsStore"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QetaStore.cjs.js","sources":["../../src/database/QetaStore.ts"],"sourcesContent":["import {\n AIResponse,\n Answer,\n AnswersQuery,\n Attachment,\n Collection,\n CollectionsQuery,\n Comment as QetaComment,\n EntitiesQuery,\n EntityLinks,\n GlobalStat,\n Post,\n PostsQuery,\n PostStatus,\n PostType,\n QetaIdEntity,\n Statistic,\n StatisticsRequestParameters,\n TagResponse,\n TagsQuery,\n TagsResponse,\n Template,\n UserCollectionsResponse,\n UserEntitiesResponse,\n UsersQuery,\n UserStat,\n UserTagsResponse,\n UserUsersResponse,\n} from '@drodil/backstage-plugin-qeta-common';\nimport { QetaFilters } from '../service/util';\nimport { PermissionCriteria } from '@backstage/plugin-permission-common';\n\nexport function isPost(entity: QetaIdEntity): entity is Post {\n return 'title' in entity && !('followers' in entity);\n}\n\nexport function isAnswer(entity: QetaIdEntity): entity is Answer {\n return 'postId' in entity && 'correct' in entity;\n}\n\nexport function isComment(entity: QetaIdEntity): entity is QetaComment {\n return !('title' in entity) && !('correct' in entity);\n}\n\nexport function isTag(entity: QetaIdEntity): entity is TagResponse {\n return 'tag' in entity;\n}\n\nexport function isCollection(entity: QetaIdEntity): entity is Collection {\n return 'followers' in entity;\n}\n\nexport type MaybeAnswer = Answer | null;\nexport type MaybePost = Post | null;\nexport type MaybeComment = QetaComment | null;\nexport type MaybeTag = TagResponse | null;\nexport type MaybeCollection = Collection | null;\nexport type MaybeTemplate = Template | null;\n\nexport interface Posts {\n posts: Post[];\n total: number;\n}\n\nexport interface Answers {\n answers: Answer[];\n total: number;\n}\n\nexport interface Collections {\n collections: Collection[];\n total: number;\n}\n\nexport interface Templates {\n templates: Template[];\n total: number;\n}\n\nexport interface EntityResponse {\n id: number;\n entityRef: string;\n postsCount: number;\n followerCount: number;\n}\n\nexport interface EntitiesResponse {\n entities: EntityResponse[];\n total: number;\n}\n\nexport interface UserResponse {\n userRef: string;\n totalViews: number;\n totalQuestions: number;\n totalAnswers: number;\n totalComments: number;\n totalVotes: number;\n totalArticles: number;\n totalFollowers: number;\n totalLinks: number;\n}\n\nexport interface UsersResponse {\n users: UserResponse[];\n total: number;\n}\n\nexport interface AttachmentParameters {\n uuid: string;\n locationType: string;\n locationUri: string;\n extension: string;\n mimeType: string;\n path?: string;\n binaryImage?: Buffer;\n creator?: string;\n postId?: number;\n answerId?: number;\n collectionId?: number;\n}\n\nexport interface CollectionPostRank {\n postId: number;\n rank: number;\n}\n\nexport type PostOptions = {\n tagsFilter?: PermissionCriteria<QetaFilters>;\n commentsFilter?: PermissionCriteria<QetaFilters>;\n answersFilter?: PermissionCriteria<QetaFilters>;\n includeDraftFilter?: boolean;\n includeTags?: boolean;\n includeAnswers?: boolean;\n includeVotes?: boolean;\n includeEntities?: boolean;\n includeComments?: boolean;\n includeAttachments?: boolean;\n includeTotal?: boolean;\n includeExperts?: boolean;\n includeCollections?: boolean;\n collectionIds?: number[];\n};\n\nexport type CollectionOptions = {\n filters?: PermissionCriteria<QetaFilters>;\n postFilters?: PermissionCriteria<QetaFilters>;\n tagFilters?: PermissionCriteria<QetaFilters>;\n includePosts?: boolean;\n includeExperts?: boolean;\n};\n\nexport type AnswerOptions = {\n filter?: PermissionCriteria<QetaFilters>;\n includeStatusFilter?: boolean;\n includeVotes?: boolean;\n includeComments?: boolean;\n includePost?: boolean;\n includeExperts?: boolean;\n commentsFilter?: PermissionCriteria<QetaFilters>;\n};\n\nexport type CommentOptions = {\n includeStatusFilter?: boolean;\n};\n\n/**\n * Interface for fetching and modifying Q&A data\n */\nexport interface QetaStore {\n /**\n * Fetch all stored posts with options\n */\n getPosts(\n user_ref: string,\n options: PostsQuery,\n filters?: PermissionCriteria<QetaFilters>,\n opts?: PostOptions,\n ): Promise<Posts>;\n\n /**\n * Fetch single question by id\n * Question views count is increased after fetching the question\n */\n getPost(\n user_ref: string,\n id: number,\n recordView?: boolean,\n options?: PostOptions,\n ): Promise<MaybePost>;\n\n /**\n * Fetch single question by answer id\n * Question views count is increased after fetching the question\n */\n getPostByAnswerId(\n user_ref: string,\n answerId: number,\n recordView?: boolean,\n options?: PostOptions,\n ): Promise<MaybePost>;\n\n /**\n * Post new post\n */\n createPost(options: {\n user_ref: string;\n title: string;\n content: string;\n created: Date;\n author?: string;\n tags?: string[];\n entities?: string[];\n images?: number[];\n anonymous?: boolean;\n type?: PostType;\n headerImage?: string;\n url?: string;\n status?: PostStatus;\n opts?: PostOptions;\n }): Promise<Post>;\n\n /**\n * Comment question\n */\n commentPost(\n question_id: number,\n user_ref: string,\n content: string,\n created: Date,\n options?: PostOptions,\n ): Promise<MaybePost>;\n\n updatePostComment(\n post_id: number,\n id: number,\n user_ref: string,\n content: string,\n options?: PostOptions,\n ): Promise<MaybePost>;\n\n /**\n * Delete question comment\n */\n deletePostComment(\n question_id: number,\n id: number,\n user_ref: string,\n permanently?: boolean,\n options?: PostOptions,\n ): Promise<MaybePost>;\n\n /**\n * Update question\n */\n updatePost(options: {\n id: number;\n user_ref: string;\n title?: string;\n content?: string;\n author?: string;\n tags?: string[];\n entities?: string[];\n images?: number[];\n headerImage?: string;\n url?: string;\n setUpdatedBy?: boolean;\n status?: PostStatus;\n opts?: PostOptions;\n }): Promise<MaybePost>;\n\n /**\n * Delete question. Only the user who created the question can delete it.\n * @param id question id\n */\n deletePost(id: number, permanently?: boolean): Promise<boolean>;\n\n /**\n * Answer question\n */\n answerPost(\n user_ref: string,\n questionId: number,\n answer: string,\n created: Date,\n images?: number[],\n anonymous?: boolean,\n options?: AnswerOptions,\n ): Promise<MaybeAnswer>;\n\n /**\n * Comment answer\n */\n commentAnswer(\n answer_id: number,\n user_ref: string,\n content: string,\n created: Date,\n options?: AnswerOptions,\n ): Promise<MaybeAnswer>;\n\n updateAnswerComment(\n answer_id: number,\n id: number,\n user_ref: string,\n content: string,\n options?: AnswerOptions,\n ): Promise<MaybeAnswer>;\n\n /**\n * Delete answer comment\n */\n deleteAnswerComment(\n answer_id: number,\n id: number,\n user_ref: string,\n permanently?: boolean,\n options?: AnswerOptions,\n ): Promise<MaybeAnswer>;\n\n /**\n * Update answer to a question\n */\n updateAnswer(\n user_ref: string,\n questionId: number,\n answerId: number,\n answer: string,\n author?: string,\n images?: number[],\n options?: AnswerOptions,\n ): Promise<MaybeAnswer>;\n\n /**\n * Fetch all stored answers with options\n */\n getAnswers(\n user_ref: string,\n options: AnswersQuery,\n filters?: PermissionCriteria<QetaFilters>,\n opts?: AnswerOptions,\n ): Promise<Answers>;\n\n /** Get answer by id\n */\n getAnswer(\n answerId: number,\n user_ref: string,\n options?: AnswerOptions,\n ): Promise<MaybeAnswer>;\n\n getComments(\n options?: { ids?: number[] },\n opts?: CommentOptions,\n ): Promise<QetaComment[]>;\n getComment(\n commentId: number,\n opts?: CommentOptions & { postId?: number; answerId?: number },\n ): Promise<MaybeComment>;\n\n /**\n * Delete answer. Only the user who created the answer can delete it.\n * @param id answer id\n */\n deleteAnswer(id: number, permanently?: boolean): Promise<boolean>;\n\n /**\n * Record a click of a link\n * @param postId link id\n * @param author author of the link\n */\n clickPost(author: string, postId: number): Promise<void>;\n\n /**\n * Vote question with given score\n * @param user_ref user name of the user voting question\n * @param postId question id\n * @param score score to vote with\n */\n votePost(user_ref: string, postId: number, score: number): Promise<boolean>;\n\n deletePostVote(user_ref: string, postId: number): Promise<boolean>;\n\n /**\n * Vote answer with given score\n * @param user_ref user name of the user voting answer\n * @param answerId answwer id\n * @param score score to vote with\n */\n voteAnswer(\n user_ref: string,\n answerId: number,\n score: number,\n ): Promise<boolean>;\n\n deleteAnswerVote(user_ref: string, answerId: number): Promise<boolean>;\n\n /**\n * Mark answer correct for question. Only user who created the question can mark answer correct\n * @param questionId question id\n * @param answerId answer id\n */\n markAnswerCorrect(questionId: number, answerId: number): Promise<boolean>;\n\n /**\n * Mark answer incorrect for question. Only user who created the question can mark answer incorrect\n * @param questionId question id\n * @param answerId answer id\n */\n markAnswerIncorrect(questionId: number, answerId: number): Promise<boolean>;\n\n /**\n * Mark question favorite for user\n * @param user_ref user name of the user voting question\n * @param postId post id\n */\n favoritePost(user_ref: string, postId: number): Promise<boolean>;\n\n /**\n * Mark question unfavorite for user\n * @param user_ref user name of the user voting question\n * @param postId post id\n */\n unfavoritePost(user_ref: string, postId: number): Promise<boolean>;\n\n getUsersWhoFavoritedPost(postId: number): Promise<string[]>;\n\n /**\n * Returns all used tags for posts\n */\n getTags(\n options?: { noDescription?: boolean; ids?: number[] } & TagsQuery,\n filters?: PermissionCriteria<QetaFilters>,\n ): Promise<TagsResponse>;\n getTagById(id: number): Promise<TagResponse | null>;\n getTag(tag: string): Promise<TagResponse | null>;\n createTag(\n tag: string,\n description?: string,\n experts?: string[],\n ): Promise<TagResponse | null>;\n updateTag(\n id: number,\n description?: string,\n experts?: string[],\n ): Promise<TagResponse | null>;\n deleteTag(id: number): Promise<boolean>;\n getTagExperts(tags: string[]): Promise<string[]>;\n\n getUsers(\n options?: { entityRefs?: string[] } & UsersQuery,\n ): Promise<UsersResponse>;\n getUsersCount(): Promise<number>;\n getUser(user_ref: string): Promise<UserResponse | null>;\n getUserTags(\n user_ref: string,\n filters?: PermissionCriteria<QetaFilters>,\n ): Promise<UserTagsResponse>;\n getUsersForTags(tags?: string[]): Promise<string[]>;\n\n followTag(user_ref: string, tag: string): Promise<boolean>;\n unfollowTag(user_ref: string, tag: string): Promise<boolean>;\n\n getUserEntities(user_ref: string): Promise<UserEntitiesResponse>;\n getUsersForEntities(entityRefs?: string[]): Promise<string[]>;\n\n followEntity(user_ref: string, entityRef: string): Promise<boolean>;\n unfollowEntity(user_ref: string, entityRef: string): Promise<boolean>;\n\n getFollowedUsers(user_ref: string): Promise<UserUsersResponse>;\n getFollowingUsers(user_ref: string): Promise<string[]>;\n\n followUser(user_ref: string, followedUserRef: string): Promise<boolean>;\n unfollowUser(user_ref: string, followedUserRef: string): Promise<boolean>;\n\n getEntities(\n options?: { entityRefs?: string[] } & EntitiesQuery,\n ): Promise<EntitiesResponse>;\n getEntity(entity_ref: string): Promise<EntityResponse | null>;\n\n getUserCollections(\n user_ref: string,\n options?: CollectionOptions,\n ): Promise<UserCollectionsResponse>;\n getUsersForCollection(collectionId: number): Promise<string[]>;\n\n followCollection(user_ref: string, collectionId: number): Promise<boolean>;\n unfollowCollection(user_ref: string, collectionId: number): Promise<boolean>;\n\n postAttachment({\n uuid,\n locationType,\n locationUri,\n extension,\n mimeType,\n binaryImage,\n path,\n creator,\n }: AttachmentParameters): Promise<Attachment>;\n\n getAttachment(uuid: string): Promise<Attachment | undefined>;\n deleteAttachment(uuid: string): Promise<boolean>;\n getDeletableAttachments(dayLimit: number): Promise<Attachment[]>;\n\n getMostUpvotedPosts({\n author,\n options,\n }: StatisticsRequestParameters): Promise<Statistic[]>;\n getTotalPosts({\n author,\n options,\n }: StatisticsRequestParameters): Promise<Statistic[]>;\n getMostUpvotedAnswers({\n author,\n options,\n }: StatisticsRequestParameters): Promise<Statistic[]>;\n getMostUpvotedCorrectAnswers({\n author,\n options,\n }: StatisticsRequestParameters): Promise<Statistic[]>;\n getTotalAnswers({\n author,\n options,\n }: StatisticsRequestParameters): Promise<Statistic[]>;\n getCount(\n table: string,\n filters?: { author?: string; type?: PostType },\n ): Promise<number>;\n saveGlobalStats(date: Date): Promise<void>;\n saveUserStats(user: UserResponse, date: Date): Promise<void>;\n getTotalViews(\n user_ref: string,\n lastDays?: number,\n excludeUser?: boolean,\n ): Promise<number>;\n cleanStats(days: number, date: Date): Promise<void>;\n getGlobalStats(): Promise<GlobalStat[]>;\n getUserStats(user_ref: string): Promise<UserStat[]>;\n\n getCollections(\n user_ref: string,\n options: CollectionsQuery,\n opts?: CollectionOptions,\n ): Promise<Collections>;\n\n getCollection(\n user_ref: string,\n id: number,\n options?: CollectionOptions,\n ): Promise<MaybeCollection>;\n\n createCollection(options: {\n user_ref: string;\n title: string;\n description?: string;\n created: Date;\n images?: number[];\n headerImage?: string;\n opts?: CollectionOptions;\n }): Promise<Collection>;\n\n updateCollection(options: {\n id: number;\n user_ref: string;\n title: string;\n description?: string;\n images?: number[];\n headerImage?: string;\n opts?: CollectionOptions;\n }): Promise<MaybeCollection>;\n\n deleteCollection(id: number): Promise<boolean>;\n\n addPostToCollection(\n user_ref: string,\n id: number,\n postId: number,\n options?: CollectionOptions,\n ): Promise<MaybeCollection>;\n removePostFromCollection(\n user_ref: string,\n id: number,\n postId: number,\n options?: CollectionOptions,\n ): Promise<MaybeCollection>;\n\n getTemplates(): Promise<Templates>;\n getTemplate(id: number): Promise<MaybeTemplate>;\n createTemplate(options: {\n title: string;\n description: string;\n questionTitle?: string;\n questionContent?: string;\n tags?: string[];\n entities?: string[];\n }): Promise<Template>;\n deleteTemplate(id: number): Promise<boolean>;\n updateTemplate(options: {\n id: number;\n title: string;\n description: string;\n questionTitle?: string;\n questionContent?: string;\n tags?: string[];\n entities?: string[];\n }): Promise<MaybeTemplate>;\n\n getAIAnswer(postId: number): Promise<AIResponse | null>;\n saveAIAnswer(postId: number, response: AIResponse): Promise<void>;\n deleteAIAnswer(postId: number): Promise<boolean>;\n\n getPostRank(collectionId: number, postId: number): Promise<number | null>;\n getTopRankedPostId(collectionId: number): Promise<CollectionPostRank | null>;\n getBottomRankedPostId(\n collectionId: number,\n ): Promise<CollectionPostRank | null>;\n getNextRankedPostId(\n collectionId: number,\n postId: number,\n ): Promise<CollectionPostRank | null>;\n getPreviousRankedPostId(\n collectionId: number,\n postId: number,\n ): Promise<CollectionPostRank | null>;\n updatePostRank(\n collectionId: number,\n postId: number,\n rank: number,\n ): Promise<void>;\n getEntityLinks(): Promise<EntityLinks[]>;\n}\n"],"names":[],"mappings":";;AAgCO,SAAS,OAAO,MAAsC,EAAA;AAC3D,EAAO,OAAA,OAAA,IAAW,MAAU,IAAA,EAAE,WAAe,IAAA,MAAA,CAAA;AAC/C;AAEO,SAAS,SAAS,MAAwC,EAAA;AAC/D,EAAO,OAAA,QAAA,IAAY,UAAU,SAAa,IAAA,MAAA;AAC5C;AAEO,SAAS,UAAU,MAA6C,EAAA;AACrE,EAAA,OAAO,EAAE,OAAA,IAAW,MAAW,CAAA,IAAA,EAAE,SAAa,IAAA,MAAA,CAAA;AAChD;AAEO,SAAS,MAAM,MAA6C,EAAA;AACjE,EAAA,OAAO,KAAS,IAAA,MAAA;AAClB;AAEO,SAAS,aAAa,MAA4C,EAAA;AACvE,EAAA,OAAO,WAAe,IAAA,MAAA;AACxB;;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"QetaStore.cjs.js","sources":["../../src/database/QetaStore.ts"],"sourcesContent":["import {\n AIResponse,\n Answer,\n AnswersQuery,\n Attachment,\n Collection,\n CollectionsQuery,\n Comment as QetaComment,\n EntitiesQuery,\n EntityLinks,\n GlobalStat,\n Post,\n PostsQuery,\n PostStatus,\n PostType,\n QetaIdEntity,\n Statistic,\n StatisticsRequestParameters,\n TagResponse,\n TagsQuery,\n TagsResponse,\n Template,\n UserCollectionsResponse,\n UserEntitiesResponse,\n UsersQuery,\n UserStat,\n UserTagsResponse,\n UserUsersResponse,\n} from '@drodil/backstage-plugin-qeta-common';\nimport { QetaFilters } from '../service/util';\nimport { PermissionCriteria } from '@backstage/plugin-permission-common';\n\nexport function isPost(entity: QetaIdEntity): entity is Post {\n return 'title' in entity && !('followers' in entity);\n}\n\nexport function isAnswer(entity: QetaIdEntity): entity is Answer {\n return 'postId' in entity && 'correct' in entity;\n}\n\nexport function isComment(entity: QetaIdEntity): entity is QetaComment {\n return !('title' in entity) && !('correct' in entity);\n}\n\nexport function isTag(entity: QetaIdEntity): entity is TagResponse {\n return 'tag' in entity;\n}\n\nexport function isCollection(entity: QetaIdEntity): entity is Collection {\n return 'followers' in entity;\n}\n\nexport type MaybeAnswer = Answer | null;\nexport type MaybePost = Post | null;\nexport type MaybeComment = QetaComment | null;\nexport type MaybeTag = TagResponse | null;\nexport type MaybeCollection = Collection | null;\nexport type MaybeTemplate = Template | null;\n\nexport interface Posts {\n posts: Post[];\n total: number;\n}\n\nexport interface Answers {\n answers: Answer[];\n total: number;\n}\n\nexport interface Collections {\n collections: Collection[];\n total: number;\n}\n\nexport interface Templates {\n templates: Template[];\n total: number;\n}\n\nexport interface EntityResponse {\n id: number;\n entityRef: string;\n postsCount: number;\n followerCount: number;\n}\n\nexport interface EntitiesResponse {\n entities: EntityResponse[];\n total: number;\n}\n\nexport interface UserResponse {\n userRef: string;\n totalViews: number;\n totalQuestions: number;\n totalAnswers: number;\n totalComments: number;\n totalVotes: number;\n totalArticles: number;\n totalFollowers: number;\n totalLinks: number;\n}\n\nexport interface UsersResponse {\n users: UserResponse[];\n total: number;\n}\n\nexport interface AttachmentParameters {\n uuid: string;\n locationType: string;\n locationUri: string;\n extension: string;\n mimeType: string;\n path?: string;\n binaryImage?: Buffer;\n creator?: string;\n postId?: number;\n answerId?: number;\n collectionId?: number;\n}\n\nexport interface CollectionPostRank {\n postId: number;\n rank: number;\n}\n\nexport type PostOptions = {\n tagsFilter?: PermissionCriteria<QetaFilters>;\n commentsFilter?: PermissionCriteria<QetaFilters>;\n answersFilter?: PermissionCriteria<QetaFilters>;\n includeDraftFilter?: boolean;\n includeTags?: boolean;\n includeAnswers?: boolean;\n includeVotes?: boolean;\n includeEntities?: boolean;\n includeComments?: boolean;\n includeAttachments?: boolean;\n includeTotal?: boolean;\n includeExperts?: boolean;\n includeCollections?: boolean;\n collectionIds?: number[];\n};\n\nexport type CollectionOptions = {\n filters?: PermissionCriteria<QetaFilters>;\n postFilters?: PermissionCriteria<QetaFilters>;\n tagFilters?: PermissionCriteria<QetaFilters>;\n includePosts?: boolean;\n includeExperts?: boolean;\n};\n\nexport type AnswerOptions = {\n filter?: PermissionCriteria<QetaFilters>;\n includeStatusFilter?: boolean;\n includeVotes?: boolean;\n includeComments?: boolean;\n includePost?: boolean;\n includeExperts?: boolean;\n commentsFilter?: PermissionCriteria<QetaFilters>;\n};\n\nexport type CommentOptions = {\n includeStatusFilter?: boolean;\n};\n\n/**\n * Interface for fetching and modifying Q&A data\n */\nexport interface QetaStore {\n /**\n * Fetch all stored posts with options\n */\n getPosts(\n user_ref: string,\n options: PostsQuery,\n filters?: PermissionCriteria<QetaFilters>,\n opts?: PostOptions,\n ): Promise<Posts>;\n\n /**\n * Fetch single question by id\n * Question views count is increased after fetching the question\n */\n getPost(\n user_ref: string,\n id: number,\n recordView?: boolean,\n options?: PostOptions,\n ): Promise<MaybePost>;\n\n /**\n * Fetch single question by answer id\n * Question views count is increased after fetching the question\n */\n getPostByAnswerId(\n user_ref: string,\n answerId: number,\n recordView?: boolean,\n options?: PostOptions,\n ): Promise<MaybePost>;\n\n /**\n * Post new post\n */\n createPost(options: {\n user_ref: string;\n title: string;\n content: string;\n created: Date;\n author?: string;\n tags?: string[];\n entities?: string[];\n images?: number[];\n anonymous?: boolean;\n type?: PostType;\n headerImage?: string;\n url?: string;\n status?: PostStatus;\n opts?: PostOptions;\n }): Promise<Post>;\n\n /**\n * Comment question\n */\n commentPost(\n question_id: number,\n user_ref: string,\n content: string,\n created: Date,\n options?: PostOptions,\n ): Promise<MaybePost>;\n\n updatePostComment(\n post_id: number,\n id: number,\n user_ref: string,\n content: string,\n options?: PostOptions,\n ): Promise<MaybePost>;\n\n /**\n * Delete question comment\n */\n deletePostComment(\n question_id: number,\n id: number,\n user_ref: string,\n permanently?: boolean,\n options?: PostOptions,\n ): Promise<MaybePost>;\n\n /**\n * Update question\n */\n updatePost(options: {\n id: number;\n user_ref: string;\n title?: string;\n content?: string;\n author?: string;\n tags?: string[];\n entities?: string[];\n images?: number[];\n headerImage?: string;\n url?: string;\n setUpdatedBy?: boolean;\n status?: PostStatus;\n opts?: PostOptions;\n }): Promise<MaybePost>;\n\n /**\n * Delete question. Only the user who created the question can delete it.\n * @param id question id\n */\n deletePost(id: number, permanently?: boolean): Promise<boolean>;\n\n /**\n * Answer question\n */\n answerPost(\n user_ref: string,\n questionId: number,\n answer: string,\n created: Date,\n images?: number[],\n anonymous?: boolean,\n options?: AnswerOptions,\n ): Promise<MaybeAnswer>;\n\n /**\n * Comment answer\n */\n commentAnswer(\n answer_id: number,\n user_ref: string,\n content: string,\n created: Date,\n options?: AnswerOptions,\n ): Promise<MaybeAnswer>;\n\n updateAnswerComment(\n answer_id: number,\n id: number,\n user_ref: string,\n content: string,\n options?: AnswerOptions,\n ): Promise<MaybeAnswer>;\n\n /**\n * Delete answer comment\n */\n deleteAnswerComment(\n answer_id: number,\n id: number,\n user_ref: string,\n permanently?: boolean,\n options?: AnswerOptions,\n ): Promise<MaybeAnswer>;\n\n /**\n * Update answer to a question\n */\n updateAnswer(\n user_ref: string,\n questionId: number,\n answerId: number,\n answer: string,\n author?: string,\n images?: number[],\n options?: AnswerOptions,\n ): Promise<MaybeAnswer>;\n\n /**\n * Fetch all stored answers with options\n */\n getAnswers(\n user_ref: string,\n options: AnswersQuery,\n filters?: PermissionCriteria<QetaFilters>,\n opts?: AnswerOptions,\n ): Promise<Answers>;\n\n /** Get answer by id\n */\n getAnswer(\n answerId: number,\n user_ref: string,\n options?: AnswerOptions,\n ): Promise<MaybeAnswer>;\n\n getComments(\n options?: { ids?: number[] },\n opts?: CommentOptions,\n ): Promise<QetaComment[]>;\n getComment(\n commentId: number,\n opts?: CommentOptions & { postId?: number; answerId?: number },\n ): Promise<MaybeComment>;\n\n /**\n * Delete answer. Only the user who created the answer can delete it.\n * @param id answer id\n */\n deleteAnswer(id: number, permanently?: boolean): Promise<boolean>;\n\n /**\n * Record a click of a link\n * @param postId link id\n * @param author author of the link\n */\n clickPost(author: string, postId: number): Promise<void>;\n\n /**\n * Vote question with given score\n * @param user_ref user name of the user voting question\n * @param postId question id\n * @param score score to vote with\n */\n votePost(user_ref: string, postId: number, score: number): Promise<boolean>;\n\n deletePostVote(user_ref: string, postId: number): Promise<boolean>;\n\n /**\n * Vote answer with given score\n * @param user_ref user name of the user voting answer\n * @param answerId answwer id\n * @param score score to vote with\n */\n voteAnswer(\n user_ref: string,\n answerId: number,\n score: number,\n ): Promise<boolean>;\n\n deleteAnswerVote(user_ref: string, answerId: number): Promise<boolean>;\n\n /**\n * Mark answer correct for question. Only user who created the question can mark answer correct\n * @param questionId question id\n * @param answerId answer id\n */\n markAnswerCorrect(questionId: number, answerId: number): Promise<boolean>;\n\n /**\n * Mark answer incorrect for question. Only user who created the question can mark answer incorrect\n * @param questionId question id\n * @param answerId answer id\n */\n markAnswerIncorrect(questionId: number, answerId: number): Promise<boolean>;\n\n /**\n * Mark question favorite for user\n * @param user_ref user name of the user voting question\n * @param postId post id\n */\n favoritePost(user_ref: string, postId: number): Promise<boolean>;\n\n /**\n * Mark question unfavorite for user\n * @param user_ref user name of the user voting question\n * @param postId post id\n */\n unfavoritePost(user_ref: string, postId: number): Promise<boolean>;\n\n getUsersWhoFavoritedPost(postId: number): Promise<string[]>;\n\n /**\n * Returns all used tags for posts\n */\n getTags(\n options?: { noDescription?: boolean; ids?: number[] } & TagsQuery,\n filters?: PermissionCriteria<QetaFilters>,\n ): Promise<TagsResponse>;\n getTagById(id: number): Promise<TagResponse | null>;\n getTag(tag: string): Promise<TagResponse | null>;\n createTag(\n tag: string,\n description?: string,\n experts?: string[],\n ): Promise<TagResponse | null>;\n updateTag(\n id: number,\n description?: string,\n experts?: string[],\n ): Promise<TagResponse | null>;\n deleteTag(id: number): Promise<boolean>;\n getTagExperts(tags: string[]): Promise<string[]>;\n\n getUsers(\n options?: { entityRefs?: string[] } & UsersQuery,\n ): Promise<UsersResponse>;\n getUsersCount(): Promise<number>;\n getUser(user_ref: string): Promise<UserResponse | null>;\n getUserTags(\n user_ref: string,\n filters?: PermissionCriteria<QetaFilters>,\n ): Promise<UserTagsResponse>;\n getUsersForTags(tags?: string[]): Promise<string[]>;\n\n followTag(user_ref: string, tag: string): Promise<boolean>;\n unfollowTag(user_ref: string, tag: string): Promise<boolean>;\n\n getUserEntities(user_ref: string): Promise<UserEntitiesResponse>;\n getUsersForEntities(entityRefs?: string[]): Promise<string[]>;\n\n followEntity(user_ref: string, entityRef: string): Promise<boolean>;\n unfollowEntity(user_ref: string, entityRef: string): Promise<boolean>;\n\n getFollowedUsers(user_ref: string): Promise<UserUsersResponse>;\n getFollowingUsers(user_ref: string): Promise<string[]>;\n\n followUser(user_ref: string, followedUserRef: string): Promise<boolean>;\n unfollowUser(user_ref: string, followedUserRef: string): Promise<boolean>;\n\n getEntities(\n options?: { entityRefs?: string[] } & EntitiesQuery,\n ): Promise<EntitiesResponse>;\n getEntity(entity_ref: string): Promise<EntityResponse | null>;\n\n getUserCollections(\n user_ref: string,\n options?: CollectionOptions,\n ): Promise<UserCollectionsResponse>;\n getUsersForCollection(collectionId: number): Promise<string[]>;\n\n followCollection(user_ref: string, collectionId: number): Promise<boolean>;\n unfollowCollection(user_ref: string, collectionId: number): Promise<boolean>;\n\n postAttachment({\n uuid,\n locationType,\n locationUri,\n extension,\n mimeType,\n binaryImage,\n path,\n creator,\n }: AttachmentParameters): Promise<Attachment>;\n\n getAttachment(uuid: string): Promise<Attachment | undefined>;\n deleteAttachment(uuid: string): Promise<boolean>;\n getDeletableAttachments(dayLimit: number): Promise<Attachment[]>;\n\n getMostUpvotedPosts({\n author,\n options,\n }: StatisticsRequestParameters): Promise<Statistic[]>;\n getTotalPosts({\n author,\n options,\n }: StatisticsRequestParameters): Promise<Statistic[]>;\n getMostUpvotedAnswers({\n author,\n options,\n }: StatisticsRequestParameters): Promise<Statistic[]>;\n getMostUpvotedCorrectAnswers({\n author,\n options,\n }: StatisticsRequestParameters): Promise<Statistic[]>;\n getTotalAnswers({\n author,\n options,\n }: StatisticsRequestParameters): Promise<Statistic[]>;\n getCount(\n table: string,\n filters?: { author?: string; type?: PostType },\n ): Promise<number>;\n saveGlobalStats(date: Date): Promise<void>;\n saveUserStats(user: UserResponse, date: Date): Promise<void>;\n getTotalViews(\n user_ref: string,\n lastDays?: number,\n excludeUser?: boolean,\n ): Promise<number>;\n cleanStats(days: number, date: Date): Promise<void>;\n getGlobalStats(): Promise<GlobalStat[]>;\n getUserStats(user_ref: string): Promise<UserStat[]>;\n\n getCollections(\n user_ref: string,\n options: CollectionsQuery,\n opts?: CollectionOptions,\n ): Promise<Collections>;\n\n getCollection(\n user_ref: string,\n id: number,\n options?: CollectionOptions,\n ): Promise<MaybeCollection>;\n\n createCollection(options: {\n user_ref: string;\n title: string;\n description?: string;\n created: Date;\n images?: number[];\n headerImage?: string;\n opts?: CollectionOptions;\n }): Promise<Collection>;\n\n updateCollection(options: {\n id: number;\n user_ref: string;\n title: string;\n description?: string;\n images?: number[];\n headerImage?: string;\n opts?: CollectionOptions;\n }): Promise<MaybeCollection>;\n\n deleteCollection(id: number): Promise<boolean>;\n\n addPostToCollection(\n user_ref: string,\n id: number,\n postId: number,\n options?: CollectionOptions,\n ): Promise<MaybeCollection>;\n removePostFromCollection(\n user_ref: string,\n id: number,\n postId: number,\n options?: CollectionOptions,\n ): Promise<MaybeCollection>;\n\n getTemplates(): Promise<Templates>;\n getTemplate(id: number): Promise<MaybeTemplate>;\n createTemplate(options: {\n title: string;\n description: string;\n questionTitle?: string;\n questionContent?: string;\n tags?: string[];\n entities?: string[];\n }): Promise<Template>;\n deleteTemplate(id: number): Promise<boolean>;\n updateTemplate(options: {\n id: number;\n title: string;\n description: string;\n questionTitle?: string;\n questionContent?: string;\n tags?: string[];\n entities?: string[];\n }): Promise<MaybeTemplate>;\n\n getAIAnswer(postId: number): Promise<AIResponse | null>;\n saveAIAnswer(postId: number, response: AIResponse): Promise<void>;\n deleteAIAnswer(postId: number): Promise<boolean>;\n\n getPostRank(collectionId: number, postId: number): Promise<number | null>;\n getTopRankedPostId(collectionId: number): Promise<CollectionPostRank | null>;\n getBottomRankedPostId(\n collectionId: number,\n ): Promise<CollectionPostRank | null>;\n getNextRankedPostId(\n collectionId: number,\n postId: number,\n ): Promise<CollectionPostRank | null>;\n getPreviousRankedPostId(\n collectionId: number,\n postId: number,\n ): Promise<CollectionPostRank | null>;\n updatePostRank(\n collectionId: number,\n postId: number,\n rank: number,\n ): Promise<void>;\n getEntityLinks(): Promise<EntityLinks[]>;\n\n suggestPosts(\n user_ref: string,\n title: string,\n content: string,\n tags?: string[],\n entities?: string[],\n filters?: PermissionCriteria<QetaFilters>,\n opts?: PostOptions,\n ): Promise<Posts>;\n}\n"],"names":[],"mappings":";;AAgCO,SAAS,OAAO,MAAsC,EAAA;AAC3D,EAAO,OAAA,OAAA,IAAW,MAAU,IAAA,EAAE,WAAe,IAAA,MAAA,CAAA;AAC/C;AAEO,SAAS,SAAS,MAAwC,EAAA;AAC/D,EAAO,OAAA,QAAA,IAAY,UAAU,SAAa,IAAA,MAAA;AAC5C;AAEO,SAAS,UAAU,MAA6C,EAAA;AACrE,EAAA,OAAO,EAAE,OAAA,IAAW,MAAW,CAAA,IAAA,EAAE,SAAa,IAAA,MAAA,CAAA;AAChD;AAEO,SAAS,MAAM,MAA6C,EAAA;AACjE,EAAA,OAAO,KAAS,IAAA,MAAA;AAClB;AAEO,SAAS,aAAa,MAA4C,EAAA;AACvE,EAAA,OAAO,WAAe,IAAA,MAAA;AACxB;;;;;;;;"}
|
|
@@ -21,11 +21,12 @@ class BaseStore {
|
|
|
21
21
|
}
|
|
22
22
|
applySearchQuery(query, columns, searchQuery) {
|
|
23
23
|
if (this.db.client.config.client === "pg") {
|
|
24
|
+
const formattedQuery = searchQuery.trim().split(/\s+/).map((term) => `'${term.replace(/'/g, "''")}':*`).join(" & ");
|
|
24
25
|
query.whereRaw(
|
|
25
|
-
`((to_tsvector(
|
|
26
|
+
`((to_tsvector('english', CONCAT_WS(' ', ${columns.join(
|
|
26
27
|
","
|
|
27
|
-
)})) @@ to_tsquery(
|
|
28
|
-
[
|
|
28
|
+
)})) @@ to_tsquery('english', ?)))`,
|
|
29
|
+
[formattedQuery]
|
|
29
30
|
);
|
|
30
31
|
} else {
|
|
31
32
|
query.whereRaw(`LOWER(CONCAT(${columns.join(",")})) LIKE LOWER(?)`, [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseStore.cjs.js","sources":["../../../src/database/stores/BaseStore.ts"],"sourcesContent":["import { Knex } from 'knex';\nimport { QetaFilter, QetaFilters } from '../../service/util';\nimport { PermissionCriteria } from '@backstage/plugin-permission-common';\nimport {\n isAndCriteria,\n isNotCriteria,\n isOrCriteria,\n} from '@backstage/plugin-permission-node';\nimport { compact } from 'lodash';\n\nfunction isQetaFilter(filter: any): filter is QetaFilter {\n return filter.hasOwnProperty('property');\n}\n\nexport abstract class BaseStore {\n constructor(protected readonly db: Knex) {}\n\n protected mapToInteger(val: string | number | undefined): number {\n return typeof val === 'string' ? Number.parseInt(val, 10) : val ?? 0;\n }\n\n protected mapToBoolean(val: string | number | boolean | undefined): boolean {\n if (typeof val === 'string') {\n return val === 'true' || val === '1';\n }\n return typeof val === 'number' ? val > 0 : !!val;\n }\n\n protected applySearchQuery(\n query: Knex.QueryBuilder,\n columns: string[],\n searchQuery: string,\n ) {\n if (this.db.client.config.client === 'pg') {\n query.whereRaw(\n `((to_tsvector(CONCAT(${columns.join(\n ',',\n )})) @@ to_tsquery(quote_literal(?) || ':*')))`,\n [`${searchQuery}`],\n );\n } else {\n query.whereRaw(`LOWER(CONCAT(${columns.join(',')})) LIKE LOWER(?)`, [\n `%${searchQuery}%`,\n ]);\n }\n }\n\n protected async updateAttachments(\n key: 'postId' | 'answerId' | 'collectionId',\n content: string,\n images: number[],\n id: number,\n headerImage?: string,\n ) {\n if (images.length > 0) {\n await this.db('attachments')\n .whereIn('id', images)\n .update({ [key]: id });\n }\n\n const attachments = await this.db('attachments')\n .where(key, id)\n .select('uuid');\n const uuids = attachments.map(a => a.uuid);\n const toRemove = uuids.filter(uuid => {\n return !(content.includes(uuid) || headerImage?.includes(uuid));\n });\n await this.db('attachments')\n .whereIn('uuid', toRemove)\n .update({ [key]: null });\n }\n\n protected parseFilter(\n filter: PermissionCriteria<QetaFilters>,\n query: Knex.QueryBuilder,\n db: Knex,\n type: 'post' | 'answer' | 'collection' | 'tags' | 'comments' = 'post',\n negate: boolean = false,\n ): Knex.QueryBuilder {\n if (isNotCriteria(filter)) {\n return this.parseFilter(filter.not, query, db, type, !negate);\n }\n\n if (isQetaFilter(filter)) {\n const values: string[] = compact(filter.values) ?? [];\n\n let fk = 'posts.id';\n if (type === 'answer') {\n fk = 'answers.postId';\n } else if (type === 'collection') {\n fk = 'collection_posts.postId';\n }\n if (filter.property === 'tags') {\n const postIds = db('tags')\n .leftJoin('post_tags', 'tags.id', 'post_tags.tagId')\n .where('tags.tag', 'in', values)\n .select('post_tags.postId');\n query[negate ? 'whereNotIn' : 'whereIn'](fk, postIds);\n return query;\n }\n if (filter.property === 'tag.experts') {\n if (type === 'post') {\n const postIds = db('tags')\n .leftJoin('post_tags', 'tags.id', 'post_tags.tagId')\n .leftJoin('tag_experts', 'tag_experts.tagId', 'tags.id')\n .where('tag_experts.entityRef', 'in', values)\n .select('post_tags.postId');\n query[negate ? 'whereNotIn' : 'whereIn'](fk, postIds);\n return query;\n } else if (type === 'answer') {\n const answerIds = db('answers')\n .leftJoin('posts', 'answers.postId', 'posts.id')\n .leftJoin('post_tags', 'post_tags.postId', 'posts.id')\n .leftJoin('tags', 'post_tags.tagId', 'tags.id')\n .leftJoin('tag_experts', 'tag_experts.tagId', 'tags.id')\n .where('tag_experts.entityRef', 'in', values)\n .select('answers.id');\n query[negate ? 'whereNotIn' : 'whereIn'](fk, answerIds);\n return query;\n } else if (type === 'tags') {\n const tagIds = db('tag_experts')\n .leftJoin('tags', 'tag_experts.tagId', 'tags.id')\n .where('tag_experts.entityRef', 'in', values)\n .select('tag_experts.tagId');\n query[negate ? 'whereNotIn' : 'whereIn'](fk, tagIds);\n return query;\n } else if (type === 'collection') {\n const collectionIds = db('collection_posts')\n .leftJoin('posts', 'collection_posts.postId', 'posts.id')\n .leftJoin('post_tags', 'post_tags.postId', 'posts.id')\n .leftJoin('tags', 'post_tags.tagId', 'tags.id')\n .leftJoin('tag_experts', 'tag_experts.tagId', 'tags.id')\n .where('tag_experts.entityRef', 'in', values)\n .select('collection_posts.collectionId');\n query[negate ? 'whereNotIn' : 'whereIn'](fk, collectionIds);\n return query;\n }\n }\n\n if (filter.property === 'entityRefs') {\n const postIds = db('entities')\n .leftJoin('post_entities', 'entities.id', 'post_entities.entityId')\n .where('entities.entity_ref', 'in', values)\n .select('post_entities.postId');\n query[negate ? 'whereNotIn' : 'whereIn'](fk, postIds);\n return query;\n }\n\n if (values.length === 0) {\n return negate\n ? query.whereNotNull(filter.property)\n : query.whereNull(filter.property);\n }\n\n return query[negate ? 'whereNotIn' : 'whereIn'](filter.property, values);\n }\n\n return query[negate ? 'andWhereNot' : 'andWhere'](builder => {\n const f = filter as PermissionCriteria<QetaFilters>;\n if (isOrCriteria(f)) {\n for (const subFilter of f.anyOf ?? []) {\n builder.orWhere((subQuery: Knex.QueryBuilder) =>\n this.parseFilter(subFilter, subQuery, db, type, false),\n );\n }\n } else if (isAndCriteria(f)) {\n for (const subFilter of f.allOf ?? []) {\n builder.andWhere((subQuery: Knex.QueryBuilder) =>\n this.parseFilter(subFilter, subQuery, db, type, false),\n );\n }\n } else if (isNotCriteria(f)) {\n builder.whereNot((subQuery: Knex.QueryBuilder) =>\n this.parseFilter(f.not, subQuery, db, type, false),\n );\n }\n });\n }\n}\n"],"names":["isNotCriteria","compact","isOrCriteria","isAndCriteria"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"BaseStore.cjs.js","sources":["../../../src/database/stores/BaseStore.ts"],"sourcesContent":["import { Knex } from 'knex';\nimport { QetaFilter, QetaFilters } from '../../service/util';\nimport { PermissionCriteria } from '@backstage/plugin-permission-common';\nimport {\n isAndCriteria,\n isNotCriteria,\n isOrCriteria,\n} from '@backstage/plugin-permission-node';\nimport { compact } from 'lodash';\n\nfunction isQetaFilter(filter: any): filter is QetaFilter {\n return filter.hasOwnProperty('property');\n}\n\nexport abstract class BaseStore {\n constructor(protected readonly db: Knex) {}\n\n protected mapToInteger(val: string | number | undefined): number {\n return typeof val === 'string' ? Number.parseInt(val, 10) : val ?? 0;\n }\n\n protected mapToBoolean(val: string | number | boolean | undefined): boolean {\n if (typeof val === 'string') {\n return val === 'true' || val === '1';\n }\n return typeof val === 'number' ? val > 0 : !!val;\n }\n\n protected applySearchQuery(\n query: Knex.QueryBuilder,\n columns: string[],\n searchQuery: string,\n ) {\n if (this.db.client.config.client === 'pg') {\n const formattedQuery = searchQuery\n .trim()\n .split(/\\s+/)\n .map(term => `'${term.replace(/'/g, \"''\")}':*`)\n .join(' & ');\n\n query.whereRaw(\n `((to_tsvector('english', CONCAT_WS(' ', ${columns.join(\n ',',\n )})) @@ to_tsquery('english', ?)))`,\n [formattedQuery],\n );\n } else {\n query.whereRaw(`LOWER(CONCAT(${columns.join(',')})) LIKE LOWER(?)`, [\n `%${searchQuery}%`,\n ]);\n }\n }\n\n protected async updateAttachments(\n key: 'postId' | 'answerId' | 'collectionId',\n content: string,\n images: number[],\n id: number,\n headerImage?: string,\n ) {\n if (images.length > 0) {\n await this.db('attachments')\n .whereIn('id', images)\n .update({ [key]: id });\n }\n\n const attachments = await this.db('attachments')\n .where(key, id)\n .select('uuid');\n const uuids = attachments.map(a => a.uuid);\n const toRemove = uuids.filter(uuid => {\n return !(content.includes(uuid) || headerImage?.includes(uuid));\n });\n await this.db('attachments')\n .whereIn('uuid', toRemove)\n .update({ [key]: null });\n }\n\n protected parseFilter(\n filter: PermissionCriteria<QetaFilters>,\n query: Knex.QueryBuilder,\n db: Knex,\n type: 'post' | 'answer' | 'collection' | 'tags' | 'comments' = 'post',\n negate: boolean = false,\n ): Knex.QueryBuilder {\n if (isNotCriteria(filter)) {\n return this.parseFilter(filter.not, query, db, type, !negate);\n }\n\n if (isQetaFilter(filter)) {\n const values: string[] = compact(filter.values) ?? [];\n\n let fk = 'posts.id';\n if (type === 'answer') {\n fk = 'answers.postId';\n } else if (type === 'collection') {\n fk = 'collection_posts.postId';\n }\n if (filter.property === 'tags') {\n const postIds = db('tags')\n .leftJoin('post_tags', 'tags.id', 'post_tags.tagId')\n .where('tags.tag', 'in', values)\n .select('post_tags.postId');\n query[negate ? 'whereNotIn' : 'whereIn'](fk, postIds);\n return query;\n }\n if (filter.property === 'tag.experts') {\n if (type === 'post') {\n const postIds = db('tags')\n .leftJoin('post_tags', 'tags.id', 'post_tags.tagId')\n .leftJoin('tag_experts', 'tag_experts.tagId', 'tags.id')\n .where('tag_experts.entityRef', 'in', values)\n .select('post_tags.postId');\n query[negate ? 'whereNotIn' : 'whereIn'](fk, postIds);\n return query;\n } else if (type === 'answer') {\n const answerIds = db('answers')\n .leftJoin('posts', 'answers.postId', 'posts.id')\n .leftJoin('post_tags', 'post_tags.postId', 'posts.id')\n .leftJoin('tags', 'post_tags.tagId', 'tags.id')\n .leftJoin('tag_experts', 'tag_experts.tagId', 'tags.id')\n .where('tag_experts.entityRef', 'in', values)\n .select('answers.id');\n query[negate ? 'whereNotIn' : 'whereIn'](fk, answerIds);\n return query;\n } else if (type === 'tags') {\n const tagIds = db('tag_experts')\n .leftJoin('tags', 'tag_experts.tagId', 'tags.id')\n .where('tag_experts.entityRef', 'in', values)\n .select('tag_experts.tagId');\n query[negate ? 'whereNotIn' : 'whereIn'](fk, tagIds);\n return query;\n } else if (type === 'collection') {\n const collectionIds = db('collection_posts')\n .leftJoin('posts', 'collection_posts.postId', 'posts.id')\n .leftJoin('post_tags', 'post_tags.postId', 'posts.id')\n .leftJoin('tags', 'post_tags.tagId', 'tags.id')\n .leftJoin('tag_experts', 'tag_experts.tagId', 'tags.id')\n .where('tag_experts.entityRef', 'in', values)\n .select('collection_posts.collectionId');\n query[negate ? 'whereNotIn' : 'whereIn'](fk, collectionIds);\n return query;\n }\n }\n\n if (filter.property === 'entityRefs') {\n const postIds = db('entities')\n .leftJoin('post_entities', 'entities.id', 'post_entities.entityId')\n .where('entities.entity_ref', 'in', values)\n .select('post_entities.postId');\n query[negate ? 'whereNotIn' : 'whereIn'](fk, postIds);\n return query;\n }\n\n if (values.length === 0) {\n return negate\n ? query.whereNotNull(filter.property)\n : query.whereNull(filter.property);\n }\n\n return query[negate ? 'whereNotIn' : 'whereIn'](filter.property, values);\n }\n\n return query[negate ? 'andWhereNot' : 'andWhere'](builder => {\n const f = filter as PermissionCriteria<QetaFilters>;\n if (isOrCriteria(f)) {\n for (const subFilter of f.anyOf ?? []) {\n builder.orWhere((subQuery: Knex.QueryBuilder) =>\n this.parseFilter(subFilter, subQuery, db, type, false),\n );\n }\n } else if (isAndCriteria(f)) {\n for (const subFilter of f.allOf ?? []) {\n builder.andWhere((subQuery: Knex.QueryBuilder) =>\n this.parseFilter(subFilter, subQuery, db, type, false),\n );\n }\n } else if (isNotCriteria(f)) {\n builder.whereNot((subQuery: Knex.QueryBuilder) =>\n this.parseFilter(f.not, subQuery, db, type, false),\n );\n }\n });\n }\n}\n"],"names":["isNotCriteria","compact","isOrCriteria","isAndCriteria"],"mappings":"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"}
|
|
@@ -251,6 +251,9 @@ class CollectionsStore extends BaseStore.BaseStore {
|
|
|
251
251
|
posts: collectionPosts,
|
|
252
252
|
headerImage: val.headerImage,
|
|
253
253
|
postsCount: this.mapToInteger(val.postsCount),
|
|
254
|
+
questionsCount: this.mapToInteger(val.questionsCount),
|
|
255
|
+
articlesCount: this.mapToInteger(val.articlesCount),
|
|
256
|
+
linksCount: this.mapToInteger(val.linksCount),
|
|
254
257
|
entities,
|
|
255
258
|
tags,
|
|
256
259
|
images: attachmentsMap.get(val.id) || [],
|
|
@@ -260,7 +263,17 @@ class CollectionsStore extends BaseStore.BaseStore {
|
|
|
260
263
|
});
|
|
261
264
|
}
|
|
262
265
|
getCollectionsBaseQuery() {
|
|
263
|
-
|
|
266
|
+
const questionsCount = this.db("collection_posts").leftJoin("posts", "collection_posts.postId", "posts.id").where("collection_posts.collectionId", this.db.ref("collections.id")).where("posts.type", "question").count("*").as("questionsCount");
|
|
267
|
+
const articlesCount = this.db("collection_posts").leftJoin("posts", "collection_posts.postId", "posts.id").where("collection_posts.collectionId", this.db.ref("collections.id")).where("posts.type", "article").count("*").as("articlesCount");
|
|
268
|
+
const linksCount = this.db("collection_posts").leftJoin("posts", "collection_posts.postId", "posts.id").where("collection_posts.collectionId", this.db.ref("collections.id")).where("posts.type", "link").count("*").as("linksCount");
|
|
269
|
+
const followerCount = this.db("user_collections").where("user_collections.collectionId", this.db.ref("collections.id")).count("*").as("followerCount");
|
|
270
|
+
return this.db("collections").select(
|
|
271
|
+
"collections.*",
|
|
272
|
+
questionsCount,
|
|
273
|
+
articlesCount,
|
|
274
|
+
linksCount,
|
|
275
|
+
followerCount
|
|
276
|
+
).groupBy("collections.id");
|
|
264
277
|
}
|
|
265
278
|
}
|
|
266
279
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CollectionsStore.cjs.js","sources":["../../../src/database/stores/CollectionsStore.ts"],"sourcesContent":["import {\n Collection,\n CollectionsQuery,\n} from '@drodil/backstage-plugin-qeta-common';\nimport {\n CollectionOptions,\n CollectionPostRank,\n Collections,\n} from '../QetaStore';\nimport { Knex } from 'knex';\nimport { compact } from 'lodash';\nimport { BaseStore } from './BaseStore';\nimport { AttachmentsStore } from './AttachmentsStore';\nimport { PostsStore } from './PostsStore';\n\nexport interface RawCollectionEntity {\n id: number;\n title: string;\n description: string;\n created: Date;\n owner: string;\n headerImage: string;\n postsCount: number | string;\n}\n\nexport class CollectionsStore extends BaseStore {\n constructor(\n protected readonly db: Knex,\n private readonly postsStore: PostsStore,\n private readonly attachmentsStore: AttachmentsStore,\n ) {\n super(db);\n }\n\n async getCollections(\n user_ref: string,\n options: CollectionsQuery,\n opts?: CollectionOptions,\n ): Promise<Collections> {\n const query = this.getCollectionsBaseQuery();\n\n if (options.searchQuery) {\n this.applySearchQuery(\n query,\n ['collections.title', 'collections.description'],\n options.searchQuery,\n );\n }\n\n if (opts?.filters) {\n this.parseFilter(opts.filters, query, this.db, 'collection');\n }\n\n if (options.owner) {\n query.where('collections.owner', '=', options.owner);\n }\n\n const totalQuery = query.clone();\n\n if (options.orderBy) {\n query.orderBy(options.orderBy, options.order ? options.order : 'desc');\n }\n\n if (options.limit) {\n query.limit(options.limit);\n }\n\n if (options.offset) {\n query.offset(options.offset);\n }\n\n const results = await Promise.all([\n query,\n this.db(totalQuery.as('totalQuery')).count('* as CNT').first(),\n ]);\n\n const rows = results[0] as RawCollectionEntity[];\n const total = this.mapToInteger((results[1] as any)?.CNT);\n\n return {\n collections: await this.mapCollectionEntities(rows, user_ref, opts),\n total,\n };\n }\n\n async getCollection(\n user_ref: string,\n id: number,\n options?: CollectionOptions,\n ): Promise<Collection | null> {\n const query = this.getCollectionsBaseQuery();\n const rows = await query.where('collections.id', '=', id);\n if (rows.length === 0) {\n return null;\n }\n return (\n await this.mapCollectionEntities(\n [rows[0] as RawCollectionEntity],\n user_ref,\n options,\n )\n )[0];\n }\n\n async createCollection(options: {\n user_ref: string;\n title: string;\n description?: string;\n created: Date;\n images?: number[];\n headerImage?: string;\n opts?: CollectionOptions;\n }): Promise<Collection> {\n const { user_ref, title, description, created, images, headerImage, opts } =\n options as any;\n\n const collections = await this.db\n .insert(\n {\n owner: user_ref,\n title,\n description,\n created,\n headerImage,\n },\n ['id'],\n )\n .into('collections')\n .returning('*');\n\n await this.updateAttachments(\n 'collectionId',\n description ?? '',\n images ?? [],\n collections[0].id,\n headerImage,\n );\n\n return (\n await this.mapCollectionEntities([collections[0]], user_ref, opts)\n )[0];\n }\n\n async updateCollection(options: {\n id: number;\n user_ref: string;\n title: string;\n description?: string;\n images?: number[];\n headerImage?: string;\n opts?: CollectionOptions;\n }): Promise<Collection | null> {\n const { id, user_ref, title, description, images, headerImage, opts } =\n options;\n\n const rows = await this.db('collections')\n .where('id', '=', id)\n .update({\n title,\n description,\n headerImage,\n })\n .returning('*');\n\n if (!rows || rows.length === 0) {\n return null;\n }\n\n await this.updateAttachments(\n 'collectionId',\n description ?? '',\n images ?? [],\n id,\n headerImage,\n );\n\n return (await this.mapCollectionEntities([rows[0]], user_ref, opts))[0];\n }\n\n async deleteCollection(id: number): Promise<boolean> {\n const rows = await this.db('collections').where('id', '=', id).delete();\n return rows > 0;\n }\n\n async getUserCollections(\n user_ref: string,\n options?: CollectionOptions,\n ): Promise<{ collections: Collection[]; count: number }> {\n const results = await this.getCollections(user_ref, options || {});\n return { collections: results.collections, count: results.total };\n }\n\n async getPostRank(\n collectionId: number,\n postId: number,\n ): Promise<number | null> {\n const post = await this.db('collection_posts')\n .where('collection_id', collectionId)\n .where('post_id', postId)\n .first();\n\n if (!post) {\n return null;\n }\n\n return post.rank;\n }\n\n async getTopRankedPostId(\n collectionId: number,\n ): Promise<CollectionPostRank | null> {\n const post = await this.db('collection_posts')\n .where('collection_id', collectionId)\n .orderBy('rank', 'asc')\n .first();\n\n return post ? { postId: post.post_id, rank: post.rank } : null;\n }\n\n async getBottomRankedPostId(\n collectionId: number,\n ): Promise<CollectionPostRank | null> {\n const post = await this.db('collection_posts')\n .where('collection_id', collectionId)\n .orderBy('rank', 'desc')\n .first();\n\n return post ? { postId: post.post_id, rank: post.rank } : null;\n }\n\n async getNextRankedPostId(\n collectionId: number,\n postId: number,\n ): Promise<CollectionPostRank | null> {\n const currentPostRank = await this.getPostRank(collectionId, postId);\n if (currentPostRank === null) {\n return null;\n }\n\n const post = await this.db('collection_posts')\n .where('collection_id', collectionId)\n .where('rank', '>', currentPostRank)\n .orderBy('rank', 'asc')\n .first();\n\n return post ? { postId: post.post_id, rank: post.rank } : null;\n }\n\n async getPreviousRankedPostId(\n collectionId: number,\n postId: number,\n ): Promise<CollectionPostRank | null> {\n const currentPostRank = await this.getPostRank(collectionId, postId);\n if (currentPostRank === null) {\n return null;\n }\n\n const post = await this.db('collection_posts')\n .where('collection_id', collectionId)\n .where('rank', '<', currentPostRank)\n .orderBy('rank', 'desc')\n .first();\n\n return post ? { postId: post.post_id, rank: post.rank } : null;\n }\n\n async updatePostRank(\n collectionId: number,\n postId: number,\n rank: number,\n ): Promise<void> {\n await this.db('collection_posts')\n .where('collection_id', collectionId)\n .where('post_id', postId)\n .update({ rank });\n }\n\n async addPostToCollection(\n user_ref: string,\n id: number,\n postId: number,\n options?: CollectionOptions,\n ): Promise<Collection | null> {\n await this.db\n .insert({\n collectionId: id,\n postId,\n })\n .into('collection_posts');\n await this.db('collections').where('id', id).increment('postsCount', 1);\n return this.getCollection(user_ref, id, options);\n }\n\n async removePostFromCollection(\n user_ref: string,\n id: number,\n postId: number,\n options?: CollectionOptions,\n ): Promise<Collection | null> {\n const rows = await this.db('collection_posts')\n .where('collectionId', id)\n .where('postId', postId)\n .delete();\n if (rows > 0) {\n await this.db('collections').where('id', id).decrement('postsCount', 1);\n }\n return this.getCollection(user_ref, id, options);\n }\n\n async getUsersForCollection(collectionId: number): Promise<string[]> {\n const users = await this.db('user_collections')\n .where('collectionId', collectionId)\n .select('userRef');\n return users.map(user => user.userRef);\n }\n\n async followCollection(\n user_ref: string,\n collectionId: number,\n ): Promise<boolean> {\n await this.db\n .insert({\n userRef: user_ref,\n collectionId,\n })\n .into('user_collections');\n return true;\n }\n\n async unfollowCollection(\n user_ref: string,\n collectionId: number,\n ): Promise<boolean> {\n await this.db('user_collections')\n .where('userRef', user_ref)\n .where('collectionId', collectionId)\n .delete();\n return true;\n }\n\n async getFollowerCounts(ids: number[]): Promise<Map<number, number>> {\n if (ids.length === 0) {\n return new Map();\n }\n const followers = await this.db('user_collections')\n .select('collectionId')\n .count('* as count')\n .whereIn('collectionId', ids)\n .groupBy('collectionId');\n\n const result = new Map<number, number>();\n followers.forEach((f: any) => {\n result.set(f.collectionId, this.mapToInteger(f.count));\n });\n return result;\n }\n\n private async mapCollectionEntities(\n rows: RawCollectionEntity[],\n user_ref: string,\n options?: CollectionOptions,\n ): Promise<Collection[]> {\n if (rows.length === 0) {\n return [];\n }\n\n const collectionIds = rows.map(r => r.id);\n const {\n postFilters,\n includePosts = true,\n includeExperts = true,\n } = options ?? {};\n\n const [posts, attachments, followers, experts] = await Promise.all([\n includePosts && this.postsStore\n ? this.postsStore.getPosts(\n user_ref,\n { includeEntities: true },\n postFilters,\n {\n tagsFilter: options?.tagFilters,\n includeComments: false,\n includeAnswers: false,\n includeAttachments: false,\n includeVotes: false,\n includeTotal: false,\n includeExperts: includeExperts ?? false,\n includeCollections: true,\n collectionIds: collectionIds,\n },\n )\n : { posts: [] },\n this.attachmentsStore.getAttachments(collectionIds, 'collectionId'),\n this.getFollowerCounts(collectionIds),\n includeExperts\n ? this.db('tag_experts')\n .leftJoin('tags', 'tag_experts.tagId', 'tags.id')\n .leftJoin('post_tags', 'post_tags.tagId', 'tags.id')\n .leftJoin(\n 'collection_posts',\n 'collection_posts.postId',\n 'post_tags.postId',\n )\n .whereIn('collection_posts.collectionId', collectionIds)\n .select('collection_posts.collectionId', 'tag_experts.entityRef')\n : undefined,\n ]);\n\n const postsMap = new Map<number, any[]>();\n posts.posts?.forEach((p: any) => {\n if (p.collectionIds && Array.isArray(p.collectionIds)) {\n p.collectionIds.forEach((collectionId: number) => {\n const ps = postsMap.get(collectionId) || [];\n ps.push(p);\n postsMap.set(collectionId, ps);\n });\n }\n });\n\n const attachmentsMap = attachments ?? new Map<number, number[]>();\n\n const followersMap = followers ?? new Map<number, number>();\n\n const expertsMap = new Map<number, string[]>();\n experts?.forEach((e: any) => {\n const ps = expertsMap.get(e.collectionId) || [];\n ps.push(e.entityRef);\n expertsMap.set(e.collectionId, ps);\n });\n\n return rows.map(val => {\n const collectionPosts = postsMap.get(val.id) || [];\n const entities = compact([\n ...new Set(collectionPosts.map((p: any) => p.entities).flat()),\n ]);\n const tags = compact([\n ...new Set(collectionPosts.map((p: any) => p.tags).flat()),\n ]);\n\n return {\n id: val.id,\n title: val.title,\n owner: val.owner,\n description: val.description,\n created: val.created as Date,\n posts: collectionPosts,\n headerImage: val.headerImage,\n postsCount: this.mapToInteger(val.postsCount),\n entities: entities as string[],\n tags: tags as string[],\n images: attachmentsMap.get(val.id) || [],\n followers: followersMap.get(val.id) || 0,\n experts: expertsMap.get(val.id),\n };\n });\n }\n\n private getCollectionsBaseQuery() {\n return this.db<RawCollectionEntity>('collections')\n .select('collections.*')\n .groupBy('collections.id');\n }\n}\n"],"names":["BaseStore","compact"],"mappings":";;;;;AAyBO,MAAM,yBAAyBA,mBAAU,CAAA;AAAA,EAC9C,WAAA,CACqB,EACF,EAAA,UAAA,EACA,gBACjB,EAAA;AACA,IAAA,KAAA,CAAM,EAAE,CAAA;AAJW,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AACF,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AACA,IAAA,IAAA,CAAA,gBAAA,GAAA,gBAAA;AAAA;AAGnB,EAEA,MAAM,cAAA,CACJ,QACA,EAAA,OAAA,EACA,IACsB,EAAA;AACtB,IAAM,MAAA,KAAA,GAAQ,KAAK,uBAAwB,EAAA;AAE3C,IAAA,IAAI,QAAQ,WAAa,EAAA;AACvB,MAAK,IAAA,CAAA,gBAAA;AAAA,QACH,KAAA;AAAA,QACA,CAAC,qBAAqB,yBAAyB,CAAA;AAAA,QAC/C,OAAQ,CAAA;AAAA,OACV;AAAA;AAGF,IAAA,IAAI,MAAM,OAAS,EAAA;AACjB,MAAA,IAAA,CAAK,YAAY,IAAK,CAAA,OAAA,EAAS,KAAO,EAAA,IAAA,CAAK,IAAI,YAAY,CAAA;AAAA;AAG7D,IAAA,IAAI,QAAQ,KAAO,EAAA;AACjB,MAAA,KAAA,CAAM,KAAM,CAAA,mBAAA,EAAqB,GAAK,EAAA,OAAA,CAAQ,KAAK,CAAA;AAAA;AAGrD,IAAM,MAAA,UAAA,GAAa,MAAM,KAAM,EAAA;AAE/B,IAAA,IAAI,QAAQ,OAAS,EAAA;AACnB,MAAA,KAAA,CAAM,QAAQ,OAAQ,CAAA,OAAA,EAAS,QAAQ,KAAQ,GAAA,OAAA,CAAQ,QAAQ,MAAM,CAAA;AAAA;AAGvE,IAAA,IAAI,QAAQ,KAAO,EAAA;AACjB,MAAM,KAAA,CAAA,KAAA,CAAM,QAAQ,KAAK,CAAA;AAAA;AAG3B,IAAA,IAAI,QAAQ,MAAQ,EAAA;AAClB,MAAM,KAAA,CAAA,MAAA,CAAO,QAAQ,MAAM,CAAA;AAAA;AAG7B,IAAM,MAAA,OAAA,GAAU,MAAM,OAAA,CAAQ,GAAI,CAAA;AAAA,MAChC,KAAA;AAAA,MACA,IAAA,CAAK,EAAG,CAAA,UAAA,CAAW,EAAG,CAAA,YAAY,CAAC,CAAE,CAAA,KAAA,CAAM,UAAU,CAAA,CAAE,KAAM;AAAA,KAC9D,CAAA;AAED,IAAM,MAAA,IAAA,GAAO,QAAQ,CAAC,CAAA;AACtB,IAAA,MAAM,QAAQ,IAAK,CAAA,YAAA,CAAc,OAAQ,CAAA,CAAC,GAAW,GAAG,CAAA;AAExD,IAAO,OAAA;AAAA,MACL,aAAa,MAAM,IAAA,CAAK,qBAAsB,CAAA,IAAA,EAAM,UAAU,IAAI,CAAA;AAAA,MAClE;AAAA,KACF;AAAA;AACF,EAEA,MAAM,aAAA,CACJ,QACA,EAAA,EAAA,EACA,OAC4B,EAAA;AAC5B,IAAM,MAAA,KAAA,GAAQ,KAAK,uBAAwB,EAAA;AAC3C,IAAA,MAAM,OAAO,MAAM,KAAA,CAAM,KAAM,CAAA,gBAAA,EAAkB,KAAK,EAAE,CAAA;AACxD,IAAI,IAAA,IAAA,CAAK,WAAW,CAAG,EAAA;AACrB,MAAO,OAAA,IAAA;AAAA;AAET,IAAA,OAAA,CACE,MAAM,IAAK,CAAA,qBAAA;AAAA,MACT,CAAC,IAAK,CAAA,CAAC,CAAwB,CAAA;AAAA,MAC/B,QAAA;AAAA,MACA;AAAA,OAEF,CAAC,CAAA;AAAA;AACL,EAEA,MAAM,iBAAiB,OAQC,EAAA;AACtB,IAAM,MAAA,EAAE,UAAU,KAAO,EAAA,WAAA,EAAa,SAAS,MAAQ,EAAA,WAAA,EAAa,MAClE,GAAA,OAAA;AAEF,IAAM,MAAA,WAAA,GAAc,MAAM,IAAA,CAAK,EAC5B,CAAA,MAAA;AAAA,MACC;AAAA,QACE,KAAO,EAAA,QAAA;AAAA,QACP,KAAA;AAAA,QACA,WAAA;AAAA,QACA,OAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,CAAC,IAAI;AAAA,KAEN,CAAA,IAAA,CAAK,aAAa,CAAA,CAClB,UAAU,GAAG,CAAA;AAEhB,IAAA,MAAM,IAAK,CAAA,iBAAA;AAAA,MACT,cAAA;AAAA,MACA,WAAe,IAAA,EAAA;AAAA,MACf,UAAU,EAAC;AAAA,MACX,WAAA,CAAY,CAAC,CAAE,CAAA,EAAA;AAAA,MACf;AAAA,KACF;AAEA,IACE,OAAA,CAAA,MAAM,IAAK,CAAA,qBAAA,CAAsB,CAAC,WAAA,CAAY,CAAC,CAAC,CAAG,EAAA,QAAA,EAAU,IAAI,CAAA,EACjE,CAAC,CAAA;AAAA;AACL,EAEA,MAAM,iBAAiB,OAQQ,EAAA;AAC7B,IAAM,MAAA,EAAE,IAAI,QAAU,EAAA,KAAA,EAAO,aAAa,MAAQ,EAAA,WAAA,EAAa,MAC7D,GAAA,OAAA;AAEF,IAAM,MAAA,IAAA,GAAO,MAAM,IAAA,CAAK,EAAG,CAAA,aAAa,CACrC,CAAA,KAAA,CAAM,IAAM,EAAA,GAAA,EAAK,EAAE,CAAA,CACnB,MAAO,CAAA;AAAA,MACN,KAAA;AAAA,MACA,WAAA;AAAA,MACA;AAAA,KACD,CACA,CAAA,SAAA,CAAU,GAAG,CAAA;AAEhB,IAAA,IAAI,CAAC,IAAA,IAAQ,IAAK,CAAA,MAAA,KAAW,CAAG,EAAA;AAC9B,MAAO,OAAA,IAAA;AAAA;AAGT,IAAA,MAAM,IAAK,CAAA,iBAAA;AAAA,MACT,cAAA;AAAA,MACA,WAAe,IAAA,EAAA;AAAA,MACf,UAAU,EAAC;AAAA,MACX,EAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAQ,OAAA,CAAA,MAAM,IAAK,CAAA,qBAAA,CAAsB,CAAC,IAAA,CAAK,CAAC,CAAC,CAAG,EAAA,QAAA,EAAU,IAAI,CAAA,EAAG,CAAC,CAAA;AAAA;AACxE,EAEA,MAAM,iBAAiB,EAA8B,EAAA;AACnD,IAAM,MAAA,IAAA,GAAO,MAAM,IAAA,CAAK,EAAG,CAAA,aAAa,CAAE,CAAA,KAAA,CAAM,IAAM,EAAA,GAAA,EAAK,EAAE,CAAA,CAAE,MAAO,EAAA;AACtE,IAAA,OAAO,IAAO,GAAA,CAAA;AAAA;AAChB,EAEA,MAAM,kBACJ,CAAA,QAAA,EACA,OACuD,EAAA;AACvD,IAAA,MAAM,UAAU,MAAM,IAAA,CAAK,eAAe,QAAU,EAAA,OAAA,IAAW,EAAE,CAAA;AACjE,IAAA,OAAO,EAAE,WAAa,EAAA,OAAA,CAAQ,WAAa,EAAA,KAAA,EAAO,QAAQ,KAAM,EAAA;AAAA;AAClE,EAEA,MAAM,WACJ,CAAA,YAAA,EACA,MACwB,EAAA;AACxB,IAAA,MAAM,IAAO,GAAA,MAAM,IAAK,CAAA,EAAA,CAAG,kBAAkB,CAC1C,CAAA,KAAA,CAAM,eAAiB,EAAA,YAAY,CACnC,CAAA,KAAA,CAAM,SAAW,EAAA,MAAM,EACvB,KAAM,EAAA;AAET,IAAA,IAAI,CAAC,IAAM,EAAA;AACT,MAAO,OAAA,IAAA;AAAA;AAGT,IAAA,OAAO,IAAK,CAAA,IAAA;AAAA;AACd,EAEA,MAAM,mBACJ,YACoC,EAAA;AACpC,IAAA,MAAM,IAAO,GAAA,MAAM,IAAK,CAAA,EAAA,CAAG,kBAAkB,CAC1C,CAAA,KAAA,CAAM,eAAiB,EAAA,YAAY,CACnC,CAAA,OAAA,CAAQ,MAAQ,EAAA,KAAK,EACrB,KAAM,EAAA;AAET,IAAO,OAAA,IAAA,GAAO,EAAE,MAAQ,EAAA,IAAA,CAAK,SAAS,IAAM,EAAA,IAAA,CAAK,MAAS,GAAA,IAAA;AAAA;AAC5D,EAEA,MAAM,sBACJ,YACoC,EAAA;AACpC,IAAA,MAAM,IAAO,GAAA,MAAM,IAAK,CAAA,EAAA,CAAG,kBAAkB,CAC1C,CAAA,KAAA,CAAM,eAAiB,EAAA,YAAY,CACnC,CAAA,OAAA,CAAQ,MAAQ,EAAA,MAAM,EACtB,KAAM,EAAA;AAET,IAAO,OAAA,IAAA,GAAO,EAAE,MAAQ,EAAA,IAAA,CAAK,SAAS,IAAM,EAAA,IAAA,CAAK,MAAS,GAAA,IAAA;AAAA;AAC5D,EAEA,MAAM,mBACJ,CAAA,YAAA,EACA,MACoC,EAAA;AACpC,IAAA,MAAM,eAAkB,GAAA,MAAM,IAAK,CAAA,WAAA,CAAY,cAAc,MAAM,CAAA;AACnE,IAAA,IAAI,oBAAoB,IAAM,EAAA;AAC5B,MAAO,OAAA,IAAA;AAAA;AAGT,IAAA,MAAM,OAAO,MAAM,IAAA,CAAK,GAAG,kBAAkB,CAAA,CAC1C,MAAM,eAAiB,EAAA,YAAY,EACnC,KAAM,CAAA,MAAA,EAAQ,KAAK,eAAe,CAAA,CAClC,QAAQ,MAAQ,EAAA,KAAK,EACrB,KAAM,EAAA;AAET,IAAO,OAAA,IAAA,GAAO,EAAE,MAAQ,EAAA,IAAA,CAAK,SAAS,IAAM,EAAA,IAAA,CAAK,MAAS,GAAA,IAAA;AAAA;AAC5D,EAEA,MAAM,uBACJ,CAAA,YAAA,EACA,MACoC,EAAA;AACpC,IAAA,MAAM,eAAkB,GAAA,MAAM,IAAK,CAAA,WAAA,CAAY,cAAc,MAAM,CAAA;AACnE,IAAA,IAAI,oBAAoB,IAAM,EAAA;AAC5B,MAAO,OAAA,IAAA;AAAA;AAGT,IAAA,MAAM,OAAO,MAAM,IAAA,CAAK,GAAG,kBAAkB,CAAA,CAC1C,MAAM,eAAiB,EAAA,YAAY,EACnC,KAAM,CAAA,MAAA,EAAQ,KAAK,eAAe,CAAA,CAClC,QAAQ,MAAQ,EAAA,MAAM,EACtB,KAAM,EAAA;AAET,IAAO,OAAA,IAAA,GAAO,EAAE,MAAQ,EAAA,IAAA,CAAK,SAAS,IAAM,EAAA,IAAA,CAAK,MAAS,GAAA,IAAA;AAAA;AAC5D,EAEA,MAAM,cAAA,CACJ,YACA,EAAA,MAAA,EACA,IACe,EAAA;AACf,IAAA,MAAM,IAAK,CAAA,EAAA,CAAG,kBAAkB,CAAA,CAC7B,MAAM,eAAiB,EAAA,YAAY,CACnC,CAAA,KAAA,CAAM,WAAW,MAAM,CAAA,CACvB,MAAO,CAAA,EAAE,MAAM,CAAA;AAAA;AACpB,EAEA,MAAM,mBAAA,CACJ,QACA,EAAA,EAAA,EACA,QACA,OAC4B,EAAA;AAC5B,IAAM,MAAA,IAAA,CAAK,GACR,MAAO,CAAA;AAAA,MACN,YAAc,EAAA,EAAA;AAAA,MACd;AAAA,KACD,CACA,CAAA,IAAA,CAAK,kBAAkB,CAAA;AAC1B,IAAM,MAAA,IAAA,CAAK,EAAG,CAAA,aAAa,CAAE,CAAA,KAAA,CAAM,MAAM,EAAE,CAAA,CAAE,SAAU,CAAA,YAAA,EAAc,CAAC,CAAA;AACtE,IAAA,OAAO,IAAK,CAAA,aAAA,CAAc,QAAU,EAAA,EAAA,EAAI,OAAO,CAAA;AAAA;AACjD,EAEA,MAAM,wBAAA,CACJ,QACA,EAAA,EAAA,EACA,QACA,OAC4B,EAAA;AAC5B,IAAA,MAAM,IAAO,GAAA,MAAM,IAAK,CAAA,EAAA,CAAG,kBAAkB,CAC1C,CAAA,KAAA,CAAM,cAAgB,EAAA,EAAE,CACxB,CAAA,KAAA,CAAM,QAAU,EAAA,MAAM,EACtB,MAAO,EAAA;AACV,IAAA,IAAI,OAAO,CAAG,EAAA;AACZ,MAAM,MAAA,IAAA,CAAK,EAAG,CAAA,aAAa,CAAE,CAAA,KAAA,CAAM,MAAM,EAAE,CAAA,CAAE,SAAU,CAAA,YAAA,EAAc,CAAC,CAAA;AAAA;AAExE,IAAA,OAAO,IAAK,CAAA,aAAA,CAAc,QAAU,EAAA,EAAA,EAAI,OAAO,CAAA;AAAA;AACjD,EAEA,MAAM,sBAAsB,YAAyC,EAAA;AACnE,IAAM,MAAA,KAAA,GAAQ,MAAM,IAAA,CAAK,EAAG,CAAA,kBAAkB,CAC3C,CAAA,KAAA,CAAM,cAAgB,EAAA,YAAY,CAClC,CAAA,MAAA,CAAO,SAAS,CAAA;AACnB,IAAA,OAAO,KAAM,CAAA,GAAA,CAAI,CAAQ,IAAA,KAAA,IAAA,CAAK,OAAO,CAAA;AAAA;AACvC,EAEA,MAAM,gBACJ,CAAA,QAAA,EACA,YACkB,EAAA;AAClB,IAAM,MAAA,IAAA,CAAK,GACR,MAAO,CAAA;AAAA,MACN,OAAS,EAAA,QAAA;AAAA,MACT;AAAA,KACD,CACA,CAAA,IAAA,CAAK,kBAAkB,CAAA;AAC1B,IAAO,OAAA,IAAA;AAAA;AACT,EAEA,MAAM,kBACJ,CAAA,QAAA,EACA,YACkB,EAAA;AAClB,IAAA,MAAM,IAAK,CAAA,EAAA,CAAG,kBAAkB,CAAA,CAC7B,KAAM,CAAA,SAAA,EAAW,QAAQ,CAAA,CACzB,KAAM,CAAA,cAAA,EAAgB,YAAY,CAAA,CAClC,MAAO,EAAA;AACV,IAAO,OAAA,IAAA;AAAA;AACT,EAEA,MAAM,kBAAkB,GAA6C,EAAA;AACnE,IAAI,IAAA,GAAA,CAAI,WAAW,CAAG,EAAA;AACpB,MAAA,2BAAW,GAAI,EAAA;AAAA;AAEjB,IAAA,MAAM,YAAY,MAAM,IAAA,CAAK,EAAG,CAAA,kBAAkB,EAC/C,MAAO,CAAA,cAAc,CACrB,CAAA,KAAA,CAAM,YAAY,CAClB,CAAA,OAAA,CAAQ,gBAAgB,GAAG,CAAA,CAC3B,QAAQ,cAAc,CAAA;AAEzB,IAAM,MAAA,MAAA,uBAAa,GAAoB,EAAA;AACvC,IAAU,SAAA,CAAA,OAAA,CAAQ,CAAC,CAAW,KAAA;AAC5B,MAAA,MAAA,CAAO,IAAI,CAAE,CAAA,YAAA,EAAc,KAAK,YAAa,CAAA,CAAA,CAAE,KAAK,CAAC,CAAA;AAAA,KACtD,CAAA;AACD,IAAO,OAAA,MAAA;AAAA;AACT,EAEA,MAAc,qBAAA,CACZ,IACA,EAAA,QAAA,EACA,OACuB,EAAA;AACvB,IAAI,IAAA,IAAA,CAAK,WAAW,CAAG,EAAA;AACrB,MAAA,OAAO,EAAC;AAAA;AAGV,IAAA,MAAM,aAAgB,GAAA,IAAA,CAAK,GAAI,CAAA,CAAA,CAAA,KAAK,EAAE,EAAE,CAAA;AACxC,IAAM,MAAA;AAAA,MACJ,WAAA;AAAA,MACA,YAAe,GAAA,IAAA;AAAA,MACf,cAAiB,GAAA;AAAA,KACnB,GAAI,WAAW,EAAC;AAEhB,IAAM,MAAA,CAAC,OAAO,WAAa,EAAA,SAAA,EAAW,OAAO,CAAI,GAAA,MAAM,QAAQ,GAAI,CAAA;AAAA,MACjE,YAAgB,IAAA,IAAA,CAAK,UACjB,GAAA,IAAA,CAAK,UAAW,CAAA,QAAA;AAAA,QACd,QAAA;AAAA,QACA,EAAE,iBAAiB,IAAK,EAAA;AAAA,QACxB,WAAA;AAAA,QACA;AAAA,UACE,YAAY,OAAS,EAAA,UAAA;AAAA,UACrB,eAAiB,EAAA,KAAA;AAAA,UACjB,cAAgB,EAAA,KAAA;AAAA,UAChB,kBAAoB,EAAA,KAAA;AAAA,UACpB,YAAc,EAAA,KAAA;AAAA,UACd,YAAc,EAAA,KAAA;AAAA,UACd,gBAAgB,cAAkB,IAAA,KAAA;AAAA,UAClC,kBAAoB,EAAA,IAAA;AAAA,UACpB;AAAA;AACF,OAEF,GAAA,EAAE,KAAO,EAAA,EAAG,EAAA;AAAA,MAChB,IAAK,CAAA,gBAAA,CAAiB,cAAe,CAAA,aAAA,EAAe,cAAc,CAAA;AAAA,MAClE,IAAA,CAAK,kBAAkB,aAAa,CAAA;AAAA,MACpC,cACI,GAAA,IAAA,CAAK,EAAG,CAAA,aAAa,EAClB,QAAS,CAAA,MAAA,EAAQ,mBAAqB,EAAA,SAAS,CAC/C,CAAA,QAAA,CAAS,WAAa,EAAA,iBAAA,EAAmB,SAAS,CAClD,CAAA,QAAA;AAAA,QACC,kBAAA;AAAA,QACA,yBAAA;AAAA,QACA;AAAA,OACF,CACC,QAAQ,+BAAiC,EAAA,aAAa,EACtD,MAAO,CAAA,+BAAA,EAAiC,uBAAuB,CAClE,GAAA,KAAA;AAAA,KACL,CAAA;AAED,IAAM,MAAA,QAAA,uBAAe,GAAmB,EAAA;AACxC,IAAM,KAAA,CAAA,KAAA,EAAO,OAAQ,CAAA,CAAC,CAAW,KAAA;AAC/B,MAAA,IAAI,EAAE,aAAiB,IAAA,KAAA,CAAM,OAAQ,CAAA,CAAA,CAAE,aAAa,CAAG,EAAA;AACrD,QAAE,CAAA,CAAA,aAAA,CAAc,OAAQ,CAAA,CAAC,YAAyB,KAAA;AAChD,UAAA,MAAM,EAAK,GAAA,QAAA,CAAS,GAAI,CAAA,YAAY,KAAK,EAAC;AAC1C,UAAA,EAAA,CAAG,KAAK,CAAC,CAAA;AACT,UAAS,QAAA,CAAA,GAAA,CAAI,cAAc,EAAE,CAAA;AAAA,SAC9B,CAAA;AAAA;AACH,KACD,CAAA;AAED,IAAM,MAAA,cAAA,GAAiB,WAAe,oBAAA,IAAI,GAAsB,EAAA;AAEhE,IAAM,MAAA,YAAA,GAAe,SAAa,oBAAA,IAAI,GAAoB,EAAA;AAE1D,IAAM,MAAA,UAAA,uBAAiB,GAAsB,EAAA;AAC7C,IAAS,OAAA,EAAA,OAAA,CAAQ,CAAC,CAAW,KAAA;AAC3B,MAAA,MAAM,KAAK,UAAW,CAAA,GAAA,CAAI,CAAE,CAAA,YAAY,KAAK,EAAC;AAC9C,MAAG,EAAA,CAAA,IAAA,CAAK,EAAE,SAAS,CAAA;AACnB,MAAW,UAAA,CAAA,GAAA,CAAI,CAAE,CAAA,YAAA,EAAc,EAAE,CAAA;AAAA,KAClC,CAAA;AAED,IAAO,OAAA,IAAA,CAAK,IAAI,CAAO,GAAA,KAAA;AACrB,MAAA,MAAM,kBAAkB,QAAS,CAAA,GAAA,CAAI,GAAI,CAAA,EAAE,KAAK,EAAC;AACjD,MAAA,MAAM,WAAWC,cAAQ,CAAA;AAAA,QACvB,GAAG,IAAI,GAAA,CAAI,eAAgB,CAAA,GAAA,CAAI,CAAC,CAAA,KAAW,CAAE,CAAA,QAAQ,CAAE,CAAA,IAAA,EAAM;AAAA,OAC9D,CAAA;AACD,MAAA,MAAM,OAAOA,cAAQ,CAAA;AAAA,QACnB,GAAG,IAAI,GAAA,CAAI,eAAgB,CAAA,GAAA,CAAI,CAAC,CAAA,KAAW,CAAE,CAAA,IAAI,CAAE,CAAA,IAAA,EAAM;AAAA,OAC1D,CAAA;AAED,MAAO,OAAA;AAAA,QACL,IAAI,GAAI,CAAA,EAAA;AAAA,QACR,OAAO,GAAI,CAAA,KAAA;AAAA,QACX,OAAO,GAAI,CAAA,KAAA;AAAA,QACX,aAAa,GAAI,CAAA,WAAA;AAAA,QACjB,SAAS,GAAI,CAAA,OAAA;AAAA,QACb,KAAO,EAAA,eAAA;AAAA,QACP,aAAa,GAAI,CAAA,WAAA;AAAA,QACjB,UAAY,EAAA,IAAA,CAAK,YAAa,CAAA,GAAA,CAAI,UAAU,CAAA;AAAA,QAC5C,QAAA;AAAA,QACA,IAAA;AAAA,QACA,QAAQ,cAAe,CAAA,GAAA,CAAI,GAAI,CAAA,EAAE,KAAK,EAAC;AAAA,QACvC,SAAW,EAAA,YAAA,CAAa,GAAI,CAAA,GAAA,CAAI,EAAE,CAAK,IAAA,CAAA;AAAA,QACvC,OAAS,EAAA,UAAA,CAAW,GAAI,CAAA,GAAA,CAAI,EAAE;AAAA,OAChC;AAAA,KACD,CAAA;AAAA;AACH,EAEQ,uBAA0B,GAAA;AAChC,IAAO,OAAA,IAAA,CAAK,GAAwB,aAAa,CAAA,CAC9C,OAAO,eAAe,CAAA,CACtB,QAAQ,gBAAgB,CAAA;AAAA;AAE/B;;;;"}
|
|
1
|
+
{"version":3,"file":"CollectionsStore.cjs.js","sources":["../../../src/database/stores/CollectionsStore.ts"],"sourcesContent":["import {\n Collection,\n CollectionsQuery,\n} from '@drodil/backstage-plugin-qeta-common';\nimport {\n CollectionOptions,\n CollectionPostRank,\n Collections,\n} from '../QetaStore';\nimport { Knex } from 'knex';\nimport { compact } from 'lodash';\nimport { BaseStore } from './BaseStore';\nimport { AttachmentsStore } from './AttachmentsStore';\nimport { PostsStore } from './PostsStore';\n\nexport interface RawCollectionEntity {\n id: number;\n title: string;\n description: string;\n created: Date;\n owner: string;\n headerImage: string;\n postsCount: number | string;\n questionsCount: number | string;\n articlesCount: number | string;\n linksCount: number | string;\n followerCount: number | string;\n}\n\nexport class CollectionsStore extends BaseStore {\n constructor(\n protected readonly db: Knex,\n private readonly postsStore: PostsStore,\n private readonly attachmentsStore: AttachmentsStore,\n ) {\n super(db);\n }\n\n async getCollections(\n user_ref: string,\n options: CollectionsQuery,\n opts?: CollectionOptions,\n ): Promise<Collections> {\n const query = this.getCollectionsBaseQuery();\n\n if (options.searchQuery) {\n this.applySearchQuery(\n query,\n ['collections.title', 'collections.description'],\n options.searchQuery,\n );\n }\n\n if (opts?.filters) {\n this.parseFilter(opts.filters, query, this.db, 'collection');\n }\n\n if (options.owner) {\n query.where('collections.owner', '=', options.owner);\n }\n\n const totalQuery = query.clone();\n\n if (options.orderBy) {\n query.orderBy(options.orderBy, options.order ? options.order : 'desc');\n }\n\n if (options.limit) {\n query.limit(options.limit);\n }\n\n if (options.offset) {\n query.offset(options.offset);\n }\n\n const results = await Promise.all([\n query,\n this.db(totalQuery.as('totalQuery')).count('* as CNT').first(),\n ]);\n\n const rows = results[0] as RawCollectionEntity[];\n const total = this.mapToInteger((results[1] as any)?.CNT);\n\n return {\n collections: await this.mapCollectionEntities(rows, user_ref, opts),\n total,\n };\n }\n\n async getCollection(\n user_ref: string,\n id: number,\n options?: CollectionOptions,\n ): Promise<Collection | null> {\n const query = this.getCollectionsBaseQuery();\n const rows = await query.where('collections.id', '=', id);\n if (rows.length === 0) {\n return null;\n }\n return (\n await this.mapCollectionEntities(\n [rows[0] as RawCollectionEntity],\n user_ref,\n options,\n )\n )[0];\n }\n\n async createCollection(options: {\n user_ref: string;\n title: string;\n description?: string;\n created: Date;\n images?: number[];\n headerImage?: string;\n opts?: CollectionOptions;\n }): Promise<Collection> {\n const { user_ref, title, description, created, images, headerImage, opts } =\n options as any;\n\n const collections = await this.db\n .insert(\n {\n owner: user_ref,\n title,\n description,\n created,\n headerImage,\n },\n ['id'],\n )\n .into('collections')\n .returning('*');\n\n await this.updateAttachments(\n 'collectionId',\n description ?? '',\n images ?? [],\n collections[0].id,\n headerImage,\n );\n\n return (\n await this.mapCollectionEntities([collections[0]], user_ref, opts)\n )[0];\n }\n\n async updateCollection(options: {\n id: number;\n user_ref: string;\n title: string;\n description?: string;\n images?: number[];\n headerImage?: string;\n opts?: CollectionOptions;\n }): Promise<Collection | null> {\n const { id, user_ref, title, description, images, headerImage, opts } =\n options;\n\n const rows = await this.db('collections')\n .where('id', '=', id)\n .update({\n title,\n description,\n headerImage,\n })\n .returning('*');\n\n if (!rows || rows.length === 0) {\n return null;\n }\n\n await this.updateAttachments(\n 'collectionId',\n description ?? '',\n images ?? [],\n id,\n headerImage,\n );\n\n return (await this.mapCollectionEntities([rows[0]], user_ref, opts))[0];\n }\n\n async deleteCollection(id: number): Promise<boolean> {\n const rows = await this.db('collections').where('id', '=', id).delete();\n return rows > 0;\n }\n\n async getUserCollections(\n user_ref: string,\n options?: CollectionOptions,\n ): Promise<{ collections: Collection[]; count: number }> {\n const results = await this.getCollections(user_ref, options || {});\n return { collections: results.collections, count: results.total };\n }\n\n async getPostRank(\n collectionId: number,\n postId: number,\n ): Promise<number | null> {\n const post = await this.db('collection_posts')\n .where('collection_id', collectionId)\n .where('post_id', postId)\n .first();\n\n if (!post) {\n return null;\n }\n\n return post.rank;\n }\n\n async getTopRankedPostId(\n collectionId: number,\n ): Promise<CollectionPostRank | null> {\n const post = await this.db('collection_posts')\n .where('collection_id', collectionId)\n .orderBy('rank', 'asc')\n .first();\n\n return post ? { postId: post.post_id, rank: post.rank } : null;\n }\n\n async getBottomRankedPostId(\n collectionId: number,\n ): Promise<CollectionPostRank | null> {\n const post = await this.db('collection_posts')\n .where('collection_id', collectionId)\n .orderBy('rank', 'desc')\n .first();\n\n return post ? { postId: post.post_id, rank: post.rank } : null;\n }\n\n async getNextRankedPostId(\n collectionId: number,\n postId: number,\n ): Promise<CollectionPostRank | null> {\n const currentPostRank = await this.getPostRank(collectionId, postId);\n if (currentPostRank === null) {\n return null;\n }\n\n const post = await this.db('collection_posts')\n .where('collection_id', collectionId)\n .where('rank', '>', currentPostRank)\n .orderBy('rank', 'asc')\n .first();\n\n return post ? { postId: post.post_id, rank: post.rank } : null;\n }\n\n async getPreviousRankedPostId(\n collectionId: number,\n postId: number,\n ): Promise<CollectionPostRank | null> {\n const currentPostRank = await this.getPostRank(collectionId, postId);\n if (currentPostRank === null) {\n return null;\n }\n\n const post = await this.db('collection_posts')\n .where('collection_id', collectionId)\n .where('rank', '<', currentPostRank)\n .orderBy('rank', 'desc')\n .first();\n\n return post ? { postId: post.post_id, rank: post.rank } : null;\n }\n\n async updatePostRank(\n collectionId: number,\n postId: number,\n rank: number,\n ): Promise<void> {\n await this.db('collection_posts')\n .where('collection_id', collectionId)\n .where('post_id', postId)\n .update({ rank });\n }\n\n async addPostToCollection(\n user_ref: string,\n id: number,\n postId: number,\n options?: CollectionOptions,\n ): Promise<Collection | null> {\n await this.db\n .insert({\n collectionId: id,\n postId,\n })\n .into('collection_posts');\n await this.db('collections').where('id', id).increment('postsCount', 1);\n return this.getCollection(user_ref, id, options);\n }\n\n async removePostFromCollection(\n user_ref: string,\n id: number,\n postId: number,\n options?: CollectionOptions,\n ): Promise<Collection | null> {\n const rows = await this.db('collection_posts')\n .where('collectionId', id)\n .where('postId', postId)\n .delete();\n if (rows > 0) {\n await this.db('collections').where('id', id).decrement('postsCount', 1);\n }\n return this.getCollection(user_ref, id, options);\n }\n\n async getUsersForCollection(collectionId: number): Promise<string[]> {\n const users = await this.db('user_collections')\n .where('collectionId', collectionId)\n .select('userRef');\n return users.map(user => user.userRef);\n }\n\n async followCollection(\n user_ref: string,\n collectionId: number,\n ): Promise<boolean> {\n await this.db\n .insert({\n userRef: user_ref,\n collectionId,\n })\n .into('user_collections');\n return true;\n }\n\n async unfollowCollection(\n user_ref: string,\n collectionId: number,\n ): Promise<boolean> {\n await this.db('user_collections')\n .where('userRef', user_ref)\n .where('collectionId', collectionId)\n .delete();\n return true;\n }\n\n async getFollowerCounts(ids: number[]): Promise<Map<number, number>> {\n if (ids.length === 0) {\n return new Map();\n }\n const followers = await this.db('user_collections')\n .select('collectionId')\n .count('* as count')\n .whereIn('collectionId', ids)\n .groupBy('collectionId');\n\n const result = new Map<number, number>();\n followers.forEach((f: any) => {\n result.set(f.collectionId, this.mapToInteger(f.count));\n });\n return result;\n }\n\n private async mapCollectionEntities(\n rows: RawCollectionEntity[],\n user_ref: string,\n options?: CollectionOptions,\n ): Promise<Collection[]> {\n if (rows.length === 0) {\n return [];\n }\n\n const collectionIds = rows.map(r => r.id);\n const {\n postFilters,\n includePosts = true,\n includeExperts = true,\n } = options ?? {};\n\n const [posts, attachments, followers, experts] = await Promise.all([\n includePosts && this.postsStore\n ? this.postsStore.getPosts(\n user_ref,\n { includeEntities: true },\n postFilters,\n {\n tagsFilter: options?.tagFilters,\n includeComments: false,\n includeAnswers: false,\n includeAttachments: false,\n includeVotes: false,\n includeTotal: false,\n includeExperts: includeExperts ?? false,\n includeCollections: true,\n collectionIds: collectionIds,\n },\n )\n : { posts: [] },\n this.attachmentsStore.getAttachments(collectionIds, 'collectionId'),\n this.getFollowerCounts(collectionIds),\n includeExperts\n ? this.db('tag_experts')\n .leftJoin('tags', 'tag_experts.tagId', 'tags.id')\n .leftJoin('post_tags', 'post_tags.tagId', 'tags.id')\n .leftJoin(\n 'collection_posts',\n 'collection_posts.postId',\n 'post_tags.postId',\n )\n .whereIn('collection_posts.collectionId', collectionIds)\n .select('collection_posts.collectionId', 'tag_experts.entityRef')\n : undefined,\n ]);\n\n const postsMap = new Map<number, any[]>();\n posts.posts?.forEach((p: any) => {\n if (p.collectionIds && Array.isArray(p.collectionIds)) {\n p.collectionIds.forEach((collectionId: number) => {\n const ps = postsMap.get(collectionId) || [];\n ps.push(p);\n postsMap.set(collectionId, ps);\n });\n }\n });\n\n const attachmentsMap = attachments ?? new Map<number, number[]>();\n\n const followersMap = followers ?? new Map<number, number>();\n\n const expertsMap = new Map<number, string[]>();\n experts?.forEach((e: any) => {\n const ps = expertsMap.get(e.collectionId) || [];\n ps.push(e.entityRef);\n expertsMap.set(e.collectionId, ps);\n });\n\n return rows.map(val => {\n const collectionPosts = postsMap.get(val.id) || [];\n const entities = compact([\n ...new Set(collectionPosts.map((p: any) => p.entities).flat()),\n ]);\n const tags = compact([\n ...new Set(collectionPosts.map((p: any) => p.tags).flat()),\n ]);\n\n return {\n id: val.id,\n title: val.title,\n owner: val.owner,\n description: val.description,\n created: val.created as Date,\n posts: collectionPosts,\n headerImage: val.headerImage,\n postsCount: this.mapToInteger(val.postsCount),\n questionsCount: this.mapToInteger(val.questionsCount),\n articlesCount: this.mapToInteger(val.articlesCount),\n linksCount: this.mapToInteger(val.linksCount),\n entities: entities as string[],\n tags: tags as string[],\n images: attachmentsMap.get(val.id) || [],\n followers: followersMap.get(val.id) || 0,\n experts: expertsMap.get(val.id),\n };\n });\n }\n\n private getCollectionsBaseQuery() {\n const questionsCount = this.db('collection_posts')\n .leftJoin('posts', 'collection_posts.postId', 'posts.id')\n .where('collection_posts.collectionId', this.db.ref('collections.id'))\n .where('posts.type', 'question')\n .count('*')\n .as('questionsCount');\n\n const articlesCount = this.db('collection_posts')\n .leftJoin('posts', 'collection_posts.postId', 'posts.id')\n .where('collection_posts.collectionId', this.db.ref('collections.id'))\n .where('posts.type', 'article')\n .count('*')\n .as('articlesCount');\n\n const linksCount = this.db('collection_posts')\n .leftJoin('posts', 'collection_posts.postId', 'posts.id')\n .where('collection_posts.collectionId', this.db.ref('collections.id'))\n .where('posts.type', 'link')\n .count('*')\n .as('linksCount');\n\n const followerCount = this.db('user_collections')\n .where('user_collections.collectionId', this.db.ref('collections.id'))\n .count('*')\n .as('followerCount');\n\n return this.db<RawCollectionEntity>('collections')\n .select(\n 'collections.*',\n questionsCount,\n articlesCount,\n linksCount,\n followerCount,\n )\n .groupBy('collections.id');\n }\n}\n"],"names":["BaseStore","compact"],"mappings":"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"}
|
|
@@ -35,6 +35,9 @@ class EntitiesStore extends BaseStore.BaseStore {
|
|
|
35
35
|
id: entity.id,
|
|
36
36
|
entityRef: entity.entity_ref,
|
|
37
37
|
postsCount: this.mapToInteger(entity.postsCount),
|
|
38
|
+
questionsCount: this.mapToInteger(entity.questionsCount),
|
|
39
|
+
articlesCount: this.mapToInteger(entity.articlesCount),
|
|
40
|
+
linksCount: this.mapToInteger(entity.linksCount),
|
|
38
41
|
followerCount: this.mapToInteger(entity.followerCount)
|
|
39
42
|
};
|
|
40
43
|
})
|
|
@@ -50,6 +53,9 @@ class EntitiesStore extends BaseStore.BaseStore {
|
|
|
50
53
|
id: rows[0].id,
|
|
51
54
|
entityRef: rows[0].entity_ref,
|
|
52
55
|
postsCount: this.mapToInteger(rows[0].postsCount),
|
|
56
|
+
questionsCount: this.mapToInteger(rows[0].questionsCount),
|
|
57
|
+
articlesCount: this.mapToInteger(rows[0].articlesCount),
|
|
58
|
+
linksCount: this.mapToInteger(rows[0].linksCount),
|
|
53
59
|
followerCount: this.mapToInteger(rows[0].followerCount)
|
|
54
60
|
};
|
|
55
61
|
}
|
|
@@ -139,8 +145,19 @@ class EntitiesStore extends BaseStore.BaseStore {
|
|
|
139
145
|
const entityId = this.db.ref("entities.id");
|
|
140
146
|
const entityRef = this.db.ref("entities.entity_ref");
|
|
141
147
|
const postsCount = this.db("post_entities").where("post_entities.entityId", entityId).count("*").as("postsCount");
|
|
148
|
+
const questionsCount = this.db("post_entities").leftJoin("posts", "post_entities.postId", "posts.id").where("post_entities.entityId", entityId).where("posts.type", "question").count("*").as("questionsCount");
|
|
149
|
+
const articlesCount = this.db("post_entities").leftJoin("posts", "post_entities.postId", "posts.id").where("post_entities.entityId", entityId).where("posts.type", "article").count("*").as("articlesCount");
|
|
150
|
+
const linksCount = this.db("post_entities").leftJoin("posts", "post_entities.postId", "posts.id").where("post_entities.entityId", entityId).where("posts.type", "link").count("*").as("linksCount");
|
|
142
151
|
const followerCount = this.db("user_entities").where("user_entities.entityRef", entityRef).count("*").as("followerCount");
|
|
143
|
-
return this.db("entities").rightJoin("post_entities", "entities.id", "post_entities.entityId").orderBy("postsCount", "desc").select(
|
|
152
|
+
return this.db("entities").rightJoin("post_entities", "entities.id", "post_entities.entityId").orderBy("postsCount", "desc").select(
|
|
153
|
+
"id",
|
|
154
|
+
"entity_ref",
|
|
155
|
+
postsCount,
|
|
156
|
+
questionsCount,
|
|
157
|
+
articlesCount,
|
|
158
|
+
linksCount,
|
|
159
|
+
followerCount
|
|
160
|
+
).groupBy("entities.id");
|
|
144
161
|
}
|
|
145
162
|
}
|
|
146
163
|
|