create a repository directory

This commit is contained in:
Hongbo Wu
2023-08-23 12:15:50 +08:00
parent 425864ce01
commit 9370951893
87 changed files with 298 additions and 301 deletions

View File

@ -19,7 +19,7 @@ import { functionResolvers } from './resolvers/function_resolvers'
import { ClaimsToSet, ResolverContext } from './resolvers/types'
import ScalarResolvers from './scalars'
import typeDefs from './schema'
import { AppDataSource } from './server'
import { AppDataSource } from './data-source'
import { tracer } from './tracing'
import { getClaimsByToken, setAuthInCookie } from './utils/auth'
import { SetClaimsRole } from './utils/dictionary'

View File

@ -0,0 +1,22 @@
import { DataSource } from 'typeorm'
import { SnakeNamingStrategy } from 'typeorm-naming-strategies'
import { env } from './env'
import { CustomTypeOrmLogger } from './utils/logger'
export const AppDataSource = new DataSource({
type: 'postgres',
host: env.pg.host,
port: env.pg.port,
schema: 'omnivore',
username: env.pg.userName,
password: env.pg.password,
database: env.pg.dbName,
logging: ['query', 'info'],
entities: [__dirname + '/entity/**/*{.js,.ts}'],
subscribers: [__dirname + '/events/**/*{.js,.ts}'],
namingStrategy: new SnakeNamingStrategy(),
logger: new CustomTypeOrmLogger(),
// cache: true,
connectTimeoutMS: 60000, // 60 seconds
maxQueryExecutionTime: 60000, // 60 seconds
})

View File

