jefer94/choco

View on GitHub
services/projects/src/server.ts

Summary

Maintainability
C
1 day
Test Coverage
/* eslint-disable functional/no-loop-statement */
/* eslint-disable no-restricted-syntax */
import { connect, JSONCodec } from 'nats'
import addCode from './actions/addCode'
import addProject from './actions/addProject'
import addProjectPermission from './actions/addProjectPermission'
import deleteCode from './actions/deleteCode'
import deleteProject from './actions/deleteProject'
import deleteProjectPermission from './actions/deleteProjectPermission'
import fetchOwnCodes from './actions/fetchOwnCodes'
import fetchOwnProjects from './actions/fetchOwnProjects'
import fetchShareCodes from './actions/fetchShareCodes'
import fetchShareProjects from './actions/fetchShareProjects'
import getCode from './actions/getCode'
import getProject from './actions/getProject'
import getProjectPermission from './actions/getProjectPermission'
import updateCode from './actions/updateCode'
import updateProject from './actions/updateProject'
import updateProjectPermission from './actions/updateProjectPermission'

// let sid = 0
export function close(): void {
  // nc.unsubscribe(sid)
}

export const host = 'projects'

export enum actions {
  addCode = 'add code',
  addProject = 'add project',
  addProjectPermission = 'add project permission',
  deleteCode = 'delete code',
  deleteProject = 'delete project',
  deleteProjectPermission = 'delete project permission',
  fetchOwnCodes = 'fetch own codes',
  fetchOwnProjects = 'fetch own projects',
  fetchShareCodes = 'fetch share codes',
  fetchShareProjects = 'fetch share projects',
  getCode = 'get code',
  getProject = 'get project',
  getProjectPermission = 'get project permission',
  updateCode = 'update code',
  updateProject = 'update project',
  updateProjectPermission = 'update project permission'
}

export const notFound = 'command not found'

export default async function server(): Promise<void> {
  const nc = await connect(process.env.BROKER ?
    { servers: process.env.BROKER } : {})

  nc.subscribe(host, { callback: async (error, msg) => {
    const { decode, encode } = JSONCodec()
    const { reply, data } = msg

    if (reply) {
      try {
        const { type, ...request } = decode(data)

        if (type === actions.addCode) {
          nc.publish(reply, encode(await addCode(request)))
        }
        else if (type === actions.addProject) {
          nc.publish(reply, encode(await addProject(request)))
        }
        else if (type === actions.addProjectPermission) {
          nc.publish(reply, encode(await addProjectPermission(request)))
        }
        else if (type === actions.deleteCode) {
          nc.publish(reply, encode(await deleteCode(request.id)))
        }
        else if (type === actions.deleteProject) {
          nc.publish(reply, encode(await deleteProject(request.id)))
        }
        else if (type === actions.deleteProjectPermission) {
          nc.publish(reply, encode(await deleteProjectPermission(request.id)))
        }
        else if (type === actions.fetchOwnCodes) {
          nc.publish(reply, encode(await fetchOwnCodes(request.project)))
        }
        else if (type === actions.fetchOwnProjects) {
          nc.publish(reply, encode(await fetchOwnProjects(request.user)))
        }
        else if (type === actions.fetchShareCodes) {
          nc.publish(reply, encode(await fetchShareCodes(request.project)))
        }
        else if (type === actions.fetchShareProjects) {
          nc.publish(reply, encode(await fetchShareProjects(request.user)))
        }
        else if (type === actions.getCode) {
          nc.publish(reply, encode(await getCode(request.id)))
        }
        else if (type === actions.getProject) {
          nc.publish(reply, encode(await getProject(request.id)))
        }
        else if (type === actions.getProjectPermission) {
          nc.publish(reply, encode(await getProjectPermission(request.id)))
        }
        else if (type === actions.updateCode) {
          nc.publish(reply, encode(await updateCode(request)))
        }
        else if (type === actions.updateProject) {
          nc.publish(reply, encode(await updateProject(request)))
        }
        else if (type === actions.updateProjectPermission) {
          nc.publish(reply, encode(await updateProjectPermission(request)))
        }
      }
      catch { nc.publish(reply, encode({ error: notFound })) }
    }
  } })
}