@drodil/backstage-plugin-qeta-backend 3.53.3 → 3.55.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.
@@ -1 +1 @@
1
- {"version":3,"file":"collections.cjs.js","sources":["../../../src/service/routes/collections.ts"],"sourcesContent":["import { getCreated, mapAdditionalFields } from '../util';\nimport Ajv from 'ajv';\nimport { Router } from 'express';\nimport {\n CollectionsQuery,\n qetaCreateCollectionPermission,\n qetaDeleteCollectionPermission,\n qetaEditCollectionPermission,\n qetaReadCollectionPermission,\n qetaReadPostPermission,\n qetaReadTagPermission,\n} from '@drodil/backstage-plugin-qeta-common';\nimport addFormats from 'ajv-formats';\nimport {\n CollectionPostSchema,\n CollectionRankPostSchema,\n CollectionSchema,\n CollectionsQuerySchema,\n DeleteMetadataSchema,\n RouteOptions,\n} from '../types';\nimport { entityToJsonObject, validateDateRange, wrapAsync } from './util';\n\nconst ajv = new Ajv({ coerceTypes: 'array' });\naddFormats(ajv);\n\nexport const collectionsRoutes = (router: Router, options: RouteOptions) => {\n const { database, events, notificationMgr, auditor, permissionMgr } = options;\n // GET /collections\n router.get(`/collections`, async (request, response) => {\n // Validation\n const username = await permissionMgr.getUsername(request, true);\n const validateQuery = ajv.compile(CollectionsQuerySchema);\n if (!validateQuery(request.query)) {\n response\n .status(400)\n .send({ errors: validateQuery.errors, type: 'query' });\n return;\n }\n\n const validDate = validateDateRange(\n request.query.fromDate as string,\n request.query.toDate as string,\n );\n if (!validDate?.isValid) {\n response.status(400).send(validDate);\n return;\n }\n\n const conditions = await Promise.all([\n permissionMgr.getAuthorizeConditions(request, qetaReadPostPermission, {\n allowServicePrincipal: true,\n }),\n permissionMgr.getAuthorizeConditions(\n request,\n qetaReadCollectionPermission,\n { allowServicePrincipal: true },\n ),\n permissionMgr.getAuthorizeConditions(request, qetaReadTagPermission, {\n allowServicePrincipal: true,\n }),\n ]);\n\n const postFilters = conditions[0];\n const filters = conditions[1];\n const tagFilters = conditions[2];\n\n const opts = request.query as CollectionsQuery;\n // Act\n const collections = await database.getCollections(username, opts, {\n filters,\n postFilters,\n tagFilters,\n });\n\n await mapAdditionalFields(request, collections.collections, options, {\n checkRights: opts.checkAccess ?? false,\n username,\n });\n\n response.json(collections);\n });\n\n router.post(`/collections/query`, async (request, response) => {\n // Validation\n const username = await permissionMgr.getUsername(request, true);\n const validateQuery = ajv.compile(CollectionsQuerySchema);\n if (!validateQuery(request.body)) {\n response\n .status(400)\n .send({ errors: validateQuery.errors, type: 'query' });\n return;\n }\n\n const validDate = validateDateRange(\n request.body.fromDate as string,\n request.body.toDate as string,\n );\n if (!validDate?.isValid) {\n response.status(400).send(validDate);\n return;\n }\n\n const [postFilters, filters, tagFilters] = await Promise.all([\n permissionMgr.getAuthorizeConditions(request, qetaReadPostPermission, {\n allowServicePrincipal: true,\n }),\n permissionMgr.getAuthorizeConditions(\n request,\n qetaReadCollectionPermission,\n { allowServicePrincipal: true },\n ),\n permissionMgr.getAuthorizeConditions(request, qetaReadTagPermission, {\n allowServicePrincipal: true,\n }),\n ]);\n\n const opts = request.body;\n\n // Act\n const collections = await database.getCollections(username, opts, {\n filters,\n postFilters,\n tagFilters,\n });\n\n await mapAdditionalFields(request, collections.collections, options, {\n checkRights: opts.checkAccess ?? false,\n username,\n });\n\n response.json(collections);\n });\n\n // POST /collections\n router.post(`/collections`, async (request, response) => {\n // Validation\n const validateRequestBody = ajv.compile(CollectionSchema);\n if (!validateRequestBody(request.body)) {\n response\n .status(400)\n .json({ errors: validateRequestBody.errors, type: 'body' });\n return;\n }\n await permissionMgr.authorize(\n request,\n [{ permission: qetaCreateCollectionPermission }],\n { throwOnDeny: true },\n );\n\n const username = await permissionMgr.getUsername(request);\n const created = await getCreated(request, options);\n\n // Act\n const collection = await database.createCollection({\n user_ref: username,\n title: request.body.title,\n description: request.body.description,\n created,\n images: request.body.images,\n headerImage: request.body.headerImage,\n opts: { includePosts: false },\n });\n\n if (!collection) {\n response\n .status(400)\n .send({ errors: 'Failed to create collection', type: 'body' });\n return;\n }\n\n wrapAsync(async () => {\n const followingUsers = await Promise.all([\n database.getFollowingUsers(username),\n ]);\n await notificationMgr.onNewCollection(\n username,\n collection,\n followingUsers.flat(),\n );\n });\n\n events?.publish({\n topic: 'qeta',\n eventPayload: {\n collection,\n author: username,\n },\n metadata: { action: 'new_collection' },\n });\n\n await mapAdditionalFields(request, [collection], options, { username });\n\n auditor?.createEvent({\n eventId: 'create-collection',\n severityLevel: 'medium',\n request,\n meta: { collection: entityToJsonObject(collection) },\n });\n\n // Response\n response.status(201).json(collection);\n });\n\n // POST /collections/:id\n router.post(`/collections/:id`, async (request, response) => {\n // Validation\n const validateRequestBody = ajv.compile(CollectionSchema);\n if (!validateRequestBody(request.body)) {\n response\n .status(400)\n .json({ errors: validateRequestBody.errors, type: 'body' });\n return;\n }\n const collectionId = Number.parseInt(request.params.id, 10);\n if (Number.isNaN(collectionId)) {\n response\n .status(400)\n .send({ errors: 'Invalid collection id', type: 'body' });\n return;\n }\n\n const username = await permissionMgr.getUsername(request);\n const originalCollection = await database.getCollection(\n username,\n Number.parseInt(request.params.id, 10),\n );\n\n if (!originalCollection) {\n response.sendStatus(404);\n return;\n }\n\n await permissionMgr.authorize(\n request,\n [\n {\n permission: qetaEditCollectionPermission,\n resource: originalCollection,\n },\n ],\n { throwOnDeny: true },\n );\n\n const [postFilters, filters, tagFilters] = await Promise.all([\n permissionMgr.getAuthorizeConditions(request, qetaReadPostPermission, {\n allowServicePrincipal: true,\n }),\n permissionMgr.getAuthorizeConditions(\n request,\n qetaReadCollectionPermission,\n { allowServicePrincipal: true },\n ),\n permissionMgr.getAuthorizeConditions(request, qetaReadTagPermission, {\n allowServicePrincipal: true,\n }),\n ]);\n\n // Act\n const collection = await database.updateCollection({\n id: collectionId,\n user_ref: username,\n title: request.body.title,\n description: request.body.description,\n images: request.body.images,\n headerImage: request.body.headerImage,\n opts: { postFilters, tagFilters, filters },\n });\n\n if (!collection) {\n response.sendStatus(401);\n return;\n }\n\n events?.publish({\n topic: 'qeta',\n eventPayload: {\n collection,\n author: username,\n },\n metadata: { action: 'update_collection' },\n });\n\n await mapAdditionalFields(request, [collection], options, { username });\n\n auditor?.createEvent({\n eventId: 'update-collection',\n severityLevel: 'medium',\n request,\n meta: {\n from: entityToJsonObject(originalCollection),\n to: entityToJsonObject(collection),\n },\n });\n\n // Response\n response.json(collection);\n });\n\n // DELETE /collections/:id\n router.delete('/collections/:id', async (request, response) => {\n // Validation\n const collectionId = Number.parseInt(request.params.id, 10);\n const validateRequestBody = ajv.compile(DeleteMetadataSchema);\n if (Number.isNaN(collectionId) || !validateRequestBody(request.body)) {\n response\n .status(400)\n .send({ errors: 'Invalid collection id', type: 'body' });\n return;\n }\n const username = await permissionMgr.getUsername(request);\n const collection = await database.getCollection(\n username,\n Number.parseInt(request.params.id, 10),\n );\n\n if (!collection) {\n response.sendStatus(404);\n return;\n }\n\n await permissionMgr.authorize(\n request,\n [{ permission: qetaDeleteCollectionPermission, resource: collection }],\n { throwOnDeny: true },\n );\n\n // Act\n const deleted = await database.deleteCollection(collectionId);\n\n if (deleted && events) {\n events.publish({\n topic: 'qeta',\n eventPayload: {\n collection,\n author: username,\n reason: request.body.reason,\n },\n metadata: { action: 'delete_collection' },\n });\n }\n\n if (deleted) {\n notificationMgr.onCollectionDelete(\n username,\n collection,\n request.body.reason,\n );\n auditor?.createEvent({\n eventId: 'delete-collection',\n severityLevel: 'medium',\n request,\n meta: {\n collection: entityToJsonObject(collection),\n reason: request.body.reason,\n },\n });\n }\n\n // Response\n response.sendStatus(deleted ? 204 : 404);\n });\n\n router.get('/collections/followed', async (request, response) => {\n const username = await permissionMgr.getUsername(request, false);\n const [postFilters, filters, tagFilters] = await Promise.all([\n permissionMgr.getAuthorizeConditions(request, qetaReadPostPermission, {\n allowServicePrincipal: true,\n }),\n permissionMgr.getAuthorizeConditions(\n request,\n qetaReadCollectionPermission,\n { allowServicePrincipal: true },\n ),\n permissionMgr.getAuthorizeConditions(request, qetaReadTagPermission, {\n allowServicePrincipal: true,\n }),\n ]);\n\n const collections = await database.getUserCollections(username, {\n filters,\n postFilters,\n tagFilters,\n });\n response.json(collections);\n });\n\n router.put('/collections/follow/:id', async (request, response) => {\n const { id } = request.params;\n const collectionId = Number.parseInt(id, 10);\n if (Number.isNaN(collectionId)) {\n response\n .status(400)\n .send({ errors: 'Invalid collection id', type: 'body' });\n }\n\n const username = await permissionMgr.getUsername(request, false);\n const collection = await database.getCollection(username, collectionId);\n if (!collection) {\n response.sendStatus(404);\n return;\n }\n await permissionMgr.authorize(\n request,\n [{ permission: qetaReadCollectionPermission, resource: collection }],\n { throwOnDeny: true },\n );\n\n await database.followCollection(username, collectionId);\n\n auditor?.createEvent({\n eventId: 'follow-collection',\n severityLevel: 'low',\n request,\n meta: { collection: entityToJsonObject(collection) },\n });\n\n response.status(204).send();\n });\n\n router.delete('/collections/follow/:id', async (request, response) => {\n const { id } = request.params;\n const collectionId = Number.parseInt(id, 10);\n if (Number.isNaN(collectionId)) {\n response\n .status(400)\n .send({ errors: 'Invalid collection id', type: 'body' });\n }\n\n const username = await permissionMgr.getUsername(request, false);\n const collection = await database.getCollection(username, collectionId);\n if (!collection) {\n response.sendStatus(404);\n return;\n }\n\n await permissionMgr.authorize(\n request,\n [{ permission: qetaReadCollectionPermission, resource: collection }],\n { throwOnDeny: true },\n );\n await database.unfollowCollection(username, collectionId);\n\n auditor?.createEvent({\n eventId: 'unfollow-collection',\n severityLevel: 'low',\n request,\n meta: { collection: entityToJsonObject(collection) },\n });\n\n response.status(204).send();\n });\n\n // GET /collections/:id\n router.get(`/collections/:id`, async (request, response) => {\n // Validation\n // Act\n const username = await permissionMgr.getUsername(request);\n const collectionId = Number.parseInt(request.params.id, 10);\n if (Number.isNaN(collectionId)) {\n response\n .status(400)\n .send({ errors: 'Invalid collection id', type: 'body' });\n return;\n }\n\n const [postFilters, tagFilters] = await Promise.all([\n permissionMgr.getAuthorizeConditions(request, qetaReadPostPermission, {\n allowServicePrincipal: true,\n }),\n permissionMgr.getAuthorizeConditions(request, qetaReadTagPermission, {\n allowServicePrincipal: true,\n }),\n ]);\n\n const collection = await database.getCollection(\n username,\n Number.parseInt(request.params.id, 10),\n { postFilters, tagFilters },\n );\n\n if (collection === null) {\n response.sendStatus(404);\n return;\n }\n\n await permissionMgr.authorize(\n request,\n [{ permission: qetaReadCollectionPermission, resource: collection }],\n { throwOnDeny: true },\n );\n\n await mapAdditionalFields(request, [collection], options, { username });\n\n auditor?.createEvent({\n eventId: 'read-collection',\n severityLevel: 'low',\n request,\n meta: { collection: entityToJsonObject(collection) },\n });\n\n // Response\n response.json(collection);\n });\n\n // POST /collections/:id\n router.post(`/collections/:id/posts`, async (request, response) => {\n // Validation\n const validateRequestBody = ajv.compile(CollectionPostSchema);\n if (!validateRequestBody(request.body)) {\n response\n .status(400)\n .json({ errors: validateRequestBody.errors, type: 'body' });\n return;\n }\n const collectionId = Number.parseInt(request.params.id, 10);\n if (Number.isNaN(collectionId)) {\n response\n .status(400)\n .send({ errors: 'Invalid collection id', type: 'body' });\n return;\n }\n\n const username = await permissionMgr.getUsername(request);\n let collection = await database.getCollection(\n username,\n Number.parseInt(request.params.id, 10),\n );\n\n const post = await database.getPost(username, request.body.postId, false);\n if (!post) {\n response.status(404).send({ errors: 'Post not found', type: 'body' });\n return;\n }\n\n await permissionMgr.authorize(\n request,\n [\n { permission: qetaEditCollectionPermission, resource: collection! },\n { permission: qetaReadPostPermission, resource: post },\n ],\n { throwOnDeny: true },\n );\n\n const [postFilters, tagFilters] = await Promise.all([\n permissionMgr.getAuthorizeConditions(request, qetaReadPostPermission, {\n allowServicePrincipal: true,\n }),\n permissionMgr.getAuthorizeConditions(request, qetaReadTagPermission, {\n allowServicePrincipal: true,\n }),\n ]);\n\n // Act\n collection = await database.addPostToCollection(\n username,\n collectionId,\n request.body.postId,\n { postFilters, tagFilters },\n );\n\n if (!collection) {\n response.sendStatus(404);\n return;\n }\n\n wrapAsync(async () => {\n if (!collection) {\n return;\n }\n const followingUsers = await Promise.all([\n database.getUsersForCollection(collectionId),\n database.getFollowingUsers(username),\n ]);\n await notificationMgr.onNewPostToCollection(\n username,\n collection,\n followingUsers.flat(),\n );\n });\n\n events?.publish({\n topic: 'qeta',\n eventPayload: {\n collection,\n author: username,\n },\n metadata: { action: 'update_collection' },\n });\n\n await mapAdditionalFields(request, [collection], options, { username });\n\n auditor?.createEvent({\n eventId: 'add-to-collection',\n severityLevel: 'low',\n request,\n meta: {\n collection: entityToJsonObject(collection),\n post: entityToJsonObject(post),\n },\n });\n\n // Response\n response.status(200);\n response.json(collection);\n });\n\n // DELETE /collections/:id/posts\n router.delete(`/collections/:id/posts`, async (request, response) => {\n // Validation\n const validateRequestBody = ajv.compile(CollectionPostSchema);\n if (!validateRequestBody(request.body)) {\n response\n .status(400)\n .json({ errors: validateRequestBody.errors, type: 'body' });\n return;\n }\n const collectionId = Number.parseInt(request.params.id, 10);\n if (Number.isNaN(collectionId)) {\n response\n .status(400)\n .send({ errors: 'Invalid collection id', type: 'body' });\n return;\n }\n\n const username = await permissionMgr.getUsername(request);\n let collection = await database.getCollection(\n username,\n Number.parseInt(request.params.id, 10),\n );\n\n const post = await database.getPost(username, request.body.postId, false);\n if (!post) {\n response.status(404).send({ errors: 'Post not found', type: 'body' });\n return;\n }\n\n await permissionMgr.authorize(\n request,\n [\n { permission: qetaEditCollectionPermission, resource: collection! },\n { permission: qetaReadPostPermission, resource: post },\n ],\n { throwOnDeny: true },\n );\n\n const [postFilters, tagFilters] = await Promise.all([\n permissionMgr.getAuthorizeConditions(request, qetaReadPostPermission, {\n allowServicePrincipal: true,\n }),\n permissionMgr.getAuthorizeConditions(request, qetaReadTagPermission, {\n allowServicePrincipal: true,\n }),\n ]);\n\n // Act\n collection = await database.removePostFromCollection(\n username,\n collectionId,\n request.body.postId,\n { postFilters, tagFilters },\n );\n\n if (!collection) {\n response\n .status(404)\n .send({ errors: 'Collection not found', type: 'body' });\n return;\n }\n\n events?.publish({\n topic: 'qeta',\n eventPayload: {\n collection,\n author: username,\n },\n metadata: { action: 'update_collection' },\n });\n\n await mapAdditionalFields(request, [collection], options, { username });\n\n auditor?.createEvent({\n eventId: 'delete-from-collection',\n severityLevel: 'low',\n request,\n meta: {\n collection: entityToJsonObject(collection),\n post: entityToJsonObject(post),\n },\n });\n\n // Response\n response.status(200);\n response.json(collection);\n });\n\n router.post('/collections/:id/rank/', async (request, response) => {\n const validateRequestBody = ajv.compile(CollectionRankPostSchema);\n if (!validateRequestBody(request.body)) {\n response\n .status(400)\n .json({ errors: validateRequestBody.errors, type: 'body' });\n return;\n }\n\n const collectionId = Number.parseInt(request.params.id, 10);\n if (Number.isNaN(collectionId)) {\n response\n .status(400)\n .send({ errors: 'Invalid collection id', type: 'body' });\n return;\n }\n\n const username = await permissionMgr.getUsername(request);\n const collection = await database.getCollection(\n username,\n Number.parseInt(request.params.id, 10),\n );\n\n if (!collection) {\n response.sendStatus(404);\n return;\n }\n\n const post = await database.getPost(username, request.body.postId, false);\n\n if (!post) {\n response.status(404).send({ errors: 'Post not found', type: 'body' });\n return;\n }\n\n await permissionMgr.authorize(\n request,\n [\n { permission: qetaEditCollectionPermission, resource: collection },\n { permission: qetaReadPostPermission, resource: post },\n ],\n { throwOnDeny: true },\n );\n\n const currentRank = await database.getPostRank(\n collection.id,\n request.body.postId,\n );\n if (!currentRank) {\n response.status(404).send();\n return;\n }\n\n if (request.body.rank === 'up') {\n const higherRankPostId = await database.getNextRankedPostId(\n collection.id,\n request.body.postId,\n );\n if (higherRankPostId) {\n await database.updatePostRank(\n collection.id,\n higherRankPostId.postId,\n currentRank,\n );\n await database.updatePostRank(\n collection.id,\n request.body.postId,\n higherRankPostId.rank,\n );\n }\n } else if (request.body.rank === 'down') {\n const lowerRankPostId = await database.getPreviousRankedPostId(\n collection.id,\n request.body.postId,\n );\n if (lowerRankPostId) {\n await database.updatePostRank(\n collection.id,\n lowerRankPostId.postId,\n currentRank,\n );\n await database.updatePostRank(\n collection.id,\n request.body.postId,\n lowerRankPostId.rank,\n );\n }\n } else if (request.body.rank === 'top') {\n const topRankPostId = await database.getTopRankedPostId(collectionId);\n if (topRankPostId) {\n await database.updatePostRank(\n collection.id,\n topRankPostId.postId,\n currentRank,\n );\n await database.updatePostRank(\n collection.id,\n request.body.postId,\n topRankPostId.rank,\n );\n }\n } else if (request.body.rank === 'bottom') {\n const bottomRankPostId = await database.getBottomRankedPostId(\n collection.id,\n );\n if (bottomRankPostId) {\n await database.updatePostRank(\n collection.id,\n bottomRankPostId.postId,\n currentRank,\n );\n await database.updatePostRank(\n collection.id,\n request.body.postId,\n bottomRankPostId.rank,\n );\n }\n }\n\n auditor?.createEvent({\n eventId: 'rank-collection',\n severityLevel: 'low',\n request,\n meta: {\n collection: entityToJsonObject(collection),\n post: entityToJsonObject(post),\n rank: request.body.rank,\n },\n });\n\n response.sendStatus(200);\n });\n};\n"],"names":["Ajv","addFormats","CollectionsQuerySchema","validateDateRange","qetaReadPostPermission","qetaReadCollectionPermission","qetaReadTagPermission","mapAdditionalFields","CollectionSchema","qetaCreateCollectionPermission","getCreated","wrapAsync","entityToJsonObject","qetaEditCollectionPermission","DeleteMetadataSchema","qetaDeleteCollectionPermission","CollectionPostSchema","CollectionRankPostSchema"],"mappings":"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"}
1
+ {"version":3,"file":"collections.cjs.js","sources":["../../../src/service/routes/collections.ts"],"sourcesContent":["import { getCreated, mapAdditionalFields } from '../util';\nimport Ajv from 'ajv';\nimport { Router } from 'express';\nimport {\n CollectionsQuery,\n qetaCreateCollectionPermission,\n qetaDeleteCollectionPermission,\n qetaEditCollectionPermission,\n qetaReadCollectionPermission,\n qetaReadPostPermission,\n qetaReadTagPermission,\n} from '@drodil/backstage-plugin-qeta-common';\nimport addFormats from 'ajv-formats';\nimport {\n CollectionPostSchema,\n CollectionRankPostSchema,\n CollectionSchema,\n CollectionsQuerySchema,\n DeleteMetadataSchema,\n RouteOptions,\n} from '../types';\nimport { entityToJsonObject, validateDateRange, wrapAsync } from './util';\n\nconst ajv = new Ajv({ coerceTypes: 'array' });\naddFormats(ajv);\n\nexport const collectionsRoutes = (router: Router, options: RouteOptions) => {\n const { database, events, notificationMgr, auditor, permissionMgr } = options;\n // GET /collections\n router.get(`/collections`, async (request, response) => {\n // Validation\n const username = await permissionMgr.getUsername(request, true);\n const validateQuery = ajv.compile(CollectionsQuerySchema);\n if (!validateQuery(request.query)) {\n response\n .status(400)\n .send({ errors: validateQuery.errors, type: 'query' });\n return;\n }\n\n const validDate = validateDateRange(\n request.query.fromDate as string,\n request.query.toDate as string,\n );\n if (!validDate?.isValid) {\n response.status(400).send(validDate);\n return;\n }\n\n const conditions = await Promise.all([\n permissionMgr.getAuthorizeConditions(request, qetaReadPostPermission, {\n allowServicePrincipal: true,\n }),\n permissionMgr.getAuthorizeConditions(\n request,\n qetaReadCollectionPermission,\n { allowServicePrincipal: true },\n ),\n permissionMgr.getAuthorizeConditions(request, qetaReadTagPermission, {\n allowServicePrincipal: true,\n }),\n ]);\n\n const postFilters = conditions[0];\n const filters = conditions[1];\n const tagFilters = conditions[2];\n\n const opts = request.query as CollectionsQuery;\n // Act\n const collections = await database.getCollections(username, opts, {\n filters,\n postFilters,\n tagFilters,\n });\n\n await mapAdditionalFields(request, collections.collections, options, {\n checkRights: opts.checkAccess ?? false,\n username,\n });\n\n response.json(collections);\n });\n\n router.post(`/collections/query`, async (request, response) => {\n // Validation\n const username = await permissionMgr.getUsername(request, true);\n const validateQuery = ajv.compile(CollectionsQuerySchema);\n if (!validateQuery(request.body)) {\n response\n .status(400)\n .send({ errors: validateQuery.errors, type: 'query' });\n return;\n }\n\n const validDate = validateDateRange(\n request.body.fromDate as string,\n request.body.toDate as string,\n );\n if (!validDate?.isValid) {\n response.status(400).send(validDate);\n return;\n }\n\n const [postFilters, filters, tagFilters] = await Promise.all([\n permissionMgr.getAuthorizeConditions(request, qetaReadPostPermission, {\n allowServicePrincipal: true,\n }),\n permissionMgr.getAuthorizeConditions(\n request,\n qetaReadCollectionPermission,\n { allowServicePrincipal: true },\n ),\n permissionMgr.getAuthorizeConditions(request, qetaReadTagPermission, {\n allowServicePrincipal: true,\n }),\n ]);\n\n const opts = request.body;\n\n // Act\n const collections = await database.getCollections(username, opts, {\n filters,\n postFilters,\n tagFilters,\n });\n\n await mapAdditionalFields(request, collections.collections, options, {\n checkRights: opts.checkAccess ?? false,\n username,\n });\n\n response.json(collections);\n });\n\n // POST /collections\n router.post(`/collections`, async (request, response) => {\n // Validation\n const validateRequestBody = ajv.compile(CollectionSchema);\n if (!validateRequestBody(request.body)) {\n response\n .status(400)\n .json({ errors: validateRequestBody.errors, type: 'body' });\n return;\n }\n await permissionMgr.authorize(\n request,\n [{ permission: qetaCreateCollectionPermission }],\n { throwOnDeny: true },\n );\n\n const username = await permissionMgr.getUsername(request);\n const created = await getCreated(request, options);\n\n // Act\n const collection = await database.createCollection({\n user_ref: username,\n title: request.body.title,\n description: request.body.description,\n created,\n images: request.body.images,\n headerImage: request.body.headerImage,\n tags: request.body.tags,\n entities: request.body.entities,\n users: request.body.users,\n opts: { includePosts: false },\n });\n\n if (!collection) {\n response\n .status(400)\n .send({ errors: 'Failed to create collection', type: 'body' });\n return;\n }\n\n wrapAsync(async () => {\n const followingUsers = await Promise.all([\n database.getFollowingUsers(username),\n ]);\n await notificationMgr.onNewCollection(\n username,\n collection,\n followingUsers.flat(),\n );\n });\n\n events?.publish({\n topic: 'qeta',\n eventPayload: {\n collection,\n author: username,\n },\n metadata: { action: 'new_collection' },\n });\n\n await mapAdditionalFields(request, [collection], options, { username });\n\n auditor?.createEvent({\n eventId: 'create-collection',\n severityLevel: 'medium',\n request,\n meta: { collection: entityToJsonObject(collection) },\n });\n\n // Response\n response.status(201).json(collection);\n });\n\n // POST /collections/:id\n router.post(`/collections/:id`, async (request, response) => {\n // Validation\n const validateRequestBody = ajv.compile(CollectionSchema);\n if (!validateRequestBody(request.body)) {\n response\n .status(400)\n .json({ errors: validateRequestBody.errors, type: 'body' });\n return;\n }\n const collectionId = Number.parseInt(request.params.id, 10);\n if (Number.isNaN(collectionId)) {\n response\n .status(400)\n .send({ errors: 'Invalid collection id', type: 'body' });\n return;\n }\n\n const username = await permissionMgr.getUsername(request);\n const originalCollection = await database.getCollection(\n username,\n Number.parseInt(request.params.id, 10),\n );\n\n if (!originalCollection) {\n response.sendStatus(404);\n return;\n }\n\n await permissionMgr.authorize(\n request,\n [\n {\n permission: qetaEditCollectionPermission,\n resource: originalCollection,\n },\n ],\n { throwOnDeny: true },\n );\n\n const [postFilters, filters, tagFilters] = await Promise.all([\n permissionMgr.getAuthorizeConditions(request, qetaReadPostPermission, {\n allowServicePrincipal: true,\n }),\n permissionMgr.getAuthorizeConditions(\n request,\n qetaReadCollectionPermission,\n { allowServicePrincipal: true },\n ),\n permissionMgr.getAuthorizeConditions(request, qetaReadTagPermission, {\n allowServicePrincipal: true,\n }),\n ]);\n\n // Act\n const collection = await database.updateCollection({\n id: collectionId,\n user_ref: username,\n title: request.body.title,\n description: request.body.description,\n images: request.body.images,\n headerImage: request.body.headerImage,\n tags: request.body.tags,\n entities: request.body.entities,\n users: request.body.users,\n opts: { postFilters, tagFilters, filters },\n });\n\n if (!collection) {\n response.sendStatus(401);\n return;\n }\n\n events?.publish({\n topic: 'qeta',\n eventPayload: {\n collection,\n author: username,\n },\n metadata: { action: 'update_collection' },\n });\n\n await mapAdditionalFields(request, [collection], options, { username });\n\n auditor?.createEvent({\n eventId: 'update-collection',\n severityLevel: 'medium',\n request,\n meta: {\n from: entityToJsonObject(originalCollection),\n to: entityToJsonObject(collection),\n },\n });\n\n // Response\n response.json(collection);\n });\n\n // DELETE /collections/:id\n router.delete('/collections/:id', async (request, response) => {\n // Validation\n const collectionId = Number.parseInt(request.params.id, 10);\n const validateRequestBody = ajv.compile(DeleteMetadataSchema);\n if (Number.isNaN(collectionId) || !validateRequestBody(request.body)) {\n response\n .status(400)\n .send({ errors: 'Invalid collection id', type: 'body' });\n return;\n }\n const username = await permissionMgr.getUsername(request);\n const collection = await database.getCollection(\n username,\n Number.parseInt(request.params.id, 10),\n );\n\n if (!collection) {\n response.sendStatus(404);\n return;\n }\n\n await permissionMgr.authorize(\n request,\n [{ permission: qetaDeleteCollectionPermission, resource: collection }],\n { throwOnDeny: true },\n );\n\n // Act\n const deleted = await database.deleteCollection(collectionId);\n\n if (deleted && events) {\n events.publish({\n topic: 'qeta',\n eventPayload: {\n collection,\n author: username,\n reason: request.body.reason,\n },\n metadata: { action: 'delete_collection' },\n });\n }\n\n if (deleted) {\n notificationMgr.onCollectionDelete(\n username,\n collection,\n request.body.reason,\n );\n auditor?.createEvent({\n eventId: 'delete-collection',\n severityLevel: 'medium',\n request,\n meta: {\n collection: entityToJsonObject(collection),\n reason: request.body.reason,\n },\n });\n }\n\n // Response\n response.sendStatus(deleted ? 204 : 404);\n });\n\n router.get('/collections/followed', async (request, response) => {\n const username = await permissionMgr.getUsername(request, false);\n const [postFilters, filters, tagFilters] = await Promise.all([\n permissionMgr.getAuthorizeConditions(request, qetaReadPostPermission, {\n allowServicePrincipal: true,\n }),\n permissionMgr.getAuthorizeConditions(\n request,\n qetaReadCollectionPermission,\n { allowServicePrincipal: true },\n ),\n permissionMgr.getAuthorizeConditions(request, qetaReadTagPermission, {\n allowServicePrincipal: true,\n }),\n ]);\n\n const collections = await database.getUserCollections(username, {\n filters,\n postFilters,\n tagFilters,\n });\n response.json(collections);\n });\n\n router.put('/collections/follow/:id', async (request, response) => {\n const { id } = request.params;\n const collectionId = Number.parseInt(id, 10);\n if (Number.isNaN(collectionId)) {\n response\n .status(400)\n .send({ errors: 'Invalid collection id', type: 'body' });\n }\n\n const username = await permissionMgr.getUsername(request, false);\n const collection = await database.getCollection(username, collectionId);\n if (!collection) {\n response.sendStatus(404);\n return;\n }\n await permissionMgr.authorize(\n request,\n [{ permission: qetaReadCollectionPermission, resource: collection }],\n { throwOnDeny: true },\n );\n\n await database.followCollection(username, collectionId);\n\n auditor?.createEvent({\n eventId: 'follow-collection',\n severityLevel: 'low',\n request,\n meta: { collection: entityToJsonObject(collection) },\n });\n\n response.status(204).send();\n });\n\n router.delete('/collections/follow/:id', async (request, response) => {\n const { id } = request.params;\n const collectionId = Number.parseInt(id, 10);\n if (Number.isNaN(collectionId)) {\n response\n .status(400)\n .send({ errors: 'Invalid collection id', type: 'body' });\n }\n\n const username = await permissionMgr.getUsername(request, false);\n const collection = await database.getCollection(username, collectionId);\n if (!collection) {\n response.sendStatus(404);\n return;\n }\n\n await permissionMgr.authorize(\n request,\n [{ permission: qetaReadCollectionPermission, resource: collection }],\n { throwOnDeny: true },\n );\n await database.unfollowCollection(username, collectionId);\n\n auditor?.createEvent({\n eventId: 'unfollow-collection',\n severityLevel: 'low',\n request,\n meta: { collection: entityToJsonObject(collection) },\n });\n\n response.status(204).send();\n });\n\n // GET /collections/:id\n router.get(`/collections/:id`, async (request, response) => {\n // Validation\n // Act\n const username = await permissionMgr.getUsername(request);\n const collectionId = Number.parseInt(request.params.id, 10);\n if (Number.isNaN(collectionId)) {\n response\n .status(400)\n .send({ errors: 'Invalid collection id', type: 'body' });\n return;\n }\n\n const [postFilters, tagFilters] = await Promise.all([\n permissionMgr.getAuthorizeConditions(request, qetaReadPostPermission, {\n allowServicePrincipal: true,\n }),\n permissionMgr.getAuthorizeConditions(request, qetaReadTagPermission, {\n allowServicePrincipal: true,\n }),\n ]);\n\n const collection = await database.getCollection(\n username,\n Number.parseInt(request.params.id, 10),\n { postFilters, tagFilters },\n );\n\n if (collection === null) {\n response.sendStatus(404);\n return;\n }\n\n await permissionMgr.authorize(\n request,\n [{ permission: qetaReadCollectionPermission, resource: collection }],\n { throwOnDeny: true },\n );\n\n await mapAdditionalFields(request, [collection], options, { username });\n\n auditor?.createEvent({\n eventId: 'read-collection',\n severityLevel: 'low',\n request,\n meta: { collection: entityToJsonObject(collection) },\n });\n\n // Response\n response.json(collection);\n });\n\n // POST /collections/:id\n router.post(`/collections/:id/posts`, async (request, response) => {\n // Validation\n const validateRequestBody = ajv.compile(CollectionPostSchema);\n if (!validateRequestBody(request.body)) {\n response\n .status(400)\n .json({ errors: validateRequestBody.errors, type: 'body' });\n return;\n }\n const collectionId = Number.parseInt(request.params.id, 10);\n if (Number.isNaN(collectionId)) {\n response\n .status(400)\n .send({ errors: 'Invalid collection id', type: 'body' });\n return;\n }\n\n const username = await permissionMgr.getUsername(request);\n let collection = await database.getCollection(\n username,\n Number.parseInt(request.params.id, 10),\n );\n\n const post = await database.getPost(username, request.body.postId, false);\n if (!post) {\n response.status(404).send({ errors: 'Post not found', type: 'body' });\n return;\n }\n\n await permissionMgr.authorize(\n request,\n [\n { permission: qetaEditCollectionPermission, resource: collection! },\n { permission: qetaReadPostPermission, resource: post },\n ],\n { throwOnDeny: true },\n );\n\n const [postFilters, tagFilters] = await Promise.all([\n permissionMgr.getAuthorizeConditions(request, qetaReadPostPermission, {\n allowServicePrincipal: true,\n }),\n permissionMgr.getAuthorizeConditions(request, qetaReadTagPermission, {\n allowServicePrincipal: true,\n }),\n ]);\n\n // Act\n collection = await database.addPostToCollection(\n username,\n collectionId,\n request.body.postId,\n { postFilters, tagFilters },\n );\n\n if (!collection) {\n response.sendStatus(404);\n return;\n }\n\n wrapAsync(async () => {\n if (!collection) {\n return;\n }\n const followingUsers = await Promise.all([\n database.getUsersForCollection(collectionId),\n database.getFollowingUsers(username),\n ]);\n await notificationMgr.onNewPostToCollection(\n username,\n collection,\n followingUsers.flat(),\n );\n });\n\n events?.publish({\n topic: 'qeta',\n eventPayload: {\n collection,\n author: username,\n },\n metadata: { action: 'update_collection' },\n });\n\n await mapAdditionalFields(request, [collection], options, { username });\n\n auditor?.createEvent({\n eventId: 'add-to-collection',\n severityLevel: 'low',\n request,\n meta: {\n collection: entityToJsonObject(collection),\n post: entityToJsonObject(post),\n },\n });\n\n // Response\n response.status(200);\n response.json(collection);\n });\n\n // DELETE /collections/:id/posts\n router.delete(`/collections/:id/posts`, async (request, response) => {\n // Validation\n const validateRequestBody = ajv.compile(CollectionPostSchema);\n if (!validateRequestBody(request.body)) {\n response\n .status(400)\n .json({ errors: validateRequestBody.errors, type: 'body' });\n return;\n }\n const collectionId = Number.parseInt(request.params.id, 10);\n if (Number.isNaN(collectionId)) {\n response\n .status(400)\n .send({ errors: 'Invalid collection id', type: 'body' });\n return;\n }\n\n const username = await permissionMgr.getUsername(request);\n let collection = await database.getCollection(\n username,\n Number.parseInt(request.params.id, 10),\n );\n\n const post = await database.getPost(username, request.body.postId, false);\n if (!post) {\n response.status(404).send({ errors: 'Post not found', type: 'body' });\n return;\n }\n\n await permissionMgr.authorize(\n request,\n [\n { permission: qetaEditCollectionPermission, resource: collection! },\n { permission: qetaReadPostPermission, resource: post },\n ],\n { throwOnDeny: true },\n );\n\n const [postFilters, tagFilters] = await Promise.all([\n permissionMgr.getAuthorizeConditions(request, qetaReadPostPermission, {\n allowServicePrincipal: true,\n }),\n permissionMgr.getAuthorizeConditions(request, qetaReadTagPermission, {\n allowServicePrincipal: true,\n }),\n ]);\n\n // Act\n collection = await database.removePostFromCollection(\n username,\n collectionId,\n request.body.postId,\n { postFilters, tagFilters },\n );\n\n if (!collection) {\n response\n .status(404)\n .send({ errors: 'Collection not found', type: 'body' });\n return;\n }\n\n events?.publish({\n topic: 'qeta',\n eventPayload: {\n collection,\n author: username,\n },\n metadata: { action: 'update_collection' },\n });\n\n await mapAdditionalFields(request, [collection], options, { username });\n\n auditor?.createEvent({\n eventId: 'delete-from-collection',\n severityLevel: 'low',\n request,\n meta: {\n collection: entityToJsonObject(collection),\n post: entityToJsonObject(post),\n },\n });\n\n // Response\n response.status(200);\n response.json(collection);\n });\n\n router.post('/collections/:id/rank/', async (request, response) => {\n const validateRequestBody = ajv.compile(CollectionRankPostSchema);\n if (!validateRequestBody(request.body)) {\n response\n .status(400)\n .json({ errors: validateRequestBody.errors, type: 'body' });\n return;\n }\n\n const collectionId = Number.parseInt(request.params.id, 10);\n if (Number.isNaN(collectionId)) {\n response\n .status(400)\n .send({ errors: 'Invalid collection id', type: 'body' });\n return;\n }\n\n const username = await permissionMgr.getUsername(request);\n const collection = await database.getCollection(\n username,\n Number.parseInt(request.params.id, 10),\n );\n\n if (!collection) {\n response.sendStatus(404);\n return;\n }\n\n const post = await database.getPost(username, request.body.postId, false);\n\n if (!post) {\n response.status(404).send({ errors: 'Post not found', type: 'body' });\n return;\n }\n\n await permissionMgr.authorize(\n request,\n [\n { permission: qetaEditCollectionPermission, resource: collection },\n { permission: qetaReadPostPermission, resource: post },\n ],\n { throwOnDeny: true },\n );\n\n const currentRank = await database.getPostRank(\n collection.id,\n request.body.postId,\n );\n if (!currentRank) {\n response.status(404).send();\n return;\n }\n\n if (request.body.rank === 'up') {\n const higherRankPostId = await database.getNextRankedPostId(\n collection.id,\n request.body.postId,\n );\n if (higherRankPostId) {\n await database.updatePostRank(\n collection.id,\n higherRankPostId.postId,\n currentRank,\n );\n await database.updatePostRank(\n collection.id,\n request.body.postId,\n higherRankPostId.rank,\n );\n }\n } else if (request.body.rank === 'down') {\n const lowerRankPostId = await database.getPreviousRankedPostId(\n collection.id,\n request.body.postId,\n );\n if (lowerRankPostId) {\n await database.updatePostRank(\n collection.id,\n lowerRankPostId.postId,\n currentRank,\n );\n await database.updatePostRank(\n collection.id,\n request.body.postId,\n lowerRankPostId.rank,\n );\n }\n } else if (request.body.rank === 'top') {\n const topRankPostId = await database.getTopRankedPostId(collectionId);\n if (topRankPostId) {\n await database.updatePostRank(\n collection.id,\n topRankPostId.postId,\n currentRank,\n );\n await database.updatePostRank(\n collection.id,\n request.body.postId,\n topRankPostId.rank,\n );\n }\n } else if (request.body.rank === 'bottom') {\n const bottomRankPostId = await database.getBottomRankedPostId(\n collection.id,\n );\n if (bottomRankPostId) {\n await database.updatePostRank(\n collection.id,\n bottomRankPostId.postId,\n currentRank,\n );\n await database.updatePostRank(\n collection.id,\n request.body.postId,\n bottomRankPostId.rank,\n );\n }\n }\n\n auditor?.createEvent({\n eventId: 'rank-collection',\n severityLevel: 'low',\n request,\n meta: {\n collection: entityToJsonObject(collection),\n post: entityToJsonObject(post),\n rank: request.body.rank,\n },\n });\n\n response.sendStatus(200);\n });\n};\n"],"names":["Ajv","addFormats","CollectionsQuerySchema","validateDateRange","qetaReadPostPermission","qetaReadCollectionPermission","qetaReadTagPermission","mapAdditionalFields","CollectionSchema","qetaCreateCollectionPermission","getCreated","wrapAsync","entityToJsonObject","qetaEditCollectionPermission","DeleteMetadataSchema","qetaDeleteCollectionPermission","CollectionPostSchema","CollectionRankPostSchema"],"mappings":"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"}
@@ -259,7 +259,10 @@ const CollectionSchema = {
259
259
  description: { type: "string", nullable: true },
260
260
  headerImage: { type: "string", nullable: true },
261
261
  images: { type: "array", items: { type: "integer" }, nullable: true },
262
- created: { type: "string", minLength: 1, nullable: true }
262
+ created: { type: "string", minLength: 1, nullable: true },
263
+ tags: { type: "array", items: { type: "string" }, nullable: true },
264
+ entities: { type: "array", items: { type: "string" }, nullable: true },
265
+ users: { type: "array", items: { type: "string" }, nullable: true }
263
266
  },
