P5 7617 cleanup market and locale (#10)

* Minor fixes

* Cleanup with adding Locale type

* Add locales to test
This commit is contained in:
Niklas Fondberg
2021-08-12 10:51:02 +02:00
committed by GitHub
parent 7047fe9851
commit 58ed7fbf6a
10 changed files with 115 additions and 44 deletions
+14 -4
View File
@@ -214,6 +214,12 @@ describe('GraphQL Apollo tests', () => {
); );
const marketControlData = market_response.rows[0]; const marketControlData = market_response.rows[0];
// Locale
const locale_response = await allContainers.db.raw(
`SELECT * FROM locales WHERE value='${orderControlData.locale}';`,
);
const localeControlData = locale_response.rows[0];
// Order row // Order row
const orderrow_response = await allContainers.db.raw( const orderrow_response = await allContainers.db.raw(
`SELECT * FROM "order-rows" WHERE orderid = 1;`, `SELECT * FROM "order-rows" WHERE orderid = 1;`,
@@ -230,8 +236,10 @@ describe('GraphQL Apollo tests', () => {
{ {
order(id: 1) { order(id: 1) {
id id
localeName locale {
marketName id
value
}
market { market {
id id
name name
@@ -254,8 +262,6 @@ describe('GraphQL Apollo tests', () => {
// Order // Order
expect(order.id).toBe(`${orderControlData.id}`); expect(order.id).toBe(`${orderControlData.id}`);
expect(order.marketName).toBe(orderControlData.country_code);
expect(order.localeName).toBe(orderControlData.locale);
// Market // Market
expect(order.market.id).toBe(`${marketControlData.id}`); expect(order.market.id).toBe(`${marketControlData.id}`);
@@ -266,6 +272,10 @@ describe('GraphQL Apollo tests', () => {
parseFloat(marketControlData.price_adjustment), parseFloat(marketControlData.price_adjustment),
); );
// Locale
expect(order.locale.id).toBe(`${localeControlData.id}`);
expect(order.locale.value).toBe(localeControlData.value);
// Order Rows // Order Rows
expect(order.rows.length).toBe(orderRowsControlData.length); expect(order.rows.length).toBe(orderRowsControlData.length);
expect(order.rows[0].id).toBe('' + orderRowsControlData[0].rowid); expect(order.rows[0].id).toBe('' + orderRowsControlData[0].rowid);
@@ -1,10 +1,10 @@
import { SQLDataSource } from 'datasource-sql'; import { SQLDataSource } from 'datasource-sql';
import { Market } from '../types/market-types'; import { Market, Locale } from '../types/market-locale-types';
const MINUTE = 60; const MINUTE = 60;
// TODO: perhaps rename to MarketLocale API and add market_locales and locales here. // TODO: perhaps rename to MarketLocale API and add market_locales and locales here.
export class MarketAPI extends SQLDataSource { export class MarketLocaleAPI extends SQLDataSource {
constructor(config) { constructor(config) {
super(config); super(config);
} }
@@ -33,4 +33,29 @@ export class MarketAPI extends SQLDataSource {
.from('markets') .from('markets')
.cache(MINUTE * 5); .cache(MINUTE * 5);
} }
async getLocaleById(id: number): Promise<Locale> {
return this.knex
.select('*')
.from('locales')
.where('id', id)
.first()
.cache(MINUTE * 5);
}
async getLocaleByValue(value: string): Promise<Locale> {
return this.knex
.select('*')
.from('locales')
.where('value', value)
.first()
.cache(MINUTE * 5);
}
async getLocales(): Promise<Array<Locale>> {
return this.knex
.select('*')
.from('locales')
.cache(MINUTE * 5);
}
} }
+3 -3
View File
@@ -11,7 +11,7 @@ import { ProductAPI } from './datasources/product-api';
import { DesignerAPI } from './datasources/designer-api'; import { DesignerAPI } from './datasources/designer-api';
import { CategoryAPI } from './datasources/category-api'; import { CategoryAPI } from './datasources/category-api';
import { KeywordAPI } from './datasources/keyword-api'; import { KeywordAPI } from './datasources/keyword-api';
import { MarketAPI } from './datasources/market-api'; import { MarketLocaleAPI } from './datasources/market-locale-api';
import { ImageServerApi } from './datasources/imageserver-api'; import { ImageServerApi } from './datasources/imageserver-api';
import { InteriorAPI } from './datasources/interior-api'; import { InteriorAPI } from './datasources/interior-api';
@@ -26,7 +26,7 @@ const designerApi = new DesignerAPI(knexConfig);
const imageServerApi = new ImageServerApi(); const imageServerApi = new ImageServerApi();
const interiorApi = new InteriorAPI(knexConfig, imageServerApi); const interiorApi = new InteriorAPI(knexConfig, imageServerApi);
const keywordApi = new KeywordAPI(knexConfig); const keywordApi = new KeywordAPI(knexConfig);
const marketApi = new MarketAPI(knexConfig); const marketLocaleApi = new MarketLocaleAPI(knexConfig);
const orderApi = new OrderAPI(knexConfig); const orderApi = new OrderAPI(knexConfig);
const productApi = new ProductAPI(knexConfig); const productApi = new ProductAPI(knexConfig);
@@ -36,7 +36,7 @@ const dataSources = () => ({
interiorApi, interiorApi,
imageServerApi, imageServerApi,
keywordApi, keywordApi,
marketApi, marketLocaleApi,
orderApi, orderApi,
productApi, productApi,
}); });
+4 -1
View File
@@ -7,7 +7,10 @@ import {
import { designerQueryTypeDefs, designerTypeDefs } from './designers-resolver'; import { designerQueryTypeDefs, designerTypeDefs } from './designers-resolver';
import { categoryQueryTypeDefs, categoryTypeDefs } from './categories-resolver'; import { categoryQueryTypeDefs, categoryTypeDefs } from './categories-resolver';
import { keywordsQueryTypeDefs, keywordTypeDefs } from './keywords-resolver'; import { keywordsQueryTypeDefs, keywordTypeDefs } from './keywords-resolver';
import { marketsQueryTypeDefs, marketTypeDefs } from './markets-resolver'; import {
marketsQueryTypeDefs,
marketTypeDefs,
} from './markets-locale-resolver';
import { DateTimeResolver, DateResolver, JSONResolver } from 'graphql-scalars'; import { DateTimeResolver, DateResolver, JSONResolver } from 'graphql-scalars';
import { interiorsQueryTypeDefs, interiorTypeDefs } from './interiors-resolver'; import { interiorsQueryTypeDefs, interiorTypeDefs } from './interiors-resolver';
+31
View File
@@ -0,0 +1,31 @@
import { IResolverObject } from 'graphql-tools';
import { MarketLocaleAPI } from '../datasources/market-locale-api';
const Market: IResolverObject = {};
async function getMarkets(_, _args, { dataSources }) {
return (<MarketLocaleAPI>dataSources.marketLocaleApi).getMarkets();
}
async function getMarket(_, { name }, { dataSources }) {
return (<MarketLocaleAPI>dataSources.marketLocaleApi).getMarketByName(name);
}
const Locale: IResolverObject = {};
async function getLocales(_, _args, { dataSources }) {
return (<MarketLocaleAPI>dataSources.marketLocaleApi).getLocales();
}
async function getLocale(_, { value }, { dataSources }) {
return (<MarketLocaleAPI>dataSources.marketLocaleApi).getLocaleByValue(value);
}
export const marketTypeDefs = { Market, Locale };
export const marketsQueryTypeDefs = {
markets: getMarkets,
market: getMarket,
locales: getLocales,
locale: getLocale,
};
-19
View File
@@ -1,19 +0,0 @@
import { IResolverObject } from 'graphql-tools';
import { MarketAPI } from '../datasources/market-api';
const Market: IResolverObject = {};
async function getMarkets(_, _args, { dataSources }) {
return (<MarketAPI>dataSources.marketApi).getMarkets();
}
async function getMarket(_, { name }, { dataSources }) {
return (<MarketAPI>dataSources.marketApi).getMarketByName(name);
}
export const marketTypeDefs = { Market };
export const marketsQueryTypeDefs = {
markets: getMarkets,
market: getMarket,
};
+9 -2
View File
@@ -1,5 +1,5 @@
import { IResolverObject } from 'graphql-tools'; import { IResolverObject } from 'graphql-tools';
import { MarketAPI } from '../datasources/market-api'; import { MarketLocaleAPI } from '../datasources/market-locale-api';
import { OrderAPI } from '../datasources/order-api'; import { OrderAPI } from '../datasources/order-api';
import { FilterInput } from '../types/types'; import { FilterInput } from '../types/types';
@@ -15,7 +15,14 @@ const Order: IResolverObject = {
return (<OrderAPI>dataSources.orderApi).getOrderRowsByOrderId(id); return (<OrderAPI>dataSources.orderApi).getOrderRowsByOrderId(id);
}, },
async market({ market }, _args, { dataSources }) { async market({ market }, _args, { dataSources }) {
return (<MarketAPI>dataSources.marketApi).getMarketByName(market); return (<MarketLocaleAPI>dataSources.marketLocaleApi).getMarketByName(
market,
);
},
async locale({ locale }, _args, { dataSources }) {
return (<MarketLocaleAPI>dataSources.marketLocaleApi).getLocaleByValue(
locale,
);
}, },
}; };
+4 -2
View File
@@ -5,12 +5,14 @@ import { CategoryAPI } from '../datasources/category-api';
import { Category } from '../types/category-types'; import { Category } from '../types/category-types';
import { KeywordAPI } from '../datasources/keyword-api'; import { KeywordAPI } from '../datasources/keyword-api';
import { Keyword } from '../types/keyword-types'; import { Keyword } from '../types/keyword-types';
import { MarketAPI } from '../datasources/market-api'; import { MarketLocaleAPI } from '../datasources/market-locale-api';
import { InteriorAPI } from '../datasources/interior-api'; import { InteriorAPI } from '../datasources/interior-api';
const ProductBlacklist: IResolverObject = { const ProductBlacklist: IResolverObject = {
async market(parent, _args, { dataSources }) { async market(parent, _args, { dataSources }) {
return (<MarketAPI>dataSources.marketApi).getMarketById(parent.marketId); return (<MarketLocaleAPI>dataSources.marketLocaleApi).getMarketById(
parent.marketId,
);
}, },
}; };
+16 -11
View File
@@ -21,6 +21,8 @@ const typeDefs = gql`
designer(id: Int!): Designer designer(id: Int!): Designer
markets: [Market] markets: [Market]
market(name: String!): Market market(name: String!): Market
locales: [Locale]
locale(value: String!): Locale
interiors(filter: InteriorsFilterInput): [Interior] interiors(filter: InteriorsFilterInput): [Interior]
} }
@@ -52,7 +54,7 @@ const typeDefs = gql`
offset: Int! offset: Int!
} }
""" """
Later replace with implements ListResult Later replace with implements ListResult when products support it
""" """
type OrderResult { type OrderResult {
total: Int! total: Int!
@@ -63,10 +65,17 @@ const typeDefs = gql`
type Market { type Market {
id: ID! id: ID!
name: String name: String!
vat: Float vat: Float!
currency: String currency: String!
priceAdjustment: Float priceAdjustment: Float!
}
type Locale {
id: ID!
value: String!
name: String!
fallbackId: Int
} }
type Address { type Address {
@@ -132,11 +141,6 @@ const typeDefs = gql`
customerEmail: String customerEmail: String
customerCellphone: String customerCellphone: String
flyerIds: String flyerIds: String
"""
marketName and localeName will go away and be replaced with real objects
"""
marketName: String
localeName: String
billingInformation: ContactInformation billingInformation: ContactInformation
deliveryInformation: ContactInformation deliveryInformation: ContactInformation
billingAddressId: Int billingAddressId: Int
@@ -146,6 +150,8 @@ const typeDefs = gql`
pwinty needs to be updated with market being a subtype pwinty needs to be updated with market being a subtype
""" """
market: Market market: Market
locale: Locale
rows: [OrderRow]
} }
type OrderRow { type OrderRow {
@@ -298,7 +304,6 @@ const typeDefs = gql`
id: ID! id: ID!
groupId: Int! groupId: Int!
group: ProductGroup! group: ProductGroup!
marketId: Int!
market: Market! market: Market!
inserted: DateTime! inserted: DateTime!
updated: DateTime! updated: DateTime!
@@ -5,3 +5,10 @@ export interface Market {
currency: string; currency: string;
priceAdjustment: number; priceAdjustment: number;
} }
export interface Locale {
id: number;
value: string;
fallbackId: number;
name: string;
}