Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/ragokan/decorated-fastify
https://github.com/ragokan/decorated-fastify
Last synced: about 1 month ago
JSON representation
- Host: GitHub
- URL: https://github.com/ragokan/decorated-fastify
- Owner: ragokan
- Created: 2022-01-22T21:56:55.000Z (almost 3 years ago)
- Default Branch: master
- Last Pushed: 2024-11-02T14:36:48.000Z (2 months ago)
- Last Synced: 2024-11-02T15:26:49.061Z (2 months ago)
- Language: TypeScript
- Size: 20.5 KB
- Stars: 3
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Decorated Fastify
### Basic
```ts
@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
```ts
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
```ts
const Auth = CreateHandlerDecorator(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
```ts
const Auth = CreateControllerHandlerDecorator(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!" });
});
}
```