264
267
  required: ["title"],
265
268
  additionalProperties: false
@@ -1 +1 @@
1
- {"version":3,"file":"types.cjs.js","sources":["../../src/service/types.ts"],"sourcesContent":["import { JSONSchemaType } from 'ajv';\nimport { QetaStore } from '../database/QetaStore';\nimport {\n AuditorService,\n AuthService,\n CacheService,\n DiscoveryService,\n HttpAuthService,\n LoggerService,\n PermissionsRegistryService,\n PermissionsService,\n UserInfoService,\n} from '@backstage/backend-plugin-api';\nimport { Config } from '@backstage/config';\nimport { EventsService } from '@backstage/plugin-events-node';\nimport { SignalsService } from '@backstage/plugin-signals-node';\nimport { NotificationService } from '@backstage/plugin-notifications-node';\nimport { NotificationManager } from './NotificationManager';\nimport {\n AIQuery,\n AnswersQuery,\n CollectionsQuery,\n EntitiesQuery,\n PostQuery,\n PostsQuery,\n PostStatus,\n PostType,\n SuggestionsQuery,\n TagsQuery,\n URLMetadataQuery,\n UsersQuery,\n} from '@drodil/backstage-plugin-qeta-common';\nimport { CatalogApi } from '@backstage/catalog-client';\nimport { AIHandler } from '@drodil/backstage-plugin-qeta-node';\nimport { PermissionManager } from './PermissionManager.ts';\n\nexport interface RouterOptions {\n database: QetaStore;\n logger: LoggerService;\n config: Config;\n discovery: DiscoveryService;\n httpAuth: HttpAuthService;\n userInfo: UserInfoService;\n catalog: CatalogApi;\n auth: AuthService;\n cache?: CacheService;\n permissions?: PermissionsService;\n events?: EventsService;\n signals?: SignalsService;\n notifications?: NotificationService;\n aiHandler?: AIHandler;\n permissionsRegistry?: PermissionsRegistryService;\n auditor?: AuditorService;\n notificationMgr: NotificationManager;\n}\n\nexport interface RouteOptions extends RouterOptions {\n notificationMgr: NotificationManager;\n permissionMgr: PermissionManager;\n}\n\nexport interface PostContent {\n title: string;\n content: string;\n author?: string;\n tags?: string[];\n entities?: string[];\n images?: number[];\n user?: string;\n created?: string;\n headerImage?: string;\n url?: string;\n anonymous?: boolean;\n type: PostType;\n status?: PostStatus;\n}\n\nexport interface TemplateContent {\n title: string;\n description: string;\n questionTitle?: string;\n questionContent?: string;\n tags?: string[];\n entities?: string[];\n}\n\nexport interface CollectionContent {\n title: string;\n description?: string;\n headerImage?: string;\n images?: number[];\n created?: string;\n}\n\nexport interface CollectionPostContent {\n postId: number;\n}\n\nexport interface CollectionRankContent {\n postId: number;\n rank: 'top' | 'bottom' | 'up' | 'down';\n}\n\nexport const CollectionsQuerySchema: JSONSchemaType<CollectionsQuery> = {\n type: 'object',\n properties: {\n limit: { type: 'integer', nullable: true },\n offset: { type: 'integer', nullable: true },\n searchQuery: { type: 'string', nullable: true },\n owner: { type: 'string', nullable: true },\n orderBy: {\n type: 'string',\n enum: [\n 'created',\n 'title',\n 'postsCount',\n 'questionsCount',\n 'articlesCount',\n 'linksCount',\n 'followerCount',\n ],\n nullable: true,\n },\n order: { type: 'string', enum: ['desc', 'asc'], nullable: true },\n tags: { type: 'array', items: { type: 'string' }, nullable: true },\n entities: { type: 'array', items: { type: 'string' }, nullable: true },\n entitiesRelation: { type: 'string', enum: ['and', 'or'], nullable: true },\n includePosts: { type: 'boolean', nullable: true },\n includeExperts: { type: 'boolean', nullable: true },\n tagsRelation: { type: 'string', enum: ['and', 'or'], nullable: true },\n fromDate: { type: 'string', nullable: true, format: 'date' },\n toDate: { type: 'string', nullable: true, format: 'date' },\n ids: { type: 'array', items: { type: 'integer' }, nullable: true },\n checkAccess: { type: 'boolean', nullable: true },\n },\n required: [],\n additionalProperties: false,\n};\n\nexport const PostsQuerySchema: JSONSchemaType<PostsQuery> = {\n type: 'object',\n properties: {\n limit: { type: 'integer', nullable: true },\n offset: { type: 'integer', nullable: true },\n author: { type: 'string', nullable: true },\n excludeAuthors: {\n type: 'array',\n items: { type: 'string' },\n nullable: true,\n },\n orderBy: {\n type: 'string',\n enum: [\n 'rank',\n 'views',\n 'title',\n 'trend',\n 'score',\n 'answersCount',\n 'created',\n 'updated',\n ],\n nullable: true,\n },\n collectionId: { type: 'number', nullable: true },\n order: { type: 'string', enum: ['desc', 'asc'], nullable: true },\n noCorrectAnswer: { type: 'boolean', nullable: true },\n noAnswers: { type: 'boolean', nullable: true },\n hasAnswers: { type: 'boolean', nullable: true },\n favorite: { type: 'boolean', nullable: true },\n noVotes: { type: 'boolean', nullable: true },\n status: {\n type: 'string',\n enum: ['active', 'draft', 'deleted'],\n nullable: true,\n },\n random: { type: 'boolean', nullable: true },\n tags: { type: 'array', items: { type: 'string' }, nullable: true },\n entities: { type: 'array', items: { type: 'string' }, nullable: true },\n entitiesRelation: { type: 'string', enum: ['and', 'or'], nullable: true },\n tagsRelation: { type: 'string', enum: ['and', 'or'], nullable: true },\n includeAnswers: { type: 'boolean', nullable: true },\n includeVotes: { type: 'boolean', nullable: true },\n includeAttachments: { type: 'boolean', nullable: true },\n includeHealth: { type: 'boolean', nullable: true },\n reviewNeeded: { type: 'boolean', nullable: true },\n obsolete: { type: 'boolean', nullable: true },\n includeTags: { type: 'boolean', nullable: true },\n includeEntities: { type: 'boolean', nullable: true },\n includeTrend: { type: 'boolean', nullable: true },\n includeComments: { type: 'boolean', nullable: true },\n includeExperts: { type: 'boolean', nullable: true },\n searchQuery: { type: 'string', nullable: true },\n fromDate: { type: 'string', nullable: true, format: 'date' },\n toDate: { type: 'string', nullable: true, format: 'date' },\n type: {\n type: 'string',\n enum: ['question', 'article', 'link'],\n nullable: true,\n },\n ids: { type: 'array', items: { type: 'integer' }, nullable: true },\n checkAccess: { type: 'boolean', nullable: true },\n },\n required: [],\n additionalProperties: false,\n};\n\nexport const PostQuerySchema: JSONSchemaType<PostQuery> = {\n type: 'object',\n properties: {\n anonymous: { type: 'boolean', nullable: true },\n },\n};\n\nexport const TagsQuerySchema: JSONSchemaType<TagsQuery> = {\n type: 'object',\n properties: {\n limit: { type: 'integer', nullable: true },\n offset: { type: 'integer', nullable: true },\n orderBy: {\n type: 'string',\n enum: [\n 'tag',\n 'postsCount',\n 'questionsCount',\n 'articlesCount',\n 'linksCount',\n 'followerCount',\n ],\n nullable: true,\n },\n order: { type: 'string', enum: ['desc', 'asc'], nullable: true },\n searchQuery: { type: 'string', nullable: true },\n checkAccess: { type: 'boolean', nullable: true },\n includeExperts: { type: 'boolean', nullable: true },\n },\n required: [],\n additionalProperties: false,\n};\n\nexport const UsersQuerySchema: JSONSchemaType<UsersQuery> = {\n type: 'object',\n properties: {\n limit: { type: 'integer', nullable: true },\n offset: { type: 'integer', nullable: true },\n orderBy: {\n type: 'string',\n enum: [\n 'userRef',\n 'totalPosts',\n 'totalQuestions',\n 'totalAnswers',\n 'totalArticles',\n 'totalLinks',\n 'totalViews',\n 'totalVotes',\n 'followerCount',\n 'reputation',\n ],\n nullable: true,\n },\n order: { type: 'string', enum: ['desc', 'asc'], nullable: true },\n searchQuery: { type: 'string', nullable: true },\n },\n required: [],\n additionalProperties: false,\n};\n\nexport const EntitiesQuerySchema: JSONSchemaType<EntitiesQuery> = {\n type: 'object',\n properties: {\n limit: { type: 'integer', nullable: true },\n offset: { type: 'integer', nullable: true },\n orderBy: {\n type: 'string',\n enum: [\n 'entityRef',\n 'postsCount',\n 'questionsCount',\n 'articlesCount',\n 'linksCount',\n 'followerCount',\n ],\n nullable: true,\n },\n order: { type: 'string', enum: ['desc', 'asc'], nullable: true },\n searchQuery: { type: 'string', nullable: true },\n },\n required: [],\n additionalProperties: false,\n};\n\nexport const AnswersQuerySchema: JSONSchemaType<AnswersQuery> = {\n type: 'object',\n properties: {\n limit: { type: 'integer', nullable: true },\n offset: { type: 'integer', nullable: true },\n author: { type: 'string', nullable: true },\n orderBy: {\n type: 'string',\n enum: ['score', 'created', 'updated'],\n nullable: true,\n },\n order: { type: 'string', enum: ['desc', 'asc'], nullable: true },\n noCorrectAnswer: { type: 'boolean', nullable: true },\n noVotes: { type: 'boolean', nullable: true },\n tags: { type: 'array', items: { type: 'string' }, nullable: true },\n entities: { type: 'array', items: { type: 'string' }, nullable: true },\n entitiesRelation: { type: 'string', enum: ['and', 'or'], nullable: true },\n tagsRelation: { type: 'string', enum: ['and', 'or'], nullable: true },\n includeVotes: { type: 'boolean', nullable: true },\n includeEntities: { type: 'boolean', nullable: true },\n includeComments: { type: 'boolean', nullable: true },\n includeExperts: { type: 'boolean', nullable: true },\n searchQuery: { type: 'string', nullable: true },\n fromDate: { type: 'string', nullable: true, format: 'date' },\n toDate: { type: 'string', nullable: true, format: 'date' },\n ids: { type: 'array', items: { type: 'integer' }, nullable: true },\n questionId: { type: 'integer', nullable: true },\n checkAccess: { type: 'boolean', nullable: true },\n },\n required: [],\n additionalProperties: false,\n};\n\nexport const PostSchema: JSONSchemaType<PostContent> = {\n type: 'object',\n properties: {\n title: { type: 'string', minLength: 1 },\n content: { type: 'string', minLength: 0 },\n author: { type: 'string', nullable: true },\n tags: { type: 'array', items: { type: 'string' }, nullable: true },\n entities: { type: 'array', items: { type: 'string' }, nullable: true },\n images: { type: 'array', items: { type: 'integer' }, nullable: true },\n user: { type: 'string', minLength: 1, nullable: true },\n created: { type: 'string', minLength: 1, nullable: true },\n anonymous: { type: 'boolean', nullable: true },\n headerImage: { type: 'string', nullable: true },\n url: { type: 'string', nullable: true },\n type: { type: 'string', enum: ['question', 'article', 'link'] },\n status: {\n type: 'string',\n enum: ['active', 'draft', 'deleted'],\n nullable: true,\n },\n },\n required: ['title', 'content'],\n additionalProperties: false,\n};\n\nexport const TemplateSchema: JSONSchemaType<TemplateContent> = {\n type: 'object',\n properties: {\n title: { type: 'string', minLength: 1 },\n description: { type: 'string', minLength: 1 },\n questionTitle: { type: 'string', nullable: true },\n questionContent: { type: 'string', nullable: true },\n tags: { type: 'array', items: { type: 'string' }, nullable: true },\n entities: { type: 'array', items: { type: 'string' }, nullable: true },\n },\n required: ['title', 'description'],\n additionalProperties: false,\n};\n\nexport const CollectionSchema: JSONSchemaType<CollectionContent> = {\n type: 'object',\n properties: {\n title: { type: 'string', minLength: 1 },\n description: { type: 'string', nullable: true },\n headerImage: { type: 'string', nullable: true },\n images: { type: 'array', items: { type: 'integer' }, nullable: true },\n created: { type: 'string', minLength: 1, nullable: true },\n },\n required: ['title'],\n additionalProperties: false,\n};\n\nexport const CollectionPostSchema: JSONSchemaType<CollectionPostContent> = {\n type: 'object',\n properties: {\n postId: { type: 'integer' },\n },\n required: ['postId'],\n additionalProperties: false,\n};\n\nexport const CollectionRankPostSchema: JSONSchemaType<CollectionRankContent> = {\n type: 'object',\n properties: {\n postId: { type: 'integer' },\n rank: { type: 'string', enum: ['top', 'bottom', 'up', 'down'] },\n },\n required: ['postId', 'rank'],\n additionalProperties: false,\n};\n\nexport interface AnswerQuestion {\n answer: string;\n images?: number[];\n user?: string;\n author?: string;\n created?: string;\n anonymous?: boolean;\n}\n\nexport const PostAnswerSchema: JSONSchemaType<AnswerQuestion> = {\n type: 'object',\n properties: {\n answer: { type: 'string', minLength: 1 },\n images: { type: 'array', items: { type: 'integer' }, nullable: true },\n user: { type: 'string', minLength: 1, nullable: true },\n author: { type: 'string', minLength: 1, nullable: true },\n created: { type: 'string', minLength: 1, nullable: true },\n anonymous: { type: 'boolean', nullable: true },\n },\n required: ['answer'],\n additionalProperties: false,\n};\n\nexport interface DeleteMetadata {\n reason?: string;\n permanent?: boolean;\n}\n\nexport const DeleteMetadataSchema: JSONSchemaType<DeleteMetadata> = {\n type: 'object',\n properties: {\n reason: { type: 'string', minLength: 1, nullable: true },\n permanent: { type: 'boolean', nullable: true },\n },\n additionalProperties: false,\n};\n\nexport interface Comment {\n content: string;\n user?: string;\n created?: string;\n}\n\nexport const CommentSchema: JSONSchemaType<Comment> = {\n type: 'object',\n properties: {\n content: { type: 'string', minLength: 1 },\n user: { type: 'string', minLength: 1, nullable: true },\n created: { type: 'string', minLength: 1, nullable: true },\n },\n required: ['content'],\n additionalProperties: false,\n};\n\nexport interface DraftQuestion {\n title: string;\n content: string;\n tags?: string[];\n entities?: string[];\n}\n\nexport const DraftQuestionSchema: JSONSchemaType<DraftQuestion> = {\n type: 'object',\n properties: {\n title: { type: 'string', minLength: 1 },\n content: { type: 'string', minLength: 1 },\n tags: {\n type: 'array',\n items: { type: 'string' },\n nullable: true,\n },\n entities: {\n type: 'array',\n items: { type: 'string' },\n nullable: true,\n },\n },\n required: ['title', 'content'],\n additionalProperties: false,\n};\n\nexport const AIQuerySchema: JSONSchemaType<AIQuery> = {\n type: 'object',\n properties: {\n regenerate: { type: 'boolean', default: false, nullable: true },\n },\n required: [],\n additionalProperties: false,\n};\n\nexport const SuggestionsQuerySchema: JSONSchemaType<SuggestionsQuery> = {\n type: 'object',\n properties: {\n limit: { type: 'integer', minimum: 1, nullable: true },\n },\n required: [],\n additionalProperties: false,\n};\n\nexport interface File {\n name: string;\n path: string;\n buffer: Buffer;\n mimeType: string;\n ext: string;\n size: number;\n}\n\nexport const URLMetadataSchema: JSONSchemaType<URLMetadataQuery> = {\n type: 'object',\n properties: {\n url: { type: 'string', minLength: 7 }, // http://\n },\n required: ['url'],\n additionalProperties: false,\n};\n\nexport interface PostReviewBody {\n status: 'valid' | 'obsolete';\n comment?: string;\n}\n\nexport const PostReviewBodySchema: JSONSchemaType<PostReviewBody> = {\n type: 'object',\n properties: {\n status: { type: 'string', enum: ['valid', 'obsolete'] },\n comment: { type: 'string', nullable: true },\n },\n required: ['status'],\n additionalProperties: false,\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.cjs.js","sources":["../../src/service/types.ts"],"sourcesContent":["import { JSONSchemaType } from 'ajv';\nimport { QetaStore } from '../database/QetaStore';\nimport {\n AuditorService,\n AuthService,\n CacheService,\n DiscoveryService,\n HttpAuthService,\n LoggerService,\n PermissionsRegistryService,\n PermissionsService,\n UserInfoService,\n} from '@backstage/backend-plugin-api';\nimport { Config } from '@backstage/config';\nimport { EventsService } from '@backstage/plugin-events-node';\nimport { SignalsService } from '@backstage/plugin-signals-node';\nimport { NotificationService } from '@backstage/plugin-notifications-node';\nimport { NotificationManager } from './NotificationManager';\nimport {\n AIQuery,\n AnswersQuery,\n CollectionsQuery,\n EntitiesQuery,\n PostQuery,\n PostsQuery,\n PostStatus,\n PostType,\n SuggestionsQuery,\n TagsQuery,\n URLMetadataQuery,\n UsersQuery,\n} from '@drodil/backstage-plugin-qeta-common';\nimport { CatalogApi } from '@backstage/catalog-client';\nimport { AIHandler } from '@drodil/backstage-plugin-qeta-node';\nimport { PermissionManager } from './PermissionManager.ts';\n\nexport interface RouterOptions {\n database: QetaStore;\n logger: LoggerService;\n config: Config;\n discovery: DiscoveryService;\n httpAuth: HttpAuthService;\n userInfo: UserInfoService;\n catalog: CatalogApi;\n auth: AuthService;\n cache?: CacheService;\n permissions?: PermissionsService;\n events?: EventsService;\n signals?: SignalsService;\n notifications?: NotificationService;\n aiHandler?: AIHandler;\n permissionsRegistry?: PermissionsRegistryService;\n auditor?: AuditorService;\n notificationMgr: NotificationManager;\n}\n\nexport interface RouteOptions extends RouterOptions {\n notificationMgr: NotificationManager;\n permissionMgr: PermissionManager;\n}\n\nexport interface PostContent {\n title: string;\n content: string;\n author?: string;\n tags?: string[];\n entities?: string[];\n images?: number[];\n user?: string;\n created?: string;\n headerImage?: string;\n url?: string;\n anonymous?: boolean;\n type: PostType;\n status?: PostStatus;\n}\n\nexport interface TemplateContent {\n title: string;\n description: string;\n questionTitle?: string;\n questionContent?: string;\n tags?: string[];\n entities?: string[];\n}\n\nexport interface CollectionContent {\n title: string;\n description?: string;\n headerImage?: string;\n images?: number[];\n created?: string;\n tags?: string[];\n entities?: string[];\n users?: string[];\n}\n\nexport interface CollectionPostContent {\n postId: number;\n}\n\nexport interface CollectionRankContent {\n postId: number;\n rank: 'top' | 'bottom' | 'up' | 'down';\n}\n\nexport const CollectionsQuerySchema: JSONSchemaType<CollectionsQuery> = {\n type: 'object',\n properties: {\n limit: { type: 'integer', nullable: true },\n offset: { type: 'integer', nullable: true },\n searchQuery: { type: 'string', nullable: true },\n owner: { type: 'string', nullable: true },\n orderBy: {\n type: 'string',\n enum: [\n 'created',\n 'title',\n 'postsCount',\n 'questionsCount',\n 'articlesCount',\n 'linksCount',\n 'followerCount',\n ],\n nullable: true,\n },\n order: { type: 'string', enum: ['desc', 'asc'], nullable: true },\n tags: { type: 'array', items: { type: 'string' }, nullable: true },\n entities: { type: 'array', items: { type: 'string' }, nullable: true },\n entitiesRelation: { type: 'string', enum: ['and', 'or'], nullable: true },\n includePosts: { type: 'boolean', nullable: true },\n includeExperts: { type: 'boolean', nullable: true },\n tagsRelation: { type: 'string', enum: ['and', 'or'], nullable: true },\n fromDate: { type: 'string', nullable: true, format: 'date' },\n toDate: { type: 'string', nullable: true, format: 'date' },\n ids: { type: 'array', items: { type: 'integer' }, nullable: true },\n checkAccess: { type: 'boolean', nullable: true },\n },\n required: [],\n additionalProperties: false,\n};\n\nexport const PostsQuerySchema: JSONSchemaType<PostsQuery> = {\n type: 'object',\n properties: {\n limit: { type: 'integer', nullable: true },\n offset: { type: 'integer', nullable: true },\n author: { type: 'string', nullable: true },\n excludeAuthors: {\n type: 'array',\n items: { type: 'string' },\n nullable: true,\n },\n orderBy: {\n type: 'string',\n enum: [\n 'rank',\n 'views',\n 'title',\n 'trend',\n 'score',\n 'answersCount',\n 'created',\n 'updated',\n ],\n nullable: true,\n },\n collectionId: { type: 'number', nullable: true },\n order: { type: 'string', enum: ['desc', 'asc'], nullable: true },\n noCorrectAnswer: { type: 'boolean', nullable: true },\n noAnswers: { type: 'boolean', nullable: true },\n hasAnswers: { type: 'boolean', nullable: true },\n favorite: { type: 'boolean', nullable: true },\n noVotes: { type: 'boolean', nullable: true },\n status: {\n type: 'string',\n enum: ['active', 'draft', 'deleted'],\n nullable: true,\n },\n random: { type: 'boolean', nullable: true },\n tags: { type: 'array', items: { type: 'string' }, nullable: true },\n entities: { type: 'array', items: { type: 'string' }, nullable: true },\n entitiesRelation: { type: 'string', enum: ['and', 'or'], nullable: true },\n tagsRelation: { type: 'string', enum: ['and', 'or'], nullable: true },\n includeAnswers: { type: 'boolean', nullable: true },\n includeVotes: { type: 'boolean', nullable: true },\n includeAttachments: { type: 'boolean', nullable: true },\n includeHealth: { type: 'boolean', nullable: true },\n reviewNeeded: { type: 'boolean', nullable: true },\n obsolete: { type: 'boolean', nullable: true },\n includeTags: { type: 'boolean', nullable: true },\n includeEntities: { type: 'boolean', nullable: true },\n includeTrend: { type: 'boolean', nullable: true },\n includeComments: { type: 'boolean', nullable: true },\n includeExperts: { type: 'boolean', nullable: true },\n searchQuery: { type: 'string', nullable: true },\n fromDate: { type: 'string', nullable: true, format: 'date' },\n toDate: { type: 'string', nullable: true, format: 'date' },\n type: {\n type: 'string',\n enum: ['question', 'article', 'link'],\n nullable: true,\n },\n ids: { type: 'array', items: { type: 'integer' }, nullable: true },\n checkAccess: { type: 'boolean', nullable: true },\n },\n required: [],\n additionalProperties: false,\n};\n\nexport const PostQuerySchema: JSONSchemaType<PostQuery> = {\n type: 'object',\n properties: {\n anonymous: { type: 'boolean', nullable: true },\n },\n};\n\nexport const TagsQuerySchema: JSONSchemaType<TagsQuery> = {\n type: 'object',\n properties: {\n limit: { type: 'integer', nullable: true },\n offset: { type: 'integer', nullable: true },\n orderBy: {\n type: 'string',\n enum: [\n 'tag',\n 'postsCount',\n 'questionsCount',\n 'articlesCount',\n 'linksCount',\n 'followerCount',\n ],\n nullable: true,\n },\n order: { type: 'string', enum: ['desc', 'asc'], nullable: true },\n searchQuery: { type: 'string', nullable: true },\n checkAccess: { type: 'boolean', nullable: true },\n includeExperts: { type: 'boolean', nullable: true },\n },\n required: [],\n additionalProperties: false,\n};\n\nexport const UsersQuerySchema: JSONSchemaType<UsersQuery> = {\n type: 'object',\n properties: {\n limit: { type: 'integer', nullable: true },\n offset: { type: 'integer', nullable: true },\n orderBy: {\n type: 'string',\n enum: [\n 'userRef',\n 'totalPosts',\n 'totalQuestions',\n 'totalAnswers',\n 'totalArticles',\n 'totalLinks',\n 'totalViews',\n 'totalVotes',\n 'followerCount',\n 'reputation',\n ],\n nullable: true,\n },\n order: { type: 'string', enum: ['desc', 'asc'], nullable: true },\n searchQuery: { type: 'string', nullable: true },\n },\n required: [],\n additionalProperties: false,\n};\n\nexport const EntitiesQuerySchema: JSONSchemaType<EntitiesQuery> = {\n type: 'object',\n properties: {\n limit: { type: 'integer', nullable: true },\n offset: { type: 'integer', nullable: true },\n orderBy: {\n type: 'string',\n enum: [\n 'entityRef',\n 'postsCount',\n 'questionsCount',\n 'articlesCount',\n 'linksCount',\n 'followerCount',\n ],\n nullable: true,\n },\n order: { type: 'string', enum: ['desc', 'asc'], nullable: true },\n searchQuery: { type: 'string', nullable: true },\n },\n required: [],\n additionalProperties: false,\n};\n\nexport const AnswersQuerySchema: JSONSchemaType<AnswersQuery> = {\n type: 'object',\n properties: {\n limit: { type: 'integer', nullable: true },\n offset: { type: 'integer', nullable: true },\n author: { type: 'string', nullable: true },\n orderBy: {\n type: 'string',\n enum: ['score', 'created', 'updated'],\n nullable: true,\n },\n order: { type: 'string', enum: ['desc', 'asc'], nullable: true },\n noCorrectAnswer: { type: 'boolean', nullable: true },\n noVotes: { type: 'boolean', nullable: true },\n tags: { type: 'array', items: { type: 'string' }, nullable: true },\n entities: { type: 'array', items: { type: 'string' }, nullable: true },\n entitiesRelation: { type: 'string', enum: ['and', 'or'], nullable: true },\n tagsRelation: { type: 'string', enum: ['and', 'or'], nullable: true },\n includeVotes: { type: 'boolean', nullable: true },\n includeEntities: { type: 'boolean', nullable: true },\n includeComments: { type: 'boolean', nullable: true },\n includeExperts: { type: 'boolean', nullable: true },\n searchQuery: { type: 'string', nullable: true },\n fromDate: { type: 'string', nullable: true, format: 'date' },\n toDate: { type: 'string', nullable: true, format: 'date' },\n ids: { type: 'array', items: { type: 'integer' }, nullable: true },\n questionId: { type: 'integer', nullable: true },\n checkAccess: { type: 'boolean', nullable: true },\n },\n required: [],\n additionalProperties: false,\n};\n\nexport const PostSchema: JSONSchemaType<PostContent> = {\n type: 'object',\n properties: {\n title: { type: 'string', minLength: 1 },\n content: { type: 'string', minLength: 0 },\n author: { type: 'string', nullable: true },\n tags: { type: 'array', items: { type: 'string' }, nullable: true },\n entities: { type: 'array', items: { type: 'string' }, nullable: true },\n images: { type: 'array', items: { type: 'integer' }, nullable: true },\n user: { type: 'string', minLength: 1, nullable: true },\n created: { type: 'string', minLength: 1, nullable: true },\n anonymous: { type: 'boolean', nullable: true },\n headerImage: { type: 'string', nullable: true },\n url: { type: 'string', nullable: true },\n type: { type: 'string', enum: ['question', 'article', 'link'] },\n status: {\n type: 'string',\n enum: ['active', 'draft', 'deleted'],\n nullable: true,\n },\n },\n required: ['title', 'content'],\n additionalProperties: false,\n};\n\nexport const TemplateSchema: JSONSchemaType<TemplateContent> = {\n type: 'object',\n properties: {\n title: { type: 'string', minLength: 1 },\n description: { type: 'string', minLength: 1 },\n questionTitle: { type: 'string', nullable: true },\n questionContent: { type: 'string', nullable: true },\n tags: { type: 'array', items: { type: 'string' }, nullable: true },\n entities: { type: 'array', items: { type: 'string' }, nullable: true },\n },\n required: ['title', 'description'],\n additionalProperties: false,\n};\n\nexport const CollectionSchema: JSONSchemaType<CollectionContent> = {\n type: 'object',\n properties: {\n title: { type: 'string', minLength: 1 },\n description: { type: 'string', nullable: true },\n headerImage: { type: 'string', nullable: true },\n images: { type: 'array', items: { type: 'integer' }, nullable: true },\n created: { type: 'string', minLength: 1, nullable: true },\n tags: { type: 'array', items: { type: 'string' }, nullable: true },\n entities: { type: 'array', items: { type: 'string' }, nullable: true },\n users: { type: 'array', items: { type: 'string' }, nullable: true },\n },\n required: ['title'],\n additionalProperties: false,\n};\n\nexport const CollectionPostSchema: JSONSchemaType<CollectionPostContent> = {\n type: 'object',\n properties: {\n postId: { type: 'integer' },\n },\n required: ['postId'],\n additionalProperties: false,\n};\n\nexport const CollectionRankPostSchema: JSONSchemaType<CollectionRankContent> = {\n type: 'object',\n properties: {\n postId: { type: 'integer' },\n rank: { type: 'string', enum: ['top', 'bottom', 'up', 'down'] },\n },\n required: ['postId', 'rank'],\n additionalProperties: false,\n};\n\nexport interface AnswerQuestion {\n answer: string;\n images?: number[];\n user?: string;\n author?: string;\n created?: string;\n anonymous?: boolean;\n}\n\nexport const PostAnswerSchema: JSONSchemaType<AnswerQuestion> = {\n type: 'object',\n properties: {\n answer: { type: 'string', minLength: 1 },\n images: { type: 'array', items: { type: 'integer' }, nullable: true },\n user: { type: 'string', minLength: 1, nullable: true },\n author: { type: 'string', minLength: 1, nullable: true },\n created: { type: 'string', minLength: 1, nullable: true },\n anonymous: { type: 'boolean', nullable: true },\n },\n required: ['answer'],\n additionalProperties: false,\n};\n\nexport interface DeleteMetadata {\n reason?: string;\n permanent?: boolean;\n}\n\nexport const DeleteMetadataSchema: JSONSchemaType<DeleteMetadata> = {\n type: 'object',\n properties: {\n reason: { type: 'string', minLength: 1, nullable: true },\n permanent: { type: 'boolean', nullable: true },\n },\n additionalProperties: false,\n};\n\nexport interface Comment {\n content: string;\n user?: string;\n created?: string;\n}\n\nexport const CommentSchema: JSONSchemaType<Comment> = {\n type: 'object',\n properties: {\n content: { type: 'string', minLength: 1 },\n user: { type: 'string', minLength: 1, nullable: true },\n created: { type: 'string', minLength: 1, nullable: true },\n },\n required: ['content'],\n additionalProperties: false,\n};\n\nexport interface DraftQuestion {\n title: string;\n content: string;\n tags?: string[];\n entities?: string[];\n}\n\nexport const DraftQuestionSchema: JSONSchemaType<DraftQuestion> = {\n type: 'object',\n properties: {\n title: { type: 'string', minLength: 1 },\n content: { type: 'string', minLength: 1 },\n tags: {\n type: 'array',\n items: { type: 'string' },\n nullable: true,\n },\n entities: {\n type: 'array',\n items: { type: 'string' },\n nullable: true,\n },\n },\n required: ['title', 'content'],\n additionalProperties: false,\n};\n\nexport const AIQuerySchema: JSONSchemaType<AIQuery> = {\n type: 'object',\n properties: {\n regenerate: { type: 'boolean', default: false, nullable: true },\n },\n required: [],\n additionalProperties: false,\n};\n\nexport const SuggestionsQuerySchema: JSONSchemaType<SuggestionsQuery> = {\n type: 'object',\n properties: {\n limit: { type: 'integer', minimum: 1, nullable: true },\n },\n required: [],\n additionalProperties: false,\n};\n\nexport interface File {\n name: string;\n path: string;\n buffer: Buffer;\n mimeType: string;\n ext: string;\n size: number;\n}\n\nexport const URLMetadataSchema: JSONSchemaType<URLMetadataQuery> = {\n type: 'object',\n properties: {\n url: { type: 'string', minLength: 7 }, // http://\n },\n required: ['url'],\n additionalProperties: false,\n};\n\nexport interface PostReviewBody {\n status: 'valid' | 'obsolete';\n comment?: string;\n}\n\nexport const PostReviewBodySchema: JSONSchemaType<PostReviewBody> = {\n type: 'object',\n properties: {\n status: { type: 'string', enum: ['valid', 'obsolete'] },\n comment: { type: 'string', nullable: true },\n },\n required: ['status'],\n additionalProperties: false,\n};\n"],"names":[],"mappings":"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"}
@@ -42,15 +42,63 @@ const filterEntitiesByPermissions = async (entityRefs, routeOpts, credentials) =
42
42
  return entityRefs;
43
43
  }
