allow adding source of label when adding labels

This commit is contained in:
Hongbo Wu
2023-12-13 16:25:25 +08:00
parent 56a7ae4dc1
commit dcd6e8bb60
9 changed files with 69 additions and 39 deletions

View File

@ -1,5 +1,15 @@
import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm'
// 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'
// for labels created by system, we use 'system'
type RuleSourceType = `rule:${string}`
export type LabelSource = 'user' | 'system' | RuleSourceType
export const isLabelSource = (source: string): source is LabelSource => {
return ['user', 'system'].indexOf(source) !== -1 || source.startsWith('rule:')
}
@Entity({ name: 'entity_labels' })
export class EntityLabel {
@PrimaryGeneratedColumn('uuid')
@ -14,6 +24,6 @@ export class EntityLabel {
@Column('uuid')
highlightId?: string | null
@Column('text')
source!: string
@Column('text', { default: 'user' })
source!: LabelSource
}

View File

@ -2539,6 +2539,7 @@ export type SetLabelsInput = {
labelIds?: InputMaybe<Array<Scalars['ID']>>;
labels?: InputMaybe<Array<CreateLabelInput>>;
pageId: Scalars['ID'];
source?: InputMaybe<Scalars['String']>;
};
export type SetLabelsResult = SetLabelsError | SetLabelsSuccess;

View File

@ -1971,6 +1971,7 @@ input SetLabelsInput {
labelIds: [ID!]
labels: [CreateLabelInput!]
pageId: ID!
source: String
}
union SetLabelsResult = SetLabelsError | SetLabelsSuccess

View File

@ -359,8 +359,7 @@ export const createArticleResolver = authorized<
libraryItemToReturn.id,
uid,
inputLabels,
rssFeedUrl,
pubsub
rssFeedUrl
)
log.info(

View File

@ -1,4 +1,5 @@
import { Between } from 'typeorm'
import { isLabelSource, LabelSource } from '../../entity/entity_label'
import { Label } from '../../entity/label'
import { env } from '../../env'
import {
@ -160,7 +161,7 @@ export const setLabelsResolver = authorized<
>(
async (
_,
{ input: { pageId, labelIds, labels } },
{ input: { pageId, labelIds, labels, source } },
{ uid, log, authTrx, pubsub }
) => {
if (!labelIds && !labels) {
@ -170,6 +171,21 @@ export const setLabelsResolver = authorized<
}
}
let labelSource: LabelSource | undefined
// check if source is valid
if (source) {
if (!isLabelSource(source)) {
log.error('invalid source', source)
return {
errorCodes: [SetLabelsErrorCode.BadRequest],
}
}
labelSource = source
}
try {
let labelsSet: Label[] = []
@ -191,7 +207,7 @@ export const setLabelsResolver = authorized<
}
// save labels in the library item
await saveLabelsInLibraryItem(labelsSet, pageId, uid, pubsub)
await saveLabelsInLibraryItem(labelsSet, pageId, uid, labelSource, pubsub)
analytics.track({
userId: uid,

View File

@ -71,9 +71,7 @@ export function followingServiceRouter() {
result.identifiers[0].id,
userId,
[{ name: 'RSS' }],
undefined,
undefined,
true
req.body.addedToFollowingBy
)
logger.info('RSS label added to the item')

View File

@ -1532,6 +1532,7 @@ const schema = gql`
pageId: ID!
labelIds: [ID!]
labels: [CreateLabelInput!]
source: String
}
union SetLabelsResult = SetLabelsSuccess | SetLabelsError

View File

@ -1,6 +1,6 @@
import { DeepPartial, FindOptionsWhere, In } from 'typeorm'
import { QueryDeepPartialEntity } from 'typeorm/query-builder/QueryPartialEntity'
import { EntityLabel } from '../entity/entity_label'
import { EntityLabel, LabelSource } from '../entity/entity_label'
import { Label } from '../entity/label'
import { LibraryItem } from '../entity/library_item'
import { createPubSubClient, EntityType, PubsubClient } from '../pubsub'
@ -11,6 +11,7 @@ import { libraryItemRepository } from '../repository/library_item'
type AddLabelsToLibraryItemEvent = {
pageId: string
labels: DeepPartial<Label>[]
source?: LabelSource
}
type AddLabelsToHighlightEvent = {
highlightId: string
@ -70,12 +71,13 @@ export const createAndSaveLabelsInLibraryItem = async (
userId: string,
labels?: CreateLabelInput[] | null,
rssFeedUrl?: string | null,
pubsub?: PubsubClient,
skipPubSub?: boolean
source?: LabelSource,
pubsub?: PubsubClient
) => {
if (rssFeedUrl) {
// add rss label to labels
labels = (labels || []).concat({ name: 'RSS' })
source = 'system'
}
// save labels in item
@ -86,8 +88,8 @@ export const createAndSaveLabelsInLibraryItem = async (
newLabels,
libraryItemId,
userId,
pubsub,
skipPubSub
source,
pubsub
)
}
}
@ -96,8 +98,8 @@ export const saveLabelsInLibraryItem = async (
labels: Label[],
libraryItemId: string,
userId: string,
pubsub = createPubSubClient(),
skipPubSub = false
source: LabelSource = 'user',
pubsub = createPubSubClient()
) => {
await authTrx(
async (tx) => {
@ -113,6 +115,7 @@ export const saveLabelsInLibraryItem = async (
labels.map((l) => ({
labelId: l.id,
libraryItemId,
source,
}))
)
},
@ -120,24 +123,22 @@ export const saveLabelsInLibraryItem = async (
userId
)
if (skipPubSub) {
return
if (source === 'user') {
// create pubsub event
await pubsub.entityCreated<AddLabelsToLibraryItemEvent>(
EntityType.LABEL,
{ pageId: libraryItemId, labels, source },
userId
)
}
// create pubsub event
await pubsub.entityCreated<AddLabelsToLibraryItemEvent>(
EntityType.LABEL,
{ pageId: libraryItemId, labels },
userId
)
}
export const addLabelsToLibraryItem = async (
labels: Label[],
libraryItemId: string,
userId: string,
pubsub = createPubSubClient(),
skipPubSub = false
source: LabelSource = 'user',
pubsub = createPubSubClient()
) => {
await authTrx(
async (tx) => {
@ -154,6 +155,7 @@ export const addLabelsToLibraryItem = async (
labels.map((l) => ({
labelId: l.id,
libraryItemId,
source,
}))
)
},
@ -161,16 +163,14 @@ export const addLabelsToLibraryItem = async (
userId
)
if (skipPubSub) {
return
if (source === 'user') {
// create pubsub event
await pubsub.entityCreated<AddLabelsToLibraryItemEvent>(
EntityType.LABEL,
{ pageId: libraryItemId, labels, source },
userId
)
}
// create pubsub event
await pubsub.entityCreated<AddLabelsToLibraryItemEvent>(
EntityType.LABEL,
{ pageId: libraryItemId, labels },
userId
)
}
export const saveLabelsInHighlight = async (

View File

@ -121,9 +121,13 @@ export const saveEmail = async (
}
// save newsletter label in the item
await createAndSaveLabelsInLibraryItem(newLibraryItem.id, input.userId, [
{ name: 'Newsletter' },
])
await createAndSaveLabelsInLibraryItem(
newLibraryItem.id,
input.userId,
[{ name: 'Newsletter' }],
undefined,
'system'
)
await updateReceivedEmail(input.receivedEmailId, 'article', input.userId)