diff --git a/packages/api/src/entity/entity_label.ts b/packages/api/src/entity/entity_label.ts index 44e061faa..392a4e121 100644 --- a/packages/api/src/entity/entity_label.ts +++ b/packages/api/src/entity/entity_label.ts @@ -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 diff --git a/packages/api/src/generated/graphql.ts b/packages/api/src/generated/graphql.ts index c015e3a43..a3d814b9f 100644 --- a/packages/api/src/generated/graphql.ts +++ b/packages/api/src/generated/graphql.ts @@ -1091,6 +1091,7 @@ export type Label = { internal?: Maybe; name: Scalars['String']; position?: Maybe; + source?: Maybe; }; export type LabelsError = { @@ -5181,6 +5182,7 @@ export type LabelResolvers, ParentType, ContextType>; name?: Resolver; position?: Resolver, ParentType, ContextType>; + source?: Resolver, ParentType, ContextType>; __isTypeOf?: IsTypeOfResolverFn; }; diff --git a/packages/api/src/generated/schema.graphql b/packages/api/src/generated/schema.graphql index 1dc9c76b0..e57928d48 100644 --- a/packages/api/src/generated/schema.graphql +++ b/packages/api/src/generated/schema.graphql @@ -975,6 +975,7 @@ type Label { internal: Boolean name: String! position: Int + source: String } type LabelsError { diff --git a/packages/api/src/schema.ts b/packages/api/src/schema.ts index 6c9332167..fc6828362 100755 --- a/packages/api/src/schema.ts +++ b/packages/api/src/schema.ts @@ -1446,6 +1446,7 @@ const schema = gql` createdAt: Date position: Int internal: Boolean + source: String } type LabelsSuccess { diff --git a/packages/api/src/services/labels.ts b/packages/api/src/services/labels.ts index 86b9c6297..9e8a508c8 100644 --- a/packages/api/src/services/labels.ts +++ b/packages/api/src/services/labels.ts @@ -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 ) diff --git a/packages/api/test/resolvers/labels.test.ts b/packages/api/test/resolvers/labels.test.ts index 4ca69ca07..22f8cdf4c 100644 --- a/packages/api/test/resolvers/labels.test.ts +++ b/packages/api/test/resolvers/labels.test.ts @@ -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) }) })