@things-factory/integration-sellercraft 5.0.14 → 6.0.0-alpha.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. package/dist-server/controllers/sellercraft/sellercraft.js +6 -6
  2. package/dist-server/controllers/sellercraft/sellercraft.js.map +1 -1
  3. package/dist-server/controllers/sellercraft-api/decorators.js +12 -6
  4. package/dist-server/controllers/sellercraft-api/decorators.js.map +1 -1
  5. package/dist-server/controllers/sellercraft-api/index.js +2 -2
  6. package/dist-server/controllers/sellercraft-api/index.js.map +1 -1
  7. package/dist-server/controllers/sellercraft-channel-integration/apis/ingest-channel-order.js +5 -3
  8. package/dist-server/controllers/sellercraft-channel-integration/apis/ingest-channel-order.js.map +1 -1
  9. package/dist-server/controllers/sellercraft-channel-integration-api/index.js +2 -2
  10. package/dist-server/controllers/sellercraft-channel-integration-api/index.js.map +1 -1
  11. package/dist-server/routers/sellercraft-router.js +29 -3
  12. package/dist-server/routers/sellercraft-router.js.map +1 -1
  13. package/dist-server/service/marketplace-channel/marketplace-channel-order-mutation.js +294 -258
  14. package/dist-server/service/marketplace-channel/marketplace-channel-order-mutation.js.map +1 -1
  15. package/dist-server/service/marketplace-channel/marketplace-channel-product-mutation.js +59 -16
  16. package/dist-server/service/marketplace-channel/marketplace-channel-product-mutation.js.map +1 -1
  17. package/dist-server/service/marketplace-channel/marketplace-channel.js +8 -4
  18. package/dist-server/service/marketplace-channel/marketplace-channel.js.map +1 -1
  19. package/dist-server/service/sellercraft/sellercraft-mutation.js +6 -4
  20. package/dist-server/service/sellercraft/sellercraft-mutation.js.map +1 -1
  21. package/dist-server/service/sellercraft/sellercraft-query.js +6 -8
  22. package/dist-server/service/sellercraft/sellercraft-query.js.map +1 -1
  23. package/dist-server/service/sellercraft/sellercraft.js +8 -4
  24. package/dist-server/service/sellercraft/sellercraft.js.map +1 -1
  25. package/dist-server/tsconfig.tsbuildinfo +1 -1
  26. package/package.json +16 -16
  27. package/server/controllers/sellercraft/sellercraft.ts +6 -6
  28. package/server/controllers/sellercraft-api/decorators.ts +11 -6
  29. package/server/controllers/sellercraft-api/index.ts +1 -1
  30. package/server/controllers/sellercraft-channel-integration/apis/ingest-channel-order.ts +5 -3
  31. package/server/controllers/sellercraft-channel-integration-api/index.ts +1 -1
  32. package/server/routers/sellercraft-router.ts +45 -4
  33. package/server/service/marketplace-channel/marketplace-channel-order-mutation.ts +348 -310
  34. package/server/service/marketplace-channel/marketplace-channel-product-mutation.ts +78 -17
  35. package/server/service/marketplace-channel/marketplace-channel.ts +4 -0
  36. package/server/service/sellercraft/sellercraft-mutation.ts +17 -9
  37. package/server/service/sellercraft/sellercraft-query.ts +7 -8
  38. package/server/service/sellercraft/sellercraft.ts +5 -1
@@ -1,29 +1,42 @@
1
1
  import { Arg, Ctx, Mutation, Resolver } from 'type-graphql'
2
- import { getRepository } from 'typeorm'
3
2
 
4
3
  import { config } from '@things-factory/env'
5
4
  import { StoreAPI } from '@things-factory/integration-marketplace'
5
+ import { getRepository } from '@things-factory/shell'
6
6
 
7
7
  import { SellercraftChannelIntegrationAPI } from '../../controllers/sellercraft-channel-integration-api'
8
- import { MarketplaceChannel } from './marketplace-channel'
9
8
  import { getShops } from '../../utils/tokencraft-util'
9
+ import { MarketplaceChannel } from './marketplace-channel'
10
10
 
11
11
  @Resolver()
