@drodil/backstage-plugin-qeta-backend 3.44.0 → 3.45.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.
@@ -1748,6 +1748,7 @@ class DatabaseQetaStore {
1748
1748
  views: this.mapToInteger(val.views),
1749
1749
  answersCount: this.mapToInteger(val.answersCount),
1750
1750
  correctAnswer: this.mapToInteger(val.correctAnswers) > 0,
1751
+ commentsCount: this.mapToInteger(val.commentsCount),
1751
1752
  favorite: this.mapToInteger(val.favorite) > 0,
1752
1753
  tags: additionalInfo[0],
1753
1754
  answers: additionalInfo[1],
@@ -1915,8 +1916,17 @@ class DatabaseQetaStore {
1915
1916
  if (includeStatusFilter) {
1916
1917
  correctAnswers.where("answers.status", "=", "active");
1917
1918
  }
1919
+ const commentsCount = this.db("comments").where("comments.postId", postRef).count("*").as("commentsCount");
1918
1920
  const favorite = this.db("user_favorite").where("user_favorite.user", "=", user).where("user_favorite.postId", postRef).count("*").as("favorite");
1919
- return this.db("posts").select("posts.*", score, views, answersCount, correctAnswers, favorite).leftJoin("post_votes", "posts.id", "post_votes.postId").leftJoin("post_views", "posts.id", "post_views.postId").leftJoin("answers", "posts.id", "answers.postId").leftJoin("user_favorite", "posts.id", "user_favorite.postId").groupBy("posts.id");
1921
+ return this.db("posts").select(
1922
+ "posts.*",
1923
+ score,
1924
+ views,
1925
+ answersCount,
1926
+ correctAnswers,
1927
+ commentsCount,
1928
+ favorite
1929
+ ).leftJoin("post_votes", "posts.id", "post_votes.postId").leftJoin("post_views", "posts.id", "post_views.postId").leftJoin("answers", "posts.id", "answers.postId").leftJoin("comments", "posts.id", "comments.postId").leftJoin("user_favorite", "posts.id", "user_favorite.postId").groupBy("posts.id");
1920
1930
  }
1921
1931
  getCollectionsBaseQuery() {
1922
1932
  const collectionRef = this.db.ref("collections.id");
@@ -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 { Knex } from 'knex';\nimport {\n AnswerOptions,\n Answers,\n AttachmentParameters,\n CollectionOptions,\n CollectionPostRank,\n Collections,\n CommentOptions,\n EntitiesResponse,\n EntityResponse,\n MaybeAnswer,\n MaybeCollection,\n MaybeComment,\n MaybePost,\n MaybeTemplate,\n PostOptions,\n Posts,\n QetaStore,\n Templates,\n UserResponse,\n UsersResponse,\n} from './QetaStore';\nimport {\n AIResponse,\n Answer,\n AnswerCommentStatus,\n AnswersQuery,\n Attachment,\n Collection,\n CollectionsQuery,\n Comment,\n EntitiesQuery,\n EntityLinks,\n filterTags,\n GlobalStat,\n Post,\n PostsQuery,\n PostStatus,\n PostType,\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 Vote,\n} from '@drodil/backstage-plugin-qeta-common';\nimport { PermissionCriteria } from '@backstage/plugin-permission-common';\nimport { QetaFilter, QetaFilters } from '../service/util';\nimport {\n isAndCriteria,\n isNotCriteria,\n isOrCriteria,\n} from '@backstage/plugin-permission-node';\nimport { compact } from 'lodash';\nimport { TAGS } from '../tagDb';\nimport { TagDatabase } from '@drodil/backstage-plugin-qeta-node';\nimport { EntityLink } from '@backstage/catalog-model';\n\nconst migrationsDir = resolvePackagePath(\n '@drodil/backstage-plugin-qeta-backend',\n 'migrations',\n);\n\nexport type RawPostEntity = {\n id: number;\n author: string;\n title: string;\n content: string;\n status: string;\n created: Date | string;\n updated: Date | string;\n updatedBy: string;\n score: number | string;\n views: number | string;\n answersCount: number | string;\n correctAnswers: number | string;\n favorite: number | string;\n trend: number | string;\n anonymous: boolean;\n type: 'question' | 'article' | 'link';\n headerImage: string;\n url: string | null;\n};\n\nexport type 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 type RawAnswerEntity = {\n id: number;\n postId: number;\n author: string;\n content: string;\n correct: boolean;\n score: number | string;\n created: Date;\n updated: Date;\n updatedBy: string;\n anonymous: boolean;\n status: string;\n};\n\nexport type RawPostVoteEntity = {\n postId: number;\n author: string;\n score: number;\n timestamp: Date;\n};\n\nexport type RawAnswerVoteEntity = {\n answerId: number;\n author: string;\n score: number;\n timestamp: Date;\n};\n\nexport type RawTagEntity = {\n id: number;\n tag: string;\n};\n\nexport type RawCommentEntity = {\n id: number;\n author: string;\n content: string;\n created: Date;\n updated: Date;\n updatedBy: string;\n status: string;\n};\n\nexport type RawUserImpact = {\n userRef: string;\n impact: number;\n date: Date;\n};\n\nexport type RawTagExpert = {\n tagId: number;\n entityRef: string;\n};\n\nexport type RawTemplate = {\n id: number;\n title: string;\n description: string;\n questionTitle: string | null;\n questionContent: string | null;\n};\n\nexport type RawPostAIAnswer = {\n id: number;\n answer: string;\n created: Date;\n};\n\nexport type RawAttachment = Omit<Attachment, 'created'> & {\n created: Date | string | number;\n};\n\nfunction isQetaFilter(filter: any): filter is QetaFilter {\n return filter.hasOwnProperty('property');\n}\n\nfunction 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 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.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.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('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('answers.id');\n query.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.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('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('collection_posts.collectionId');\n query.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.whereIn(fk, postIds);\n return query;\n }\n\n if (values.length === 0) {\n return query.whereNull(filter.property);\n }\n\n return query.whereIn(filter.property, values);\n }\n\n return query[negate ? 'andWhereNot' : 'andWhere'](function filterFunction() {\n if (isOrCriteria(filter)) {\n for (const subFilter of filter.anyOf ?? []) {\n this.orWhere(subQuery =>\n parseFilter(subFilter, subQuery, db, type, false),\n );\n }\n } else if (isAndCriteria(filter)) {\n for (const subFilter of filter.allOf ?? []) {\n this.andWhere(subQuery =>\n parseFilter(subFilter, subQuery, db, type, false),\n );\n }\n }\n });\n}\n\nexport class DatabaseQetaStore implements QetaStore {\n private constructor(\n private readonly db: Knex,\n private readonly tagDatabase?: TagDatabase,\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 // prettier-ignore\n await client.migrate.latest({ // nosonar\n directory: migrationsDir,\n });\n }\n\n return new DatabaseQetaStore(client, tagDatabase);\n }\n\n async getPosts(\n user_ref: string,\n options: PostsQuery,\n filters?: PermissionCriteria<QetaFilters>,\n opts?: PostOptions,\n ): Promise<Posts> {\n const { includeTotal = true, includeDraftFilter = true } = opts ?? {};\n const query = this.getPostsBaseQuery(user_ref);\n if (options.type) {\n query.where('posts.type', options.type);\n }\n\n if (options.fromDate && options.toDate) {\n query.whereBetween('posts.created', [\n `${options.fromDate} 00:00:00.000+00`,\n `${options.toDate} 23:59:59.999+00`,\n ]);\n } else if (options.fromDate) {\n query.where('posts.created', '>=', `${options.fromDate} 00:00:00.000+00`);\n } else if (options.toDate) {\n query.where('posts.created', '<=', `${options.toDate} 23:59:59.999+00`);\n }\n\n if (options.author) {\n if (Array.isArray(options.author)) {\n query.whereIn('posts.author', options.author);\n } else {\n query.where('posts.author', '=', options.author);\n }\n }\n\n if (options.excludeAuthors) {\n query.whereNotIn('posts.author', options.excludeAuthors);\n }\n\n if (options.status) {\n if (options.status === 'draft') {\n query.where('posts.author', '=', user_ref);\n }\n query.where('posts.status', '=', options.status);\n } else if (includeDraftFilter) {\n query.where(q => {\n q.where('posts.status', 'active').orWhere(q2 => {\n q2.where('posts.status', 'draft').where(\n 'posts.author',\n '=',\n user_ref,\n );\n });\n });\n }\n\n if (filters) {\n parseFilter(filters, query, this.db);\n }\n\n if (options.searchQuery) {\n this.applySearchQuery(\n query,\n ['posts.title', 'posts.content'],\n options.searchQuery,\n );\n }\n\n if (options.tags) {\n const tags = filterTags(options.tags);\n if (options.tagsRelation === 'or') {\n query.innerJoin('post_tags', 'posts.id', 'post_tags.postId');\n query.innerJoin('tags', 'post_tags.tagId', 'tags.id');\n query.whereIn('tags.tag', tags);\n } else {\n tags.forEach((t, i) => {\n query.innerJoin(`post_tags AS qt${i}`, 'posts.id', `qt${i}.postId`);\n query.innerJoin(`tags AS t${i}`, `qt${i}.tagId`, `t${i}.id`);\n query.where(`t${i}.tag`, '=', t);\n });\n }\n }\n\n if (options.entities) {\n const entityValues = Array.isArray(options.entities)\n ? options.entities\n : [options.entities];\n if (options.entitiesRelation === 'or') {\n query\n .innerJoin('post_entities', 'posts.id', 'post_entities.postId')\n .innerJoin('entities', 'post_entities.entityId', 'entities.id')\n .whereIn('entities.entity_ref', entityValues);\n } else {\n entityValues.forEach((t, i) => {\n query.innerJoin(\n `post_entities AS pe${i}`,\n 'posts.id',\n `pe${i}.postId`,\n );\n query.innerJoin(`entities AS e${i}`, `pe${i}.entityId`, `e${i}.id`);\n query.where(`e${i}.entity_ref`, '=', t);\n });\n }\n }\n\n if (options.collectionId) {\n query.innerJoin(\n 'collection_posts',\n 'posts.id',\n 'collection_posts.postId',\n );\n query.where('collection_posts.collectionId', options.collectionId);\n } else if (options.orderBy === 'rank') {\n query.innerJoin(\n 'collection_posts',\n 'posts.id',\n 'collection_posts.postId',\n );\n }\n if (options.orderBy === 'rank') {\n query.groupBy('rank');\n }\n\n if (options.noAnswers) {\n query.whereNull('answers.postId');\n }\n\n if (options.hasAnswers) {\n query.whereNotNull('answers.postId');\n }\n\n if (options.noCorrectAnswer) {\n query.leftJoin('answers as correct_answer', builder => {\n builder\n .on('posts.id', 'correct_answer.postId')\n .on('correct_answer.correct', this.db.raw('?', [true]));\n });\n query.whereNull('correct_answer.postId');\n }\n\n if (options.noVotes) {\n query.whereNull('post_votes.postId');\n }\n\n if (options.favorite) {\n query.where('user_favorite.user', '=', user_ref);\n query.whereNotNull('user_favorite.postId');\n }\n\n if (options.includeTrend || options.orderBy === 'trend') {\n query.select(\n this.db.raw(\n `(\n (SELECT COALESCE(SUM(score), 0) FROM post_votes WHERE \"postId\" = posts.id) * 200 + \n (SELECT COALESCE(COUNT(*), 0) FROM answers WHERE \"postId\" = posts.id) * 100 +\n (SELECT COALESCE(COUNT(*), 0) FROM user_favorite WHERE \"postId\" = posts.id) * 50 +\n (SELECT COALESCE(COUNT(*), 0) FROM post_views WHERE \"postId\" = posts.id) * 10 +\n (SELECT COALESCE(COUNT(*), 0) FROM comments WHERE \"postId\" = posts.id) * 30\n ) / \n POWER(\n EXTRACT(EPOCH FROM (now() - posts.created)) / 172800 + 1,\n 1.5\n ) as trend`,\n ),\n );\n }\n\n if (options.ids) {\n query.whereIn('posts.id', options.ids);\n }\n\n const totalQuery = query.clone();\n\n if (options.random) {\n query.orderByRaw('RANDOM()');\n } else if (options.orderBy) {\n query.orderBy(options.orderBy, options.order ? options.order : 'desc');\n } else {\n query.orderBy('created', '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 includeTotal\n ? this.db(totalQuery.as('totalQuery')).count('* as CNT').first()\n : undefined,\n ]);\n const rows = results[0] as RawPostEntity[];\n const total = this.mapToInteger((results[1] as any)?.CNT);\n\n return {\n posts: await Promise.all(\n rows.map(async val => {\n return this.mapPostEntity(val, user_ref, {\n ...opts,\n includeAnswers: options.includeAnswers ?? opts?.includeAnswers,\n includeVotes: options.includeVotes ?? opts?.includeVotes,\n includeEntities: options.includeEntities ?? opts?.includeEntities,\n includeAttachments:\n options.includeAttachments ?? opts?.includeAttachments,\n includeExperts: options.includeExperts ?? opts?.includeExperts,\n });\n }),\n ),\n total,\n };\n }\n\n async getPost(\n user_ref: string,\n id: number,\n recordView?: boolean,\n options?: PostOptions,\n ): Promise<MaybePost> {\n const rows = await this.getPostsBaseQuery(user_ref).where(\n 'posts.id',\n '=',\n id,\n );\n\n if (!rows || rows.length === 0) {\n return null;\n }\n const post = rows[0] as unknown as RawPostEntity;\n\n if ((recordView === undefined || recordView) && post.status === 'active') {\n this.recordPostView(id, user_ref);\n }\n return await this.mapPostEntity(post, user_ref, options);\n }\n\n async getPostByAnswerId(\n user_ref: string,\n answerId: number,\n recordView?: boolean,\n options?: PostOptions,\n ): Promise<MaybePost> {\n const rows = await this.getPostsBaseQuery(user_ref)\n .where('answers.id', '=', answerId)\n .select('posts.*');\n if (!rows || rows.length === 0) {\n return null;\n }\n if (recordView === undefined || recordView) {\n this.recordPostView(rows[0].id, user_ref);\n }\n return await this.mapPostEntity(\n rows[0] as unknown as RawPostEntity,\n user_ref,\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 const {\n user_ref,\n title,\n content,\n author,\n created,\n tags,\n entities,\n images,\n anonymous,\n type = 'question',\n headerImage,\n url,\n opts,\n status = 'active',\n } = options;\n const posts = await this.db\n .insert(\n {\n author: author ?? user_ref,\n title,\n content,\n created,\n anonymous: anonymous ?? false,\n type: type ?? 'question',\n headerImage,\n url,\n status,\n },\n ['id'],\n )\n .into('posts')\n .returning([\n 'id',\n 'author',\n 'title',\n 'content',\n 'created',\n 'anonymous',\n 'type',\n 'status',\n 'url',\n ]);\n\n await Promise.all([\n this.addTags(posts[0].id, tags),\n this.addEntities(posts[0].id, entities),\n ]);\n\n await this.updateAttachments(\n 'postId',\n content ?? '',\n images ?? [],\n posts[0].id,\n headerImage,\n );\n\n return this.mapPostEntity(posts[0], user_ref, opts);\n }\n\n async commentPost(\n post_id: number,\n user_ref: string,\n content: string,\n created: Date,\n options?: PostOptions,\n ): Promise<MaybePost> {\n await this.db\n .insert({\n author: user_ref,\n content,\n created,\n postId: post_id,\n })\n .into('comments');\n\n return await this.getPost(user_ref, post_id, false, options);\n }\n\n async updatePostComment(\n post_id: number,\n id: number,\n user_ref: string,\n content: string,\n options?: PostOptions,\n ): Promise<MaybePost> {\n const query = this.db('comments')\n .where('id', '=', id)\n .where('postId', '=', post_id);\n await query.update({ content, updatedBy: user_ref, updated: new Date() });\n return this.getPost(user_ref, post_id, false, options);\n }\n\n async deletePostComment(\n post_id: number,\n id: number,\n user_ref: string,\n permanently?: boolean,\n options?: PostOptions,\n ): Promise<MaybePost> {\n const query = this.db('comments')\n .where('id', '=', id)\n .where('postId', '=', post_id);\n if (permanently) {\n await query.delete();\n } else {\n await query.update({ status: 'deleted' });\n }\n\n return this.getPost(user_ref, post_id, false, options);\n }\n\n async commentAnswer(\n answer_id: number,\n user_ref: string,\n content: string,\n created: Date,\n options?: AnswerOptions,\n ): Promise<MaybeAnswer> {\n await this.db\n .insert({\n author: user_ref,\n content,\n created,\n answerId: answer_id,\n })\n .into('comments');\n return this.getAnswer(answer_id, user_ref, options);\n }\n\n async updateAnswerComment(\n answer_id: number,\n id: number,\n user_ref: string,\n content: string,\n options?: AnswerOptions,\n ): Promise<MaybeAnswer> {\n const query = this.db('comments')\n .where('id', '=', id)\n .where('answerId', '=', answer_id);\n await query.update({ content, updatedBy: user_ref, updated: new Date() });\n return this.getAnswer(answer_id, user_ref, options);\n }\n\n async deleteAnswerComment(\n answer_id: number,\n id: number,\n user_ref: string,\n permanently?: boolean,\n options?: AnswerOptions,\n ): Promise<MaybeAnswer> {\n const query = this.db('comments')\n .where('id', '=', id)\n .where('answerId', '=', answer_id);\n if (permanently) {\n await query.delete();\n } else {\n await query.update({ status: 'deleted' });\n }\n return this.getAnswer(answer_id, user_ref, options);\n }\n\n async 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 const {\n id,\n user_ref,\n title,\n content,\n author,\n tags,\n entities,\n images,\n headerImage,\n url,\n setUpdatedBy = true,\n opts,\n status = 'active',\n } = options;\n const query = this.db('posts').where('posts.id', '=', id);\n const rows = await query.update({\n title,\n content,\n headerImage,\n author,\n url,\n updatedBy: setUpdatedBy ? user_ref : undefined,\n updated: setUpdatedBy ? new Date() : undefined,\n status,\n });\n\n if (!rows) {\n return null;\n }\n\n await Promise.all([\n this.addTags(id, tags, true),\n this.addEntities(id, entities, true),\n ]);\n\n await this.updateAttachments(\n 'postId',\n content ?? '',\n images ?? [],\n id,\n headerImage,\n );\n\n return await this.getPost(user_ref, id, false, opts);\n }\n\n async deletePost(id: number, permanently?: boolean): Promise<boolean> {\n if (permanently) {\n const rows = await this.db('posts').where('id', '=', id).delete();\n return rows > 0;\n }\n const rows = await this.db('posts').where('id', '=', id).update({\n status: 'deleted',\n });\n return rows > 0;\n }\n\n async answerPost(\n user_ref: string,\n postId: number,\n answer: string,\n created: Date,\n images?: number[],\n anonymous?: boolean,\n options?: AnswerOptions,\n ): Promise<MaybeAnswer> {\n const answers = await this.db\n .insert({\n postId,\n author: user_ref,\n content: answer,\n correct: false,\n created,\n anonymous: anonymous ?? false,\n })\n .into('answers')\n .returning('id');\n\n await this.updateAttachments(\n 'answerId',\n answer,\n images ?? [],\n answers[0].id,\n );\n\n return this.getAnswer(answers[0].id, user_ref, options);\n }\n\n async updateAnswer(\n user_ref: string,\n postId: number,\n answerId: number,\n answer: string,\n author?: string,\n images?: number[],\n options?: AnswerOptions,\n ): Promise<MaybeAnswer> {\n const query = this.db('answers')\n .where('answers.id', '=', answerId)\n .where('answers.postId', '=', postId);\n\n const rows = await query.update({\n content: answer,\n author: author,\n updatedBy: user_ref,\n updated: new Date(),\n });\n\n if (!rows) {\n return null;\n }\n\n await this.updateAttachments('answerId', answer, images ?? [], answerId);\n\n return this.getAnswer(answerId, user_ref, options);\n }\n\n async getAnswers(\n user_ref: string,\n options: AnswersQuery,\n filters?: PermissionCriteria<QetaFilters>,\n opts?: AnswerOptions,\n ): Promise<Answers> {\n const { includeStatusFilter = true } = opts ?? {};\n const query = this.getAnswerBaseQuery();\n if (includeStatusFilter) {\n query.where('answers.status', '=', 'active');\n }\n if (options.fromDate && options.toDate) {\n query.whereBetween('answers.created', [\n `${options.fromDate} 00:00:00.000+00`,\n `${options.toDate} 23:59:59.999+00`,\n ]);\n }\n\n if (options.author) {\n query.where('answers.author', '=', options.author);\n }\n\n if (filters) {\n parseFilter(filters, query, this.db, 'answer');\n }\n\n if (options.tags) {\n const tags = filterTags(options.tags);\n if (options.tagsRelation === 'or') {\n query.innerJoin('post_tags', 'answers.postId', 'post_tags.postId');\n query.innerJoin('tags', 'post_tags.tagId', 'tags.id');\n query.whereIn('tags.tag', tags);\n } else {\n tags.forEach((t, i) => {\n query.innerJoin(\n `post_tags AS at${i}`,\n 'answers.postId',\n `at${i}.postId`,\n );\n query.innerJoin(`tags AS t${i}`, `at${i}.tagId`, `t${i}.id`);\n query.where(`t${i}.tag`, '=', t);\n });\n }\n }\n\n if (options.entities) {\n if (options.entitiesRelation === 'or') {\n query.innerJoin(\n 'post_entities',\n 'answers.postId',\n 'post_entities.postId',\n );\n query.innerJoin('entities', 'post_entities.entityId', 'entities.id');\n query.whereIn('entities.entity_ref', options.entities);\n } else {\n options.entities.forEach((t, i) => {\n query.innerJoin(\n `post_entities AS pe${i}`,\n 'answers.postId',\n `pe${i}.postId`,\n );\n query.innerJoin(`entities AS e${i}`, `pe${i}.entityId`, `e${i}.id`);\n query.where(`e${i}.entity_ref`, '=', t);\n });\n }\n }\n\n if (options.noCorrectAnswer) {\n query.where('correct', '=', false);\n }\n\n if (options.noVotes) {\n query.whereNull('answer_votes.answerId');\n }\n\n if (options.searchQuery) {\n this.applySearchQuery(query, ['answers.content'], options.searchQuery);\n }\n\n const totalQuery = query.clone();\n\n if (options.orderBy) {\n query.orderBy(options.orderBy, options.order ? options.order : 'desc');\n } else {\n query.orderBy('created', '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 if (options.ids) {\n query.whereIn('answers.id', options.ids);\n }\n\n const results = await Promise.all([\n query,\n this.db(totalQuery.as('totalQuery')).count('* as CNT').first(),\n ]);\n const rows = results[0] as RawAnswerEntity[];\n const total = this.mapToInteger((results[1] as any)?.CNT);\n\n return {\n answers: await Promise.all(\n rows.map(async val => {\n return this.mapAnswer(val, user_ref, opts);\n }),\n ),\n total,\n };\n }\n\n async getAnswer(\n answerId: number,\n user_ref: string,\n options?: AnswerOptions,\n ): Promise<MaybeAnswer> {\n const { includeStatusFilter = true } = options ?? {};\n const query = this.getAnswerBaseQuery().where('id', '=', answerId);\n if (includeStatusFilter) {\n query.where('answers.status', '=', 'active');\n }\n const answers = await query.select();\n return this.mapAnswer(answers[0], user_ref, options);\n }\n\n async getComments(\n options?: { ids?: number[] },\n opts?: CommentOptions,\n ): Promise<Comment[]> {\n const { includeStatusFilter = true } = opts ?? {};\n const query = this.db('comments');\n if (options?.ids) {\n query.whereIn('id', options.ids);\n }\n if (includeStatusFilter) {\n query.where('status', '=', 'active');\n }\n const comments = await query.select();\n return await Promise.all(comments.map(this.mapComment));\n }\n\n async getComment(\n commentId: number,\n opts?: CommentOptions & { postId?: number; answerId?: number },\n ): Promise<MaybeComment> {\n const { includeStatusFilter = true } = opts ?? {};\n const query = this.db<RawCommentEntity>('comments') // nosonar\n .where('comments.id', '=', commentId);\n if (includeStatusFilter) {\n query.where('status', '=', 'active');\n }\n if (opts?.postId) {\n query.andWhere('comments.postId', '=', opts.postId);\n }\n if (opts?.answerId) {\n query.andWhere('comments.answerId', '=', opts.answerId);\n }\n\n const comments = await query.select();\n if (comments.length === 0) {\n return null;\n }\n return await this.mapComment(comments[0]);\n }\n\n async deleteAnswer(id: number, permanently?: boolean): Promise<boolean> {\n const query = this.db('answers').where('id', '=', id);\n if (permanently) {\n return !!(await query.delete());\n }\n const rows = await query.update({ status: 'deleted' });\n return rows > 0;\n }\n\n async clickPost(user_ref: string, postId: number): Promise<void> {\n const existingRows = await this.db('post_votes')\n .where('author', '=', user_ref)\n .where('postId', '=', postId);\n\n if (existingRows.length) {\n await this.db('post_votes')\n .where('author', '=', user_ref)\n .where('postId', '=', postId)\n .increment('score', 1);\n } else {\n await this.db\n .insert({\n author: user_ref,\n postId,\n score: 1,\n timestamp: new Date(),\n })\n .onConflict()\n .ignore()\n .into('post_votes');\n }\n }\n\n async deletePostVote(user_ref: string, postId: number): Promise<boolean> {\n return !!(await this.db('post_votes')\n .where('author', '=', user_ref)\n .where('postId', '=', postId)\n .delete());\n }\n\n async votePost(\n user_ref: string,\n postId: number,\n score: number,\n ): Promise<boolean> {\n await this.db('post_votes')\n .where('author', '=', user_ref)\n .where('postId', '=', postId)\n .delete();\n\n const id = await this.db\n .insert(\n {\n author: user_ref,\n postId,\n score,\n timestamp: new Date(),\n },\n ['postId'],\n )\n .onConflict()\n .ignore()\n .into('post_votes');\n return id && id.length > 0;\n }\n\n async favoritePost(user_ref: string, postId: number): Promise<boolean> {\n const id = await this.db\n .insert(\n {\n user: user_ref,\n postId,\n },\n ['postId'],\n )\n .onConflict()\n .ignore()\n .into('user_favorite');\n return id && id.length > 0;\n }\n\n async unfavoritePost(user_ref: string, postId: number): Promise<boolean> {\n return !!(await this.db('user_favorite')\n .where('user', '=', user_ref)\n .where('postId', '=', postId)\n .delete());\n }\n\n async getUsersWhoFavoritedPost(postId: number): Promise<string[]> {\n const query = this.db('user_favorite').where('postId', '=', postId);\n const users = await query.select('user');\n return users.map(u => u.user);\n }\n\n async deleteAnswerVote(user_ref: string, answerId: number): Promise<boolean> {\n return !!(await this.db('answer_votes')\n .where('author', '=', user_ref)\n .where('answerId', '=', answerId)\n .delete());\n }\n\n async voteAnswer(\n user_ref: string,\n answerId: number,\n score: number,\n ): Promise<boolean> {\n await this.db('answer_votes')\n .where('author', '=', user_ref)\n .where('answerId', '=', answerId)\n .delete();\n\n const id = await this.db\n .insert(\n {\n author: user_ref,\n answerId,\n score,\n timestamp: new Date(),\n },\n ['answerId'],\n )\n .onConflict()\n .ignore()\n .into('answer_votes');\n return id && id.length > 0;\n }\n\n async markAnswerCorrect(postId: number, answerId: number): Promise<boolean> {\n return await this.markAnswer(postId, answerId, true);\n }\n\n async markAnswerIncorrect(\n postId: number,\n answerId: number,\n ): Promise<boolean> {\n return await this.markAnswer(postId, answerId, false);\n }\n\n async getTags(\n options?: { noDescription?: boolean; ids?: number[] } & TagsQuery,\n filters?: PermissionCriteria<QetaFilters>,\n ): Promise<TagsResponse> {\n const { includeExperts = true } = options ?? {};\n const query = this.getTagBaseQuery();\n if (options?.noDescription) {\n query.whereNull('tags.description');\n }\n\n if (options?.searchQuery) {\n this.applySearchQuery(\n query,\n ['tags.tag', 'tags.description'],\n options.searchQuery,\n );\n }\n\n if (options?.ids) {\n query.whereIn('tags.id', options.ids);\n }\n\n if (filters) {\n parseFilter(filters, query, this.db);\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 tags: await Promise.all(\n rows.map(async tag => {\n return {\n id: tag.id,\n tag: tag.tag,\n description: tag.description,\n postsCount: this.mapToInteger(tag.postsCount),\n followerCount: this.mapToInteger(tag.followerCount),\n experts: includeExperts\n ? await this.getTagExpertsById(tag.id)\n : undefined,\n };\n }),\n ),\n };\n }\n\n async getTagById(id: number): Promise<TagResponse | null> {\n const query = this.getTagBaseQuery();\n const tags = await query.where('tags.id', '=', id);\n\n if (tags.length === 0) {\n return null;\n }\n return {\n id: tags[0].id,\n tag: tags[0].tag,\n description: tags[0].description,\n postsCount: this.mapToInteger(tags[0].postsCount),\n followerCount: this.mapToInteger(tags[0].followerCount),\n experts: await this.getTagExpertsById(tags[0].id),\n };\n }\n\n async getTag(tag: string): Promise<TagResponse | null> {\n const query = this.getTagBaseQuery();\n const tags = await query.where('tags.tag', '=', tag);\n\n if (tags.length === 0) {\n return null;\n }\n return {\n id: tags[0].id,\n tag: tags[0].tag,\n description: tags[0].description,\n postsCount: this.mapToInteger(tags[0].postsCount),\n followerCount: this.mapToInteger(tags[0].followerCount),\n experts: await this.getTagExpertsById(tags[0].id),\n };\n }\n\n async deleteTag(id: number): Promise<boolean> {\n const query = this.db('tags').where('id', '=', id);\n return !!(await query.delete());\n }\n\n async getTagExperts(tags: string[]): Promise<string[]> {\n if (tags.length === 0) {\n return [];\n }\n const query = this.db<RawTagExpert>('tag_experts')\n .leftJoin('tags', 'tag_experts.tagId', 'tags.id')\n .whereIn('tags.tag', tags);\n const resp = await query.select('entityRef');\n return [...new Set(resp.map(r => r.entityRef))];\n }\n\n async createTag(\n tag: string,\n description?: string,\n experts?: string[],\n ): Promise<TagResponse | null> {\n const trimmed = tag.trim();\n const ret = await this.db\n .insert({ tag: trimmed, description })\n .into('tags')\n .returning(['id'])\n .onConflict('tag')\n .ignore();\n if (ret && experts && experts.length > 0) {\n await this.updateTagExperts(ret[0].id, experts);\n }\n return this.getTag(trimmed);\n }\n\n async updateTag(\n id: number,\n description?: string,\n experts?: string[],\n ): Promise<TagResponse | null> {\n await this.db('tags')\n .where('tags.id', '=', id)\n .update({ description: description ?? null });\n if (experts && experts.length > 0) {\n await this.updateTagExperts(id, experts);\n }\n return this.getTagById(id);\n }\n\n async getUsersCount(): Promise<number> {\n const query = await this.db('unique_authors').count('author as CNT');\n return Number(query[0].CNT);\n }\n\n async getUsers(\n options?: { entityRefs?: string[] } & UsersQuery,\n ): Promise<UsersResponse> {\n const query = this.getUserBaseQuery();\n\n if (options?.entityRefs) {\n query.whereIn('unique_authors.author', 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 users: rows.map(r => ({\n userRef: r.author,\n totalViews: this.mapToInteger(r.totalViews),\n totalQuestions: this.mapToInteger(r.totalQuestions),\n totalAnswers: this.mapToInteger(r.totalAnswers),\n totalComments:\n this.mapToInteger(r.postComments) +\n this.mapToInteger(r.answerComments),\n totalVotes:\n this.mapToInteger(r.postVotes) + this.mapToInteger(r.answerVotes),\n totalArticles: this.mapToInteger(r.totalArticles),\n totalFollowers: this.mapToInteger(r.totalFollowers),\n totalLinks: this.mapToInteger(r.totalLinks),\n })),\n };\n }\n\n async getUser(user_ref: string): Promise<UserResponse | null> {\n const q = this.getUserBaseQuery();\n const rows = await q.where('author', user_ref);\n if (rows.length === 0) {\n return null;\n }\n return {\n userRef: rows[0].author,\n totalViews: this.mapToInteger(rows[0].totalViews),\n totalQuestions: this.mapToInteger(rows[0].totalQuestions),\n totalAnswers: this.mapToInteger(rows[0].totalAnswers),\n totalComments:\n this.mapToInteger(rows[0].postComments) +\n this.mapToInteger(rows[0].answerComments),\n totalVotes:\n this.mapToInteger(rows[0].postVotes) +\n this.mapToInteger(rows[0].answerVotes),\n totalArticles: this.mapToInteger(rows[0].totalArticles),\n totalFollowers: this.mapToInteger(rows[0].totalFollowers),\n totalLinks: this.mapToInteger(rows[0].totalLinks),\n };\n }\n\n async getUserCollections(\n user_ref: string,\n options?: CollectionOptions,\n ): Promise<UserCollectionsResponse> {\n const rows = await this.db('user_collections')\n .where('userRef', user_ref)\n .leftJoin(\n 'collections',\n 'user_collections.collectionId',\n 'collections.id',\n )\n .select('*');\n\n return {\n collections: await Promise.all(\n rows.map(async val => {\n return this.mapCollectionEntity(val, user_ref, options);\n }),\n ),\n count: rows.length,\n };\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 {\n userRef: user_ref,\n collectionId,\n },\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 getUserTags(\n user_ref: string,\n filters?: PermissionCriteria<QetaFilters>,\n ): Promise<UserTagsResponse> {\n const query = this.db('user_tags')\n .where('userRef', user_ref)\n .leftJoin('tags', 'user_tags.tagId', 'tags.id');\n\n if (filters) {\n parseFilter(filters, query, this.db);\n }\n const tags = await query.select('tags.tag');\n\n return {\n tags: tags.map(tag => tag.tag),\n count: tags.length,\n };\n }\n\n async getUsersForTags(tags?: string[]): Promise<string[]> {\n if (!tags || tags.length === 0) {\n return [];\n }\n\n const followingUsersQuery = this.db('user_tags')\n .leftJoin('tags', 'user_tags.tagId', 'tags.id')\n .whereIn('tags.tag', tags)\n .select('userRef');\n\n const [followingUsers, experts] = await Promise.all([\n followingUsersQuery,\n this.getTagExperts(tags),\n ]);\n\n return [\n ...new Set([...followingUsers.map(user => user.userRef), ...experts]),\n ];\n }\n\n async followTag(user_ref: string, tag: string): Promise<boolean> {\n const tagId = await this.db('tags').where('tag', tag).select('id').first();\n if (!tagId) {\n return false;\n }\n await this.db\n .insert(\n {\n userRef: user_ref,\n tagId: tagId.id,\n },\n ['tagId'],\n )\n .into('user_tags');\n return true;\n }\n\n async unfollowTag(user_ref: string, tag: string): Promise<boolean> {\n const tagId = await this.db('tags').where('tag', tag).select('id').first();\n if (!tagId) {\n return false;\n }\n await this.db('user_tags')\n .where('userRef', user_ref)\n .where('tagId', tagId.id)\n .delete();\n return true;\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 => {\n return {\n id: entity.id,\n entityRef: entity.entity_ref,\n postsCount: this.mapToInteger(entity.postsCount),\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 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 getFollowedUsers(user_ref: string): Promise<UserUsersResponse> {\n const entities = await this.db('user_users')\n .where('userRef', user_ref)\n .select('followedUserRef');\n\n return {\n followedUserRefs: entities.map(e => e.followedUserRef),\n count: entities.length,\n };\n }\n\n async getFollowingUsers(user_ref: string): Promise<string[]> {\n const users = await this.db('user_users')\n .where('followedUserRef', user_ref)\n .select('userRef');\n return users.map(user => user.userRef);\n }\n\n async followUser(\n user_ref: string,\n followedUserRef: string,\n ): Promise<boolean> {\n await this.db\n .insert({\n userRef: user_ref,\n followedUserRef,\n })\n .into('user_users');\n return true;\n }\n\n async unfollowUser(\n user_ref: string,\n followedUserRef: string,\n ): Promise<boolean> {\n await this.db('user_users')\n .where('userRef', user_ref)\n .where('followedUserRef', followedUserRef)\n .delete();\n return true;\n }\n\n async getMostUpvotedPosts({\n author,\n options,\n }: StatisticsRequestParameters): Promise<Statistic[]> {\n const query = this.db<Statistic>('posts as q')\n .sum('qv.score as total')\n .select('q.author')\n .join('post_votes as qv', 'q.id', 'qv.postId')\n .groupBy('q.author')\n .orderBy('total', 'desc')\n .where('anonymous', '!=', true);\n\n if (author) {\n query.where('q.author', '=', author);\n }\n\n if (options?.period) {\n query.where('q.created', '>', options.period);\n }\n\n if (options?.type) {\n query.where('q.type', '=', options.type);\n }\n\n if (options?.limit) {\n query.limit(options.limit);\n }\n\n const rows = (await query) as unknown as Statistic[];\n\n // This can probably be replaced to use\n // DENSE_RANK() over (total) directly by the query\n rows.map((row, index) => {\n row.position = index + 1;\n });\n\n return rows;\n }\n\n async getTotalPosts({\n author,\n options,\n }: StatisticsRequestParameters): Promise<Statistic[]> {\n const query = this.db<Statistic>('posts as q')\n .count('q.id as total')\n .select('q.author')\n .groupBy('author')\n .orderBy('total', 'desc')\n .where('q.anonymous', '!=', true);\n\n if (author) {\n query.where('q.author', '=', author);\n }\n\n if (options?.period) {\n query.where('q.created', '>', options.period);\n }\n\n if (options?.type) {\n query.where('q.type', '=', options.type);\n }\n\n if (options?.limit) {\n query.limit(options.limit);\n }\n\n const rows = (await query) as unknown as Statistic[];\n if (!author) {\n rows.map((row, index) => {\n row.position = index + 1;\n });\n }\n\n return rows;\n }\n\n async getMostUpvotedAnswers({\n author,\n options,\n }: StatisticsRequestParameters): Promise<Statistic[]> {\n const query = this.db<Statistic>('answers as a')\n .sum('av.score as total')\n .select('a.author')\n .join('answer_votes as av', 'a.id', 'av.answerId')\n .groupBy('a.author')\n .orderBy('total', 'desc')\n .where('a.anonymous', '!=', true);\n\n if (author) {\n query.where('a.author', '=', author);\n }\n\n if (options?.period) {\n query.where('a.created', '>', options.period);\n }\n\n if (options?.limit) {\n query.limit(options.limit);\n }\n\n const rows = (await query) as unknown as Statistic[];\n\n rows.map((row, index) => {\n row.position = index + 1;\n });\n\n return rows;\n }\n\n async getMostUpvotedCorrectAnswers({\n author,\n options,\n }: StatisticsRequestParameters): Promise<Statistic[]> {\n const query = this.db<Statistic>('answers as a')\n .sum('av.score as total')\n .select('a.author')\n .join('answer_votes as av', 'a.id', 'av.answerId')\n .groupBy('a.author')\n .orderBy('total', 'desc')\n .where('a.correct', '=', true)\n .where('a.anonymous', '!=', true);\n\n if (author) {\n query.where('a.author', '=', author);\n }\n\n if (options?.period) {\n query.where('a.created', '>', options.period);\n }\n\n if (options?.limit) {\n query.limit(options.limit);\n }\n\n const rows = (await query) as unknown as Statistic[];\n\n rows.map((row, index) => {\n row.position = index + 1;\n });\n\n return rows;\n }\n\n async getTotalAnswers({\n author,\n options,\n }: StatisticsRequestParameters): Promise<Statistic[]> {\n const query = this.db<Statistic>('answers as a')\n .count('a.id as total')\n .select('a.author')\n .groupBy('author')\n .orderBy('total', 'desc')\n .where('a.anonymous', '!=', true);\n\n if (author) {\n query.where('a.author', '=', author);\n }\n\n if (options?.period) {\n query.where('a.created', '>', options.period);\n }\n if (options?.limit) {\n query.limit(options.limit);\n }\n\n const rows = (await query) as unknown as Statistic[];\n\n if (!author) {\n rows.map((row, index) => {\n row.position = index + 1;\n });\n }\n\n return rows;\n }\n\n async postAttachment({\n uuid,\n locationType,\n locationUri,\n extension,\n mimeType,\n binaryImage,\n path,\n creator,\n postId,\n answerId,\n collectionId,\n }: AttachmentParameters): Promise<Attachment> {\n const attachments: Attachment[] = await this.db\n .insert(\n {\n uuid: uuid,\n locationType: locationType,\n locationUri: locationUri,\n extension: extension,\n mimeType: mimeType,\n path: path,\n binaryImage: binaryImage,\n creator: creator,\n created: new Date(),\n postId,\n answerId,\n collectionId,\n },\n ['id', 'uuid', 'locationUri', 'locationType'],\n )\n .into('attachments');\n\n return attachments[0];\n }\n\n async deleteAttachment(uuid: string): Promise<boolean> {\n const query = this.db('attachments').where('uuid', '=', uuid);\n return !!(await query.delete());\n }\n\n async getAttachment(uuid: string): Promise<Attachment | undefined> {\n const rawAttachment = await this.db<RawAttachment>('attachments')\n .where('uuid', '=', uuid)\n .first();\n\n if (!rawAttachment) {\n return undefined;\n }\n\n return this.mapAttachment(rawAttachment);\n }\n\n async getDeletableAttachments(dayLimit: number): Promise<Attachment[]> {\n const now = new Date();\n now.setDate(now.getDate() - dayLimit);\n return this.db<Attachment>('attachments')\n .whereNull('postId')\n .whereNull('answerId')\n .whereNull('collectionId')\n .where(`created`, '<=', now)\n .select();\n }\n\n async getTotalViews(\n user_ref: string,\n lastDays?: number,\n excludeUser?: boolean,\n ): Promise<number> {\n const now = new Date();\n if (lastDays) {\n now.setDate(now.getDate() - lastDays);\n }\n\n const postViewsQuery = this.db('post_views')\n .innerJoin('posts', 'post_views.postId', 'posts.id')\n .where('posts.author', user_ref);\n if (lastDays) {\n postViewsQuery.where('posts.created', '>', now);\n }\n\n if (excludeUser) {\n postViewsQuery.where('post_views.author', '!=', user_ref);\n }\n\n const answerViewsQuery = this.db('post_views')\n .innerJoin('answers', 'post_views.postId', 'answers.postId')\n .innerJoin('posts', 'post_views.postId', 'posts.id')\n .where('answers.author', user_ref)\n .whereNot('posts.author', user_ref);\n if (lastDays) {\n answerViewsQuery.where('answers.created', '>', now);\n }\n\n if (excludeUser) {\n answerViewsQuery.where('post_views.author', '!=', user_ref);\n }\n\n const postViews = await postViewsQuery.count('* as total');\n const answerViews = await answerViewsQuery.count('* as total');\n\n return Number(postViews[0].total) + Number(answerViews[0].total);\n }\n\n async saveUserStats(user: UserResponse, date: Date): Promise<void> {\n await this.db('user_stats')\n .insert({\n ...user,\n date,\n })\n .onConflict(['userRef', 'date'])\n .merge();\n }\n\n async saveGlobalStats(date: Date): Promise<void> {\n await this.db('global_stats')\n .insert({\n totalQuestions: await this.getCount('posts', { type: 'question' }),\n totalAnswers: await this.getCount('answers'),\n totalUsers: await this.getUsersCount(),\n totalTags: await this.getCount('tags'),\n totalViews: await this.getCount('post_views'),\n totalComments: await this.getCount('comments'),\n totalVotes:\n (await this.getCount('post_votes')) +\n (await this.getCount('answer_votes')),\n totalArticles: await this.getCount('posts', { type: 'article' }),\n totalLinks: await this.getCount('posts', { type: 'link' }),\n date,\n })\n .onConflict(['date'])\n .merge();\n }\n\n async getGlobalStats(): Promise<GlobalStat[]> {\n return this.db('global_stats').select('*').orderBy('date', 'desc');\n }\n\n async getUserStats(user_ref: string): Promise<UserStat[]> {\n return this.db('user_stats')\n .where('userRef', user_ref)\n .select('*')\n .orderBy('date', 'desc');\n }\n\n async cleanStats(days: number, date: Date): Promise<void> {\n const now = new Date(date);\n now.setDate(now.getDate() - days);\n await this.db('user_stats').where('date', '<=', now).delete();\n await this.db('global_stats').where('date', '<=', now).delete();\n }\n\n async getCount(\n table: string,\n filters?: { author?: string; type?: PostType },\n ): Promise<number> {\n const query = this.db(table);\n if (filters?.author) {\n query.where('author', filters.author);\n }\n if (filters?.type) {\n query.where('type', filters.type);\n }\n const result = await query.count('* as total').first();\n return this.mapToInteger(result?.total);\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.owner) {\n query.where('owner', options.owner);\n }\n\n if (options.fromDate && options.toDate) {\n query.whereBetween('collections.created', [\n `${options.fromDate} 00:00:00.000+00`,\n `${options.toDate} 23:59:59.999+00`,\n ]);\n }\n\n if (options.searchQuery) {\n this.applySearchQuery(\n query,\n ['collections.title', 'collections.description'],\n options.searchQuery,\n );\n }\n\n if (options.tags) {\n const tags = filterTags(options.tags);\n if (options.tagsRelation === 'or') {\n query.leftJoin(\n 'post_tags',\n 'collection_posts.postId',\n 'post_tags.postId',\n );\n query.leftJoin('tags', 'post_tags.tagId', 'tags.id');\n query.where(qb => {\n qb.whereIn('tags.tag', tags).orWhereNull('collection_posts.postId');\n });\n } else {\n tags.forEach((t, i) => {\n query.innerJoin(\n `post_tags AS qt${i}`,\n 'collection_posts.postId',\n `qt${i}.postId`,\n );\n query.innerJoin(`tags AS t${i}`, `qt${i}.tagId`, `t${i}.id`);\n query.where(`t${i}.tag`, '=', t);\n });\n }\n }\n\n if (options.entities) {\n const entityValues = Array.isArray(options.entities)\n ? options.entities\n : [options.entities];\n if (options.entitiesRelation === 'or') {\n query.leftJoin(\n 'post_entities',\n 'collection_posts.postId',\n 'post_entities.postId',\n );\n query.leftJoin('entities', 'post_entities.entityId', 'entities.id');\n query.where(qb => {\n qb.whereIn('entities.entity_ref', entityValues).orWhereNull(\n 'collection_posts.postId',\n );\n });\n } else {\n entityValues.forEach((t, i) => {\n query.innerJoin(\n `post_entities AS pe${i}`,\n 'collection_posts.postId',\n `pe${i}.postId`,\n );\n query.innerJoin(`entities AS e${i}`, `pe${i}.entityId`, `e${i}.id`);\n query.where(`e${i}.entity_ref`, '=', t);\n });\n }\n }\n\n if (options.ids) {\n query.whereIn('collections.id', options.ids);\n }\n\n if (opts?.filters) {\n parseFilter(opts.filters, query, this.db);\n }\n\n const totalQuery = query.clone();\n\n if (options.orderBy) {\n query.orderBy(options.orderBy, options.order || 'desc');\n } else {\n query.orderBy('created', 'desc');\n }\n\n if (options.limit) {\n query.limit(options.limit);\n }\n if (options.offset) {\n query.offset(options.offset);\n }\n const results = await Promise.all([\n query,\n this.db(totalQuery.as('totalQuery')).count('* as CNT').first(),\n ]);\n const rows = results[0] as RawCollectionEntity[];\n const total = this.mapToInteger((results[1] as any)?.CNT);\n return {\n collections: await Promise.all(\n rows.map(async val => {\n return this.mapCollectionEntity(val, user_ref, {\n ...opts,\n includePosts: options.includePosts ?? opts?.includePosts,\n includeExperts: options.includeExperts ?? opts?.includeExperts,\n });\n }),\n ),\n total,\n };\n }\n\n async getCollection(\n user_ref: string,\n id: number,\n options?: CollectionOptions,\n ): Promise<MaybeCollection> {\n const collections = await this.db('collections').where('id', '=', id);\n if (collections.length === 0) {\n return null;\n }\n return this.mapCollectionEntity(collections[0], user_ref, 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 const { user_ref, title, description, created, images, headerImage, opts } =\n options;\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(['id', 'title', 'description', 'created', 'headerImage']);\n\n await this.updateAttachments(\n 'collectionId',\n description ?? '',\n images ?? [],\n collections[0].id,\n headerImage,\n );\n\n return this.mapCollectionEntity(collections[0], user_ref, opts);\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 const { id, user_ref, title, description, images, headerImage, opts } =\n options;\n const query = this.db('collections').where('collections.id', '=', id);\n const rows = await query.update({\n title,\n description,\n headerImage,\n });\n\n if (!rows) {\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.getCollection(user_ref, id, opts);\n }\n\n async deleteCollection(id: number): Promise<boolean> {\n const query = this.db('collections').where('id', '=', id);\n return !!(await query.delete());\n }\n\n async addPostToCollection(\n user_ref: string,\n id: number,\n postId: number,\n options?: CollectionOptions,\n ): Promise<MaybeCollection> {\n await this.db\n .insert({\n collectionId: id,\n postId,\n })\n .into('collection_posts')\n .onConflict()\n .ignore();\n return await 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<MaybeCollection> {\n await this.db('collection_posts')\n .where('collectionId', id)\n .where('postId', postId)\n .delete();\n return await this.getCollection(user_ref, id, options);\n }\n\n async getTemplates(): Promise<Templates> {\n const templates = await this.db('templates').select('*');\n return {\n templates: await Promise.all(\n templates.map(t => this.mapTemplateEntity(t)),\n ),\n total: templates.length,\n };\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 const {\n title,\n questionTitle,\n questionContent,\n description,\n tags,\n entities,\n } = options;\n const templates = await this.db\n .insert(\n {\n title,\n description,\n questionTitle,\n questionContent,\n },\n ['id'],\n )\n .into('templates')\n .returning([\n 'id',\n 'title',\n 'description',\n 'questionTitle',\n 'questionContent',\n ]);\n await Promise.all([\n this.addTags(templates[0].id, tags, true, 'template_tags', 'templateId'),\n this.addEntities(\n templates[0].id,\n entities,\n true,\n 'template_entities',\n 'templateId',\n ),\n ]);\n\n return this.mapTemplateEntity(templates[0]);\n }\n\n async getTemplate(id: number): Promise<MaybeTemplate> {\n const templates = await this.db('templates').where('id', '=', id);\n if (templates.length === 0) {\n return null;\n }\n return this.mapTemplateEntity(templates[0]);\n }\n\n async deleteTemplate(id: number): Promise<boolean> {\n const query = this.db('templates').where('id', '=', id);\n return !!(await query.delete());\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<MaybeTemplate> {\n const {\n id,\n title,\n description,\n questionTitle,\n questionContent,\n tags,\n entities,\n } = options;\n const query = this.db('templates').where('templates.id', '=', id);\n const rows = await query.update({\n title,\n description,\n questionTitle,\n questionContent,\n });\n\n if (!rows) {\n return null;\n }\n\n await Promise.all([\n this.addTags(id, tags, true, 'template_tags', 'templateId'),\n this.addEntities(id, entities, true, 'template_entities', 'templateId'),\n ]);\n\n return await this.getTemplate(id);\n }\n\n async getAIAnswer(postId: number): Promise<AIResponse | null> {\n const row = await this.db<RawPostAIAnswer>('post_ai_answers')\n .where('postId', postId)\n .select()\n .first();\n if (!row) {\n return null;\n }\n return {\n answer: row.answer,\n created: row.created,\n };\n }\n\n async saveAIAnswer(postId: number, response: AIResponse): Promise<void> {\n await this.db\n .insert({\n postId,\n answer: response.answer,\n created: new Date(),\n })\n .into('post_ai_answers')\n .onConflict()\n .ignore();\n }\n\n async deleteAIAnswer(postId: number): Promise<boolean> {\n return !!(await this.db('post_ai_answers')\n .where('postId', postId)\n .delete());\n }\n\n async getPostRank(\n collectionId: number,\n postId: number,\n ): Promise<number | null> {\n const rank = await this.db('collection_posts')\n .where('collectionId', collectionId)\n .where('postId', postId)\n .select('rank')\n .first();\n return rank?.rank ?? null;\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', 'desc')\n .limit(1)\n .select(['postId', 'rank']);\n return post[0] ? { postId: post[0].postId, rank: post[0].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', 'asc')\n .limit(1)\n .select(['postId', 'rank']);\n return post[0] ? { postId: post[0].postId, rank: post[0].rank } : null;\n }\n\n async getNextRankedPostId(\n collectionId: number,\n postId: number,\n ): Promise<CollectionPostRank | null> {\n const rank = await this.getPostRank(collectionId, postId);\n if (rank === null) {\n return null;\n }\n const post = await this.db('collection_posts')\n .where('collectionId', collectionId)\n .where('rank', '>', rank)\n .orderBy('rank', 'asc')\n .select(['postId', 'rank'])\n .first();\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 rank = await this.getPostRank(collectionId, postId);\n if (rank === null) {\n return null;\n }\n const post = await this.db('collection_posts')\n .where('collectionId', collectionId)\n .where('rank', '<', rank)\n .orderBy('rank', 'desc')\n .select(['postId', 'rank'])\n .first();\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 getEntityLinks(): Promise<EntityLinks[]> {\n const rows = await this.db('post_entities')\n .leftJoin('entities', 'post_entities.entityId', 'entities.id')\n .leftJoin('posts', 'post_entities.postId', 'posts.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 private async getTagExpertsById(id: number) {\n const rows = await this.db('tag_experts')\n .where('tagId', id)\n .select('entityRef');\n return rows.map(r => r.entityRef);\n }\n\n private async updateTagExperts(id: number, experts: string[]) {\n await this.db('tag_experts').where('tagId', id).delete();\n await this.db\n .insert(experts.map(e => ({ tagId: id, entityRef: e })))\n .into('tag_experts')\n .onConflict(['tagId', 'entityRef'])\n .merge();\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 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('id', 'entity_ref', postsCount, followerCount)\n .groupBy('entities.id');\n }\n\n private getTagBaseQuery() {\n const tagRef = this.db.ref('tags.id');\n const postsCount = this.db('post_tags')\n .where('post_tags.tagId', tagRef)\n .count('*')\n .as('postsCount');\n\n const followerCount = this.db('user_tags')\n .where('user_tags.tagId', tagRef)\n .count('*')\n .as('followerCount');\n\n return this.db('tags')\n .leftJoin('post_tags', 'tags.id', 'post_tags.tagId')\n .orderBy('postsCount', 'desc')\n .select('id', 'tag', 'description', postsCount, followerCount)\n .groupBy('tags.id');\n }\n\n private getUserBaseQuery() {\n if (this.db.client.config.client !== 'pg') {\n // Subqueries do not work in sqlite so we just return all stats as empty, at least for now\n return this.db('posts')\n .select([\n 'author',\n this.db.raw('0 as totalViews'),\n this.db.raw('0 as totalQuestions'),\n this.db.raw('0 as totalArticles'),\n this.db.raw('0 as totalLinks'),\n this.db.raw('0 as totalAnswers'),\n this.db.raw('0 as answerComments'),\n this.db.raw('0 as postComments'),\n this.db.raw('0 as answerVotes'),\n this.db.raw('0 as postVotes'),\n this.db.raw('0 as totalFollowers'),\n ])\n .distinct();\n }\n\n const authorRef = this.db.ref('unique_authors.author');\n\n const views = this.db('post_views')\n .where('post_views.author', authorRef)\n .count('*')\n .as('totalViews');\n\n const questions = this.db('posts')\n .where('posts.author', authorRef)\n .where('posts.type', 'question')\n .count('*')\n .as('totalQuestions');\n\n const articles = this.db('posts')\n .where('posts.author', authorRef)\n .where('posts.type', 'article')\n .count('*')\n .as('totalArticles');\n\n const links = this.db('posts')\n .where('posts.author', authorRef)\n .where('posts.type', 'link')\n .count('*')\n .as('totalLinks');\n\n const answers = this.db('answers')\n .where('answers.author', authorRef)\n .count('*')\n .as('totalAnswers');\n\n const comments = this.db('comments')\n .where('comments.author', authorRef)\n .count('*')\n .as('comments');\n const aVotes = this.db('answer_votes')\n .where('answer_votes.author', authorRef)\n .count('*')\n .as('answerVotes');\n\n const pVotes = this.db('post_votes')\n .where('post_votes.author', authorRef)\n .count('*')\n .as('postVotes');\n\n const followers = this.db('user_users')\n .where('user_users.followedUserRef', authorRef)\n .count('*')\n .as('totalFollowers');\n\n return this.db('unique_authors').select(\n 'author',\n views,\n questions,\n answers,\n articles,\n links,\n comments,\n pVotes,\n aVotes,\n followers,\n );\n }\n\n /**\n * Maps string or number value to integer. This is due to fact that postgres returns\n * strings instead numbers for count and sum functions.\n * @param val\n */\n private mapToInteger = (val: string | number | undefined): number => {\n return typeof val === 'string' ? Number.parseInt(val, 10) : val ?? 0;\n };\n\n private async mapCollectionEntity(\n val: RawCollectionEntity,\n user_ref: string,\n options?: CollectionOptions,\n ): Promise<Collection> {\n const { postFilters, includePosts = true } = options ?? {};\n const results = await Promise.all([\n includePosts\n ? this.getPosts(\n user_ref,\n { collectionId: val.id, 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: options?.includeExperts ?? false,\n },\n )\n : { posts: [] },\n this.db('attachments').where('collectionId', val.id).select('id'),\n this.db('user_collections')\n .count('*')\n .as('followers')\n .where('collectionId', val.id)\n .first(),\n options?.includeExperts ?? true\n ? this.getCollectionExperts(val.id)\n : undefined,\n ]);\n\n const entities = compact([\n ...new Set(results[0].posts.map(p => p.entities).flat()),\n ]);\n const tags = compact([\n ...new Set(results[0].posts.map(p => 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: results[0].posts,\n headerImage: val.headerImage,\n postsCount: this.mapToInteger(val.postsCount),\n entities,\n tags,\n images: results[1].map(r => r.id),\n followers: this.mapToInteger(results[2]!.count),\n experts: results[3],\n };\n }\n\n private async getCollectionExperts(collectionId: number): Promise<string[]> {\n const rows = await 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 .where('collection_posts.collectionId', collectionId)\n .select('tag_experts.entityRef');\n return [...new Set(rows.map(r => r.entityRef))];\n }\n\n private async mapTemplateEntity(val: RawTemplate): Promise<Template> {\n const additionalInfo = await Promise.all([\n this.getRelatedTags(val.id, 'template_tags', 'templateId'),\n this.getRelatedEntities(val.id, 'template_entities', 'templateId'),\n ]);\n return {\n id: val.id,\n title: val.title,\n description: val.description,\n questionTitle: val.questionTitle ?? undefined,\n questionContent: val.questionContent ?? undefined,\n tags: additionalInfo[0],\n entities: additionalInfo[1],\n };\n }\n\n private async mapPostEntity(\n val: RawPostEntity,\n user_ref: string,\n options?: PostOptions,\n ): Promise<Post> {\n const {\n includeTags = true,\n includeAnswers = true,\n includeVotes = true,\n includeEntities = true,\n includeComments = true,\n includeAttachments = true,\n includeExperts = true,\n tagsFilter,\n } = options ?? {};\n // TODO: This could maybe done with join\n const additionalInfo = await Promise.all([\n includeTags\n ? this.getRelatedTags(val.id, 'post_tags', 'postId', tagsFilter)\n : undefined,\n includeAnswers\n ? this.getPostAnswers(val.id, user_ref, {\n ...options,\n includePost: false,\n filter: options?.answersFilter,\n })\n : undefined,\n includeVotes ? this.getPostVotes(val.id) : undefined,\n includeEntities ? this.getRelatedEntities(val.id) : undefined,\n includeComments\n ? this.getPostComments(val.id, options?.commentsFilter)\n : undefined,\n includeAttachments\n ? this.db('attachments').select('id').where('postId', val.id)\n : undefined,\n includeExperts ? this.getPostExperts(val.id) : undefined,\n ]);\n return {\n id: val.id,\n author:\n val.anonymous && val.author !== user_ref ? 'anonymous' : val.author,\n own: val.author === user_ref,\n title: val.title,\n content: val.content,\n created: val.created as Date,\n updated: val.updated as Date,\n updatedBy: val.updatedBy,\n status: val.status as PostStatus,\n score: this.mapToInteger(val.score),\n views: this.mapToInteger(val.views),\n answersCount: this.mapToInteger(val.answersCount),\n correctAnswer: this.mapToInteger(val.correctAnswers) > 0,\n favorite: this.mapToInteger(val.favorite) > 0,\n tags: additionalInfo[0],\n answers: additionalInfo[1],\n votes: additionalInfo[2],\n entities: additionalInfo[3],\n trend: this.mapToInteger(val.trend),\n comments: additionalInfo[4],\n ownVote: additionalInfo[2]?.find(v => v.author === user_ref)?.score,\n anonymous: val.anonymous,\n type: val.type,\n headerImage: val.headerImage,\n url: val.url ?? undefined,\n images: additionalInfo[5]?.map(r => r.id),\n experts: additionalInfo[6],\n };\n }\n\n private mapComment(val: RawCommentEntity): Comment {\n return {\n id: val.id,\n author: val.author,\n content: val.content,\n created: val.created,\n updated: val.updated,\n updatedBy: val.updatedBy,\n status: val.status as AnswerCommentStatus,\n };\n }\n\n private async mapAnswer(\n val: RawAnswerEntity,\n user_ref: string,\n options?: AnswerOptions,\n ): Promise<Answer> {\n const {\n includeVotes = true,\n includeComments = true,\n includePost = true,\n includeExperts = true,\n } = options ?? {};\n const additionalInfo = await Promise.all([\n includeVotes ? this.getAnswerVotes(val.id) : undefined,\n includeComments\n ? this.getAnswerComments(val.id, options?.commentsFilter)\n : undefined,\n includePost ? this.getPost(user_ref, val.postId, false) : undefined,\n this.db('attachments').select('id').where('answerId', val.id),\n includeExperts ? this.getAnswerExperts(val.id) : undefined,\n ]);\n return {\n id: val.id,\n postId: val.postId,\n own: val.author === user_ref,\n author:\n val.anonymous && val.author !== user_ref ? 'anonymous' : val.author,\n content: val.content,\n correct: val.correct,\n created: val.created,\n updated: val.updated,\n updatedBy: val.updatedBy,\n score: this.mapToInteger(val.score),\n status: val.status as AnswerCommentStatus,\n votes: additionalInfo[0],\n comments: additionalInfo[1],\n anonymous: val.anonymous,\n post: additionalInfo[2] ?? undefined,\n images: additionalInfo[3].map(r => r.id),\n experts: additionalInfo[4] ?? undefined,\n };\n }\n\n private mapVote(val: RawPostVoteEntity | RawAnswerVoteEntity): Vote {\n return {\n author: val.author,\n score: val.score,\n timestamp: val.timestamp,\n };\n }\n\n private mapAttachment(val: RawAttachment): Attachment {\n return {\n ...val,\n created:\n val.created instanceof Date ? val.created : new Date(val.created),\n };\n }\n\n private async getRelatedTags(\n id: number,\n tableName: string = 'post_tags',\n columnName: string = 'postId',\n tagsFilter?: PermissionCriteria<QetaFilters>,\n ): Promise<string[]> {\n const query = this.db<RawTagEntity>('tags')\n .leftJoin(tableName, 'tags.id', `${tableName}.tagId`)\n .where(`${tableName}.${columnName}`, '=', id);\n\n if (tagsFilter) {\n parseFilter(tagsFilter, query, this.db, 'tags');\n }\n\n const rows = await query.select();\n return rows.map(val => val.tag);\n }\n\n private async getPostComments(\n postId: number,\n commentsFilter?: PermissionCriteria<QetaFilters>,\n opts?: CommentOptions,\n ): Promise<Comment[]> {\n const { includeStatusFilter = true } = opts ?? {};\n const query = this.db<RawCommentEntity>('comments')\n .where('comments.postId', '=', postId)\n .orderBy('created');\n if (includeStatusFilter) {\n query.where('comments.status', '=', 'active');\n }\n if (commentsFilter) {\n parseFilter(commentsFilter, query, this.db, 'comments');\n }\n const rows = await query.select();\n return rows.map(val => this.mapComment(val));\n }\n\n private async getPostExperts(postId: number): Promise<string[]> {\n const rows = await this.db('tag_experts')\n .leftJoin('post_tags', 'tag_experts.tagId', 'post_tags.tagId')\n .where('post_tags.postId', postId)\n .select('tag_experts.entityRef');\n return [...new Set(rows.map(r => r.entityRef))];\n }\n\n private async getAnswerComments(\n answerId: number,\n commentsFilter?: PermissionCriteria<QetaFilters>,\n opts?: CommentOptions,\n ): Promise<Comment[]> {\n const { includeStatusFilter = true } = opts ?? {};\n const query = this.db<RawCommentEntity>('comments')\n .where('comments.answerId', '=', answerId)\n .orderBy('created');\n if (includeStatusFilter) {\n query.where('comments.status', '=', 'active');\n }\n if (commentsFilter) {\n parseFilter(commentsFilter, query, this.db, 'comments');\n }\n const rows = await query.select();\n return rows.map(val => this.mapComment(val));\n }\n\n private async getRelatedEntities(\n id: number,\n tableName: string = 'post_entities',\n columnName: string = 'postId',\n ): Promise<string[]> {\n const rows = await this.db<RawTagEntity>('entities')\n .leftJoin(tableName, 'entities.id', `${tableName}.entityId`)\n .where(`${tableName}.${columnName}`, '=', id)\n .select();\n return rows.map(val => val.entity_ref);\n }\n\n private async getPostVotes(postId: number): Promise<Vote[]> {\n const rows = (await this.db<RawPostVoteEntity>('post_votes')\n .where('postId', '=', postId)\n .select()) as RawPostVoteEntity[];\n return rows.map(val => this.mapVote(val));\n }\n\n private async getAnswerVotes(answerId: number): Promise<Vote[]> {\n const rows = (await this.db<RawAnswerVoteEntity>('answer_votes')\n .where('answerId', '=', answerId)\n .select()) as RawAnswerVoteEntity[];\n return rows.map(val => this.mapVote(val));\n }\n\n private async getAnswerExperts(answerId: number): Promise<string[]> {\n const rows = await this.db('tag_experts')\n .leftJoin('tags', 'tag_experts.tagId', 'tags.id')\n .leftJoin('post_tags', 'post_tags.tagId', 'tags.id')\n .leftJoin('answers', 'answers.postId', 'post_tags.postId')\n .where('answers.id', answerId)\n .select('tag_experts.entityRef');\n return [...new Set(rows.map(r => r.entityRef))];\n }\n\n private getAnswerBaseQuery() {\n const postRef = this.db.ref('answers.id');\n\n const score = this.db('answer_votes')\n .where('answer_votes.answerId', postRef)\n .sum('score')\n .as('score');\n\n return this.db<RawAnswerEntity>('answers') // nosonar\n .leftJoin('answer_votes', 'answers.id', 'answer_votes.answerId')\n .select('answers.*', score)\n .groupBy('answers.id');\n }\n\n private async getPostAnswers(\n postId: number,\n user_ref: string,\n options?: AnswerOptions,\n ): Promise<Answer[]> {\n const { includeStatusFilter = true } = options ?? {};\n const query = this.getAnswerBaseQuery()\n .where('postId', '=', postId)\n .orderBy('answers.correct', 'desc')\n .orderBy('answers.created');\n if (includeStatusFilter) {\n query.where('answers.status', '=', 'active');\n }\n\n if (options?.filter) {\n parseFilter(options.filter, query, this.db, 'answer');\n }\n\n const rows = await query.select();\n\n return await Promise.all(\n rows.map(async val => {\n return this.mapAnswer(val, user_ref, options);\n }),\n );\n }\n\n private async recordPostView(\n postId: number,\n user_ref: string,\n ): Promise<void> {\n await this.db\n .insert({\n author: user_ref,\n postId,\n timestamp: new Date(),\n })\n .into('post_views');\n }\n\n private getPostsBaseQuery(user: string, opts?: AnswerOptions) {\n const { includeStatusFilter = true } = opts ?? {};\n const postRef = this.db.ref('posts.id');\n\n const score = this.db('post_votes')\n .where('post_votes.postId', postRef)\n .sum('score')\n .as('score');\n\n const views = this.db('post_views')\n .where('post_views.postId', postRef)\n .count('*')\n .as('views');\n\n const answersCount = this.db('answers')\n .where('answers.postId', postRef)\n .count('*')\n .as('answersCount');\n if (includeStatusFilter) {\n answersCount.where('answers.status', '=', 'active');\n }\n\n const correctAnswers = this.db('answers')\n .where('answers.postId', postRef)\n .where('answers.correct', '=', true)\n .count('*')\n .as('correctAnswers');\n if (includeStatusFilter) {\n correctAnswers.where('answers.status', '=', 'active');\n }\n\n const favorite = this.db('user_favorite')\n .where('user_favorite.user', '=', user)\n .where('user_favorite.postId', postRef)\n .count('*')\n .as('favorite');\n\n return this.db<RawPostEntity>('posts') // nosonar\n .select('posts.*', score, views, answersCount, correctAnswers, favorite)\n .leftJoin('post_votes', 'posts.id', 'post_votes.postId')\n .leftJoin('post_views', 'posts.id', 'post_views.postId')\n .leftJoin('answers', 'posts.id', 'answers.postId')\n .leftJoin('user_favorite', 'posts.id', 'user_favorite.postId')\n .groupBy('posts.id');\n }\n\n private getCollectionsBaseQuery() {\n const collectionRef = this.db.ref('collections.id');\n const postsCount = this.db('collection_posts')\n .leftJoin('posts', 'collection_posts.postId', 'posts.id')\n .where('collection_posts.collectionId', collectionRef)\n .where('posts.status', '=', 'active')\n .count('*')\n .as('postsCount');\n\n return this.db<RawCollectionEntity>('collections')\n .select('collections.*', postsCount)\n .leftJoin(\n 'collection_posts',\n 'collections.id',\n 'collection_posts.collectionId',\n )\n .leftJoin('posts', 'collection_posts.postId', 'posts.id')\n .groupBy('collections.id');\n }\n\n private async addTags(\n id: number,\n tagsInput?: string[],\n removeOld?: boolean,\n tableName: string = 'post_tags',\n columnName: string = 'postId',\n ) {\n const tags = filterTags(tagsInput);\n if (removeOld) {\n await this.db(tableName).where(columnName, '=', id).delete();\n }\n\n if (!tags || tags.length === 0) {\n return;\n }\n const existingTags = await this.db('tags')\n .whereIn('tag', tags)\n .returning('id')\n .select();\n const newTags = tags.filter(t => !existingTags.some(e => e.tag === t));\n const allTags: Record<string, string> = {\n ...TAGS,\n ...(await this.tagDatabase?.getTags()),\n };\n\n const tagIds = (\n await Promise.all(\n [...new Set(newTags)].map(async tag => {\n const trimmed = tag.trim();\n const description = trimmed in allTags ? allTags[trimmed] : undefined;\n\n return this.db\n .insert({ tag: trimmed, description })\n .into('tags')\n .returning('id')\n .onConflict('tag')\n .ignore();\n }),\n )\n )\n .flat()\n .map(tag => tag.id)\n .concat(existingTags.map(t => t.id));\n\n await Promise.all(\n tagIds.map(async tagId => {\n await this.db\n .insert({ [columnName]: id, tagId })\n .into(tableName)\n .onConflict()\n .ignore();\n }),\n );\n }\n\n private 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+/g;\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 async markAnswer(\n postId: number,\n answerId: number,\n correct: boolean,\n ): Promise<boolean> {\n // There can be only one correct answer\n if (correct) {\n const exists = await this.db('answers')\n .select('id')\n .where('correct', '=', true)\n .where('postId', '=', postId);\n if (exists && exists.length > 0) {\n return false;\n }\n }\n\n const query = this.db('answers')\n .onConflict()\n .ignore()\n .where('answers.id', '=', answerId)\n .where('postId', '=', postId);\n\n const ret = await query.update({ correct }, ['id']);\n return ret !== undefined && ret?.length > 0;\n }\n\n private 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<Attachment>('attachments')\n .whereIn('id', images)\n .update({ [key]: id });\n }\n\n const attachments = await this.db<Attachment>('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<Attachment>('attachments')\n .whereIn('uuid', toRemove)\n .update({ [key]: null });\n }\n\n private 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"],"names":["resolvePackagePath","isNotCriteria","compact","isOrCriteria","isAndCriteria","filterTags","rows","TAGS"],"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 { Knex } from 'knex';\nimport {\n AnswerOptions,\n Answers,\n AttachmentParameters,\n CollectionOptions,\n CollectionPostRank,\n Collections,\n CommentOptions,\n EntitiesResponse,\n EntityResponse,\n MaybeAnswer,\n MaybeCollection,\n MaybeComment,\n MaybePost,\n MaybeTemplate,\n PostOptions,\n Posts,\n QetaStore,\n Templates,\n UserResponse,\n UsersResponse,\n} from './QetaStore';\nimport {\n AIResponse,\n Answer,\n AnswerCommentStatus,\n AnswersQuery,\n Attachment,\n Collection,\n CollectionsQuery,\n Comment,\n EntitiesQuery,\n EntityLinks,\n filterTags,\n GlobalStat,\n Post,\n PostsQuery,\n PostStatus,\n PostType,\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 Vote,\n} from '@drodil/backstage-plugin-qeta-common';\nimport { PermissionCriteria } from '@backstage/plugin-permission-common';\nimport { QetaFilter, QetaFilters } from '../service/util';\nimport {\n isAndCriteria,\n isNotCriteria,\n isOrCriteria,\n} from '@backstage/plugin-permission-node';\nimport { compact } from 'lodash';\nimport { TAGS } from '../tagDb';\nimport { TagDatabase } from '@drodil/backstage-plugin-qeta-node';\nimport { EntityLink } from '@backstage/catalog-model';\n\nconst migrationsDir = resolvePackagePath(\n '@drodil/backstage-plugin-qeta-backend',\n 'migrations',\n);\n\nexport type RawPostEntity = {\n id: number;\n author: string;\n title: string;\n content: string;\n status: string;\n created: Date | string;\n updated: Date | string;\n updatedBy: string;\n score: number | string;\n views: number | string;\n answersCount: number | string;\n correctAnswers: number | string;\n commentsCount: number | string;\n favorite: number | string;\n trend: number | string;\n anonymous: boolean;\n type: 'question' | 'article' | 'link';\n headerImage: string;\n url: string | null;\n};\n\nexport type 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 type RawAnswerEntity = {\n id: number;\n postId: number;\n author: string;\n content: string;\n correct: boolean;\n score: number | string;\n created: Date;\n updated: Date;\n updatedBy: string;\n anonymous: boolean;\n status: string;\n};\n\nexport type RawPostVoteEntity = {\n postId: number;\n author: string;\n score: number;\n timestamp: Date;\n};\n\nexport type RawAnswerVoteEntity = {\n answerId: number;\n author: string;\n score: number;\n timestamp: Date;\n};\n\nexport type RawTagEntity = {\n id: number;\n tag: string;\n};\n\nexport type RawCommentEntity = {\n id: number;\n author: string;\n content: string;\n created: Date;\n updated: Date;\n updatedBy: string;\n status: string;\n};\n\nexport type RawUserImpact = {\n userRef: string;\n impact: number;\n date: Date;\n};\n\nexport type RawTagExpert = {\n tagId: number;\n entityRef: string;\n};\n\nexport type RawTemplate = {\n id: number;\n title: string;\n description: string;\n questionTitle: string | null;\n questionContent: string | null;\n};\n\nexport type RawPostAIAnswer = {\n id: number;\n answer: string;\n created: Date;\n};\n\nexport type RawAttachment = Omit<Attachment, 'created'> & {\n created: Date | string | number;\n};\n\nfunction isQetaFilter(filter: any): filter is QetaFilter {\n return filter.hasOwnProperty('property');\n}\n\nfunction 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 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.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.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('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('answers.id');\n query.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.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('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('collection_posts.collectionId');\n query.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.whereIn(fk, postIds);\n return query;\n }\n\n if (values.length === 0) {\n return query.whereNull(filter.property);\n }\n\n return query.whereIn(filter.property, values);\n }\n\n return query[negate ? 'andWhereNot' : 'andWhere'](function filterFunction() {\n if (isOrCriteria(filter)) {\n for (const subFilter of filter.anyOf ?? []) {\n this.orWhere(subQuery =>\n parseFilter(subFilter, subQuery, db, type, false),\n );\n }\n } else if (isAndCriteria(filter)) {\n for (const subFilter of filter.allOf ?? []) {\n this.andWhere(subQuery =>\n parseFilter(subFilter, subQuery, db, type, false),\n );\n }\n }\n });\n}\n\nexport class DatabaseQetaStore implements QetaStore {\n private constructor(\n private readonly db: Knex,\n private readonly tagDatabase?: TagDatabase,\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 // prettier-ignore\n await client.migrate.latest({ // nosonar\n directory: migrationsDir,\n });\n }\n\n return new DatabaseQetaStore(client, tagDatabase);\n }\n\n async getPosts(\n user_ref: string,\n options: PostsQuery,\n filters?: PermissionCriteria<QetaFilters>,\n opts?: PostOptions,\n ): Promise<Posts> {\n const { includeTotal = true, includeDraftFilter = true } = opts ?? {};\n const query = this.getPostsBaseQuery(user_ref);\n if (options.type) {\n query.where('posts.type', options.type);\n }\n\n if (options.fromDate && options.toDate) {\n query.whereBetween('posts.created', [\n `${options.fromDate} 00:00:00.000+00`,\n `${options.toDate} 23:59:59.999+00`,\n ]);\n } else if (options.fromDate) {\n query.where('posts.created', '>=', `${options.fromDate} 00:00:00.000+00`);\n } else if (options.toDate) {\n query.where('posts.created', '<=', `${options.toDate} 23:59:59.999+00`);\n }\n\n if (options.author) {\n if (Array.isArray(options.author)) {\n query.whereIn('posts.author', options.author);\n } else {\n query.where('posts.author', '=', options.author);\n }\n }\n\n if (options.excludeAuthors) {\n query.whereNotIn('posts.author', options.excludeAuthors);\n }\n\n if (options.status) {\n if (options.status === 'draft') {\n query.where('posts.author', '=', user_ref);\n }\n query.where('posts.status', '=', options.status);\n } else if (includeDraftFilter) {\n query.where(q => {\n q.where('posts.status', 'active').orWhere(q2 => {\n q2.where('posts.status', 'draft').where(\n 'posts.author',\n '=',\n user_ref,\n );\n });\n });\n }\n\n if (filters) {\n parseFilter(filters, query, this.db);\n }\n\n if (options.searchQuery) {\n this.applySearchQuery(\n query,\n ['posts.title', 'posts.content'],\n options.searchQuery,\n );\n }\n\n if (options.tags) {\n const tags = filterTags(options.tags);\n if (options.tagsRelation === 'or') {\n query.innerJoin('post_tags', 'posts.id', 'post_tags.postId');\n query.innerJoin('tags', 'post_tags.tagId', 'tags.id');\n query.whereIn('tags.tag', tags);\n } else {\n tags.forEach((t, i) => {\n query.innerJoin(`post_tags AS qt${i}`, 'posts.id', `qt${i}.postId`);\n query.innerJoin(`tags AS t${i}`, `qt${i}.tagId`, `t${i}.id`);\n query.where(`t${i}.tag`, '=', t);\n });\n }\n }\n\n if (options.entities) {\n const entityValues = Array.isArray(options.entities)\n ? options.entities\n : [options.entities];\n if (options.entitiesRelation === 'or') {\n query\n .innerJoin('post_entities', 'posts.id', 'post_entities.postId')\n .innerJoin('entities', 'post_entities.entityId', 'entities.id')\n .whereIn('entities.entity_ref', entityValues);\n } else {\n entityValues.forEach((t, i) => {\n query.innerJoin(\n `post_entities AS pe${i}`,\n 'posts.id',\n `pe${i}.postId`,\n );\n query.innerJoin(`entities AS e${i}`, `pe${i}.entityId`, `e${i}.id`);\n query.where(`e${i}.entity_ref`, '=', t);\n });\n }\n }\n\n if (options.collectionId) {\n query.innerJoin(\n 'collection_posts',\n 'posts.id',\n 'collection_posts.postId',\n );\n query.where('collection_posts.collectionId', options.collectionId);\n } else if (options.orderBy === 'rank') {\n query.innerJoin(\n 'collection_posts',\n 'posts.id',\n 'collection_posts.postId',\n );\n }\n if (options.orderBy === 'rank') {\n query.groupBy('rank');\n }\n\n if (options.noAnswers) {\n query.whereNull('answers.postId');\n }\n\n if (options.hasAnswers) {\n query.whereNotNull('answers.postId');\n }\n\n if (options.noCorrectAnswer) {\n query.leftJoin('answers as correct_answer', builder => {\n builder\n .on('posts.id', 'correct_answer.postId')\n .on('correct_answer.correct', this.db.raw('?', [true]));\n });\n query.whereNull('correct_answer.postId');\n }\n\n if (options.noVotes) {\n query.whereNull('post_votes.postId');\n }\n\n if (options.favorite) {\n query.where('user_favorite.user', '=', user_ref);\n query.whereNotNull('user_favorite.postId');\n }\n\n if (options.includeTrend || options.orderBy === 'trend') {\n query.select(\n this.db.raw(\n `(\n (SELECT COALESCE(SUM(score), 0) FROM post_votes WHERE \"postId\" = posts.id) * 200 + \n (SELECT COALESCE(COUNT(*), 0) FROM answers WHERE \"postId\" = posts.id) * 100 +\n (SELECT COALESCE(COUNT(*), 0) FROM user_favorite WHERE \"postId\" = posts.id) * 50 +\n (SELECT COALESCE(COUNT(*), 0) FROM post_views WHERE \"postId\" = posts.id) * 10 +\n (SELECT COALESCE(COUNT(*), 0) FROM comments WHERE \"postId\" = posts.id) * 30\n ) / \n POWER(\n EXTRACT(EPOCH FROM (now() - posts.created)) / 172800 + 1,\n 1.5\n ) as trend`,\n ),\n );\n }\n\n if (options.ids) {\n query.whereIn('posts.id', options.ids);\n }\n\n const totalQuery = query.clone();\n\n if (options.random) {\n query.orderByRaw('RANDOM()');\n } else if (options.orderBy) {\n query.orderBy(options.orderBy, options.order ? options.order : 'desc');\n } else {\n query.orderBy('created', '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 includeTotal\n ? this.db(totalQuery.as('totalQuery')).count('* as CNT').first()\n : undefined,\n ]);\n const rows = results[0] as RawPostEntity[];\n const total = this.mapToInteger((results[1] as any)?.CNT);\n\n return {\n posts: await Promise.all(\n rows.map(async val => {\n return this.mapPostEntity(val, user_ref, {\n ...opts,\n includeAnswers: options.includeAnswers ?? opts?.includeAnswers,\n includeVotes: options.includeVotes ?? opts?.includeVotes,\n includeEntities: options.includeEntities ?? opts?.includeEntities,\n includeAttachments:\n options.includeAttachments ?? opts?.includeAttachments,\n includeExperts: options.includeExperts ?? opts?.includeExperts,\n });\n }),\n ),\n total,\n };\n }\n\n async getPost(\n user_ref: string,\n id: number,\n recordView?: boolean,\n options?: PostOptions,\n ): Promise<MaybePost> {\n const rows = await this.getPostsBaseQuery(user_ref).where(\n 'posts.id',\n '=',\n id,\n );\n\n if (!rows || rows.length === 0) {\n return null;\n }\n const post = rows[0] as unknown as RawPostEntity;\n\n if ((recordView === undefined || recordView) && post.status === 'active') {\n this.recordPostView(id, user_ref);\n }\n return await this.mapPostEntity(post, user_ref, options);\n }\n\n async getPostByAnswerId(\n user_ref: string,\n answerId: number,\n recordView?: boolean,\n options?: PostOptions,\n ): Promise<MaybePost> {\n const rows = await this.getPostsBaseQuery(user_ref)\n .where('answers.id', '=', answerId)\n .select('posts.*');\n if (!rows || rows.length === 0) {\n return null;\n }\n if (recordView === undefined || recordView) {\n this.recordPostView(rows[0].id, user_ref);\n }\n return await this.mapPostEntity(\n rows[0] as unknown as RawPostEntity,\n user_ref,\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 const {\n user_ref,\n title,\n content,\n author,\n created,\n tags,\n entities,\n images,\n anonymous,\n type = 'question',\n headerImage,\n url,\n opts,\n status = 'active',\n } = options;\n const posts = await this.db\n .insert(\n {\n author: author ?? user_ref,\n title,\n content,\n created,\n anonymous: anonymous ?? false,\n type: type ?? 'question',\n headerImage,\n url,\n status,\n },\n ['id'],\n )\n .into('posts')\n .returning([\n 'id',\n 'author',\n 'title',\n 'content',\n 'created',\n 'anonymous',\n 'type',\n 'status',\n 'url',\n ]);\n\n await Promise.all([\n this.addTags(posts[0].id, tags),\n this.addEntities(posts[0].id, entities),\n ]);\n\n await this.updateAttachments(\n 'postId',\n content ?? '',\n images ?? [],\n posts[0].id,\n headerImage,\n );\n\n return this.mapPostEntity(posts[0], user_ref, opts);\n }\n\n async commentPost(\n post_id: number,\n user_ref: string,\n content: string,\n created: Date,\n options?: PostOptions,\n ): Promise<MaybePost> {\n await this.db\n .insert({\n author: user_ref,\n content,\n created,\n postId: post_id,\n })\n .into('comments');\n\n return await this.getPost(user_ref, post_id, false, options);\n }\n\n async updatePostComment(\n post_id: number,\n id: number,\n user_ref: string,\n content: string,\n options?: PostOptions,\n ): Promise<MaybePost> {\n const query = this.db('comments')\n .where('id', '=', id)\n .where('postId', '=', post_id);\n await query.update({ content, updatedBy: user_ref, updated: new Date() });\n return this.getPost(user_ref, post_id, false, options);\n }\n\n async deletePostComment(\n post_id: number,\n id: number,\n user_ref: string,\n permanently?: boolean,\n options?: PostOptions,\n ): Promise<MaybePost> {\n const query = this.db('comments')\n .where('id', '=', id)\n .where('postId', '=', post_id);\n if (permanently) {\n await query.delete();\n } else {\n await query.update({ status: 'deleted' });\n }\n\n return this.getPost(user_ref, post_id, false, options);\n }\n\n async commentAnswer(\n answer_id: number,\n user_ref: string,\n content: string,\n created: Date,\n options?: AnswerOptions,\n ): Promise<MaybeAnswer> {\n await this.db\n .insert({\n author: user_ref,\n content,\n created,\n answerId: answer_id,\n })\n .into('comments');\n return this.getAnswer(answer_id, user_ref, options);\n }\n\n async updateAnswerComment(\n answer_id: number,\n id: number,\n user_ref: string,\n content: string,\n options?: AnswerOptions,\n ): Promise<MaybeAnswer> {\n const query = this.db('comments')\n .where('id', '=', id)\n .where('answerId', '=', answer_id);\n await query.update({ content, updatedBy: user_ref, updated: new Date() });\n return this.getAnswer(answer_id, user_ref, options);\n }\n\n async deleteAnswerComment(\n answer_id: number,\n id: number,\n user_ref: string,\n permanently?: boolean,\n options?: AnswerOptions,\n ): Promise<MaybeAnswer> {\n const query = this.db('comments')\n .where('id', '=', id)\n .where('answerId', '=', answer_id);\n if (permanently) {\n await query.delete();\n } else {\n await query.update({ status: 'deleted' });\n }\n return this.getAnswer(answer_id, user_ref, options);\n }\n\n async 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 const {\n id,\n user_ref,\n title,\n content,\n author,\n tags,\n entities,\n images,\n headerImage,\n url,\n setUpdatedBy = true,\n opts,\n status = 'active',\n } = options;\n const query = this.db('posts').where('posts.id', '=', id);\n const rows = await query.update({\n title,\n content,\n headerImage,\n author,\n url,\n updatedBy: setUpdatedBy ? user_ref : undefined,\n updated: setUpdatedBy ? new Date() : undefined,\n status,\n });\n\n if (!rows) {\n return null;\n }\n\n await Promise.all([\n this.addTags(id, tags, true),\n this.addEntities(id, entities, true),\n ]);\n\n await this.updateAttachments(\n 'postId',\n content ?? '',\n images ?? [],\n id,\n headerImage,\n );\n\n return await this.getPost(user_ref, id, false, opts);\n }\n\n async deletePost(id: number, permanently?: boolean): Promise<boolean> {\n if (permanently) {\n const rows = await this.db('posts').where('id', '=', id).delete();\n return rows > 0;\n }\n const rows = await this.db('posts').where('id', '=', id).update({\n status: 'deleted',\n });\n return rows > 0;\n }\n\n async answerPost(\n user_ref: string,\n postId: number,\n answer: string,\n created: Date,\n images?: number[],\n anonymous?: boolean,\n options?: AnswerOptions,\n ): Promise<MaybeAnswer> {\n const answers = await this.db\n .insert({\n postId,\n author: user_ref,\n content: answer,\n correct: false,\n created,\n anonymous: anonymous ?? false,\n })\n .into('answers')\n .returning('id');\n\n await this.updateAttachments(\n 'answerId',\n answer,\n images ?? [],\n answers[0].id,\n );\n\n return this.getAnswer(answers[0].id, user_ref, options);\n }\n\n async updateAnswer(\n user_ref: string,\n postId: number,\n answerId: number,\n answer: string,\n author?: string,\n images?: number[],\n options?: AnswerOptions,\n ): Promise<MaybeAnswer> {\n const query = this.db('answers')\n .where('answers.id', '=', answerId)\n .where('answers.postId', '=', postId);\n\n const rows = await query.update({\n content: answer,\n author: author,\n updatedBy: user_ref,\n updated: new Date(),\n });\n\n if (!rows) {\n return null;\n }\n\n await this.updateAttachments('answerId', answer, images ?? [], answerId);\n\n return this.getAnswer(answerId, user_ref, options);\n }\n\n async getAnswers(\n user_ref: string,\n options: AnswersQuery,\n filters?: PermissionCriteria<QetaFilters>,\n opts?: AnswerOptions,\n ): Promise<Answers> {\n const { includeStatusFilter = true } = opts ?? {};\n const query = this.getAnswerBaseQuery();\n if (includeStatusFilter) {\n query.where('answers.status', '=', 'active');\n }\n if (options.fromDate && options.toDate) {\n query.whereBetween('answers.created', [\n `${options.fromDate} 00:00:00.000+00`,\n `${options.toDate} 23:59:59.999+00`,\n ]);\n }\n\n if (options.author) {\n query.where('answers.author', '=', options.author);\n }\n\n if (filters) {\n parseFilter(filters, query, this.db, 'answer');\n }\n\n if (options.tags) {\n const tags = filterTags(options.tags);\n if (options.tagsRelation === 'or') {\n query.innerJoin('post_tags', 'answers.postId', 'post_tags.postId');\n query.innerJoin('tags', 'post_tags.tagId', 'tags.id');\n query.whereIn('tags.tag', tags);\n } else {\n tags.forEach((t, i) => {\n query.innerJoin(\n `post_tags AS at${i}`,\n 'answers.postId',\n `at${i}.postId`,\n );\n query.innerJoin(`tags AS t${i}`, `at${i}.tagId`, `t${i}.id`);\n query.where(`t${i}.tag`, '=', t);\n });\n }\n }\n\n if (options.entities) {\n if (options.entitiesRelation === 'or') {\n query.innerJoin(\n 'post_entities',\n 'answers.postId',\n 'post_entities.postId',\n );\n query.innerJoin('entities', 'post_entities.entityId', 'entities.id');\n query.whereIn('entities.entity_ref', options.entities);\n } else {\n options.entities.forEach((t, i) => {\n query.innerJoin(\n `post_entities AS pe${i}`,\n 'answers.postId',\n `pe${i}.postId`,\n );\n query.innerJoin(`entities AS e${i}`, `pe${i}.entityId`, `e${i}.id`);\n query.where(`e${i}.entity_ref`, '=', t);\n });\n }\n }\n\n if (options.noCorrectAnswer) {\n query.where('correct', '=', false);\n }\n\n if (options.noVotes) {\n query.whereNull('answer_votes.answerId');\n }\n\n if (options.searchQuery) {\n this.applySearchQuery(query, ['answers.content'], options.searchQuery);\n }\n\n const totalQuery = query.clone();\n\n if (options.orderBy) {\n query.orderBy(options.orderBy, options.order ? options.order : 'desc');\n } else {\n query.orderBy('created', '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 if (options.ids) {\n query.whereIn('answers.id', options.ids);\n }\n\n const results = await Promise.all([\n query,\n this.db(totalQuery.as('totalQuery')).count('* as CNT').first(),\n ]);\n const rows = results[0] as RawAnswerEntity[];\n const total = this.mapToInteger((results[1] as any)?.CNT);\n\n return {\n answers: await Promise.all(\n rows.map(async val => {\n return this.mapAnswer(val, user_ref, opts);\n }),\n ),\n total,\n };\n }\n\n async getAnswer(\n answerId: number,\n user_ref: string,\n options?: AnswerOptions,\n ): Promise<MaybeAnswer> {\n const { includeStatusFilter = true } = options ?? {};\n const query = this.getAnswerBaseQuery().where('id', '=', answerId);\n if (includeStatusFilter) {\n query.where('answers.status', '=', 'active');\n }\n const answers = await query.select();\n return this.mapAnswer(answers[0], user_ref, options);\n }\n\n async getComments(\n options?: { ids?: number[] },\n opts?: CommentOptions,\n ): Promise<Comment[]> {\n const { includeStatusFilter = true } = opts ?? {};\n const query = this.db('comments');\n if (options?.ids) {\n query.whereIn('id', options.ids);\n }\n if (includeStatusFilter) {\n query.where('status', '=', 'active');\n }\n const comments = await query.select();\n return await Promise.all(comments.map(this.mapComment));\n }\n\n async getComment(\n commentId: number,\n opts?: CommentOptions & { postId?: number; answerId?: number },\n ): Promise<MaybeComment> {\n const { includeStatusFilter = true } = opts ?? {};\n const query = this.db<RawCommentEntity>('comments') // nosonar\n .where('comments.id', '=', commentId);\n if (includeStatusFilter) {\n query.where('status', '=', 'active');\n }\n if (opts?.postId) {\n query.andWhere('comments.postId', '=', opts.postId);\n }\n if (opts?.answerId) {\n query.andWhere('comments.answerId', '=', opts.answerId);\n }\n\n const comments = await query.select();\n if (comments.length === 0) {\n return null;\n }\n return await this.mapComment(comments[0]);\n }\n\n async deleteAnswer(id: number, permanently?: boolean): Promise<boolean> {\n const query = this.db('answers').where('id', '=', id);\n if (permanently) {\n return !!(await query.delete());\n }\n const rows = await query.update({ status: 'deleted' });\n return rows > 0;\n }\n\n async clickPost(user_ref: string, postId: number): Promise<void> {\n const existingRows = await this.db('post_votes')\n .where('author', '=', user_ref)\n .where('postId', '=', postId);\n\n if (existingRows.length) {\n await this.db('post_votes')\n .where('author', '=', user_ref)\n .where('postId', '=', postId)\n .increment('score', 1);\n } else {\n await this.db\n .insert({\n author: user_ref,\n postId,\n score: 1,\n timestamp: new Date(),\n })\n .onConflict()\n .ignore()\n .into('post_votes');\n }\n }\n\n async deletePostVote(user_ref: string, postId: number): Promise<boolean> {\n return !!(await this.db('post_votes')\n .where('author', '=', user_ref)\n .where('postId', '=', postId)\n .delete());\n }\n\n async votePost(\n user_ref: string,\n postId: number,\n score: number,\n ): Promise<boolean> {\n await this.db('post_votes')\n .where('author', '=', user_ref)\n .where('postId', '=', postId)\n .delete();\n\n const id = await this.db\n .insert(\n {\n author: user_ref,\n postId,\n score,\n timestamp: new Date(),\n },\n ['postId'],\n )\n .onConflict()\n .ignore()\n .into('post_votes');\n return id && id.length > 0;\n }\n\n async favoritePost(user_ref: string, postId: number): Promise<boolean> {\n const id = await this.db\n .insert(\n {\n user: user_ref,\n postId,\n },\n ['postId'],\n )\n .onConflict()\n .ignore()\n .into('user_favorite');\n return id && id.length > 0;\n }\n\n async unfavoritePost(user_ref: string, postId: number): Promise<boolean> {\n return !!(await this.db('user_favorite')\n .where('user', '=', user_ref)\n .where('postId', '=', postId)\n .delete());\n }\n\n async getUsersWhoFavoritedPost(postId: number): Promise<string[]> {\n const query = this.db('user_favorite').where('postId', '=', postId);\n const users = await query.select('user');\n return users.map(u => u.user);\n }\n\n async deleteAnswerVote(user_ref: string, answerId: number): Promise<boolean> {\n return !!(await this.db('answer_votes')\n .where('author', '=', user_ref)\n .where('answerId', '=', answerId)\n .delete());\n }\n\n async voteAnswer(\n user_ref: string,\n answerId: number,\n score: number,\n ): Promise<boolean> {\n await this.db('answer_votes')\n .where('author', '=', user_ref)\n .where('answerId', '=', answerId)\n .delete();\n\n const id = await this.db\n .insert(\n {\n author: user_ref,\n answerId,\n score,\n timestamp: new Date(),\n },\n ['answerId'],\n )\n .onConflict()\n .ignore()\n .into('answer_votes');\n return id && id.length > 0;\n }\n\n async markAnswerCorrect(postId: number, answerId: number): Promise<boolean> {\n return await this.markAnswer(postId, answerId, true);\n }\n\n async markAnswerIncorrect(\n postId: number,\n answerId: number,\n ): Promise<boolean> {\n return await this.markAnswer(postId, answerId, false);\n }\n\n async getTags(\n options?: { noDescription?: boolean; ids?: number[] } & TagsQuery,\n filters?: PermissionCriteria<QetaFilters>,\n ): Promise<TagsResponse> {\n const { includeExperts = true } = options ?? {};\n const query = this.getTagBaseQuery();\n if (options?.noDescription) {\n query.whereNull('tags.description');\n }\n\n if (options?.searchQuery) {\n this.applySearchQuery(\n query,\n ['tags.tag', 'tags.description'],\n options.searchQuery,\n );\n }\n\n if (options?.ids) {\n query.whereIn('tags.id', options.ids);\n }\n\n if (filters) {\n parseFilter(filters, query, this.db);\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 tags: await Promise.all(\n rows.map(async tag => {\n return {\n id: tag.id,\n tag: tag.tag,\n description: tag.description,\n postsCount: this.mapToInteger(tag.postsCount),\n followerCount: this.mapToInteger(tag.followerCount),\n experts: includeExperts\n ? await this.getTagExpertsById(tag.id)\n : undefined,\n };\n }),\n ),\n };\n }\n\n async getTagById(id: number): Promise<TagResponse | null> {\n const query = this.getTagBaseQuery();\n const tags = await query.where('tags.id', '=', id);\n\n if (tags.length === 0) {\n return null;\n }\n return {\n id: tags[0].id,\n tag: tags[0].tag,\n description: tags[0].description,\n postsCount: this.mapToInteger(tags[0].postsCount),\n followerCount: this.mapToInteger(tags[0].followerCount),\n experts: await this.getTagExpertsById(tags[0].id),\n };\n }\n\n async getTag(tag: string): Promise<TagResponse | null> {\n const query = this.getTagBaseQuery();\n const tags = await query.where('tags.tag', '=', tag);\n\n if (tags.length === 0) {\n return null;\n }\n return {\n id: tags[0].id,\n tag: tags[0].tag,\n description: tags[0].description,\n postsCount: this.mapToInteger(tags[0].postsCount),\n followerCount: this.mapToInteger(tags[0].followerCount),\n experts: await this.getTagExpertsById(tags[0].id),\n };\n }\n\n async deleteTag(id: number): Promise<boolean> {\n const query = this.db('tags').where('id', '=', id);\n return !!(await query.delete());\n }\n\n async getTagExperts(tags: string[]): Promise<string[]> {\n if (tags.length === 0) {\n return [];\n }\n const query = this.db<RawTagExpert>('tag_experts')\n .leftJoin('tags', 'tag_experts.tagId', 'tags.id')\n .whereIn('tags.tag', tags);\n const resp = await query.select('entityRef');\n return [...new Set(resp.map(r => r.entityRef))];\n }\n\n async createTag(\n tag: string,\n description?: string,\n experts?: string[],\n ): Promise<TagResponse | null> {\n const trimmed = tag.trim();\n const ret = await this.db\n .insert({ tag: trimmed, description })\n .into('tags')\n .returning(['id'])\n .onConflict('tag')\n .ignore();\n if (ret && experts && experts.length > 0) {\n await this.updateTagExperts(ret[0].id, experts);\n }\n return this.getTag(trimmed);\n }\n\n async updateTag(\n id: number,\n description?: string,\n experts?: string[],\n ): Promise<TagResponse | null> {\n await this.db('tags')\n .where('tags.id', '=', id)\n .update({ description: description ?? null });\n if (experts && experts.length > 0) {\n await this.updateTagExperts(id, experts);\n }\n return this.getTagById(id);\n }\n\n async getUsersCount(): Promise<number> {\n const query = await this.db('unique_authors').count('author as CNT');\n return Number(query[0].CNT);\n }\n\n async getUsers(\n options?: { entityRefs?: string[] } & UsersQuery,\n ): Promise<UsersResponse> {\n const query = this.getUserBaseQuery();\n\n if (options?.entityRefs) {\n query.whereIn('unique_authors.author', 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 users: rows.map(r => ({\n userRef: r.author,\n totalViews: this.mapToInteger(r.totalViews),\n totalQuestions: this.mapToInteger(r.totalQuestions),\n totalAnswers: this.mapToInteger(r.totalAnswers),\n totalComments:\n this.mapToInteger(r.postComments) +\n this.mapToInteger(r.answerComments),\n totalVotes:\n this.mapToInteger(r.postVotes) + this.mapToInteger(r.answerVotes),\n totalArticles: this.mapToInteger(r.totalArticles),\n totalFollowers: this.mapToInteger(r.totalFollowers),\n totalLinks: this.mapToInteger(r.totalLinks),\n })),\n };\n }\n\n async getUser(user_ref: string): Promise<UserResponse | null> {\n const q = this.getUserBaseQuery();\n const rows = await q.where('author', user_ref);\n if (rows.length === 0) {\n return null;\n }\n return {\n userRef: rows[0].author,\n totalViews: this.mapToInteger(rows[0].totalViews),\n totalQuestions: this.mapToInteger(rows[0].totalQuestions),\n totalAnswers: this.mapToInteger(rows[0].totalAnswers),\n totalComments:\n this.mapToInteger(rows[0].postComments) +\n this.mapToInteger(rows[0].answerComments),\n totalVotes:\n this.mapToInteger(rows[0].postVotes) +\n this.mapToInteger(rows[0].answerVotes),\n totalArticles: this.mapToInteger(rows[0].totalArticles),\n totalFollowers: this.mapToInteger(rows[0].totalFollowers),\n totalLinks: this.mapToInteger(rows[0].totalLinks),\n };\n }\n\n async getUserCollections(\n user_ref: string,\n options?: CollectionOptions,\n ): Promise<UserCollectionsResponse> {\n const rows = await this.db('user_collections')\n .where('userRef', user_ref)\n .leftJoin(\n 'collections',\n 'user_collections.collectionId',\n 'collections.id',\n )\n .select('*');\n\n return {\n collections: await Promise.all(\n rows.map(async val => {\n return this.mapCollectionEntity(val, user_ref, options);\n }),\n ),\n count: rows.length,\n };\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 {\n userRef: user_ref,\n collectionId,\n },\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 getUserTags(\n user_ref: string,\n filters?: PermissionCriteria<QetaFilters>,\n ): Promise<UserTagsResponse> {\n const query = this.db('user_tags')\n .where('userRef', user_ref)\n .leftJoin('tags', 'user_tags.tagId', 'tags.id');\n\n if (filters) {\n parseFilter(filters, query, this.db);\n }\n const tags = await query.select('tags.tag');\n\n return {\n tags: tags.map(tag => tag.tag),\n count: tags.length,\n };\n }\n\n async getUsersForTags(tags?: string[]): Promise<string[]> {\n if (!tags || tags.length === 0) {\n return [];\n }\n\n const followingUsersQuery = this.db('user_tags')\n .leftJoin('tags', 'user_tags.tagId', 'tags.id')\n .whereIn('tags.tag', tags)\n .select('userRef');\n\n const [followingUsers, experts] = await Promise.all([\n followingUsersQuery,\n this.getTagExperts(tags),\n ]);\n\n return [\n ...new Set([...followingUsers.map(user => user.userRef), ...experts]),\n ];\n }\n\n async followTag(user_ref: string, tag: string): Promise<boolean> {\n const tagId = await this.db('tags').where('tag', tag).select('id').first();\n if (!tagId) {\n return false;\n }\n await this.db\n .insert(\n {\n userRef: user_ref,\n tagId: tagId.id,\n },\n ['tagId'],\n )\n .into('user_tags');\n return true;\n }\n\n async unfollowTag(user_ref: string, tag: string): Promise<boolean> {\n const tagId = await this.db('tags').where('tag', tag).select('id').first();\n if (!tagId) {\n return false;\n }\n await this.db('user_tags')\n .where('userRef', user_ref)\n .where('tagId', tagId.id)\n .delete();\n return true;\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 => {\n return {\n id: entity.id,\n entityRef: entity.entity_ref,\n postsCount: this.mapToInteger(entity.postsCount),\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 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 getFollowedUsers(user_ref: string): Promise<UserUsersResponse> {\n const entities = await this.db('user_users')\n .where('userRef', user_ref)\n .select('followedUserRef');\n\n return {\n followedUserRefs: entities.map(e => e.followedUserRef),\n count: entities.length,\n };\n }\n\n async getFollowingUsers(user_ref: string): Promise<string[]> {\n const users = await this.db('user_users')\n .where('followedUserRef', user_ref)\n .select('userRef');\n return users.map(user => user.userRef);\n }\n\n async followUser(\n user_ref: string,\n followedUserRef: string,\n ): Promise<boolean> {\n await this.db\n .insert({\n userRef: user_ref,\n followedUserRef,\n })\n .into('user_users');\n return true;\n }\n\n async unfollowUser(\n user_ref: string,\n followedUserRef: string,\n ): Promise<boolean> {\n await this.db('user_users')\n .where('userRef', user_ref)\n .where('followedUserRef', followedUserRef)\n .delete();\n return true;\n }\n\n async getMostUpvotedPosts({\n author,\n options,\n }: StatisticsRequestParameters): Promise<Statistic[]> {\n const query = this.db<Statistic>('posts as q')\n .sum('qv.score as total')\n .select('q.author')\n .join('post_votes as qv', 'q.id', 'qv.postId')\n .groupBy('q.author')\n .orderBy('total', 'desc')\n .where('anonymous', '!=', true);\n\n if (author) {\n query.where('q.author', '=', author);\n }\n\n if (options?.period) {\n query.where('q.created', '>', options.period);\n }\n\n if (options?.type) {\n query.where('q.type', '=', options.type);\n }\n\n if (options?.limit) {\n query.limit(options.limit);\n }\n\n const rows = (await query) as unknown as Statistic[];\n\n // This can probably be replaced to use\n // DENSE_RANK() over (total) directly by the query\n rows.map((row, index) => {\n row.position = index + 1;\n });\n\n return rows;\n }\n\n async getTotalPosts({\n author,\n options,\n }: StatisticsRequestParameters): Promise<Statistic[]> {\n const query = this.db<Statistic>('posts as q')\n .count('q.id as total')\n .select('q.author')\n .groupBy('author')\n .orderBy('total', 'desc')\n .where('q.anonymous', '!=', true);\n\n if (author) {\n query.where('q.author', '=', author);\n }\n\n if (options?.period) {\n query.where('q.created', '>', options.period);\n }\n\n if (options?.type) {\n query.where('q.type', '=', options.type);\n }\n\n if (options?.limit) {\n query.limit(options.limit);\n }\n\n const rows = (await query) as unknown as Statistic[];\n if (!author) {\n rows.map((row, index) => {\n row.position = index + 1;\n });\n }\n\n return rows;\n }\n\n async getMostUpvotedAnswers({\n author,\n options,\n }: StatisticsRequestParameters): Promise<Statistic[]> {\n const query = this.db<Statistic>('answers as a')\n .sum('av.score as total')\n .select('a.author')\n .join('answer_votes as av', 'a.id', 'av.answerId')\n .groupBy('a.author')\n .orderBy('total', 'desc')\n .where('a.anonymous', '!=', true);\n\n if (author) {\n query.where('a.author', '=', author);\n }\n\n if (options?.period) {\n query.where('a.created', '>', options.period);\n }\n\n if (options?.limit) {\n query.limit(options.limit);\n }\n\n const rows = (await query) as unknown as Statistic[];\n\n rows.map((row, index) => {\n row.position = index + 1;\n });\n\n return rows;\n }\n\n async getMostUpvotedCorrectAnswers({\n author,\n options,\n }: StatisticsRequestParameters): Promise<Statistic[]> {\n const query = this.db<Statistic>('answers as a')\n .sum('av.score as total')\n .select('a.author')\n .join('answer_votes as av', 'a.id', 'av.answerId')\n .groupBy('a.author')\n .orderBy('total', 'desc')\n .where('a.correct', '=', true)\n .where('a.anonymous', '!=', true);\n\n if (author) {\n query.where('a.author', '=', author);\n }\n\n if (options?.period) {\n query.where('a.created', '>', options.period);\n }\n\n if (options?.limit) {\n query.limit(options.limit);\n }\n\n const rows = (await query) as unknown as Statistic[];\n\n rows.map((row, index) => {\n row.position = index + 1;\n });\n\n return rows;\n }\n\n async getTotalAnswers({\n author,\n options,\n }: StatisticsRequestParameters): Promise<Statistic[]> {\n const query = this.db<Statistic>('answers as a')\n .count('a.id as total')\n .select('a.author')\n .groupBy('author')\n .orderBy('total', 'desc')\n .where('a.anonymous', '!=', true);\n\n if (author) {\n query.where('a.author', '=', author);\n }\n\n if (options?.period) {\n query.where('a.created', '>', options.period);\n }\n if (options?.limit) {\n query.limit(options.limit);\n }\n\n const rows = (await query) as unknown as Statistic[];\n\n if (!author) {\n rows.map((row, index) => {\n row.position = index + 1;\n });\n }\n\n return rows;\n }\n\n async postAttachment({\n uuid,\n locationType,\n locationUri,\n extension,\n mimeType,\n binaryImage,\n path,\n creator,\n postId,\n answerId,\n collectionId,\n }: AttachmentParameters): Promise<Attachment> {\n const attachments: Attachment[] = await this.db\n .insert(\n {\n uuid: uuid,\n locationType: locationType,\n locationUri: locationUri,\n extension: extension,\n mimeType: mimeType,\n path: path,\n binaryImage: binaryImage,\n creator: creator,\n created: new Date(),\n postId,\n answerId,\n collectionId,\n },\n ['id', 'uuid', 'locationUri', 'locationType'],\n )\n .into('attachments');\n\n return attachments[0];\n }\n\n async deleteAttachment(uuid: string): Promise<boolean> {\n const query = this.db('attachments').where('uuid', '=', uuid);\n return !!(await query.delete());\n }\n\n async getAttachment(uuid: string): Promise<Attachment | undefined> {\n const rawAttachment = await this.db<RawAttachment>('attachments')\n .where('uuid', '=', uuid)\n .first();\n\n if (!rawAttachment) {\n return undefined;\n }\n\n return this.mapAttachment(rawAttachment);\n }\n\n async getDeletableAttachments(dayLimit: number): Promise<Attachment[]> {\n const now = new Date();\n now.setDate(now.getDate() - dayLimit);\n return this.db<Attachment>('attachments')\n .whereNull('postId')\n .whereNull('answerId')\n .whereNull('collectionId')\n .where(`created`, '<=', now)\n .select();\n }\n\n async getTotalViews(\n user_ref: string,\n lastDays?: number,\n excludeUser?: boolean,\n ): Promise<number> {\n const now = new Date();\n if (lastDays) {\n now.setDate(now.getDate() - lastDays);\n }\n\n const postViewsQuery = this.db('post_views')\n .innerJoin('posts', 'post_views.postId', 'posts.id')\n .where('posts.author', user_ref);\n if (lastDays) {\n postViewsQuery.where('posts.created', '>', now);\n }\n\n if (excludeUser) {\n postViewsQuery.where('post_views.author', '!=', user_ref);\n }\n\n const answerViewsQuery = this.db('post_views')\n .innerJoin('answers', 'post_views.postId', 'answers.postId')\n .innerJoin('posts', 'post_views.postId', 'posts.id')\n .where('answers.author', user_ref)\n .whereNot('posts.author', user_ref);\n if (lastDays) {\n answerViewsQuery.where('answers.created', '>', now);\n }\n\n if (excludeUser) {\n answerViewsQuery.where('post_views.author', '!=', user_ref);\n }\n\n const postViews = await postViewsQuery.count('* as total');\n const answerViews = await answerViewsQuery.count('* as total');\n\n return Number(postViews[0].total) + Number(answerViews[0].total);\n }\n\n async saveUserStats(user: UserResponse, date: Date): Promise<void> {\n await this.db('user_stats')\n .insert({\n ...user,\n date,\n })\n .onConflict(['userRef', 'date'])\n .merge();\n }\n\n async saveGlobalStats(date: Date): Promise<void> {\n await this.db('global_stats')\n .insert({\n totalQuestions: await this.getCount('posts', { type: 'question' }),\n totalAnswers: await this.getCount('answers'),\n totalUsers: await this.getUsersCount(),\n totalTags: await this.getCount('tags'),\n totalViews: await this.getCount('post_views'),\n totalComments: await this.getCount('comments'),\n totalVotes:\n (await this.getCount('post_votes')) +\n (await this.getCount('answer_votes')),\n totalArticles: await this.getCount('posts', { type: 'article' }),\n totalLinks: await this.getCount('posts', { type: 'link' }),\n date,\n })\n .onConflict(['date'])\n .merge();\n }\n\n async getGlobalStats(): Promise<GlobalStat[]> {\n return this.db('global_stats').select('*').orderBy('date', 'desc');\n }\n\n async getUserStats(user_ref: string): Promise<UserStat[]> {\n return this.db('user_stats')\n .where('userRef', user_ref)\n .select('*')\n .orderBy('date', 'desc');\n }\n\n async cleanStats(days: number, date: Date): Promise<void> {\n const now = new Date(date);\n now.setDate(now.getDate() - days);\n await this.db('user_stats').where('date', '<=', now).delete();\n await this.db('global_stats').where('date', '<=', now).delete();\n }\n\n async getCount(\n table: string,\n filters?: { author?: string; type?: PostType },\n ): Promise<number> {\n const query = this.db(table);\n if (filters?.author) {\n query.where('author', filters.author);\n }\n if (filters?.type) {\n query.where('type', filters.type);\n }\n const result = await query.count('* as total').first();\n return this.mapToInteger(result?.total);\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.owner) {\n query.where('owner', options.owner);\n }\n\n if (options.fromDate && options.toDate) {\n query.whereBetween('collections.created', [\n `${options.fromDate} 00:00:00.000+00`,\n `${options.toDate} 23:59:59.999+00`,\n ]);\n }\n\n if (options.searchQuery) {\n this.applySearchQuery(\n query,\n ['collections.title', 'collections.description'],\n options.searchQuery,\n );\n }\n\n if (options.tags) {\n const tags = filterTags(options.tags);\n if (options.tagsRelation === 'or') {\n query.leftJoin(\n 'post_tags',\n 'collection_posts.postId',\n 'post_tags.postId',\n );\n query.leftJoin('tags', 'post_tags.tagId', 'tags.id');\n query.where(qb => {\n qb.whereIn('tags.tag', tags).orWhereNull('collection_posts.postId');\n });\n } else {\n tags.forEach((t, i) => {\n query.innerJoin(\n `post_tags AS qt${i}`,\n 'collection_posts.postId',\n `qt${i}.postId`,\n );\n query.innerJoin(`tags AS t${i}`, `qt${i}.tagId`, `t${i}.id`);\n query.where(`t${i}.tag`, '=', t);\n });\n }\n }\n\n if (options.entities) {\n const entityValues = Array.isArray(options.entities)\n ? options.entities\n : [options.entities];\n if (options.entitiesRelation === 'or') {\n query.leftJoin(\n 'post_entities',\n 'collection_posts.postId',\n 'post_entities.postId',\n );\n query.leftJoin('entities', 'post_entities.entityId', 'entities.id');\n query.where(qb => {\n qb.whereIn('entities.entity_ref', entityValues).orWhereNull(\n 'collection_posts.postId',\n );\n });\n } else {\n entityValues.forEach((t, i) => {\n query.innerJoin(\n `post_entities AS pe${i}`,\n 'collection_posts.postId',\n `pe${i}.postId`,\n );\n query.innerJoin(`entities AS e${i}`, `pe${i}.entityId`, `e${i}.id`);\n query.where(`e${i}.entity_ref`, '=', t);\n });\n }\n }\n\n if (options.ids) {\n query.whereIn('collections.id', options.ids);\n }\n\n if (opts?.filters) {\n parseFilter(opts.filters, query, this.db);\n }\n\n const totalQuery = query.clone();\n\n if (options.orderBy) {\n query.orderBy(options.orderBy, options.order || 'desc');\n } else {\n query.orderBy('created', 'desc');\n }\n\n if (options.limit) {\n query.limit(options.limit);\n }\n if (options.offset) {\n query.offset(options.offset);\n }\n const results = await Promise.all([\n query,\n this.db(totalQuery.as('totalQuery')).count('* as CNT').first(),\n ]);\n const rows = results[0] as RawCollectionEntity[];\n const total = this.mapToInteger((results[1] as any)?.CNT);\n return {\n collections: await Promise.all(\n rows.map(async val => {\n return this.mapCollectionEntity(val, user_ref, {\n ...opts,\n includePosts: options.includePosts ?? opts?.includePosts,\n includeExperts: options.includeExperts ?? opts?.includeExperts,\n });\n }),\n ),\n total,\n };\n }\n\n async getCollection(\n user_ref: string,\n id: number,\n options?: CollectionOptions,\n ): Promise<MaybeCollection> {\n const collections = await this.db('collections').where('id', '=', id);\n if (collections.length === 0) {\n return null;\n }\n return this.mapCollectionEntity(collections[0], user_ref, 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 const { user_ref, title, description, created, images, headerImage, opts } =\n options;\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(['id', 'title', 'description', 'created', 'headerImage']);\n\n await this.updateAttachments(\n 'collectionId',\n description ?? '',\n images ?? [],\n collections[0].id,\n headerImage,\n );\n\n return this.mapCollectionEntity(collections[0], user_ref, opts);\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 const { id, user_ref, title, description, images, headerImage, opts } =\n options;\n const query = this.db('collections').where('collections.id', '=', id);\n const rows = await query.update({\n title,\n description,\n headerImage,\n });\n\n if (!rows) {\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.getCollection(user_ref, id, opts);\n }\n\n async deleteCollection(id: number): Promise<boolean> {\n const query = this.db('collections').where('id', '=', id);\n return !!(await query.delete());\n }\n\n async addPostToCollection(\n user_ref: string,\n id: number,\n postId: number,\n options?: CollectionOptions,\n ): Promise<MaybeCollection> {\n await this.db\n .insert({\n collectionId: id,\n postId,\n })\n .into('collection_posts')\n .onConflict()\n .ignore();\n return await 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<MaybeCollection> {\n await this.db('collection_posts')\n .where('collectionId', id)\n .where('postId', postId)\n .delete();\n return await this.getCollection(user_ref, id, options);\n }\n\n async getTemplates(): Promise<Templates> {\n const templates = await this.db('templates').select('*');\n return {\n templates: await Promise.all(\n templates.map(t => this.mapTemplateEntity(t)),\n ),\n total: templates.length,\n };\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 const {\n title,\n questionTitle,\n questionContent,\n description,\n tags,\n entities,\n } = options;\n const templates = await this.db\n .insert(\n {\n title,\n description,\n questionTitle,\n questionContent,\n },\n ['id'],\n )\n .into('templates')\n .returning([\n 'id',\n 'title',\n 'description',\n 'questionTitle',\n 'questionContent',\n ]);\n await Promise.all([\n this.addTags(templates[0].id, tags, true, 'template_tags', 'templateId'),\n this.addEntities(\n templates[0].id,\n entities,\n true,\n 'template_entities',\n 'templateId',\n ),\n ]);\n\n return this.mapTemplateEntity(templates[0]);\n }\n\n async getTemplate(id: number): Promise<MaybeTemplate> {\n const templates = await this.db('templates').where('id', '=', id);\n if (templates.length === 0) {\n return null;\n }\n return this.mapTemplateEntity(templates[0]);\n }\n\n async deleteTemplate(id: number): Promise<boolean> {\n const query = this.db('templates').where('id', '=', id);\n return !!(await query.delete());\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<MaybeTemplate> {\n const {\n id,\n title,\n description,\n questionTitle,\n questionContent,\n tags,\n entities,\n } = options;\n const query = this.db('templates').where('templates.id', '=', id);\n const rows = await query.update({\n title,\n description,\n questionTitle,\n questionContent,\n });\n\n if (!rows) {\n return null;\n }\n\n await Promise.all([\n this.addTags(id, tags, true, 'template_tags', 'templateId'),\n this.addEntities(id, entities, true, 'template_entities', 'templateId'),\n ]);\n\n return await this.getTemplate(id);\n }\n\n async getAIAnswer(postId: number): Promise<AIResponse | null> {\n const row = await this.db<RawPostAIAnswer>('post_ai_answers')\n .where('postId', postId)\n .select()\n .first();\n if (!row) {\n return null;\n }\n return {\n answer: row.answer,\n created: row.created,\n };\n }\n\n async saveAIAnswer(postId: number, response: AIResponse): Promise<void> {\n await this.db\n .insert({\n postId,\n answer: response.answer,\n created: new Date(),\n })\n .into('post_ai_answers')\n .onConflict()\n .ignore();\n }\n\n async deleteAIAnswer(postId: number): Promise<boolean> {\n return !!(await this.db('post_ai_answers')\n .where('postId', postId)\n .delete());\n }\n\n async getPostRank(\n collectionId: number,\n postId: number,\n ): Promise<number | null> {\n const rank = await this.db('collection_posts')\n .where('collectionId', collectionId)\n .where('postId', postId)\n .select('rank')\n .first();\n return rank?.rank ?? null;\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', 'desc')\n .limit(1)\n .select(['postId', 'rank']);\n return post[0] ? { postId: post[0].postId, rank: post[0].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', 'asc')\n .limit(1)\n .select(['postId', 'rank']);\n return post[0] ? { postId: post[0].postId, rank: post[0].rank } : null;\n }\n\n async getNextRankedPostId(\n collectionId: number,\n postId: number,\n ): Promise<CollectionPostRank | null> {\n const rank = await this.getPostRank(collectionId, postId);\n if (rank === null) {\n return null;\n }\n const post = await this.db('collection_posts')\n .where('collectionId', collectionId)\n .where('rank', '>', rank)\n .orderBy('rank', 'asc')\n .select(['postId', 'rank'])\n .first();\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 rank = await this.getPostRank(collectionId, postId);\n if (rank === null) {\n return null;\n }\n const post = await this.db('collection_posts')\n .where('collectionId', collectionId)\n .where('rank', '<', rank)\n .orderBy('rank', 'desc')\n .select(['postId', 'rank'])\n .first();\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 getEntityLinks(): Promise<EntityLinks[]> {\n const rows = await this.db('post_entities')\n .leftJoin('entities', 'post_entities.entityId', 'entities.id')\n .leftJoin('posts', 'post_entities.postId', 'posts.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 private async getTagExpertsById(id: number) {\n const rows = await this.db('tag_experts')\n .where('tagId', id)\n .select('entityRef');\n return rows.map(r => r.entityRef);\n }\n\n private async updateTagExperts(id: number, experts: string[]) {\n await this.db('tag_experts').where('tagId', id).delete();\n await this.db\n .insert(experts.map(e => ({ tagId: id, entityRef: e })))\n .into('tag_experts')\n .onConflict(['tagId', 'entityRef'])\n .merge();\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 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('id', 'entity_ref', postsCount, followerCount)\n .groupBy('entities.id');\n }\n\n private getTagBaseQuery() {\n const tagRef = this.db.ref('tags.id');\n const postsCount = this.db('post_tags')\n .where('post_tags.tagId', tagRef)\n .count('*')\n .as('postsCount');\n\n const followerCount = this.db('user_tags')\n .where('user_tags.tagId', tagRef)\n .count('*')\n .as('followerCount');\n\n return this.db('tags')\n .leftJoin('post_tags', 'tags.id', 'post_tags.tagId')\n .orderBy('postsCount', 'desc')\n .select('id', 'tag', 'description', postsCount, followerCount)\n .groupBy('tags.id');\n }\n\n private getUserBaseQuery() {\n if (this.db.client.config.client !== 'pg') {\n // Subqueries do not work in sqlite so we just return all stats as empty, at least for now\n return this.db('posts')\n .select([\n 'author',\n this.db.raw('0 as totalViews'),\n this.db.raw('0 as totalQuestions'),\n this.db.raw('0 as totalArticles'),\n this.db.raw('0 as totalLinks'),\n this.db.raw('0 as totalAnswers'),\n this.db.raw('0 as answerComments'),\n this.db.raw('0 as postComments'),\n this.db.raw('0 as answerVotes'),\n this.db.raw('0 as postVotes'),\n this.db.raw('0 as totalFollowers'),\n ])\n .distinct();\n }\n\n const authorRef = this.db.ref('unique_authors.author');\n\n const views = this.db('post_views')\n .where('post_views.author', authorRef)\n .count('*')\n .as('totalViews');\n\n const questions = this.db('posts')\n .where('posts.author', authorRef)\n .where('posts.type', 'question')\n .count('*')\n .as('totalQuestions');\n\n const articles = this.db('posts')\n .where('posts.author', authorRef)\n .where('posts.type', 'article')\n .count('*')\n .as('totalArticles');\n\n const links = this.db('posts')\n .where('posts.author', authorRef)\n .where('posts.type', 'link')\n .count('*')\n .as('totalLinks');\n\n const answers = this.db('answers')\n .where('answers.author', authorRef)\n .count('*')\n .as('totalAnswers');\n\n const comments = this.db('comments')\n .where('comments.author', authorRef)\n .count('*')\n .as('comments');\n const aVotes = this.db('answer_votes')\n .where('answer_votes.author', authorRef)\n .count('*')\n .as('answerVotes');\n\n const pVotes = this.db('post_votes')\n .where('post_votes.author', authorRef)\n .count('*')\n .as('postVotes');\n\n const followers = this.db('user_users')\n .where('user_users.followedUserRef', authorRef)\n .count('*')\n .as('totalFollowers');\n\n return this.db('unique_authors').select(\n 'author',\n views,\n questions,\n answers,\n articles,\n links,\n comments,\n pVotes,\n aVotes,\n followers,\n );\n }\n\n /**\n * Maps string or number value to integer. This is due to fact that postgres returns\n * strings instead numbers for count and sum functions.\n * @param val\n */\n private mapToInteger = (val: string | number | undefined): number => {\n return typeof val === 'string' ? Number.parseInt(val, 10) : val ?? 0;\n };\n\n private async mapCollectionEntity(\n val: RawCollectionEntity,\n user_ref: string,\n options?: CollectionOptions,\n ): Promise<Collection> {\n const { postFilters, includePosts = true } = options ?? {};\n const results = await Promise.all([\n includePosts\n ? this.getPosts(\n user_ref,\n { collectionId: val.id, 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: options?.includeExperts ?? false,\n },\n )\n : { posts: [] },\n this.db('attachments').where('collectionId', val.id).select('id'),\n this.db('user_collections')\n .count('*')\n .as('followers')\n .where('collectionId', val.id)\n .first(),\n options?.includeExperts ?? true\n ? this.getCollectionExperts(val.id)\n : undefined,\n ]);\n\n const entities = compact([\n ...new Set(results[0].posts.map(p => p.entities).flat()),\n ]);\n const tags = compact([\n ...new Set(results[0].posts.map(p => 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: results[0].posts,\n headerImage: val.headerImage,\n postsCount: this.mapToInteger(val.postsCount),\n entities,\n tags,\n images: results[1].map(r => r.id),\n followers: this.mapToInteger(results[2]!.count),\n experts: results[3],\n };\n }\n\n private async getCollectionExperts(collectionId: number): Promise<string[]> {\n const rows = await 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 .where('collection_posts.collectionId', collectionId)\n .select('tag_experts.entityRef');\n return [...new Set(rows.map(r => r.entityRef))];\n }\n\n private async mapTemplateEntity(val: RawTemplate): Promise<Template> {\n const additionalInfo = await Promise.all([\n this.getRelatedTags(val.id, 'template_tags', 'templateId'),\n this.getRelatedEntities(val.id, 'template_entities', 'templateId'),\n ]);\n return {\n id: val.id,\n title: val.title,\n description: val.description,\n questionTitle: val.questionTitle ?? undefined,\n questionContent: val.questionContent ?? undefined,\n tags: additionalInfo[0],\n entities: additionalInfo[1],\n };\n }\n\n private async mapPostEntity(\n val: RawPostEntity,\n user_ref: string,\n options?: PostOptions,\n ): Promise<Post> {\n const {\n includeTags = true,\n includeAnswers = true,\n includeVotes = true,\n includeEntities = true,\n includeComments = true,\n includeAttachments = true,\n includeExperts = true,\n tagsFilter,\n } = options ?? {};\n // TODO: This could maybe done with join\n const additionalInfo = await Promise.all([\n includeTags\n ? this.getRelatedTags(val.id, 'post_tags', 'postId', tagsFilter)\n : undefined,\n includeAnswers\n ? this.getPostAnswers(val.id, user_ref, {\n ...options,\n includePost: false,\n filter: options?.answersFilter,\n })\n : undefined,\n includeVotes ? this.getPostVotes(val.id) : undefined,\n includeEntities ? this.getRelatedEntities(val.id) : undefined,\n includeComments\n ? this.getPostComments(val.id, options?.commentsFilter)\n : undefined,\n includeAttachments\n ? this.db('attachments').select('id').where('postId', val.id)\n : undefined,\n includeExperts ? this.getPostExperts(val.id) : undefined,\n ]);\n return {\n id: val.id,\n author:\n val.anonymous && val.author !== user_ref ? 'anonymous' : val.author,\n own: val.author === user_ref,\n title: val.title,\n content: val.content,\n created: val.created as Date,\n updated: val.updated as Date,\n updatedBy: val.updatedBy,\n status: val.status as PostStatus,\n score: this.mapToInteger(val.score),\n views: this.mapToInteger(val.views),\n answersCount: this.mapToInteger(val.answersCount),\n correctAnswer: this.mapToInteger(val.correctAnswers) > 0,\n commentsCount: this.mapToInteger(val.commentsCount),\n favorite: this.mapToInteger(val.favorite) > 0,\n tags: additionalInfo[0],\n answers: additionalInfo[1],\n votes: additionalInfo[2],\n entities: additionalInfo[3],\n trend: this.mapToInteger(val.trend),\n comments: additionalInfo[4],\n ownVote: additionalInfo[2]?.find(v => v.author === user_ref)?.score,\n anonymous: val.anonymous,\n type: val.type,\n headerImage: val.headerImage,\n url: val.url ?? undefined,\n images: additionalInfo[5]?.map(r => r.id),\n experts: additionalInfo[6],\n };\n }\n\n private mapComment(val: RawCommentEntity): Comment {\n return {\n id: val.id,\n author: val.author,\n content: val.content,\n created: val.created,\n updated: val.updated,\n updatedBy: val.updatedBy,\n status: val.status as AnswerCommentStatus,\n };\n }\n\n private async mapAnswer(\n val: RawAnswerEntity,\n user_ref: string,\n options?: AnswerOptions,\n ): Promise<Answer> {\n const {\n includeVotes = true,\n includeComments = true,\n includePost = true,\n includeExperts = true,\n } = options ?? {};\n const additionalInfo = await Promise.all([\n includeVotes ? this.getAnswerVotes(val.id) : undefined,\n includeComments\n ? this.getAnswerComments(val.id, options?.commentsFilter)\n : undefined,\n includePost ? this.getPost(user_ref, val.postId, false) : undefined,\n this.db('attachments').select('id').where('answerId', val.id),\n includeExperts ? this.getAnswerExperts(val.id) : undefined,\n ]);\n return {\n id: val.id,\n postId: val.postId,\n own: val.author === user_ref,\n author:\n val.anonymous && val.author !== user_ref ? 'anonymous' : val.author,\n content: val.content,\n correct: val.correct,\n created: val.created,\n updated: val.updated,\n updatedBy: val.updatedBy,\n score: this.mapToInteger(val.score),\n status: val.status as AnswerCommentStatus,\n votes: additionalInfo[0],\n comments: additionalInfo[1],\n anonymous: val.anonymous,\n post: additionalInfo[2] ?? undefined,\n images: additionalInfo[3].map(r => r.id),\n experts: additionalInfo[4] ?? undefined,\n };\n }\n\n private mapVote(val: RawPostVoteEntity | RawAnswerVoteEntity): Vote {\n return {\n author: val.author,\n score: val.score,\n timestamp: val.timestamp,\n };\n }\n\n private mapAttachment(val: RawAttachment): Attachment {\n return {\n ...val,\n created:\n val.created instanceof Date ? val.created : new Date(val.created),\n };\n }\n\n private async getRelatedTags(\n id: number,\n tableName: string = 'post_tags',\n columnName: string = 'postId',\n tagsFilter?: PermissionCriteria<QetaFilters>,\n ): Promise<string[]> {\n const query = this.db<RawTagEntity>('tags')\n .leftJoin(tableName, 'tags.id', `${tableName}.tagId`)\n .where(`${tableName}.${columnName}`, '=', id);\n\n if (tagsFilter) {\n parseFilter(tagsFilter, query, this.db, 'tags');\n }\n\n const rows = await query.select();\n return rows.map(val => val.tag);\n }\n\n private async getPostComments(\n postId: number,\n commentsFilter?: PermissionCriteria<QetaFilters>,\n opts?: CommentOptions,\n ): Promise<Comment[]> {\n const { includeStatusFilter = true } = opts ?? {};\n const query = this.db<RawCommentEntity>('comments')\n .where('comments.postId', '=', postId)\n .orderBy('created');\n if (includeStatusFilter) {\n query.where('comments.status', '=', 'active');\n }\n if (commentsFilter) {\n parseFilter(commentsFilter, query, this.db, 'comments');\n }\n const rows = await query.select();\n return rows.map(val => this.mapComment(val));\n }\n\n private async getPostExperts(postId: number): Promise<string[]> {\n const rows = await this.db('tag_experts')\n .leftJoin('post_tags', 'tag_experts.tagId', 'post_tags.tagId')\n .where('post_tags.postId', postId)\n .select('tag_experts.entityRef');\n return [...new Set(rows.map(r => r.entityRef))];\n }\n\n private async getAnswerComments(\n answerId: number,\n commentsFilter?: PermissionCriteria<QetaFilters>,\n opts?: CommentOptions,\n ): Promise<Comment[]> {\n const { includeStatusFilter = true } = opts ?? {};\n const query = this.db<RawCommentEntity>('comments')\n .where('comments.answerId', '=', answerId)\n .orderBy('created');\n if (includeStatusFilter) {\n query.where('comments.status', '=', 'active');\n }\n if (commentsFilter) {\n parseFilter(commentsFilter, query, this.db, 'comments');\n }\n const rows = await query.select();\n return rows.map(val => this.mapComment(val));\n }\n\n private async getRelatedEntities(\n id: number,\n tableName: string = 'post_entities',\n columnName: string = 'postId',\n ): Promise<string[]> {\n const rows = await this.db<RawTagEntity>('entities')\n .leftJoin(tableName, 'entities.id', `${tableName}.entityId`)\n .where(`${tableName}.${columnName}`, '=', id)\n .select();\n return rows.map(val => val.entity_ref);\n }\n\n private async getPostVotes(postId: number): Promise<Vote[]> {\n const rows = (await this.db<RawPostVoteEntity>('post_votes')\n .where('postId', '=', postId)\n .select()) as RawPostVoteEntity[];\n return rows.map(val => this.mapVote(val));\n }\n\n private async getAnswerVotes(answerId: number): Promise<Vote[]> {\n const rows = (await this.db<RawAnswerVoteEntity>('answer_votes')\n .where('answerId', '=', answerId)\n .select()) as RawAnswerVoteEntity[];\n return rows.map(val => this.mapVote(val));\n }\n\n private async getAnswerExperts(answerId: number): Promise<string[]> {\n const rows = await this.db('tag_experts')\n .leftJoin('tags', 'tag_experts.tagId', 'tags.id')\n .leftJoin('post_tags', 'post_tags.tagId', 'tags.id')\n .leftJoin('answers', 'answers.postId', 'post_tags.postId')\n .where('answers.id', answerId)\n .select('tag_experts.entityRef');\n return [...new Set(rows.map(r => r.entityRef))];\n }\n\n private getAnswerBaseQuery() {\n const postRef = this.db.ref('answers.id');\n\n const score = this.db('answer_votes')\n .where('answer_votes.answerId', postRef)\n .sum('score')\n .as('score');\n\n return this.db<RawAnswerEntity>('answers') // nosonar\n .leftJoin('answer_votes', 'answers.id', 'answer_votes.answerId')\n .select('answers.*', score)\n .groupBy('answers.id');\n }\n\n private async getPostAnswers(\n postId: number,\n user_ref: string,\n options?: AnswerOptions,\n ): Promise<Answer[]> {\n const { includeStatusFilter = true } = options ?? {};\n const query = this.getAnswerBaseQuery()\n .where('postId', '=', postId)\n .orderBy('answers.correct', 'desc')\n .orderBy('answers.created');\n if (includeStatusFilter) {\n query.where('answers.status', '=', 'active');\n }\n\n if (options?.filter) {\n parseFilter(options.filter, query, this.db, 'answer');\n }\n\n const rows = await query.select();\n\n return await Promise.all(\n rows.map(async val => {\n return this.mapAnswer(val, user_ref, options);\n }),\n );\n }\n\n private async recordPostView(\n postId: number,\n user_ref: string,\n ): Promise<void> {\n await this.db\n .insert({\n author: user_ref,\n postId,\n timestamp: new Date(),\n })\n .into('post_views');\n }\n\n private getPostsBaseQuery(user: string, opts?: AnswerOptions) {\n const { includeStatusFilter = true } = opts ?? {};\n const postRef = this.db.ref('posts.id');\n\n const score = this.db('post_votes')\n .where('post_votes.postId', postRef)\n .sum('score')\n .as('score');\n\n const views = this.db('post_views')\n .where('post_views.postId', postRef)\n .count('*')\n .as('views');\n\n const answersCount = this.db('answers')\n .where('answers.postId', postRef)\n .count('*')\n .as('answersCount');\n if (includeStatusFilter) {\n answersCount.where('answers.status', '=', 'active');\n }\n\n const correctAnswers = this.db('answers')\n .where('answers.postId', postRef)\n .where('answers.correct', '=', true)\n .count('*')\n .as('correctAnswers');\n if (includeStatusFilter) {\n correctAnswers.where('answers.status', '=', 'active');\n }\n\n const commentsCount = this.db('comments')\n .where('comments.postId', postRef)\n .count('*')\n .as('commentsCount');\n\n const favorite = this.db('user_favorite')\n .where('user_favorite.user', '=', user)\n .where('user_favorite.postId', postRef)\n .count('*')\n .as('favorite');\n\n return this.db<RawPostEntity>('posts')\n .select(\n 'posts.*',\n score,\n views,\n answersCount,\n correctAnswers,\n commentsCount,\n favorite,\n )\n .leftJoin('post_votes', 'posts.id', 'post_votes.postId')\n .leftJoin('post_views', 'posts.id', 'post_views.postId')\n .leftJoin('answers', 'posts.id', 'answers.postId')\n .leftJoin('comments', 'posts.id', 'comments.postId')\n .leftJoin('user_favorite', 'posts.id', 'user_favorite.postId')\n .groupBy('posts.id');\n }\n\n private getCollectionsBaseQuery() {\n const collectionRef = this.db.ref('collections.id');\n const postsCount = this.db('collection_posts')\n .leftJoin('posts', 'collection_posts.postId', 'posts.id')\n .where('collection_posts.collectionId', collectionRef)\n .where('posts.status', '=', 'active')\n .count('*')\n .as('postsCount');\n\n return this.db<RawCollectionEntity>('collections')\n .select('collections.*', postsCount)\n .leftJoin(\n 'collection_posts',\n 'collections.id',\n 'collection_posts.collectionId',\n )\n .leftJoin('posts', 'collection_posts.postId', 'posts.id')\n .groupBy('collections.id');\n }\n\n private async addTags(\n id: number,\n tagsInput?: string[],\n removeOld?: boolean,\n tableName: string = 'post_tags',\n columnName: string = 'postId',\n ) {\n const tags = filterTags(tagsInput);\n if (removeOld) {\n await this.db(tableName).where(columnName, '=', id).delete();\n }\n\n if (!tags || tags.length === 0) {\n return;\n }\n const existingTags = await this.db('tags')\n .whereIn('tag', tags)\n .returning('id')\n .select();\n const newTags = tags.filter(t => !existingTags.some(e => e.tag === t));\n const allTags: Record<string, string> = {\n ...TAGS,\n ...(await this.tagDatabase?.getTags()),\n };\n\n const tagIds = (\n await Promise.all(\n [...new Set(newTags)].map(async tag => {\n const trimmed = tag.trim();\n const description = trimmed in allTags ? allTags[trimmed] : undefined;\n\n return this.db\n .insert({ tag: trimmed, description })\n .into('tags')\n .returning('id')\n .onConflict('tag')\n .ignore();\n }),\n )\n )\n .flat()\n .map(tag => tag.id)\n .concat(existingTags.map(t => t.id));\n\n await Promise.all(\n tagIds.map(async tagId => {\n await this.db\n .insert({ [columnName]: id, tagId })\n .into(tableName)\n .onConflict()\n .ignore();\n }),\n );\n }\n\n private 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+/g;\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 async markAnswer(\n postId: number,\n answerId: number,\n correct: boolean,\n ): Promise<boolean> {\n // There can be only one correct answer\n if (correct) {\n const exists = await this.db('answers')\n .select('id')\n .where('correct', '=', true)\n .where('postId', '=', postId);\n if (exists && exists.length > 0) {\n return false;\n }\n }\n\n const query = this.db('answers')\n .onConflict()\n .ignore()\n .where('answers.id', '=', answerId)\n .where('postId', '=', postId);\n\n const ret = await query.update({ correct }, ['id']);\n return ret !== undefined && ret?.length > 0;\n }\n\n private 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<Attachment>('attachments')\n .whereIn('id', images)\n .update({ [key]: id });\n }\n\n const attachments = await this.db<Attachment>('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<Attachment>('attachments')\n .whereIn('uuid', toRemove)\n .update({ [key]: null });\n }\n\n private 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"],"names":["resolvePackagePath","isNotCriteria","compact","isOrCriteria","isAndCriteria","filterTags","rows","TAGS"],"mappings":"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"}
@@ -42,6 +42,7 @@ const signalPostStats = (signalService, question) => {
42
42
  views: question.views,
43
43
  score: question.score,
44
44
  answersCount: question.answersCount,
45
+ commentsCount: question.commentsCount,
45
46
  correctAnswer: question.correctAnswer
46
47
  }
47
48
  });
