diff --git a/README.md b/README.md index 5508d77..362d412 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,15 @@ # graphql-api-js -Apollo graphql api server + +Apollo graphql api server for Photowall + +## Run it locally + +Create an .env file (see .env.example for what to set). +Run + +``` +$ npm install +$ npm start +``` + +Then head over to [The playground GUI](https://localhost:4000) in the browser diff --git a/queries.graphql b/queries.graphql index 55d791d..03e9ab9 100644 --- a/queries.graphql +++ b/queries.graphql @@ -51,7 +51,7 @@ filter: { limit: 1, dates: { from: "2021-03-01", to: "2021-04-30" } } ) { id - marketObject { + market { id name vat @@ -84,13 +84,41 @@ { order(id: 588274) { id - marketObject { + market { id name vat currency priceAdjustment } + deliveryInformation { + address { + recipientName + companyname + address1 + address2 + city + countryCode + stateCountyOrRegion + zipcode + } + email + phone + } + billingInformation { + address { + recipientName + companyname + address1 + address2 + city + countryCode + stateCountyOrRegion + zipcode + } + email + phone + } rows { id order { diff --git a/src/datasources/order-api.ts b/src/datasources/order-api.ts index 465a32d..f40f78c 100644 --- a/src/datasources/order-api.ts +++ b/src/datasources/order-api.ts @@ -58,20 +58,28 @@ export class OrderAPI extends BaseSQLDataSource { getBillingInformation(row): ContactInformation { return { - email: 'niklas.fondberg@photowall.se', - phone: '+46761386397', + email: row.email, + phone: row.phone, addressId: row.billingAddressId, }; } getDeliveryInformation(row): ContactInformation { return { - email: 'niklas.fondberg@photowall.se', // TODO: fix hardcoded - phone: '+46761386397', + email: row.deliveryEmail, + phone: row.deliveryPhone, addressId: row.deliveryAddressId, }; } + createOrderFromRow(row: any): Order { + row.billingInformation = this.getBillingInformation(row); + row.deliveryInformation = this.getDeliveryInformation(row); + row.marketName = row.market; + row.localeName = row.locale; + return row; + } + async getOrders(input: Maybe): Promise> { let query = this.knex.select('*').from('orders'); // .where('inserted', '>=', '2021-03-01T00:00:00Z') @@ -89,14 +97,9 @@ export class OrderAPI extends BaseSQLDataSource { query = query.limit(input?.limit); } - // console.log(query.toString()); - return await query.cache(MINUTE).then((rows) => - rows.map((row) => { - row.billingInformation = this.getBillingInformation(row); - row.deliveryInformation = this.getDeliveryInformation(row); - return row; - }), - ); + return await query + .cache(MINUTE) + .then((rows) => rows.map((row) => this.createOrderFromRow(row))); } async getOrderById(id: number): Promise { @@ -106,11 +109,7 @@ export class OrderAPI extends BaseSQLDataSource { .where('id', id) .first() .cache(MINUTE) - .then((row) => { - row.billingInformation = this.getBillingInformation(row); - row.deliveryInformation = this.getDeliveryInformation(row); - return row; - }); + .then((row) => this.createOrderFromRow(row)); } async getOrderRowFieldMapping(): Promise { diff --git a/src/datasources/product-api.ts b/src/datasources/product-api.ts index ead08ca..a9505ee 100644 --- a/src/datasources/product-api.ts +++ b/src/datasources/product-api.ts @@ -55,6 +55,13 @@ export class ProductAPI extends SQLDataSource { }); } + createProductFromRow(row: any) { + row.blacklisting = this.getBlacklisting(row); + row.printProducts = this.getPrintProducts(row); + row.designerId = row.designerid; + return row; + } + async getProducts( limit: Maybe, visible: Maybe, @@ -63,28 +70,17 @@ export class ProductAPI extends SQLDataSource { limit = limit ?? 100; const query = sql.products(limit, visible, browsable); - return await this.knex.raw(query).then((data) => - data.rows.map((row) => { - row.blacklisting = this.getBlacklisting(row); - row.printProducts = this.getPrintProducts(row); - row.designerId = row.designerid; - return row; - }), - ); + return await this.knex + .raw(query) + .then((data) => data.rows.map((row) => this.createProductFromRow(row))); } async getProduct(id: number): Promise> { const query = sql.product(id); - const res = await this.knex.raw(query).then((data) => - data.rows.map((row) => { - console.log(row); - row.blacklisting = this.getBlacklisting(row); - row.printProducts = this.getPrintProducts(row); - row.designerId = row.designerid; - return row; - }), - ); + const res = await this.knex + .raw(query) + .then((data) => data.rows.map((row) => this.createProductFromRow(row))); return res.find(Boolean); } } diff --git a/src/resolvers/datetime-type.ts b/src/resolvers/datetime-type.ts deleted file mode 100644 index c56afc9..0000000 --- a/src/resolvers/datetime-type.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { GraphQLScalarType } from 'graphql'; -import { Kind } from 'graphql/language'; - -// possible switch to https://github.com/Urigo/graphql-scalars -const DateTimeScalar = new GraphQLScalarType({ - name: 'DateTime', - description: 'Date time custom scalar type', - parseValue(value) { - return new Date(value); // value from the client - }, - serialize(value) { - return new Date(value).toISOString(); // value sent to the client - }, - parseLiteral(ast) { - if (ast.kind === Kind.INT) { - return parseInt(ast.value, 10); // ast value is always in string format - } - return null; - }, -}); - -const DateScalar = new GraphQLScalarType({ - name: 'DateTime', - description: 'Date custom scalar type', - parseValue(value) { - console.log('FROM CLIENT:', value); - return new Date(value); // value from the client - }, - serialize(value) { - return new Date(value).toISOString().split('T')[0]; // value sent to the client - }, - parseLiteral(ast) { - if (ast.kind === Kind.INT) { - return parseInt(ast.value, 10); // ast value is always in string format - } - return null; - }, -}); - -export const CustomTypes = { - DateTime: DateTimeScalar, - Date: DateScalar, -}; diff --git a/src/resolvers/orders-resolver.ts b/src/resolvers/orders-resolver.ts index 897b37f..a2fa27c 100644 --- a/src/resolvers/orders-resolver.ts +++ b/src/resolvers/orders-resolver.ts @@ -13,7 +13,8 @@ const Order: IResolverObject = { async rows({ id }, args, { dataSources }) { return (dataSources.orderApi).getOrderRowsByOrderId(id); }, - async marketObject({ market }, args, { dataSources }) { + // TODO change to market + async market({ market }, args, { dataSources }) { return (dataSources.orderApi).getMarketByName(market); }, }; diff --git a/src/schema.ts b/src/schema.ts index 1a42d46..0bd5633 100644 --- a/src/schema.ts +++ b/src/schema.ts @@ -94,14 +94,14 @@ const typeDefs = gql` customerEmail: String customerCellphone: String flyerIds: String - market: String - locale: String + marketName: String + localeName: String billingInformation: ContactInformation deliveryInformation: ContactInformation billingAddressId: Int deliveryAddressId: Int rows: [OrderRow] - marketObject: Market + market: Market } type OrderRow {