mock-data-client.service.ts 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. import * as faker from 'faker/locale/en_GB';
  2. import { request } from 'graphql-request';
  3. import { PasswordService } from '../src/auth/password.service';
  4. import { CreateAddressDto } from '../src/entity/address/address.dto';
  5. import { CreateAdministratorDto } from '../src/entity/administrator/administrator.dto';
  6. import { CreateCustomerDto } from '../src/entity/customer/customer.dto';
  7. import { Customer } from '../src/entity/customer/customer.entity';
  8. import { CreateProductOptionGroupDto } from '../src/entity/product-option-group/product-option-group.dto';
  9. import { CreateProductVariantDto } from '../src/entity/product-variant/create-product-variant.dto';
  10. import { CreateProductDto } from '../src/entity/product/product.dto';
  11. import { Product } from '../src/entity/product/product.entity';
  12. import { LanguageCode } from '../src/locale/language-code';
  13. import { TranslationInput } from '../src/locale/locale-types';
  14. // tslint:disable:no-console
  15. /**
  16. * A service for creating mock data via the GraphQL API.
  17. */
  18. export class MockDataClientService {
  19. async populateOptions(): Promise<any> {
  20. const query = `mutation($input: CreateProductOptionGroupInput) {
  21. createProductOptionGroup(input: $input) { id }
  22. }`;
  23. const variables = {
  24. input: {
  25. code: 'size',
  26. translations: [{ languageCode: 'en', name: 'Size' }, { languageCode: 'de', name: 'Größe' }],
  27. options: [
  28. {
  29. code: 'small',
  30. translations: [{ languageCode: 'en', name: 'Small' }, { languageCode: 'de', name: 'Klein' }],
  31. },
  32. {
  33. code: 'large',
  34. translations: [{ languageCode: 'en', name: 'Large' }, { languageCode: 'de', name: 'Groß' }],
  35. },
  36. ],
  37. } as CreateProductOptionGroupDto,
  38. };
  39. await request('http://localhost:3000/graphql', query, variables).then(
  40. data => console.log('Created Administrator:', data),
  41. err => console.log(err),
  42. );
  43. console.log('created size options');
  44. }
  45. async populateAdmins(): Promise<any> {
  46. const query = `mutation($input: CreateAdministratorInput!) {
  47. createAdministrator(input: $input) { id, emailAddress }
  48. }`;
  49. const variables = {
  50. input: {
  51. firstName: 'Super',
  52. lastName: 'Admin',
  53. emailAddress: 'admin@test.com',
  54. password: 'test',
  55. } as CreateAdministratorDto,
  56. };
  57. await request('http://localhost:3000/graphql', query, variables).then(
  58. data => console.log('Created Administrator:', data),
  59. err => console.log(err),
  60. );
  61. }
  62. async populateCustomers(count: number = 5): Promise<any> {
  63. const passwordService = new PasswordService();
  64. for (let i = 0; i < count; i++) {
  65. const firstName = faker.name.firstName();
  66. const lastName = faker.name.lastName();
  67. const query1 = `mutation CreateCustomer($input: CreateCustomerInput!, $password: String) {
  68. createCustomer(input: $input, password: $password) { id, emailAddress }
  69. }`;
  70. const variables1 = {
  71. input: {
  72. firstName,
  73. lastName,
  74. emailAddress: faker.internet.email(firstName, lastName),
  75. phoneNumber: faker.phone.phoneNumber(),
  76. } as CreateCustomerDto,
  77. password: 'test',
  78. };
  79. const customer: Customer | void = await request('http://localhost:3000/graphql', query1, variables1).then(
  80. (data: any) => {
  81. console.log('Created Customer:', data);
  82. return data.createCustomer as Customer;
  83. },
  84. err => console.log(err),
  85. );
  86. if (customer) {
  87. const query2 = `mutation($customerId: String!, $input: CreateAddressInput) {
  88. createCustomerAddress(customerId: $customerId, input: $input) {
  89. id
  90. streetLine1
  91. }
  92. }`;
  93. const variables2 = {
  94. input: {
  95. fullName: `${firstName} ${lastName}`,
  96. streetLine1: faker.address.streetAddress(),
  97. city: faker.address.city(),
  98. province: faker.address.county(),
  99. postalCode: faker.address.zipCode(),
  100. country: faker.address.country(),
  101. } as CreateAddressDto,
  102. customerId: customer.id,
  103. };
  104. await request('http://localhost:3000/graphql', query2, variables2).then(
  105. data => {
  106. console.log('Created Customer:', data);
  107. return data as Customer;
  108. },
  109. err => console.log(err),
  110. );
  111. }
  112. }
  113. }
  114. async populateProducts(count: number = 5): Promise<any> {
  115. for (let i = 0; i < count; i++) {
  116. const query = `mutation CreateProduct($input: CreateProductInput) {
  117. createProduct(input: $input) { id, name }
  118. }`;
  119. const name = faker.commerce.productName();
  120. const slug = name.toLowerCase().replace(/\s+/g, '-');
  121. const description = faker.lorem.sentence();
  122. const languageCodes = [LanguageCode.EN, LanguageCode.DE, LanguageCode.ES];
  123. const variables = {
  124. input: {
  125. image: faker.image.imageUrl(),
  126. optionGroupCodes: ['size'],
  127. translations: languageCodes.map(code => this.makeProductTranslation(code, name, slug, description)),
  128. variants: [
  129. this.makeProductVariant(`${name} Variant 1`, languageCodes),
  130. this.makeProductVariant(`${name} Variant 2`, languageCodes),
  131. ],
  132. } as CreateProductDto,
  133. };
  134. await request('http://localhost:3000/graphql', query, variables).then(
  135. data => console.log('Created Product:', data),
  136. err => console.log(err),
  137. );
  138. }
  139. }
  140. private makeProductTranslation(
  141. languageCode: LanguageCode,
  142. name: string,
  143. slug: string,
  144. description: string,
  145. ): TranslationInput<Product> {
  146. return {
  147. languageCode,
  148. name: `${languageCode} ${name}`,
  149. slug: `${languageCode} ${slug}`,
  150. description: `${languageCode} ${description}`,
  151. };
  152. }
  153. private makeProductVariant(variantName: string, languageCodes: LanguageCode[]): CreateProductVariantDto {
  154. return {
  155. price: faker.random.number({ min: 100, max: 5000 }),
  156. optionCodes: ['small'],
  157. sku: faker.random.alphaNumeric(8).toUpperCase(),
  158. translations: languageCodes.map(code => ({
  159. languageCode: code,
  160. name: `${variantName} ${code}`,
  161. })),
  162. };
  163. }
  164. }