@@ -1 +1 @@
1
- {"version":3,"file":"util.cjs.js","sources":["../../../src/service/routes/util.ts"],"sourcesContent":["import {\n Answer,\n Post,\n QetaIdEntity,\n QetaSignal,\n} from '@drodil/backstage-plugin-qeta-common';\nimport { SignalsService } from '@backstage/plugin-signals-node';\nimport { lookup } from 'mime-types';\nimport sanitizeHtml from 'sanitize-html';\nimport * as cheerio from 'cheerio';\nimport { CheerioAPI } from 'cheerio';\nimport { LoggerService } from '@backstage/backend-plugin-api';\n\nexport const wrapAsync = async (fn: Function) => {\n fn();\n};\n\nexport const signalPostStats = (\n signalService?: SignalsService,\n question?: Post | null,\n) => {\n if (!signalService || !question) {\n return;\n }\n signalService.publish<QetaSignal>({\n recipients: { type: 'broadcast' },\n channel: `qeta:post_${question.id}`,\n message: {\n type: 'post_stats',\n views: question.views,\n score: question.score,\n answersCount: question.answersCount,\n correctAnswer: question.correctAnswer,\n },\n });\n};\n\nexport const signalAnswerStats = (\n signalService?: SignalsService,\n answer?: Answer | null,\n) => {\n if (!signalService || !answer) {\n return;\n }\n signalService.publish<QetaSignal>({\n recipients: { type: 'broadcast' },\n channel: `qeta:answer_${answer.id}`,\n message: {\n type: 'answer_stats',\n score: answer.score,\n correctAnswer: answer.correct,\n },\n });\n};\n\nexport const validateDateRange = (\n fromDate: string,\n toDate: string,\n): { isValid: boolean; error?: string; field?: string } => {\n if (fromDate && toDate) {\n const fromDateNewDate = new Date(fromDate);\n const toDateNewDate = new Date(toDate);\n if (fromDateNewDate <= toDateNewDate) {\n return { isValid: true };\n }\n return { isValid: false, error: 'From Date should be less than To Date' };\n } else if (!fromDate && toDate) {\n return {\n isValid: false,\n field: 'fromDate',\n error: 'Please enter from date in format YYYY-MM-DD',\n };\n } else if (fromDate && !toDate) {\n return {\n isValid: false,\n field: 'toDate',\n error: 'Please enter to date in format YYYY-MM-DD',\n };\n }\n\n return { isValid: true };\n};\n\nexport const entityToJsonObject = (entity: QetaIdEntity) => {\n try {\n return JSON.parse(JSON.stringify(entity));\n } catch {\n return { id: entity.id };\n }\n};\n\nconst imageURLToDataURL = async (\n imageURL: string,\n response: Response,\n): Promise<string> => {\n const buffer = await response.arrayBuffer();\n const contentType =\n response.headers.get('content-type') ||\n lookup(imageURL) ||\n 'application/octet-stream';\n\n const encoded = btoa(\n Array.from(new Uint8Array(buffer))\n .map(b => String.fromCharCode(b))\n .join(''),\n );\n return `data:${contentType};base64,${encoded}`;\n};\n\nconst unrelativeURL = (path: string, url: URL): string => {\n const isRelativePath = !path.startsWith('http');\n if (isRelativePath) {\n return `${url.origin}${path.startsWith('/') ? '' : '/'}${path}`;\n }\n return path;\n};\n\nconst extractFavicon = async (\n $: CheerioAPI,\n url: URL,\n logger: LoggerService,\n): Promise<string | undefined> => {\n const favicon =\n $('link[rel=\"icon\"]').attr('href') ||\n $('link[rel=\"shortcut icon\"]').attr('href') ||\n $('link[rel=\"apple-touch-icon\"]').attr('href') ||\n $('link[rel=\"apple-touch-icon-precomposed\"]').attr('href') ||\n $('link[rel=\"mask-icon\"]').attr('href');\n\n const faviconURLs = [\n `${url.origin}/favicon.ico`, // most common location\n favicon ? unrelativeURL(favicon, url) : undefined,\n `https://www.google.com/s2/favicons?domain=${url.hostname}&sz=16`, // google service as fallback\n ];\n\n for (const faviconURL of faviconURLs) {\n if (!faviconURL) continue;\n\n try {\n const response = await fetch(faviconURL, {\n signal: AbortSignal.timeout(3000),\n });\n\n if (response.ok) {\n return await imageURLToDataURL(faviconURL, response);\n }\n } catch (e) {\n logger.warn(`Failed to fetch favicon from url ${faviconURL}`, e);\n }\n }\n\n return undefined;\n};\n\n// Helper to log detailed extractMetadata errors in a single place\nconst logExtractMetadataError = (\n logger: LoggerService,\n url: URL,\n e: unknown,\n): void => {\n const err = e as any;\n const name = err?.name ? `${err.name}: ` : '';\n const message = err?.message ?? String(err);\n const detail = err?.status ? ` (status: ${err.status})` : '';\n const formatCause = (c: any): string => {\n if (!c) return '';\n const cn = c?.name ? `${c.name}: ` : '';\n const cm = c?.message ?? String(c);\n const cs = c?.status ? ` (status: ${c.status})` : '';\n const nested =\n c?.cause && c.cause !== c ? `; cause: ${formatCause(c.cause)}` : '';\n return `${cn}${cm}${cs}${nested}`;\n };\n const causeInfo = err?.cause ? `; cause: ${formatCause(err.cause)}` : '';\n logger.warn(\n `${name}Failed to extract metadata from ${url.toString()}: ${message}${detail}${causeInfo}`,\n );\n};\n\nexport const extractMetadata = async (\n url: URL,\n logger: LoggerService,\n): Promise<{\n title?: string;\n content?: string;\n image?: string;\n favicon?: string;\n}> => {\n try {\n const response = await fetch(url, {\n headers: {\n Accept: 'text/html',\n },\n signal: AbortSignal.timeout(3000),\n });\n if (!response.ok) {\n throw new Error(\n `Failed to fetch metadata from ${url.toString()}: ${response.status} ${\n response.statusText\n }`,\n );\n }\n\n const html = await response.text().then(dirty =>\n sanitizeHtml(dirty, {\n allowedTags: ['title', 'meta', 'link'],\n allowedAttributes: {\n meta: ['name', 'content', 'property'],\n link: ['rel', 'href'],\n },\n }),\n );\n\n const $ = cheerio.load(html);\n const title =\n $('meta[property=\"og:title\"]').attr('content') || $('title').text();\n const content =\n $('meta[property=\"og:description\"]').attr('content') ||\n $('meta[name=\"description\"]').attr('content');\n const image =\n $('meta[property=\"og:image\"]').attr('content') ||\n $('meta[name=\"twitter:image\"]').attr('content');\n const favicon = await extractFavicon($, url, logger);\n\n return {\n title,\n content,\n image,\n favicon,\n };\n } catch (e) {\n logExtractMetadataError(logger, url, e);\n return {};\n }\n};\n"],"names":["lookup","sanitizeHtml","cheerio"],"mappings":"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"}
1
+ {"version":3,"file":"util.cjs.js","sources":["../../../src/service/routes/util.ts"],"sourcesContent":["import {\n Answer,\n Post,\n QetaIdEntity,\n QetaSignal,\n} from '@drodil/backstage-plugin-qeta-common';\nimport { SignalsService } from '@backstage/plugin-signals-node';\nimport { lookup } from 'mime-types';\nimport sanitizeHtml from 'sanitize-html';\nimport * as cheerio from 'cheerio';\nimport { CheerioAPI } from 'cheerio';\nimport { LoggerService } from '@backstage/backend-plugin-api';\n\nexport const wrapAsync = async (fn: Function) => {\n fn();\n};\n\nexport const signalPostStats = (\n signalService?: SignalsService,\n question?: Post | null,\n) => {\n if (!signalService || !question) {\n return;\n }\n signalService.publish<QetaSignal>({\n recipients: { type: 'broadcast' },\n channel: `qeta:post_${question.id}`,\n message: {\n type: 'post_stats',\n views: question.views,\n score: question.score,\n answersCount: question.answersCount,\n commentsCount: question.commentsCount,\n correctAnswer: question.correctAnswer,\n },\n });\n};\n\nexport const signalAnswerStats = (\n signalService?: SignalsService,\n answer?: Answer | null,\n) => {\n if (!signalService || !answer) {\n return;\n }\n signalService.publish<QetaSignal>({\n recipients: { type: 'broadcast' },\n channel: `qeta:answer_${answer.id}`,\n message: {\n type: 'answer_stats',\n score: answer.score,\n correctAnswer: answer.correct,\n },\n });\n};\n\nexport const validateDateRange = (\n fromDate: string,\n toDate: string,\n): { isValid: boolean; error?: string; field?: string } => {\n if (fromDate && toDate) {\n const fromDateNewDate = new Date(fromDate);\n const toDateNewDate = new Date(toDate);\n if (fromDateNewDate <= toDateNewDate) {\n return { isValid: true };\n }\n return { isValid: false, error: 'From Date should be less than To Date' };\n } else if (!fromDate && toDate) {\n return {\n isValid: false,\n field: 'fromDate',\n error: 'Please enter from date in format YYYY-MM-DD',\n };\n } else if (fromDate && !toDate) {\n return {\n isValid: false,\n field: 'toDate',\n error: 'Please enter to date in format YYYY-MM-DD',\n };\n }\n\n return { isValid: true };\n};\n\nexport const entityToJsonObject = (entity: QetaIdEntity) => {\n try {\n return JSON.parse(JSON.stringify(entity));\n } catch {\n return { id: entity.id };\n }\n};\n\nconst imageURLToDataURL = async (\n imageURL: string,\n response: Response,\n): Promise<string> => {\n const buffer = await response.arrayBuffer();\n const contentType =\n response.headers.get('content-type') ||\n lookup(imageURL) ||\n 'application/octet-stream';\n\n const encoded = btoa(\n Array.from(new Uint8Array(buffer))\n .map(b => String.fromCharCode(b))\n .join(''),\n );\n return `data:${contentType};base64,${encoded}`;\n};\n\nconst unrelativeURL = (path: string, url: URL): string => {\n const isRelativePath = !path.startsWith('http');\n if (isRelativePath) {\n return `${url.origin}${path.startsWith('/') ? '' : '/'}${path}`;\n }\n return path;\n};\n\nconst extractFavicon = async (\n $: CheerioAPI,\n url: URL,\n logger: LoggerService,\n): Promise<string | undefined> => {\n const favicon =\n $('link[rel=\"icon\"]').attr('href') ||\n $('link[rel=\"shortcut icon\"]').attr('href') ||\n $('link[rel=\"apple-touch-icon\"]').attr('href') ||\n $('link[rel=\"apple-touch-icon-precomposed\"]').attr('href') ||\n $('link[rel=\"mask-icon\"]').attr('href');\n\n const faviconURLs = [\n `${url.origin}/favicon.ico`, // most common location\n favicon ? unrelativeURL(favicon, url) : undefined,\n `https://www.google.com/s2/favicons?domain=${url.hostname}&sz=16`, // google service as fallback\n ];\n\n for (const faviconURL of faviconURLs) {\n if (!faviconURL) continue;\n\n try {\n const response = await fetch(faviconURL, {\n signal: AbortSignal.timeout(3000),\n });\n\n if (response.ok) {\n return await imageURLToDataURL(faviconURL, response);\n }\n } catch (e) {\n logger.warn(`Failed to fetch favicon from url ${faviconURL}`, e);\n }\n }\n\n return undefined;\n};\n\n// Helper to log detailed extractMetadata errors in a single place\nconst logExtractMetadataError = (\n logger: LoggerService,\n url: URL,\n e: unknown,\n): void => {\n const err = e as any;\n const name = err?.name ? `${err.name}: ` : '';\n const message = err?.message ?? String(err);\n const detail = err?.status ? ` (status: ${err.status})` : '';\n const formatCause = (c: any): string => {\n if (!c) return '';\n const cn = c?.name ? `${c.name}: ` : '';\n const cm = c?.message ?? String(c);\n const cs = c?.status ? ` (status: ${c.status})` : '';\n const nested =\n c?.cause && c.cause !== c ? `; cause: ${formatCause(c.cause)}` : '';\n return `${cn}${cm}${cs}${nested}`;\n };\n const causeInfo = err?.cause ? `; cause: ${formatCause(err.cause)}` : '';\n logger.warn(\n `${name}Failed to extract metadata from ${url.toString()}: ${message}${detail}${causeInfo}`,\n );\n};\n\nexport const extractMetadata = async (\n url: URL,\n logger: LoggerService,\n): Promise<{\n title?: string;\n content?: string;\n image?: string;\n favicon?: string;\n}> => {\n try {\n const response = await fetch(url, {\n headers: {\n Accept: 'text/html',\n },\n signal: AbortSignal.timeout(3000),\n });\n if (!response.ok) {\n throw new Error(\n `Failed to fetch metadata from ${url.toString()}: ${response.status} ${\n response.statusText\n }`,\n );\n }\n\n const html = await response.text().then(dirty =>\n sanitizeHtml(dirty, {\n allowedTags: ['title', 'meta', 'link'],\n allowedAttributes: {\n meta: ['name', 'content', 'property'],\n link: ['rel', 'href'],\n },\n }),\n );\n\n const $ = cheerio.load(html);\n const title =\n $('meta[property=\"og:title\"]').attr('content') || $('title').text();\n const content =\n $('meta[property=\"og:description\"]').attr('content') ||\n $('meta[name=\"description\"]').attr('content');\n const image =\n $('meta[property=\"og:image\"]').attr('content') ||\n $('meta[name=\"twitter:image\"]').attr('content');\n const favicon = await extractFavicon($, url, logger);\n\n return {\n title,\n content,\n image,\n favicon,\n };\n } catch (e) {\n logExtractMetadataError(logger, url, e);\n return {};\n }\n};\n"],"names":["lookup","sanitizeHtml","cheerio"],"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.44.0",
3
+ "version": "3.45.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.5",
67
67
  "@backstage/plugin-signals-node": "^0.1.25",
68
68
  "@backstage/types": "^1.2.2",
69
- "@drodil/backstage-plugin-qeta-common": "^3.44.0",
70
- "@drodil/backstage-plugin-qeta-node": "^3.44.0",
69
+ "@drodil/backstage-plugin-qeta-common": "^3.45.0",
70
+ "@drodil/backstage-plugin-qeta-node": "^3.45.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.49",
106
106
  "@backstage/plugin-signals-backend": "^0.3.9",
107
107
  "@backstage/plugin-techdocs-backend": "^2.1.1",
108
- "@drodil/backstage-plugin-catalog-backend-module-qeta": "^3.44.0",
109
- "@drodil/backstage-plugin-qeta-backend-module-openai": "^3.44.0",
110
- "@drodil/backstage-plugin-search-backend-module-qeta": "^3.44.0",
108
+ "@drodil/backstage-plugin-catalog-backend-module-qeta": "^3.45.0",
109
+ "@drodil/backstage-plugin-qeta-backend-module-openai": "^3.45.0",
110
+ "@drodil/backstage-plugin-search-backend-module-qeta": "^3.45.0",
111
111
  "@types/sanitize-html": "^2.9.5",
112
112
  "@types/stopword": "^2.0.3",
113
113
  "@types/supertest": "^2.0.12",