@things-factory/integration-sellercraft 8.0.0-beta.8 → 8.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/dist-server/tsconfig.tsbuildinfo +1 -1
  2. package/package.json +14 -14
  3. package/server/constants/index.ts +2 -0
  4. package/server/constants/order-status-mapping.ts +28 -0
  5. package/server/constants/platform.ts +6 -0
  6. package/server/controllers/index.ts +5 -0
  7. package/server/controllers/sellercraft/apis/add-inbound-order.ts +50 -0
  8. package/server/controllers/sellercraft/apis/echo.ts +14 -0
  9. package/server/controllers/sellercraft/apis/fetch-order-document.ts +18 -0
  10. package/server/controllers/sellercraft/apis/index.ts +8 -0
  11. package/server/controllers/sellercraft/apis/initiate-order-document.ts +17 -0
  12. package/server/controllers/sellercraft/apis/initiate-order-shipment.ts +29 -0
  13. package/server/controllers/sellercraft/apis/pack-marketplace-order.ts +35 -0
  14. package/server/controllers/sellercraft/apis/update-marketplace-order.ts +14 -0
  15. package/server/controllers/sellercraft/apis/update-product.ts +21 -0
  16. package/server/controllers/sellercraft/index.ts +7 -0
  17. package/server/controllers/sellercraft/platform-action.ts +39 -0
  18. package/server/controllers/sellercraft/sellercraft.ts +109 -0
  19. package/server/controllers/sellercraft-api/decorators.ts +52 -0
  20. package/server/controllers/sellercraft-api/index.ts +51 -0
  21. package/server/controllers/sellercraft-api/types.ts +0 -0
  22. package/server/controllers/sellercraft-channel-integration/apis/echo.ts +14 -0
  23. package/server/controllers/sellercraft-channel-integration/apis/index.ts +6 -0
  24. package/server/controllers/sellercraft-channel-integration/apis/ingest-channel-categories.ts +37 -0
  25. package/server/controllers/sellercraft-channel-integration/apis/ingest-channel-category-attributes.ts +65 -0
  26. package/server/controllers/sellercraft-channel-integration/apis/ingest-channel-order-package.ts +62 -0
  27. package/server/controllers/sellercraft-channel-integration/apis/ingest-channel-order.ts +92 -0
  28. package/server/controllers/sellercraft-channel-integration/apis/ingest-channel-product.ts +97 -0
  29. package/server/controllers/sellercraft-channel-integration/index.ts +7 -0
  30. package/server/controllers/sellercraft-channel-integration/platform-action.ts +39 -0
  31. package/server/controllers/sellercraft-channel-integration/sellercraft-channel-integration.ts +115 -0
  32. package/server/controllers/sellercraft-channel-integration-api/decorators.ts +45 -0
  33. package/server/controllers/sellercraft-channel-integration-api/index.ts +45 -0
  34. package/server/controllers/sellercraft-channel-integration-api/types.ts +0 -0
  35. package/server/index.ts +7 -0
  36. package/server/middlewares/index.ts +3 -0
  37. package/server/migrations/index.ts +9 -0
  38. package/server/routers/sellercraft-router.ts +326 -0
  39. package/server/routes.ts +32 -0
  40. package/server/service/index.ts +23 -0
  41. package/server/service/marketplace-channel/index.ts +6 -0
  42. package/server/service/marketplace-channel/marketplace-channel-order-mutation.ts +456 -0
  43. package/server/service/marketplace-channel/marketplace-channel-product-mutation.ts +282 -0
  44. package/server/service/marketplace-channel/marketplace-channel.ts +76 -0
  45. package/server/service/sellercraft/index.ts +6 -0
  46. package/server/service/sellercraft/sellercraft-mutation.ts +126 -0
  47. package/server/service/sellercraft/sellercraft-query.ts +43 -0
  48. package/server/service/sellercraft/sellercraft-type.ts +54 -0
  49. package/server/service/sellercraft/sellercraft.ts +96 -0
  50. package/server/utils/tokencraft-util.ts +60 -0
  51. package/tsconfig.json +9 -0
