aboutsummaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
Diffstat (limited to 'src/server')
-rw-r--r--src/server/ApiManagers/UserManager.ts33
-rw-r--r--src/server/GarbageCollector.ts2
-rw-r--r--src/server/authentication/AuthenticationManager.ts4
-rw-r--r--src/server/authentication/DashUserModel.ts4
-rw-r--r--src/server/websocket.ts43
5 files changed, 79 insertions, 7 deletions
diff --git a/src/server/ApiManagers/UserManager.ts b/src/server/ApiManagers/UserManager.ts
index c9ffaff4c..f36506b14 100644
--- a/src/server/ApiManagers/UserManager.ts
+++ b/src/server/ApiManagers/UserManager.ts
@@ -19,16 +19,35 @@ export default class UserManager extends ApiManager {
method: Method.GET,
subscription: "/getUsers",
secureHandler: async ({ res }) => {
- const cursor = await Database.Instance.query({}, { email: 1, sharingDocumentId: 1 }, "users");
+ const cursor = await Database.Instance.query({}, { email: 1, linkDatabaseId: 1, sharingDocumentId: 1 }, "users");
const results = await cursor.toArray();
- res.send(results.map(user => ({ email: user.email, sharingDocumentId: user.sharingDocumentId })));
+ res.send(results.map(user => ({ email: user.email, linkDatabaseId: user.linkDatabaseId, sharingDocumentId: user.sharingDocumentId })));
+ }
+ });
+
+ register({
+ method: Method.POST,
+ subscription: "/setCacheDocumentIds",
+ secureHandler: async ({ user, req, res }) => {
+ const result: any = {};
+ user.cacheDocumentIds = req.body.cacheDocumentIds;
+ user.save(err => {
+ if (err) {
+ result.error = [{ msg: "Error while caching documents" }];
+ }
+ });
+
+ // Database.Instance.update(id, { "$set": { "fields.cacheDocumentIds": cacheDocumentIds } }, e => {
+ // console.log(e);
+ // });
+ res.send(result);
}
});
register({
method: Method.GET,
subscription: "/getUserDocumentIds",
- secureHandler: ({ res, user }) => res.send({ userDocumentId: user.userDocumentId, sharingDocumentId: user.sharingDocumentId })
+ secureHandler: ({ res, user }) => res.send({ userDocumentId: user.userDocumentId, linkDatabaseId: user.linkDatabaseId, sharingDocumentId: user.sharingDocumentId })
});
register({
@@ -39,8 +58,14 @@ export default class UserManager extends ApiManager {
register({
method: Method.GET,
+ subscription: "/getLinkDatabaseId",
+ secureHandler: ({ res, user }) => res.send(user.linkDatabaseId)
+ });
+
+ register({
+ method: Method.GET,
subscription: "/getCurrentUser",
- secureHandler: ({ res, user: { _id, email } }) => res.send(JSON.stringify({ id: _id, email })),
+ secureHandler: ({ res, user: { _id, email, cacheDocumentIds } }) => res.send(JSON.stringify({ id: _id, email, cacheDocumentIds })),
publicHandler: ({ res }) => res.send(JSON.stringify({ id: "__guest__", email: "" }))
});
diff --git a/src/server/GarbageCollector.ts b/src/server/GarbageCollector.ts
index 6bd0e5163..7c441e3c0 100644
--- a/src/server/GarbageCollector.ts
+++ b/src/server/GarbageCollector.ts
@@ -65,7 +65,7 @@ async function GarbageCollect(full: boolean = true) {
// await new Promise(res => setTimeout(res, 3000));
const cursor = await Database.Instance.query({}, { userDocumentId: 1 }, 'users');
const users = await cursor.toArray();
- const ids: string[] = [...users.map(user => user.userDocumentId), ...users.map(user => user.sharingDocumentId)]];
+ const ids: string[] = [...users.map(user => user.userDocumentId), ...users.map(user => user.sharingDocumentId), ...users.map(user => user.linkDatabaseId)];
const visited = new Set<string>();
const files: { [name: string]: string[] } = {};
diff --git a/src/server/authentication/AuthenticationManager.ts b/src/server/authentication/AuthenticationManager.ts
index 36363e3cf..9eb4a328f 100644
--- a/src/server/authentication/AuthenticationManager.ts
+++ b/src/server/authentication/AuthenticationManager.ts
@@ -48,7 +48,9 @@ export let postSignup = (req: Request, res: Response, next: NextFunction) => {
email,
password,
userDocumentId: Utils.GenerateGuid(),
- sharingDocumentId: Utils.GenerateGuid()
+ sharingDocumentId: Utils.GenerateGuid(),
+ linkDatabaseId: Utils.GenerateGuid(),
+ cacheDocumentIds: ""
} as Partial<DashUserModel>;
const user = new User(model);
diff --git a/src/server/authentication/DashUserModel.ts b/src/server/authentication/DashUserModel.ts
index 0bdc25644..bee28b96d 100644
--- a/src/server/authentication/DashUserModel.ts
+++ b/src/server/authentication/DashUserModel.ts
@@ -11,6 +11,8 @@ export type DashUserModel = mongoose.Document & {
userDocumentId: string;
sharingDocumentId: string;
+ linkDatabaseId: string;
+ cacheDocumentIds: string;
profile: {
name: string,
@@ -38,6 +40,8 @@ const userSchema = new mongoose.Schema({
userDocumentId: String, // id that identifies a document which hosts all of a user's account data
sharingDocumentId: String, // id that identifies a document that stores documents shared to a user, their user color, and any additional info needed to communicate between users
+ linkDatabaseId: String,
+ cacheDocumentIds: String, // set of document ids to retreive on startup
facebook: String,
twitter: String,
diff --git a/src/server/websocket.ts b/src/server/websocket.ts
index b33e76c0b..1e02b9e58 100644
--- a/src/server/websocket.ts
+++ b/src/server/websocket.ts
@@ -201,7 +201,7 @@ export namespace WebSocket {
function setField(socket: Socket, newValue: Transferable) {
Database.Instance.update(newValue.id, newValue, () =>
- socket.broadcast.emit(MessageStore.SetField.Message, newValue));
+ socket.broadcast.emit(MessageStore.SetField.Message, newValue)); // broadcast set value to all other clients
if (newValue.type === Types.Text) { // if the newValue has sring type, then it's suitable for searching -- pass it to SOLR
Search.updateDocument({ id: newValue.id, data: { set: (newValue as any).data } });
}
@@ -271,7 +271,48 @@ export namespace WebSocket {
return typeof value === "string" ? value : value[0];
}
+ function addToListField(socket: Socket, diff: Diff, curListItems?: Transferable): void {
+ diff.diff.$set = diff.diff.$addToSet; delete diff.diff.$addToSet;// convert add to set to a query of the current fields, and then a set of the composition of the new fields with the old ones
+ const updatefield = Array.from(Object.keys(diff.diff.$set))[0];
+ const newListItems = diff.diff.$set[updatefield].fields;
+ const curList = (curListItems as any)?.fields?.[updatefield.replace("fields.", "")]?.fields || [];
+ diff.diff.$set[updatefield].fields = [...curList, ...newListItems.filter((newItem: any) => !curList.some((curItem: any) => curItem.fieldId ? curItem.fieldId === newItem.fieldId : curItem.heading ? curItem.heading === newItem.heading : curItem === newItem))];
+ const sendBack = diff.diff.length !== diff.diff.$set[updatefield].fields.length;
+ delete diff.diff.length;
+ Database.Instance.update(diff.id, diff.diff,
+ () => {
+ if (sendBack) {
+ const id = socket.id;
+ socket.id = "";
+ socket.broadcast.emit(MessageStore.UpdateField.Message, diff);
+ socket.id = id;
+ } else socket.broadcast.emit(MessageStore.UpdateField.Message, diff);
+ }, false);
+ }
+
+ function remFromListField(socket: Socket, diff: Diff, curListItems?: Transferable): void {
+ diff.diff.$set = diff.diff.$remFromSet; delete diff.diff.$remFromSet;
+ const updatefield = Array.from(Object.keys(diff.diff.$set))[0];
+ const remListItems = diff.diff.$set[updatefield].fields;
+ const curList = (curListItems as any)?.fields?.[updatefield.replace("fields.", "")]?.fields || [];
+ diff.diff.$set[updatefield].fields = curList?.filter((curItem: any) => !remListItems.some((remItem: any) => remItem.fieldId ? remItem.fieldId === curItem.fieldId : remItem.heading ? remItem.heading === curItem.heading : remItem === curItem));
+ const sendBack = diff.diff.length !== diff.diff.$set[updatefield].fields.length;
+ delete diff.diff.length;
+ Database.Instance.update(diff.id, diff.diff,
+ () => {
+ if (sendBack) {
+ const id = socket.id;
+ socket.id = "";
+ socket.broadcast.emit(MessageStore.UpdateField.Message, diff);
+ socket.id = id;
+ } else socket.broadcast.emit(MessageStore.UpdateField.Message, diff);
+ }, false);
+ }
+
+
function UpdateField(socket: Socket, diff: Diff) {
+ if (diff.diff.$addToSet) return GetRefField([diff.id, (result?: Transferable) => addToListField(socket, diff, result)]); // would prefer to have Mongo handle list additions direclty, but for now handle it on our own
+ if (diff.diff.$remFromSet) return GetRefField([diff.id, (result?: Transferable) => remFromListField(socket, diff, result)]); // would prefer to have Mongo handle list additions direclty, but for now handle it on our own
Database.Instance.update(diff.id, diff.diff,
() => socket.broadcast.emit(MessageStore.UpdateField.Message, diff), false);
const docfield = diff.diff.$set || diff.diff.$unset;