Browse Source

feat(admin-ui): Send channel token with requests, update auth calls

Michael Bromley 7 years ago
parent
commit
200a23a33f

+ 1 - 0
admin-ui/package.json

@@ -33,6 +33,7 @@
     "apollo-cache-inmemory": "^1.2.7",
     "apollo-client": "^2.3.8",
     "apollo-link": "^1.2.2",
+    "apollo-link-context": "^1.0.8",
     "apollo-link-state": "^0.4.1",
     "core-js": "^2.5.4",
     "graphql": "^0.13.2",

+ 14 - 6
admin-ui/src/app/core/providers/auth/auth.service.ts

@@ -1,8 +1,9 @@
 import { Injectable } from '@angular/core';
 import { Observable, of } from 'rxjs';
 import { catchError, map, mergeMap, switchMap } from 'rxjs/operators';
-import { LogIn } from 'shared/generated-types';
+import { AttemptLogin, SetAsLoggedIn } from 'shared/generated-types';
 
+import { _ } from '../../../core/providers/i18n/mark-for-extraction';
 import { DataService } from '../../../data/providers/data.service';
 import { LocalStorageService } from '../local-storage/local-storage.service';
 
@@ -17,10 +18,14 @@ export class AuthService {
      * Attempts to log in via the REST login endpoint and updates the app
      * state on success.
      */
-    logIn(username: string, password: string): Observable<LogIn> {
-        return this.dataService.user.attemptLogin(username, password).pipe(
+    logIn(username: string, password: string): Observable<SetAsLoggedIn> {
+        return this.dataService.auth.attemptLogin(username, password).pipe(
             switchMap(response => {
-                this.localStorageService.set('authToken', response.token);
+                this.localStorageService.setForSession('authToken', response.login.authToken);
+                this.localStorageService.setForSession(
+                    'activeChannelToken',
+                    response.login.user.channelTokens[0],
+                );
                 return this.dataService.client.loginSuccess(username);
             }),
         );
@@ -59,9 +64,12 @@ export class AuthService {
             return of(false);
         }
 
-        return this.dataService.user.checkLoggedIn().pipe(
+        return this.dataService.auth.checkLoggedIn().single$.pipe(
             map(result => {
-                this.dataService.client.loginSuccess(result.identifier);
+                if (!result.me) {
+                    return false;
+                }
+                this.dataService.client.loginSuccess(result.me.identifier);
                 return true;
             }),
             catchError(err => of(false)),

+ 1 - 1
admin-ui/src/app/core/providers/local-storage/local-storage.service.ts

@@ -1,6 +1,6 @@
 import { Injectable } from '@angular/core';
 
-export type LocalStorageKey = 'authToken';
+export type LocalStorageKey = 'authToken' | 'activeChannelToken';
 const PREFIX = 'vnd_';
 
 /**

+ 3 - 3
admin-ui/src/app/data/client-state/client-resolvers.ts

@@ -6,7 +6,7 @@ import {
     GetUserStatus,
     GetUserStatus_userStatus,
     LanguageCode,
-    LogInVariables,
+    SetAsLoggedInVariables,
     SetUiLanguageVariables,
 } from 'shared/generated-types';
 
@@ -32,7 +32,7 @@ export const clientResolvers: ResolverDefinition = {
         requestCompleted: (_, args, { cache }): number => {
             return updateRequestsInFlight(cache, -1);
         },
-        logIn: (_, args: LogInVariables, { cache }): GetUserStatus_userStatus => {
+        setAsLoggedIn: (_, args: SetAsLoggedInVariables, { cache }): GetUserStatus_userStatus => {
             const { username, loginTime } = args;
             const data: GetUserStatus = {
                 userStatus: {
@@ -45,7 +45,7 @@ export const clientResolvers: ResolverDefinition = {
             cache.writeData({ data });
             return data.userStatus;
         },
-        logOut: (_, args, { cache }): GetUserStatus_userStatus => {
+        setAsLoggedOut: (_, args, { cache }): GetUserStatus_userStatus => {
             const data: GetUserStatus = {
                 userStatus: {
                     __typename: 'UserStatus',

+ 20 - 2
admin-ui/src/app/data/data.module.ts

@@ -5,11 +5,13 @@ import { HttpLink, HttpLinkModule } from 'apollo-angular-link-http';
 import { InMemoryCache } from 'apollo-cache-inmemory';
 import { ApolloClientOptions } from 'apollo-client';
 import { ApolloLink } from 'apollo-link';
+import { setContext } from 'apollo-link-context';
 import { withClientState } from 'apollo-link-state';
 
 import { API_PATH } from '../../../../shared/shared-constants';
 import { environment } from '../../environments/environment';
 import { API_URL } from '../app.config';
+import { LocalStorageService } from '../core/providers/local-storage/local-storage.service';
 
 import { clientDefaults } from './client-state/client-defaults';
 import { clientResolvers } from './client-state/client-resolvers';
@@ -32,11 +34,27 @@ const stateLink = withClientState({
     defaults: clientDefaults,
 });
 
-export function createApollo(httpLink: HttpLink): ApolloClientOptions<any> {
+export function createApollo(
+    httpLink: HttpLink,
+    localStorageService: LocalStorageService,
+): ApolloClientOptions<any> {
     return {
         link: ApolloLink.from([
             stateLink,
             new OmitTypenameLink(),
+            setContext(() => {
+                // Add JWT auth token & channel token to all requests.
+                const channelToken = localStorageService.get('activeChannelToken');
+                const authToken = localStorageService.get('authToken') || '';
+                if (!authToken) {
+                    return {};
+                } else {
+                    return {
+                        headers: { Authorization: `Bearer ${authToken}` },
+                        uri: `${API_URL}/${API_PATH}?token=${channelToken}`,
+                    };
+                }
+            }),
             httpLink.create({ uri: `${API_URL}/${API_PATH}` }),
         ]),
         cache: apolloCache,
@@ -57,7 +75,7 @@ export function createApollo(httpLink: HttpLink): ApolloClientOptions<any> {
         {
             provide: APOLLO_OPTIONS,
             useFactory: createApollo,
-            deps: [HttpLink],
+            deps: [HttpLink, LocalStorageService],
         },
         { provide: HTTP_INTERCEPTORS, useClass: DefaultInterceptor, multi: true },
         {

+ 10 - 0
admin-ui/src/app/data/fragments/auth-fragments.ts

@@ -0,0 +1,10 @@
+import gql from 'graphql-tag';
+
+export const CURRENT_USER_FRAGMENT = gql`
+    fragment CurrentUser on CurrentUser {
+        id
+        identifier
+        channelTokens
+        roles
+    }
+`;

+ 15 - 0
admin-ui/src/app/data/mutations/auth-mutations.ts

@@ -0,0 +1,15 @@
+import gql from 'graphql-tag';
+
+import { CURRENT_USER_FRAGMENT } from '../fragments/auth-fragments';
+
+export const ATTEMPT_LOGIN = gql`
+    mutation AttemptLogin($username: String!, $password: String!) {
+        login(username: $username, password: $password) {
+            user {
+                ...CurrentUser
+            }
+            authToken
+        }
+    }
+    ${CURRENT_USER_FRAGMENT}
+`;

+ 6 - 6
admin-ui/src/app/data/mutations/local-mutations.ts

@@ -12,9 +12,9 @@ export const REQUEST_COMPLETED = gql`
     }
 `;
 
-export const LOG_IN = gql`
-    mutation LogIn($username: String!, $loginTime: String!) {
-        logIn(username: $username, loginTime: $loginTime) @client {
+export const SET_AS_LOGGED_IN = gql`
+    mutation SetAsLoggedIn($username: String!, $loginTime: String!) {
+        setAsLoggedIn(username: $username, loginTime: $loginTime) @client {
             username
             isLoggedIn
             loginTime
@@ -22,9 +22,9 @@ export const LOG_IN = gql`
     }
 `;
 
-export const LOG_OUT = gql`
-    mutation LogOut {
-        logOut @client {
+export const SET_AS_LOGGED_OUT = gql`
+    mutation SetAsLoggedOut {
+        setAsLoggedOut @client {
             username
             isLoggedIn
             loginTime

+ 23 - 0
admin-ui/src/app/data/providers/auth-data.service.ts

@@ -0,0 +1,23 @@
+import { Observable } from 'rxjs';
+import { AttemptLogin, AttemptLoginVariables, GetCurrentUser } from 'shared/generated-types';
+
+import { ATTEMPT_LOGIN } from '../mutations/auth-mutations';
+import { GET_CURRENT_USER } from '../queries/auth-queries';
+import { QueryResult } from '../types/query-result';
+
+import { BaseDataService } from './base-data.service';
+
+export class AuthDataService {
+    constructor(private baseDataService: BaseDataService) {}
+
+    checkLoggedIn(): QueryResult<GetCurrentUser> {
+        return this.baseDataService.query<GetCurrentUser>(GET_CURRENT_USER);
+    }
+
+    attemptLogin(username: string, password: string): Observable<AttemptLogin> {
+        return this.baseDataService.mutate<AttemptLogin, AttemptLoginVariables>(ATTEMPT_LOGIN, {
+            username,
+            password,
+        });
+    }
+}

+ 0 - 5
admin-ui/src/app/data/providers/base-data.service.ts

@@ -40,11 +40,6 @@ export class BaseDataService {
         const queryRef = this.apollo.watchQuery<T, V>({
             query,
             variables,
-            context: {
-                headers: {
-                    Authorization: this.getAuthHeader(),
-                },
-            },
             fetchPolicy,
         });
         return new QueryResult<T, any>(queryRef);

+ 9 - 9
admin-ui/src/app/data/providers/client-data.service.ts

@@ -4,20 +4,20 @@ import {
     GetUiState,
     GetUserStatus,
     LanguageCode,
-    LogIn,
-    LogInVariables,
-    LogOut,
     RequestCompleted,
     RequestStarted,
+    SetAsLoggedIn,
+    SetAsLoggedInVariables,
+    SetAsLoggedOut,
     SetUiLanguage,
     SetUiLanguageVariables,
 } from 'shared/generated-types';
 
 import {
-    LOG_IN,
-    LOG_OUT,
     REQUEST_COMPLETED,
     REQUEST_STARTED,
+    SET_AS_LOGGED_IN,
+    SET_AS_LOGGED_OUT,
     SET_UI_LANGUAGE,
 } from '../mutations/local-mutations';
 import { GET_NEWTORK_STATUS, GET_UI_STATE, GET_USER_STATUS } from '../queries/local-queries';
@@ -40,15 +40,15 @@ export class ClientDataService {
         return this.baseDataService.query<GetNetworkStatus>(GET_NEWTORK_STATUS);
     }
 
-    loginSuccess(username: string): Observable<LogIn> {
-        return this.baseDataService.mutate<LogIn, LogInVariables>(LOG_IN, {
+    loginSuccess(username: string): Observable<SetAsLoggedIn> {
+        return this.baseDataService.mutate<SetAsLoggedIn, SetAsLoggedInVariables>(SET_AS_LOGGED_IN, {
             username,
             loginTime: Date.now().toString(),
         });
     }
 
-    logOut(): Observable<LogOut> {
-        return this.baseDataService.mutate(LOG_OUT);
+    logOut(): Observable<SetAsLoggedOut> {
+        return this.baseDataService.mutate(SET_AS_LOGGED_OUT);
     }
 
     userStatus(): QueryResult<GetUserStatus> {

+ 1 - 1
admin-ui/src/app/data/providers/data.service.mock.ts

@@ -53,7 +53,7 @@ export class MockDataService implements DataServiceMock {
         generateProductVariants: spyObservable('generateProductVariants'),
         applyFacetValuesToProductVariants: spyObservable('applyFacetValuesToProductVariants'),
     };
-    user = {
+    auth = {
         checkLoggedIn: spyObservable('checkLoggedIn'),
         attemptLogin: spyObservable('attemptLogin'),
     };

+ 3 - 3
admin-ui/src/app/data/providers/data.service.ts

@@ -1,20 +1,20 @@
 import { Injectable } from '@angular/core';
 
+import { AuthDataService } from './auth-data.service';
 import { BaseDataService } from './base-data.service';
 import { ClientDataService } from './client-data.service';
 import { FacetDataService } from './facet-data.service';
 import { ProductDataService } from './product-data.service';
-import { UserDataService } from './user-data.service';
 
 @Injectable()
 export class DataService {
-    user: UserDataService;
+    auth: AuthDataService;
     product: ProductDataService;
     client: ClientDataService;
     facet: FacetDataService;
 
     constructor(baseDataService: BaseDataService) {
-        this.user = new UserDataService(baseDataService);
+        this.auth = new AuthDataService(baseDataService);
         this.product = new ProductDataService(baseDataService);
         this.client = new ClientDataService(baseDataService);
         this.facet = new FacetDataService(baseDataService);

+ 0 - 20
admin-ui/src/app/data/providers/user-data.service.ts

@@ -1,20 +0,0 @@
-import { Observable } from 'rxjs';
-
-import { LoginResponse, UserResponse } from '../types/response';
-
-import { BaseDataService } from './base-data.service';
-
-export class UserDataService {
-    constructor(private baseDataService: BaseDataService) {}
-
-    checkLoggedIn(): Observable<UserResponse> {
-        return this.baseDataService.get('auth/me');
-    }
-
-    attemptLogin(username: string, password: string): Observable<LoginResponse> {
-        return this.baseDataService.post('auth/login', {
-            username,
-            password,
-        });
-    }
-}

+ 12 - 0
admin-ui/src/app/data/queries/auth-queries.ts

@@ -0,0 +1,12 @@
+import gql from 'graphql-tag';
+
+import { CURRENT_USER_FRAGMENT } from '../fragments/auth-fragments';
+
+export const GET_CURRENT_USER = gql`
+    query GetCurrentUser {
+        me {
+            ...CurrentUser
+        }
+    }
+    ${CURRENT_USER_FRAGMENT}
+`;

+ 2 - 2
admin-ui/src/app/data/types/client-types.graphql

@@ -7,8 +7,8 @@ extend type Query {
 extend type Mutation {
     requestStarted: Int!
     requestCompleted: Int!
-    logIn(username: String!, loginTime: String!): UserStatus
-    logOut: UserStatus
+    setAsLoggedIn(username: String!, loginTime: String!): UserStatus
+    setAsLoggedOut: UserStatus
     setUiLanguage(languageCode: LanguageCode): LanguageCode
 }
 

+ 0 - 1651
admin-ui/src/app/data/types/gql-generated-types.ts

@@ -1,1651 +0,0 @@
-/* tslint:disable */
-// This file was automatically generated and should not be edited.
-
-// ====================================================
-// GraphQL mutation operation: CreateFacet
-// ====================================================
-
-export interface CreateFacet_createFacet_translations {
-  __typename: "FacetTranslation";
-  id: string;
-  languageCode: LanguageCode;
-  name: string;
-}
-
-export interface CreateFacet_createFacet_values_translations {
-  __typename: "FacetValueTranslation";
-  id: string;
-  languageCode: LanguageCode;
-  name: string;
-}
-
-export interface CreateFacet_createFacet_values {
-  __typename: "FacetValue";
-  id: string;
-  languageCode: LanguageCode | null;
-  code: string;
-  name: string;
-  translations: CreateFacet_createFacet_values_translations[];
-}
-
-export interface CreateFacet_createFacet {
-  __typename: "Facet";
-  id: string;
-  languageCode: LanguageCode;
-  code: string;
-  name: string;
-  translations: CreateFacet_createFacet_translations[];
-  values: CreateFacet_createFacet_values[];
-}
-
-export interface CreateFacet {
-  /**
-   * Create a new Facet
-   */
-  createFacet: CreateFacet_createFacet;
-}
-
-export interface CreateFacetVariables {
-  input: CreateFacetInput;
-}
-
-/* tslint:disable */
-// This file was automatically generated and should not be edited.
-
-// ====================================================
-// GraphQL mutation operation: UpdateFacet
-// ====================================================
-
-export interface UpdateFacet_updateFacet_translations {
-  __typename: "FacetTranslation";
-  id: string;
-  languageCode: LanguageCode;
-  name: string;
-}
-
-export interface UpdateFacet_updateFacet_values_translations {
-  __typename: "FacetValueTranslation";
-  id: string;
-  languageCode: LanguageCode;
-  name: string;
-}
-
-export interface UpdateFacet_updateFacet_values {
-  __typename: "FacetValue";
-  id: string;
-  languageCode: LanguageCode | null;
-  code: string;
-  name: string;
-  translations: UpdateFacet_updateFacet_values_translations[];
-}
-
-export interface UpdateFacet_updateFacet {
-  __typename: "Facet";
-  id: string;
-  languageCode: LanguageCode;
-  code: string;
-  name: string;
-  translations: UpdateFacet_updateFacet_translations[];
-  values: UpdateFacet_updateFacet_values[];
-}
-
-export interface UpdateFacet {
-  /**
-   * Update an existing Facet
-   */
-  updateFacet: UpdateFacet_updateFacet;
-}
-
-export interface UpdateFacetVariables {
-  input: UpdateFacetInput;
-}
-
-/* tslint:disable */
-// This file was automatically generated and should not be edited.
-
-// ====================================================
-// GraphQL mutation operation: CreateFacetValues
-// ====================================================
-
-export interface CreateFacetValues_createFacetValues_translations {
-  __typename: "FacetValueTranslation";
-  id: string;
-  languageCode: LanguageCode;
-  name: string;
-}
-
-export interface CreateFacetValues_createFacetValues {
-  __typename: "FacetValue";
-  id: string;
-  languageCode: LanguageCode | null;
-  code: string;
-  name: string;
-  translations: CreateFacetValues_createFacetValues_translations[];
-}
-
-export interface CreateFacetValues {
-  /**
-   * Create one or more FacetValues
-   */
-  createFacetValues: CreateFacetValues_createFacetValues[];
-}
-
-export interface CreateFacetValuesVariables {
-  input: CreateFacetValueInput[];
-}
-
-/* tslint:disable */
-// This file was automatically generated and should not be edited.
-
-// ====================================================
-// GraphQL mutation operation: UpdateFacetValues
-// ====================================================
-
-export interface UpdateFacetValues_updateFacetValues_translations {
-  __typename: "FacetValueTranslation";
-  id: string;
-  languageCode: LanguageCode;
-  name: string;
-}
-
-export interface UpdateFacetValues_updateFacetValues {
-  __typename: "FacetValue";
-  id: string;
-  languageCode: LanguageCode | null;
-  code: string;
-  name: string;
-  translations: UpdateFacetValues_updateFacetValues_translations[];
-}
-
-export interface UpdateFacetValues {
-  /**
-   * Update one or more FacetValues
-   */
-  updateFacetValues: UpdateFacetValues_updateFacetValues[];
-}
-
-export interface UpdateFacetValuesVariables {
-  input: UpdateFacetValueInput[];
-}
-
-/* tslint:disable */
-// This file was automatically generated and should not be edited.
-
-// ====================================================
-// GraphQL mutation operation: RequestStarted
-// ====================================================
-
-export interface RequestStarted {
-  requestStarted: number;
-}
-
-/* tslint:disable */
-// This file was automatically generated and should not be edited.
-
-// ====================================================
-// GraphQL mutation operation: RequestCompleted
-// ====================================================
-
-export interface RequestCompleted {
-  requestCompleted: number;
-}
-
-/* tslint:disable */
-// This file was automatically generated and should not be edited.
-
-// ====================================================
-// GraphQL mutation operation: LogIn
-// ====================================================
-
-export interface LogIn_logIn {
-  __typename: "UserStatus";
-  username: string;
-  isLoggedIn: boolean;
-  loginTime: string;
-}
-
-export interface LogIn {
-  logIn: LogIn_logIn | null;
-}
-
-export interface LogInVariables {
-  username: string;
-  loginTime: string;
-}
-
-/* tslint:disable */
-// This file was automatically generated and should not be edited.
-
-// ====================================================
-// GraphQL mutation operation: LogOut
-// ====================================================
-
-export interface LogOut_logOut {
-  __typename: "UserStatus";
-  username: string;
-  isLoggedIn: boolean;
-  loginTime: string;
-}
-
-export interface LogOut {
-  logOut: LogOut_logOut | null;
-}
-
-/* tslint:disable */
-// This file was automatically generated and should not be edited.
-
-// ====================================================
-// GraphQL mutation operation: SetUiLanguage
-// ====================================================
-
-export interface SetUiLanguage {
-  setUiLanguage: LanguageCode | null;
-}
-
-export interface SetUiLanguageVariables {
-  languageCode: LanguageCode;
-}
-
-/* tslint:disable */
-// This file was automatically generated and should not be edited.
-
-// ====================================================
-// GraphQL mutation operation: UpdateProduct
-// ====================================================
-
-export interface UpdateProduct_updateProduct_translations {
-  __typename: "ProductTranslation";
-  languageCode: LanguageCode;
-  name: string;
-  slug: string;
-  description: string | null;
-}
-
-export interface UpdateProduct_updateProduct_optionGroups {
-  __typename: "ProductOptionGroup";
-  id: string;
-  languageCode: LanguageCode;
-  code: string;
-  name: string;
-}
-
-export interface UpdateProduct_updateProduct_variants_options {
-  __typename: "ProductOption";
-  id: string;
-  code: string | null;
-  languageCode: LanguageCode | null;
-  name: string | null;
-}
-
-export interface UpdateProduct_updateProduct_variants_facetValues {
-  __typename: "FacetValue";
-  id: string;
-  code: string;
-  name: string;
-}
-
-export interface UpdateProduct_updateProduct_variants_translations {
-  __typename: "ProductVariantTranslation";
-  id: string;
-  languageCode: LanguageCode;
-  name: string;
-}
-
-export interface UpdateProduct_updateProduct_variants {
-  __typename: "ProductVariant";
-  id: string;
-  languageCode: LanguageCode;
-  name: string;
-  price: number;
-  sku: string;
-  image: string | null;
-  options: UpdateProduct_updateProduct_variants_options[];
-  facetValues: UpdateProduct_updateProduct_variants_facetValues[];
-  translations: UpdateProduct_updateProduct_variants_translations[];
-}
-
-export interface UpdateProduct_updateProduct {
-  __typename: "Product";
-  id: string;
-  languageCode: LanguageCode;
-  name: string;
-  slug: string;
-  image: string;
-  description: string;
-  translations: UpdateProduct_updateProduct_translations[];
-  optionGroups: UpdateProduct_updateProduct_optionGroups[];
-  variants: UpdateProduct_updateProduct_variants[];
-}
-
-export interface UpdateProduct {
-  /**
-   * Update an existing Product
-   */
-  updateProduct: UpdateProduct_updateProduct;
-}
-
-export interface UpdateProductVariables {
-  input: UpdateProductInput;
-}
-
-/* tslint:disable */
-// This file was automatically generated and should not be edited.
-
-// ====================================================
-// GraphQL mutation operation: CreateProduct
-// ====================================================
-
-export interface CreateProduct_createProduct_translations {
-  __typename: "ProductTranslation";
-  languageCode: LanguageCode;
-  name: string;
-  slug: string;
-  description: string | null;
-}
-
-export interface CreateProduct_createProduct_optionGroups {
-  __typename: "ProductOptionGroup";
-  id: string;
-  languageCode: LanguageCode;
-  code: string;
-  name: string;
-}
-
-export interface CreateProduct_createProduct_variants_options {
-  __typename: "ProductOption";
-  id: string;
-  code: string | null;
-  languageCode: LanguageCode | null;
-  name: string | null;
-}
-
-export interface CreateProduct_createProduct_variants_facetValues {
-  __typename: "FacetValue";
-  id: string;
-  code: string;
-  name: string;
-}
-
-export interface CreateProduct_createProduct_variants_translations {
-  __typename: "ProductVariantTranslation";
-  id: string;
-  languageCode: LanguageCode;
-  name: string;
-}
-
-export interface CreateProduct_createProduct_variants {
-  __typename: "ProductVariant";
-  id: string;
-  languageCode: LanguageCode;
-  name: string;
-  price: number;
-  sku: string;
-  image: string | null;
-  options: CreateProduct_createProduct_variants_options[];
-  facetValues: CreateProduct_createProduct_variants_facetValues[];
-  translations: CreateProduct_createProduct_variants_translations[];
-}
-
-export interface CreateProduct_createProduct {
-  __typename: "Product";
-  id: string;
-  languageCode: LanguageCode;
-  name: string;
-  slug: string;
-  image: string;
-  description: string;
-  translations: CreateProduct_createProduct_translations[];
-  optionGroups: CreateProduct_createProduct_optionGroups[];
-  variants: CreateProduct_createProduct_variants[];
-}
-
-export interface CreateProduct {
-  /**
-   * Create a new Product
-   */
-  createProduct: CreateProduct_createProduct;
-}
-
-export interface CreateProductVariables {
-  input: CreateProductInput;
-}
-
-/* tslint:disable */
-// This file was automatically generated and should not be edited.
-
-// ====================================================
-// GraphQL mutation operation: GenerateProductVariants
-// ====================================================
-
-export interface GenerateProductVariants_generateVariantsForProduct_translations {
-  __typename: "ProductTranslation";
-  languageCode: LanguageCode;
-  name: string;
-  slug: string;
-  description: string | null;
-}
-
-export interface GenerateProductVariants_generateVariantsForProduct_optionGroups {
-  __typename: "ProductOptionGroup";
-  id: string;
-  languageCode: LanguageCode;
-  code: string;
-  name: string;
-}
-
-export interface GenerateProductVariants_generateVariantsForProduct_variants_options {
-  __typename: "ProductOption";
-  id: string;
-  code: string | null;
-  languageCode: LanguageCode | null;
-  name: string | null;
-}
-
-export interface GenerateProductVariants_generateVariantsForProduct_variants_facetValues {
-  __typename: "FacetValue";
-  id: string;
-  code: string;
-  name: string;
-}
-
-export interface GenerateProductVariants_generateVariantsForProduct_variants_translations {
-  __typename: "ProductVariantTranslation";
-  id: string;
-  languageCode: LanguageCode;
-  name: string;
-}
-
-export interface GenerateProductVariants_generateVariantsForProduct_variants {
-  __typename: "ProductVariant";
-  id: string;
-  languageCode: LanguageCode;
-  name: string;
-  price: number;
-  sku: string;
-  image: string | null;
-  options: GenerateProductVariants_generateVariantsForProduct_variants_options[];
-  facetValues: GenerateProductVariants_generateVariantsForProduct_variants_facetValues[];
-  translations: GenerateProductVariants_generateVariantsForProduct_variants_translations[];
-}
-
-export interface GenerateProductVariants_generateVariantsForProduct {
-  __typename: "Product";
-  id: string;
-  languageCode: LanguageCode;
-  name: string;
-  slug: string;
-  image: string;
-  description: string;
-  translations: GenerateProductVariants_generateVariantsForProduct_translations[];
-  optionGroups: GenerateProductVariants_generateVariantsForProduct_optionGroups[];
-  variants: GenerateProductVariants_generateVariantsForProduct_variants[];
-}
-
-export interface GenerateProductVariants {
-  /**
-   * Create a set of ProductVariants based on the OptionGroups assigned to the given Product
-   */
-  generateVariantsForProduct: GenerateProductVariants_generateVariantsForProduct;
-}
-
-export interface GenerateProductVariantsVariables {
-  productId: string;
-  defaultPrice?: number | null;
-  defaultSku?: string | null;
-}
-
-/* tslint:disable */
-// This file was automatically generated and should not be edited.
-
-// ====================================================
-// GraphQL mutation operation: UpdateProductVariants
-// ====================================================
-
-export interface UpdateProductVariants_updateProductVariants_options {
-  __typename: "ProductOption";
-  id: string;
-  code: string | null;
-  languageCode: LanguageCode | null;
-  name: string | null;
-}
-
-export interface UpdateProductVariants_updateProductVariants_facetValues {
-  __typename: "FacetValue";
-  id: string;
-  code: string;
-  name: string;
-}
-
-export interface UpdateProductVariants_updateProductVariants_translations {
-  __typename: "ProductVariantTranslation";
-  id: string;
-  languageCode: LanguageCode;
-  name: string;
-}
-
-export interface UpdateProductVariants_updateProductVariants {
-  __typename: "ProductVariant";
-  id: string;
-  languageCode: LanguageCode;
-  name: string;
-  price: number;
-  sku: string;
-  image: string | null;
-  options: UpdateProductVariants_updateProductVariants_options[];
-  facetValues: UpdateProductVariants_updateProductVariants_facetValues[];
-  translations: UpdateProductVariants_updateProductVariants_translations[];
-}
-
-export interface UpdateProductVariants {
-  /**
-   * Update existing ProductVariants
-   */
-  updateProductVariants: (UpdateProductVariants_updateProductVariants | null)[];
-}
-
-export interface UpdateProductVariantsVariables {
-  input: UpdateProductVariantInput[];
-}
-
-/* tslint:disable */
-// This file was automatically generated and should not be edited.
-
-// ====================================================
-// GraphQL mutation operation: CreateProductOptionGroup
-// ====================================================
-
-export interface CreateProductOptionGroup_createProductOptionGroup_translations {
-  __typename: "ProductOptionGroupTranslation";
-  name: string;
-}
-
-export interface CreateProductOptionGroup_createProductOptionGroup_options_translations {
-  __typename: "ProductOptionTranslation";
-  name: string;
-}
-
-export interface CreateProductOptionGroup_createProductOptionGroup_options {
-  __typename: "ProductOption";
-  id: string;
-  languageCode: LanguageCode | null;
-  name: string | null;
-  code: string | null;
-  translations: CreateProductOptionGroup_createProductOptionGroup_options_translations[];
-}
-
-export interface CreateProductOptionGroup_createProductOptionGroup {
-  __typename: "ProductOptionGroup";
-  id: string;
-  languageCode: LanguageCode;
-  code: string;
-  name: string;
-  translations: CreateProductOptionGroup_createProductOptionGroup_translations[];
-  options: CreateProductOptionGroup_createProductOptionGroup_options[];
-}
-
-export interface CreateProductOptionGroup {
-  /**
-   * Create a new ProductOptionGroup
-   */
-  createProductOptionGroup: CreateProductOptionGroup_createProductOptionGroup;
-}
-
-export interface CreateProductOptionGroupVariables {
-  input: CreateProductOptionGroupInput;
-}
-
-/* tslint:disable */
-// This file was automatically generated and should not be edited.
-
-// ====================================================
-// GraphQL mutation operation: AddOptionGroupToProduct
-// ====================================================
-
-export interface AddOptionGroupToProduct_addOptionGroupToProduct_optionGroups_options {
-  __typename: "ProductOption";
-  id: string;
-  code: string | null;
-}
-
-export interface AddOptionGroupToProduct_addOptionGroupToProduct_optionGroups {
-  __typename: "ProductOptionGroup";
-  id: string;
-  code: string;
-  options: AddOptionGroupToProduct_addOptionGroupToProduct_optionGroups_options[];
-}
-
-export interface AddOptionGroupToProduct_addOptionGroupToProduct {
-  __typename: "Product";
-  id: string;
-  optionGroups: AddOptionGroupToProduct_addOptionGroupToProduct_optionGroups[];
-}
-
-export interface AddOptionGroupToProduct {
-  /**
-   * Add an OptionGroup to a Product
-   */
-  addOptionGroupToProduct: AddOptionGroupToProduct_addOptionGroupToProduct;
-}
-
-export interface AddOptionGroupToProductVariables {
-  productId: string;
-  optionGroupId: string;
-}
-
-/* tslint:disable */
-// This file was automatically generated and should not be edited.
-
-// ====================================================
-// GraphQL mutation operation: RemoveOptionGroupFromProduct
-// ====================================================
-
-export interface RemoveOptionGroupFromProduct_removeOptionGroupFromProduct_optionGroups_options {
-  __typename: "ProductOption";
-  id: string;
-  code: string | null;
-}
-
-export interface RemoveOptionGroupFromProduct_removeOptionGroupFromProduct_optionGroups {
-  __typename: "ProductOptionGroup";
-  id: string;
-  code: string;
-  options: RemoveOptionGroupFromProduct_removeOptionGroupFromProduct_optionGroups_options[];
-}
-
-export interface RemoveOptionGroupFromProduct_removeOptionGroupFromProduct {
-  __typename: "Product";
-  id: string;
-  optionGroups: RemoveOptionGroupFromProduct_removeOptionGroupFromProduct_optionGroups[];
-}
-
-export interface RemoveOptionGroupFromProduct {
-  /**
-   * Remove an OptionGroup from a Product
-   */
-  removeOptionGroupFromProduct: RemoveOptionGroupFromProduct_removeOptionGroupFromProduct;
-}
-
-export interface RemoveOptionGroupFromProductVariables {
-  productId: string;
-  optionGroupId: string;
-}
-
-/* tslint:disable */
-// This file was automatically generated and should not be edited.
-
-// ====================================================
-// GraphQL mutation operation: ApplyFacetValuesToProductVariants
-// ====================================================
-
-export interface ApplyFacetValuesToProductVariants_applyFacetValuesToProductVariants_options {
-  __typename: "ProductOption";
-  id: string;
-  code: string | null;
-  languageCode: LanguageCode | null;
-  name: string | null;
-}
-
-export interface ApplyFacetValuesToProductVariants_applyFacetValuesToProductVariants_facetValues {
-  __typename: "FacetValue";
-  id: string;
-  code: string;
-  name: string;
-}
-
-export interface ApplyFacetValuesToProductVariants_applyFacetValuesToProductVariants_translations {
-  __typename: "ProductVariantTranslation";
-  id: string;
-  languageCode: LanguageCode;
-  name: string;
-}
-
-export interface ApplyFacetValuesToProductVariants_applyFacetValuesToProductVariants {
-  __typename: "ProductVariant";
-  id: string;
-  languageCode: LanguageCode;
-  name: string;
-  price: number;
-  sku: string;
-  image: string | null;
-  options: ApplyFacetValuesToProductVariants_applyFacetValuesToProductVariants_options[];
-  facetValues: ApplyFacetValuesToProductVariants_applyFacetValuesToProductVariants_facetValues[];
-  translations: ApplyFacetValuesToProductVariants_applyFacetValuesToProductVariants_translations[];
-}
-
-export interface ApplyFacetValuesToProductVariants {
-  /**
-   * Applies a FacetValue to the given ProductVariants
-   */
-  applyFacetValuesToProductVariants: ApplyFacetValuesToProductVariants_applyFacetValuesToProductVariants[];
-}
-
-export interface ApplyFacetValuesToProductVariantsVariables {
-  facetValueIds: string[];
-  productVariantIds: string[];
-}
-
-/* tslint:disable */
-// This file was automatically generated and should not be edited.
-
-// ====================================================
-// GraphQL query operation: GetFacetList
-// ====================================================
-
-export interface GetFacetList_facets_items_translations {
-  __typename: "FacetTranslation";
-  id: string;
-  languageCode: LanguageCode;
-  name: string;
-}
-
-export interface GetFacetList_facets_items_values_translations {
-  __typename: "FacetValueTranslation";
-  id: string;
-  languageCode: LanguageCode;
-  name: string;
-}
-
-export interface GetFacetList_facets_items_values {
-  __typename: "FacetValue";
-  id: string;
-  languageCode: LanguageCode | null;
-  code: string;
-  name: string;
-  translations: GetFacetList_facets_items_values_translations[];
-}
-
-export interface GetFacetList_facets_items {
-  __typename: "Facet";
-  id: string;
-  languageCode: LanguageCode;
-  code: string;
-  name: string;
-  translations: GetFacetList_facets_items_translations[];
-  values: GetFacetList_facets_items_values[];
-}
-
-export interface GetFacetList_facets {
-  __typename: "FacetList";
-  items: GetFacetList_facets_items[];
-  totalItems: number;
-}
-
-export interface GetFacetList {
-  facets: GetFacetList_facets;
-}
-
-export interface GetFacetListVariables {
-  options?: FacetListOptions | null;
-  languageCode?: LanguageCode | null;
-}
-
-/* tslint:disable */
-// This file was automatically generated and should not be edited.
-
-// ====================================================
-// GraphQL query operation: GetFacetWithValues
-// ====================================================
-
-export interface GetFacetWithValues_facet_translations {
-  __typename: "FacetTranslation";
-  id: string;
-  languageCode: LanguageCode;
-  name: string;
-}
-
-export interface GetFacetWithValues_facet_values_translations {
-  __typename: "FacetValueTranslation";
-  id: string;
-  languageCode: LanguageCode;
-  name: string;
-}
-
-export interface GetFacetWithValues_facet_values {
-  __typename: "FacetValue";
-  id: string;
-  languageCode: LanguageCode | null;
-  code: string;
-  name: string;
-  translations: GetFacetWithValues_facet_values_translations[];
-}
-
-export interface GetFacetWithValues_facet {
-  __typename: "Facet";
-  id: string;
-  languageCode: LanguageCode;
-  code: string;
-  name: string;
-  translations: GetFacetWithValues_facet_translations[];
-  values: GetFacetWithValues_facet_values[];
-}
-
-export interface GetFacetWithValues {
-  facet: GetFacetWithValues_facet | null;
-}
-
-export interface GetFacetWithValuesVariables {
-  id: string;
-  languageCode?: LanguageCode | null;
-}
-
-/* tslint:disable */
-// This file was automatically generated and should not be edited.
-
-// ====================================================
-// GraphQL query operation: GetNetworkStatus
-// ====================================================
-
-export interface GetNetworkStatus_networkStatus {
-  __typename: "NetworkStatus";
-  inFlightRequests: number;
-}
-
-export interface GetNetworkStatus {
-  networkStatus: GetNetworkStatus_networkStatus;
-}
-
-/* tslint:disable */
-// This file was automatically generated and should not be edited.
-
-// ====================================================
-// GraphQL query operation: GetUserStatus
-// ====================================================
-
-export interface GetUserStatus_userStatus {
-  __typename: "UserStatus";
-  username: string;
-  isLoggedIn: boolean;
-  loginTime: string;
-}
-
-export interface GetUserStatus {
-  userStatus: GetUserStatus_userStatus;
-}
-
-/* tslint:disable */
-// This file was automatically generated and should not be edited.
-
-// ====================================================
-// GraphQL query operation: GetUiState
-// ====================================================
-
-export interface GetUiState_uiState {
-  __typename: "UiState";
-  language: LanguageCode;
-}
-
-export interface GetUiState {
-  uiState: GetUiState_uiState;
-}
-
-/* tslint:disable */
-// This file was automatically generated and should not be edited.
-
-// ====================================================
-// GraphQL query operation: GetProductWithVariants
-// ====================================================
-
-export interface GetProductWithVariants_product_translations {
-  __typename: "ProductTranslation";
-  languageCode: LanguageCode;
-  name: string;
-  slug: string;
-  description: string | null;
-}
-
-export interface GetProductWithVariants_product_optionGroups {
-  __typename: "ProductOptionGroup";
-  id: string;
-  languageCode: LanguageCode;
-  code: string;
-  name: string;
-}
-
-export interface GetProductWithVariants_product_variants_options {
-  __typename: "ProductOption";
-  id: string;
-  code: string | null;
-  languageCode: LanguageCode | null;
-  name: string | null;
-}
-
-export interface GetProductWithVariants_product_variants_facetValues {
-  __typename: "FacetValue";
-  id: string;
-  code: string;
-  name: string;
-}
-
-export interface GetProductWithVariants_product_variants_translations {
-  __typename: "ProductVariantTranslation";
-  id: string;
-  languageCode: LanguageCode;
-  name: string;
-}
-
-export interface GetProductWithVariants_product_variants {
-  __typename: "ProductVariant";
-  id: string;
-  languageCode: LanguageCode;
-  name: string;
-  price: number;
-  sku: string;
-  image: string | null;
-  options: GetProductWithVariants_product_variants_options[];
-  facetValues: GetProductWithVariants_product_variants_facetValues[];
-  translations: GetProductWithVariants_product_variants_translations[];
-}
-
-export interface GetProductWithVariants_product {
-  __typename: "Product";
-  id: string;
-  languageCode: LanguageCode;
-  name: string;
-  slug: string;
-  image: string;
-  description: string;
-  translations: GetProductWithVariants_product_translations[];
-  optionGroups: GetProductWithVariants_product_optionGroups[];
-  variants: GetProductWithVariants_product_variants[];
-}
-
-export interface GetProductWithVariants {
-  product: GetProductWithVariants_product | null;
-}
-
-export interface GetProductWithVariantsVariables {
-  id: string;
-  languageCode?: LanguageCode | null;
-}
-
-/* tslint:disable */
-// This file was automatically generated and should not be edited.
-
-// ====================================================
-// GraphQL query operation: GetProductList
-// ====================================================
-
-export interface GetProductList_products_items {
-  __typename: "Product";
-  id: string;
-  languageCode: LanguageCode;
-  name: string;
-  slug: string;
-  description: string;
-}
-
-export interface GetProductList_products {
-  __typename: "ProductList";
-  items: GetProductList_products_items[];
-  totalItems: number;
-}
-
-export interface GetProductList {
-  products: GetProductList_products;
-}
-
-export interface GetProductListVariables {
-  options?: ProductListOptions | null;
-  languageCode?: LanguageCode | null;
-}
-
-/* tslint:disable */
-// This file was automatically generated and should not be edited.
-
-// ====================================================
-// GraphQL query operation: GetProductOptionGroups
-// ====================================================
-
-export interface GetProductOptionGroups_productOptionGroups_options {
-  __typename: "ProductOption";
-  id: string;
-  languageCode: LanguageCode | null;
-  code: string | null;
-  name: string | null;
-}
-
-export interface GetProductOptionGroups_productOptionGroups {
-  __typename: "ProductOptionGroup";
-  id: string;
-  languageCode: LanguageCode;
-  code: string;
-  name: string;
-  options: GetProductOptionGroups_productOptionGroups_options[];
-}
-
-export interface GetProductOptionGroups {
-  productOptionGroups: GetProductOptionGroups_productOptionGroups[];
-}
-
-export interface GetProductOptionGroupsVariables {
-  filterTerm?: string | null;
-  languageCode?: LanguageCode | null;
-}
-
-/* tslint:disable */
-// This file was automatically generated and should not be edited.
-
-// ====================================================
-// GraphQL fragment: FacetValue
-// ====================================================
-
-export interface FacetValue_translations {
-  __typename: "FacetValueTranslation";
-  id: string;
-  languageCode: LanguageCode;
-  name: string;
-}
-
-export interface FacetValue {
-  __typename: "FacetValue";
-  id: string;
-  languageCode: LanguageCode | null;
-  code: string;
-  name: string;
-  translations: FacetValue_translations[];
-}
-
-/* tslint:disable */
-// This file was automatically generated and should not be edited.
-
-// ====================================================
-// GraphQL fragment: FacetWithValues
-// ====================================================
-
-export interface FacetWithValues_translations {
-  __typename: "FacetTranslation";
-  id: string;
-  languageCode: LanguageCode;
-  name: string;
-}
-
-export interface FacetWithValues_values_translations {
-  __typename: "FacetValueTranslation";
-  id: string;
-  languageCode: LanguageCode;
-  name: string;
-}
-
-export interface FacetWithValues_values {
-  __typename: "FacetValue";
-  id: string;
-  languageCode: LanguageCode | null;
-  code: string;
-  name: string;
-  translations: FacetWithValues_values_translations[];
-}
-
-export interface FacetWithValues {
-  __typename: "Facet";
-  id: string;
-  languageCode: LanguageCode;
-  code: string;
-  name: string;
-  translations: FacetWithValues_translations[];
-  values: FacetWithValues_values[];
-}
-
-/* tslint:disable */
-// This file was automatically generated and should not be edited.
-
-// ====================================================
-// GraphQL fragment: ProductVariant
-// ====================================================
-
-export interface ProductVariant_options {
-  __typename: "ProductOption";
-  id: string;
-  code: string | null;
-  languageCode: LanguageCode | null;
-  name: string | null;
-}
-
-export interface ProductVariant_facetValues {
-  __typename: "FacetValue";
-  id: string;
-  code: string;
-  name: string;
-}
-
-export interface ProductVariant_translations {
-  __typename: "ProductVariantTranslation";
-  id: string;
-  languageCode: LanguageCode;
-  name: string;
-}
-
-export interface ProductVariant {
-  __typename: "ProductVariant";
-  id: string;
-  languageCode: LanguageCode;
-  name: string;
-  price: number;
-  sku: string;
-  image: string | null;
-  options: ProductVariant_options[];
-  facetValues: ProductVariant_facetValues[];
-  translations: ProductVariant_translations[];
-}
-
-/* tslint:disable */
-// This file was automatically generated and should not be edited.
-
-// ====================================================
-// GraphQL fragment: ProductWithVariants
-// ====================================================
-
-export interface ProductWithVariants_translations {
-  __typename: "ProductTranslation";
-  languageCode: LanguageCode;
-  name: string;
-  slug: string;
-  description: string | null;
-}
-
-export interface ProductWithVariants_optionGroups {
-  __typename: "ProductOptionGroup";
-  id: string;
-  languageCode: LanguageCode;
-  code: string;
-  name: string;
-}
-
-export interface ProductWithVariants_variants_options {
-  __typename: "ProductOption";
-  id: string;
-  code: string | null;
-  languageCode: LanguageCode | null;
-  name: string | null;
-}
-
-export interface ProductWithVariants_variants_facetValues {
-  __typename: "FacetValue";
-  id: string;
-  code: string;
-  name: string;
-}
-
-export interface ProductWithVariants_variants_translations {
-  __typename: "ProductVariantTranslation";
-  id: string;
-  languageCode: LanguageCode;
-  name: string;
-}
-
-export interface ProductWithVariants_variants {
-  __typename: "ProductVariant";
-  id: string;
-  languageCode: LanguageCode;
-  name: string;
-  price: number;
-  sku: string;
-  image: string | null;
-  options: ProductWithVariants_variants_options[];
-  facetValues: ProductWithVariants_variants_facetValues[];
-  translations: ProductWithVariants_variants_translations[];
-}
-
-export interface ProductWithVariants {
-  __typename: "Product";
-  id: string;
-  languageCode: LanguageCode;
-  name: string;
-  slug: string;
-  image: string;
-  description: string;
-  translations: ProductWithVariants_translations[];
-  optionGroups: ProductWithVariants_optionGroups[];
-  variants: ProductWithVariants_variants[];
-}
-
-/* tslint:disable */
-// This file was automatically generated and should not be edited.
-
-// ====================================================
-// GraphQL fragment: ProductOptionGroup
-// ====================================================
-
-export interface ProductOptionGroup_translations {
-  __typename: "ProductOptionGroupTranslation";
-  name: string;
-}
-
-export interface ProductOptionGroup_options_translations {
-  __typename: "ProductOptionTranslation";
-  name: string;
-}
-
-export interface ProductOptionGroup_options {
-  __typename: "ProductOption";
-  id: string;
-  languageCode: LanguageCode | null;
-  name: string | null;
-  code: string | null;
-  translations: ProductOptionGroup_options_translations[];
-}
-
-export interface ProductOptionGroup {
-  __typename: "ProductOptionGroup";
-  id: string;
-  languageCode: LanguageCode;
-  code: string;
-  name: string;
-  translations: ProductOptionGroup_translations[];
-  options: ProductOptionGroup_options[];
-}
-
-/* tslint:disable */
-// This file was automatically generated and should not be edited.
-
-//==============================================================
-// START Enums and Input Objects
-//==============================================================
-
-/**
- * ISO 639-1 language code
- */
-export enum LanguageCode {
-  aa = "aa",
-  ab = "ab",
-  ae = "ae",
-  af = "af",
-  ak = "ak",
-  am = "am",
-  an = "an",
-  ar = "ar",
-  as = "as",
-  av = "av",
-  ay = "ay",
-  az = "az",
-  ba = "ba",
-  be = "be",
-  bg = "bg",
-  bh = "bh",
-  bi = "bi",
-  bm = "bm",
-  bn = "bn",
-  bo = "bo",
-  br = "br",
-  bs = "bs",
-  ca = "ca",
-  ce = "ce",
-  ch = "ch",
-  co = "co",
-  cr = "cr",
-  cs = "cs",
-  cu = "cu",
-  cv = "cv",
-  cy = "cy",
-  da = "da",
-  de = "de",
-  dv = "dv",
-  dz = "dz",
-  ee = "ee",
-  el = "el",
-  en = "en",
-  eo = "eo",
-  es = "es",
-  et = "et",
-  eu = "eu",
-  fa = "fa",
-  ff = "ff",
-  fi = "fi",
-  fj = "fj",
-  fo = "fo",
-  fr = "fr",
-  fy = "fy",
-  ga = "ga",
-  gd = "gd",
-  gl = "gl",
-  gn = "gn",
-  gu = "gu",
-  gv = "gv",
-  ha = "ha",
-  he = "he",
-  hi = "hi",
-  ho = "ho",
-  hr = "hr",
-  ht = "ht",
-  hu = "hu",
-  hy = "hy",
-  hz = "hz",
-  ia = "ia",
-  id = "id",
-  ie = "ie",
-  ig = "ig",
-  ii = "ii",
-  ik = "ik",
-  io = "io",
-  is = "is",
-  it = "it",
-  iu = "iu",
-  ja = "ja",
-  jv = "jv",
-  ka = "ka",
-  kg = "kg",
-  ki = "ki",
-  kj = "kj",
-  kk = "kk",
-  kl = "kl",
-  km = "km",
-  kn = "kn",
-  ko = "ko",
-  kr = "kr",
-  ks = "ks",
-  ku = "ku",
-  kv = "kv",
-  kw = "kw",
-  ky = "ky",
-  la = "la",
-  lb = "lb",
-  lg = "lg",
-  li = "li",
-  ln = "ln",
-  lo = "lo",
-  lt = "lt",
-  lu = "lu",
-  lv = "lv",
-  mg = "mg",
-  mh = "mh",
-  mi = "mi",
-  mk = "mk",
-  ml = "ml",
-  mn = "mn",
-  mr = "mr",
-  ms = "ms",
-  mt = "mt",
-  my = "my",
-  na = "na",
-  nb = "nb",
-  nd = "nd",
-  ne = "ne",
-  ng = "ng",
-  nl = "nl",
-  nn = "nn",
-  no = "no",
-  nr = "nr",
-  nv = "nv",
-  ny = "ny",
-  oc = "oc",
-  oj = "oj",
-  om = "om",
-  or = "or",
-  os = "os",
-  pa = "pa",
-  pi = "pi",
-  pl = "pl",
-  ps = "ps",
-  pt = "pt",
-  qu = "qu",
-  rm = "rm",
-  rn = "rn",
-  ro = "ro",
-  ru = "ru",
-  rw = "rw",
-  sa = "sa",
-  sc = "sc",
-  sd = "sd",
-  se = "se",
-  sg = "sg",
-  si = "si",
-  sk = "sk",
-  sl = "sl",
-  sm = "sm",
-  sn = "sn",
-  so = "so",
-  sq = "sq",
-  sr = "sr",
-  ss = "ss",
-  st = "st",
-  su = "su",
-  sv = "sv",
-  sw = "sw",
-  ta = "ta",
-  te = "te",
-  tg = "tg",
-  th = "th",
-  ti = "ti",
-  tk = "tk",
-  tl = "tl",
-  tn = "tn",
-  to = "to",
-  tr = "tr",
-  ts = "ts",
-  tt = "tt",
-  tw = "tw",
-  ty = "ty",
-  ug = "ug",
-  uk = "uk",
-  ur = "ur",
-  uz = "uz",
-  ve = "ve",
-  vi = "vi",
-  vo = "vo",
-  wa = "wa",
-  wo = "wo",
-  xh = "xh",
-  yi = "yi",
-  yo = "yo",
-  za = "za",
-  zh = "zh",
-  zu = "zu",
-}
-
-export enum SortOrder {
-  ASC = "ASC",
-  DESC = "DESC",
-}
-
-export interface BooleanOperators {
-  eq?: boolean | null;
-}
-
-export interface CreateFacetCustomFieldsInput {
-  searchable?: boolean | null;
-}
-
-export interface CreateFacetInput {
-  code: string;
-  translations: FacetTranslationInput[];
-  values?: CreateFacetValueInput[] | null;
-  customFields?: CreateFacetCustomFieldsInput | null;
-}
-
-export interface CreateFacetValueCustomFieldsInput {
-  link?: string | null;
-  available?: boolean | null;
-}
-
-export interface CreateFacetValueInput {
-  facetId: string;
-  code: string;
-  translations: FacetValueTranslationInput[];
-  customFields?: CreateFacetValueCustomFieldsInput | null;
-}
-
-export interface CreateProductCustomFieldsInput {
-  infoUrl?: string | null;
-  downloadable?: boolean | null;
-}
-
-export interface CreateProductInput {
-  image?: string | null;
-  translations: (ProductTranslationInput | null)[];
-  optionGroupCodes?: (string | null)[] | null;
-  customFields?: CreateProductCustomFieldsInput | null;
-}
-
-export interface CreateProductOptionGroupInput {
-  code: string;
-  translations: ProductOptionGroupTranslationInput[];
-  options: CreateProductOptionInput[];
-  customFields?: any | null;
-}
-
-export interface CreateProductOptionInput {
-  code: string;
-  translations: ProductOptionGroupTranslationInput[];
-  customFields?: any | null;
-}
-
-export interface DateOperators {
-  eq?: any | null;
-  before?: any | null;
-  after?: any | null;
-  between?: DateRange | null;
-}
-
-export interface DateRange {
-  start: any;
-  end: any;
-}
-
-export interface FacetFilterParameter {
-  name?: StringOperators | null;
-  code?: StringOperators | null;
-  createdAt?: DateOperators | null;
-  updatedAt?: DateOperators | null;
-  searchable?: BooleanOperators | null;
-}
-
-export interface FacetListOptions {
-  take?: number | null;
-  skip?: number | null;
-  sort?: FacetSortParameter | null;
-  filter?: FacetFilterParameter | null;
-}
-
-export interface FacetSortParameter {
-  id?: SortOrder | null;
-  createdAt?: SortOrder | null;
-  updatedAt?: SortOrder | null;
-  name?: SortOrder | null;
-  code?: SortOrder | null;
-  searchable?: SortOrder | null;
-}
-
-export interface FacetTranslationInput {
-  id?: string | null;
-  languageCode: LanguageCode;
-  name: string;
-  customFields?: any | null;
-}
-
-export interface FacetValueTranslationInput {
-  id?: string | null;
-  languageCode: LanguageCode;
-  name: string;
-  customFields?: any | null;
-}
-
-export interface ProductFilterParameter {
-  name?: StringOperators | null;
-  slug?: StringOperators | null;
-  description?: StringOperators | null;
-  createdAt?: DateOperators | null;
-  updatedAt?: DateOperators | null;
-  infoUrl?: StringOperators | null;
-  downloadable?: BooleanOperators | null;
-  nickname?: StringOperators | null;
-}
-
-export interface ProductListOptions {
-  take?: number | null;
-  skip?: number | null;
-  sort?: ProductSortParameter | null;
-  filter?: ProductFilterParameter | null;
-}
-
-export interface ProductOptionGroupTranslationInput {
-  id?: string | null;
-  languageCode: LanguageCode;
-  name: string;
-  customFields?: any | null;
-}
-
-export interface ProductSortParameter {
-  id?: SortOrder | null;
-  createdAt?: SortOrder | null;
-  updatedAt?: SortOrder | null;
-  name?: SortOrder | null;
-  slug?: SortOrder | null;
-  description?: SortOrder | null;
-  image?: SortOrder | null;
-  infoUrl?: SortOrder | null;
-  downloadable?: SortOrder | null;
-  nickname?: SortOrder | null;
-}
-
-export interface ProductTranslationCustomFieldsInput {
-  nickname?: string | null;
-}
-
-export interface ProductTranslationInput {
-  id?: string | null;
-  languageCode: LanguageCode;
-  name: string;
-  slug?: string | null;
-  description?: string | null;
-  customFields?: ProductTranslationCustomFieldsInput | null;
-}
-
-export interface ProductVariantTranslationInput {
-  id?: string | null;
-  languageCode: LanguageCode;
-  name: string;
-  customFields?: any | null;
-}
-
-export interface StringOperators {
-  eq?: string | null;
-  contains?: string | null;
-}
-
-export interface UpdateFacetCustomFieldsInput {
-  searchable?: boolean | null;
-}
-
-export interface UpdateFacetInput {
-  id: string;
-  code: string;
-  translations: FacetTranslationInput[];
-  customFields?: UpdateFacetCustomFieldsInput | null;
-}
-
-export interface UpdateFacetValueCustomFieldsInput {
-  link?: string | null;
-  available?: boolean | null;
-}
-
-export interface UpdateFacetValueInput {
-  id: string;
-  code: string;
-  translations: FacetValueTranslationInput[];
-  customFields?: UpdateFacetValueCustomFieldsInput | null;
-}
-
-export interface UpdateProductCustomFieldsInput {
-  infoUrl?: string | null;
-  downloadable?: boolean | null;
-}
-
-export interface UpdateProductInput {
-  id: string;
-  image?: string | null;
-  translations: (ProductTranslationInput | null)[];
-  optionGroupCodes?: (string | null)[] | null;
-  customFields?: UpdateProductCustomFieldsInput | null;
-}
-
-export interface UpdateProductVariantInput {
-  id: string;
-  translations: ProductVariantTranslationInput[];
-  sku: string;
-  image?: string | null;
-  price: number;
-  customFields?: any | null;
-}
-
-//==============================================================
-// END Enums and Input Objects
-//==============================================================

+ 0 - 10
admin-ui/src/app/data/types/response.ts

@@ -1,10 +0,0 @@
-export interface UserResponse {
-    id: string | number;
-    identifier: string;
-    roles: string[];
-}
-
-export interface LoginResponse {
-    token: string;
-    user: UserResponse;
-}

+ 6 - 0
admin-ui/yarn.lock

@@ -882,6 +882,12 @@ apollo-codegen-typescript@^0.27.1:
     change-case "^3.0.1"
     inflected "^2.0.3"
 
+apollo-link-context@^1.0.8:
+  version "1.0.8"
+  resolved "https://registry.yarnpkg.com/apollo-link-context/-/apollo-link-context-1.0.8.tgz#c967a56ac6ed32add748937735bcb57c5cc64c95"
+  dependencies:
+    apollo-link "^1.2.2"
+
 apollo-link-dedup@^1.0.0:
   version "1.0.9"
   resolved "https://registry.yarnpkg.com/apollo-link-dedup/-/apollo-link-dedup-1.0.9.tgz#3c4e4af88ef027cbddfdb857c043fd0574051dad"

+ 73 - 9
shared/generated-types.ts

@@ -1,6 +1,36 @@
 /* tslint:disable */
 // This file was automatically generated and should not be edited.
 
+// ====================================================
+// GraphQL mutation operation: AttemptLogin
+// ====================================================
+
+export interface AttemptLogin_login_user {
+  __typename: "CurrentUser";
+  id: string;
+  identifier: string;
+  channelTokens: string[];
+  roles: string[];
+}
+
+export interface AttemptLogin_login {
+  __typename: "LoginResult";
+  user: AttemptLogin_login_user;
+  authToken: string;
+}
+
+export interface AttemptLogin {
+  login: AttemptLogin_login;
+}
+
+export interface AttemptLoginVariables {
+  username: string;
+  password: string;
+}
+
+/* tslint:disable */
+// This file was automatically generated and should not be edited.
+
 // ====================================================
 // GraphQL mutation operation: CreateFacet
 // ====================================================
@@ -194,21 +224,21 @@ export interface RequestCompleted {
 // This file was automatically generated and should not be edited.
 
 // ====================================================
-// GraphQL mutation operation: LogIn
+// GraphQL mutation operation: SetAsLoggedIn
 // ====================================================
 
-export interface LogIn_logIn {
+export interface SetAsLoggedIn_setAsLoggedIn {
   __typename: "UserStatus";
   username: string;
   isLoggedIn: boolean;
   loginTime: string;
 }
 
-export interface LogIn {
-  logIn: LogIn_logIn | null;
+export interface SetAsLoggedIn {
+  setAsLoggedIn: SetAsLoggedIn_setAsLoggedIn | null;
 }
 
-export interface LogInVariables {
+export interface SetAsLoggedInVariables {
   username: string;
   loginTime: string;
 }
@@ -217,18 +247,18 @@ export interface LogInVariables {
 // This file was automatically generated and should not be edited.
 
 // ====================================================
-// GraphQL mutation operation: LogOut
+// GraphQL mutation operation: SetAsLoggedOut
 // ====================================================
 
-export interface LogOut_logOut {
+export interface SetAsLoggedOut_setAsLoggedOut {
   __typename: "UserStatus";
   username: string;
   isLoggedIn: boolean;
   loginTime: string;
 }
 
-export interface LogOut {
-  logOut: LogOut_logOut | null;
+export interface SetAsLoggedOut {
+  setAsLoggedOut: SetAsLoggedOut_setAsLoggedOut | null;
 }
 
 /* tslint:disable */
@@ -727,6 +757,25 @@ export interface ApplyFacetValuesToProductVariantsVariables {
 /* tslint:disable */
 // This file was automatically generated and should not be edited.
 
+// ====================================================
+// GraphQL query operation: GetCurrentUser
+// ====================================================
+
+export interface GetCurrentUser_me {
+  __typename: "CurrentUser";
+  id: string;
+  identifier: string;
+  channelTokens: string[];
+  roles: string[];
+}
+
+export interface GetCurrentUser {
+  me: GetCurrentUser_me | null;
+}
+
+/* tslint:disable */
+// This file was automatically generated and should not be edited.
+
 // ====================================================
 // GraphQL query operation: GetFacetList
 // ====================================================
@@ -1025,6 +1074,21 @@ export interface GetProductOptionGroupsVariables {
 /* tslint:disable */
 // This file was automatically generated and should not be edited.
 
+// ====================================================
+// GraphQL fragment: CurrentUser
+// ====================================================
+
+export interface CurrentUser {
+  __typename: "CurrentUser";
+  id: string;
+  identifier: string;
+  channelTokens: string[];
+  roles: string[];
+}
+
+/* tslint:disable */
+// This file was automatically generated and should not be edited.
+
 // ====================================================
 // GraphQL fragment: FacetValue
 // ====================================================