mock-data.service.ts 9.9 KB

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