From 6672ca0109a47b9ab27787ff5eabc9f53591b5eb Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Thu, 7 Sep 2023 22:21:20 +0800 Subject: [PATCH] fix labels tests --- packages/api/src/entity/highlight.ts | 4 +- packages/api/src/resolvers/labels/index.ts | 64 ++++++++------------- packages/api/src/resolvers/rules/index.ts | 58 ++++--------------- packages/api/src/services/labels.ts | 18 ++++++ packages/api/src/services/rules.ts | 34 +++++++++-- packages/api/test/resolvers/article.test.ts | 1 + packages/api/test/resolvers/labels.test.ts | 30 +++++----- packages/api/test/resolvers/rules.test.ts | 40 +++++-------- 8 files changed, 114 insertions(+), 135 deletions(-) diff --git a/packages/api/src/entity/highlight.ts b/packages/api/src/entity/highlight.ts index f4bae6d38..8147fa2d5 100644 --- a/packages/api/src/entity/highlight.ts +++ b/packages/api/src/entity/highlight.ts @@ -31,7 +31,7 @@ export class Highlight { @JoinColumn({ name: 'user_id' }) user!: User - @ManyToOne(() => LibraryItem, { onDelete: 'CASCADE', eager: true }) + @ManyToOne(() => LibraryItem, { onDelete: 'CASCADE' }) @JoinColumn({ name: 'library_item_id' }) libraryItem!: LibraryItem @@ -80,7 +80,7 @@ export class Highlight { @Column('text', { nullable: true }) color?: string | null - @ManyToMany(() => Label, { cascade: true }) + @ManyToMany(() => Label, { cascade: true, eager: true }) @JoinTable({ name: 'entity_labels', joinColumn: { name: 'highlight_id' }, diff --git a/packages/api/src/resolvers/labels/index.ts b/packages/api/src/resolvers/labels/index.ts index ad17b4b3d..4890a5987 100644 --- a/packages/api/src/resolvers/labels/index.ts +++ b/packages/api/src/resolvers/labels/index.ts @@ -32,6 +32,7 @@ import { findOrCreateLabels, saveLabelsInHighlight, saveLabelsInLibraryItem, + updateLabel, } from '../../services/labels' import { analytics } from '../../utils/analytics' import { authorized } from '../../utils/helpers' @@ -40,7 +41,7 @@ export const labelsResolver = authorized( async (_obj, _params, { log, authTrx }) => { try { const labels = await authTrx(async (tx) => { - return tx.find(Label, { + return tx.withRepository(labelRepository).find({ order: { position: 'ASC', }, @@ -96,7 +97,7 @@ export const createLabelResolver = authorized< } catch (error) { log.error('createLabelResolver', error) return { - errorCodes: [CreateLabelErrorCode.LabelAlreadyExists], + errorCodes: [CreateLabelErrorCode.BadRequest], } } }) @@ -170,7 +171,14 @@ export const setLabelsResolver = authorized< labelsSet = await authTrx(async (tx) => { return tx.withRepository(labelRepository).findLabelsById(labelIds) }) + + if (labelsSet.length !== labelIds.length) { + return { + errorCodes: [SetLabelsErrorCode.NotFound], + } + } } + // save labels in the library item await saveLabelsInLibraryItem(labelsSet, pageId, uid, pubsub) @@ -190,7 +198,7 @@ export const setLabelsResolver = authorized< } catch (error) { log.error('setLabelsResolver error', error) return { - errorCodes: [SetLabelsErrorCode.NotFound], + errorCodes: [SetLabelsErrorCode.BadRequest], } } } @@ -200,44 +208,18 @@ export const updateLabelResolver = authorized< UpdateLabelSuccess, UpdateLabelError, MutationUpdateLabelArgs ->( - async ( - _, - { input: { name, color, description, labelId } }, - { authTrx, log } - ) => { - try { - log.info('Updating a label', { - labels: { - source: 'resolver', - resolver: 'updateLabelResolver', - }, - }) +>(async (_, { input: { name, color, description, labelId } }, { uid, log }) => { + try { + const label = await updateLabel(labelId, { name, color, description }, uid) - const result = await authTrx(async (tx) => { - return tx.withRepository(labelRepository).updateLabel(labelId, { - name, - color, - description, - }) - }) - - if (!result.affected) { - log.error('failed to update') - return { - errorCodes: [UpdateLabelErrorCode.NotFound], - } - } - - return { label: result.raw as Label } - } catch (error) { - log.error('error updating label', error) - return { - errorCodes: [UpdateLabelErrorCode.BadRequest], - } + return { label } + } catch (error) { + log.error('error updating label', error) + return { + errorCodes: [UpdateLabelErrorCode.BadRequest], } } -) +}) export const setLabelsForHighlightResolver = authorized< SetLabelsSuccess, @@ -291,7 +273,7 @@ export const setLabelsForHighlightResolver = authorized< } catch (error) { log.error('setLabelsForHighlightResolver error', error) return { - errorCodes: [SetLabelsErrorCode.NotFound], + errorCodes: [SetLabelsErrorCode.BadRequest], } } }) @@ -323,7 +305,7 @@ export const moveLabelResolver = authorized< let newPosition = 1 if (afterLabelId) { const afterLabel = await authTrx(async (tx) => { - return tx.withRepository(labelRepository).findById(labelId) + return tx.withRepository(labelRepository).findById(afterLabelId) }) if (!afterLabel) { return { @@ -356,7 +338,7 @@ export const moveLabelResolver = authorized< // update the position of the label return labelRepo.save({ - ...label, + id: labelId, position: newPosition, }) }) diff --git a/packages/api/src/resolvers/rules/index.ts b/packages/api/src/resolvers/rules/index.ts index c60bee99f..fbc6b7926 100644 --- a/packages/api/src/resolvers/rules/index.ts +++ b/packages/api/src/resolvers/rules/index.ts @@ -13,7 +13,7 @@ import { SetRuleErrorCode, SetRuleSuccess, } from '../../generated/graphql' -import { getRepository } from '../../repository' +import { deleteRule } from '../../services/rules' import { authorized } from '../../utils/helpers' export const setRuleResolver = authorized< @@ -46,25 +46,19 @@ export const rulesResolver = authorized< RulesSuccess, RulesError, QueryRulesArgs ->(async (_, { enabled }, { claims, log }) => { +>(async (_, { enabled }, { authTrx, log }) => { try { - const rules = await getRepository(Rule).findBy({ - user: { id: claims.uid }, - enabled: enabled === null ? undefined : enabled, - }) + const rules = await authTrx((t) => + t.getRepository(Rule).findBy({ + enabled: enabled === null ? undefined : enabled, + }) + ) return { rules, } } catch (error) { - log.error('Error getting rules', { - error, - labels: { - source: 'resolver', - resolver: 'rulesResolver', - uid: claims.uid, - }, - }) + log.error('Error getting rules', error) return { errorCodes: [RulesErrorCode.BadRequest], @@ -76,46 +70,18 @@ export const deleteRuleResolver = authorized< DeleteRuleSuccess, DeleteRuleError, MutationDeleteRuleArgs ->(async (_, { id }, { claims, log }) => { - log.info('Deleting rule', { - id, - labels: { - source: 'resolver', - resolver: 'deleteRuleResolver', - uid: claims.uid, - }, - }) - +>(async (_, { id }, { uid, log }) => { try { - const rule = await getRepository(Rule).findOneBy({ - id, - user: { id: claims.uid }, - }) - if (!rule) { - return { - errorCodes: [DeleteRuleErrorCode.NotFound], - } - } - - await getRepository(Rule).delete({ - id: rule.id, - }) + const rule = await deleteRule(id, uid) return { rule, } } catch (error) { - log.error('Error deleting rule', { - error, - labels: { - source: 'resolver', - resolver: 'deleteRuleResolver', - uid: claims.uid, - }, - }) + log.error('Error deleting rule', error) return { - errorCodes: [DeleteRuleErrorCode.BadRequest], + errorCodes: [DeleteRuleErrorCode.NotFound], } } }) diff --git a/packages/api/src/services/labels.ts b/packages/api/src/services/labels.ts index 85881d27e..fa6eb8dd5 100644 --- a/packages/api/src/services/labels.ts +++ b/packages/api/src/services/labels.ts @@ -1,4 +1,5 @@ import { FindOptionsWhere, In } from 'typeorm' +import { QueryDeepPartialEntity } from 'typeorm/query-builder/QueryPartialEntity' import { EntityLabel } from '../entity/entity_label' import { Label } from '../entity/label' import { createPubSubClient, EntityType } from '../pubsub' @@ -172,3 +173,20 @@ export const deleteLabels = async ( userId ) } + +export const updateLabel = async ( + id: string, + label: QueryDeepPartialEntity