mock-data.service.ts 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. import * as faker from 'faker/locale/en_GB';
  2. import gql from 'graphql-tag';
  3. import {
  4. CreateProduct,
  5. CreateProductOptionGroup,
  6. CreateProductOptionGroupVariables,
  7. CreateProductVariables,
  8. GenerateProductVariants,
  9. GenerateProductVariantsVariables,
  10. LanguageCode,
  11. ProductTranslationInput,
  12. UpdateProductVariants,
  13. UpdateProductVariantsVariables,
  14. } from 'shared/generated-types';
  15. import {
  16. CREATE_PRODUCT,
  17. CREATE_PRODUCT_OPTION_GROUP,
  18. GENERATE_PRODUCT_VARIANTS,
  19. UPDATE_PRODUCT_VARIANTS,
  20. } from '../../admin-ui/src/app/data/mutations/product-mutations';
  21. import { CreateAddressDto } from '../src/entity/address/address.dto';
  22. import { CreateAdministratorDto } from '../src/entity/administrator/administrator.dto';
  23. import { CreateCustomerDto } from '../src/entity/customer/customer.dto';
  24. import { Customer } from '../src/entity/customer/customer.entity';
  25. import { GraphQlClient } from './simple-graphql-client';
  26. // tslint:disable:no-console
  27. /**
  28. * A service for creating mock data via the GraphQL API.
  29. */
  30. export class MockDataService {
  31. apiUrl: string;
  32. constructor(private client: GraphQlClient, private logging = true) {
  33. // make the generated results deterministic
  34. faker.seed(1);
  35. }
  36. async populateOptions(): Promise<any> {
  37. await this.client
  38. .query<CreateProductOptionGroup, CreateProductOptionGroupVariables>(CREATE_PRODUCT_OPTION_GROUP, {
  39. input: {
  40. code: 'size',
  41. translations: [
  42. { languageCode: LanguageCode.en, name: 'Size' },
  43. { languageCode: LanguageCode.de, name: 'Größe' },
  44. ],
  45. options: [
  46. {
  47. code: 'small',
  48. translations: [
  49. { languageCode: LanguageCode.en, name: 'Small' },
  50. { languageCode: LanguageCode.de, name: 'Klein' },
  51. ],
  52. },
  53. {
  54. code: 'large',
  55. translations: [
  56. { languageCode: LanguageCode.en, name: 'Large' },
  57. { languageCode: LanguageCode.de, name: 'Groß' },
  58. ],
  59. },
  60. ],
  61. },
  62. })
  63. .then(
  64. data => this.log('Created option group:', data.createProductOptionGroup.name),
  65. err => this.log(err),
  66. );
  67. }
  68. async populateAdmins(): Promise<any> {
  69. const query = gql`
  70. mutation($input: CreateAdministratorInput!) {
  71. createAdministrator(input: $input) {
  72. id
  73. emailAddress
  74. }
  75. }
  76. `;
  77. const variables = {
  78. input: {
  79. firstName: 'Super',
  80. lastName: 'Admin',
  81. emailAddress: 'admin@test.com',
  82. password: 'test',
  83. } as CreateAdministratorDto,
  84. };
  85. await this.client
  86. .query(query, variables)
  87. .then(data => this.log('Created Administrator:', data), err => this.log(err));
  88. }
  89. async populateCustomers(count: number = 5): Promise<any> {
  90. for (let i = 0; i < count; i++) {
  91. const firstName = faker.name.firstName();
  92. const lastName = faker.name.lastName();
  93. const query1 = gql`
  94. mutation CreateCustomer($input: CreateCustomerInput!, $password: String) {
  95. createCustomer(input: $input, password: $password) {
  96. id
  97. emailAddress
  98. }
  99. }
  100. `;
  101. const variables1 = {
  102. input: {
  103. firstName,
  104. lastName,
  105. emailAddress: faker.internet.email(firstName, lastName),
  106. phoneNumber: faker.phone.phoneNumber(),
  107. } as CreateCustomerDto,
  108. password: 'test',
  109. };
  110. const customer: Customer | void = await this.client
  111. .query(query1, variables1)
  112. .then((data: any) => data.createCustomer as Customer, err => this.log(err));
  113. if (customer) {
  114. const query2 = gql`
  115. mutation($customerId: ID!, $input: CreateAddressInput) {
  116. createCustomerAddress(customerId: $customerId, input: $input) {
  117. id
  118. streetLine1
  119. }
  120. }
  121. `;
  122. const variables2 = {
  123. input: {
  124. fullName: `${firstName} ${lastName}`,
  125. streetLine1: faker.address.streetAddress(),
  126. city: faker.address.city(),
  127. province: faker.address.county(),
  128. postalCode: faker.address.zipCode(),
  129. country: faker.address.country(),
  130. } as CreateAddressDto,
  131. customerId: customer.id,
  132. };
  133. await this.client.query(query2, variables2).then(
  134. data => {
  135. this.log(`Created Customer ${i + 1}:`, data);
  136. return data as Customer;
  137. },
  138. err => this.log(err),
  139. );
  140. }
  141. }
  142. }
  143. async populateProducts(count: number = 5): Promise<any> {
  144. for (let i = 0; i < count; i++) {
  145. const query = CREATE_PRODUCT;
  146. const name = faker.commerce.productName();
  147. const slug = name.toLowerCase().replace(/\s+/g, '-');
  148. const description = faker.lorem.sentence();
  149. const languageCodes = [LanguageCode.en, LanguageCode.de];
  150. const variables = {
  151. input: {
  152. image: faker.image.imageUrl(),
  153. optionGroupCodes: ['size'],
  154. translations: languageCodes.map(code =>
  155. this.makeProductTranslation(code, name, slug, description),
  156. ),
  157. },
  158. };
  159. const product = await this.client
  160. .query<CreateProduct, CreateProductVariables>(query, variables)
  161. .then(
  162. data => {
  163. this.log(`Created Product ${i + 1}:`, data.createProduct.name);
  164. return data;
  165. },
  166. err => this.log(err),
  167. );
  168. if (product) {
  169. const prodWithVariants = await this.makeProductVariant(product.createProduct.id);
  170. const variants = prodWithVariants.generateVariantsForProduct.variants;
  171. for (const variant of variants) {
  172. const variantEN = variant.translations[0];
  173. const variantDE = { ...variantEN };
  174. variantDE.languageCode = LanguageCode.de;
  175. variantDE.name = variantDE.name.replace(LanguageCode.en, LanguageCode.de);
  176. delete variantDE.id;
  177. variant.translations.push(variantDE);
  178. }
  179. await this.client.query<UpdateProductVariants, UpdateProductVariantsVariables>(
  180. UPDATE_PRODUCT_VARIANTS,
  181. {
  182. input: variants.map(({ id, translations, sku, price }) => ({
  183. id,
  184. translations,
  185. sku,
  186. price,
  187. })),
  188. },
  189. );
  190. }
  191. }
  192. }
  193. private makeProductTranslation(
  194. languageCode: LanguageCode,
  195. name: string,
  196. slug: string,
  197. description: string,
  198. ): ProductTranslationInput {
  199. return {
  200. languageCode,
  201. name: `${languageCode} ${name}`,
  202. slug: `${languageCode} ${slug}`,
  203. description: `${languageCode} ${description}`,
  204. };
  205. }
  206. private async makeProductVariant(productId: string): Promise<GenerateProductVariants> {
  207. const query = GENERATE_PRODUCT_VARIANTS;
  208. return this.client.query<GenerateProductVariants, GenerateProductVariantsVariables>(query, {
  209. productId,
  210. });
  211. }
  212. private log(...args: any[]) {
  213. if (this.logging) {
  214. console.log(...args);
  215. }
  216. }
  217. }