@drodil/backstage-plugin-qeta-backend 3.55.5 → 3.55.7

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.
@@ -14,7 +14,8 @@ class EntitiesStore extends BaseStore.BaseStore {
14
14
  }
15
15
  const totalQuery = query.clone();
16
16
  if (options?.orderBy) {
17
- query.orderBy(options?.orderBy, options?.order || "desc");
17
+ const orderBy = options.orderBy === "entityRef" ? "entities.entity_ref" : options.orderBy;
18
+ query.orderBy(orderBy, options?.order || "desc");
18
19
  }
19
20
  if (options?.limit) {
20
21
  query.limit(options.limit);
@@ -1 +1 @@
1
- {"version":3,"file":"EntitiesStore.cjs.js","sources":["../../../src/database/stores/EntitiesStore.ts"],"sourcesContent":["import {\n EntitiesQuery,\n EntitiesResponse,\n EntityLinks,\n EntityResponse,\n UserEntitiesResponse,\n} from '@drodil/backstage-plugin-qeta-common';\nimport { Knex } from 'knex';\nimport { EntityLink } from '@backstage/catalog-model';\nimport { BaseStore } from './BaseStore';\nimport { RawTagEntity } from './TagsStore';\n\nexport class EntitiesStore extends BaseStore {\n constructor(protected readonly db: Knex) {\n super(db);\n }\n\n async getEntities(\n options?: { entityRefs?: string[] } & EntitiesQuery,\n ): Promise<EntitiesResponse> {\n const query = this.getEntitiesBaseQuery();\n if (options?.entityRefs) {\n query.whereIn('entities.entity_ref', options.entityRefs);\n }\n\n const totalQuery = query.clone();\n\n if (options?.orderBy) {\n query.orderBy(options?.orderBy, 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];\n const total = this.mapToInteger((results[1] as any)?.CNT);\n\n return {\n total,\n entities: rows.map((entity: any) => {\n return {\n id: entity.id,\n entityRef: entity.entity_ref,\n postsCount: this.mapToInteger(entity.postsCount),\n questionsCount: this.mapToInteger(entity.questionsCount),\n articlesCount: this.mapToInteger(entity.articlesCount),\n linksCount: this.mapToInteger(entity.linksCount),\n followerCount: this.mapToInteger(entity.followerCount),\n };\n }),\n };\n }\n\n async getEntity(entity_ref: string): Promise<EntityResponse | null> {\n const query = this.getEntitiesBaseQuery();\n const rows = await query.where('entity_ref', '=', entity_ref);\n if (rows.length === 0) {\n return null;\n }\n return {\n id: rows[0].id,\n entityRef: rows[0].entity_ref,\n postsCount: this.mapToInteger(rows[0].postsCount),\n questionsCount: this.mapToInteger(rows[0].questionsCount),\n articlesCount: this.mapToInteger(rows[0].articlesCount),\n linksCount: this.mapToInteger(rows[0].linksCount),\n followerCount: this.mapToInteger(rows[0].followerCount),\n };\n }\n\n async getUserEntities(user_ref: string): Promise<UserEntitiesResponse> {\n const entities = await this.db('user_entities')\n .where('userRef', user_ref)\n .select('entityRef');\n\n return {\n entityRefs: entities.map(e => e.entityRef),\n count: entities.length,\n };\n }\n\n async getUsersForEntities(entityRefs?: string[]): Promise<string[]> {\n if (!entityRefs || entityRefs.length === 0) {\n return [];\n }\n\n const users = await this.db('user_entities')\n .whereIn('entityRef', entityRefs)\n .select('userRef');\n return users.map(user => user.userRef);\n }\n\n async followEntity(user_ref: string, entityRef: string): Promise<boolean> {\n await this.db\n .insert({\n userRef: user_ref,\n entityRef: entityRef,\n })\n .into('user_entities');\n return true;\n }\n\n async unfollowEntity(user_ref: string, entityRef: string): Promise<boolean> {\n await this.db('user_entities')\n .where('userRef', user_ref)\n .where('entityRef', entityRef)\n .delete();\n return true;\n }\n\n async getEntityLinks(): Promise<EntityLinks[]> {\n const rows = await this.db('posts')\n .leftJoin('post_entities', 'posts.id', 'post_entities.postId')\n .leftJoin('entities', 'post_entities.entityId', 'entities.id')\n .whereNotNull('posts.url')\n .where('posts.status', 'active')\n .where('posts.type', 'link')\n .whereNotNull('entities.entity_ref')\n .select('entities.entity_ref as entityRef', 'posts.title', 'posts.url');\n\n const entityLinksMap = new Map<string, EntityLink[]>();\n\n for (const row of rows) {\n const entityRef = row.entityRef;\n const link: EntityLink = {\n title: row.title,\n url: row.url,\n type: 'qeta',\n };\n\n if (!entityLinksMap.has(entityRef)) {\n entityLinksMap.set(entityRef, []);\n }\n entityLinksMap.get(entityRef)!.push(link);\n }\n\n // Convert map to array format\n return Array.from(entityLinksMap.entries()).map(([entityRef, links]) => ({\n entityRef,\n links,\n }));\n }\n\n async getRelatedEntities(\n ids: number[],\n tableName: string = 'post_entities',\n columnName: string = 'postId',\n ): Promise<Map<number, string[]>> {\n if (ids.length === 0) {\n return new Map();\n }\n const rows = await this.db<RawTagEntity>('entities')\n .leftJoin(tableName, 'entities.id', `${tableName}.entityId`)\n .whereIn(`${tableName}.${columnName}`, ids)\n .select('entities.entity_ref', `${tableName}.${columnName} as entityId`);\n\n const result = new Map<number, string[]>();\n rows.forEach((row: any) => {\n const ps = result.get(row.entityId) || [];\n ps.push(row.entity_ref);\n result.set(row.entityId, ps);\n });\n return result;\n }\n\n async addEntities(\n id: number,\n entitiesInput?: string[],\n removeOld?: boolean,\n tableName: string = 'post_entities',\n columnName: string = 'postId',\n ) {\n if (removeOld) {\n await this.db(tableName).where(columnName, '=', id).delete();\n }\n\n const regex = /\\w+:\\w+\\/\\w+/;\n const entities = entitiesInput?.filter(input => input.match(regex));\n if (!entities || entities.length === 0) {\n return;\n }\n\n const existingEntities = await this.db('entities')\n .whereIn('entity_ref', entities)\n .returning('id')\n .select();\n const newEntities = entities.filter(\n t => !existingEntities.some(e => e.entity_ref === t),\n );\n const entityIds = (\n await Promise.all(\n [...new Set(newEntities)].map(\n async entity =>\n await this.db\n .insert({ entity_ref: entity })\n .into('entities')\n .returning('id')\n .onConflict('entity_ref')\n .ignore(),\n ),\n )\n )\n .flat()\n .map(entity => entity.id)\n .concat(existingEntities.map(c => c.id));\n\n await Promise.all(\n entityIds.map(async entityId => {\n await this.db\n .insert({ [columnName]: id, entityId })\n .into(tableName)\n .onConflict()\n .ignore();\n }),\n );\n }\n\n private getEntitiesBaseQuery() {\n const entityId = this.db.ref('entities.id');\n const entityRef = this.db.ref('entities.entity_ref');\n const postsCount = this.db('post_entities')\n .where('post_entities.entityId', entityId)\n .count('*')\n .as('postsCount');\n\n const questionsCount = this.db('post_entities')\n .leftJoin('posts', 'post_entities.postId', 'posts.id')\n .where('post_entities.entityId', entityId)\n .where('posts.type', 'question')\n .count('*')\n .as('questionsCount');\n\n const articlesCount = this.db('post_entities')\n .leftJoin('posts', 'post_entities.postId', 'posts.id')\n .where('post_entities.entityId', entityId)\n .where('posts.type', 'article')\n .count('*')\n .as('articlesCount');\n\n const linksCount = this.db('post_entities')\n .leftJoin('posts', 'post_entities.postId', 'posts.id')\n .where('post_entities.entityId', entityId)\n .where('posts.type', 'link')\n .count('*')\n .as('linksCount');\n\n const followerCount = this.db('user_entities')\n .where('user_entities.entityRef', entityRef)\n .count('*')\n .as('followerCount');\n\n return this.db('entities')\n .rightJoin('post_entities', 'entities.id', 'post_entities.entityId')\n .orderBy('postsCount', 'desc')\n .select(\n 'id',\n 'entity_ref',\n postsCount,\n questionsCount,\n articlesCount,\n linksCount,\n followerCount,\n )\n .groupBy('entities.id');\n }\n}\n"],"names":["BaseStore"],"mappings":"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"}
1
+ {"version":3,"file":"EntitiesStore.cjs.js","sources":["../../../src/database/stores/EntitiesStore.ts"],"sourcesContent":["import {\n EntitiesQuery,\n EntitiesResponse,\n EntityLinks,\n EntityResponse,\n UserEntitiesResponse,\n} from '@drodil/backstage-plugin-qeta-common';\nimport { Knex } from 'knex';\nimport { EntityLink } from '@backstage/catalog-model';\nimport { BaseStore } from './BaseStore';\nimport { RawTagEntity } from './TagsStore';\n\nexport class EntitiesStore extends BaseStore {\n constructor(protected readonly db: Knex) {\n super(db);\n }\n\n async getEntities(\n options?: { entityRefs?: string[] } & EntitiesQuery,\n ): Promise<EntitiesResponse> {\n const query = this.getEntitiesBaseQuery();\n if (options?.entityRefs) {\n query.whereIn('entities.entity_ref', options.entityRefs);\n }\n\n const totalQuery = query.clone();\n\n if (options?.orderBy) {\n const orderBy =\n options.orderBy === 'entityRef'\n ? 'entities.entity_ref'\n : options.orderBy;\n query.orderBy(orderBy, 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];\n const total = this.mapToInteger((results[1] as any)?.CNT);\n\n return {\n total,\n entities: rows.map((entity: any) => {\n return {\n id: entity.id,\n entityRef: entity.entity_ref,\n postsCount: this.mapToInteger(entity.postsCount),\n questionsCount: this.mapToInteger(entity.questionsCount),\n articlesCount: this.mapToInteger(entity.articlesCount),\n linksCount: this.mapToInteger(entity.linksCount),\n followerCount: this.mapToInteger(entity.followerCount),\n };\n }),\n };\n }\n\n async getEntity(entity_ref: string): Promise<EntityResponse | null> {\n const query = this.getEntitiesBaseQuery();\n const rows = await query.where('entity_ref', '=', entity_ref);\n if (rows.length === 0) {\n return null;\n }\n return {\n id: rows[0].id,\n entityRef: rows[0].entity_ref,\n postsCount: this.mapToInteger(rows[0].postsCount),\n questionsCount: this.mapToInteger(rows[0].questionsCount),\n articlesCount: this.mapToInteger(rows[0].articlesCount),\n linksCount: this.mapToInteger(rows[0].linksCount),\n followerCount: this.mapToInteger(rows[0].followerCount),\n };\n }\n\n async getUserEntities(user_ref: string): Promise<UserEntitiesResponse> {\n const entities = await this.db('user_entities')\n .where('userRef', user_ref)\n .select('entityRef');\n\n return {\n entityRefs: entities.map(e => e.entityRef),\n count: entities.length,\n };\n }\n\n async getUsersForEntities(entityRefs?: string[]): Promise<string[]> {\n if (!entityRefs || entityRefs.length === 0) {\n return [];\n }\n\n const users = await this.db('user_entities')\n .whereIn('entityRef', entityRefs)\n .select('userRef');\n return users.map(user => user.userRef);\n }\n\n async followEntity(user_ref: string, entityRef: string): Promise<boolean> {\n await this.db\n .insert({\n userRef: user_ref,\n entityRef: entityRef,\n })\n .into('user_entities');\n return true;\n }\n\n async unfollowEntity(user_ref: string, entityRef: string): Promise<boolean> {\n await this.db('user_entities')\n .where('userRef', user_ref)\n .where('entityRef', entityRef)\n .delete();\n return true;\n }\n\n async getEntityLinks(): Promise<EntityLinks[]> {\n const rows = await this.db('posts')\n .leftJoin('post_entities', 'posts.id', 'post_entities.postId')\n .leftJoin('entities', 'post_entities.entityId', 'entities.id')\n .whereNotNull('posts.url')\n .where('posts.status', 'active')\n .where('posts.type', 'link')\n .whereNotNull('entities.entity_ref')\n .select('entities.entity_ref as entityRef', 'posts.title', 'posts.url');\n\n const entityLinksMap = new Map<string, EntityLink[]>();\n\n for (const row of rows) {\n const entityRef = row.entityRef;\n const link: EntityLink = {\n title: row.title,\n url: row.url,\n type: 'qeta',\n };\n\n if (!entityLinksMap.has(entityRef)) {\n entityLinksMap.set(entityRef, []);\n }\n entityLinksMap.get(entityRef)!.push(link);\n }\n\n // Convert map to array format\n return Array.from(entityLinksMap.entries()).map(([entityRef, links]) => ({\n entityRef,\n links,\n }));\n }\n\n async getRelatedEntities(\n ids: number[],\n tableName: string = 'post_entities',\n columnName: string = 'postId',\n ): Promise<Map<number, string[]>> {\n if (ids.length === 0) {\n return new Map();\n }\n const rows = await this.db<RawTagEntity>('entities')\n .leftJoin(tableName, 'entities.id', `${tableName}.entityId`)\n .whereIn(`${tableName}.${columnName}`, ids)\n .select('entities.entity_ref', `${tableName}.${columnName} as entityId`);\n\n const result = new Map<number, string[]>();\n rows.forEach((row: any) => {\n const ps = result.get(row.entityId) || [];\n ps.push(row.entity_ref);\n result.set(row.entityId, ps);\n });\n return result;\n }\n\n async addEntities(\n id: number,\n entitiesInput?: string[],\n removeOld?: boolean,\n tableName: string = 'post_entities',\n columnName: string = 'postId',\n ) {\n if (removeOld) {\n await this.db(tableName).where(columnName, '=', id).delete();\n }\n\n const regex = /\\w+:\\w+\\/\\w+/;\n const entities = entitiesInput?.filter(input => input.match(regex));\n if (!entities || entities.length === 0) {\n return;\n }\n\n const existingEntities = await this.db('entities')\n .whereIn('entity_ref', entities)\n .returning('id')\n .select();\n const newEntities = entities.filter(\n t => !existingEntities.some(e => e.entity_ref === t),\n );\n const entityIds = (\n await Promise.all(\n [...new Set(newEntities)].map(\n async entity =>\n await this.db\n .insert({ entity_ref: entity })\n .into('entities')\n .returning('id')\n .onConflict('entity_ref')\n .ignore(),\n ),\n )\n )\n .flat()\n .map(entity => entity.id)\n .concat(existingEntities.map(c => c.id));\n\n await Promise.all(\n entityIds.map(async entityId => {\n await this.db\n .insert({ [columnName]: id, entityId })\n .into(tableName)\n .onConflict()\n .ignore();\n }),\n );\n }\n\n private getEntitiesBaseQuery() {\n const entityId = this.db.ref('entities.id');\n const entityRef = this.db.ref('entities.entity_ref');\n const postsCount = this.db('post_entities')\n .where('post_entities.entityId', entityId)\n .count('*')\n .as('postsCount');\n\n const questionsCount = this.db('post_entities')\n .leftJoin('posts', 'post_entities.postId', 'posts.id')\n .where('post_entities.entityId', entityId)\n .where('posts.type', 'question')\n .count('*')\n .as('questionsCount');\n\n const articlesCount = this.db('post_entities')\n .leftJoin('posts', 'post_entities.postId', 'posts.id')\n .where('post_entities.entityId', entityId)\n .where('posts.type', 'article')\n .count('*')\n .as('articlesCount');\n\n const linksCount = this.db('post_entities')\n .leftJoin('posts', 'post_entities.postId', 'posts.id')\n .where('post_entities.entityId', entityId)\n .where('posts.type', 'link')\n .count('*')\n .as('linksCount');\n\n const followerCount = this.db('user_entities')\n .where('user_entities.entityRef', entityRef)\n .count('*')\n .as('followerCount');\n\n return this.db('entities')\n .rightJoin('post_entities', 'entities.id', 'post_entities.entityId')\n .orderBy('postsCount', 'desc')\n .select(\n 'id',\n 'entity_ref',\n postsCount,\n questionsCount,\n articlesCount,\n linksCount,\n followerCount,\n )\n .groupBy('entities.id');\n }\n}\n"],"names":["BaseStore"],"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.55.5",
3
+ "version": "3.55.7",
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.55.5",
70
- "@drodil/backstage-plugin-qeta-node": "^3.55.5",
69
+ "@drodil/backstage-plugin-qeta-common": "^3.55.7",
70
+ "@drodil/backstage-plugin-qeta-node": "^3.55.7",
71
71
  "@smithy/node-http-handler": "^4.0.2",
72
72
  "@types/express": "*",
73
73
  "@types/mime-types": "^2.1.4",
@@ -106,9 +106,9 @@
106
106
  "@backstage/plugin-signals-backend": "^0.3.11",
107
107
  "@backstage/plugin-techdocs-backend": "^2.1.3",
108
108
  "@backstage/plugin-user-settings-backend": "^0.3.9",
109
- "@drodil/backstage-plugin-catalog-backend-module-qeta": "^3.55.5",
110
- "@drodil/backstage-plugin-qeta-backend-module-openai": "^3.55.5",
111
- "@drodil/backstage-plugin-search-backend-module-qeta": "^3.55.5",
109
+ "@drodil/backstage-plugin-catalog-backend-module-qeta": "^3.55.7",
110
+ "@drodil/backstage-plugin-qeta-backend-module-openai": "^3.55.7",
111
+ "@drodil/backstage-plugin-search-backend-module-qeta": "^3.55.7",
112
112
  "@types/sanitize-html": "^2.9.5",
113
113
  "@types/stopword": "^2.0.3",
114
114
  "@types/supertest": "^2.0.12",