@@ -0,0 +1,282 @@
1
+ import { Arg, Ctx, Mutation, Resolver } from 'type-graphql'
2
+
3
+ import { config } from '@things-factory/env'
4
+ import { StoreAPI } from '@things-factory/integration-marketplace'
5
+ import { getRepository } from '@things-factory/shell'
6
+
7
+ import { SellercraftChannelIntegrationAPI } from '../../controllers/sellercraft-channel-integration-api'
8
+ import { getShops } from '../../utils/tokencraft-util'
9
+ import { MarketplaceChannel } from './marketplace-channel'
10
+
11
+ @Resolver()
12
+ export class MarketplaceChannelProductMutation {
13
+ @Mutation(returns => Boolean)
14
+ async syncAllMarketplaceChannelProducts(
15
+ @Ctx() context: ResolverContext,
16
+ @Arg('fromUpdatedDate', { nullable: true }) fromUpdatedDate?: 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
22
+ ): Promise<boolean> {
23
+ const sellercraftChannelIntegrationConfig = config.get('sellercraftChannelIntegrationConfig', {})
24
+
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
+ }
31
+
32
+ for (var i = 0; i < channels.length; i++) {
33
+ try {
34
+ let shops: any = await getShops(channels[i].channelId)
35
+
36
+ if (shopId) {
37
+ shops = shops.filter(shop => shop.channel_shop_id == shopId)
38
+ }
39
+
40
+ for (var j = 0; j < shops.length; j++) {
41
+ try {
42
+ var store = {
43
+ accessKey: shops[j]?.credential?.consumer_key || '',
44
+ accessSecret: shops[j]?.credential?.consumer_secret || '',
45
+ storeURL: shops[j]?.credential?.store_url || '',
46
+ platform: channels[i].name,
47
+ accessToken: shops[j]?.credential?.access_token, // Magento+, Tiktok
48
+ channelShopId: shops[j]?.channel_shop_id,
49
+ storeId: shops[j]?.credential?.store_url || ''
50
+ }
51
+
52
+ let countryCode = shops[j].country_code
53
+ let channelCode = shops[j].org_prefix
54
+ let organisationId = shops[j].account_id
55
+ let channelShopId = shops[j].channel_shop_id
56
+
57
+ var sellercraftStore = { ...store, platform: 'sellercraftChannelIntegration' }
58
+
59
+ const productResult = []
60
+ let totalPages: number = 1
61
+ let limit: number = 50
62
+ let parentLinks = []
63
+ let cursor: string
64
+
65
+ for (let page = 0; page < totalPages; page++) {
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
76
+ })
77
+ totalPages = Math.ceil(total / limit)
78
+ productResult.push(...results)
79
+ if (store.platform == 'magento') parentLinks.push(...parentLinkList)
80
+ cursor = nextCursor
81
+ }
82
+
83
+ const categoryResult = []
84
+ let totalPagesCategory: number = 1
85
+ let limitCategory: number = 100
86
+
87
+ if (store.platform != 'shopify') {
88
+ for (let page = 0; page < totalPagesCategory; page++) {
89
+ const { results, total } = await StoreAPI.getStoreProductCategories(store, {
90
+ pagination: { page, limitCategory }
91
+ })
92
+ totalPagesCategory = Math.ceil(total / limitCategory)
93
+ categoryResult.push(...results)
94
+ }
95
+ } else {
96
+ categoryResult.push({ id: 1, name: 'default', isActive: true })
97
+ }
98
+
99
+ let mappedProducts = productResult.map(item => {
100
+ let {
101
+ categoryId,
102
+ itemId: productId,
103
+ name,
104
+ brand,
105
+ isVerified,
106
+ images,
107
+ sellercraftAttributes,
108
+ variations
109
+ } = item
110
+
111
+ variations = variations.map(variation => {
112
+ let {
113
+ variationSku,
114
+ variationId,
115
+ name,
116
+ isEnabled: isEnabled,
117
+ isSellable: isSellable,
118
+ sellercraftAttributes,
119
+ stockLocked,
120
+ qty: stockReported,
121
+ costPrice: fullPrice,
122
+ sellPrice: priceDiscounted,
123
+ length,
124
+ width,
125
+ height,
126
+ weight,
127
+ extraMetadata
128
+ } = variation
129
+
130
+ return {
131
+ variationSku,
132
+ variationId,
133
+ name,
134
+ isEnabled,
135
+ isSellable,
136
+ attributes: sellercraftAttributes || [],
137
+ stockLocked,
138
+ stockReported,
139
+ fullPrice: parseFloat(fullPrice) || 0,
140
+ priceDiscounted: parseFloat(priceDiscounted) || 0,
141
+ inventoryProducts: [
142
+ {
143
+ qty: 1,
144
+ name: `${name} - ${variationSku}`,
145
+ sku: variationSku,
146
+ productVersions: [
147
+ {
148
+ label: 'Default',
149
+ packageLengthMM: length,
150
+ packageWidthMM: width,
151
+ packageHeightMM: height,
152
+ packageWeightGram: weight,
153
+ qty: stockReported
154
+ }
155
+ ]
156
+ }
157
+ ],
158
+ extraMetadata
159
+ }
160
+ })
161
+
162
+ images = images?.map(image => {
163
+ return {
164
+ url: image
165
+ }
166
+ })
167
+
168
+ return {
169
+ organisationId,
170
+ channelShopId: channelShopId,
171
+ channelCode: channels[i].channelCode,
172
+ channelCountry: shops[j].country_code,
173
+ categoryId: store.platform == 'shopify' ? 1 : categoryId,
174
+ productId: parentLinks.find(e => e.children.includes(productId))?.id || productId,
175
+ name,
176
+ brand,
177
+ isVerified,
178
+ images,
179
+ attributes: sellercraftAttributes || [],
180
+ variations
181
+ }
182
+ })
183
+
184
+ let mappedCategories = categoryResult.map(category => {
185
+ let { id: categoryId, name: categoryName, parent, isActive } = category
186
+
187
+ return {
188
+ categoryId,
189
+ categoryName,
190
+ parent,
191
+ isActive: isActive || true,
192
+ channelCode,
193
+ countryCode,
194
+ childrenCategories: []
195
+ }
196
+ })
197
+
198
+ if (store.platform == 'magento') {
199
+ let newList = []
200
+ for (let np of mappedProducts) {
201
+ if (np.productId == np.variations[0].variationId) {
202
+ let vars = mappedProducts
203
+ .filter(e => e.productId == np.productId)
204
+ .map(e => {
205
+ return e.variations[0]
206
+ })
207
+ np.variations = vars
208
+ if (np.variations.length > 1) {
209
+ np.variations = np.variations.filter(v => v.variationId != np.productId)
210
+ }
211
+ newList.push(np)
212
+ }
213
+ }
214
+ mappedProducts = newList
215
+ }
216
+
217
+ try {
218
+ let filterList = []
219
+ mappedCategories = mappedCategories.map(category => {
220
+ if (mappedCategories.filter(e => e.parent == category.categoryId).length > 0) {
221
+ category.childrenCategories = mappedCategories.filter(e => e.parent == category.categoryId)
222
+ filterList.push(...mappedCategories.filter(e => e.parent == category.categoryId))
223
+ }
224
+ return category
225
+ })
226
+
227
+ mappedCategories = mappedCategories
228
+ .map(mc => {
229
+ if (filterList.indexOf(mc) == -1) {
230
+ return mc
231
+ }
232
+ })
233
+ .filter(e => e)
234
+
235
+ await SellercraftChannelIntegrationAPI.ingestChannelCategories(sellercraftStore, {
236
+ categories: mappedCategories
237
+ })
238
+ } catch (e) {
239
+ errors.push({
240
+ name: 'Category Ingestion Error',
241
+ msg: JSON.stringify(e) || {}
242
+ })
243
+ }
244
+
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
+ }
261
+ }
262
+ }
263
+ } catch (e) {
264
+ errors.push({
265
+ name: 'Product Processing / Mapping Error',
266
+ msg: JSON.stringify(e) || {}
267
+ })
268
+ }
269
+ }
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
279
+ }
280
+ return true
281
+ }
282
+ }
@@ -0,0 +1,76 @@
1
+ import { Field, ID, ObjectType } from 'type-graphql'
2
+ import {
3
+ Column,
4
+ CreateDateColumn,
5
+ Entity,
6
+ Index,
7
+ ManyToOne,
8
+ PrimaryGeneratedColumn,
9
+ RelationId,
10
+ UpdateDateColumn
11
+ } from 'typeorm'
12
+
13
+ import { User } from '@things-factory/auth-base'
14
+ import { Domain } from '@things-factory/shell'
15
+
16
+ @Entity()
17
+ @Index(
18
+ 'ix_marketplace_channel_0 ',
19
+ (marketplaceChannel: MarketplaceChannel) => [marketplaceChannel.domain, marketplaceChannel.name],
20
+ { unique: true }
21
+ )
22
+ @ObjectType({ description: 'Entity for Marketplace Channel' })
23
+ export class MarketplaceChannel {
24
+ @PrimaryGeneratedColumn('uuid')
25
+ @Field(type => ID)
26
+ readonly id: string
27
+
28
+ @ManyToOne(type => Domain)
29
+ @Field(type => Domain)
30
+ domain?: Domain
31
+
32
+ @RelationId((marketplaceChannel: MarketplaceChannel) => marketplaceChannel.domain)
33
+ domainId?: string
34
+
35
+ @Column()
36
+ @Field()
37
+ name: string
38
+
39
+ @Column()
40
+ @Field()
41
+ channelCode: string
42
+
43
+ @Column()
44
+ @Field()
45
+ channelId: string
46
+
47
+ @Column({ nullable: true })
48
+ @Field({ nullable: true })
49
+ countryCode: string
50
+
51
+ @Column({ default: true })
52
+ @Field()
53
+ isActive: boolean
54
+
55
+ @CreateDateColumn()
56
+ @Field({ nullable: true })
57
+ createdAt?: Date
58
+
59
+ @UpdateDateColumn()
60
+ @Field({ nullable: true })
61
+ updatedAt?: Date
62
+
63
+ @ManyToOne(type => User, { nullable: true })
64
+ @Field(type => User, { nullable: true })
65
+ creator?: User
66
+
67
+ @RelationId((marketplaceChannel: MarketplaceChannel) => marketplaceChannel.creator)
68
+ creatorId?: string
69
+
70
+ @ManyToOne(type => User, { nullable: true })
71
+ @Field(type => User, { nullable: true })
72
+ updater?: User
73
+
74
+ @RelationId((marketplaceChannel: MarketplaceChannel) => marketplaceChannel.updater)
75
+ updaterId?: string
76
+ }
@@ -0,0 +1,6 @@
1
+ import { Sellercraft } from './sellercraft'
2
+ import { SellercraftQuery } from './sellercraft-query'
3
+ import { SellercraftMutation } from './sellercraft-mutation'
4
+
5
+ export const entities = [Sellercraft]
6
+ export const resolvers = [SellercraftQuery, SellercraftMutation]
@@ -0,0 +1,126 @@
1
+ import { Arg, Ctx, Directive, Mutation, Resolver } from 'type-graphql'
2
+ import { In } from 'typeorm'
3
+ import { v4 as uuidv4 } from 'uuid'
4
+
5
+ import { Sellercraft, SellercraftPlatform, SellercraftStatus } from './sellercraft'
6
+ import { NewSellercraft, SellercraftPatch } from './sellercraft-type'
7
+
8
+ @Resolver(Sellercraft)
9
+ export class SellercraftMutation {
10
+ @Directive('@transaction')
11
+ @Mutation(returns => Sellercraft, { description: 'To create new Sellercraft' })
12
+ async createSellercraft(
13
+ @Arg('sellercraft') sellercraft: NewSellercraft,
14
+ @Ctx() context: ResolverContext
15
+ ): Promise<Sellercraft> {
16
+ const { domain, user, tx } = context.state
17
+
18
+ return await tx.getRepository(Sellercraft).save({
19
+ ...sellercraft,
20
+ name: uuidv4(),
21
+ domain,
22
+ creator: user,
23
+ updater: user
24
+ })
25
+ }
26
+
27
+ @Directive('@transaction')
28
+ @Mutation(returns => Sellercraft, { description: 'To modify Sellercraft information' })
29
+ async updateSellercraft(
30
+ @Arg('id') id: string,
31
+ @Arg('patch') patch: SellercraftPatch,
32
+ @Ctx() context: ResolverContext
33
+ ): Promise<Sellercraft> {
34
+ const { user, tx } = context.state
35
+
36
+ const repository = tx.getRepository(Sellercraft)
37
+ const sellercraft = await repository.findOneBy({ id })
38
+
39
+ return await repository.save({
40
+ ...sellercraft,
41
+ ...patch,
42
+ updater: user
43
+ })
44
+ }
45
+
46
+ @Directive('@transaction')
47
+ @Mutation(returns => [Sellercraft], { description: "To modify multiple Sellercrafts' information" })
48
+ async updateMultipleSellercraft(
49
+ @Arg('patches', type => [SellercraftPatch]) patches: SellercraftPatch[],
50
+ @Ctx() context: ResolverContext
51
+ ): Promise<Sellercraft[]> {
52
+ const { domain, user, tx } = context.state
53
+
54
+ let results = []
55
+ const _createRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === '+')
56
+ const _updateRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === 'M')
57
+ const sellercraftRepo = tx.getRepository(Sellercraft)
58
+
59
+ if (_createRecords.length > 0) {
60
+ for (let i = 0; i < _createRecords.length; i++) {
61
+ const newRecord = _createRecords[i]
62
+
63
+ const result = await sellercraftRepo.save({
64
+ ...newRecord,
65
+ domain,
66
+ name: uuidv4(),
67
+ status: SellercraftStatus.ACTIVE,
68
+ platform: SellercraftPlatform.SELLERCRAFT,
69
+ creator: user,
70
+ updater: user
71
+ })
72
+
73
+ results.push({ ...result, cuFlag: '+' })
74
+ }
75
+ }
76
+
77
+ if (_updateRecords.length > 0) {
78
+ for (let i = 0; i < _updateRecords.length; i++) {
79
+ const newRecord = _updateRecords[i]
80
+ const sellercraft = await sellercraftRepo.findOneBy({ id: newRecord.id })
81
+
82
+ const result = await sellercraftRepo.save({
83
+ ...sellercraft,
84
+ ...newRecord,
85
+ updater: user
86
+ })
87
+
88
+ results.push({ ...result, cuFlag: 'M' })
89
+ }
90
+ }
91
+
92
+ return results
93
+ }
94
+
95
+ @Directive('@transaction')
96
+ @Mutation(returns => Boolean, { description: 'To delete Sellercraft' })
97
+ async deleteSellercraft(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<boolean> {
98
+ const { domain, tx } = context.state
99
+
100
+ await tx.getRepository(Sellercraft).delete({ domain: { id: domain.id }, id })
101
+ return true
102
+ }
103
+
104
+ @Directive('@transaction')
105
+ @Mutation(returns => Boolean, { description: 'To delete multiple sellercrafts' })
106
+ async deleteSellercrafts(
107
+ @Arg('ids', type => [String]) ids: string[],
108
+ @Ctx() context: ResolverContext
109
+ ): Promise<boolean> {
110
+ const { domain, tx, user } = context.state
111
+ let sellercrafts: Sellercraft[] = await tx
112
+ .getRepository(Sellercraft)
113
+ .find({ where: { domain: { id: domain.id }, id: In(ids) } })
114
+
115
+ sellercrafts = sellercrafts.map((sellercraft: Sellercraft) => {
116
+ return {
117
+ ...sellercraft,
118
+ status: SellercraftStatus.TERMINATED,
119
+ updater: user
120
+ }
121
+ })
122
+
123
+ await tx.getRepository(Sellercraft).save(sellercrafts)
124
+ return true
125
+ }
126
+ }
@@ -0,0 +1,43 @@
1
+ import { Arg, Args, Ctx, FieldResolver, Query, Resolver, Root } from 'type-graphql'
2
+
3
+ import { User } from '@things-factory/auth-base'
4
+ import { convertListParams, Domain, getRepository, ListParam } from '@things-factory/shell'
5
+
6
+ import { Sellercraft } from './sellercraft'
7
+ import { SellercraftList } from './sellercraft-type'
8
+
9
+ @Resolver(Sellercraft)
10
+ export class SellercraftQuery {
11
+ @Query(returns => Sellercraft, { description: 'To fetch a Sellercraft' })
12
+ async sellercraft(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<Sellercraft> {
13
+ return await getRepository(Sellercraft).findOneBy({ id })
14
+ }
15
+
16
+ @Query(returns => SellercraftList, { description: 'To fetch multiple Sellercrafts' })
17
+ async sellercrafts(
18
+ @Args(type => ListParam) params: ListParam,
19
+ @Ctx() context: ResolverContext
20
+ ): Promise<SellercraftList> {
21
+ const { domain } = context.state
22
+
23
+ const convertedParams = convertListParams(params, { domain })
24
+ const [items, total] = await getRepository(Sellercraft).findAndCount(convertedParams)
25
+
26
+ return { items, total }
27
+ }
28
+
29
+ @FieldResolver(type => Domain)
30
+ async domain(@Root() sellercraft: Sellercraft): Promise<Domain> {
31
+ return await getRepository(Domain).findOneBy({ id: sellercraft.domainId })
32
+ }
33
+
34
+ @FieldResolver(type => User)
35
+ async updater(@Root() sellercraft: Sellercraft): Promise<User> {
36
+ return await getRepository(User).findOneBy({ id: sellercraft.updaterId })
37
+ }
38
+
39
+ @FieldResolver(type => User)
40
+ async creator(@Root() sellercraft: Sellercraft): Promise<User> {
41
+ return await getRepository(User).findOneBy({ id: sellercraft.creatorId })
42
+ }
43
+ }
@@ -0,0 +1,54 @@
1
+ import { Field, ID, InputType, Int, ObjectType } from 'type-graphql'
2
+
3
+ import { Sellercraft, SellercraftPlatform, SellercraftStatus } from './sellercraft'
4
+
5
+ @InputType()
6
+ export class NewSellercraft {
7
+ @Field()
8
+ name: string
9
+
10
+ @Field({ nullable: true })
11
+ description?: string
12
+
13
+ @Field(type => SellercraftPlatform, { nullable: true })
14
+ platform: SellercraftPlatform
15
+
16
+ @Field()
17
+ accountId: string
18
+
19
+ @Field(type => SellercraftStatus, { nullable: true })
20
+ status?: SellercraftStatus
21
+ }
22
+
23
+ @InputType()
24
+ export class SellercraftPatch {
25
+ @Field(type => ID, { nullable: true })
26
+ id?: string
27
+
28
+ @Field({ nullable: true })
29
+ name?: string
30
+
31
+ @Field(type => SellercraftPlatform, { nullable: true })
32
+ platform?: SellercraftPlatform
33
+
34
+ @Field({ nullable: true })
35
+ accountId?: string
36
+
37
+ @Field({ nullable: true })
38
+ description?: string
39
+
40
+ @Field(type => SellercraftStatus, { nullable: true })
41
+ status?: SellercraftStatus
42
+
43
+ @Field({ nullable: true })
44
+ cuFlag?: string
45
+ }
46
+
47
+ @ObjectType()
48
+ export class SellercraftList {
49
+ @Field(type => [Sellercraft])
50
+ items: Sellercraft[]
51
+
52
+ @Field(type => Int)
53
+ total: number
54
+ }
@@ -0,0 +1,96 @@
1
+ import { Field, ID, ObjectType, registerEnumType } from 'type-graphql'
2
+ import {
3
+ Column,
4
+ CreateDateColumn,
5
+ Entity,
6
+ Index,
7
+ ManyToOne,
8
+ PrimaryGeneratedColumn,
9
+ RelationId,
10
+ UpdateDateColumn
11
+ } from 'typeorm'
12
+
13
+ import { User } from '@things-factory/auth-base'
14
+ import { Domain, ScalarObject } from '@things-factory/shell'
15
+
16
+ export enum SellercraftStatus {
17
+ ACTIVE = 'ACTIVE',
18
+ INACTIVE = 'INACTIVE',
19
+ TERMINATED = 'TERMINATED'
20
+ }
21
+
22
+ registerEnumType(SellercraftStatus, {
23
+ name: 'SellercraftStatus',
24
+ description: 'state enumeration of a sellercraft'
25
+ })
26
+
27
+ export enum SellercraftPlatform {
28
+ SELLERCRAFT = 'SELLERCRAFT'
29
+ }
30
+
31
+ registerEnumType(SellercraftPlatform, {
32
+ name: 'SellercraftPlatform',
33
+ description: 'platform enumeration of a sellercraft'
34
+ })
35
+
36
+ @Entity()
37
+ @Index('ix_sellercraft_0', (sellercraft: Sellercraft) => [sellercraft.domain, sellercraft.name], { unique: true })
38
+ @ObjectType({ description: 'Entity for Sellercraft' })
39
+ export class Sellercraft {
40
+ @PrimaryGeneratedColumn('uuid')
41
+ @Field(type => ID)
42
+ readonly id: string
43
+
44
+ @ManyToOne(type => Domain)
45
+ @Field(type => Domain)
46
+ domain?: Domain
47
+
48
+ @RelationId((sellercraft: Sellercraft) => sellercraft.domain)
49
+ domainId?: string
50
+
51
+ @Column()
52
+ @Field()
53
+ name: string
54
+
55
+ @Column({ nullable: true })
56
+ @Field({ nullable: true })
57
+ description?: string
58
+
59
+ @Column()
60
+ @Field()
61
+ accountId: string
62
+
63
+ @Column()
64
+ @Field()
65
+ platform: SellercraftPlatform
66
+
67
+ @Column({ nullable: true })
68
+ @Field({ nullable: true })
69
+ status?: SellercraftStatus
70
+
71
+ @Column('simple-json', { nullable: true })
72
+ @Field(type => ScalarObject, { nullable: true })
73
+ sellercraftSetting?: object
74
+
75
+ @CreateDateColumn()
76
+ @Field({ nullable: true })
77
+ createdAt?: Date
78
+
79
+ @UpdateDateColumn()
80
+ @Field({ nullable: true })
81
+ updatedAt?: Date
82
+
83
+ @ManyToOne(type => User, { nullable: true })
84
+ @Field(type => User, { nullable: true })
85
+ creator?: User
86
+
87
+ @RelationId((sellercraft: Sellercraft) => sellercraft.creator)
88
+ creatorId?: string
89
+
90
+ @ManyToOne(type => User, { nullable: true })
91
+ @Field(type => User, { nullable: true })
92
+ updater?: User
93
+
94
+ @RelationId((sellercraft: Sellercraft) => sellercraft.updater)
95
+ updaterId?: string
96
+ }