Skip to content

Commit

Permalink
feat(core): Move global stock & language settings into Channel
Browse files Browse the repository at this point in the history
This allows better control for multivendor setups, so each channel can define its
own set of supported languages, currencies and stock settings
  • Loading branch information
michaelbromley committed May 18, 2023
1 parent 85418af commit 2748a6e
Show file tree
Hide file tree
Showing 17 changed files with 413 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -352,6 +352,8 @@ export type Cancellation = Node &
};

export type Channel = Node & {
availableCurrencyCodes: Array<CurrencyCode>;
availableLanguageCodes?: Maybe<Array<LanguageCode>>;
code: Scalars['String'];
createdAt: Scalars['DateTime'];
/** @deprecated Use defaultCurrencyCode instead */
Expand All @@ -362,9 +364,11 @@ export type Channel = Node & {
defaultShippingZone?: Maybe<Zone>;
defaultTaxZone?: Maybe<Zone>;
id: Scalars['ID'];
outOfStockThreshold?: Maybe<Scalars['Int']>;
pricesIncludeTax: Scalars['Boolean'];
seller?: Maybe<Seller>;
token: Scalars['String'];
trackInventory?: Maybe<Scalars['Boolean']>;
updatedAt: Scalars['DateTime'];
};

Expand All @@ -386,8 +390,10 @@ export type ChannelFilterParameter = {
defaultCurrencyCode?: InputMaybe<StringOperators>;
defaultLanguageCode?: InputMaybe<StringOperators>;
id?: InputMaybe<IdOperators>;
outOfStockThreshold?: InputMaybe<NumberOperators>;
pricesIncludeTax?: InputMaybe<BooleanOperators>;
token?: InputMaybe<StringOperators>;
trackInventory?: InputMaybe<BooleanOperators>;
updatedAt?: InputMaybe<DateOperators>;
};

Expand All @@ -413,6 +419,7 @@ export type ChannelSortParameter = {
code?: InputMaybe<SortOrder>;
createdAt?: InputMaybe<SortOrder>;
id?: InputMaybe<SortOrder>;
outOfStockThreshold?: InputMaybe<SortOrder>;
token?: InputMaybe<SortOrder>;
updatedAt?: InputMaybe<SortOrder>;
};
Expand Down Expand Up @@ -679,15 +686,19 @@ export type CreateAssetInput = {
export type CreateAssetResult = Asset | MimeTypeError;

export type CreateChannelInput = {
availableCurrencyCodes?: InputMaybe<Array<CurrencyCode>>;
availableLanguageCodes?: InputMaybe<Array<LanguageCode>>;
code: Scalars['String'];
currencyCode: CurrencyCode;
customFields?: InputMaybe<Scalars['JSON']>;
defaultLanguageCode: LanguageCode;
defaultShippingZoneId: Scalars['ID'];
defaultTaxZoneId: Scalars['ID'];
outOfStockThreshold?: InputMaybe<Scalars['Int']>;
pricesIncludeTax: Scalars['Boolean'];
sellerId?: InputMaybe<Scalars['ID']>;
token: Scalars['String'];
trackInventory?: InputMaybe<Scalars['Boolean']>;
};

export type CreateChannelResult = Channel | LanguageNotAvailableError;
Expand Down Expand Up @@ -5646,16 +5657,20 @@ export type UpdateAssetInput = {
};

export type UpdateChannelInput = {
availableCurrencyCodes?: InputMaybe<Array<CurrencyCode>>;
availableLanguageCodes?: InputMaybe<Array<LanguageCode>>;
code?: InputMaybe<Scalars['String']>;
currencyCode?: InputMaybe<CurrencyCode>;
customFields?: InputMaybe<Scalars['JSON']>;
defaultLanguageCode?: InputMaybe<LanguageCode>;
defaultShippingZoneId?: InputMaybe<Scalars['ID']>;
defaultTaxZoneId?: InputMaybe<Scalars['ID']>;
id: Scalars['ID'];
outOfStockThreshold?: InputMaybe<Scalars['Int']>;
pricesIncludeTax?: InputMaybe<Scalars['Boolean']>;
sellerId?: InputMaybe<Scalars['ID']>;
token?: InputMaybe<Scalars['String']>;
trackInventory?: InputMaybe<Scalars['Boolean']>;
};

export type UpdateChannelResult = Channel | LanguageNotAvailableError;
Expand Down
4 changes: 4 additions & 0 deletions packages/common/src/generated-shop-types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,8 @@ export type BooleanOperators = {

export type Channel = Node & {
__typename?: 'Channel';
availableCurrencyCodes: Array<CurrencyCode>;
availableLanguageCodes?: Maybe<Array<LanguageCode>>;
code: Scalars['String'];
createdAt: Scalars['DateTime'];
/** @deprecated Use defaultCurrencyCode instead */
Expand All @@ -155,9 +157,11 @@ export type Channel = Node & {
defaultShippingZone?: Maybe<Zone>;
defaultTaxZone?: Maybe<Zone>;
id: Scalars['ID'];
outOfStockThreshold?: Maybe<Scalars['Int']>;
pricesIncludeTax: Scalars['Boolean'];
seller?: Maybe<Seller>;
token: Scalars['String'];
trackInventory?: Maybe<Scalars['Boolean']>;
updatedAt: Scalars['DateTime'];
};

Expand Down
15 changes: 15 additions & 0 deletions packages/common/src/generated-types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -347,6 +347,8 @@ export type Cancellation = Node & StockMovement & {

export type Channel = Node & {
__typename?: 'Channel';
availableCurrencyCodes: Array<CurrencyCode>;
availableLanguageCodes?: Maybe<Array<LanguageCode>>;
code: Scalars['String'];
createdAt: Scalars['DateTime'];
/** @deprecated Use defaultCurrencyCode instead */
Expand All @@ -357,9 +359,11 @@ export type Channel = Node & {
defaultShippingZone?: Maybe<Zone>;
defaultTaxZone?: Maybe<Zone>;
id: Scalars['ID'];
outOfStockThreshold?: Maybe<Scalars['Int']>;
pricesIncludeTax: Scalars['Boolean'];
seller?: Maybe<Seller>;
token: Scalars['String'];
trackInventory?: Maybe<Scalars['Boolean']>;
updatedAt: Scalars['DateTime'];
};

Expand All @@ -382,8 +386,10 @@ export type ChannelFilterParameter = {
defaultCurrencyCode?: InputMaybe<StringOperators>;
defaultLanguageCode?: InputMaybe<StringOperators>;
id?: InputMaybe<IdOperators>;
outOfStockThreshold?: InputMaybe<NumberOperators>;
pricesIncludeTax?: InputMaybe<BooleanOperators>;
token?: InputMaybe<StringOperators>;
trackInventory?: InputMaybe<BooleanOperators>;
updatedAt?: InputMaybe<DateOperators>;
};

Expand All @@ -410,6 +416,7 @@ export type ChannelSortParameter = {
code?: InputMaybe<SortOrder>;
createdAt?: InputMaybe<SortOrder>;
id?: InputMaybe<SortOrder>;
outOfStockThreshold?: InputMaybe<SortOrder>;
token?: InputMaybe<SortOrder>;
updatedAt?: InputMaybe<SortOrder>;
};
Expand Down Expand Up @@ -691,15 +698,19 @@ export type CreateAssetInput = {
export type CreateAssetResult = Asset | MimeTypeError;

export type CreateChannelInput = {
availableCurrencyCodes?: InputMaybe<Array<CurrencyCode>>;
availableLanguageCodes?: InputMaybe<Array<LanguageCode>>;
code: Scalars['String'];
currencyCode: CurrencyCode;
customFields?: InputMaybe<Scalars['JSON']>;
defaultLanguageCode: LanguageCode;
defaultShippingZoneId: Scalars['ID'];
defaultTaxZoneId: Scalars['ID'];
outOfStockThreshold?: InputMaybe<Scalars['Int']>;
pricesIncludeTax: Scalars['Boolean'];
sellerId?: InputMaybe<Scalars['ID']>;
token: Scalars['String'];
trackInventory?: InputMaybe<Scalars['Boolean']>;
};

export type CreateChannelResult = Channel | LanguageNotAvailableError;
Expand Down Expand Up @@ -5968,16 +5979,20 @@ export type UpdateAssetInput = {
};

export type UpdateChannelInput = {
availableCurrencyCodes?: InputMaybe<Array<CurrencyCode>>;
availableLanguageCodes?: InputMaybe<Array<LanguageCode>>;
code?: InputMaybe<Scalars['String']>;
currencyCode?: InputMaybe<CurrencyCode>;
customFields?: InputMaybe<Scalars['JSON']>;
defaultLanguageCode?: InputMaybe<LanguageCode>;
defaultShippingZoneId?: InputMaybe<Scalars['ID']>;
defaultTaxZoneId?: InputMaybe<Scalars['ID']>;
id: Scalars['ID'];
outOfStockThreshold?: InputMaybe<Scalars['Int']>;
pricesIncludeTax?: InputMaybe<Scalars['Boolean']>;
sellerId?: InputMaybe<Scalars['ID']>;
token?: InputMaybe<Scalars['String']>;
trackInventory?: InputMaybe<Scalars['Boolean']>;
};

export type UpdateChannelResult = Channel | LanguageNotAvailableError;
Expand Down
15 changes: 15 additions & 0 deletions packages/core/e2e/graphql/generated-e2e-admin-types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -352,6 +352,8 @@ export type Cancellation = Node &
};

export type Channel = Node & {
availableCurrencyCodes: Array<CurrencyCode>;
availableLanguageCodes?: Maybe<Array<LanguageCode>>;
code: Scalars['String'];
createdAt: Scalars['DateTime'];
/** @deprecated Use defaultCurrencyCode instead */
Expand All @@ -362,9 +364,11 @@ export type Channel = Node & {
defaultShippingZone?: Maybe<Zone>;
defaultTaxZone?: Maybe<Zone>;
id: Scalars['ID'];
outOfStockThreshold?: Maybe<Scalars['Int']>;
pricesIncludeTax: Scalars['Boolean'];
seller?: Maybe<Seller>;
token: Scalars['String'];
trackInventory?: Maybe<Scalars['Boolean']>;
updatedAt: Scalars['DateTime'];
};

Expand All @@ -386,8 +390,10 @@ export type ChannelFilterParameter = {
defaultCurrencyCode?: InputMaybe<StringOperators>;
defaultLanguageCode?: InputMaybe<StringOperators>;
id?: InputMaybe<IdOperators>;
outOfStockThreshold?: InputMaybe<NumberOperators>;
pricesIncludeTax?: InputMaybe<BooleanOperators>;
token?: InputMaybe<StringOperators>;
trackInventory?: InputMaybe<BooleanOperators>;
updatedAt?: InputMaybe<DateOperators>;
};

Expand All @@ -413,6 +419,7 @@ export type ChannelSortParameter = {
code?: InputMaybe<SortOrder>;
createdAt?: InputMaybe<SortOrder>;
id?: InputMaybe<SortOrder>;
outOfStockThreshold?: InputMaybe<SortOrder>;
token?: InputMaybe<SortOrder>;
updatedAt?: InputMaybe<SortOrder>;
};
Expand Down Expand Up @@ -679,15 +686,19 @@ export type CreateAssetInput = {
export type CreateAssetResult = Asset | MimeTypeError;

export type CreateChannelInput = {
availableCurrencyCodes?: InputMaybe<Array<CurrencyCode>>;
availableLanguageCodes?: InputMaybe<Array<LanguageCode>>;
code: Scalars['String'];
currencyCode: CurrencyCode;
customFields?: InputMaybe<Scalars['JSON']>;
defaultLanguageCode: LanguageCode;
defaultShippingZoneId: Scalars['ID'];
defaultTaxZoneId: Scalars['ID'];
outOfStockThreshold?: InputMaybe<Scalars['Int']>;
pricesIncludeTax: Scalars['Boolean'];
sellerId?: InputMaybe<Scalars['ID']>;
token: Scalars['String'];
trackInventory?: InputMaybe<Scalars['Boolean']>;
};

export type CreateChannelResult = Channel | LanguageNotAvailableError;
Expand Down Expand Up @@ -5646,16 +5657,20 @@ export type UpdateAssetInput = {
};

export type UpdateChannelInput = {
availableCurrencyCodes?: InputMaybe<Array<CurrencyCode>>;
availableLanguageCodes?: InputMaybe<Array<LanguageCode>>;
code?: InputMaybe<Scalars['String']>;
currencyCode?: InputMaybe<CurrencyCode>;
customFields?: InputMaybe<Scalars['JSON']>;
defaultLanguageCode?: InputMaybe<LanguageCode>;
defaultShippingZoneId?: InputMaybe<Scalars['ID']>;
defaultTaxZoneId?: InputMaybe<Scalars['ID']>;
id: Scalars['ID'];
outOfStockThreshold?: InputMaybe<Scalars['Int']>;
pricesIncludeTax?: InputMaybe<Scalars['Boolean']>;
sellerId?: InputMaybe<Scalars['ID']>;
token?: InputMaybe<Scalars['String']>;
trackInventory?: InputMaybe<Scalars['Boolean']>;
};

export type UpdateChannelResult = Channel | LanguageNotAvailableError;
Expand Down
4 changes: 4 additions & 0 deletions packages/core/e2e/graphql/generated-e2e-shop-types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,8 @@ export type BooleanOperators = {
};

export type Channel = Node & {
availableCurrencyCodes: Array<CurrencyCode>;
availableLanguageCodes?: Maybe<Array<LanguageCode>>;
code: Scalars['String'];
createdAt: Scalars['DateTime'];
/** @deprecated Use defaultCurrencyCode instead */
Expand All @@ -147,9 +149,11 @@ export type Channel = Node & {
defaultShippingZone?: Maybe<Zone>;
defaultTaxZone?: Maybe<Zone>;
id: Scalars['ID'];
outOfStockThreshold?: Maybe<Scalars['Int']>;
pricesIncludeTax: Scalars['Boolean'];
seller?: Maybe<Seller>;
token: Scalars['String'];
trackInventory?: Maybe<Scalars['Boolean']>;
updatedAt: Scalars['DateTime'];
};

Expand Down
8 changes: 8 additions & 0 deletions packages/core/src/api/schema/admin-api/channel.api.graphql
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,12 @@ input CreateChannelInput {
code: String!
token: String!
defaultLanguageCode: LanguageCode!
availableLanguageCodes: [LanguageCode!]
pricesIncludeTax: Boolean!
currencyCode: CurrencyCode!
availableCurrencyCodes: [CurrencyCode!]
trackInventory: Boolean
outOfStockThreshold: Int
defaultTaxZoneId: ID!
defaultShippingZoneId: ID!
sellerId: ID
Expand All @@ -41,8 +45,12 @@ input UpdateChannelInput {
code: String
token: String
defaultLanguageCode: LanguageCode
availableLanguageCodes: [LanguageCode!]
pricesIncludeTax: Boolean
currencyCode: CurrencyCode
availableCurrencyCodes: [CurrencyCode!]
trackInventory: Boolean
outOfStockThreshold: Int
defaultTaxZoneId: ID
defaultShippingZoneId: ID
sellerId: ID
Expand Down
4 changes: 4 additions & 0 deletions packages/core/src/api/schema/common/channel.type.graphql
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,12 @@ type Channel implements Node {
defaultTaxZone: Zone
defaultShippingZone: Zone
defaultLanguageCode: LanguageCode!
availableLanguageCodes: [LanguageCode!]
currencyCode: CurrencyCode! @deprecated(reason: "Use defaultCurrencyCode instead")
defaultCurrencyCode: CurrencyCode!
availableCurrencyCodes: [CurrencyCode!]!
trackInventory: Boolean
outOfStockThreshold: Int
pricesIncludeTax: Boolean!
seller: Seller
}
23 changes: 23 additions & 0 deletions packages/core/src/entity/channel/channel.entity.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,9 @@ export class Channel extends VendureEntity {

@Column('varchar') defaultLanguageCode: LanguageCode;

@Column('simple-array')
availableLanguageCodes: LanguageCode[];

@Index()
@ManyToOne(type => Zone)
defaultTaxZone: Zone;
Expand All @@ -52,6 +55,26 @@ export class Channel extends VendureEntity {
@Column('varchar')
defaultCurrencyCode: CurrencyCode;

@Column('simple-array')
availableCurrencyCodes: CurrencyCode[];

/**
* @description
* Specifies the default value for inventory tracking for ProductVariants.
* Can be overridden per ProductVariant, but this value determines the default
* if not otherwise specified.
*/
@Column({ default: true })
trackInventory: boolean;

/**
* @description
* Specifies the value of stockOnHand at which a given ProductVariant is considered
* out of stock.
*/
@Column({ default: 0 })
outOfStockThreshold: number;

@Column(type => CustomChannelFields)
customFields: CustomChannelFields;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@ export class GlobalSettings extends VendureEntity implements HasCustomFields {
super(input);
}

/**
* @deprecated use `Channel.availableLanguageCodes`
*/
@Column('simple-array')
availableLanguages: LanguageCode[];

Expand All @@ -20,6 +23,8 @@ export class GlobalSettings extends VendureEntity implements HasCustomFields {
* Specifies the default value for inventory tracking for ProductVariants.
* Can be overridden per ProductVariant, but this value determines the default
* if not otherwise specified.
*
* @deprecated use `Channel.trackInventory`
*/
@Column({ default: true })
trackInventory: boolean;
Expand All @@ -28,6 +33,8 @@ export class GlobalSettings extends VendureEntity implements HasCustomFields {
* @description
* Specifies the value of stockOnHand at which a given ProductVariant is considered
* out of stock.
*
* @deprecated use `Channel.outOfStockThreshold`
*/
@Column({ default: 0 })
outOfStockThreshold: number;
Expand Down
1 change: 1 addition & 0 deletions packages/core/src/service/services/channel.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -228,6 +228,7 @@ export class ChannelService {
const channel = new Channel({
...input,
defaultCurrencyCode: input.currencyCode,
availableCurrencyCodes: input.availableCurrencyCodes ?? [input.currencyCode],
});
const defaultLanguageValidationResult = await this.validateDefaultLanguageCode(ctx, input);
if (isGraphQlErrorResult(defaultLanguageValidationResult)) {
Expand Down
Loading

0 comments on commit 2748a6e

Please sign in to comment.