Explorar el Código

refactor(server): Move ID codec into a service for easier reuse

Michael Bromley hace 7 años
padre
commit
7e82f290b5

+ 2 - 1
server/src/api/api.module.ts

@@ -1,12 +1,12 @@
 import { Module } from '@nestjs/common';
 import { APP_GUARD, APP_INTERCEPTOR } from '@nestjs/core';
 import { GraphQLModule } from '@nestjs/graphql';
-import { QueryResolvers } from 'shared/generated-types';
 
 import { ConfigModule } from '../config/config.module';
 import { I18nModule } from '../i18n/i18n.module';
 import { ServiceModule } from '../service/service.module';
 
+import { IdCodecService } from './common/id-codec.service';
 import { RequestContextService } from './common/request-context.service';
 import { GraphqlConfigService } from './config/graphql-config.service';
 import { AssetInterceptor } from './middleware/asset-interceptor';
@@ -70,6 +70,7 @@ const exportedProviders = [
     providers: [
         ...exportedProviders,
         RequestContextService,
+        IdCodecService,
         {
             provide: APP_GUARD,
             useClass: AuthGuard,

+ 22 - 0
server/src/api/common/id-codec.service.ts

@@ -0,0 +1,22 @@
+import { Injectable } from '@nestjs/common';
+import { ID } from 'shared/shared-types';
+
+import { ConfigService } from '../../config/config.service';
+
+import { IdCodec } from './id-codec';
+
+@Injectable()
+export class IdCodecService {
+    private idCodec: IdCodec;
+    constructor(configService: ConfigService) {
+        this.idCodec = new IdCodec(configService.entityIdStrategy);
+    }
+
+    encode(target: any, transformKeys?: string[]): string {
+        return this.idCodec.encode(target, transformKeys);
+    }
+
+    decode(target: any, transformKeys?: string[]): ID {
+        return this.idCodec.decode(target, transformKeys);
+    }
+}

+ 4 - 10
server/src/api/middleware/id-interceptor.ts

@@ -4,11 +4,9 @@ import { GqlExecutionContext } from '@nestjs/graphql';
 import { Observable } from 'rxjs';
 import { map } from 'rxjs/operators';
 
-import { ConfigService } from '../../config/config.service';
+import { IdCodecService } from '../common/id-codec.service';
 import { DECODE_METADATA_KEY } from '../decorators/decode.decorator';
 
-import { IdCodec } from '../common/id-codec';
-
 /**
  * This interceptor automatically decodes incoming requests and encodes outgoing requests so that any
  * ID values are transformed correctly as per the configured EntityIdStrategy.
@@ -18,17 +16,13 @@ import { IdCodec } from '../common/id-codec';
  */
 @Injectable()
 export class IdInterceptor implements NestInterceptor {
-    private codec: IdCodec;
-
-    constructor(private configService: ConfigService, private readonly reflector: Reflector) {
-        this.codec = new IdCodec(this.configService.entityIdStrategy);
-    }
+    constructor(private idCodecService: IdCodecService, private readonly reflector: Reflector) {}
 
     intercept(context: ExecutionContext, call$: Observable<any>): Observable<any> {
         const args = GqlExecutionContext.create(context).getArgs();
         const transformKeys = this.reflector.get<string[]>(DECODE_METADATA_KEY, context.getHandler());
 
-        Object.assign(args, this.codec.decode(args, transformKeys));
-        return call$.pipe(map(data => this.codec.encode(data)));
+        Object.assign(args, this.idCodecService.decode(args, transformKeys));
+        return call$.pipe(map(data => this.idCodecService.encode(data)));
     }
 }

+ 15 - 0
server/src/config/vendure-config.ts

@@ -254,3 +254,18 @@ export function setConfig(userConfig: DeepPartial<VendureConfig>): void {
 export function getConfig(): ReadOnlyRequired<VendureConfig> {
     return activeConfig;
 }
+
+/**
+ * Returns the type argument to be passed to the PrimaryGeneratedColumn() decorator
+ * of the base VendureEntity.
+ */
+export function primaryKeyType(): any {
+    return activeConfig.entityIdStrategy.primaryKeyType;
+}
+
+/**
+ * Returns the DB data type of ID columns based on the configured primaryKeyType
+ */
+export function idType(): 'int' | 'varchar' {
+    return activeConfig.entityIdStrategy.primaryKeyType === 'increment' ? 'int' : 'varchar';
+}

+ 3 - 3
server/src/entity/base/base.entity.ts

@@ -1,9 +1,9 @@
 import { DeepPartial, ID } from 'shared/shared-types';
 import { CreateDateColumn, PrimaryGeneratedColumn, UpdateDateColumn } from 'typeorm';
 
-import { getConfig } from '../../config/vendure-config';
+import { primaryKeyType } from '../../config/vendure-config';
 
-const primaryKeyType = getConfig().entityIdStrategy.primaryKeyType as any;
+const keyType = primaryKeyType();
 
 /**
  * This is the base class from which all entities inherit.
@@ -17,7 +17,7 @@ export abstract class VendureEntity {
         }
     }
 
-    @PrimaryGeneratedColumn(primaryKeyType) id: ID;
+    @PrimaryGeneratedColumn(keyType) id: ID;
 
     @CreateDateColumn() createdAt: Date;