diff options
author | Michael Foiani <sotech117@michaels-mbp-3.lan> | 2021-04-16 12:43:17 -0400 |
---|---|---|
committer | Michael Foiani <sotech117@michaels-mbp-3.lan> | 2021-04-16 12:43:17 -0400 |
commit | 8e7c77b5bff25762dbd874ac6999ad7f493ba41d (patch) | |
tree | 3678a0153d87db804798d979064dbc5ad72950ef | |
parent | 250f5edc1ed502c74c398b5850a0bb7a7b01848c (diff) |
Have a little bug with backend. Going to skip over it for now.
-rw-r--r-- | frontend/src/DateInput.js | 35 | ||||
-rw-r--r-- | frontend/src/SECAPIData.js | 85 | ||||
-rw-r--r-- | src/main/java/edu/brown/cs/student/term/Main.java | 8 | ||||
-rw-r--r-- | src/main/java/edu/brown/cs/student/term/hub/SuspicionRanker.java | 1 | ||||
-rw-r--r-- | src/main/java/edu/brown/cs/student/term/repl/commands/SetupCommand.java | 1 |
5 files changed, 61 insertions, 69 deletions
diff --git a/frontend/src/DateInput.js b/frontend/src/DateInput.js new file mode 100644 index 0000000..b5962f0 --- /dev/null +++ b/frontend/src/DateInput.js @@ -0,0 +1,35 @@ +// React import +import { useEffect, useState, useRef } from "react"; + +/** + * Componenet for checkins. Has a toggle to show more info. + * @param {Object} props The props of the component. + * @returns {import('react').HtmlHTMLAttributes} A list element holding a checkin's info. + */ +function DateInput(props) { + const startInput = useRef(); + const endInput = useRef(); + + const toValue = date => date.toISOString().slice(0, 10); + + useEffect(() => setInitDates(), []); + + const setInitDates = () => { + startInput.current.value = toValue(new Date()); + + // Two weeks away -> from stack overflow, + const fortnightAway = toValue(new Date(Date.now() - 12096e5)); + endInput.current.value = fortnightAway; + } + + return ( + <> + <label for="start">Start date:</label> + <input type="date" id="start" ref={startInput} onChange={(e) => props.setStart(e.target.value)}/> + <label for="end">End date:</label> + <input type="date" id="end" ref={endInput} onChange={(e) => props.setEnd(e.target.value)}/> + </> + ); +} + +export default DateInput;
\ No newline at end of file diff --git a/frontend/src/SECAPIData.js b/frontend/src/SECAPIData.js index a209ff2..d14ee1f 100644 --- a/frontend/src/SECAPIData.js +++ b/frontend/src/SECAPIData.js @@ -1,89 +1,40 @@ import React, {useState, useEffect} from 'react'; import Button from './Button'; -import HubList from './HubList' +import HubList from './HubList'; +import DateInput from './DateInput'; function SECAPIData() { + const [displayData, setDisplayData] = useState({}); + const [startDate, setStartDate] = useState(""); + const [endDate, setEndDate] = useState(""); - const [dataToBackend, setDataToBackend] = useState([]); - const [displayData, setDisplayData] = useState(""); + const toEpochMilli = date => Date.parse(date); - const requestData = () => { - // End early in debug to avoid too many requests. - if (dataToBackend.length !== 0) { - sendToBackend(); - return; - } - - console.log("Makig request..."); - - let date = new Date() - let today = date.toISOString().slice(0, 10); - - let pastDate = new Date(); - pastDate.setDate(date.getDate() - 14); - let past = pastDate.toISOString().slice(0, 10); - - fetch("https://api.sec-api.io?token=4d6ff81353d665c975d443e30020879b1ea882bc96a00cd8774a95bddd838fe5", { + const getLinks = () => { + fetch("http://localhost:4567/susrank", { method: "POST", - body: JSON.stringify({ - "query": { "query_string": { "query": "formType:4 AND filedAt:{"+ past +" TO "+ today +"} AND formType:(NOT \"N-4\") AND formType:(NOT \"4/A\")" } }, - "from": "0", - "size": "1000", - "sort": [{ "filedAt": { "order": "desc" } }] - }), - headers: { - "Content-Type": "application/json" - }, - credentials: "same-origin" - }) - .then(res => res.json()) - .then(data => { - let list = []; - data.filings.forEach(filing => { - if (filing.ticker === "") { - // TODO: why are there repitions of urls. - list.push({ - timestamp: filing.filedAt, - url: filing.documentFormatFiles[1].documentUrl - }); - } - }) - setDataToBackend(list); - }) - .catch(error => { - console.log(error); - }); - } - - const sendToBackend = () => { - console.log(dataToBackend); - - fetch("http://localhost:4567/data", { - method: "POST", - body: JSON.stringify({ - "data" : dataToBackend - }), + body: JSON.stringify( + { + "start" : toEpochMilli(startDate), + "end" : toEpochMilli(endDate) + }), headers: { "Content-Type": "application/json", }, credentials: "same-origin" }) - - .then(response => response.json().then(data => setDisplayData(data))) - .catch(function (error) { - console.log(error); - }); + .then(res => res.json()) + .then(data => setDisplayData(data)) + .catch(err => console.log(err)); } - - // This hook is autocalled once the setDataToBackend takes effect. - useEffect(() => sendToBackend(), [dataToBackend]); return ( <div> <h1>SECAPIData</h1> - <Button onPress={requestData}></Button> + <DateInput setStart={setStartDate} setEnd={setEndDate}></DateInput> + <Button onPress={getLinks}></Button> <HubList data={displayData}></HubList> </div> ); diff --git a/src/main/java/edu/brown/cs/student/term/Main.java b/src/main/java/edu/brown/cs/student/term/Main.java index 008c411..fb14f94 100644 --- a/src/main/java/edu/brown/cs/student/term/Main.java +++ b/src/main/java/edu/brown/cs/student/term/Main.java @@ -130,7 +130,7 @@ public final class Main { return "OK"; }); Spark.before((request, response) -> response.header("Access-Control-Allow-Origin", "*")); - Spark.post("/data", new SuspicionRankHandler()); + Spark.post("/susrank", new SuspicionRankHandler()); Spark.post("/profit", new ProfitQueryHandler()); } @@ -151,15 +151,19 @@ public final class Main { SuspicionRanker ranker = new SuspicionRanker(db); JSONObject data = new JSONObject(request.body()); + xmlLinks = data; long startMilli = data.getLong("start"); long endMilli = data.getLong("end"); + System.out.println(startMilli); + System.out.println(endMilli); Instant start = Instant.ofEpochMilli(startMilli); Instant end = Instant.ofEpochMilli(endMilli); List<Holder> suspiciousHolders = ranker.getSuspicionScoreList(start, end); Map<String, Object> variables = ImmutableMap.of("holders", suspiciousHolders); return GSON.toJson(variables); } catch (Exception e) { + e.printStackTrace(); System.out.println("DBQuerier Test, couldn't connect to db???"); return "Error"; } @@ -180,13 +184,13 @@ public final class Main { double sp500PercentGain = 0.0; double sp500Gain = 0.0; try { - DatabaseQuerier db = new DatabaseQuerier("data/trades.sqlite3"); profit = new ProfitCalculation(DatabaseQuerier.getConn(), person, startPeriod, endPeriod); holdings = profit.getHoldingsList(); gains = profit.calculateGains(); sp500PercentGain = profit.compareToSP500(); } catch (Exception e) { + e.printStackTrace(); System.out.println("DBQuerier Test, couldn't connect to db???"); return "Error"; } diff --git a/src/main/java/edu/brown/cs/student/term/hub/SuspicionRanker.java b/src/main/java/edu/brown/cs/student/term/hub/SuspicionRanker.java index 9f5f9c1..4f82cde 100644 --- a/src/main/java/edu/brown/cs/student/term/hub/SuspicionRanker.java +++ b/src/main/java/edu/brown/cs/student/term/hub/SuspicionRanker.java @@ -47,6 +47,7 @@ public class SuspicionRanker { suspicionList.add(guy); } } catch (Exception e) { + e.printStackTrace(); System.out.println("ERROR: Could not connect to database querier"); } return suspicionList; diff --git a/src/main/java/edu/brown/cs/student/term/repl/commands/SetupCommand.java b/src/main/java/edu/brown/cs/student/term/repl/commands/SetupCommand.java index a6ef1f0..5aa1c5a 100644 --- a/src/main/java/edu/brown/cs/student/term/repl/commands/SetupCommand.java +++ b/src/main/java/edu/brown/cs/student/term/repl/commands/SetupCommand.java @@ -24,6 +24,7 @@ public class SetupCommand implements Command { if(args.length == 1){ try{ dq = new DatabaseQuerier(args[0]); + System.out.println("Connected to db at " + args[0]); } catch (Exception e) { error = "ERROR: Could not connect to database. Ensure this is a valid database."; System.out.println(error); |