omnivore/packages/api/test/db.ts

195 lines
5 KiB
TypeScript
Raw Normal View History

2023-09-07 04:35:05 +00:00
import { DeepPartial } from 'typeorm'
2023-08-30 09:29:47 +00:00
import { appDataSource } from '../src/data_source'
2024-01-31 11:10:57 +00:00
import { EntityLabel, LabelSource } from '../src/entity/entity_label'
2023-09-14 03:22:27 +00:00
import { Filter } from '../src/entity/filter'
2024-01-31 11:10:57 +00:00
import { Highlight } from '../src/entity/highlight'
import { Label } from '../src/entity/label'
2023-09-07 04:35:05 +00:00
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'
2024-01-31 11:10:57 +00:00
import { authTrx, getRepository, setClaims } from '../src/repository'
import { highlightRepository } from '../src/repository/highlight'
2023-09-06 11:31:34 +00:00
import { userRepository } from '../src/repository/user'
import { createUser } from '../src/services/create_user'
2024-02-06 05:02:12 +00:00
import { createOrUpdateLibraryItem } from '../src/services/library_item'
2023-09-07 04:35:05 +00:00
import { createDeviceToken } from '../src/services/user_device_tokens'
2024-01-31 11:10:57 +00:00
import {
bulkEnqueueUpdateLabels,
enqueueUpdateHighlight,
} from '../src/utils/createTask'
import { generateFakeUuid, waitUntilJobsDone } from './util'
2022-02-11 17:24:33 +00:00
export const createTestConnection = async (): Promise<void> => {
2023-08-30 09:29:47 +00:00
appDataSource.setOptions({
2022-02-11 17:24:33 +00:00
type: 'postgres',
host: process.env.PG_HOST,
port: Number(process.env.PG_PORT),
schema: 'omnivore',
username: process.env.PG_USER,
password: process.env.PG_PASSWORD,
database: process.env.PG_DB,
logging: ['query', 'info'],
entities: [__dirname + '/../src/entity/**/*{.js,.ts}'],
subscribers: [__dirname + '/../src/events/**/*{.js,.ts}'],
logger: process.env.PG_LOGGER as
| 'advanced-console'
| 'simple-console'
| 'file'
| 'debug'
| undefined,
2022-02-11 17:24:33 +00:00
})
2023-08-30 09:29:47 +00:00
await appDataSource.initialize()
2022-02-11 17:24:33 +00:00
}
2023-09-01 15:42:33 +00:00
export const deleteFiltersFromUser = async (userId: string) => {
2023-10-10 02:10:45 +00:00
await appDataSource.transaction(async (t) => {
2023-09-01 15:42:33 +00:00
await setClaims(t, userId)
2023-09-14 03:22:27 +00:00
const filterRepo = t.getRepository(Filter)
2023-09-01 15:42:33 +00:00
2023-09-14 03:22:27 +00:00
const userFilters = await filterRepo.findBy({ user: { id: userId } })
2023-09-01 15:42:33 +00:00
2023-09-14 03:22:27 +00:00
await Promise.all(
userFilters.map((filter) => {
return filterRepo.delete(filter.id)
})
)
2023-09-01 15:42:33 +00:00
})
}
2022-02-11 17:24:33 +00:00
export const createTestUser = async (
name: string,
invite?: string | undefined,
password?: string,
pendingConfirmation?: boolean
2022-02-11 17:24:33 +00:00
): Promise<User> => {
const [newUser] = await createUser({
provider: 'GOOGLE',
sourceUserId: 'fake-user-id-' + name,
email: `${name}@omnivore.app`,
2022-02-11 17:24:33 +00:00
username: name,
bio: `i am ${name}`,
name: name,
inviteCode: invite,
password: password,
pendingConfirmation,
2022-02-11 17:24:33 +00:00
})
2022-02-11 17:24:33 +00:00
return newUser
}
export const createUserWithoutProfile = async (name: string): Promise<User> => {
2023-09-07 04:35:05 +00:00
return userRepository.save({
source: 'GOOGLE',
sourceUserId: 'fake-user-id-' + name,
email: `${name}@omnivore.app`,
name: name,
})
2022-02-11 17:24:33 +00:00
}
export const createTestReminder = async (
user: User,
2022-04-14 05:22:21 +00:00
pageId?: string
2022-02-11 17:24:33 +00:00
): Promise<Reminder> => {
return getRepository(Reminder).save({
user: user,
2022-04-14 05:22:21 +00:00
elasticPageId: pageId,
remindAt: new Date(),
})
2022-02-11 17:24:33 +00:00
}
export const getReminder = async (id: string): Promise<Reminder | null> => {
return getRepository(Reminder).findOneBy({ id })
2022-02-11 17:24:33 +00:00
}
export const createTestDeviceToken = async (
user: User
): Promise<UserDeviceToken> => {
2023-09-07 04:35:05 +00:00
return createDeviceToken(user.id, 'fake-token')
2022-02-11 17:24:33 +00:00
}
2023-09-07 04:35:05 +00:00
export const createTestLibraryItem = async (
2022-10-13 06:13:59 +00:00
userId: string,
2023-09-07 04:35:05 +00:00
labels?: Label[]
): Promise<LibraryItem> => {
2024-01-22 03:04:11 +00:00
const item = {
2023-09-07 04:35:05 +00:00
user: { id: userId },
title: 'test title',
originalContent: '<p>test content</p>',
2023-09-07 08:43:24 +00:00
originalUrl: `https://blog.omnivore.app/test-url-${generateFakeUuid()}`,
2023-09-07 04:35:05 +00:00
slug: 'test-with-omnivore',
}
2022-11-24 05:38:13 +00:00
2024-02-06 05:02:12 +00:00
const createdItem = await createOrUpdateLibraryItem(item, userId)
2023-09-07 08:43:24 +00:00
if (labels) {
await saveLabelsInLibraryItem(labels, createdItem.id, userId)
}
return createdItem
2022-11-24 05:38:13 +00:00
}
2024-01-31 11:10:57 +00:00
export const saveLabelsInLibraryItem = async (
labels: Label[],
libraryItemId: string,
userId: string,
source: LabelSource = 'user'
) => {
await authTrx(
async (tx) => {
const repo = tx.getRepository(EntityLabel)
// delete existing labels
await repo.delete({
libraryItemId,
})
// save new labels
await repo.save(
labels.map((l) => ({
labelId: l.id,
libraryItemId,
source,
}))
)
},
undefined,
userId
)
// update labels in library item
const jobs = await bulkEnqueueUpdateLabels([{ libraryItemId, userId }])
await waitUntilJobsDone(jobs)
}
export const createHighlight = async (
highlight: DeepPartial<Highlight>,
libraryItemId: string,
userId: string
) => {
const newHighlight = await authTrx(
async (tx) => {
const repo = tx.withRepository(highlightRepository)
const newHighlight = await repo.createAndSave(highlight)
return repo.findOneOrFail({
where: { id: newHighlight.id },
relations: {
user: true,
},
})
},
undefined,
userId
)
const job = await enqueueUpdateHighlight({
libraryItemId,
userId,
})
if (job) {
await waitUntilJobsDone([job])
}
return newHighlight
}