Browse Source

feat(server): Implement create / update for FacetValues

Michael Bromley 7 years ago
parent
commit
d19596697b

File diff suppressed because it is too large
+ 0 - 0
schema.json


+ 4 - 0
server/src/api/facet/facet.api.graphql

@@ -8,6 +8,10 @@ type Mutation {
     createFacet(input: CreateFacetInput): Facet!
     "Update an existing Facet"
     updateFacet(input: UpdateFacetInput): Facet!
+    "Create one or more FacetValues"
+    createFacetValues(input: [CreateFacetValueInput!]!): [FacetValue!]!
+    "Update one or more FacetValues"
+    updateFacetValues(input: [UpdateFacetValueInput!]!): [FacetValue!]!
 }
 
 type FacetList implements PaginatedList {

+ 22 - 0
server/src/api/facet/facet.resolver.ts

@@ -1,7 +1,10 @@
 import { Mutation, Query, Resolver } from '@nestjs/graphql';
 
 import { PaginatedList } from '../../../../shared/shared-types';
+import { DEFAULT_LANGUAGE_CODE } from '../../common/constants';
+import { FacetValue } from '../../entity/facet-value/facet-value.entity';
 import { Facet } from '../../entity/facet/facet.entity';
+import { I18nError } from '../../i18n/i18n-error';
 import { Translated } from '../../locale/locale-types';
 import { FacetValueService } from '../../service/facet-value.service';
 import { FacetService } from '../../service/facet.service';
@@ -44,4 +47,23 @@ export class FacetResolver {
         const { input } = args;
         return this.facetService.update(args.input);
     }
+
+    @Mutation()
+    @ApplyIdCodec()
+    async createFacetValues(_, args): Promise<Translated<FacetValue[]>> {
+        const { input } = args;
+        const facetId = input[0].facetId;
+        const facet = await this.facetService.findOne(facetId, DEFAULT_LANGUAGE_CODE);
+        if (!facet) {
+            throw new I18nError(`error.invalid-facetId`, { facetId });
+        }
+        return input.map(facetValue => this.facetValueService.create(facet, facetValue));
+    }
+
+    @Mutation()
+    @ApplyIdCodec()
+    async updateFacetValues(_, args): Promise<Translated<FacetValue[]>> {
+        const { input } = args;
+        return input.map(facetValue => this.facetValueService.update(facetValue));
+    }
 }

+ 7 - 0
server/src/entity/facet-value/facet-value.dto.ts

@@ -1,7 +1,14 @@
+import { ID } from '../../../../shared/shared-types';
 import { TranslatedInput } from '../../locale/locale-types';
 
 import { FacetValue } from './facet-value.entity';
 
 export interface CreateFacetValueDto extends TranslatedInput<FacetValue> {
+    facetId: ID;
+    code: string;
+}
+
+export interface UpdateFacetValueDto extends TranslatedInput<FacetValue> {
+    id: ID;
     code: string;
 }

+ 1 - 2
server/src/entity/facet-value/facet-value.entity.ts

@@ -15,8 +15,7 @@ export class FacetValue extends VendureEntity implements Translatable, HasCustom
     }
     name: LocaleString;
 
-    @Column({ unique: true })
-    code: string;
+    @Column() code: string;
 
     @OneToMany(type => FacetValueTranslation, translation => translation.base, { eager: true })
     translations: Array<Translation<FacetValue>>;

+ 7 - 0
server/src/entity/facet-value/facet-value.graphql

@@ -23,6 +23,13 @@ input FacetValueTranslationInput {
 }
 
 input CreateFacetValueInput {
+    facetId: ID!
+    code: String!
+    translations: [FacetValueTranslationInput!]!
+}
+
+input UpdateFacetValueInput {
+    id: ID!
     code: String!
     translations: [FacetValueTranslationInput!]!
 }

+ 1 - 0
server/src/i18n/messages/en.json

@@ -2,6 +2,7 @@
   "error": {
     "customer-with-id-not-found": "No customer with the id { customerId } was found",
     "entity-has-no-translation-in-language": "Translatable entity '{ entityName }' has not been translated into the requested language ({ languageCode })",
+    "invalid-facetId": "The facetId '{ facetId }' was not found",
     "invalid-sort-field": "The sort field '{ fieldName }' is invalid. Valid fields are: { validFields }"
   }
 }

+ 21 - 2
server/src/service/facet-value.service.ts

@@ -6,16 +6,20 @@ import { ID } from '../../../shared/shared-types';
 import { DEFAULT_LANGUAGE_CODE } from '../common/constants';
 import { assertFound } from '../common/utils';
 import { FacetValueTranslation } from '../entity/facet-value/facet-value-translation.entity';
-import { CreateFacetValueDto } from '../entity/facet-value/facet-value.dto';
+import { CreateFacetValueDto, UpdateFacetValueDto } from '../entity/facet-value/facet-value.dto';
 import { FacetValue } from '../entity/facet-value/facet-value.entity';
 import { Facet } from '../entity/facet/facet.entity';
 import { LanguageCode } from '../locale/language-code';
 import { Translated } from '../locale/locale-types';
 import { translateDeep } from '../locale/translate-entity';
+import { TranslationUpdaterService } from '../locale/translation-updater.service';
 
 @Injectable()
 export class FacetValueService {
-    constructor(@InjectConnection() private connection: Connection) {}
+    constructor(
+        @InjectConnection() private connection: Connection,
+        private translationUpdaterService: TranslationUpdaterService,
+    ) {}
 
     findAll(lang: LanguageCode): Promise<Array<Translated<FacetValue>>> {
         return this.connection.manager
@@ -49,4 +53,19 @@ export class FacetValueService {
 
         return assertFound(this.findOne(createdGroup.id, DEFAULT_LANGUAGE_CODE));
     }
+
+    async update(updateFacetValueDto: UpdateFacetValueDto): Promise<Translated<FacetValue>> {
+        const existingTranslations = await this.connection.getRepository(FacetValueTranslation).find({
+            where: { base: updateFacetValueDto.id },
+            relations: ['base'],
+        });
+
+        const translationUpdater = this.translationUpdaterService.create(FacetValueTranslation);
+        const diff = translationUpdater.diff(existingTranslations, updateFacetValueDto.translations);
+
+        const facetValue = await translationUpdater.applyDiff(new FacetValue(updateFacetValueDto), diff);
+        await this.connection.manager.save(facetValue);
+
+        return assertFound(this.findOne(facetValue.id, DEFAULT_LANGUAGE_CODE));
+    }
 }

Some files were not shown because too many files changed in this diff