slate/node_common/serializers.js

187 lines
6.0 KiB
JavaScript
Raw Normal View History

import * as Monitor from "~/node_common/monitor";
//NOTE(martina): when you add any new variable to the user, file, or slate objects, add it in these structures
//add it to sanitize___ if it should be sent to the front end
//add it to clean____ if it should be saved to the database
//NOTE(martina): these functions are to remove sensitive information before sending the data to the front end
//only variables listed here will be sent to the front end
export const sanitizeUser = (entity) => {
return {
id: entity.id,
username: entity.username,
slates: entity.slates, //NOTE(martina): this is not in the database. It is added after
library: entity.library, //NOTE(martina): this is not in the database. It is added after
2021-06-09 01:53:30 +03:00
twitterId: entity.twitterId,
email: entity.email,
data: {
name: entity.data?.name,
photo: entity.data?.photo,
body: entity.data?.body,
},
fileCount: entity.fileCount,
followerCount: entity.followerCount,
slateCount: entity.slateCount,
};
};
export const sanitizeSlate = (entity) => {
return {
id: entity.id,
slatename: entity.slatename,
ownerId: entity.ownerId,
isPublic: entity.isPublic,
objects: entity.objects,
user: entity.user, //NOTE(martina): this is not in the database. It is added after
data: {
name: entity.data?.name,
body: entity.data?.body,
preview: entity.data?.preview,
layouts: entity.data?.layouts,
tags: entity.data?.tags,
},
fileCount: entity.fileCount,
subscriberCount: entity.subscriberCount,
};
};
export const sanitizeFile = (entity) => {
2020-08-31 21:10:42 +03:00
return {
id: entity.id,
cid: entity.cid,
ownerId: entity.ownerId,
isPublic: entity.isPublic,
filename: entity.filename,
createdAt: entity.createdAt,
data: {
type: entity.data?.type,
name: entity.data?.name,
size: entity.data?.size,
body: entity.data?.body,
source: entity.data?.source,
author: entity.data?.author,
blurhash: entity.data?.blurhash,
coverImage: entity.data?.coverImage,
downloads: entity.data?.downloads, //NOTE(martina): newly added
tags: entity.data?.tags, //NOTE(martina): newly added
unity: entity.data?.unity, //NOTE(martina): newly added
link: entity.data?.link, //NOTE(martina): newly added
},
likeCount: entity.likeCount,
downloadCount: entity.downloadCount,
saveCount: entity.saveCount,
2020-08-31 21:10:42 +03:00
};
};
//NOTE(martina): these functions are to remove extraneous information before updating the database entry.
//Only variables included here will be added to the database
export const cleanUser = (entity) => {
2020-08-31 21:10:42 +03:00
return {
id: entity.id,
username: entity.username,
createdAt: entity.createdAt,
lastActive: entity.lastActive,
salt: entity.salt,
password: entity.password,
email: entity.email,
2021-06-09 01:53:30 +03:00
twitterId: entity.twitterId,
authVersion: entity.authVersion,
data: entity.data,
revertedVersion: entity.revertedVersion,
// data: {
// name: entity.data?.name,
// photo: entity.data?.photo,
// body: entity.data?.body,
// tokens: entity.data?.tokens,
// settings: entity.data?.settings,
// onboarding: entity.data?.onboarding,
// status: entity.data?.status,
// },
2020-08-31 21:10:42 +03:00
};
};
2020-09-07 01:30:33 +03:00
export const cleanSlate = (entity) => {
2020-09-07 01:30:33 +03:00
return {
id: entity.id,
createdAt: entity.createdAt,
updatedAt: entity.updatedAt,
slatename: entity.slatename,
isPublic: entity.isPublic,
ownerId: entity.ownerId,
data: entity.data,
// data: {
// name: entity.data?.name,
// body: entity.data?.body,
// preview: entity.data?.preview,
// layouts: entity.data?.layouts,
// tags: entity.data?.tags,
// },
2020-09-07 01:30:33 +03:00
};
};
2021-01-14 09:30:26 +03:00
export const cleanFile = (entity) => {
return {
id: entity.id,
cid: entity.cid,
createdAt: entity.createdAt,
ownerId: entity.ownerId,
isPublic: entity.isPublic,
filename: entity.filename,
data: entity.data,
// data: {
// type: entity.data?.type,
// name: entity.data?.name,
// size: entity.data?.size,
// body: entity.data?.body,
// source: entity.data?.source,
// author: entity.data?.author,
// blurhash: entity.data?.blurhash,
// coverImage: entity.data?.coverImage,
// downloads: entity.data?.downloads,
// tags: entity.data?.tags,
// unity: entity.data?.unity,
// link: entity.data?.link,
// },
};
};
2021-01-14 09:30:26 +03:00
//NOTE(martina): these functions are used to get the updated object that is obtained by merging the old and new objects
// and using the above cleaning functions to strip out things that should not be in the database or should not be mutated
2021-01-14 09:30:26 +03:00
export const getUpdatedSlate = (oldSlate, updates) => {
let updatedSlate = cleanSlate(updates);
return { ...oldSlate, ...updatedSlate, data: { ...oldSlate.data, ...updatedSlate.data } };
};
2021-01-14 09:30:26 +03:00
export const getUpdatedFile = (oldFile, updates) => {
let updatedFile = cleanFile(updates);
return { ...oldFile, ...updatedFile, data: { ...oldFile.data, ...updatedFile.data } };
};
2021-01-14 09:30:26 +03:00
export const getUpdatedUser = (oldUser, updates) => {
//NOTE(martina): we have this check here to make sure we never accidentally update the auth version without updating the password as well
if (
!oldUser.revertedVersion &&
updates.authVersion &&
updates.authVersion > oldUser.authVersion
) {
if (!updates.password) {
delete updates.authVersion;
Monitor.message(
"node_common/serializers.js",
`Tried to update authVersion but missing a password update. Update blocked for user ${oldUser.username}`
);
} else if (updates.password === oldUser.password) {
delete updates.authVersion;
Monitor.message(
"node_common/serializers.js",
`Tried to update authVersion but has the same password hash as before. Update blocked for user ${oldUser.username}`
);
}
}
let updatedUser = cleanUser(updates);
return { ...oldUser, ...updatedUser, data: { ...oldUser.data, ...updatedUser.data } };
2021-01-14 09:30:26 +03:00
};