fix rebase conflicts
This commit is contained in:
@ -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({
|
||||
const updated = await authTrx((t) =>
|
||||
t.getRepository(Filter).save({
|
||||
...mergeWith({}, filter, input, (a: unknown, b: unknown) =>
|
||||
isNil(b) ? a : undefined
|
||||
),
|
||||
})
|
||||
)
|
||||
|
||||
return {
|
||||
__typename: 'UpdateFilterSuccess',
|
||||
|
||||
@ -124,11 +124,11 @@ export const mergeHighlightResolver = authorized<
|
||||
}
|
||||
// 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]
|
||||
const color =
|
||||
newHighlightInput.color || mergedColors[mergedColors.length - 1]
|
||||
|
||||
const highlight: DeepPartial<HighlightData> = {
|
||||
...newHighlightInput,
|
||||
|
||||
@ -52,12 +52,7 @@ export const subscriptionsResolver = authorized<
|
||||
SubscriptionsSuccessPartial,
|
||||
SubscriptionsError,
|
||||
QuerySubscriptionsArgs
|
||||
>(
|
||||
async (
|
||||
_obj,
|
||||
{ sort, type = SubscriptionType.Newsletter }, // default to newsletter
|
||||
{ authTrx, uid, log }
|
||||
) => {
|
||||
>(async (_obj, { sort, type }, { authTrx, uid, log }) => {
|
||||
try {
|
||||
const sortBy =
|
||||
sort?.by === SortBy.UpdatedTime ? 'lastFetchedAt' : 'createdAt'
|
||||
@ -94,9 +89,7 @@ export const subscriptionsResolver = authorized<
|
||||
)
|
||||
}
|
||||
|
||||
return queryBuilder
|
||||
.orderBy('subscription.' + sortBy, sortOrder)
|
||||
.getMany()
|
||||
return queryBuilder.orderBy('subscription.' + sortBy, sortOrder).getMany()
|
||||
})
|
||||
|
||||
return {
|
||||
|
||||
@ -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<string, unknown>,
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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<void> => {
|
||||
}
|
||||
|
||||
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 => {
|
||||
await Promise.all(
|
||||
userFilters.map((filter) => {
|
||||
return filterRepo.delete(filter.id)
|
||||
}));
|
||||
})
|
||||
)
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
@ -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)
|
||||
}
|
||||
})
|
||||
|
||||
|
||||
@ -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
|
||||
})
|
||||
|
||||
19
yarn.lock
19
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"
|
||||
|
||||
Reference in New Issue
Block a user