1.2.3 • Published 8 months ago

decorated-fastify v1.2.3

Weekly downloads
-
License
ISC
Repository
-
Last release
8 months ago

Decorated Fastify

Basic

@Controller()
class HelloController {
  @Get()
  getHello = route((req, res) => {
    res.status(200).send({ message: "Hello World!" });
  });
}

registerControllers(fastify, [HelloController], {
  // optional
  basePath: "/api", // results all controllers to have a starting of /api
});

// get url/api -> message: Hello World!

Bigger

 const mainSchema = Joi.object({
  text: Joi.string().required().messages({"any.required" : "Text is required"});
});


@Controller("/hello")
class HelloController {
  @Get("/main")
  getHello = route((req, res) => {
    res.status(200).send({ message: "Hello World!" });
  });

  @Validate(mainSchema)  // returns *Text is required*. You can make it look better with onError hook
  @Post("/main")
  createHello = route<{Body: { text: string }}>((req, res) => {
    res.status(200).send({ message: req.body.text }); // text is %100 exists, it is validated
  });
}

registerControllers(fastify, [HelloController], {
  basePath: "/api",
});

// get url/api/hello/main -> message: Hello World!

Create and Use Middleware && Use services outside controllers/services

const Auth = CreateHandlerDecorator<string>(async (req, res, done, payload) => {
  if (req.headers.authorization) {
    req.user = await FastDI.service(dbService).getUser(req.headers.authorization); // Use service outside
    done();
  }
  // also you can use optional payload, its type is generic, so it is now string
  return reply.status(401).send({ message: "Needs auth" });
});

@Controller("/hello")
class HelloController {
  @Auth() // now user must be authorized - Also you can pass payload like @Auth("Admin")
  @Get("/main")
  getHello = route((req, res) => {
    res.status(200).send({ message: "Hello World!" });
  });
}

Global Middleware

const Auth = CreateControllerHandlerDecorator<string>(async (req, res, done, payload) => {
  if (req.headers.authorization) {
    req.user = await FastDI.service(dbService).getUser(req.headers.authorization); // Use service outside
    done();
  }
  // also you can use optional payload, its type is generic, so it is now string
  return reply.status(401).send({ message: "Needs auth" });
});

@Auth() // it affects all non pure routes
@Controller("/hello")
class HelloController {
  @Get("/main") // this is protected
  getHello = route((req, res) => {
    res.status(200).send({ message: "Hello World!" });
  });

  @Pure()
  @Get("/main") // this is not protected
  getHi = route((req, res) => {
    res.status(200).send({ message: "Hi World!" });
  });
}
1.2.3

8 months ago

1.2.2

8 months ago

1.2.1

8 months ago

1.2.0

10 months ago

1.1.6

2 years ago

1.1.5

2 years ago

1.1.4

2 years ago

1.1.1

2 years ago

1.1.3

2 years ago

1.1.2

2 years ago

1.1.0

2 years ago

1.0.9

2 years ago

1.0.8

2 years ago

1.0.7

2 years ago

1.0.6

2 years ago

1.0.5

2 years ago

1.0.4

2 years ago

1.0.3

2 years ago

1.0.2

2 years ago

1.0.1

2 years ago

1.0.0

2 years ago