Browse Source

refactor(server): Reorganize api module files to be more cohesive

Michael Bromley 7 years ago
parent
commit
a4330eee9b
28 changed files with 90 additions and 82 deletions
  1. 4 4
      server/src/api/api.module.ts
  2. 0 0
      server/src/api/config/__snapshots__/graphql-custom-fields.spec.ts.snap
  3. 0 0
      server/src/api/config/graphql-config.service.ts
  4. 0 0
      server/src/api/config/graphql-custom-fields.spec.ts
  5. 0 0
      server/src/api/config/graphql-custom-fields.ts
  6. 19 0
      server/src/api/decorators/allow.decorator.ts
  7. 19 0
      server/src/api/decorators/decode.decorator.ts
  8. 1 1
      server/src/api/decorators/request-context.decorator.ts
  9. 0 0
      server/src/api/middleware/asset-interceptor.spec.ts
  10. 0 0
      server/src/api/middleware/asset-interceptor.ts
  11. 5 21
      server/src/api/middleware/auth-guard.ts
  12. 6 20
      server/src/api/middleware/id-interceptor.ts
  13. 2 2
      server/src/api/resolvers/administrator.resolver.ts
  14. 1 1
      server/src/api/resolvers/asset.resolver.ts
  15. 2 2
      server/src/api/resolvers/auth.resolver.ts
  16. 3 3
      server/src/api/resolvers/channel.resolver.ts
  17. 2 2
      server/src/api/resolvers/country.resolver.ts
  18. 3 3
      server/src/api/resolvers/customer-group.resolver.ts
  19. 2 2
      server/src/api/resolvers/customer.resolver.ts
  20. 2 2
      server/src/api/resolvers/facet.resolver.ts
  21. 3 3
      server/src/api/resolvers/order.resolver.ts
  22. 2 2
      server/src/api/resolvers/product-option.resolver.ts
  23. 3 3
      server/src/api/resolvers/product.resolver.ts
  24. 2 2
      server/src/api/resolvers/promotion.resolver.ts
  25. 1 1
      server/src/api/resolvers/role.resolver.ts
  26. 2 2
      server/src/api/resolvers/tax-category.resolver.ts
  27. 3 3
      server/src/api/resolvers/tax-rate.resolver.ts
  28. 3 3
      server/src/api/resolvers/zone.resolver.ts

+ 4 - 4
server/src/api/api.module.ts

@@ -7,11 +7,11 @@ import { ConfigModule } from '../config/config.module';
 import { I18nModule } from '../i18n/i18n.module';
 import { ServiceModule } from '../service/service.module';
 
-import { AssetInterceptor } from './common/asset-interceptor';
-import { AuthGuard } from './common/auth-guard';
-import { GraphqlConfigService } from './common/graphql-config.service';
-import { IdInterceptor } from './common/id-interceptor';
 import { RequestContextService } from './common/request-context.service';
+import { GraphqlConfigService } from './config/graphql-config.service';
+import { AssetInterceptor } from './middleware/asset-interceptor';
+import { AuthGuard } from './middleware/auth-guard';
+import { IdInterceptor } from './middleware/id-interceptor';
 import { AdministratorResolver } from './resolvers/administrator.resolver';
 import { AssetResolver } from './resolvers/asset.resolver';
 import { AuthResolver } from './resolvers/auth.resolver';

+ 0 - 0
server/src/api/common/__snapshots__/graphql-custom-fields.spec.ts.snap → server/src/api/config/__snapshots__/graphql-custom-fields.spec.ts.snap


+ 0 - 0
server/src/api/common/graphql-config.service.ts → server/src/api/config/graphql-config.service.ts


+ 0 - 0
server/src/api/common/graphql-custom-fields.spec.ts → server/src/api/config/graphql-custom-fields.spec.ts


+ 0 - 0
server/src/api/common/graphql-custom-fields.ts → server/src/api/config/graphql-custom-fields.ts


+ 19 - 0
server/src/api/decorators/allow.decorator.ts

