From a35e6c0147ea915ca81caa2f54e84e504ddaf3f3 Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Wed, 20 Sep 2023 10:07:38 +0800 Subject: [PATCH] fix sort by read time bug --- packages/api/src/repository/index.ts | 8 +++++++- packages/api/src/resolvers/article/index.ts | 7 ++++++- packages/api/src/resolvers/subscriptions/index.ts | 2 +- packages/api/src/services/library_item.ts | 13 +++++++++---- 4 files changed, 23 insertions(+), 7 deletions(-) diff --git a/packages/api/src/repository/index.ts b/packages/api/src/repository/index.ts index 0a01c242a..fd2d9ed5a 100644 --- a/packages/api/src/repository/index.ts +++ b/packages/api/src/repository/index.ts @@ -1,8 +1,14 @@ import * as httpContext from 'express-http-context2' -import { EntityManager, EntityTarget } from 'typeorm' +import { EntityManager, EntityTarget, Repository } from 'typeorm' import { appDataSource } from '../data_source' import { Claims } from '../resolvers/types' +export const getColumns = (repository: Repository): (keyof T)[] => { + return repository.metadata.columns.map( + (col) => col.propertyName + ) as (keyof T)[] +} + export const setClaims = async ( manager: EntityManager, uid = '00000000-0000-0000-0000-000000000000', diff --git a/packages/api/src/resolvers/article/index.ts b/packages/api/src/resolvers/article/index.ts index 4e6c82d49..995f3b584 100644 --- a/packages/api/src/resolvers/article/index.ts +++ b/packages/api/src/resolvers/article/index.ts @@ -49,6 +49,7 @@ import { UpdatesSinceError, UpdatesSinceSuccess, } from '../../generated/graphql' +import { getColumns } from '../../repository' import { getInternalLabelWithColor } from '../../repository/label' import { libraryItemRepository } from '../../repository/library_item' import { userRepository } from '../../repository/user' @@ -374,13 +375,17 @@ export const getArticleResolver = authorized< QueryArticleArgs >(async (_obj, { slug, format }, { authTrx, uid, log }, info) => { try { + const selectColumns = getColumns(libraryItemRepository) const includeOriginalHtml = format === ArticleFormat.Distiller || !!graphqlFields(info).article.originalHtml - + if (!includeOriginalHtml) { + selectColumns.splice(selectColumns.indexOf('originalContent'), 1) + } // We allow the backend to use the ID instead of a slug to fetch the article const libraryItem = await authTrx((tx) => tx.withRepository(libraryItemRepository).findOne({ + select: selectColumns, where: { slug }, relations: { labels: true, diff --git a/packages/api/src/resolvers/subscriptions/index.ts b/packages/api/src/resolvers/subscriptions/index.ts index f06374f9b..db249b9b9 100644 --- a/packages/api/src/resolvers/subscriptions/index.ts +++ b/packages/api/src/resolvers/subscriptions/index.ts @@ -89,7 +89,7 @@ export const subscriptionsResolver = authorized< } const subscriptions = await queryBuilder - .orderBy('subscription.' + sortBy, sortOrder) + .orderBy(`subscription.${sortBy}`, sortOrder, 'NULLS LAST') .getMany() return { diff --git a/packages/api/src/services/library_item.ts b/packages/api/src/services/library_item.ts index 40c0a4cdc..d3346ea99 100644 --- a/packages/api/src/services/library_item.ts +++ b/packages/api/src/services/library_item.ts @@ -97,8 +97,8 @@ const buildWhereClause = ( } if (args.typeFilter) { - queryBuilder.andWhere('library_item.item_type = :typeFilter', { - typeFilter: args.typeFilter, + queryBuilder.andWhere('lower(library_item.item_type) = :typeFilter', { + typeFilter: args.typeFilter.toLowerCase(), }) } @@ -108,7 +108,12 @@ const buildWhereClause = ( queryBuilder.andWhere('library_item.archived_at IS NULL') break case InFilter.ARCHIVE: - queryBuilder.andWhere('library_item.archived_at IS NOT NULL') + queryBuilder.andWhere( + 'library_item.archived_at IS NOT NULL OR library_item.state = :state', + { + state: LibraryItemState.Archived, + } + ) break case InFilter.TRASH: // return only deleted pages within 14 days @@ -287,7 +292,7 @@ export const searchLibraryItems = async ( buildWhereClause(queryBuilder, args) const libraryItems = await queryBuilder - .addOrderBy(`library_item.${sortField}`, sortOrder) + .addOrderBy(`library_item.${sortField}`, sortOrder, 'NULLS LAST') .skip(from) .take(size) .getMany()