servaljs-mongodb
TypeScript icon, indicating that this package has built-in type declarations

1.0.1 • Public • Published

ServalJS MongoDB module

This module provides interfaces for connecting to the database and creating scoped repositories.

Usage

import type { ObjectSchema } from '@banez/object-utility/types';
import { ObjectId } from 'mongodb';
import {
  createServal,
  HttpStatus,
  createController,
  createControllerMethod,
} from 'servaljs';
import {
  createMongoDB,
  createMongoDBRepository,
  MongoDBEntry,
  MongoDBEntrySchema,
} from 'servaljs-mongodb';

interface Todo extends MongoDBEntry {
  desc: string;
  done: boolean;
}

interface TodoMethods {
  findAllByDone(done: boolean): Promise<Todo[]>;
}

const TodoSchema: ObjectSchema = {
  ...MongoDBEntrySchema,
  desc: {
    __type: 'string',
    __required: true,
  },
  done: {
    __type: 'boolean',
    __required: true,
  },
};

const repo = createMongoDBRepository<Todo, TodoMethods>({
  collection: 'Todos',
  name: 'Todo repo',
  schema: TodoSchema,
  methods({ mdb }) {
    return {
      async findAllByDone(done) {
        return await mdb.find({ done }).toArray();
      },
    };
  },
});

createServal({
  server: {
    port: 1280,
  },
  modules: [
    createMongoDB({
      forceClose: true,
      url: 'mongodb://test:test1234@localhost:27017/admin',
    }),
    repo.init(),
  ],
  controllers: [
    createController({
      name: 'Todo',
      path: '/todo',
      methods() {
        return {
          getAll: createControllerMethod({
            type: 'get',
            path: '/all',
            async handler() {
              return { items: await repo.findAll() };
            },
          }),

          create: createControllerMethod<void, { item: Todo }>({
            type: 'post',
            async handler({ request }) {
              const body = request.body as { desc: string };
              return {
                item: await repo.add({
                  _id: `${new ObjectId()}`,
                  createdAt: Date.now(),
                  updatedAt: Date.now(),
                  desc: body.desc,
                  done: false,
                }),
              };
            },
          }),

          update: createControllerMethod<void, { item: Todo }>({
            type: 'put',
            async handler({ request, errorHandler }) {
              const body = request.body as {
                _id: string;
                desc?: string;
                done?: boolean;
              };
              let todo = await repo.findById(body._id);
              if (!todo) {
                throw errorHandler(
                  HttpStatus.NotFound,
                  `Todo "${body._id}" does not exist.`,
                );
              }
              let changes = false;
              if (body.desc && body.desc !== todo.desc) {
                changes = true;
                todo.desc = body.desc;
              }
              if (typeof body.done === 'boolean') {
                changes = true;
                todo.done = body.done;
              }
              if (changes) {
                todo = await repo.update(todo);
              }
              return { item: todo };
            },
          }),
        };
      },
    }),
  ],
});

/servaljs-mongodb/

    Package Sidebar

    Install

    npm i servaljs-mongodb

    Weekly Downloads

    0

    Version

    1.0.1

    License

    MIT

    Unpacked Size

    13.6 kB

    Total Files

    10

    Last publish

    Collaborators

    • banez