@drodil/backstage-plugin-qeta-backend 3.52.6 → 3.53.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.
@@ -107,38 +107,38 @@ class CollectionsStore extends BaseStore.BaseStore {
107
107
  return { collections: results.collections, count: results.total };
108
108
  }
109
109
  async getPostRank(collectionId, postId) {
110
- const post = await this.db("collection_posts").where("collection_id", collectionId).where("post_id", postId).first();
110
+ const post = await this.db("collection_posts").where("collectionId", collectionId).where("postId", postId).first();
111
111
  if (!post) {
112
112
  return null;
113
113
  }
114
114
  return post.rank;
115
115
  }
116
116
  async getTopRankedPostId(collectionId) {
117
- const post = await this.db("collection_posts").where("collection_id", collectionId).orderBy("rank", "asc").first();
118
- return post ? { postId: post.post_id, rank: post.rank } : null;
117
+ const post = await this.db("collection_posts").where("collectionId", collectionId).orderBy("rank", "asc").first();
118
+ return post ? { postId: post.postId, rank: post.rank } : null;
119
119
  }
120
120
  async getBottomRankedPostId(collectionId) {
121
- const post = await this.db("collection_posts").where("collection_id", collectionId).orderBy("rank", "desc").first();
122
- return post ? { postId: post.post_id, rank: post.rank } : null;
121
+ const post = await this.db("collection_posts").where("collectionId", collectionId).orderBy("rank", "desc").first();
122
+ return post ? { postId: post.postId, rank: post.rank } : null;
123
123
  }
124
124
  async getNextRankedPostId(collectionId, postId) {
125
125
  const currentPostRank = await this.getPostRank(collectionId, postId);
126
126
  if (currentPostRank === null) {
127
127
  return null;
128
128
  }
129
- const post = await this.db("collection_posts").where("collection_id", collectionId).where("rank", ">", currentPostRank).orderBy("rank", "asc").first();
130
- return post ? { postId: post.post_id, rank: post.rank } : null;
129
+ const post = await this.db("collection_posts").where("collectionId", collectionId).where("rank", ">", currentPostRank).orderBy("rank", "asc").first();
130
+ return post ? { postId: post.postId, rank: post.rank } : null;
131
131
  }
132
132
  async getPreviousRankedPostId(collectionId, postId) {
133
133
  const currentPostRank = await this.getPostRank(collectionId, postId);
134
134
  if (currentPostRank === null) {
135
135
  return null;
136
136
  }
137
- const post = await this.db("collection_posts").where("collection_id", collectionId).where("rank", "<", currentPostRank).orderBy("rank", "desc").first();
138
- return post ? { postId: post.post_id, rank: post.rank } : null;
137
+ const post = await this.db("collection_posts").where("collectionId", collectionId).where("rank", "<", currentPostRank).orderBy("rank", "desc").first();
138
+ return post ? { postId: post.postId, rank: post.rank } : null;
139
139
  }
140
140
  async updatePostRank(collectionId, postId, rank) {
141
- await this.db("collection_posts").where("collection_id", collectionId).where("post_id", postId).update({ rank });
141
+ await this.db("collection_posts").where("collectionId", collectionId).where("postId", postId).update({ rank });
142
142
  }
143
143
  async addPostToCollection(user_ref, id, postId, options) {
144
144
  await this.db.insert({
@@ -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 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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"}
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('collectionId', collectionId)\n .where('postId', 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('collectionId', collectionId)\n .orderBy('rank', 'asc')\n .first();\n\n return post ? { postId: post.postId, 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('collectionId', collectionId)\n .orderBy('rank', 'desc')\n .first();\n\n return post ? { postId: post.postId, 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('collectionId', collectionId)\n .where('rank', '>', currentPostRank)\n .orderBy('rank', 'asc')\n .first();\n\n return post ? { postId: post.postId, 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('collectionId', collectionId)\n .where('rank', '<', currentPostRank)\n .orderBy('rank', 'desc')\n .first();\n\n return post ? { postId: post.postId, 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('collectionId', collectionId)\n .where('postId', 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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@drodil/backstage-plugin-qeta-backend",
3
- "version": "3.52.6",
3
+ "version": "3.53.0",
4
4
  "description": "Backstage.io Q&A plugin backend",
5
5
  "keywords": [
6
6
  "backstage",
@@ -66,8 +66,8 @@
66
66
  "@backstage/plugin-permission-node": "^0.10.7",
67
67
  "@backstage/plugin-signals-node": "^0.1.27",
68
68
  "@backstage/types": "^1.2.2",
69
- "@drodil/backstage-plugin-qeta-common": "^3.52.6",
70
- "@drodil/backstage-plugin-qeta-node": "^3.52.6",
69
+ "@drodil/backstage-plugin-qeta-common": "^3.53.0",
70
+ "@drodil/backstage-plugin-qeta-node": "^3.53.0",
71
71
  "@smithy/node-http-handler": "^4.0.2",
72
72
  "@types/express": "*",
73
73
  "@types/mime-types": "^2.1.4",
@@ -105,9 +105,9 @@
105
105
  "@backstage/plugin-search-backend-module-pg": "^0.5.51",
106
106
  "@backstage/plugin-signals-backend": "^0.3.11",
107
107
  "@backstage/plugin-techdocs-backend": "^2.1.3",
108
- "@drodil/backstage-plugin-catalog-backend-module-qeta": "^3.52.6",
109
- "@drodil/backstage-plugin-qeta-backend-module-openai": "^3.52.6",
110
- "@drodil/backstage-plugin-search-backend-module-qeta": "^3.52.6",
108
+ "@drodil/backstage-plugin-catalog-backend-module-qeta": "^3.53.0",
109
+ "@drodil/backstage-plugin-qeta-backend-module-openai": "^3.53.0",
110
+ "@drodil/backstage-plugin-search-backend-module-qeta": "^3.53.0",
111
111
  "@types/sanitize-html": "^2.9.5",
112
112
  "@types/stopword": "^2.0.3",
113
113
  "@types/supertest": "^2.0.12",