From c8b8583ae92c6c2597fe043e709219030c532cdd Mon Sep 17 00:00:00 2001 From: arashsheyda Date: Fri, 21 Apr 2023 12:07:50 +0300 Subject: [PATCH] feat: database server-rpc --- src/server-rpc/database.ts | 47 ++++++++++++++++++++++++++++++++++++++ src/server-rpc/index.ts | 3 ++- src/types/rpc.ts | 11 +++++++++ 3 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 src/server-rpc/database.ts diff --git a/src/server-rpc/database.ts b/src/server-rpc/database.ts new file mode 100644 index 0000000..121569a --- /dev/null +++ b/src/server-rpc/database.ts @@ -0,0 +1,47 @@ +import { logger } from '@nuxt/kit' +import { ObjectId } from 'mongodb' +import { connection as MongooseConnection, connect } from 'mongoose' +import type { NuxtDevtoolsServerContext, ServerFunctions } from '../types' + +export function setupDatabaseRPC({ nuxt }: NuxtDevtoolsServerContext): any { + // TODO: + connect('mongodb://127.0.0.1:27017/arcane') + + return { + async createCollection(name: string) { + return await MongooseConnection.db.createCollection(name) + }, + async listCollections() { + return await MongooseConnection.db.listCollections().toArray() + }, + async getCollection(name: string) { + return MongooseConnection.db.collection(name) + }, + async dropCollection(name: string) { + return await MongooseConnection.db.collection(name).drop() + }, + + async createDocument(collection: string, data: any) { + return await MongooseConnection.db.collection(collection).insertOne(data) + }, + async listDocuments(collection: string) { + return await MongooseConnection.db.collection(collection).find().toArray() + }, + async getDocument(collection: string, document: {}) { + return await MongooseConnection.db.collection(collection).findOne({ document }) + }, + async updateDocument(collection: string, data: any) { + const { _id, ...rest } = data + try { + return await MongooseConnection.db.collection(collection).findOneAndUpdate({ _id: new ObjectId(_id) }, { $set: rest }) + } + catch (error) { + logger.log(error) + return error + } + }, + async deleteDocument(collection: string, id: string) { + return await MongooseConnection.db.collection(collection).deleteOne({ _id: new ObjectId(id) }) + }, + } satisfies Partial +} diff --git a/src/server-rpc/index.ts b/src/server-rpc/index.ts index 327f02e..651b4bf 100644 --- a/src/server-rpc/index.ts +++ b/src/server-rpc/index.ts @@ -7,6 +7,7 @@ import type { ChannelOptions } from 'birpc' import { parse, stringify } from 'flatted' import type { Nuxt } from 'nuxt/schema' import type { ClientFunctions, ModuleOptions, NuxtDevtoolsServerContext, ServerFunctions } from '../types' +import { setupDatabaseRPC } from './database' export function setupRPC(nuxt: Nuxt, options: ModuleOptions): any { const serverFunctions = {} as ServerFunctions @@ -61,7 +62,7 @@ export function setupRPC(nuxt: Nuxt, options: ModuleOptions): any { nuxt.devtools = ctx Object.assign(serverFunctions, { - // TODO: add rpc + ...setupDatabaseRPC(ctx), } satisfies Partial) const wsClients = new Set() diff --git a/src/types/rpc.ts b/src/types/rpc.ts index 5a0ec44..efb9286 100644 --- a/src/types/rpc.ts +++ b/src/types/rpc.ts @@ -1,5 +1,16 @@ export interface ServerFunctions { + // collections + createCollection(name: string): Promise listCollections(): Promise + getCollection(name: string): Promise + dropCollection(name: string): Promise + + // documents + createDocument(collection: string, data: any): Promise + listDocuments(collection: string): Promise + getDocument(collection: string, id: string): Promise + updateDocument(collection: string, data: any): Promise + deleteDocument(collection: string, id: string): Promise } export interface ClientFunctions {