aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMohammad Amoush <muhammedamoush@gmail.com>2019-11-12 17:26:58 -0500
committerMohammad Amoush <muhammedamoush@gmail.com>2019-11-12 17:26:58 -0500
commit06a9b3477dfef93af3c2715f5512d0d883191b58 (patch)
tree786201607b2ababf15ba2c5592728de4db3b7043 /src
parent2ea0efa91072c98c185f957d8040edde2cdb4e5e (diff)
fixed everything except for async
Diffstat (limited to 'src')
-rw-r--r--src/server/ApiManagers/GeneralGoogleManager.ts47
-rw-r--r--src/server/ApiManagers/GooglePhotosManager.ts27
-rw-r--r--src/server/apis/google/GooglePhotosUploadUtils.ts2
-rw-r--r--src/server/index.ts9
4 files changed, 62 insertions, 23 deletions
diff --git a/src/server/ApiManagers/GeneralGoogleManager.ts b/src/server/ApiManagers/GeneralGoogleManager.ts
index cb37b0dce..89efebf78 100644
--- a/src/server/ApiManagers/GeneralGoogleManager.ts
+++ b/src/server/ApiManagers/GeneralGoogleManager.ts
@@ -1,12 +1,20 @@
import ApiManager, { Registration } from "./ApiManager";
import { Method, _permission_denied } from "../RouteManager";
-import { uploadDirectory } from "..";
-import { path } from "animejs";
-import { RouteStore } from "../RouteStore";
import { GoogleApiServerUtils } from "../apis/google/GoogleApiServerUtils";
import { Database } from "../database";
+import RouteSubscriber from "../RouteSubscriber";
const deletionPermissionError = "Cannot perform specialized delete outside of the development environment!";
+const ServicesApiKeyMap = new Map<string, string | undefined>([
+ ["face", process.env.FACE],
+ ["vision", process.env.VISION],
+ ["handwriting", process.env.HANDWRITING]
+]);
+const EndpointHandlerMap = new Map<GoogleApiServerUtils.Action, GoogleApiServerUtils.ApiRouter>([
+ ["create", (api, params) => api.create(params)],
+ ["retrieve", (api, params) => api.get(params)],
+ ["update", (api, params) => api.batchUpdate(params)],
+]);
export default class GeneralGoogleManager extends ApiManager {
@@ -14,7 +22,7 @@ export default class GeneralGoogleManager extends ApiManager {
register({
method: Method.GET,
- subscription: RouteStore.readGoogleAccessToken,
+ subscription: "/readGoogleAccessToken",
onValidation: async ({ user, res }) => {
const userId = user.id;
const token = await GoogleApiServerUtils.retrieveAccessToken(userId);
@@ -27,7 +35,7 @@ export default class GeneralGoogleManager extends ApiManager {
register({
method: Method.POST,
- subscription: RouteStore.writeGoogleAccessToken,
+ subscription: "/writeGoogleAccessToken",
onValidation: async ({ user, req, res }) => {
res.send(await GoogleApiServerUtils.processNewUser(user.id, req.body.authenticationCode));
}
@@ -41,7 +49,34 @@ export default class GeneralGoogleManager extends ApiManager {
return _permission_denied(res, deletionPermissionError);
}
await Database.Auxiliary.GoogleAuthenticationToken.DeleteAll();
- res.redirect(RouteStore.delete);
+ res.redirect("/delete");
+ }
+ });
+
+ register({
+ method: Method.GET,
+ subscription: new RouteSubscriber("/cognitiveServices").add('requestedservice'),
+ onValidation: ({ req, res }) => {
+ let service = req.params.requestedservice;
+ res.send(ServicesApiKeyMap.get(service));
+ }
+ });
+
+ register({
+ method: Method.POST,
+ subscription: new RouteSubscriber("/googleDocs").add("sector", "action"),
+ onValidation: async ({ req, res, user }) => {
+ let sector: GoogleApiServerUtils.Service = req.params.sector as GoogleApiServerUtils.Service;
+ let action: GoogleApiServerUtils.Action = req.params.action as GoogleApiServerUtils.Action;
+ const endpoint = await GoogleApiServerUtils.GetEndpoint(GoogleApiServerUtils.Service[sector], user.id);
+ let handler = EndpointHandlerMap.get(action);
+ if (endpoint && handler) {
+ handler(endpoint, req.body)
+ .then(response => res.send(response.data))
+ .catch(exception => res.send(exception));
+ return;
+ }
+ res.send(undefined);
}
});
}
diff --git a/src/server/ApiManagers/GooglePhotosManager.ts b/src/server/ApiManagers/GooglePhotosManager.ts
index b5e9caa38..1f6051c28 100644
--- a/src/server/ApiManagers/GooglePhotosManager.ts
+++ b/src/server/ApiManagers/GooglePhotosManager.ts
@@ -1,16 +1,12 @@
import ApiManager, { Registration } from "./ApiManager";
import { Method, _error, _success, _invalid } from "../RouteManager";
-import { uploadDirectory, NewMediaItem } from "..";
-import { path } from "animejs";
-import { RouteStore } from "../RouteStore";
+import * as path from "path";
import { GoogleApiServerUtils } from "../apis/google/GoogleApiServerUtils";
import { BatchedArray, TimeUnit } from "array-batcher";
import { GooglePhotosUploadUtils } from "../apis/google/GooglePhotosUploadUtils";
-import { MediaItem } from "../apis/google/SharedTypes";
import { Opt } from "../../new_fields/Doc";
import { DashUploadUtils } from "../DashUploadUtils";
import { Database } from "../database";
-import { prefix } from "@fortawesome/free-solid-svg-icons";
const authenticationError = "Unable to authenticate Google credentials before uploading to Google Photos!";
const mediaError = "Unable to convert all uploaded bytes to media items!";
@@ -23,6 +19,17 @@ interface GooglePhotosUploadFailure {
url: string;
reason: string;
}
+interface MediaItem {
+ baseUrl: string;
+ filename: string;
+}
+interface NewMediaItem {
+ description: string;
+ simpleMediaItem: {
+ uploadToken: string;
+ };
+}
+const prefix = "google_photos_";
export default class GooglePhotosManager extends ApiManager {
@@ -30,20 +37,18 @@ export default class GooglePhotosManager extends ApiManager {
register({
method: Method.POST,
- subscription: RouteStore.googlePhotosMediaUpload,
+ subscription: "/googlePhotosMediaUpload",
onValidation: async ({ user, req, res }) => {
const { media } = req.body;
-
const token = await GoogleApiServerUtils.retrieveAccessToken(user.id);
if (!token) {
return _error(res, authenticationError);
}
-
let failed: GooglePhotosUploadFailure[] = [];
const batched = BatchedArray.from<GooglePhotosUploadUtils.UploadSource>(media, { batchSize: 25 });
const newMediaItems = await batched.batchedMapPatientInterval<NewMediaItem>(
{ magnitude: 100, unit: TimeUnit.Milliseconds },
- async (batch, collector, { completedBatches }) => {
+ async (batch: any, collector: any, { completedBatches }: any) => {
for (let index = 0; index < batch.length; index++) {
const { url, description } = batch[index];
const fail = (reason: string) => failed.push({ reason, batch: completedBatches + 1, index, url });
@@ -59,13 +64,11 @@ export default class GooglePhotosManager extends ApiManager {
}
}
);
-
const failedCount = failed.length;
if (failedCount) {
console.error(`Unable to upload ${failedCount} image${failedCount === 1 ? "" : "s"} to Google's servers`);
console.log(failed.map(({ reason, batch, index, url }) => `@${batch}.${index}: ${url} failed:\n${reason}`).join('\n\n'));
}
-
return GooglePhotosUploadUtils.CreateMediaItems(token, newMediaItems, req.body.album).then(
results => _success(res, { results, failed }),
error => _error(res, mediaError, error)
@@ -75,7 +78,7 @@ export default class GooglePhotosManager extends ApiManager {
register({
method: Method.POST,
- subscription: RouteStore.googlePhotosMediaDownload,
+ subscription: "/googlePhotosMediaDownload",
onValidation: async ({ req, res }) => {
const contents: { mediaItems: MediaItem[] } = req.body;
let failed = 0;
diff --git a/src/server/apis/google/GooglePhotosUploadUtils.ts b/src/server/apis/google/GooglePhotosUploadUtils.ts
index 0abed3f1d..27532d7f0 100644
--- a/src/server/apis/google/GooglePhotosUploadUtils.ts
+++ b/src/server/apis/google/GooglePhotosUploadUtils.ts
@@ -122,7 +122,7 @@ export namespace GooglePhotosUploadUtils {
// ...so we execute them in delayed batches and await the entire execution
return batched.batchedMapPatientInterval(
{ magnitude: 100, unit: TimeUnit.Milliseconds },
- async (batch: NewMediaItem[], collector) => {
+ async (batch: NewMediaItem[], collector: any) => {
const parameters = {
method: 'POST',
headers: headers('json', bearerToken),
diff --git a/src/server/index.ts b/src/server/index.ts
index 59752d6de..773b84403 100644
--- a/src/server/index.ts
+++ b/src/server/index.ts
@@ -4,10 +4,7 @@ import * as mobileDetect from 'mobile-detect';
import * as path from 'path';
import { Database } from './database';
const serverPort = 4321;
-import { GooglePhotosUploadUtils } from './apis/google/GooglePhotosUploadUtils';
-import { Opt } from '../new_fields/Doc';
import { DashUploadUtils } from './DashUploadUtils';
-import { BatchedArray, TimeUnit } from 'array-batcher';
import RouteSubscriber from './RouteSubscriber';
import initializeServer from './Initialization';
import RouteManager, { Method, _success, _permission_denied, _error, _invalid, OnUnauthenticated } from './RouteManager';
@@ -21,6 +18,8 @@ import { GoogleCredentialsLoader } from './credentials/CredentialsLoader';
import DeleteManager from "./ApiManagers/DeleteManager";
import PDFManager from "./ApiManagers/PDFManager";
import UploadManager from "./ApiManagers/UploadManager";
+import GeneralGoogleManager from "./ApiManagers/GeneralGoogleManager";
+import GooglePhotosManager from "./ApiManagers/GooglePhotosManager";
export const publicDirectory = __dirname + "/public";
export const filesDirectory = publicDirectory + "/files/";
@@ -64,7 +63,9 @@ function routeSetter(router: RouteManager) {
new SearchManager(),
new PDFManager(),
new DeleteManager(),
- new UtilManager()
+ new UtilManager(),
+ new GeneralGoogleManager(),
+ new GooglePhotosManager(),
].forEach(manager => manager.register(router));
// initialize the web socket (bidirectional communication: if a user changes