-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: Automate importing and exporting
- Loading branch information
Showing
12 changed files
with
2,424 additions
and
2,210 deletions.
There are no files selected for viewing
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
{% extends "index.html" %} | ||
|
||
{% block mainContent %} | ||
<div class="election-import-container col-lg-10 mx-auto"> | ||
<div class="election-import-container card"> | ||
<div class="card-header bg-dark"> | ||
<h3>Select elections to import from edison-central:</h3> | ||
</div> | ||
<div class="card-body"> | ||
<form id="poll-select-form" action="{{ formURL }}" data-method="GET"> | ||
<input type="hidden" name="serverURL" value="{{ serverURL }}"> | ||
<div class="form-group"> | ||
{% for election in elections -%} | ||
<div class="form-check"> | ||
<input name= "electionID" class="form-check-input" type="radio" value="{{ election.id }}" id="check{{ election.id }}"> | ||
<label class="form-check-label" for="check{{ poll.id }}">{{ election.name }}</label> | ||
</div> | ||
{%- endfor %} | ||
</div> | ||
<button id="exportPollsBtn" type="submit" class="btn btn-success"> | ||
<i class="{{ submitBtnIcon }}"></i> | ||
{{ submitBtnText }} | ||
</button> | ||
</form> | ||
</div> | ||
</div> | ||
</div> | ||
{%- endblock %} | ||
|
||
{% block stylesheets %} | ||
<link rel="stylesheet" href="/assets/styles/forms.css"> | ||
<link rel="stylesheet" href="/assets/styles/forms/poll-select.css"> | ||
{%- endblock %} | ||
|
||
{% block scripts %} | ||
<script src="/assets/scripts/poll-select-form.bundle.js"></script> | ||
{%- endblock %} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,93 @@ | ||
import express = require("express"); | ||
import fs = require("fs"); | ||
import ip = require("ip"); | ||
import Datastore = require("nedb"); | ||
import path = require("path"); | ||
import request = require("request"); | ||
import rp = require("request-promise"); | ||
import shortid = require("shortid"); | ||
|
||
import { config } from "../../config"; | ||
import { db, unzipElection } from "../model/elections"; | ||
import { asyncMiddleware } from "../utils/asyncMiddleware"; | ||
import { dbRemove } from "../utils/database"; | ||
import { ERRORS, JSONResponse } from "../utils/JSONResponse"; | ||
import { zipFile } from "../utils/zipAndUnzip"; | ||
|
||
export const router = express.Router(); | ||
|
||
router.get("/import/select", asyncMiddleware(async (req, res) => { | ||
const serverIP = req.query.serverIP; | ||
const URL = "http://" + serverIP + ":3000"; | ||
|
||
let resp; | ||
try { | ||
resp = await rp(URL + "/identity"); | ||
} catch (err) { | ||
console.log(err); | ||
return JSONResponse.Error(res, ERRORS.ResourceError.NotFound); | ||
} | ||
let identity: any; | ||
try { | ||
identity = JSON.parse(resp); | ||
} catch (err) { | ||
return JSONResponse.Error(res, ERRORS.ResourceError.NotFound); | ||
} | ||
if (identity.name === "edison-central") { | ||
const electionData = JSON.parse(await rp(URL + "/external/getElections")); | ||
res.render("election-select.html", { | ||
appName: config.appName, | ||
lanIP: ip.address(), | ||
serverURL: URL, | ||
pageTitle: "Select Elections", | ||
currentURL: req.url, | ||
formURL: "/external/import/download", | ||
elections: electionData, | ||
submitBtnText: "Begin voting", | ||
submitBtnIcon: "fas fa-angle-double-right" | ||
}); | ||
|
||
} else { | ||
return JSONResponse.Error(res, ERRORS.ResourceError.NotFound); | ||
} | ||
})); | ||
|
||
router.get("/import/download", asyncMiddleware(async (req, res) => { | ||
const electionID = req.query.electionID; | ||
const URL = req.query.serverURL; | ||
const downloadPath = path.join( | ||
config.database.temp, | ||
shortid.generate() + ".zip"); | ||
const r = request( | ||
URL + `/external/elections/${electionID}/export?all=true`); | ||
r | ||
.on("error", () => { | ||
JSONResponse.Error(res, ERRORS.ResourceError.NotFound); | ||
}) | ||
.pipe(fs.createWriteStream(downloadPath)) | ||
.on("finish", () => { | ||
unzipElection(downloadPath).then(() => res.redirect("/vote")); | ||
}); | ||
})); | ||
|
||
router.get("/export", asyncMiddleware(async (_REQ, res) => { | ||
const oldDB = db.loadDB(); | ||
if (oldDB === undefined) { | ||
return JSONResponse.Error(res, ERRORS.ResourceError.NotFound); | ||
} | ||
const dbCopy = path.join(config.database.temp, shortid.generate() + ".db"); | ||
fs.copyFileSync(oldDB, dbCopy); | ||
const newDB = new Datastore({ | ||
filename: dbCopy, | ||
autoload: true | ||
}); | ||
|
||
// Don't include unselected candidates | ||
await dbRemove(newDB, { show: false }, { multi: true}); | ||
|
||
const zipPath = zipFile(dbCopy, config.database.temp); | ||
res.download(zipPath, () => { | ||
fs.unlinkSync(zipPath); | ||
fs.unlinkSync(dbCopy); | ||
}); | ||
})); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters