[Feature] Searching a users note rack by Eroxl · Pull Request #36 · Eroxl/Note-Rack · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions backend/package.json
28 changes: 24 additions & 4 deletions backend/src/helpers/deletePage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import PageMapModel from '../models/pageMap';
import PageModel from '../models/pageModel';
import PageTreeModel from '../models/pageTreeModel';
import mongoose from 'mongoose';
import ElasticSearchClient from './search/ElasticSearchClient';

interface pageTreeType {
_id: string,
Expand Down Expand Up @@ -43,8 +44,8 @@ const deletePage = async (
return subPages;
};

const pagesToDelete = getSubPages(pageTree, pageMap.pathToPage, pageID)
.map((id) => new mongoose.Types.ObjectId(id));
const pagesToDelete = getSubPages(pageTree, pageMap.pathToPage, pageID);
const objectIDsToDelete = pagesToDelete.map((id) => new mongoose.Types.ObjectId(id));

// -=- Delete Sub Pages -=-
// ~ Delete the top level page from the page tree
Expand Down Expand Up @@ -90,14 +91,33 @@ const deletePage = async (
// ~ Delete the sub pages maps
await PageMapModel.deleteMany({
_id: {
$in: pagesToDelete,
$in: objectIDsToDelete,
},
});

// ~ Delete the sub pages
await PageModel.deleteMany({
_id: {
$in: pagesToDelete,
$in: objectIDsToDelete,
},
});


// ~ Delete the sub pages from ElasticSearch
await ElasticSearchClient.deleteByQuery({
index: 'blocks',
body: {
query: {
bool: {
filter: [
{
terms: {
pageId: pagesToDelete,
},
},
],
},
},
},
});
};
Expand Down
60 changes: 60 additions & 0 deletions backend/src/helpers/search/ElasticSearchClient.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
import { Client } from '@elastic/elasticsearch';

if (!process.env.ELASTICSEARCH_URL) {
throw new Error('ELASTICSEARCH_URL is not defined');
}

if (!process.env.ELASTICSEARCH_PASSWORD) {
throw new Error('ELASTICSEARCH_PASSWORD is not defined');
}

if (!process.env.ELASTICSEARCH_USERNAME) {
throw new Error('ELASTICSEARCH_USERNAME is not defined');
}

const client = new Client({
node: process.env.ELASTICSEARCH_URL,
auth: {
password: process.env.ELASTICSEARCH_PASSWORD,
username: process.env.ELASTICSEARCH_USERNAME,
},
});

client.indices.exists({
index: 'blocks',
})
.then((exists) => {
if (exists) return;

return client.indices.create({
index: 'blocks',
});
})
.then(() => {
return client.indices.putMapping({
index: 'blocks',
body: {
properties: {
blockId: {
type: 'keyword',
},
content: {
type: 'text',
},
pageId: {
type: 'keyword',
},
userID: {
type: 'keyword',
},
},
},
});
})
.catch((err) => {
if (err?.meta?.body?.error?.type !== 'resource_already_exists_exception') {
console.error(err);
}
});

export default client;
6 changes: 2 additions & 4 deletions backend/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ import supertokens from 'supertokens-node';
import swaggerJSDoc from 'swagger-jsdoc';
import swaggerUI from 'swagger-ui-express';
import express from 'express';
import expressWs from 'express-ws';
import bodyParser from 'body-parser';
import mongoose from 'mongoose';
import dotenv from 'dotenv';
Expand Down Expand Up @@ -44,9 +43,6 @@ app.use(cors({
// -=- Add Super Tokens Middleware -=-
app.use(middleware());

// -=- Add Websocket Support -=-
expressWs(app);

import routes from './routes/index';

// -=- Add API Routes -=-
Expand Down Expand Up @@ -78,5 +74,7 @@ app.use(
// -=- Setup Super Tokens Error Handling -=-
app.use(errorHandler());

console.log(`Server running on port ${port}`);

// -=- Start The Express Server -=-
app.listen(port);
2 changes: 1 addition & 1 deletion backend/src/middleware/verifyPermissions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ const verifyPermissions = (permissions: ValidPermissions[]) => {

const username = req.session?.getUserId() || '';

const pageData = await PageModel.findOne({ _id: page }).lean();
const pageData = await PageModel.findOne({ _id: page });

if (!pageData) {
res.statusCode = 404;
Expand Down
18 changes: 10 additions & 8 deletions backend/src/models/pageModel.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
import mongoose, { Schema } from 'mongoose';
import mongoose, { Schema, Document } from 'mongoose';

export interface IPage {
interface Block {
blockType: string;
properties: {};
children: Block[];
}

export interface IPage extends Document {
user: string;
permissions: {
[key: string]: {
Expand All @@ -11,11 +17,7 @@ export interface IPage {
};
};
style: {};
data: {
blockType: string;
properties: {};
children: [];
}[];
data: Block[];
}

const PageSchema = new Schema<IPage>({
Expand All @@ -31,6 +33,6 @@ const PageSchema = new Schema<IPage>({
],
});

const PageModel = mongoose.models.page as mongoose.Model<IPage> || mongoose.model<IPage>('page', PageSchema);
const PageModel = mongoose.models.page as mongoose.Model<IPage> || mongoose.model('page', PageSchema);

export default PageModel;
7 changes: 7 additions & 0 deletions backend/src/routes/account/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import express from 'express';

import editPageTreeExpansion from './editPageTreeExpansion';
import getPageTree from './getPageTree';
import search from './search';

const router = express.Router();

Expand All @@ -17,4 +18,10 @@ router.use(
editPageTreeExpansion,
);

// -=- Create Search API -=-
router.use(
'/',
search,
);

export default router;
82 changes: 82 additions & 0 deletions backend/src/routes/account/search.ts
Loading