44
44
  try {
45
- const { token } = await routeOpts.auth.getPluginRequestToken({
46
- onBehalfOf: credentials,
47
- targetPluginId: "catalog"
48
- });
49
- const entities = await routeOpts.catalog.getEntitiesByRefs(
50
- { entityRefs },
51
- { token }
52
- );
53
- return entities.items.filter((entity) => entity !== void 0).map(catalogModel.stringifyEntityRef);
45
+ let userKey = void 0;
46
+ if (routeOpts.auth.isPrincipal(credentials, "user")) {
47
+ userKey = credentials.principal.userEntityRef;
48
+ } else if (routeOpts.auth.isPrincipal(credentials, "service")) {
49
+ userKey = credentials.principal.subject;
50
+ } else {
51
+ routeOpts.logger.warn(
52
+ `Could not determine principal for permission check. Credentials: ${JSON.stringify(
53
+ credentials
54
+ )}`
55
+ );
56
+ return [];
57
+ }
58
+ const cacheKey = `qeta:entity-permissions:${userKey}`;
59
+ const cache = routeOpts.cache;
60
+ let cachedPermissions = {};
61
+ if (cache) {
62
+ const cached = await cache.get(cacheKey);
63
+ if (cached) {
64
+ cachedPermissions = cached;
65
+ }
66
+ }
67
+ const refsToCheck = [];
68
+ const allowedRefs = [];
69
+ for (const ref of entityRefs) {
70
+ if (ref in cachedPermissions) {
71
+ if (cachedPermissions[ref]) {
72
+ allowedRefs.push(ref);
73
+ }
74
+ } else {
75
+ refsToCheck.push(ref);
76
+ }
77
+ }
78
+ if (refsToCheck.length > 0) {
79
+ const { token } = await routeOpts.auth.getPluginRequestToken({
80
+ onBehalfOf: credentials,
81
+ targetPluginId: "catalog"
82
+ });
83
+ const entities = await routeOpts.catalog.getEntitiesByRefs(
84
+ { entityRefs: refsToCheck },
85
+ { token }
86
+ );
87
+ const fetchedRefs = new Set(
88
+ entities.items.filter((entity) => entity !== void 0).map(catalogModel.stringifyEntityRef)
89
+ );
90
+ refsToCheck.forEach((ref) => {
91
+ const isAllowed = fetchedRefs.has(ref);
92
+ cachedPermissions[ref] = isAllowed;
93
+ if (isAllowed) {
94
+ allowedRefs.push(ref);
95
+ }
96
+ });
97
+ if (cache) {
98
+ await cache.set(cacheKey, cachedPermissions, { ttl: 3e5 });
99
+ }
100
+ }
101
+ return allowedRefs;
54
102
  } catch (error) {
55
103
  routeOpts.logger.warn("Error filtering entities by permissions", error);
56
104
  return [];
@@ -109,15 +157,23 @@ const mapCollectionAdditionalFields = async (request, resource, permissionMgr, c
109
157
  resource.canDelete = canDelete;
110
158
  resource.entities = filteredEntities;
111
159
  if (resource.posts && routeOpts) {
112
- await Promise.all(
113
- resource.posts.map(async (post) => {
114
- post.entities = await filterEntitiesByPermissions(
115
- post.entities,
116
- routeOpts,
117
- credentials
118
- );
119
- })
120
- );
160
+ const allEntityRefs = /* @__PURE__ */ new Set();
161
+ resource.posts.forEach((post) => {
162
+ post.entities?.forEach((ref) => allEntityRefs.add(ref));
163
+ });
164
+ if (allEntityRefs.size > 0) {
165
+ const allowedRefs = await filterEntitiesByPermissions(
166
+ Array.from(allEntityRefs),
167
+ routeOpts,
168
+ credentials
169
+ );
170
+ if (allowedRefs) {
171
+ const allowedSet = new Set(allowedRefs);
172
+ resource.posts.forEach((post) => {
173
+ post.entities = post.entities?.filter((ref) => allowedSet.has(ref));
174
+ });
175
+ }
176
+ }
121
177
  }
122
178
  return resource;
123
179
  };