return source of the labels tagged to an item

This commit is contained in:
Hongbo Wu 2023-12-14 10:40:18 +08:00
parent 1f421b3ebc
commit 06e17e2eb8
6 changed files with 38 additions and 21 deletions

View file

@ -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

View file

@ -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>;
};

View file

@ -975,6 +975,7 @@ type Label {
internal: Boolean
name: String!
position: Int
source: String
}
type LabelsError {

View file

@ -1446,6 +1446,7 @@ const schema = gql`
createdAt: Date
position: Int
internal: Boolean
source: String
}
type LabelsSuccess {

View file

@ -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
)

View file

@ -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)
})
})