Updated whisky query to support % syntax, and summary update totals
Signed-off-by: James Ketrenos <james_eikona@ketrenos.com>
This commit is contained in:
parent
baf891e5ed
commit
056b388520
38
README.md
38
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
|
||||
|
@ -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); }
|
||||
|
@ -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<any>(null),
|
||||
[search, setSearch] = useState<string>(""),
|
||||
[activeWhisky, setActiveWhisky] = useState<string>("");
|
||||
|
||||
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 (
|
||||
<View style={[styles.container]}>
|
||||
<TextInput style={[{borderWidth: 1 }]}
|
||||
onBlur={submitSearch}
|
||||
onKeyPress={(event : any) => keyPress(event)}
|
||||
onChange={(value) => setSearch(value.target.value)}></TextInput>
|
||||
<View style={[styles.container]}>
|
||||
{ items }
|
||||
</View>
|
||||
</View>
|
||||
);
|
||||
}
|
||||
|
10
whisky.js
10
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) => {
|
||||
|
Loading…
x
Reference in New Issue
Block a user