@@ -0,0 +1,19 @@
+import { ReflectMetadata } from '@nestjs/common';
+import { Permission } from 'shared/generated-types';
+
+export const PERMISSIONS_METADATA_KEY = '__permissions__';
+
+/**
+ * Attatches metadata to the resolver defining which permissions are required to execute the
+ * operation.
+ *
+ * @example
+ * ```
+ *  @Allow(Permission.SuperAdmin)
+ *  @Query()
+ *  getAdministrators() {
+ *      // ...
+ *  }
+ * ```
+ */
+export const Allow = (...permissions: Permission[]) => ReflectMetadata(PERMISSIONS_METADATA_KEY, permissions);

+ 19 - 0
server/src/api/decorators/decode.decorator.ts

@@ -0,0 +1,19 @@
+import { ReflectMetadata } from '@nestjs/common';
+
+export const DECODE_METADATA_KEY = '__decode__';
+
+/**
+ * Attatches metadata to the resolver defining which keys are ids which need to be decoded.
+ * By default, all keys named "id" will be implicitly decoded, but some operations have ID arguments
+ * which are not named "id", e.g. assignRoleToAdministrator, where there are 2 ID arguments passed.
+ *
+ * @example
+ * ```
+ *  @Query()
+ *  @Decode('administratorId', 'roleId')
+ *  assignRoleToAdministrator(@Args() args) {
+ *      // ...
+ *  }
+ * ```
+ */
+export const Decode = (...transformKeys: string[]) => ReflectMetadata(DECODE_METADATA_KEY, transformKeys);

+ 1 - 1
server/src/api/common/request-context.decorator.ts → server/src/api/decorators/request-context.decorator.ts

@@ -1,6 +1,6 @@
 import { Context } from '@nestjs/graphql';
 
