From 5a9dc344d3a207bfca219ac12fdd658de80d3c26 Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Thu, 14 Sep 2023 12:22:27 +0900 Subject: [PATCH] fix rebase conflicts --- packages/api/src/resolvers/filters/index.ts | 49 +++++++------------ packages/api/src/resolvers/highlight/index.ts | 10 ++-- .../api/src/resolvers/subscriptions/index.ts | 37 ++++++-------- .../src/resolvers/user_feed_article/index.ts | 13 +---- .../src/services/create_page_save_request.ts | 1 - packages/api/test/db.ts | 18 ++++--- .../api/test/resolvers/subscriptions.test.ts | 26 +++++----- .../api/test/services/create_user.test.ts | 21 ++++---- yarn.lock | 19 ------- 9 files changed, 73 insertions(+), 121 deletions(-) diff --git a/packages/api/src/resolvers/filters/index.ts b/packages/api/src/resolvers/filters/index.ts index f98ceff58..027b72bd1 100644 --- a/packages/api/src/resolvers/filters/index.ts +++ b/packages/api/src/resolvers/filters/index.ts @@ -1,3 +1,4 @@ +import { isNil, mergeWith } from 'lodash' import { Between } from 'typeorm' import { Filter } from '../../entity/filter' import { env } from '../../env' @@ -19,22 +20,21 @@ import { SaveFilterErrorCode, SaveFilterSuccess, UpdateFilterError, - UpdateFilterSuccess, UpdateFilterErrorCode, + UpdateFilterSuccess, } from '../../generated/graphql' +import { entityManager } from '../../repository' import { analytics } from '../../utils/analytics' -import { env } from '../../env' -import { isNil, mergeWith } from 'lodash' import { authorized } from '../../utils/helpers' export const saveFilterResolver = authorized< SaveFilterSuccess, SaveFilterError, MutationSaveFilterArgs ->(async (_, { input }, { authTrx, log }) => { +>(async (_, { input }, { authTrx, log, uid }) => { try { const filter = await authTrx(async (t) => { - return t.withRepository(filterRepository).save({ + return t.getRepository(Filter).save({ user: { id: uid }, name: input.name, category: 'Search', @@ -118,9 +118,7 @@ const updatePosition = async ( const moveUp = newPosition < position // move filter to the new position - const updated = await AppDataSource.transaction(async (t) => { - await setClaims(t, uid) - + const updated = await entityManager.transaction(async (t) => { // update the position of the other filters const updated = await t.getRepository(Filter).update( { @@ -157,44 +155,31 @@ export const updateFilterResolver = authorized< UpdateFilterSuccess, UpdateFilterError, MutationUpdateFilterArgs ->(async (_, { input }, { claims: { uid }, log }) => { - const repo = getRepository(Filter) +>(async (_, { input }, { authTrx, log, uid }) => { const { id } = input try { - const user = await getRepository(User).findOneBy({ id: uid }) - if (!user) { - return { - errorCodes: [UpdateFilterErrorCode.Unauthorized], - } - } - - const filter = await getRepository(Filter).findOne({ - where: { id, user: { id: uid } }, - relations: ['user'], - }) + const filter = await authTrx((t) => + t.getRepository(Filter).findOneBy({ id }) + ) if (!filter) { return { __typename: 'UpdateFilterError', errorCodes: [UpdateFilterErrorCode.NotFound], } } - if (filter.user.id !== uid) { - return { - __typename: 'UpdateFilterError', - errorCodes: [UpdateFilterErrorCode.Unauthorized], - } - } if (!isNil(input.position) && filter.position != input.position) { await updatePosition(uid, filter, input.position) } - const updated = await repo.save({ - ...mergeWith({}, filter, input, (a: unknown, b: unknown) => - isNil(b) ? a : undefined - ), - }) + const updated = await authTrx((t) => + t.getRepository(Filter).save({ + ...mergeWith({}, filter, input, (a: unknown, b: unknown) => + isNil(b) ? a : undefined + ), + }) + ) return { __typename: 'UpdateFilterSuccess', diff --git a/packages/api/src/resolvers/highlight/index.ts b/packages/api/src/resolvers/highlight/index.ts index a0919fdc8..e259613b2 100644 --- a/packages/api/src/resolvers/highlight/index.ts +++ b/packages/api/src/resolvers/highlight/index.ts @@ -122,13 +122,13 @@ export const mergeHighlightResolver = authorized< } }) } - // collect colors of overlap highlights - highlight.color && mergedColors.push(highlight.color) - + // collect colors of overlap highlights + highlight.color && mergedColors.push(highlight.color) } }) - // use new color or the color of the last overlap highlight - const color = newHighlightInput.color || mergedColors[mergedColors.length - 1] + // use new color or the color of the last overlap highlight + const color = + newHighlightInput.color || mergedColors[mergedColors.length - 1] const highlight: DeepPartial = { ...newHighlightInput, diff --git a/packages/api/src/resolvers/subscriptions/index.ts b/packages/api/src/resolvers/subscriptions/index.ts index e6a8800f0..504f8bd5b 100644 --- a/packages/api/src/resolvers/subscriptions/index.ts +++ b/packages/api/src/resolvers/subscriptions/index.ts @@ -52,25 +52,20 @@ export const subscriptionsResolver = authorized< SubscriptionsSuccessPartial, SubscriptionsError, QuerySubscriptionsArgs ->( - async ( - _obj, - { sort, type = SubscriptionType.Newsletter }, // default to newsletter - { authTrx, uid, log } - ) => { - try { - const sortBy = - sort?.by === SortBy.UpdatedTime ? 'lastFetchedAt' : 'createdAt' - const sortOrder = sort?.order === SortOrder.Ascending ? 'ASC' : 'DESC' +>(async (_obj, { sort, type }, { authTrx, uid, log }) => { + try { + const sortBy = + sort?.by === SortBy.UpdatedTime ? 'lastFetchedAt' : 'createdAt' + const sortOrder = sort?.order === SortOrder.Ascending ? 'ASC' : 'DESC' - const subscriptions = await authTrx(async (t) => { - const queryBuilder = t - .getRepository(Subscription) - .createQueryBuilder('subscription') - .leftJoinAndSelect('subscription.newsletterEmail', 'newsletterEmail') - .where({ - user: { id: uid }, - }) + const subscriptions = await authTrx(async (t) => { + const queryBuilder = t + .getRepository(Subscription) + .createQueryBuilder('subscription') + .leftJoinAndSelect('subscription.newsletterEmail', 'newsletterEmail') + .where({ + user: { id: uid }, + }) if (type && type == SubscriptionType.Newsletter) { queryBuilder.andWhere({ @@ -94,10 +89,8 @@ export const subscriptionsResolver = authorized< ) } - return queryBuilder - .orderBy('subscription.' + sortBy, sortOrder) - .getMany() - }) + return queryBuilder.orderBy('subscription.' + sortBy, sortOrder).getMany() + }) return { subscriptions, diff --git a/packages/api/src/resolvers/user_feed_article/index.ts b/packages/api/src/resolvers/user_feed_article/index.ts index 724896678..928078f9d 100644 --- a/packages/api/src/resolvers/user_feed_article/index.ts +++ b/packages/api/src/resolvers/user_feed_article/index.ts @@ -1,12 +1,6 @@ /* eslint-disable @typescript-eslint/require-await */ /* eslint-disable @typescript-eslint/no-unused-vars */ -import { PartialArticle } from '..' -import { - FeedArticle, - PageInfo, - SharedArticleSuccess, -} from '../../generated/graphql' -import { Merge } from '../../util' +import { FeedArticle, PageInfo } from '../../generated/graphql' export type PartialFeedArticle = Omit< FeedArticle, @@ -18,11 +12,6 @@ type PaginatedFeedArticlesSuccessPartial = { pageInfo: PageInfo } -export type SharedArticleSuccessPartial = Merge< - SharedArticleSuccess, - { article: PartialArticle } -> - // export const getSharedArticleResolver: ResolverFn< // SharedArticleSuccessPartial | SharedArticleError, // Record, diff --git a/packages/api/src/services/create_page_save_request.ts b/packages/api/src/services/create_page_save_request.ts index 7fcf08696..0a8ebbf8c 100644 --- a/packages/api/src/services/create_page_save_request.ts +++ b/packages/api/src/services/create_page_save_request.ts @@ -1,5 +1,4 @@ import * as privateIpLib from 'private-ip' -import { v4 as uuidv4 } from 'uuid' import { LibraryItemState, LibraryItemType } from '../entity/library_item' import { ArticleSavingRequest, diff --git a/packages/api/test/db.ts b/packages/api/test/db.ts index 06f65f75b..419563bc9 100644 --- a/packages/api/test/db.ts +++ b/packages/api/test/db.ts @@ -2,15 +2,15 @@ import Postgrator from 'postgrator' import { DeepPartial } from 'typeorm' import { SnakeNamingStrategy } from 'typeorm-naming-strategies' import { appDataSource } from '../src/data_source' +import { Filter } from '../src/entity/filter' import { Label } from '../src/entity/label' import { LibraryItem } from '../src/entity/library_item' import { Reminder } from '../src/entity/reminder' import { User } from '../src/entity/user' import { UserDeviceToken } from '../src/entity/user_device_tokens' -import { getRepository } from '../src/repository' +import { entityManager, getRepository, setClaims } from '../src/repository' import { userRepository } from '../src/repository/user' import { createUser } from '../src/services/create_user' -import { Filter } from "../src/entity/filter" import { saveLabelsInLibraryItem } from '../src/services/labels' import { createLibraryItem } from '../src/services/library_item' import { createDeviceToken } from '../src/services/user_device_tokens' @@ -64,15 +64,17 @@ export const createTestConnection = async (): Promise => { } export const deleteFiltersFromUser = async (userId: string) => { - await AppDataSource.transaction(async (t) => { + await entityManager.transaction(async (t) => { await setClaims(t, userId) - const filterRepo = t.getRepository(Filter); + const filterRepo = t.getRepository(Filter) - const userFilters = await filterRepo.findBy({ user: { id: userId }}) + const userFilters = await filterRepo.findBy({ user: { id: userId } }) - await Promise.all(userFilters.map(filter => { - return filterRepo.delete(filter.id) - })); + await Promise.all( + userFilters.map((filter) => { + return filterRepo.delete(filter.id) + }) + ) }) } diff --git a/packages/api/test/resolvers/subscriptions.test.ts b/packages/api/test/resolvers/subscriptions.test.ts index 6224718de..07393fbdb 100644 --- a/packages/api/test/resolvers/subscriptions.test.ts +++ b/packages/api/test/resolvers/subscriptions.test.ts @@ -128,8 +128,8 @@ describe('Subscriptions API', () => { }) it('should not return inactive newsletters but should return inactive RSS', async () => { - const sub5 = await createTestSubscription( - user, + const sub5 = await createSubscription( + user.id, 'sub_5', undefined, SubscriptionStatus.Unsubscribed, @@ -138,8 +138,8 @@ describe('Subscriptions API', () => { ) try { - await createTestSubscription( - user, + await createSubscription( + user.id, 'sub_6', undefined, SubscriptionStatus.Unsubscribed, @@ -164,8 +164,8 @@ describe('Subscriptions API', () => { // create test user and login const user2 = await createTestUser('fakeUser2') try { - await createTestSubscription( - user2, + await createSubscription( + user2.id, 'sub_other', undefined, SubscriptionStatus.Unsubscribed, @@ -180,7 +180,7 @@ describe('Subscriptions API', () => { })) ) } finally { - deleteTestUser(user2.id) + deleteUser(user2.id) } }) @@ -202,8 +202,8 @@ describe('Subscriptions API', () => { ` const user3 = await createTestUser('fakeUser3') try { - await createTestSubscription( - user3, + await createSubscription( + user3.id, 'sub_other', undefined, SubscriptionStatus.Unsubscribed, @@ -221,7 +221,7 @@ describe('Subscriptions API', () => { })) ) } finally { - deleteTestUser(user3.id) + deleteUser(user3.id) } }) @@ -243,8 +243,8 @@ describe('Subscriptions API', () => { ` const user2 = await createTestUser('fakeUser2') try { - await createTestSubscription( - user2, + await createSubscription( + user2.id, 'sub_other', undefined, SubscriptionStatus.Unsubscribed, @@ -262,7 +262,7 @@ describe('Subscriptions API', () => { })) ) } finally { - deleteTestUser(user2.id) + deleteUser(user2.id) } }) diff --git a/packages/api/test/services/create_user.test.ts b/packages/api/test/services/create_user.test.ts index 879ebcf02..4d4b21c26 100644 --- a/packages/api/test/services/create_user.test.ts +++ b/packages/api/test/services/create_user.test.ts @@ -3,34 +3,37 @@ import chai, { expect } from 'chai' import 'mocha' import sinon from 'sinon' import sinonChai from 'sinon-chai' +import { Filter } from '../../src/entity/filter' import { StatusType, User } from '../../src/entity/user' -import { getRepository } from '../../src/repository' +import { authTrx, getRepository } from '../../src/repository' import { findProfile } from '../../src/services/profile' import { deleteUser } from '../../src/services/user' import * as util from '../../src/utils/sendEmail' import { createTestUser, - createUserWithoutProfile, deleteFiltersFromUser, - deleteTestUser, - getProfile, + createUserWithoutProfile, + deleteFiltersFromUser, } from '../db' chai.use(sinonChai) describe('create user', () => { - context('creates a user through manual sign up', () => { - it ('adds the default filters to the user', async () => { + it('adds the default filters to the user', async () => { after(async () => { const testUser = await getRepository(User).findOneBy({ name: 'filter_user', }) - await deleteTestUser(testUser!.id) + await deleteUser(testUser!.id) await deleteFiltersFromUser(testUser!.id) }) - const user = await createTestUser('filter_user'); - const filters = await getRepository(Filter).findBy({ user: { id: user.id }}) + const user = await createTestUser('filter_user') + const filters = await authTrx( + (t) => t.getRepository(Filter).findBy({ user: { id: user.id } }), + undefined, + user.id + ) expect(filters).not.to.be.empty }) diff --git a/yarn.lock b/yarn.lock index 321becb4a..d0be57119 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6160,11 +6160,6 @@ resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== -"@sindresorhus/is@^4.0.0", "@sindresorhus/is@^4.2.0": - version "4.6.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.6.0.tgz#3c7c9c46e678feefe7a2e5bb609d3dbd665ffb3f" - integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw== - "@sinonjs/commons@^1", "@sinonjs/commons@^1.3.0", "@sinonjs/commons@^1.4.0", "@sinonjs/commons@^1.6.0", "@sinonjs/commons@^1.7.0", "@sinonjs/commons@^1.8.3": version "1.8.3" resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" @@ -13011,20 +13006,6 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -ejs@^3.1.6: - version "3.1.9" - resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.9.tgz#03c9e8777fe12686a9effcef22303ca3d8eeb361" - integrity sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ== - dependencies: - jake "^10.8.5" - -elastic-ts@^0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/elastic-ts/-/elastic-ts-0.9.0.tgz#919b7646cd31d753235f3f9a336f7f26c5e3654d" - integrity sha512-w9Xj/67ygllZG1RS1uMnmWLMfvTEE8zUMyn9zYiEOIgt8RFLKu5X5qCT1N2eYo6IQNTCX5DUdlIw87ii36Udtg== - dependencies: - "@sindresorhus/is" "^4.0.0" - electron-to-chromium@^1.3.811: version "1.3.816" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.816.tgz#ab6488b126de92670a6459fe3e746050e0c6276f"