mirror of
https://github.com/omnivore-app/omnivore.git
synced 2026-03-11 08:54:26 +00:00
return source of the labels tagged to an item
This commit is contained in:
parent
1f421b3ebc
commit
06e17e2eb8
6 changed files with 38 additions and 21 deletions
|
|
@ -1,4 +1,11 @@
|
|||
import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm'
|
||||
import {
|
||||
Column,
|
||||
Entity,
|
||||
JoinColumn,
|
||||
ManyToOne,
|
||||
PrimaryGeneratedColumn,
|
||||
} from 'typeorm'
|
||||
import { Label } from './label'
|
||||
|
||||
// for labels created by rules, we use the rule name as the source, for example: 'rule:my-rule'
|
||||
// for labels created by users, we use 'user'
|
||||
|
|
@ -18,6 +25,10 @@ export class EntityLabel {
|
|||
@Column('uuid')
|
||||
labelId!: string
|
||||
|
||||
@ManyToOne(() => Label)
|
||||
@JoinColumn({ name: 'label_id' })
|
||||
label!: Label
|
||||
|
||||
@Column('uuid')
|
||||
libraryItemId?: string | null
|
||||
|
||||
|
|
|
|||
|
|
@ -1091,6 +1091,7 @@ export type Label = {
|
|||
internal?: Maybe<Scalars['Boolean']>;
|
||||
name: Scalars['String'];
|
||||
position?: Maybe<Scalars['Int']>;
|
||||
source?: Maybe<Scalars['String']>;
|
||||
};
|
||||
|
||||
export type LabelsError = {
|
||||
|
|
@ -5181,6 +5182,7 @@ export type LabelResolvers<ContextType = ResolverContext, ParentType extends Res
|
|||
internal?: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;
|
||||
name?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
|
||||
position?: Resolver<Maybe<ResolversTypes['Int']>, ParentType, ContextType>;
|
||||
source?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
|
||||
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -975,6 +975,7 @@ type Label {
|
|||
internal: Boolean
|
||||
name: String!
|
||||
position: Int
|
||||
source: String
|
||||
}
|
||||
|
||||
type LabelsError {
|
||||
|
|
|
|||
|
|
@ -1446,6 +1446,7 @@ const schema = gql`
|
|||
createdAt: Date
|
||||
position: Int
|
||||
internal: Boolean
|
||||
source: String
|
||||
}
|
||||
|
||||
type LabelsSuccess {
|
||||
|
|
|
|||
|
|
@ -287,23 +287,19 @@ export const findLabelById = async (id: string, userId: string) => {
|
|||
export const findLabelsByLibraryItemId = async (
|
||||
libraryItemId: string,
|
||||
userId: string
|
||||
) => {
|
||||
): Promise<(Label & { source: string })[]> => {
|
||||
return authTrx(
|
||||
async (tx) =>
|
||||
tx
|
||||
.createQueryBuilder(Label, 'label')
|
||||
.innerJoin(
|
||||
EntityLabel,
|
||||
'entityLabel',
|
||||
'entityLabel.label_id = label.id'
|
||||
)
|
||||
.innerJoin(
|
||||
LibraryItem,
|
||||
'LibraryItem',
|
||||
'LibraryItem.id = entityLabel.library_item_id'
|
||||
)
|
||||
.where('LibraryItem.id = :libraryItemId', { libraryItemId })
|
||||
.getMany(),
|
||||
async (tx) => {
|
||||
const entityLabels = await tx.getRepository(EntityLabel).find({
|
||||
where: { libraryItemId },
|
||||
relations: ['label'],
|
||||
})
|
||||
|
||||
return entityLabels.map((el) => ({
|
||||
...el.label,
|
||||
source: el.source,
|
||||
}))
|
||||
},
|
||||
undefined,
|
||||
userId
|
||||
)
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@ import {
|
|||
createLabel,
|
||||
deleteLabels,
|
||||
findLabelById,
|
||||
findLabelsByLibraryItemId,
|
||||
findLabelsByUserId,
|
||||
saveLabelsInHighlight,
|
||||
} from '../../src/services/labels'
|
||||
|
|
@ -320,6 +321,7 @@ describe('Labels API', () => {
|
|||
let labelIds: string[] = []
|
||||
let labels: Label[]
|
||||
let item: LibraryItem
|
||||
let source: string
|
||||
|
||||
before(async () => {
|
||||
// create testing labels
|
||||
|
|
@ -327,6 +329,7 @@ describe('Labels API', () => {
|
|||
const label2 = await createLabel('label_2', '#eeeeee', user.id)
|
||||
labels = [label1, label2]
|
||||
item = await createTestLibraryItem(user.id)
|
||||
source = 'user'
|
||||
})
|
||||
|
||||
after(async () => {
|
||||
|
|
@ -347,7 +350,8 @@ describe('Labels API', () => {
|
|||
labelIds: [
|
||||
"${labelIds[0]}",
|
||||
"${labelIds[1]}"
|
||||
]
|
||||
],
|
||||
source: "${source}"
|
||||
}
|
||||
) {
|
||||
... on SetLabelsSuccess {
|
||||
|
|
@ -368,12 +372,14 @@ describe('Labels API', () => {
|
|||
before(() => {
|
||||
itemId = item.id
|
||||
labelIds = [labels[0].id, labels[1].id]
|
||||
source = 'rule:my-rule'
|
||||
})
|
||||
|
||||
it('should set labels', async () => {
|
||||
it('sets labels', async () => {
|
||||
await graphqlRequest(query, authToken).expect(200)
|
||||
const page = await findLibraryItemById(itemId, user.id)
|
||||
expect(page?.labels?.map((l) => l.id)).to.eql(labelIds)
|
||||
const labels = await findLabelsByLibraryItemId(itemId, user.id)
|
||||
expect(labels.map((l) => l.id)).to.eql(labelIds)
|
||||
expect(labels[0].source).to.eql(source)
|
||||
})
|
||||
})
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue