New custom response objects in xiara

in #utopian-io7 years ago (edited)

@xiara/web responses + mongo updates + bugfixes

responses

About the project

https://github.com/xiara-io

@xiara/core and @xiara/web is a framework for building efficient, scalable Node.js server-side applications. It uses modern JavaScript, is built with TypeScript (preserves compatibility with pure JavaScript) and combines elements of OOP (Object Oriented Programming), FP (Functional Programming), and FRP (Functional Reactive Programming).

Under the hood, Xiara makes use of Express, allowing for easy use of the third-party plugins.

Xiara also features mongodb support out of the box via @xiara/mongo package

What Changed?

I have been continuing adding new features and extending the functionalities of the framework, heres a short summary:

@ xiara/web:

  • Added custom responses
  • Fixed a bug whenan injectable has no contstructor apps won't start.
  • pushed inital release on npm

@ xiara/mongo:

  • added findOneAndUpdate method
  • fixed ObjectId not recognized by default
  • pushed a new update on npm
  • fixed bug when empty result gives an empty object and now it returns null

@ xiara/core

  • Fixed a bug whenan injectable has no contstructor apps won't start.
  • removed debug messages

Responses

Responses are an interesting part of the framework. They just make life easier!

Let's see how they work.

First let's create a simple response:

import { Response, IResponseType } from "@xiara/core";

@Response({ name: "error" })
export class ErrorResponse
{
    constructor(public logging: LogService) {}

    send(req, res, errorType: string = "UnkownError", errorMessage: string = "Something went wrong")
    {
        this.logging.logError(errorType, errorMessage);
        res.status(500);
        res.json({
            error: true,
            type: errorType,
            message: errorMessage,
        });
    }
}

The above response object simply binds to the res property as function and can be called anywhere in the framework res.error(errorType:string, errorMessage: string).

All we have left is to add it to our module.

import { WebModule } from "@xiara/web";
import { ErrorResponse } from "./ErrorResponse";
@WebModule({
    responses: [
        ErrorResponse,
    ]
})
export class AppModule
{
}

And that would be it, no magic needed here. Now we can use the predefined response in our app anywhere, in controllers, in routes or in policies.

Using a responses in a controller

import { Controller, GET } from "@xiara/web";
@Controller({
    path: "/"
})
export class TodoController
{
    @GET("/error")
    testError(req, res)
    {
        res.error("SomethingIsWrong", "This error message just work!");
    }
}

Sadly this is not the way i originally imagined as there are no typing informations available about the responses yet. I am still researching a better way of doing this in typescript. Probably interface merging or similar features would allow typings and IDE autocomplete. But for now it provides the functionality so stay tuned :)

Relevant commits:

The project is split into multiple repositories as i am to create reusable packages and it's also easier to manage updates for me. I've also created an organization to easier keep track of this project.

@ xiara/web
https://github.com/xiara-io/xiara-web/commit/8e698fd4db90dad95ec2b39190b9666771999a9f

https://github.com/xiara-io/xiara-web/commit/ed8ef4fdfe742340326cab38b1a99f057d447026

https://github.com/xiara-io/xiara-web/commit/d3b6f4ed87470b4cf4aa004a638f77408f988171

https://github.com/xiara-io/xiara-web/commit/6c8b3b8f79e02e1bc82f1500793ee51505170c97

@ xiara/mongo
https://github.com/xiara-io/xiara-mongo/commit/0b7b903ede2ab74c310350c340e2ad07617c5118

https://github.com/xiara-io/xiara-mongo/commit/ce93adda83b335124f1142f9848647224467d9eb

https://github.com/xiara-io/xiara-mongo/commit/b33a76bf07c2e6d29b47874172673f0c2843606e

https://github.com/xiara-io/xiara-mongo/commit/f34d58ddd1a3e0a824edc60cec4994cf4ca0b043

@ xiara/core
https://github.com/xiara-io/xiara-core/commit/51a3f86bc5a39b79bfdc62d43718dfd09bf59249

https://github.com/xiara-io/xiara-core/commit/e58755812d5d6fa6ee969ae820b6503795a28f47

https://github.com/xiara-io/xiara-core/commit/5184d5372bcc3d9cb6a4b80eec110e753c01cc88

Roadmap

My vision on the project is that theres still a long way to go to implement all the funcitonalities a modern backend framework would require. But even then i am pretty happy with the progress and the framework turns out to be very useful in my projects.

For the next weeks i put the following on the road-map:

  • Ability to define custom responses (DONE)
  • Add more functionalities to the MongoDB ODM
  • Input validators
  • Inject decorator
  • Injector options to change behavior how injectables work
  • Async resolve for injectables
  • AppServices & Predefined Services to alter application behavior
  • A CLI tool to quickly genreate controllers, policies, middlewares, components
  • Tests
  • A Quick Start Guide, Tutorials, Examples and an API Reference / Documentation

Would you like to contribute?

If you found any bugs, have suggestions, or just a question please open an issue on github.
https://github.com/xiara-io/xiara-web/issues

Wiki

https://github.com/xiara-io/xiara-core/wiki (for future readers as api reference & documentation)

License

MIT



Posted on Utopian.io - Rewarding Open Source Contributors

Sort:  

Thank you for the contribution. It has been approved.

You can contact us on Discord.
[utopian-moderator]

Hey @eastmael, I just gave you a tip for your hard work on moderation. Upvote this comment to support the utopian moderators and increase your future rewards!

Great work. You're really brilliant.

Thanks :) Trying my best :)

why did you downvote me?

u comment but not upvote any post, thought ure just an another spam bot. sry

had low voting power. That's why I left comment so I could later find the post

Hey @azarus I am @utopian-io. I have just upvoted you!

Achievements

  • You have less than 500 followers. Just gave you a gift to help you succeed!
  • Seems like you contribute quite often. AMAZING!

Community-Driven Witness!

I am the first and only Steem Community-Driven Witness. Participate on Discord. Lets GROW TOGETHER!

mooncryption-utopian-witness-gif

Up-vote this comment to grow my power and help Open Source contributions like this one. Want to chat? Join me on Discord https://discord.gg/Pc8HG9x