mock-data.service.ts 10 KB

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