aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Foiani <sotech117@michaels-mbp-3.lan>2021-04-16 12:43:17 -0400
committerMichael Foiani <sotech117@michaels-mbp-3.lan>2021-04-16 12:43:17 -0400
commit8e7c77b5bff25762dbd874ac6999ad7f493ba41d (patch)
tree3678a0153d87db804798d979064dbc5ad72950ef
parent250f5edc1ed502c74c398b5850a0bb7a7b01848c (diff)
Have a little bug with backend. Going to skip over it for now.
-rw-r--r--frontend/src/DateInput.js35
-rw-r--r--frontend/src/SECAPIData.js85
-rw-r--r--src/main/java/edu/brown/cs/student/term/Main.java8
-rw-r--r--src/main/java/edu/brown/cs/student/term/hub/SuspicionRanker.java1
-rw-r--r--src/main/java/edu/brown/cs/student/term/repl/commands/SetupCommand.java1
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);