@ -114,7 +114,7 @@ export interface RecommendingUser {
userId: string
name: string
username: string
profileImageURL: string | null
profileImageURL?: string | null
}
export interface Recommendation {

View File

@ -19,7 +19,7 @@ export class LibraryItemPreview {
@JoinColumn({ name: 'sender_id' })
sender!: User
@Column('array', { name: 'recipient_ids' })
@Column('text', { name: 'recipient_ids', array: true })
recipientIds!: string[]
@OneToOne(() => LibraryItem, { onDelete: 'CASCADE' })

View File

@ -1,8 +1,8 @@
import { EntityManager, EntityTarget, Repository } from 'typeorm'
import { AppDataSource } from '../server'
import { Reminder } from './reminder'
import { UploadFile } from './upload_file'
import { User } from './user'
import { AppDataSource } from '../data-source'
import { Reminder } from '../entity/reminder'
import { UploadFile } from '../entity/upload_file'
import { User } from '../entity/user'
export const setClaims = async (
t: EntityManager,

View File

@ -1,6 +1,4 @@
import { getRepository } from '../../entity'
import { ApiKey } from '../../entity/api_key'
import { User } from '../../entity/user'
import { env } from '../../env'
import {
ApiKeysError,
@ -15,6 +13,7 @@ import {
RevokeApiKeyErrorCode,
RevokeApiKeySuccess,
} from '../../generated/graphql'
import { getRepository, userRepository } from '../../repository'
import { analytics } from '../../utils/analytics'
import { generateApiKey, hashApiKey } from '../../utils/auth'
import { authorized } from '../../utils/helpers'
@ -24,7 +23,7 @@ export const apiKeysResolver = authorized<ApiKeysSuccess, ApiKeysError>(
log.info('apiKeysResolver')
try {
const user = await getRepository(User).findOneBy({ id: uid })
const user = await userRepository.findOneBy({ id: uid })
if (!user) {
return {
errorCodes: [ApiKeysErrorCode.Unauthorized],
@ -60,7 +59,7 @@ export const generateApiKeyResolver = authorized<
>(async (_, { input: { name, expiresAt } }, { claims: { uid }, log }) => {
try {
log.info('generateApiKeyResolver')
const user = await getRepository(User).findOneBy({ id: uid })
const user = await userRepository.findOneBy({ id: uid })
if (!user) {
return {
errorCodes: [GenerateApiKeyErrorCode.Unauthorized],
@ -117,7 +116,7 @@ export const revokeApiKeyResolver = authorized<
log.info('RevokeApiKeyResolver')
try {
const user = await getRepository(User).findOneBy({ id: uid })
const user = await userRepository.findOneBy({ id: uid })
if (!user) {
return {
errorCodes: [RevokeApiKeyErrorCode.Unauthorized],

View File

@ -20,7 +20,7 @@ import {
PageType,
SearchItem as SearchItemData,
} from '../../elastic/types'
import { getRepository } from '../../entity'
import { getRepository } from '../../repository'
import { UploadFile } from '../../entity/upload_file'
import { User } from '../../entity/user'
import { env } from '../../env'

View File

@ -1,6 +1,5 @@
/* eslint-disable prefer-const */
import { getPageByParam } from '../../elastic/pages'
import { getRepository } from '../../entity'
import { User } from '../../entity/user'
import { env } from '../../env'
import {
@ -14,6 +13,7 @@ import {
MutationCreateArticleSavingRequestArgs,
QueryArticleSavingRequestArgs,
} from '../../generated/graphql'
import { getRepository } from '../../repository'
import { createPageSaveRequest } from '../../services/create_page_save_request'
import { analytics } from '../../utils/analytics'
import {

View File

@ -1,5 +1,5 @@
import { Between } from 'typeorm'
import { getRepository, setClaims } from '../../entity'
import { AppDataSource } from '../../data-source'
import { Filter } from '../../entity/filter'
import { User } from '../../entity/user'
import { env } from '../../env'
@ -24,7 +24,7 @@ import {
UpdateFilterSuccess,
UpdateFilterErrorCode,
} from '../../generated/graphql'
import { AppDataSource } from '../../server'
import { getRepository, setClaims } from '../../repository'
import { analytics } from '../../utils/analytics'
import { env } from '../../env'
import { isNil, mergeWith } from 'lodash'

View File

@ -4,7 +4,7 @@
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
import { getPageByParam } from '../elastic/pages'
import { getRepository } from '../entity'
import { getRepository } from '../repository'
import { Subscription } from '../entity/subscription'
import { UploadFile } from '../entity/upload_file'
import { User } from '../entity/user'
@ -95,7 +95,7 @@ import {
setLinkArchivedResolver,
setRuleResolver,
// setShareArticleResolver,
setShareHighlightResolver,
// setShareHighlightResolver,
setUserPersonalizationResolver,
setWebhookResolver,
subscribeResolver,
@ -163,7 +163,7 @@ export const functionResolvers = {
setBookmarkArticle: setBookmarkArticleResolver,
setUserPersonalization: setUserPersonalizationResolver,
createArticleSavingRequest: createArticleSavingRequestResolver,
setShareHighlight: setShareHighlightResolver,
// setShareHighlight: setShareHighlightResolver,
reportItem: reportItemResolver,
// updateLinkShareInfo: updateLinkShareInfoResolver,
setLinkArchived: setLinkArchivedResolver,
@ -602,31 +602,31 @@ export const functionResolvers = {
...resultResolveTypeResolver('UpdateUser'),
...resultResolveTypeResolver('UpdateUserProfile'),
...resultResolveTypeResolver('Article'),
...resultResolveTypeResolver('SharedArticle'),
// ...resultResolveTypeResolver('SharedArticle'),
...resultResolveTypeResolver('Articles'),
...resultResolveTypeResolver('User'),
...resultResolveTypeResolver('Users'),
...resultResolveTypeResolver('SaveArticleReadingProgress'),
...resultResolveTypeResolver('FeedArticles'),
// ...resultResolveTypeResolver('FeedArticles'),
...resultResolveTypeResolver('CreateArticle'),
...resultResolveTypeResolver('CreateHighlight'),
...resultResolveTypeResolver('CreateReaction'),
...resultResolveTypeResolver('DeleteReaction'),
// ...resultResolveTypeResolver('CreateReaction'),
// ...resultResolveTypeResolver('DeleteReaction'),
...resultResolveTypeResolver('MergeHighlight'),
...resultResolveTypeResolver('UpdateHighlight'),
...resultResolveTypeResolver('DeleteHighlight'),
...resultResolveTypeResolver('UploadFileRequest'),
...resultResolveTypeResolver('SetShareArticle'),
...resultResolveTypeResolver('UpdateSharedComment'),
// ...resultResolveTypeResolver('SetShareArticle'),
// ...resultResolveTypeResolver('UpdateSharedComment'),
...resultResolveTypeResolver('SetBookmarkArticle'),
...resultResolveTypeResolver('SetFollow'),
...resultResolveTypeResolver('GetFollowers'),
...resultResolveTypeResolver('GetFollowing'),
// ...resultResolveTypeResolver('SetFollow'),
// ...resultResolveTypeResolver('GetFollowers'),
// ...resultResolveTypeResolver('GetFollowing'),
...resultResolveTypeResolver('GetUserPersonalization'),
...resultResolveTypeResolver('SetUserPersonalization'),
...resultResolveTypeResolver('ArticleSavingRequest'),
...resultResolveTypeResolver('CreateArticleSavingRequest'),
...resultResolveTypeResolver('SetShareHighlight'),
// ...resultResolveTypeResolver('SetShareHighlight'),
...resultResolveTypeResolver('ArchiveLink'),
...resultResolveTypeResolver('CreateNewsletterEmail'),
...resultResolveTypeResolver('NewsletterEmails'),

View File

@ -1,6 +1,5 @@
import { DateTime } from 'luxon'
import { v4 as uuidv4 } from 'uuid'
import { getRepository } from '../../entity'
import { User } from '../../entity/user'
import { env } from '../../env'
import {
@ -9,6 +8,7 @@ import {
UploadImportFileErrorCode,
UploadImportFileSuccess,
} from '../../generated/graphql'
import { getRepository } from '../../repository'
import { analytics } from '../../utils/analytics'
import { authorized } from '../../utils/helpers'
import { logger } from '../../utils/logger'

View File

@ -1,18 +1,18 @@
export * from './user'
export * from './article'
export * from './user_friends'
export * from './user_feed_article'
// export * from './user_friends'
// export * from './user_feed_article'
export * from './user_personalization'
export * from './article_saving_request'
export * from './upload_files'
export * from './highlight'
export * from './reaction'
// export * from './reaction'
export * from './report'
export * from './links'
export * from './newsletters'
export * from './save'
export * from './send_install_instructions'
export * from './reminders'
// export * from './reminders'
export * from './user_device_tokens'
export * from './labels'
export * from './subscriptions'

View File

@ -1,4 +1,3 @@
import { getRepository } from '../../entity'
import { Integration, IntegrationType } from '../../entity/integration'
import { User } from '../../entity/user'
import { env } from '../../env'
@ -19,6 +18,7 @@ import {
SetIntegrationErrorCode,
SetIntegrationSuccess,
} from '../../generated/graphql'
import { getRepository } from '../../repository'
import { getIntegrationService } from '../../services/integrations'
import { analytics } from '../../utils/analytics'
import {

View File

@ -1,4 +1,5 @@
import { Between } from 'typeorm'
import { AppDataSource } from '../../data-source'
import { createPubSubClient } from '../../datalayer/pubsub'
import { getHighlightById } from '../../elastic/highlights'
import {
@ -8,7 +9,6 @@ import {
updateLabelsInPage,
} from '../../elastic/labels'
import { getPageById } from '../../elastic/pages'
import { getRepository, setClaims } from '../../entity'
import { Label } from '../../entity/label'
import { User } from '../../entity/user'
import { env } from '../../env'
@ -38,7 +38,7 @@ import {
UpdateLabelErrorCode,
UpdateLabelSuccess,
} from '../../generated/graphql'
import { AppDataSource } from '../../server'
import { getRepository, setClaims } from '../../repository'
import {
createLabel,
createLabels,

View File

@ -1,4 +1,3 @@
import { getRepository } from '../../entity'
import { NewsletterEmail } from '../../entity/newsletter_email'
import { User } from '../../entity/user'
import { env } from '../../env'
@ -14,6 +13,7 @@ import {
NewsletterEmailsErrorCode,
NewsletterEmailsSuccess,
} from '../../generated/graphql'
import { getRepository } from '../../repository'
import {
createNewsletterEmail,
deleteNewsletterEmail,

View File

@ -1,24 +1,19 @@
import { env } from '../../env'
import {
MutationAddPopularReadArgs,
AddPopularReadError,
AddPopularReadErrorCode,
AddPopularReadSuccess,
MutationAddPopularReadArgs,
} from '../../generated/graphql'
import { authorized, userDataToUser } from '../../utils/helpers'
import { analytics } from '../../utils/analytics'
import { userRepository } from '../../repository'
import { addPopularRead } from '../../services/popular_reads'
import { env } from '../../env'
import { analytics } from '../../utils/analytics'
import { authorized } from '../../utils/helpers'
export const addPopularReadResolver = authorized<
AddPopularReadSuccess,
AddPopularReadError,
MutationAddPopularReadArgs
>(async (_, { name }, ctx) => {
const {
models,
claims: { uid },
} = ctx
>(async (_, { name }, { uid }) => {
analytics.track({
userId: uid,
event: 'popular_read_added',
@ -28,7 +23,9 @@ export const addPopularReadResolver = authorized<
},
})
const user = userDataToUser(await models.user.get(uid))
const user = await userRepository.findOneBy({
id: uid,
})
if (!user) {
return { errorCodes: [AddPopularReadErrorCode.Unauthorized] }
}

View File

@ -1,5 +1,4 @@
import { ILike } from 'typeorm'
import { getRepository } from '../../entity'
import { NewsletterEmail } from '../../entity/newsletter_email'
import { ReceivedEmail } from '../../entity/received_email'
import { env } from '../../env'
@ -12,6 +11,7 @@ import {
RecentEmailsErrorCode,
RecentEmailsSuccess,
} from '../../generated/graphql'
import { getRepository } from '../../repository'
import { updateReceivedEmail } from '../../services/received_emails'
import { saveNewsletterEmail } from '../../services/save_newsletter_email'
import { authorized } from '../../utils/helpers'

View File

@ -1,4 +1,3 @@
import { getRepository } from '../../entity'
import { User } from '../../entity/user'
import { env } from '../../env'
import {
@ -6,6 +5,7 @@ import {
RecentSearchesErrorCode,
RecentSearchesSuccess,
} from '../../generated/graphql'
import { getRepository } from '../../repository'
import { getRecentSearches } from '../../services/search_history'
import { analytics } from '../../utils/analytics'
import { authorized } from '../../utils/helpers'

View File

@ -1,6 +1,5 @@
import { In } from 'typeorm'
import { getPageByParam } from '../../elastic/pages'
import { getRepository } from '../../entity'
import { Group } from '../../entity/groups/group'
import { User } from '../../entity/user'
import { env } from '../../env'
@ -29,6 +28,7 @@ import {
RecommendHighlightsSuccess,
RecommendSuccess,
} from '../../generated/graphql'
import { getRepository } from '../../repository'
import {
createGroup,
createLabelAndRuleForGroup,

View File

@ -1,4 +1,3 @@
import { getRepository } from '../../entity'
import { Rule } from '../../entity/rule'
import { User } from '../../entity/user'
import {
@ -15,6 +14,7 @@ import {
SetRuleErrorCode,
SetRuleSuccess,
} from '../../generated/graphql'
import { getRepository } from '../../repository'
import { authorized } from '../../utils/helpers'
export const setRuleResolver = authorized<

View File

@ -1,4 +1,3 @@
import { getRepository } from '../../entity'
import { User } from '../../entity/user'
import { env } from '../../env'
import {
@ -9,6 +8,7 @@ import {
SaveErrorCode,
SaveSuccess,
} from '../../generated/graphql'
import { getRepository } from '../../repository'
import { saveFile } from '../../services/save_file'
import { savePage } from '../../services/save_page'
import { saveUrl } from '../../services/save_url'

View File

@ -5,7 +5,7 @@ import {
SendInstallInstructionsErrorCode,
SendInstallInstructionsSuccess,
} from '../../generated/graphql'
import { AppDataSource } from '../../server'
import { AppDataSource } from '../../data-source'
import { authorized } from '../../utils/helpers'
import { sendEmail } from '../../utils/sendEmail'

View File

@ -1,6 +1,6 @@
import Parser from 'rss-parser'
import { Brackets } from 'typeorm'
import { getRepository } from '../../entity'
import { AppDataSource } from '../../data-source'
import { Subscription } from '../../entity/subscription'
import { User } from '../../entity/user'
import { env } from '../../env'
@ -26,7 +26,7 @@ import {
UpdateSubscriptionErrorCode,
UpdateSubscriptionSuccess,
} from '../../generated/graphql'
import { AppDataSource } from '../../server'
import { getRepository } from '../../repository'
import { getSubscribeHandler, unsubscribe } from '../../services/subscriptions'
import { Merge } from '../../util'
import { analytics } from '../../utils/analytics'

View File

@ -6,8 +6,9 @@ import {
UpdatePageErrorCode,
UpdatePageSuccess,
} from '../../generated/graphql'
import { userRepository } from '../../repository'
import { Merge } from '../../util'
import { authorized, userDataToUser } from '../../utils/helpers'
import { authorized } from '../../utils/helpers'
export type UpdatePageSuccessPartial = Merge<
UpdatePageSuccess,
@ -19,21 +20,21 @@ export const updatePageResolver = authorized<
UpdatePageError,
MutationUpdatePageArgs
>(async (_, { input }, ctx) => {
const {
models,
claims: { uid },
} = ctx
const user = userDataToUser(await models.user.get(uid))
const { pubsub, uid } = ctx
const user = await userRepository.findOneBy({ id: uid })
if (!user) {
return { errorCodes: [UpdatePageErrorCode.Unauthorized] }
}
const page = await getPageById(input.pageId)
if (!page) return { errorCodes: [UpdatePageErrorCode.NotFound] }
else if (page.userId !== user.id)
if (!page) {
return { errorCodes: [UpdatePageErrorCode.NotFound] }
}
if (page.userId !== user.id) {
return { errorCodes: [UpdatePageErrorCode.Unauthorized] }
}
const pageData = {
id: input.pageId,
@ -47,7 +48,7 @@ export const updatePageResolver = authorized<
}
const updateResult = await updatePage(input.pageId, pageData, {
pubsub: ctx.pubsub,
pubsub: pubsub,
uid,
refresh: true,
})

View File

@ -3,7 +3,6 @@ import normalizeUrl from 'normalize-url'
import path from 'path'
import { createPage, getPageByParam, updatePage } from '../../elastic/pages'
import { PageType } from '../../elastic/types'
import { uploadFileRepository } from '../../entity'
import { UploadFile } from '../../entity/upload_file'
import { env } from '../../env'
import {
@ -14,6 +13,7 @@ import {
UploadFileRequestSuccess,
UploadFileStatus,
} from '../../generated/graphql'
import { uploadFileRepository } from '../../repository'
import { validateUrl } from '../../services/create_page_save_request'
import { analytics } from '../../utils/analytics'
import { authorized, generateSlug } from '../../utils/helpers'

View File

@ -1,7 +1,7 @@
import * as jwt from 'jsonwebtoken'
import { RegistrationType } from '../../datalayer/user/model'
import { AppDataSource } from '../../data-source'
import { deletePagesByParam } from '../../elastic/pages'
import { setClaims, userRepository } from '../../entity'
import { User as UserEntity } from '../../entity/user'
import { env } from '../../env'
import {
@ -38,7 +38,7 @@ import {
UsersError,
UsersSuccess,
} from '../../generated/graphql'
import { AppDataSource } from '../../server'
import { setClaims, userRepository } from '../../repository'
import { createUser, getTopUsers } from '../../services/create_user'
import { sendVerificationEmail } from '../../services/send_emails'
import { authorized, userDataToUser } from '../../utils/helpers'
@ -49,7 +49,7 @@ export const updateUserResolver = authorized<
UpdateUserSuccess,
UpdateUserError,
MutationUpdateUserArgs
>(async (_, { input: { name, bio } }, { uid }) => {
>(async (_, { input: { name, bio } }, { uid, authTrx }) => {
const user = await userRepository.findOneBy({
id: uid,
})
@ -71,15 +71,16 @@ export const updateUserResolver = authorized<
return { errorCodes }
}
const updatedUser = await userRepository.save({
id: uid,
name,
source: user.source,
sourceUserId: user.sourceUserId,
profile: {
bio,
},
})
const updatedUser = await authTrx((tx) =>
tx.getRepository(UserEntity).save({
...user,
name,
profile: {
...user.profile,
bio,
},
})
)
return { user: userDataToUser(updatedUser) }
})
@ -88,7 +89,7 @@ export const updateUserProfileResolver = authorized<
UpdateUserProfileSuccess,
UpdateUserProfileError,
MutationUpdateUserProfileArgs
>(async (_, { input: { userId, username, pictureUrl } }, { uid }) => {
>(async (_, { input: { userId, username, pictureUrl } }, { uid, authTrx }) => {
const user = await userRepository.findOneBy({
id: userId,
})
@ -128,13 +129,16 @@ export const updateUserProfileResolver = authorized<
}
}
const updatedUser = await userRepository.save({
id: uid,
profile: {
username: lowerCasedUsername,
pictureUrl,
},
})
const updatedUser = await authTrx((tx) =>
tx.getRepository(UserEntity).save({
...user,
profile: {
...user.profile,
username: lowerCasedUsername,
pictureUrl,
},
})
)
return { user: userDataToUser(updatedUser) }
})

View File

@ -1,4 +1,4 @@
import { getRepository, setClaims } from '../../entity'
import { AppDataSource } from '../../data-source'
import { UserPersonalization } from '../../entity/user_personalization'
import {
GetUserPersonalizationError,
@ -9,7 +9,7 @@ import {
SetUserPersonalizationSuccess,
SortOrder,
} from '../../generated/graphql'
import { AppDataSource } from '../../server'
import { getRepository, setClaims } from '../../repository'
import { authorized } from '../../utils/helpers'
export const setUserPersonalizationResolver = authorized<

View File

@ -1,4 +1,3 @@
import { getRepository } from '../../entity'
import { User } from '../../entity/user'
import { Webhook } from '../../entity/webhook'
import { env } from '../../env'
@ -21,6 +20,7 @@ import {
WebhooksSuccess,
WebhookSuccess,
} from '../../generated/graphql'
import { getRepository } from '../../repository'
import { analytics } from '../../utils/analytics'
import { authorized } from '../../utils/helpers'

View File

@ -6,7 +6,7 @@ import express from 'express'
import * as jwt from 'jsonwebtoken'
import { createPubSubClient } from '../datalayer/pubsub'
import { getPageById, updatePage } from '../elastic/pages'
import { getRepository } from '../entity'
import { getRepository } from '../repository'
import { Speech, SpeechState } from '../entity/speech'
import { env } from '../env'
import { CreateArticleErrorCode } from '../generated/graphql'

View File

@ -14,6 +14,7 @@ import express from 'express'
import * as jwt from 'jsonwebtoken'
import url from 'url'
import { promisify } from 'util'
import { AppDataSource } from '../../data-source'
import { kx } from '../../datalayer/knex_config'
import UserModel from '../../datalayer/user'
import {
@ -21,12 +22,11 @@ import {
StatusType,
UserData,
} from '../../datalayer/user/model'
import { getRepository, setClaims } from '../../entity'
import { User } from '../../entity/user'
import { env } from '../../env'
import { LoginErrorCode, SignupErrorCode } from '../../generated/graphql'
import { getRepository, setClaims } from '../../repository'
import { isErrorWithCode } from '../../resolvers'
import { AppDataSource } from '../../server'
import { createUser, getUserByEmail } from '../../services/create_user'
import {
sendConfirmationEmail,

View File

@ -9,7 +9,7 @@ import { createPubSubClient } from '../datalayer/pubsub'
import { createPage, getPageByParam, updatePage } from '../elastic/pages'
import { addRecommendation } from '../elastic/recommendation'
import { Recommendation } from '../elastic/types'
import { uploadFileRepository } from '../entity'
import { uploadFileRepository } from '../repository'
import { env } from '../env'
import {
ArticleSavingRequestStatus,

View File

@ -2,15 +2,15 @@
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
import express from 'express'
import { AppDataSource } from '../../data-source'
import {
createPubSubClient,
readPushSubscription,
} from '../../datalayer/pubsub'
import { getPageByParam, updatePage } from '../../elastic/pages'
import { Page } from '../../elastic/types'
import { setClaims } from '../../entity'
import { ArticleSavingRequestStatus } from '../../generated/graphql'
import { AppDataSource } from '../../server'
import { setClaims } from '../../repository'
import { setFileUploadComplete } from '../../services/save_file'
import { logger } from '../../utils/logger'

View File

@ -1,11 +1,11 @@
import express from 'express'
import { AppDataSource } from '../../data-source'
import { createPubSubClient } from '../../datalayer/pubsub'
import { createPage } from '../../elastic/pages'
import { ArticleSavingRequestStatus, Page } from '../../elastic/types'
import { setClaims, uploadFileRepository } from '../../entity'
import { env } from '../../env'
import { PageType, UploadFileStatus } from '../../generated/graphql'
import { AppDataSource } from '../../server'
import { setClaims, uploadFileRepository } from '../../repository'
import { getNewsletterEmail } from '../../services/newsletters'
import { updateReceivedEmail } from '../../services/received_emails'
import { setFileUploadComplete } from '../../services/save_file'

View File

@ -8,8 +8,8 @@ import { v4 as uuidv4 } from 'uuid'
import { EntityType, readPushSubscription } from '../../datalayer/pubsub'
import { getPageById, searchPages } from '../../elastic/pages'
import { Page } from '../../elastic/types'
import { getRepository } from '../../entity'
import { Integration, IntegrationType } from '../../entity/integration'
import { getRepository } from '../../repository'
import { Claims } from '../../resolvers/types'
import { getIntegrationService } from '../../services/integrations'
import { getClaimsByToken } from '../../utils/auth'

View File

@ -1,11 +1,11 @@
import { MulticastMessage } from 'firebase-admin/messaging'
import { AppDataSource } from '../../data-source'
import { createPubSubClient } from '../../datalayer/pubsub'
import { updatePage } from '../../elastic/pages'
import { setClaims } from '../../entity'
import { UserDeviceToken } from '../../entity/user_device_tokens'
import { homePageURL } from '../../env'
import { ContentReader } from '../../generated/graphql'
import { AppDataSource } from '../../server'
import { setClaims } from '../../repository'
import { PageReminder, setRemindersComplete } from '../../services/reminders'
interface PageToNotify {

View File

@ -1,9 +1,9 @@
/* eslint-disable @typescript-eslint/no-misused-promises */
import express from 'express'
import { readPushSubscription } from '../../datalayer/pubsub'
import { getRepository } from '../../entity'
import { Subscription } from '../../entity/subscription'
import { SubscriptionStatus, SubscriptionType } from '../../generated/graphql'
import { getRepository } from '../../repository'
import { enqueueRssFeedFetch } from '../../utils/createTask'
import { logger } from '../../utils/logger'

View File

@ -4,8 +4,8 @@
import axios, { Method } from 'axios'
import express from 'express'
import { readPushSubscription } from '../../datalayer/pubsub'
import { getRepository } from '../../entity'
import { Webhook } from '../../entity/webhook'
import { getRepository } from '../../repository'
import { logger } from '../../utils/logger'
export function webhooksServiceRouter() {

View File

@ -7,10 +7,10 @@ import express from 'express'
import { readPushSubscription } from '../datalayer/pubsub'
import { getPageById } from '../elastic/pages'
import { ArticleSavingRequestStatus } from '../elastic/types'
import { getRepository, setClaims } from '../entity'
import { getRepository, setClaims } from '../repository'
import { Speech, SpeechState } from '../entity/speech'
import { UserPersonalization } from '../entity/user_personalization'
import { AppDataSource } from '../server'
import { AppDataSource } from '../data-source'
import { FeatureName, getFeature } from '../services/features'
import { shouldSynthesize } from '../services/speech'
import { getClaimsByToken } from '../utils/auth'

View File

@ -2,7 +2,7 @@
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
import cors from 'cors'
import express from 'express'
import { getRepository } from '../entity'
import { getRepository } from '../repository'
import { User } from '../entity/user'
import { env } from '../env'
import { getClaimsByToken, getTokenByRequest } from '../utils/auth'

View File

@ -11,10 +11,9 @@ import express, { Express } from 'express'
import * as httpContext from 'express-http-context2'
import rateLimit from 'express-rate-limit'
import { createServer, Server } from 'http'
import { DataSource } from 'typeorm'
import { SnakeNamingStrategy } from 'typeorm-naming-strategies'
import { config, loggers } from 'winston'
import { makeApolloServer } from './apollo'
import { AppDataSource } from './data-source'
import { initElasticsearch } from './elastic'
import { env } from './env'
import { articleRouter } from './routers/article_router'
@ -39,32 +38,10 @@ import { userRouter } from './routers/user_router'
import { sentryConfig } from './sentry'
import { getClaimsByToken, getTokenByRequest } from './utils/auth'
import { corsConfig } from './utils/corsConfig'
import {
buildLogger,
buildLoggerTransport,
CustomTypeOrmLogger,
} from './utils/logger'
import { buildLogger, buildLoggerTransport } from './utils/logger'
const PORT = process.env.PORT || 4000
export const AppDataSource = new DataSource({
type: 'postgres',
host: env.pg.host,
port: env.pg.port,
schema: 'omnivore',
username: env.pg.userName,
password: env.pg.password,
database: env.pg.dbName,
logging: ['query', 'info'],
entities: [__dirname + '/entity/**/*{.js,.ts}'],
subscribers: [__dirname + '/events/**/*{.js,.ts}'],
namingStrategy: new SnakeNamingStrategy(),
logger: new CustomTypeOrmLogger(),
cache: true,
connectTimeoutMS: 60000, // 60 seconds
maxQueryExecutionTime: 60000, // 60 seconds
})
export const createApp = (): {
app: Express
apollo: ApolloServer

View File

@ -1,6 +1,6 @@
import { setClaims } from '../entity'
import { AppDataSource } from '../data-source'
import { Link } from '../entity/link'
import { AppDataSource } from '../server'
import { setClaims } from '../repository'
export const setLinkArchived = async (
userId: string,

View File

@ -8,12 +8,12 @@ import {
updatePage,
} from '../elastic/pages'
import { ArticleSavingRequestStatus, Label, PageType } from '../elastic/types'
import { getRepository } from '../entity'
import { User } from '../entity/user'
import {
ArticleSavingRequest,
CreateArticleSavingRequestErrorCode,
} from '../generated/graphql'
import { getRepository } from '../repository'
import { enqueueParseRequest } from '../utils/createTask'
import {
cleanUrl,

View File

@ -1,13 +1,13 @@
import { EntityManager, In } from 'typeorm'
import { AppDataSource } from '../data-source'
import { StatusType } from '../datalayer/user/model'
import { getRepository, userRepository } from '../entity'
import { GroupMembership } from '../entity/groups/group_membership'
import { Invite } from '../entity/groups/invite'
import { Profile } from '../entity/profile'
import { User } from '../entity/user'
import { SignupErrorCode } from '../generated/graphql'
import { getRepository, userRepository } from '../repository'
import { AuthProvider } from '../routers/auth/auth_types'
import { AppDataSource } from '../server'
import { logger } from '../utils/logger'
import { validateUsername } from '../utils/usernamePolicy'
import { sendConfirmationEmail } from './send_emails'

View File

@ -1,9 +1,9 @@
import * as jwt from 'jsonwebtoken'
import { IsNull, Not } from 'typeorm'
import { getRepository } from '../entity'
import { AppDataSource } from '../data-source'
import { Feature } from '../entity/feature'
import { env } from '../env'
import { AppDataSource } from '../server'
import { getRepository } from '../repository'
import { logger } from '../utils/logger'
export enum FeatureName {

View File

@ -1,6 +1,6 @@
import { getRepository } from '../entity'
import { Follower } from '../entity/follower'
import { User } from '../entity/user'
import { getRepository } from '../repository'
export const getUserFollowers = async (
user: User,

View File

@ -1,5 +1,5 @@
import { nanoid } from 'nanoid'
import { getRepository } from '../entity'
import { AppDataSource } from '../data-source'
import { Group } from '../entity/groups/group'
import { GroupMembership } from '../entity/groups/group_membership'
import { Invite } from '../entity/groups/invite'
@ -7,7 +7,7 @@ import { RuleActionType } from '../entity/rule'
import { User } from '../entity/user'
import { homePageURL } from '../env'
import { RecommendationGroup, User as GraphqlUser } from '../generated/graphql'
import { AppDataSource } from '../server'
import { getRepository } from '../repository'
import { userDataToUser } from '../utils/helpers'
import { createLabel, getLabelByName } from './labels'
import { createRule } from './rules'

View File

@ -1,6 +1,6 @@
import axios from 'axios'
import { HighlightType, Page } from '../../elastic/types'
import { getRepository } from '../../entity'
import { getRepository } from '../../repository'
import { Integration } from '../../entity/integration'
import { env } from '../../env'
import { wait } from '../../utils/helpers'

View File

@ -2,11 +2,11 @@ import DataLoader from 'dataloader'
import { In } from 'typeorm'
import { addLabelInPage } from '../elastic/labels'
import { PageContext } from '../elastic/types'
import { getRepository } from '../entity'
import { Label } from '../entity/label'
import { Link } from '../entity/link'
import { User } from '../entity/user'
import { CreateLabelInput } from '../generated/graphql'
import { getRepository } from '../repository'
import { generateRandomColor } from '../utils/helpers'
import { logger } from '../utils/logger'

View File

@ -1,5 +1,4 @@
import { nanoid } from 'nanoid'
import { getRepository } from '../entity'
import { NewsletterEmail } from '../entity/newsletter_email'
import { User } from '../entity/user'
import { env } from '../env'
@ -7,6 +6,7 @@ import {
CreateNewsletterEmailErrorCode,
SubscriptionStatus,
} from '../generated/graphql'
import { getRepository } from '../repository'
import addressparser = require('nodemailer/lib/addressparser')
const parsedAddress = (emailAddress: string): string | undefined => {

View File

@ -1,5 +1,5 @@
import { getRepository } from '../entity'
import { ReceivedEmail } from '../entity/received_email'
import { getRepository } from '../repository'
export const saveReceivedEmail = async (
from: string,

View File

@ -1,7 +1,7 @@
import { EntityManager, IsNull, Not } from 'typeorm'
import { getPageById } from '../elastic/pages'
import { getRepository } from '../entity'
import { Reminder } from '../entity/reminder'
import { getRepository } from '../repository'
import { logger } from '../utils/logger'
export interface PageReminder {

View File

@ -1,8 +1,8 @@
import { getPageById } from '../elastic/pages'
import { getRepository } from '../entity'
import { AbuseReport } from '../entity/reports/abuse_report'
import { ContentDisplayReport } from '../entity/reports/content_display_report'
import { ReportItemInput, ReportType } from '../generated/graphql'
import { getRepository } from '../repository'
import { logger } from '../utils/logger'
export const saveContentDisplayReport = async (

View File

@ -1,6 +1,6 @@
import { ILike } from 'typeorm'
import { getRepository } from '../entity'
import { Rule, RuleAction } from '../entity/rule'
import { getRepository } from '../repository'
export const createRule = async (
userId: string,

View File

@ -1,6 +1,6 @@
import { AppDataSource } from '../data-source'
import { UserData } from '../datalayer/user/model'
import { updatePage } from '../elastic/pages'
import { getRepository } from '../entity'
import { UploadFile } from '../entity/upload_file'
import { homePageURL } from '../env'
import {
@ -9,8 +9,8 @@ import {
SaveFileInput,
SaveResult,
} from '../generated/graphql'
import { getRepository } from '../repository'
import { WithDataSourcesContext } from '../resolvers/types'
import { AppDataSource } from '../server'
import { logger } from '../utils/logger'
import { getStorageFileDetails } from '../utils/uploads'
import { createLabels } from './labels'

View File

@ -1,9 +1,9 @@
import { PubsubClient } from '../datalayer/pubsub'
import { ArticleSavingRequestStatus } from '../elastic/types'
import { getRepository } from '../entity'
import { User } from '../entity/user'
import { homePageURL } from '../env'
import { SaveErrorCode, SaveResult, SaveUrlInput } from '../generated/graphql'
import { getRepository } from '../repository'
import { logger } from '../utils/logger'
import { createPageSaveRequest } from './create_page_save_request'
import { createLabels } from './labels'

View File

@ -1,5 +1,5 @@
import { getRepository } from '../entity'
import { SearchHistory } from '../entity/search_history'
import { getRepository } from '../repository'
export const getRecentSearches = async (
userId: string

View File

@ -1,8 +1,8 @@
import axios from 'axios'
import { getRepository } from '../entity'
import { NewsletterEmail } from '../entity/newsletter_email'
import { Subscription } from '../entity/subscription'
import { SubscriptionStatus, SubscriptionType } from '../generated/graphql'
import { getRepository } from '../repository'
import { logger } from '../utils/logger'
import { sendEmail } from '../utils/sendEmail'
import { createNewsletterEmail } from './newsletters'

View File

@ -1,9 +1,9 @@
import { getRepository, setClaims } from '../entity'
import { AppDataSource } from '../data-source'
import { User } from '../entity/user'
import { UserDeviceToken } from '../entity/user_device_tokens'
import { env } from '../env'
import { SetDeviceTokenErrorCode } from '../generated/graphql'
import { AppDataSource } from '../server'
import { getRepository, setClaims } from '../repository'
import { analytics } from '../utils/analytics'
export const getDeviceToken = async (

View File

@ -4,7 +4,7 @@ import express from 'express'
import * as jwt from 'jsonwebtoken'
import { promisify } from 'util'
import { v4 as uuidv4 } from 'uuid'
import { getRepository } from '../entity'
import { getRepository } from '../repository'
import { ApiKey } from '../entity/api_key'
import { env } from '../env'
import { Claims, ClaimsToSet } from '../resolvers/types'

View File

@ -148,7 +148,6 @@ export const userDataToUser = (
profile: Profile
} => ({
...user,
name: user.name,
source: user.source as RegistrationType,
createdAt: user.createdAt || new Date(),
friendsCount: user.friendsCount || 0,

View File

@ -16,7 +16,7 @@ import { ILike } from 'typeorm'
import { promisify } from 'util'
import { v4 as uuid } from 'uuid'
import { Highlight } from '../elastic/types'
import { getRepository } from '../entity'
import { getRepository } from '../repository'
import { User } from '../entity/user'
import { env } from '../env'
import { PageType, PreparedDocumentInput } from '../generated/graphql'

View File

@ -1,7 +1,7 @@
import Postgrator from 'postgrator'
import { FindOptionsWhere } from 'typeorm'
import { SnakeNamingStrategy } from 'typeorm-naming-strategies'
import { getRepository, setClaims } from '../src/entity'
import { getRepository, setClaims, userRepository } from '../src/repository'
import { Integration } from '../src/entity/integration'
import { Label } from '../src/entity/label'
import { Link } from '../src/entity/link'
@ -13,7 +13,7 @@ import { Subscription } from '../src/entity/subscription'
import { User } from '../src/entity/user'
import { UserDeviceToken } from '../src/entity/user_device_tokens'
import { SubscriptionStatus, SubscriptionType } from '../src/generated/graphql'
import { AppDataSource } from '../src/server'
import { AppDataSource } from '../src/data-source'
import { createUser } from '../src/services/create_user'
import { Filter } from "../src/entity/filter"
@ -189,7 +189,7 @@ export const getDeviceToken = async (
}
export const getUser = async (id: string): Promise<User | null> => {
return getRepository(User).findOneBy({ id })
return userRepository.findOneBy({ id })
}
export const getLink = async (id: string): Promise<Link | null> => {

View File

@ -1,4 +1,4 @@
import { AppDataSource } from '../src/server'
import { AppDataSource } from '../src/data-source'
import { stopApolloServer } from './util'
import { kx } from '../src/datalayer/knex_config'

View File

@ -1,10 +1,10 @@
import { User } from '../../src/entity/user'
import { createTestUser, deleteTestUser } from '../db'
import { graphqlRequest, request } from '../util'
import { expect } from 'chai'
import supertest from 'supertest'
import { getRepository } from '../../src/entity'
import { ApiKey } from '../../src/entity/api_key'
import { User } from '../../src/entity/user'
import { getRepository } from '../../src/repository'
import { createTestUser, deleteTestUser } from '../db'
import { graphqlRequest, request } from '../util'
const testAPIKey = (apiKey: string): supertest.Test => {
const query = `

View File

@ -22,7 +22,6 @@ import {
PageContext,
PageType,
} from '../../src/elastic/types'
import { getRepository } from '../../src/entity'
import { UploadFile } from '../../src/entity/upload_file'
import { User } from '../../src/entity/user'
import {
@ -31,6 +30,7 @@ import {
UpdateReason,
UploadFileStatus,
} from '../../src/generated/graphql'
import { getRepository } from '../../src/repository'
import * as createTask from '../../src/utils/createTask'
import * as uploads from '../../src/utils/uploads'
import { createTestUser, deleteTestUser } from '../db'

View File

@ -2,10 +2,10 @@ import { expect } from 'chai'
import * as jwt from 'jsonwebtoken'
import 'mocha'
import sinon, { SinonFakeTimers } from 'sinon'
import { getRepository } from '../../src/entity'
import { Feature } from '../../src/entity/feature'
import { User } from '../../src/entity/user'
import { env } from '../../src/env'
import { getRepository } from '../../src/repository'
import { createTestUser, deleteTestUser } from '../db'
import { graphqlRequest, request } from '../util'

View File

@ -1,14 +1,14 @@
import chai, { expect } from 'chai'
import 'mocha'
import nock from 'nock'
import sinonChai from 'sinon-chai'
import { Integration } from '../../src/entity/integration'
import { User } from '../../src/entity/user'
import { SetIntegrationErrorCode } from '../../src/generated/graphql'
import { getRepository } from '../../src/repository'
import { READWISE_API_URL } from '../../src/services/integrations/readwise'
import { createTestUser, deleteTestIntegrations, deleteTestUser } from '../db'
import { generateFakeUuid, graphqlRequest, request } from '../util'
import { SetIntegrationErrorCode } from '../../src/generated/graphql'
import chai, { expect } from 'chai'
import { getRepository } from '../../src/entity'
import { Integration } from '../../src/entity/integration'
import nock from 'nock'
import { READWISE_API_URL } from '../../src/services/integrations/readwise'
import sinonChai from 'sinon-chai'
chai.use(sinonChai)

View File

@ -1,3 +1,21 @@
import { expect } from 'chai'
import 'mocha'
import { createPubSubClient } from '../../src/datalayer/pubsub'
import { refreshIndex } from '../../src/elastic'
import {
addHighlightToPage,
getHighlightById,
} from '../../src/elastic/highlights'
import { deletePage, getPageById } from '../../src/elastic/pages'
import {
Highlight,
HighlightType,
Page,
PageContext,
} from '../../src/elastic/types'
import { Label } from '../../src/entity/label'
import { User } from '../../src/entity/user'
import { getRepository } from '../../src/repository'
import {
createTestLabel,
createTestUser,
@ -10,24 +28,6 @@ import {
graphqlRequest,
request,
} from '../util'
import { Label } from '../../src/entity/label'
import { expect } from 'chai'
import 'mocha'
import { User } from '../../src/entity/user'
import {
Highlight,
HighlightType,
Page,
PageContext,
} from '../../src/elastic/types'
import { getRepository } from '../../src/entity'
import { deletePage, getPageById } from '../../src/elastic/pages'
import { createPubSubClient } from '../../src/datalayer/pubsub'
import {
addHighlightToPage,
getHighlightById,
} from '../../src/elastic/highlights'
import { refreshIndex } from '../../src/elastic'
describe('Labels API', () => {
let user: User

View File

@ -1,3 +1,12 @@
import { expect } from 'chai'
import 'mocha'
import { NewsletterEmail } from '../../src/entity/newsletter_email'
import { User } from '../../src/entity/user'
import {
DeleteNewsletterEmailErrorCode,
SubscriptionStatus,
} from '../../src/generated/graphql'
import { getRepository } from '../../src/repository'
import {
createTestNewsletterEmail,
createTestSubscription,
@ -6,15 +15,6 @@ import {
getNewsletterEmail,
} from '../db'
import { generateFakeUuid, graphqlRequest, request } from '../util'
import { NewsletterEmail } from '../../src/entity/newsletter_email'
import { User } from '../../src/entity/user'
import { expect } from 'chai'
import {
DeleteNewsletterEmailErrorCode,
SubscriptionStatus,
} from '../../src/generated/graphql'
import 'mocha'
import { getRepository } from '../../src/entity'
describe('Newsletters API', () => {
let user: User

View File

@ -1,13 +1,13 @@
import 'mocha'
import { expect } from 'chai'
import 'mocha'
import sinon from 'sinon'
import { NewsletterEmail } from '../../src/entity/newsletter_email'
import { ReceivedEmail } from '../../src/entity/received_email'
import { User } from '../../src/entity/user'
import { getRepository } from '../../src/repository'
import * as sendEmail from '../../src/utils/sendEmail'
import { createTestUser, deleteTestUser } from '../db'
import { graphqlRequest, request } from '../util'
import { getRepository } from '../../src/entity'
import { ReceivedEmail } from '../../src/entity/received_email'
import { NewsletterEmail } from '../../src/entity/newsletter_email'
import sinon from 'sinon'
import * as sendEmail from '../../src/utils/sendEmail'
describe('Recent Emails Resolver', () => {
const recentEmailsQuery = `

View File

@ -1,12 +1,12 @@
import 'mocha'
import { expect } from 'chai'
import { User } from '../../src/entity/user'
import 'mocha'
import { createPubSubClient } from '../../src/datalayer/pubsub'
import { PageContext } from '../../src/elastic/types'
import { SearchHistory } from '../../src/entity/search_history'
import { User } from '../../src/entity/user'
import { getRepository } from '../../src/repository'
import { createTestUser, deleteTestUser } from '../db'
import { graphqlRequest, request } from '../util'
import { createPubSubClient } from '../../src/datalayer/pubsub'
import { getRepository } from '../../src/entity'
import { SearchHistory } from '../../src/entity/search_history'
describe('recent_searches resolver', () => {
let user: User

View File

@ -22,7 +22,7 @@ import { DateTime } from 'luxon'
import 'mocha'
import { Page } from '../../src/elastic/types'
describe('Reminders API', () => {
xdescribe('Reminders API', () => {
let authToken: string
let page: Page
let reminder: Reminder

View File

@ -1,11 +1,11 @@
import { User } from '../../src/entity/user'
import { expect } from 'chai'
import { Page } from '../../src/elastic/types'
import { ContentDisplayReport } from '../../src/entity/reports/content_display_report'
import { User } from '../../src/entity/user'
import { ReportType } from '../../src/generated/graphql'
import { getRepository } from '../../src/repository'
import { createTestUser, deleteTestUser } from '../db'
import { createTestElasticPage, graphqlRequest, request } from '../util'
import { ReportType } from '../../src/generated/graphql'
import { ContentDisplayReport } from '../../src/entity/reports/content_display_report'
import { expect } from 'chai'
import { getRepository } from '../../src/entity'
describe('Report API', () => {
let user: User

View File

@ -1,10 +1,10 @@
import 'mocha'
import { expect } from 'chai'
import { graphqlRequest, request } from '../util'
import { User } from '../../src/entity/user'
import { createTestUser, deleteTestUser } from '../db'
import { getRepository } from '../../src/entity'
import 'mocha'
import { Rule, RuleAction, RuleActionType } from '../../src/entity/rule'
import { User } from '../../src/entity/user'
import { getRepository } from '../../src/repository'
import { createTestUser, deleteTestUser } from '../db'
import { graphqlRequest, request } from '../util'
describe('Rules Resolver', () => {
const username = 'fakeUser'

View File

@ -5,15 +5,15 @@ import sinonChai from 'sinon-chai'
import { NewsletterEmail } from '../../src/entity/newsletter_email'
import { Subscription } from '../../src/entity/subscription'
import { User } from '../../src/entity/user'
import { getRepository } from '../../src/entity'
import {
SubscriptionStatus,
SubscriptionType,
} from '../../src/generated/graphql'
import {
UNSUBSCRIBE_EMAIL_TEXT,
unsubscribe,
} from '../../src/services/subscriptions'
import { getRepository } from '../../src/repository'
import { UNSUBSCRIBE_EMAIL_TEXT } from '../../src/services/subscriptions'
import * as sendEmail from '../../src/utils/sendEmail'
import { createTestSubscription, createTestUser, deleteTestUser } from '../db'
import { graphqlRequest, request } from '../util'

View File

@ -1,3 +1,9 @@
import { expect } from 'chai'
import 'mocha'
import { User } from '../../src/entity/user'
import { UserDeviceToken } from '../../src/entity/user_device_tokens'
import { SetDeviceTokenErrorCode } from '../../src/generated/graphql'
import { getRepository } from '../../src/repository'
import {
createTestDeviceToken,
createTestUser,
@ -6,12 +12,6 @@ import {
getDeviceToken,
} from '../db'
import { generateFakeUuid, graphqlRequest, request } from '../util'
import { expect } from 'chai'
import { UserDeviceToken } from '../../src/entity/user_device_tokens'
import { SetDeviceTokenErrorCode } from '../../src/generated/graphql'
import 'mocha'
import { User } from '../../src/entity/user'
import { getRepository } from '../../src/entity'
describe('Device tokens API', () => {
let authToken: string

View File

@ -1,3 +1,11 @@
import { expect } from 'chai'
import 'mocha'
import { Highlight } from '../../src/entity/highlight'
import { Link } from '../../src/entity/link'
import { Page } from '../../src/entity/page'
import { User } from '../../src/entity/user'
import { SharedArticleErrorCode } from '../../src/generated/graphql'
import { getRepository } from '../../src/repository'
import {
createTestLink,
createTestPage,
@ -5,16 +13,8 @@ import {
deleteTestUser,
} from '../db'
import { graphqlRequest, request } from '../util'
import { expect } from 'chai'
import { SharedArticleErrorCode } from '../../src/generated/graphql'
import { Page } from '../../src/entity/page'
import { Link } from '../../src/entity/link'
import { Highlight } from '../../src/entity/highlight'
import 'mocha'
import { getRepository } from '../../src/entity'
import { User } from '../../src/entity/user'
describe('User feed article API', () => {
xdescribe('User feed article API', () => {
const existingUsername = 'fakeUser'
let user: User
let authToken: string

View File

@ -1,11 +1,11 @@
import { createTestUser, deleteTestUser } from '../db'
import { graphqlRequest, request } from '../util'
import { expect } from 'chai'
import 'mocha'
import { User } from '../../src/entity/user'
import { WebhookEvent } from '../../src/generated/graphql'
import { Webhook } from '../../src/entity/webhook'
import { getRepository } from '../../src/entity'
import { WebhookEvent } from '../../src/generated/graphql'
import { getRepository } from '../../src/repository'
import { createTestUser, deleteTestUser } from '../db'
import { graphqlRequest, request } from '../util'
describe('Webhooks API', () => {
let user: User

View File

@ -5,8 +5,8 @@ import sinonChai from 'sinon-chai'
import supertest from 'supertest'
import { StatusType } from '../../src/datalayer/user/model'
import { searchPages } from '../../src/elastic/pages'
import { getRepository } from '../../src/entity'
import { User } from '../../src/entity/user'
import { getRepository } from '../../src/repository'
import { AuthProvider } from '../../src/routers/auth/auth_types'
import { createPendingUserToken } from '../../src/routers/auth/jwt_helpers'
import {

View File

@ -1,19 +1,19 @@
import { expect } from 'chai'
import * as jwt from 'jsonwebtoken'
import 'mocha'
import sinon from 'sinon'
import { ReceivedEmail } from '../../src/entity/received_email'
import { User } from '../../src/entity/user'
import { getRepository } from '../../src/repository'
import * as parser from '../../src/utils/parser'
import * as sendEmail from '../../src/utils/sendEmail'
import * as sendNotification from '../../src/utils/sendNotification'
import {
createTestNewsletterEmail,
createTestUser,
deleteTestUser,
} from '../db'
import { User } from '../../src/entity/user'
import 'mocha'
import sinon from 'sinon'
import { expect } from 'chai'
import { request } from '../util'
import * as parser from '../../src/utils/parser'
import * as sendNotification from '../../src/utils/sendNotification'
import * as sendEmail from '../../src/utils/sendEmail'
import { getRepository } from '../../src/entity'
import { ReceivedEmail } from '../../src/entity/received_email'
import * as jwt from 'jsonwebtoken'
describe('Emails Router', () => {
const newsletterEmail = 'fakeUser@omnivore.app'

View File

@ -16,10 +16,10 @@ import {
Page,
PageContext,
} from '../../src/elastic/types'
import { getRepository } from '../../src/entity'
import { Integration, IntegrationType } from '../../src/entity/integration'
import { User } from '../../src/entity/user'
import { env } from '../../src/env'
import { getRepository } from '../../src/repository'
import { getHighlightUrl } from '../../src/services/highlights'
import { READWISE_API_URL } from '../../src/services/integrations/readwise'
import { createTestUser, deleteTestIntegrations, deleteTestUser } from '../db'

View File

@ -12,7 +12,7 @@ import { Reminder } from '../../src/entity/reminder'
import { expect } from 'chai'
import 'mocha'
describe('Reminders Router', () => {
xdescribe('Reminders Router', () => {
let authToken: string
let user: User
let reminder: Reminder

View File

@ -1,11 +1,11 @@
import { expect } from 'chai'
import 'mocha'
import nock from 'nock'
import { User } from '../../src/entity/user'
import { Webhook } from '../../src/entity/webhook'
import { getRepository } from '../../src/repository'
import { createTestUser, deleteTestUser } from '../db'
import { request } from '../util'
import { User } from '../../src/entity/user'
import 'mocha'
import { getRepository } from '../../src/entity'
import { Webhook } from '../../src/entity/webhook'
import { expect } from 'chai'
import nock from 'nock'
describe('Webhooks Router', () => {
const token = process.env.PUBSUB_VERIFICATION_TOKEN || ''

View File

@ -1,14 +1,14 @@
import 'mocha'
import chai, { expect } from 'chai'
import { createTestUser, deleteTestUser } from '../db'
import 'mocha'
import sinonChai from 'sinon-chai'
import { User } from '../../src/entity/user'
import { getRepository } from '../../src/entity'
import { ContentDisplayReport } from '../../src/entity/reports/content_display_report'
import { saveContentDisplayReport } from '../../src/services/reports'
import { ReportType } from '../../src/generated/graphql'
import { createTestElasticPage } from '../util'
import { Page } from '../../src/elastic/types'
import { ContentDisplayReport } from '../../src/entity/reports/content_display_report'
import { User } from '../../src/entity/user'
import { ReportType } from '../../src/generated/graphql'
import { getRepository } from '../../src/repository'
import { saveContentDisplayReport } from '../../src/services/reports'
import { createTestUser, deleteTestUser } from '../db'
import { createTestElasticPage } from '../util'
chai.use(sinonChai)

View File

@ -1,24 +1,22 @@
import 'mocha'
import { MailDataRequired } from '@sendgrid/helpers/classes/mail'
import chai, { expect } from 'chai'
import {
createTestUser,
createUserWithoutProfile, deleteFiltersFromUser,
deleteTestUser,
getProfile
} from "../db"
import { createGroup } from '../../src/services/groups'
import 'mocha'
import sinon from 'sinon'
import sinonChai from 'sinon-chai'
import { StatusType, User } from '../../src/entity/user'
import { getRepository } from '../../src/repository'
import {
getUserFollowers,
getUserFollowing,
} from '../../src/services/followers'
import sinonChai from 'sinon-chai'
import sinon from 'sinon'
import { createGroup } from '../../src/services/groups'
import * as util from '../../src/utils/sendEmail'
import { MailDataRequired } from '@sendgrid/helpers/classes/mail'
import { User } from '../../src/entity/user'
import { getRepository } from '../../src/entity/utils'
import { Filter } from "../../src/entity/filter"
import { getRepository } from '../../src/entity'
import {
createTestUser,
createUserWithoutProfile, deleteFiltersFromUser,
deleteTestUser,
getProfile,
} from '../db'
chai.use(sinonChai)
@ -70,10 +68,10 @@ describe('create user', () => {
const userFollowing = await getUserFollowing(user)
const adminUserFollowers = await getUserFollowers(adminUser)
const adminUserFollowing = await getUserFollowing(adminUser)
expect(userFollowers.map(u => u.id)).to.eql(admninIds)
expect(userFollowing.map(u => u.id)).to.eql(admninIds)
expect(adminUserFollowers.map(u => u.id)).to.eql(userIds)
expect(adminUserFollowing.map(u => u.id)).to.eql(userIds)
expect(userFollowers.map((u) => u.id)).to.eql(admninIds)
expect(userFollowing.map((u) => u.id)).to.eql(admninIds)
expect(adminUserFollowers.map((u) => u.id)).to.eql(userIds)
expect(adminUserFollowing.map((u) => u.id)).to.eql(userIds)
})
it('creates profile when user exists but profile not', async () => {

View File

@ -1,5 +1,11 @@
import 'mocha'
import { expect } from 'chai'
import 'mocha'
import { Label } from '../../src/entity/label'
import { Link } from '../../src/entity/link'
import { LinkLabel } from '../../src/entity/link_label'
import { User } from '../../src/entity/user'
import { getRepository } from '../../src/repository'
import { labelsLoader } from '../../src/services/labels'
import {
createTestLabel,
createTestLink,
@ -7,12 +13,6 @@ import {
createTestUser,
deleteTestUser,
} from '../db'
import { LinkLabel } from '../../src/entity/link_label'
import { Label } from '../../src/entity/label'
import { Link } from '../../src/entity/link'
import { labelsLoader } from '../../src/services/labels'
import { getRepository } from '../../src/entity'
import { User } from '../../src/entity/user'
describe('batch get labels from linkIds', () => {
let user: User

View File

@ -3,11 +3,11 @@ import 'mocha'
import nock from 'nock'
import { createPubSubClient } from '../../src/datalayer/pubsub'
import { getPageByParam } from '../../src/elastic/pages'
import { getRepository } from '../../src/entity'
import { NewsletterEmail } from '../../src/entity/newsletter_email'
import { ReceivedEmail } from '../../src/entity/received_email'
import { Subscription } from '../../src/entity/subscription'
import { User } from '../../src/entity/user'
import { getRepository } from '../../src/repository'
import { createNewsletterEmail } from '../../src/services/newsletters'
import { SaveContext } from '../../src/services/save_email'
import { saveNewsletterEmail } from '../../src/services/save_newsletter_email'