-import { REQUEST_CONTEXT_KEY } from './request-context.service';
+import { REQUEST_CONTEXT_KEY } from '../common/request-context.service';
 
 /**
  * Resolver param decorator which extracts the RequestContext from the incoming

+ 0 - 0
server/src/api/common/asset-interceptor.spec.ts → server/src/api/middleware/asset-interceptor.spec.ts


+ 0 - 0
server/src/api/common/asset-interceptor.ts → server/src/api/middleware/asset-interceptor.ts


+ 5 - 21
server/src/api/common/auth-guard.ts → server/src/api/middleware/auth-guard.ts

@@ -1,4 +1,4 @@
-import { CanActivate, ExecutionContext, Injectable, ReflectMetadata } from '@nestjs/common';
+import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common';
 import { Reflector } from '@nestjs/core';
 import { GqlExecutionContext } from '@nestjs/graphql';
 import { Request, Response } from 'express';
@@ -8,26 +8,10 @@ import { ConfigService } from '../../config/config.service';
 import { Session } from '../../entity/session/session.entity';
 import { AuthService } from '../../service/services/auth.service';
 
-import { extractAuthToken } from './extract-auth-token';
-import { REQUEST_CONTEXT_KEY, RequestContextService } from './request-context.service';
-import { setAuthToken } from './set-auth-token';
-
-export const PERMISSIONS_METADATA_KEY = '__permissions__';
-
-/**
- * Attatches metadata to the resolver defining which permissions are required to execute the
- * operation.
- *
- * @example
- * ```
- *  @Allow(Permission.SuperAdmin)
- *  @Query()
- *  getAdministrators() {
- *      // ...
- *  }
- * ```
- */
-export const Allow = (...permissions: Permission[]) => ReflectMetadata(PERMISSIONS_METADATA_KEY, permissions);
+import { extractAuthToken } from '../common/extract-auth-token';
+import { REQUEST_CONTEXT_KEY, RequestContextService } from '../common/request-context.service';
+import { setAuthToken } from '../common/set-auth-token';
+import { PERMISSIONS_METADATA_KEY } from '../decorators/allow.decorator';
 
 /**
  * A guard which checks for the existence of a valid session token in the request and if found,

+ 6 - 20
server/src/api/common/id-interceptor.ts → server/src/api/middleware/id-interceptor.ts

@@ -1,34 +1,20 @@
-import { ExecutionContext, Injectable, NestInterceptor, ReflectMetadata } from '@nestjs/common';
+import { ExecutionContext, Injectable, NestInterceptor } from '@nestjs/common';
 import { Reflector } from '@nestjs/core';
 import { GqlExecutionContext } from '@nestjs/graphql';
 import { Observable } from 'rxjs';
 import { map } from 'rxjs/operators';
 
 import { ConfigService } from '../../config/config.service';
+import { DECODE_METADATA_KEY } from '../decorators/decode.decorator';
 
-import { IdCodec } from './id-codec';
-
-const DECODE_METADATA_KEY = '__decode__';
-
-/**
- * Attatches metadata to the resolver defining which keys are ids which need to be decoded.
- * By default, all keys named "id" will be implicitly decoded, but some operations have ID arguments
- * which are not named "id", e.g. assignRoleToAdministrator, where there are 2 ID arguments passed.
- *
- * @example
- * ```
- *  @Query()
- *  @Decode('administratorId', 'roleId')
- *  assignRoleToAdministrator(@Args() args) {
- *      // ...
- *  }
- * ```
- */
-export const Decode = (...transformKeys: string[]) => ReflectMetadata(DECODE_METADATA_KEY, transformKeys);
+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.
+ *
+ * ID values are defined as properties with the name "id", or properties with names matching any
+ * arguments passed to the {@link Decode} decorator.
  */
 @Injectable()
 export class IdInterceptor implements NestInterceptor {

+ 2 - 2
server/src/api/resolvers/administrator.resolver.ts

@@ -12,8 +12,8 @@ import { PaginatedList } from 'shared/shared-types';
 
 import { Administrator } from '../../entity/administrator/administrator.entity';
 import { AdministratorService } from '../../service/services/administrator.service';
-import { Allow } from '../common/auth-guard';
-import { Decode } from '../common/id-interceptor';
+import { Allow } from '../decorators/allow.decorator';
+import { Decode } from '../decorators/decode.decorator';
 
 @Resolver('Administrator')
 export class AdministratorResolver {

+ 1 - 1
server/src/api/resolvers/asset.resolver.ts

@@ -9,7 +9,7 @@ import { PaginatedList } from 'shared/shared-types';
 
 import { Asset } from '../../entity/asset/asset.entity';
 import { AssetService } from '../../service/services/asset.service';
-import { Allow } from '../common/auth-guard';
+import { Allow } from '../decorators/allow.decorator';
 
 @Resolver('Assets')
 export class AssetResolver {

+ 2 - 2
server/src/api/resolvers/auth.resolver.ts

@@ -7,11 +7,11 @@ import { AuthenticatedSession } from '../../entity/session/authenticated-session
 import { User } from '../../entity/user/user.entity';
 import { AuthService } from '../../service/services/auth.service';
 import { ChannelService } from '../../service/services/channel.service';
-import { Allow } from '../common/auth-guard';
 import { extractAuthToken } from '../common/extract-auth-token';
 import { RequestContext } from '../common/request-context';
-import { Ctx } from '../common/request-context.decorator';
 import { setAuthToken } from '../common/set-auth-token';
+import { Allow } from '../decorators/allow.decorator';
+import { Ctx } from '../decorators/request-context.decorator';
 
 @Resolver('Auth')
 export class AuthResolver {

+ 3 - 3
server/src/api/resolvers/channel.resolver.ts

@@ -8,10 +8,10 @@ import {
 
 import { Channel } from '../../entity/channel/channel.entity';
 import { ChannelService } from '../../service/services/channel.service';
-import { Allow } from '../common/auth-guard';
-import { Decode } from '../common/id-interceptor';
 import { RequestContext } from '../common/request-context';
-import { Ctx } from '../common/request-context.decorator';
+import { Allow } from '../decorators/allow.decorator';
+import { Decode } from '../decorators/decode.decorator';
+import { Ctx } from '../decorators/request-context.decorator';
 
 @Resolver('Channel')
 export class ChannelResolver {

+ 2 - 2
server/src/api/resolvers/country.resolver.ts

@@ -11,9 +11,9 @@ import { PaginatedList } from 'shared/shared-types';
 import { Country } from '../../entity/country/country.entity';
 import { Facet } from '../../entity/facet/facet.entity';
 import { CountryService } from '../../service/services/country.service';
-import { Allow } from '../common/auth-guard';
 import { RequestContext } from '../common/request-context';
-import { Ctx } from '../common/request-context.decorator';
+import { Allow } from '../decorators/allow.decorator';
+import { Ctx } from '../decorators/request-context.decorator';
 
 @Resolver('Country')
 export class CountryResolver {

+ 3 - 3
server/src/api/resolvers/customer-group.resolver.ts

@@ -10,10 +10,10 @@ import {
 
 import { CustomerGroup } from '../../entity/customer-group/customer-group.entity';
 import { CustomerGroupService } from '../../service/services/customer-group.service';
-import { Allow } from '../common/auth-guard';
-import { Decode } from '../common/id-interceptor';
 import { RequestContext } from '../common/request-context';
-import { Ctx } from '../common/request-context.decorator';
+import { Allow } from '../decorators/allow.decorator';
+import { Decode } from '../decorators/decode.decorator';
+import { Ctx } from '../decorators/request-context.decorator';
 
 @Resolver('CustomerGroup')
 export class CustomerGroupResolver {

+ 2 - 2
server/src/api/resolvers/customer.resolver.ts

@@ -11,8 +11,8 @@ import { PaginatedList } from 'shared/shared-types';
 import { Address } from '../../entity/address/address.entity';
 import { Customer } from '../../entity/customer/customer.entity';
 import { CustomerService } from '../../service/services/customer.service';
-import { Allow } from '../common/auth-guard';
-import { Decode } from '../common/id-interceptor';
+import { Allow } from '../decorators/allow.decorator';
+import { Decode } from '../decorators/decode.decorator';
 
 @Resolver('Customer')
 export class CustomerResolver {

+ 2 - 2
server/src/api/resolvers/facet.resolver.ts

@@ -17,9 +17,9 @@ import { Facet } from '../../entity/facet/facet.entity';
 import { I18nError } from '../../i18n/i18n-error';
 import { FacetValueService } from '../../service/services/facet-value.service';
 import { FacetService } from '../../service/services/facet.service';
-import { Allow } from '../common/auth-guard';
 import { RequestContext } from '../common/request-context';
-import { Ctx } from '../common/request-context.decorator';
+import { Allow } from '../decorators/allow.decorator';
+import { Ctx } from '../decorators/request-context.decorator';
 
 @Resolver('Facet')
 export class FacetResolver {

+ 3 - 3
server/src/api/resolvers/order.resolver.ts

@@ -13,10 +13,10 @@ import { Order } from '../../entity/order/order.entity';
 import { I18nError } from '../../i18n/i18n-error';
 import { AuthService } from '../../service/services/auth.service';
 import { OrderService } from '../../service/services/order.service';
-import { Allow } from '../common/auth-guard';
-import { Decode } from '../common/id-interceptor';
 import { RequestContext } from '../common/request-context';
-import { Ctx } from '../common/request-context.decorator';
+import { Allow } from '../decorators/allow.decorator';
+import { Decode } from '../decorators/decode.decorator';
+import { Ctx } from '../decorators/request-context.decorator';
 
 @Resolver('Order')
 export class OrderResolver {

+ 2 - 2
server/src/api/resolvers/product-option.resolver.ts

@@ -12,9 +12,9 @@ import { ProductOptionGroup } from '../../entity/product-option-group/product-op
 import { ProductOption } from '../../entity/product-option/product-option.entity';
 import { ProductOptionGroupService } from '../../service/services/product-option-group.service';
 import { ProductOptionService } from '../../service/services/product-option.service';
-import { Allow } from '../common/auth-guard';
 import { RequestContext } from '../common/request-context';
-import { Ctx } from '../common/request-context.decorator';
+import { Allow } from '../decorators/allow.decorator';
+import { Ctx } from '../decorators/request-context.decorator';
 
 @Resolver('ProductOptionGroup')
 export class ProductOptionResolver {

+ 3 - 3
server/src/api/resolvers/product.resolver.ts

@@ -22,10 +22,10 @@ import { I18nError } from '../../i18n/i18n-error';
 import { FacetValueService } from '../../service/services/facet-value.service';
 import { ProductVariantService } from '../../service/services/product-variant.service';
 import { ProductService } from '../../service/services/product.service';
-import { Allow } from '../common/auth-guard';
-import { Decode } from '../common/id-interceptor';
 import { RequestContext } from '../common/request-context';
-import { Ctx } from '../common/request-context.decorator';
+import { Allow } from '../decorators/allow.decorator';
+import { Decode } from '../decorators/decode.decorator';
+import { Ctx } from '../decorators/request-context.decorator';
 
 @Resolver('Product')
 export class ProductResolver {

+ 2 - 2
server/src/api/resolvers/promotion.resolver.ts

@@ -10,9 +10,9 @@ import { PaginatedList } from 'shared/shared-types';
 
 import { Promotion } from '../../entity/promotion/promotion.entity';
 import { PromotionService } from '../../service/services/promotion.service';
-import { Allow } from '../common/auth-guard';
 import { RequestContext } from '../common/request-context';
-import { Ctx } from '../common/request-context.decorator';
+import { Allow } from '../decorators/allow.decorator';
+import { Ctx } from '../decorators/request-context.decorator';
 
 @Resolver('Promotion')
 export class PromotionResolver {

+ 1 - 1
server/src/api/resolvers/role.resolver.ts

@@ -10,7 +10,7 @@ import { PaginatedList } from 'shared/shared-types';
 
 import { Role } from '../../entity/role/role.entity';
 import { RoleService } from '../../service/services/role.service';
-import { Allow } from '../common/auth-guard';
+import { Allow } from '../decorators/allow.decorator';
 
 @Resolver('Roles')
 export class RoleResolver {

+ 2 - 2
server/src/api/resolvers/tax-category.resolver.ts

@@ -8,9 +8,9 @@ import {
 
 import { TaxCategory } from '../../entity/tax-category/tax-category.entity';
 import { TaxCategoryService } from '../../service/services/tax-category.service';
-import { Allow } from '../common/auth-guard';
 import { RequestContext } from '../common/request-context';
-import { Ctx } from '../common/request-context.decorator';
+import { Allow } from '../decorators/allow.decorator';
+import { Ctx } from '../decorators/request-context.decorator';
 
 @Resolver('TaxCategory')
 export class TaxCategoryResolver {

+ 3 - 3
server/src/api/resolvers/tax-rate.resolver.ts

@@ -10,10 +10,10 @@ import { PaginatedList } from 'shared/shared-types';
 
 import { TaxRate } from '../../entity/tax-rate/tax-rate.entity';
 import { TaxRateService } from '../../service/services/tax-rate.service';
-import { Allow } from '../common/auth-guard';
-import { Decode } from '../common/id-interceptor';
 import { RequestContext } from '../common/request-context';
-import { Ctx } from '../common/request-context.decorator';
+import { Allow } from '../decorators/allow.decorator';
+import { Decode } from '../decorators/decode.decorator';
+import { Ctx } from '../decorators/request-context.decorator';
 
 @Resolver('TaxRate')
 export class TaxRateResolver {

+ 3 - 3
server/src/api/resolvers/zone.resolver.ts

@@ -10,10 +10,10 @@ import {
 
 import { Zone } from '../../entity/zone/zone.entity';
 import { ZoneService } from '../../service/services/zone.service';
-import { Allow } from '../common/auth-guard';
-import { Decode } from '../common/id-interceptor';
 import { RequestContext } from '../common/request-context';
-import { Ctx } from '../common/request-context.decorator';
+import { Allow } from '../decorators/allow.decorator';
+import { Decode } from '../decorators/decode.decorator';
+import { Ctx } from '../decorators/request-context.decorator';
 
 @Resolver('Zone')
 export class ZoneResolver {