12
12
  export class MarketplaceChannelProductMutation {
13
13
  @Mutation(returns => Boolean)
14
14
  async syncAllMarketplaceChannelProducts(
15
- @Ctx() context: any,
15
+ @Ctx() context: ResolverContext,
16
16
  @Arg('fromUpdatedDate', { nullable: true }) fromUpdatedDate?: string,
17
- @Arg('toUpdatedDate', { nullable: true }) toUpdatedDate?: string
17
+ @Arg('toUpdatedDate', { nullable: true }) toUpdatedDate?: string,
18
+ @Arg('productBatchSize', { nullable: true }) productBatchSize?: string,
19
+ @Arg('channelId', { nullable: true }) channelId?: string,
20
+ @Arg('shopId', { nullable: true }) shopId?: string,
21
+ @Arg('airflow', { nullable: true }) airflow?: boolean
18
22
  ): Promise<boolean> {
19
23
  const sellercraftChannelIntegrationConfig = config.get('sellercraftChannelIntegrationConfig', {})
20
24
 
21
- const channels: MarketplaceChannel[] = await getRepository(MarketplaceChannel).find({ where: { isActive: true } })
25
+ let channels: MarketplaceChannel[] = await getRepository(MarketplaceChannel).find({ where: { isActive: true } })
26
+ let errors: any = []
27
+
28
+ if (channelId) {
29
+ channels = channels.filter(channel => channel.channelId == channelId)
30
+ }
22
31
 
23
32
  for (var i = 0; i < channels.length; i++) {
24
33
  try {
25
34
  let shops: any = await getShops(channels[i].channelId)
26
35
 
36
+ if (shopId) {
37
+ shops = shops.filter(shop => shop.channel_shop_id == shopId)
38
+ }
39
+
27
40
  for (var j = 0; j < shops.length; j++) {
28
41
  try {
29
42
  var store = {
@@ -47,14 +60,24 @@ export class MarketplaceChannelProductMutation {
47
60
  let totalPages: number = 1
48
61
  let limit: number = 50
49
62
  let parentLinks = []
63
+ let cursor: string
50
64
 
51
65
  for (let page = 0; page < totalPages; page++) {
52
- const { results, total, parentLinkList } = await StoreAPI.getStoreProducts(store, {
53
- pagination: { page, limit }
66
+ const {
67
+ results,
68
+ total,
69
+ parentLinkList,
70
+ page_info: nextCursor
71
+ } = await StoreAPI.getStoreProducts(store, {
72
+ pagination: { page, limit },
73
+ pageInfo: cursor,
74
+ fromUpdatedDate,
75
+ toUpdatedDate
54
76
  })
55
77
  totalPages = Math.ceil(total / limit)
56
78
  productResult.push(...results)
57
79
  if (store.platform == 'magento') parentLinks.push(...parentLinkList)
80
+ cursor = nextCursor
58
81
  }
59
82
 
60
83
  const categoryResult = []
@@ -74,7 +97,16 @@ export class MarketplaceChannelProductMutation {
74
97
  }
75
98
 
76
99
  let mappedProducts = productResult.map(item => {
77
- let { categoryId, itemId: productId, name, brand, isVerified, images, sellercraftAttributes, variations } = item
100
+ let {
101
+ categoryId,
102
+ itemId: productId,
103
+ name,
104
+ brand,
105
+ isVerified,
106
+ images,
107
+ sellercraftAttributes,
108
+ variations
109
+ } = item
78
110
 
79
111
  variations = variations.map(variation => {
80
112
  let {
@@ -203,18 +235,47 @@ export class MarketplaceChannelProductMutation {
203
235
  await SellercraftChannelIntegrationAPI.ingestChannelCategories(sellercraftStore, {
204
236
  categories: mappedCategories
205
237
  })
206
- } catch (e) {}
238
+ } catch (e) {
239
+ errors.push({
240
+ name: 'Category Ingestion Error',
241
+ msg: JSON.stringify(e) || {}
242
+ })
243
+ }
207
244
 
208
- try {
209
- for (let k = 0, l = mappedProducts.length; k < l; k++) {
210
- await SellercraftChannelIntegrationAPI.ingestChannelProduct(sellercraftStore, {
211
- products: [mappedProducts[k]]
212
- })
245
+ let bs = parseInt(productBatchSize) || mappedProducts.length
246
+
247
+ if (mappedProducts.length > 0) {
248
+ while (mappedProducts.length > 0) {
249
+ let spliceResult = mappedProducts.splice(0, mappedProducts.length >= bs ? bs : mappedProducts.length)
250
+
251
+ try {
252
+ await SellercraftChannelIntegrationAPI.ingestChannelProduct(sellercraftStore, {
253
+ products: spliceResult
254
+ })
255
+ } catch (e) {
256
+ errors.push({
257
+ name: 'Product Ingestion Error',
258
+ msg: JSON.stringify(e) || {}
259
+ })
260
+ }
213
261
  }
214
- } catch (e) {}
215
- } catch (e) {}
262
+ }
263
+ } catch (e) {
264
+ errors.push({
265
+ name: 'Product Processing / Mapping Error',
266
+ msg: JSON.stringify(e) || {}
267
+ })
268
+ }
216
269
  }
217
- } catch (e) {}
270
+ } catch (e) {
271
+ errors.push({
272
+ name: 'Store Error',
273
+ msg: JSON.stringify(e) || {}
274
+ })
275
+ }
276
+ }
277
+ if (errors.length > 1 && airflow) {
278
+ throw errors
218
279
  }
219
280
  return true
220
281
  }
@@ -40,6 +40,10 @@ export class MarketplaceChannel {
40
40
  @Field()
41
41
  channelId: string
42
42
 
43
+ @Column({ nullable: true })
44
+ @Field({ nullable: true })
45
+ countryCode: string
46
+
43
47
  @Column({ default: true })
44
48
  @Field()
45
49
  isActive: boolean
@@ -9,7 +9,10 @@ import { NewSellercraft, SellercraftPatch } from './sellercraft-type'
9
9
  export class SellercraftMutation {
10
10
  @Directive('@transaction')
11
11
  @Mutation(returns => Sellercraft, { description: 'To create new Sellercraft' })
12
- async createSellercraft(@Arg('sellercraft') sellercraft: NewSellercraft, @Ctx() context: any): Promise<Sellercraft> {
12
+ async createSellercraft(
13
+ @Arg('sellercraft') sellercraft: NewSellercraft,
14
+ @Ctx() context: ResolverContext
15
+ ): Promise<Sellercraft> {
13
16
  const { domain, user, tx } = context.state
14
17
 
15
18
  return await tx.getRepository(Sellercraft).save({
@@ -26,12 +29,12 @@ export class SellercraftMutation {
26
29
  async updateSellercraft(
27
30
  @Arg('id') id: string,
28
31
  @Arg('patch') patch: SellercraftPatch,
29
- @Ctx() context: any
32
+ @Ctx() context: ResolverContext
30
33
  ): Promise<Sellercraft> {
31
34
  const { user, tx } = context.state
32
35
 
33
36
  const repository = tx.getRepository(Sellercraft)
34
- const sellercraft = await repository.findOne(id)
37
+ const sellercraft = await repository.findOneBy({ id })
35
38
 
36
39
  return await repository.save({
37
40
  ...sellercraft,
@@ -44,7 +47,7 @@ export class SellercraftMutation {
44
47
  @Mutation(returns => [Sellercraft], { description: "To modify multiple Sellercrafts' information" })
45
48
  async updateMultipleSellercraft(
46
49
  @Arg('patches', type => [SellercraftPatch]) patches: SellercraftPatch[],
47
- @Ctx() context: any
50
+ @Ctx() context: ResolverContext
48
51
  ): Promise<Sellercraft[]> {
49
52
  const { domain, user, tx } = context.state
50
53
 
@@ -74,7 +77,7 @@ export class SellercraftMutation {
74
77
  if (_updateRecords.length > 0) {
75
78
  for (let i = 0; i < _updateRecords.length; i++) {
76
79
  const newRecord = _updateRecords[i]
77
- const sellercraft = await sellercraftRepo.findOne(newRecord.id)
80
+ const sellercraft = await sellercraftRepo.findOneBy({ id: newRecord.id })
78
81
 
79
82
  const result = await sellercraftRepo.save({
80
83
  ...sellercraft,
@@ -91,18 +94,23 @@ export class SellercraftMutation {
91
94
 
92
95
  @Directive('@transaction')
93
96
  @Mutation(returns => Boolean, { description: 'To delete Sellercraft' })
94
- async deleteSellercraft(@Arg('id') id: string, @Ctx() context: any): Promise<boolean> {
97
+ async deleteSellercraft(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<boolean> {
95
98
  const { domain, tx } = context.state
96
99
 
97
- await tx.getRepository(Sellercraft).delete({ domain, id })
100
+ await tx.getRepository(Sellercraft).delete({ domain: { id: domain.id }, id })
98
101
  return true
99
102
  }
100
103
 
101
104
  @Directive('@transaction')
102
105
  @Mutation(returns => Boolean, { description: 'To delete multiple sellercrafts' })
103
- async deleteSellercrafts(@Arg('ids', type => [String]) ids: string[], @Ctx() context: any): Promise<boolean> {
106
+ async deleteSellercrafts(
107
+ @Arg('ids', type => [String]) ids: string[],
108
+ @Ctx() context: ResolverContext
109
+ ): Promise<boolean> {
104
110
  const { domain, tx, user } = context.state
105
- let sellercrafts: Sellercraft[] = await tx.getRepository(Sellercraft).find({ where: { domain, id: In(ids) } })
111
+ let sellercrafts: Sellercraft[] = await tx
112
+ .getRepository(Sellercraft)
113
+ .find({ where: { domain: { id: domain.id }, id: In(ids) } })
106
114
 
107
115
  sellercrafts = sellercrafts.map((sellercraft: Sellercraft) => {
108
116
  return {
@@ -1,8 +1,7 @@
1
1
  import { Arg, Args, Ctx, FieldResolver, Query, Resolver, Root } from 'type-graphql'
2
- import { getRepository } from 'typeorm'
3
2
 
4
3
  import { User } from '@things-factory/auth-base'
5
- import { convertListParams, Domain, ListParam } from '@things-factory/shell'
4
+ import { convertListParams, Domain, getRepository, ListParam } from '@things-factory/shell'
6
5
 
7
6
  import { Sellercraft } from './sellercraft'
8
7
  import { SellercraftList } from './sellercraft-type'
@@ -10,12 +9,12 @@ import { SellercraftList } from './sellercraft-type'
10
9
  @Resolver(Sellercraft)
11
10
  export class SellercraftQuery {
12
11
  @Query(returns => Sellercraft, { description: 'To fetch a Sellercraft' })
13
- async sellercraft(@Arg('id') id: string, @Ctx() context: any): Promise<Sellercraft> {
14
- return await getRepository(Sellercraft).findOne(id)
12
+ async sellercraft(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<Sellercraft> {
13
+ return await getRepository(Sellercraft).findOneBy({ id })
15
14
  }
16
15
 
17
16
  @Query(returns => SellercraftList, { description: 'To fetch multiple Sellercrafts' })
18
- async sellercrafts(@Args() params: ListParam, @Ctx() context: any): Promise<SellercraftList> {
17
+ async sellercrafts(@Args() params: ListParam, @Ctx() context: ResolverContext): Promise<SellercraftList> {
19
18
  const { domain } = context.state
20
19
 
21
20
  const convertedParams = convertListParams(params, { domain })
@@ -26,16 +25,16 @@ export class SellercraftQuery {
26
25
 
27
26
  @FieldResolver(type => Domain)
28
27
  async domain(@Root() sellercraft: Sellercraft): Promise<Domain> {
29
- return await getRepository(Domain).findOne(sellercraft.domainId)
28
+ return await getRepository(Domain).findOneBy({ id: sellercraft.domainId })
30
29
  }
31
30
 
32
31
  @FieldResolver(type => User)
33
32
  async updater(@Root() sellercraft: Sellercraft): Promise<User> {
34
- return await getRepository(User).findOne(sellercraft.updaterId)
33
+ return await getRepository(User).findOneBy({ id: sellercraft.updaterId })
35
34
  }
36
35
 
37
36
  @FieldResolver(type => User)
38
37
  async creator(@Root() sellercraft: Sellercraft): Promise<User> {
39
- return await getRepository(User).findOne(sellercraft.creatorId)
38
+ return await getRepository(User).findOneBy({ id: sellercraft.creatorId })
40
39
  }
41
40
  }
@@ -11,7 +11,7 @@ import {
11
11
  } from 'typeorm'
12
12
 
13
13
  import { User } from '@things-factory/auth-base'
14
- import { Domain } from '@things-factory/shell'
14
+ import { Domain, ScalarObject } from '@things-factory/shell'
15
15
 
16
16
  export enum SellercraftStatus {
17
17
  ACTIVE = 'ACTIVE',
@@ -68,6 +68,10 @@ export class Sellercraft {
68
68
  @Field({ nullable: true })
69
69
  status?: SellercraftStatus
70
70
 
71
+ @Column('simple-json', { nullable: true })
72
+ @Field(type => ScalarObject, { nullable: true })
73
+ sellercraftSetting?: object
74
+
71
75
  @CreateDateColumn()
72
76
  @Field({ nullable: true })
73
77
  createdAt?: Date