From f3f39b209730cef5293011343832ff15832745f8 Mon Sep 17 00:00:00 2001 From: Niklas Fondberg Date: Wed, 7 Apr 2021 18:30:56 +0200 Subject: [PATCH] Address embryo --- queries.graphql | 20 ++++ src/datasources/order-api.ts | 87 +++++++++++++++--- src/resolvers/index.ts | 3 +- src/resolvers/orders-resolver.ts | 22 ++++- src/schema.ts | 153 ++++++++++++++++++++++++++++++- 5 files changed, 266 insertions(+), 19 deletions(-) create mode 100644 queries.graphql diff --git a/queries.graphql b/queries.graphql new file mode 100644 index 0000000..989d8a0 --- /dev/null +++ b/queries.graphql @@ -0,0 +1,20 @@ +{ + products(limit: 10000, browsable: true, visible: true) { + id + inserted + updated + visible + browsable + printProducts { + group + id + updated + } + blacklisting { + group + id + marketId + updated + } + } +} diff --git a/src/datasources/order-api.ts b/src/datasources/order-api.ts index a72372e..9db300d 100644 --- a/src/datasources/order-api.ts +++ b/src/datasources/order-api.ts @@ -1,7 +1,19 @@ import { SQLDataSource } from 'datasource-sql'; +import { Maybe } from './types'; const MINUTE = 60; +interface Address { + id: number; + firstname: string; +} + +interface ContactInformation { + email: string; + phone: string; + addressId: number; +} + interface Order { id: number; inserted: Date; @@ -44,11 +56,13 @@ interface Order { customerLastname: string; customerEmail: string; customerCellphone: string; - billingAddressId: number; - deliveryAddressId: number; flyerIds: string; market: string; locale: string; + billingInformation: ContactInformation; + deliveryInformation: ContactInformation; + billingAddressId: number; + deliveryAddressId: number; } export class OrderAPI extends SQLDataSource { @@ -56,19 +70,70 @@ export class OrderAPI extends SQLDataSource { super(config); } + async getAddress(addressId: number): Promise> { + const row = await this.knex + .select('*') + .from('addresses') + .where('id', addressId) + .first() + .cache(MINUTE); + console.log('HERE', row); + return row + ? { + id: row.id, + firstname: row.firstName, + } + : null; + /** + * address = cls() + address.id = row["id"] + address.firstname = row["first_name"] + address.lastname = row["last_name"] + address.companyname = row["company_name"] + address.address1 = row["address1"] + address.address2 = row["address2"] + address.countryCode = row["country_code"] + address.city = row["city"] + address.zipcode = row["zipcode"] + address.stateCountyOrRegion = row["state"] + + return address + + def resolve_recipientName(self, info): + if self.firstname or self.lastname: + return "{} {}".format(self.firstname, self.lastname).strip() + */ + } + + getBillingInformation(row): ContactInformation { + return { + email: 'niklas.fondberg@photowall.se', + phone: '+46761386397', + addressId: row.billingAddressId, + }; + } + + getDeliveryInformation(row): ContactInformation { + return { + email: 'niklas.fondberg@photowall.se', + phone: '+46761386397', + addressId: row.deliveryAddressId, + }; + } + async getOrders() { - const data = await this.knex + return await this.knex .select('*') .from('orders') .where('inserted', '>=', '2021-03-01T00:00:00Z') - .cache(MINUTE); - - console.log(data); - - return [ - { id: 1, countryCode: 'SE' }, - { id: 2, countryCode: 'DK' }, - ]; + .cache(MINUTE) + .then((rows) => + rows.map((row) => { + row.billingInformation = this.getBillingInformation(row); + row.deliveryInformation = this.getDeliveryInformation(row); + return row; + }), + ); } async getOrder(id: number): Promise { diff --git a/src/resolvers/index.ts b/src/resolvers/index.ts index a6c7c44..1d1843b 100644 --- a/src/resolvers/index.ts +++ b/src/resolvers/index.ts @@ -1,10 +1,11 @@ -import orders from './orders-resolver'; +import orders, { ContactInformation } from './orders-resolver'; import products from './products-resolver'; import { DateTimeScalar } from './datetime-type'; const resolvers = { Query: { ...orders, ...products }, DateTime: DateTimeScalar, + ContactInformation, }; export default resolvers; diff --git a/src/resolvers/orders-resolver.ts b/src/resolvers/orders-resolver.ts index 519c64b..9dee12c 100644 --- a/src/resolvers/orders-resolver.ts +++ b/src/resolvers/orders-resolver.ts @@ -1,7 +1,23 @@ -// (parent, args, ctx, info) +import { IResolverObject } from 'graphql-tools'; + +export const ContactInformation: IResolverObject = { + // (parent, args, ctx, info) + async address({ addressId }, args, { dataSources }) { + return dataSources.orderApi.getAddress(addressId); + }, +}; + +async function getOrders(_, __, { dataSources }) { + return dataSources.orderApi.getOrders(); +} + +async function getOrder(_, { id }, { dataSources }) { + return dataSources.orderApi.getOrder(id); +} + const orders = { - orders: (_, __, { dataSources }) => dataSources.orderApi.getOrders(), - order: (_, { id }, { dataSources }) => dataSources.orderApi.getOrder(id), + orders: getOrders, + order: () => getOrder, }; export default orders; diff --git a/src/schema.ts b/src/schema.ts index 8ee0694..bb3e594 100644 --- a/src/schema.ts +++ b/src/schema.ts @@ -9,6 +9,17 @@ const typeDefs = gql` products(limit: Int, visible: Boolean, browsable: Boolean): [Product] } + type Address { + id: ID! + firstname: String + } + + type ContactInformation { + email: String + phone: String + address: Address + } + type Order { id: ID! inserted: DateTime! @@ -51,11 +62,13 @@ const typeDefs = gql` customerLastname: String customerEmail: String customerCellphone: String - billingAddressId: Int - deliveryAddressId: Int flyerIds: String market: String locale: String + billingInformation: ContactInformation + deliveryInformation: ContactInformation + billingAddressId: Int + deliveryAddressId: Int } type Product { @@ -97,9 +110,141 @@ const typeDefs = gql` } `; +export { typeDefs }; /** +schema { + query: Query +} +type Address { + id: ID! + firstname: String + lastname: String + recipientName: String + companyname: String + address1: String + address2: String + countryCode: String + city: String + zipcode: String + stateCountyOrRegion: String +} + +type Category { + id: ID! + name: String +} + +type ContactInformation { + email: String + phone: String + address: Address +} + +scalar Date + +scalar DateTime + +type Designer { + id: ID! + name: String + orderRows(fromDate: Date, toDate: Date): [OrderRow] +} + +enum Group { + PHOTO_WALLPAPER + CANVAS + WALLPAPER + DO_IT_YOURSELF_FRAME + DESIGNER_WALLPAPER + POSTER + FRAMED_PRINT +} + +scalar JSONString + +type Market { + id: ID! + name: String +} + +type Order { + id: ID! + insertedDate: DateTime! + paid: Boolean! + confirmed: Boolean! + delivered: Boolean! + canceled: Boolean! + countryCode: String! + locale: String! + market: String! + currency: String + contractCustomerId: Int + exchangeRateEUR: Float + language: String + pwintyId: Int + email: String + phone: String + rows: [OrderRow] + billingInformation: ContactInformation + deliveryInformation: ContactInformation +} + +type OrderRow { + id: ID! + order: Order + insertedDate: DateTime + orderId: Int + productId: Int + productGroup: String + artNo: String + path: String + name: String + price: Float + designerId: String + commissionAmount: String + status: String + pwintyImageId: Int + frameColor: String + pwintySku: String + json: JSONString +} + +type PrintProduct { + id: ID! + group: Group! + insertedDate: DateTime! + updatedDate: DateTime +} + +type Product { + id: ID! + path: String! + visible: Boolean + browsable: Boolean + insertedDate: DateTime! + updatedDate: DateTime! + categories: [Category] + designer: Designer + printProducts: [PrintProduct] + blacklisting: [ProductBlacklist] +} + +type ProductBlacklist { + id: ID! + group: Group! + marketId: String! + insertedDate: DateTime! + updatedDate: DateTime! + market: Market +} + +type Query { + products(limit: Int, visible: Boolean, browsable: Boolean): [Product] + product(id: Int!): Product + order(id: Int!): Order + designer(id: Int!): Designer + designers: [Designer] +} */ - -export { typeDefs };