|
@@ -0,0 +1,102 @@
|
|
|
+import async from "async";
|
|
|
+
|
|
|
+import { isAdminRequired } from "./hooks";
|
|
|
+
|
|
|
+import moduleManager from "../../index";
|
|
|
+
|
|
|
+const DBModule = moduleManager.modules.db;
|
|
|
+const UtilsModule = moduleManager.modules.utils;
|
|
|
+const WSModule = moduleManager.modules.ws;
|
|
|
+const CacheModule = moduleManager.modules.cache;
|
|
|
+
|
|
|
+CacheModule.runJob("SUB", {
|
|
|
+ channel: "dataRequest.resolve",
|
|
|
+ cb: dataRequestId => {
|
|
|
+ WSModule.runJob("EMIT_TO_ROOM", {
|
|
|
+ room: "admin.users",
|
|
|
+ args: ["event:admin.dataRequests.resolved", { data: { dataRequestId } }]
|
|
|
+ });
|
|
|
+ }
|
|
|
+});
|
|
|
+
|
|
|
+export default {
|
|
|
+ /**
|
|
|
+ * Gets all unresolved data requests
|
|
|
+ *
|
|
|
+ * @param {object} session - the session object automatically added by the websocket
|
|
|
+ * @param {Function} cb - gets called with the result
|
|
|
+ */
|
|
|
+ index: isAdminRequired(async function index(session, cb) {
|
|
|
+ const dataRequestModel = await DBModule.runJob("GET_MODEL", { modelName: "dataRequest" }, this);
|
|
|
+
|
|
|
+ async.waterfall(
|
|
|
+ [
|
|
|
+ next => {
|
|
|
+ dataRequestModel.find({ resolved: false }).sort({ createdAt: "desc" }).exec(next);
|
|
|
+ }
|
|
|
+ ],
|
|
|
+ async (err, requests) => {
|
|
|
+ if (err) {
|
|
|
+ err = await UtilsModule.runJob("GET_ERROR", { error: err }, this);
|
|
|
+ this.log("ERROR", "DATA_REQUESTS_INDEX", `Indexing data requests failed. "${err}"`);
|
|
|
+ return cb({ status: "error", message: err });
|
|
|
+ }
|
|
|
+
|
|
|
+ this.log("SUCCESS", "DATA_REQUESTS_INDEX", `Indexing data requests successful.`, false);
|
|
|
+
|
|
|
+ return cb({ status: "success", data: { requests } });
|
|
|
+ }
|
|
|
+ );
|
|
|
+ }),
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Resolves a data request
|
|
|
+ *
|
|
|
+ * @param {object} session - the session object automatically added by the websocket
|
|
|
+ * @param {object} dataRequestId - the id of the data request to resolve
|
|
|
+ * @param {Function} cb - gets called with the result
|
|
|
+ */
|
|
|
+ resolve: isAdminRequired(async function update(session, dataRequestId, cb) {
|
|
|
+ const dataRequestModel = await DBModule.runJob("GET_MODEL", { modelName: "dataRequest" }, this);
|
|
|
+
|
|
|
+ async.waterfall(
|
|
|
+ [
|
|
|
+ next => {
|
|
|
+ if (!dataRequestId || typeof dataRequestId !== "string")
|
|
|
+ return next("Please provide a data request id.");
|
|
|
+ return next();
|
|
|
+ },
|
|
|
+
|
|
|
+ next => {
|
|
|
+ dataRequestModel.updateOne({ _id: dataRequestId }, { resolved: true }, { upsert: true }, err =>
|
|
|
+ next(err)
|
|
|
+ );
|
|
|
+ }
|
|
|
+ ],
|
|
|
+ async err => {
|
|
|
+ if (err) {
|
|
|
+ err = await UtilsModule.runJob("GET_ERROR", { error: err }, this);
|
|
|
+ this.log(
|
|
|
+ "ERROR",
|
|
|
+ "DATA_REQUESTS_RESOLVE",
|
|
|
+ `Resolving data request ${dataRequestId} failed for user "${session.userId}". "${err}"`
|
|
|
+ );
|
|
|
+ return cb({ status: "error", message: err });
|
|
|
+ }
|
|
|
+
|
|
|
+ CacheModule.runJob("PUB", { channel: "dataRequest.resolve", value: dataRequestId });
|
|
|
+
|
|
|
+ this.log(
|
|
|
+ "SUCCESS",
|
|
|
+ "DATA_REQUESTS_RESOLVE",
|
|
|
+ `Resolving data request "${dataRequestId}" successful for user ${session.userId}".`
|
|
|
+ );
|
|
|
+
|
|
|
+ return cb({
|
|
|
+ status: "success",
|
|
|
+ message: "Successfully resolved data request."
|
|
|
+ });
|
|
|
+ }
|
|
|
+ );
|
|
|
+ })
|
|
|
+};
|