From 9dc7d08b3de5a4b0b0fe34733bcdb5bec3c6aa2b Mon Sep 17 00:00:00 2001 From: einhorn_b Date: Thu, 23 Nov 2023 14:45:46 +0100 Subject: [PATCH] construct database query --- .../src/data/ContributionMessage.builder.ts | 4 +- .../resolver/util/findContributions.ts | 47 ++++++++++--------- .../ContributionMessage.ts | 4 ++ 3 files changed, 29 insertions(+), 26 deletions(-) diff --git a/backend/src/data/ContributionMessage.builder.ts b/backend/src/data/ContributionMessage.builder.ts index 6d07bb81e..0f5ade7ff 100644 --- a/backend/src/data/ContributionMessage.builder.ts +++ b/backend/src/data/ContributionMessage.builder.ts @@ -43,9 +43,7 @@ export class ContributionMessageBuilder { public setParentContribution(contribution: Contribution): this { this.contributionMessage.contributionId = contribution.id - this.contributionMessage.createdAt = contribution.updatedAt - ? contribution.updatedAt - : contribution.createdAt + this.contributionMessage.contribution = contribution return this } diff --git a/backend/src/graphql/resolver/util/findContributions.ts b/backend/src/graphql/resolver/util/findContributions.ts index 5566a9853..2853b7b96 100644 --- a/backend/src/graphql/resolver/util/findContributions.ts +++ b/backend/src/graphql/resolver/util/findContributions.ts @@ -1,5 +1,5 @@ /* eslint-disable security/detect-object-injection */ -import { Brackets, In, Like, MoreThan, Not, SelectQueryBuilder } from '@dbTools/typeorm' +import { Brackets, In, IsNull, LessThanOrEqual, Like, MoreThan, Not, SelectQueryBuilder } from '@dbTools/typeorm' import { Contribution, Contribution as DbContribution } from '@entity/Contribution' import { ContributionMessage } from '@entity/ContributionMessage' @@ -47,29 +47,30 @@ export const findContributions = async ( ...(filter.userId && { userId: filter.userId }), ...(filter.noHashtag && { memo: Not(Like(`%#%`)) }), }) - if (relations?.messages && filter.hideResubmission) { - queryBuilder.andWhere((qb: SelectQueryBuilder) => { - const newestContributionMessageResubmissionDateSubQuery = qb - .subQuery() - // .select(['contributionMessage.resubmission_at', 'MAX(contributionMessage.created_at)']) - .select('contributionMessage.resubmission_at') - .from(ContributionMessage, 'contributionMessage') - .where('contributionMessage.contribution_id = Contribution.id') - .orderBy('contributionMessage.resubmissionAt', 'DESC') - .limit(1) - // .andWhere({ resubmissionAt: MoreThan(currentDate) }) - .getQuery() - return ( - 'NOT EXISTS ' + - newestContributionMessageResubmissionDateSubQuery + - ' OR ' + - newestContributionMessageResubmissionDateSubQuery + - ' IS NULL ' + - ' OR ' + - newestContributionMessageResubmissionDateSubQuery + - ' <= NOW()' + if (filter.hideResubmission) { + queryBuilder + .leftJoinAndSelect( + (qb: SelectQueryBuilder) => { + return qb + .select('resubmission_at', 'resubmissionAt') + .addSelect('id', 'latestMessageId') + .addSelect('contribution_id', 'latestMessageContributionId') + .addSelect( + 'ROW_NUMBER() OVER (PARTITION BY latestMessageContributionId ORDER BY created_at DESC)', + 'rn', + ) + .from(ContributionMessage, 'contributionMessage') + }, + 'latestContributionMessage', + 'latestContributionMessage.latestMessageContributionId = Contribution.id AND latestContributionMessage.rn = 1', + ) + .andWhere( + new Brackets((qb) => { + qb.where('latestContributionMessage.resubmissionAt IS NULL').orWhere( + 'latestContributionMessage.resubmissionAt <= NOW()', + ) + }), ) - }) } queryBuilder.printSql() if (filter.query) { diff --git a/database/entity/0077-add_resubmission_date_contribution_message/ContributionMessage.ts b/database/entity/0077-add_resubmission_date_contribution_message/ContributionMessage.ts index 2ea886dd5..8dd7af06a 100644 --- a/database/entity/0077-add_resubmission_date_contribution_message/ContributionMessage.ts +++ b/database/entity/0077-add_resubmission_date_contribution_message/ContributionMessage.ts @@ -1,12 +1,14 @@ import { BaseEntity, Column, + CreateDateColumn, DeleteDateColumn, Entity, Index, JoinColumn, ManyToOne, PrimaryGeneratedColumn, + UpdateDateColumn, } from 'typeorm' import { Contribution } from '../Contribution' import { User } from '../User' @@ -36,9 +38,11 @@ export class ContributionMessage extends BaseEntity { @Column({ length: 2000, nullable: false, collation: 'utf8mb4_unicode_ci' }) message: string + @CreateDateColumn() @Column({ type: 'datetime', default: () => 'CURRENT_TIMESTAMP', name: 'created_at' }) createdAt: Date + @UpdateDateColumn() @Column({ type: 'datetime', default: null, nullable: true, name: 'updated_at' }) updatedAt: Date