Skip to content

Commit

Permalink
fix: make sure to have answers filters in post queries
Browse files Browse the repository at this point in the history
  • Loading branch information
drodil committed Feb 17, 2025
1 parent 729a9aa commit 2a542d7
Show file tree
Hide file tree
Showing 3 changed files with 72 additions and 59 deletions.
10 changes: 9 additions & 1 deletion plugins/qeta-backend/src/database/DatabaseQetaStore.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2422,6 +2422,7 @@ export class DatabaseQetaStore implements QetaStore {
? this.getPostAnswers(val.id, user_ref, {
...options,
includePost: false,
filter: options?.answersFilter,
})
: undefined,
includeVotes ? this.getPostVotes(val.id) : undefined,
Expand Down Expand Up @@ -2612,10 +2613,17 @@ export class DatabaseQetaStore implements QetaStore {
user_ref: string,
options?: AnswerOptions,
): Promise<Answer[]> {
const rows = await this.getAnswerBaseQuery()
const query = this.getAnswerBaseQuery()
.where('postId', '=', postId)
.orderBy('answers.correct', 'desc')
.orderBy('answers.created');

if (options?.filter) {
parseFilter(options.filter, query, this.db, 'answer');
}

const rows = await query.select();

return await Promise.all(
rows.map(async val => {
return this.mapAnswer(val, user_ref, options);
Expand Down
2 changes: 2 additions & 0 deletions plugins/qeta-backend/src/database/QetaStore.ts
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,7 @@ export interface CollectionPostRank {
export type PostOptions = {
tagsFilter?: PermissionCriteria<QetaFilters>;
commentsFilter?: PermissionCriteria<QetaFilters>;
answersFilter?: PermissionCriteria<QetaFilters>;
includeTags?: boolean;
includeAnswers?: boolean;
includeVotes?: boolean;
Expand All @@ -142,6 +143,7 @@ export type CollectionOptions = {
};

export type AnswerOptions = {
filter?: PermissionCriteria<QetaFilters>;
includeVotes?: boolean;
includeComments?: boolean;
includePost?: boolean;
Expand Down
119 changes: 61 additions & 58 deletions plugins/qeta-backend/src/service/routes/posts.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import {
qetaDeleteCommentPermission,
qetaDeletePostPermission,
qetaEditPostPermission,
qetaReadAnswerPermission,
qetaReadCommentPermission,
qetaReadPostPermission,
qetaReadTagPermission,
Expand All @@ -29,12 +30,39 @@ import {
import { Response } from 'express-serve-static-core';
import { signalPostStats, validateDateRange, wrapAsync } from './util';
import { getEntities, getTags } from './routeUtil';
import { PostOptions } from '../../database/QetaStore';

const ajv = new Ajv({ coerceTypes: 'array' });
addFormats(ajv);

export const postsRoutes = (router: Router, options: RouteOptions) => {
const { database, events, config, signals, notificationMgr } = options;

const getPostFilters = async (request: Request, opts: PostOptions) => {
return await Promise.all([
getAuthorizeConditions(request, qetaReadPostPermission, options, true),
opts.includeTags
? getAuthorizeConditions(request, qetaReadTagPermission, options, true)
: undefined,
opts.includeComments
? getAuthorizeConditions(
request,
qetaReadCommentPermission,
options,
true,
)
: undefined,
opts.includeAnswers
? getAuthorizeConditions(
request,
qetaReadAnswerPermission,
options,
true,
)
: undefined,
]);
};

// GET /posts
router.get(`/posts`, async (request, response) => {
// Validation
Expand All @@ -58,25 +86,14 @@ export const postsRoutes = (router: Router, options: RouteOptions) => {

const opts = request.query;

const [filter, tagsFilter, commentsFilter] = await Promise.all([
getAuthorizeConditions(request, qetaReadPostPermission, options, true),
opts.includeTags
? getAuthorizeConditions(request, qetaReadTagPermission, options, true)
: undefined,
opts.includeComments
? getAuthorizeConditions(
request,
qetaReadCommentPermission,
options,
true,
)
: undefined,
]);
const [filter, tagsFilter, commentsFilter, answersFilter] =
await getPostFilters(request, opts);

// Act
const posts = await database.getPosts(username, opts, filter, {
tagsFilter,
commentsFilter,
answersFilter,
includeAnswers: false,
includeComments: false,
includeAttachments: false,
Expand Down Expand Up @@ -109,25 +126,14 @@ export const postsRoutes = (router: Router, options: RouteOptions) => {

const opts = request.body;

const [filter, tagsFilter, commentsFilter] = await Promise.all([
getAuthorizeConditions(request, qetaReadPostPermission, options, true),
opts.includeTags
? getAuthorizeConditions(request, qetaReadTagPermission, options, true)
: undefined,
opts.includeComments
? getAuthorizeConditions(
request,
qetaReadCommentPermission,
options,
true,
)
: undefined,
]);
const [filter, tagsFilter, commentsFilter, answersFilter] =
await getPostFilters(request, opts);

// Act
const posts = await database.getPosts(username, opts, filter, {
tagsFilter,
commentsFilter,
answersFilter,
includeAnswers: false,
includeComments: false,
includeAttachments: false,
Expand Down Expand Up @@ -168,11 +174,8 @@ export const postsRoutes = (router: Router, options: RouteOptions) => {
}
const opts = { ...request.query, ...optionOverride };

const conditions = await Promise.all([
getAuthorizeConditions(request, qetaReadPostPermission, options, true),
]);

const filter = conditions[0];
const [filter, tagsFilter, commentsFilter, answersFilter] =
await getPostFilters(request, opts);

// Act
const posts = await database.getPosts(username, opts, filter, {
Expand All @@ -183,6 +186,9 @@ export const postsRoutes = (router: Router, options: RouteOptions) => {
includeTags: false,
includeVotes: false,
includeComments: false,
commentsFilter,
tagsFilter,
answersFilter,
});

await Promise.all(
Expand All @@ -204,19 +210,17 @@ export const postsRoutes = (router: Router, options: RouteOptions) => {
return;
}

const conditions = await Promise.all([
const [tagsFilter, commentsFilter, answersFilter] = await Promise.all([
getAuthorizeConditions(request, qetaReadTagPermission, options, true),
getAuthorizeConditions(request, qetaReadCommentPermission, options, true),
getAuthorizeConditions(request, qetaReadAnswerPermission, options, true),
]);

const tagsFilter = conditions[0];
const commentsFilter = conditions[1];

const post = await database.getPost(
username,
Number.parseInt(request.params.id, 10),
true,
{ tagsFilter, commentsFilter },
{ tagsFilter, commentsFilter, answersFilter },
);

if (post === null) {
Expand Down Expand Up @@ -262,20 +266,18 @@ export const postsRoutes = (router: Router, options: RouteOptions) => {
await authorize(request, qetaReadPostPermission, options, question);
await authorize(request, qetaCreateCommentPermission, options);

const conditions = await Promise.all([
getAuthorizeConditions(request, qetaReadTagPermission, options),
getAuthorizeConditions(request, qetaReadCommentPermission, options),
const [tagsFilter, commentsFilter, answersFilter] = await Promise.all([
getAuthorizeConditions(request, qetaReadTagPermission, options, true),
getAuthorizeConditions(request, qetaReadCommentPermission, options, true),
getAuthorizeConditions(request, qetaReadAnswerPermission, options, true),
]);

const tagsFilter = conditions[0];
const commentsFilter = conditions[1];

question = await database.commentPost(
questionId,
username,
request.body.content,
created,
{ tagsFilter, commentsFilter },
{ tagsFilter, commentsFilter, answersFilter },
);

if (question === null) {
Expand Down Expand Up @@ -346,17 +348,16 @@ export const postsRoutes = (router: Router, options: RouteOptions) => {

await authorize(request, qetaDeleteCommentPermission, options, comment);

const conditions = await Promise.all([
getAuthorizeConditions(request, qetaReadTagPermission, options),
getAuthorizeConditions(request, qetaReadCommentPermission, options),
const [tagsFilter, commentsFilter, answersFilter] = await Promise.all([
getAuthorizeConditions(request, qetaReadTagPermission, options, true),
getAuthorizeConditions(request, qetaReadCommentPermission, options, true),
getAuthorizeConditions(request, qetaReadAnswerPermission, options, true),
]);

const tagsFilter = conditions[0];
const commentsFilter = conditions[1];

const post = await database.deletePostComment(postId, commentId, username, {
tagsFilter,
commentsFilter,
answersFilter,
});

if (post === null) {
Expand Down Expand Up @@ -477,12 +478,14 @@ export const postsRoutes = (router: Router, options: RouteOptions) => {
await authorize(request, qetaEditPostPermission, options, post);

const existingTags = await database.getTags();
const [tags, entities, tagsFilter, commentsFilter] = await Promise.all([
getTags(request, options, existingTags),
getEntities(request, config),
getAuthorizeConditions(request, qetaReadTagPermission, options),
getAuthorizeConditions(request, qetaReadCommentPermission, options),
]);
const [tags, entities, tagsFilter, commentsFilter, answersFilter] =
await Promise.all([
getTags(request, options, existingTags),
getEntities(request, config),
getAuthorizeConditions(request, qetaReadTagPermission, options),
getAuthorizeConditions(request, qetaReadCommentPermission, options),
getAuthorizeConditions(request, qetaReadAnswerPermission, options),
]);

// Act
post = await database.updatePost({
Expand All @@ -494,7 +497,7 @@ export const postsRoutes = (router: Router, options: RouteOptions) => {
entities,
images: request.body.images,
headerImage: request.body.headerImage,
opts: { tagsFilter, commentsFilter },
opts: { tagsFilter, commentsFilter, answersFilter },
});

if (!post) {
Expand Down

0 comments on commit 2a542d7

Please sign in to comment.