diff --git a/README.md b/README.md index 075e10b..49b1689 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,47 @@ -# Whisky Business -Refresh the OLCC DB: +```plantuml +@startuml +object location { + address + phone + id +} -```bash -node whisky.js +object whisky { + label + price + average[52] : statewide average count per week + id + location[] --> location : count +} + +object client +object server + +object user { + location + radius + whisky[] +} +user --> whisky : monitor + +@enduml ``` +# Whisky Business + Launch GraphQL server: ```bash npm start ``` +Refresh the OLCC DB: + +```bash +node whisky.js +``` + Launch website: ```bash diff --git a/graphql/whisky.js b/graphql/whisky.js index a78d2f8..ce38e75 100644 --- a/graphql/whisky.js +++ b/graphql/whisky.js @@ -53,7 +53,9 @@ const WhiskyType = new graphql.GraphQLObjectType({ lastSeen: { type: graphql.GraphQLString }, size: { type: graphql.GraphQLInt }, price: { type: graphql.GraphQLFloat }, - inventories: { type: graphql.GraphQLList(InventoryType) } + inventories: { type: graphql.GraphQLList(InventoryType) }, + quantity: { type: graphql.GraphQLInt }, + updated: { type: graphql.GraphQLString } }) }); @@ -91,7 +93,9 @@ const buildWhiskies = (rows) => { price: row.price, size: row.size, code: row.code, - inventories: [] + inventories: [], + quantity: 0, + updated: 0 } whiskies[row.code] = whisky; } else { @@ -110,6 +114,8 @@ const buildWhiskies = (rows) => { quantity: row.quantity, updated: row.updated }); + whisky.updated = (new Date(row.updated) > new Date(whisky.updated)) ? row.updated : whisky.updated; + whisky.quantity += row.quantity; } }); const results = []; @@ -176,14 +182,17 @@ var queryType = new graphql.GraphQLObjectType({ fields: { Whiskies: { type: graphql.GraphQLList(WhiskyType), - resolve: (root, args, context, info) => { + args: { + code: { type: graphql.GraphQLString } + }, + resolve: (root, {code}, context, info) => { return new Promise((resolve, reject) => { - database.all( - "SELECT w.*,l.code AS 'location',l.address,l.city,l.phone,l.latitude,l.longitude,i.quantity,i.updated " + + database.all( + "SELECT w.*,i.quantity,i.updated " + "FROM Whiskies AS w " + - "LEFT JOIN Inventories AS i ON w.code=i.whisky "+ - "LEFT JOIN Locations AS l ON l.code=i.location " + - ";", function(err, rows) { + "LEFT JOIN Inventories AS i ON w.code=i.whisky " + + (code ? "WHERE w.code LIKE (?) " : "") + + ";", [code], function(err, rows) { if (err) { console.error(err); return reject(null); } resolve(buildWhiskies(rows)); }); @@ -198,9 +207,9 @@ var queryType = new graphql.GraphQLObjectType({ resolve: (root, {code}, context, info) => { return new Promise((resolve, reject) => { database.all( - "SELECT w.*,l.code AS 'location',l.address,l.city,l.phone,l.latitude,l.longitude,i.quantity,i.updated "+ + "SELECT w.*,l.code AS 'location',l.address,l.city,l.phone,l.latitude,l.longitude,i.quantity,i.updated " + "FROM Whiskies AS w " + - "LEFT JOIN Inventories AS i ON w.code=i.whisky "+ + "LEFT JOIN Inventories AS i ON w.code=i.whisky " + "LEFT JOIN Locations AS l ON l.code=i.location " + "WHERE w.code = (?);", [code], function(err, rows) { if (err) { console.error(err); return reject(null); } diff --git a/whisky-business/App.tsx b/whisky-business/App.tsx index 0059905..b37ba05 100644 --- a/whisky-business/App.tsx +++ b/whisky-business/App.tsx @@ -1,6 +1,6 @@ import { StatusBar } from 'expo-status-bar'; import React, { useState } from 'react'; -import { StyleSheet, Text, TouchableOpacity, View } from 'react-native'; +import { StyleSheet, Text, TextInput, TouchableOpacity, View } from 'react-native'; import { request, GraphQLClient, gql } from 'graphql-request'; import moment from 'moment'; import { buildExecutionContext } from 'graphql/execution/execute'; @@ -84,6 +84,7 @@ const whiskyStyles = StyleSheet.create({ export default function App() { const [whiskies, setWhiskies] = useState(null), + [search, setSearch] = useState(""), [activeWhisky, setActiveWhisky] = useState(""); const onPress = (code : string) => { @@ -104,7 +105,7 @@ export default function App() { ); }) : []; - let query = gql` { + const query = gql` { Whiskies { code description @@ -134,9 +135,55 @@ export default function App() { console.error(error); }); + const submitSearch = () => { + const query = gql` { + Whiskies { + code + description + price + size + lastSeen + inventories { + location { + code + address + city + phone + longitude + latitude + } + quantity + updated + } + } + }`; + + console.log(search); + + client.request(query) + .then(data => { + setWhiskies(data.Whiskies); + }) + .catch (error => { + console.error(error); + }); + }; + + const keyPress = (event : KeyboardEvent) => { + if (event.code == "\n") { + submitSearch(); + } + }; + return ( + keyPress(event)} + onChange={(value) => setSearch(value.target.value)}> + { items } + ); } diff --git a/whisky.js b/whisky.js index 213e11c..60b82a5 100644 --- a/whisky.js +++ b/whisky.js @@ -349,7 +349,7 @@ fs.stat("cache") }) .then((response) => { if (response.status != 200) { - throw "Error fetching resource from oregonliquorsearch"; + throw new Error("Error fetching resource from oregonliquorsearch"); } }); }).then(async () => { @@ -382,8 +382,7 @@ fs.stat("cache") const rows = dom.window.document.querySelectorAll('table.list tr'); const olccWhiskies = []; - - rows.forEach(row => { + const processRow = (row) => { const th = row.querySelectorAll('table.list th a'); if (th.length) { th.forEach(header => headers.push(header.textContent.trim())); @@ -407,7 +406,7 @@ fs.stat("cache") case 'Proof': if (parseFloat(value) == value) { value = parseFloat(value); - } + } break; case 'Case Price': @@ -433,8 +432,9 @@ fs.stat("cache") whisky[headers[index]] = value; }); olccWhiskies.push(whisky); - }); + }; + rows.forEach(processRow); return olccWhiskies; }).then(async (olccWhiskies) => { await Promise.all(olccWhiskies.map(async (olccWhisky) => {