allow adding source of label when adding labels
This commit is contained in:
@ -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
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -1971,6 +1971,7 @@ input SetLabelsInput {
|
||||
labelIds: [ID!]
|
||||
labels: [CreateLabelInput!]
|
||||
pageId: ID!
|
||||
source: String
|
||||
}
|
||||
|
||||
union SetLabelsResult = SetLabelsError | SetLabelsSuccess
|
||||
|
||||
@ -359,8 +359,7 @@ export const createArticleResolver = authorized<
|
||||
libraryItemToReturn.id,
|
||||
uid,
|
||||
inputLabels,
|
||||
rssFeedUrl,
|
||||
pubsub
|
||||
rssFeedUrl
|
||||
)
|
||||
|
||||
log.info(
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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')
|
||||
|
||||
@ -1532,6 +1532,7 @@ const schema = gql`
|
||||
pageId: ID!
|
||||
labelIds: [ID!]
|
||||
labels: [CreateLabelInput!]
|
||||
source: String
|
||||
}
|
||||
|
||||
union SetLabelsResult = SetLabelsSuccess | SetLabelsError
|
||||
|
||||
@ -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 (
|
||||
|
||||
@ -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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user