yes
This commit is contained in:
parent
2f991d9743
commit
985c636360
36 changed files with 6507 additions and 2 deletions
|
|
@ -6,7 +6,7 @@ server {
|
|||
|
||||
server_name $NGINX_DOMAIN;
|
||||
|
||||
if ($host = example.com) {
|
||||
if ($host = $NGINX_DOMAIN) {
|
||||
return 301 https://$host$request_uri;
|
||||
}
|
||||
return 404;
|
||||
|
|
@ -22,5 +22,6 @@ server {
|
|||
ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;
|
||||
ssl_protocols TLSv1.3;
|
||||
|
||||
proxy_set_header X-Forwarded true;
|
||||
include conf.d/locations/*.conf;
|
||||
}
|
||||
|
|
|
|||
65
src/db/.gitignore
vendored
Normal file
65
src/db/.gitignore
vendored
Normal file
|
|
@ -0,0 +1,65 @@
|
|||
# Logs
|
||||
logs
|
||||
*.log
|
||||
npm-debug.log*
|
||||
|
||||
# Runtime data
|
||||
pids
|
||||
*.pid
|
||||
*.seed
|
||||
|
||||
# Directory for instrumented libs generated by jscoverage/JSCover
|
||||
lib-cov
|
||||
|
||||
# Coverage directory used by tools like istanbul
|
||||
coverage
|
||||
|
||||
# nyc test coverage
|
||||
.nyc_output
|
||||
|
||||
# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
|
||||
.grunt
|
||||
|
||||
# node-waf configuration
|
||||
.lock-wscript
|
||||
|
||||
# Compiled binary addons (http://nodejs.org/api/addons.html)
|
||||
build/Release
|
||||
|
||||
# Dependency directories
|
||||
node_modules
|
||||
jspm_packages
|
||||
|
||||
# Optional npm cache directory
|
||||
.npm
|
||||
|
||||
# Optional REPL history
|
||||
.node_repl_history
|
||||
|
||||
# 0x
|
||||
profile-*
|
||||
|
||||
# mac files
|
||||
.DS_Store
|
||||
|
||||
# vim swap files
|
||||
*.swp
|
||||
|
||||
# webstorm
|
||||
.idea
|
||||
|
||||
# vscode
|
||||
.vscode
|
||||
*code-workspace
|
||||
|
||||
# clinic
|
||||
profile*
|
||||
*clinic*
|
||||
*flamegraph*
|
||||
|
||||
# generated code
|
||||
examples/typescript-server.js
|
||||
test/types/index.js
|
||||
|
||||
# compiled app
|
||||
dist
|
||||
23
src/db/README.md
Normal file
23
src/db/README.md
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
# Getting Started with [Fastify-CLI](https://www.npmjs.com/package/fastify-cli)
|
||||
This project was bootstrapped with Fastify-CLI.
|
||||
|
||||
## Available Scripts
|
||||
|
||||
In the project directory, you can run:
|
||||
|
||||
### `npm run dev`
|
||||
|
||||
To start the app in dev mode.\
|
||||
Open [http://localhost:3000](http://localhost:3000) to view it in the browser.
|
||||
|
||||
### `npm start`
|
||||
|
||||
For production mode
|
||||
|
||||
### `npm run test`
|
||||
|
||||
Run the test cases.
|
||||
|
||||
## Learn More
|
||||
|
||||
To learn Fastify, check out the [Fastify documentation](https://fastify.dev/docs/latest/).
|
||||
2547
src/db/package-lock.json
generated
Normal file
2547
src/db/package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load diff
36
src/db/package.json
Normal file
36
src/db/package.json
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
{
|
||||
"type": "module",
|
||||
"name": "db",
|
||||
"version": "1.0.0",
|
||||
"description": "This project was bootstrapped with Fastify-CLI.",
|
||||
"main": "app.ts",
|
||||
"directories": {
|
||||
"test": "test"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "npm run build:ts && tsc -p test/tsconfig.json && FASTIFY_AUTOLOAD_TYPESCRIPT=1 node --test --experimental-test-coverage --loader ts-node/esm test/**/*.ts",
|
||||
"start": "npm run build:ts && fastify start -l info dist/app.js",
|
||||
"build:ts": "tsc",
|
||||
"watch:ts": "tsc -w",
|
||||
"dev": "npm run build:ts && concurrently -k -p \"[{name}]\" -n \"TypeScript,App\" -c \"yellow.bold,cyan.bold\" \"npm:watch:ts\" \"npm:dev:start\"",
|
||||
"dev:start": "fastify start --ignore-watch=.ts$ -w -l info -P dist/app.js"
|
||||
},
|
||||
"keywords": [],
|
||||
"author": "",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"fastify": "^5.0.0",
|
||||
"fastify-plugin": "^5.0.0",
|
||||
"@fastify/autoload": "^6.0.0",
|
||||
"@fastify/sensible": "^6.0.0",
|
||||
"fastify-cli": "^7.4.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "^22.1.0",
|
||||
"c8": "^10.1.2",
|
||||
"ts-node": "^10.4.0",
|
||||
"concurrently": "^9.0.0",
|
||||
"fastify-tsconfig": "^3.0.0",
|
||||
"typescript": "~5.8.2"
|
||||
}
|
||||
}
|
||||
46
src/db/src/app.ts
Normal file
46
src/db/src/app.ts
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
import * as path from 'node:path'
|
||||
import AutoLoad, { AutoloadPluginOptions } from '@fastify/autoload'
|
||||
import { FastifyPluginAsync } from 'fastify'
|
||||
import { fileURLToPath } from 'node:url'
|
||||
|
||||
const __filename = fileURLToPath(import.meta.url)
|
||||
const __dirname = path.dirname(__filename)
|
||||
|
||||
export type AppOptions = {
|
||||
// Place your custom options for app below here.
|
||||
} & Partial<AutoloadPluginOptions>
|
||||
|
||||
// Pass --options via CLI arguments in command to enable these options.
|
||||
const options: AppOptions = {
|
||||
}
|
||||
|
||||
const app: FastifyPluginAsync<AppOptions> = async (
|
||||
fastify,
|
||||
opts
|
||||
): Promise<void> => {
|
||||
// Place here your custom code!
|
||||
|
||||
// Do not touch the following lines
|
||||
|
||||
// This loads all plugins defined in plugins
|
||||
// those should be support plugins that are reused
|
||||
// through your application
|
||||
// eslint-disable-next-line no-void
|
||||
void fastify.register(AutoLoad, {
|
||||
dir: path.join(__dirname, 'plugins'),
|
||||
options: opts,
|
||||
forceESM: true
|
||||
})
|
||||
|
||||
// This loads all plugins defined in routes
|
||||
// define your routes in one of these
|
||||
// eslint-disable-next-line no-void
|
||||
void fastify.register(AutoLoad, {
|
||||
dir: path.join(__dirname, 'routes'),
|
||||
options: opts,
|
||||
forceESM: true
|
||||
})
|
||||
}
|
||||
|
||||
export default app
|
||||
export { app, options }
|
||||
16
src/db/src/plugins/README.md
Normal file
16
src/db/src/plugins/README.md
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
# Plugins Folder
|
||||
|
||||
Plugins define behavior that is common to all the routes in your
|
||||
application. Authentication, caching, templates, and all the other cross
|
||||
cutting concerns should be handled by plugins placed in this folder.
|
||||
|
||||
Files in this folder are typically defined through the
|
||||
[`fastify-plugin`](https://github.com/fastify/fastify-plugin) module,
|
||||
making them non-encapsulated. They can define decorators and set hooks
|
||||
that will then be used in the rest of your application.
|
||||
|
||||
Check out:
|
||||
|
||||
* [The hitchhiker's guide to plugins](https://fastify.dev/docs/latest/Guides/Plugins-Guide/)
|
||||
* [Fastify decorators](https://fastify.dev/docs/latest/Reference/Decorators/).
|
||||
* [Fastify lifecycle](https://fastify.dev/docs/latest/Reference/Lifecycle/).
|
||||
11
src/db/src/plugins/sensible.ts
Normal file
11
src/db/src/plugins/sensible.ts
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
import fp from 'fastify-plugin'
|
||||
import sensible, { FastifySensibleOptions } from '@fastify/sensible'
|
||||
|
||||
/**
|
||||
* This plugins adds some utilities to handle http errors
|
||||
*
|
||||
* @see https://github.com/fastify/fastify-sensible
|
||||
*/
|
||||
export default fp<FastifySensibleOptions>(async (fastify) => {
|
||||
fastify.register(sensible)
|
||||
})
|
||||
20
src/db/src/plugins/support.ts
Normal file
20
src/db/src/plugins/support.ts
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
import fp from 'fastify-plugin'
|
||||
|
||||
export interface SupportPluginOptions {
|
||||
// Specify Support plugin options here
|
||||
}
|
||||
|
||||
// The use of fastify-plugin is required to be able
|
||||
// to export the decorators to the outer scope
|
||||
export default fp<SupportPluginOptions>(async (fastify, opts) => {
|
||||
fastify.decorate('someSupport', function () {
|
||||
return 'hugs'
|
||||
})
|
||||
})
|
||||
|
||||
// When using .decorate you have to specify added properties for Typescript
|
||||
declare module 'fastify' {
|
||||
export interface FastifyInstance {
|
||||
someSupport(): string;
|
||||
}
|
||||
}
|
||||
29
src/db/src/routes/README.md
Normal file
29
src/db/src/routes/README.md
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
# Routes Folder
|
||||
|
||||
Routes define the pathways within your application.
|
||||
Fastify's structure supports the modular monolith approach, where your
|
||||
application is organized into distinct, self-contained modules.
|
||||
This facilitates easier scaling and future transition to a microservice architecture.
|
||||
In the future you might want to independently deploy some of those.
|
||||
|
||||
In this folder you should define all the routes that define the endpoints
|
||||
of your web application.
|
||||
Each service is a [Fastify
|
||||
plugin](https://fastify.dev/docs/latest/Reference/Plugins/), it is
|
||||
encapsulated (it can have its own independent plugins) and it is
|
||||
typically stored in a file; be careful to group your routes logically,
|
||||
e.g. all `/users` routes in a `users.js` file. We have added
|
||||
a `root.js` file for you with a '/' root added.
|
||||
|
||||
If a single file becomes too large, create a folder and add a `index.js` file there:
|
||||
this file must be a Fastify plugin, and it will be loaded automatically
|
||||
by the application. You can now add as many files as you want inside that folder.
|
||||
In this way you can create complex routes within a single monolith,
|
||||
and eventually extract them.
|
||||
|
||||
If you need to share functionality between routes, place that
|
||||
functionality into the `plugins` folder, and share it via
|
||||
[decorators](https://fastify.dev/docs/latest/Reference/Decorators/).
|
||||
|
||||
If you're a bit confused about using `async/await` to write routes, you would
|
||||
better take a look at [Promise resolution](https://fastify.dev/docs/latest/Reference/Routes/#promise-resolution) for more details.
|
||||
9
src/db/src/routes/root.ts
Normal file
9
src/db/src/routes/root.ts
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
import { FastifyPluginAsync } from 'fastify'
|
||||
|
||||
const root: FastifyPluginAsync = async (fastify, opts): Promise<void> => {
|
||||
fastify.get('/', async function(request, reply) {
|
||||
reply.code(403)
|
||||
})
|
||||
}
|
||||
|
||||
export default root
|
||||
9
src/db/src/routes/user/index.ts
Normal file
9
src/db/src/routes/user/index.ts
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
import { FastifyPluginAsync } from 'fastify'
|
||||
|
||||
const example: FastifyPluginAsync = async (fastify, opts): Promise<void> => {
|
||||
fastify.get('/', async function (request, reply) {
|
||||
return 'this is an example'
|
||||
})
|
||||
}
|
||||
|
||||
export default example
|
||||
43
src/db/test/helper.ts
Normal file
43
src/db/test/helper.ts
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
// This file contains code that we reuse between our tests.
|
||||
import helper from 'fastify-cli/helper.js'
|
||||
import * as test from 'node:test'
|
||||
import * as path from 'node:path'
|
||||
import { fileURLToPath } from 'node:url'
|
||||
|
||||
export type TestContext = {
|
||||
after: typeof test.after
|
||||
}
|
||||
|
||||
const __filename = fileURLToPath(import.meta.url)
|
||||
const __dirname = path.dirname(__filename)
|
||||
const AppPath = path.join(__dirname, '..', 'src', 'app.ts')
|
||||
|
||||
// Fill in this config with all the configurations
|
||||
// needed for testing the application
|
||||
function config () {
|
||||
return {
|
||||
skipOverride: true // Register our application with fastify-plugin
|
||||
}
|
||||
}
|
||||
|
||||
// Automatically build and tear down our instance
|
||||
async function build (t: TestContext) {
|
||||
// you can set all the options supported by the fastify CLI command
|
||||
const argv = [AppPath]
|
||||
|
||||
// fastify-plugin ensures that all decorators
|
||||
// are exposed for testing purposes, this is
|
||||
// different from the production setup
|
||||
const app = await helper.build(argv, config())
|
||||
|
||||
// Tear down our app after we are done
|
||||
// eslint-disable-next-line no-void
|
||||
t.after(() => void app.close())
|
||||
|
||||
return app
|
||||
}
|
||||
|
||||
export {
|
||||
config,
|
||||
build
|
||||
}
|
||||
13
src/db/test/plugins/support.test.ts
Normal file
13
src/db/test/plugins/support.test.ts
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
import { test } from 'node:test'
|
||||
import * as assert from 'node:assert'
|
||||
import Fastify from 'fastify'
|
||||
import Support from '../../src/plugins/support.js'
|
||||
|
||||
test('support works standalone', async (t) => {
|
||||
const fastify = Fastify()
|
||||
// eslint-disable-next-line no-void
|
||||
void fastify.register(Support)
|
||||
await fastify.ready()
|
||||
|
||||
assert.equal(fastify.someSupport(), 'hugs')
|
||||
})
|
||||
13
src/db/test/routes/example.test.ts
Normal file
13
src/db/test/routes/example.test.ts
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
import { test } from 'node:test'
|
||||
import * as assert from 'node:assert'
|
||||
import { build } from '../helper.js'
|
||||
|
||||
test('example is loaded', async (t) => {
|
||||
const app = await build(t)
|
||||
|
||||
const res = await app.inject({
|
||||
url: '/example'
|
||||
})
|
||||
|
||||
assert.equal(res.payload, 'this is an example')
|
||||
})
|
||||
12
src/db/test/routes/root.test.ts
Normal file
12
src/db/test/routes/root.test.ts
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
import { test } from 'node:test'
|
||||
import * as assert from 'node:assert'
|
||||
import { build } from '../helper.js'
|
||||
|
||||
test('default root route', async (t) => {
|
||||
const app = await build(t)
|
||||
|
||||
const res = await app.inject({
|
||||
url: '/'
|
||||
})
|
||||
assert.deepStrictEqual(JSON.parse(res.payload), { root: true })
|
||||
})
|
||||
8
src/db/test/tsconfig.json
Normal file
8
src/db/test/tsconfig.json
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
{
|
||||
"extends": "../tsconfig.json",
|
||||
"compilerOptions": {
|
||||
"baseUrl": ".",
|
||||
"noEmit": false
|
||||
},
|
||||
"include": ["../src/**/*.ts", "**/*.ts"]
|
||||
}
|
||||
12
src/db/tsconfig.json
Normal file
12
src/db/tsconfig.json
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
{
|
||||
"extends": "fastify-tsconfig",
|
||||
"compilerOptions": {
|
||||
"outDir": "dist",
|
||||
"sourceMap": true,
|
||||
"moduleResolution": "NodeNext",
|
||||
"module": "NodeNext",
|
||||
"target": "ES2022",
|
||||
"esModuleInterop": true
|
||||
},
|
||||
"include": ["src/**/*.ts"]
|
||||
}
|
||||
12
src/schemas/package.json
Normal file
12
src/schemas/package.json
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
{
|
||||
"name": "deadge_schemas",
|
||||
"version": "1.0.0",
|
||||
"description": "",
|
||||
"license": "ISC",
|
||||
"author": "",
|
||||
"main": "index.js",
|
||||
"scripts": {},
|
||||
"dependencies": {
|
||||
"fastify-cli": "^7.4.0"
|
||||
}
|
||||
}
|
||||
65
src/user-icons/.gitignore
vendored
Normal file
65
src/user-icons/.gitignore
vendored
Normal file
|
|
@ -0,0 +1,65 @@
|
|||
# Logs
|
||||
logs
|
||||
*.log
|
||||
npm-debug.log*
|
||||
|
||||
# Runtime data
|
||||
pids
|
||||
*.pid
|
||||
*.seed
|
||||
|
||||
# Directory for instrumented libs generated by jscoverage/JSCover
|
||||
lib-cov
|
||||
|
||||
# Coverage directory used by tools like istanbul
|
||||
coverage
|
||||
|
||||
# nyc test coverage
|
||||
.nyc_output
|
||||
|
||||
# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
|
||||
.grunt
|
||||
|
||||
# node-waf configuration
|
||||
.lock-wscript
|
||||
|
||||
# Compiled binary addons (http://nodejs.org/api/addons.html)
|
||||
build/Release
|
||||
|
||||
# Dependency directories
|
||||
node_modules
|
||||
jspm_packages
|
||||
|
||||
# Optional npm cache directory
|
||||
.npm
|
||||
|
||||
# Optional REPL history
|
||||
.node_repl_history
|
||||
|
||||
# 0x
|
||||
profile-*
|
||||
|
||||
# mac files
|
||||
.DS_Store
|
||||
|
||||
# vim swap files
|
||||
*.swp
|
||||
|
||||
# webstorm
|
||||
.idea
|
||||
|
||||
# vscode
|
||||
.vscode
|
||||
*code-workspace
|
||||
|
||||
# clinic
|
||||
profile*
|
||||
*clinic*
|
||||
*flamegraph*
|
||||
|
||||
# generated code
|
||||
examples/typescript-server.js
|
||||
test/types/index.js
|
||||
|
||||
# compiled app
|
||||
dist
|
||||
23
src/user-icons/README.md
Normal file
23
src/user-icons/README.md
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
# Getting Started with [Fastify-CLI](https://www.npmjs.com/package/fastify-cli)
|
||||
This project was bootstrapped with Fastify-CLI.
|
||||
|
||||
## Available Scripts
|
||||
|
||||
In the project directory, you can run:
|
||||
|
||||
### `npm run dev`
|
||||
|
||||
To start the app in dev mode.\
|
||||
Open [http://localhost:3000](http://localhost:3000) to view it in the browser.
|
||||
|
||||
### `npm start`
|
||||
|
||||
For production mode
|
||||
|
||||
### `npm run test`
|
||||
|
||||
Run the test cases.
|
||||
|
||||
## Learn More
|
||||
|
||||
To learn Fastify, check out the [Fastify documentation](https://fastify.dev/docs/latest/).
|
||||
3205
src/user-icons/package-lock.json
generated
Normal file
3205
src/user-icons/package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load diff
38
src/user-icons/package.json
Normal file
38
src/user-icons/package.json
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
{
|
||||
"type": "module",
|
||||
"name": "user-icons",
|
||||
"version": "1.0.0",
|
||||
"description": "This project was bootstrapped with Fastify-CLI.",
|
||||
"main": "app.ts",
|
||||
"directories": {
|
||||
"test": "test"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "npm run build:ts && tsc -p test/tsconfig.json && FASTIFY_AUTOLOAD_TYPESCRIPT=1 node --test --experimental-test-coverage --loader ts-node/esm test/**/*.ts",
|
||||
"start": "npm run build:ts && fastify start -l info dist/app.js",
|
||||
"build:ts": "tsc",
|
||||
"watch:ts": "tsc -w",
|
||||
"dev": "npm run build:ts && concurrently -k -p \"[{name}]\" -n \"TypeScript,App\" -c \"yellow.bold,cyan.bold\" \"npm:watch:ts\" \"npm:dev:start\"",
|
||||
"dev:start": "fastify start --ignore-watch=.ts$ -w -l info -P dist/app.js"
|
||||
},
|
||||
"keywords": [],
|
||||
"author": "",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"@fastify/autoload": "^6.3.1",
|
||||
"@fastify/sensible": "^6.0.0",
|
||||
"@fastify/static": "^8.2.0",
|
||||
"fastify": "^5.0.0",
|
||||
"fastify-cli": "^7.4.0",
|
||||
"fastify-plugin": "^5.0.0",
|
||||
"sharp": "^0.34.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "^22.1.0",
|
||||
"c8": "^10.1.2",
|
||||
"concurrently": "^9.0.0",
|
||||
"fastify-tsconfig": "^3.0.0",
|
||||
"ts-node": "^10.4.0",
|
||||
"typescript": "~5.8.2"
|
||||
}
|
||||
}
|
||||
46
src/user-icons/src/app.ts
Normal file
46
src/user-icons/src/app.ts
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
import * as path from 'node:path'
|
||||
import AutoLoad, { AutoloadPluginOptions } from '@fastify/autoload'
|
||||
import { FastifyPluginAsync } from 'fastify'
|
||||
import { fileURLToPath } from 'node:url'
|
||||
|
||||
const __filename = fileURLToPath(import.meta.url)
|
||||
const __dirname = path.dirname(__filename)
|
||||
|
||||
export type AppOptions = {
|
||||
// Place your custom options for app below here.
|
||||
} & Partial<AutoloadPluginOptions>
|
||||
|
||||
// Pass --options via CLI arguments in command to enable these options.
|
||||
const options: AppOptions = {
|
||||
}
|
||||
|
||||
const app: FastifyPluginAsync<AppOptions> = async (
|
||||
fastify,
|
||||
opts
|
||||
): Promise<void> => {
|
||||
// Place here your custom code!
|
||||
|
||||
// Do not touch the following lines
|
||||
|
||||
// This loads all plugins defined in plugins
|
||||
// those should be support plugins that are reused
|
||||
// through your application
|
||||
// eslint-disable-next-line no-void
|
||||
void fastify.register(AutoLoad, {
|
||||
dir: path.join(__dirname, 'plugins'),
|
||||
options: opts,
|
||||
forceESM: true
|
||||
})
|
||||
|
||||
// This loads all plugins defined in routes
|
||||
// define your routes in one of these
|
||||
// eslint-disable-next-line no-void
|
||||
void fastify.register(AutoLoad, {
|
||||
dir: path.join(__dirname, 'routes'),
|
||||
options: opts,
|
||||
forceESM: true
|
||||
})
|
||||
}
|
||||
|
||||
export default app
|
||||
export { app, options }
|
||||
16
src/user-icons/src/plugins/README.md
Normal file
16
src/user-icons/src/plugins/README.md
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
# Plugins Folder
|
||||
|
||||
Plugins define behavior that is common to all the routes in your
|
||||
application. Authentication, caching, templates, and all the other cross
|
||||
cutting concerns should be handled by plugins placed in this folder.
|
||||
|
||||
Files in this folder are typically defined through the
|
||||
[`fastify-plugin`](https://github.com/fastify/fastify-plugin) module,
|
||||
making them non-encapsulated. They can define decorators and set hooks
|
||||
that will then be used in the rest of your application.
|
||||
|
||||
Check out:
|
||||
|
||||
* [The hitchhiker's guide to plugins](https://fastify.dev/docs/latest/Guides/Plugins-Guide/)
|
||||
* [Fastify decorators](https://fastify.dev/docs/latest/Reference/Decorators/).
|
||||
* [Fastify lifecycle](https://fastify.dev/docs/latest/Reference/Lifecycle/).
|
||||
11
src/user-icons/src/plugins/sensible.ts
Normal file
11
src/user-icons/src/plugins/sensible.ts
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
import fp from 'fastify-plugin'
|
||||
import sensible, { FastifySensibleOptions } from '@fastify/sensible'
|
||||
|
||||
/**
|
||||
* This plugins adds some utilities to handle http errors
|
||||
*
|
||||
* @see https://github.com/fastify/fastify-sensible
|
||||
*/
|
||||
export default fp<FastifySensibleOptions>(async (fastify) => {
|
||||
fastify.register(sensible)
|
||||
})
|
||||
20
src/user-icons/src/plugins/support.ts
Normal file
20
src/user-icons/src/plugins/support.ts
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
import fp from 'fastify-plugin'
|
||||
|
||||
export interface SupportPluginOptions {
|
||||
// Specify Support plugin options here
|
||||
}
|
||||
|
||||
// The use of fastify-plugin is required to be able
|
||||
// to export the decorators to the outer scope
|
||||
export default fp<SupportPluginOptions>(async (fastify, opts) => {
|
||||
fastify.decorate('someSupport', function () {
|
||||
return 'hugs'
|
||||
})
|
||||
})
|
||||
|
||||
// When using .decorate you have to specify added properties for Typescript
|
||||
declare module 'fastify' {
|
||||
export interface FastifyInstance {
|
||||
someSupport(): string;
|
||||
}
|
||||
}
|
||||
29
src/user-icons/src/routes/README.md
Normal file
29
src/user-icons/src/routes/README.md
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
# Routes Folder
|
||||
|
||||
Routes define the pathways within your application.
|
||||
Fastify's structure supports the modular monolith approach, where your
|
||||
application is organized into distinct, self-contained modules.
|
||||
This facilitates easier scaling and future transition to a microservice architecture.
|
||||
In the future you might want to independently deploy some of those.
|
||||
|
||||
In this folder you should define all the routes that define the endpoints
|
||||
of your web application.
|
||||
Each service is a [Fastify
|
||||
plugin](https://fastify.dev/docs/latest/Reference/Plugins/), it is
|
||||
encapsulated (it can have its own independent plugins) and it is
|
||||
typically stored in a file; be careful to group your routes logically,
|
||||
e.g. all `/users` routes in a `users.js` file. We have added
|
||||
a `root.js` file for you with a '/' root added.
|
||||
|
||||
If a single file becomes too large, create a folder and add a `index.js` file there:
|
||||
this file must be a Fastify plugin, and it will be loaded automatically
|
||||
by the application. You can now add as many files as you want inside that folder.
|
||||
In this way you can create complex routes within a single monolith,
|
||||
and eventually extract them.
|
||||
|
||||
If you need to share functionality between routes, place that
|
||||
functionality into the `plugins` folder, and share it via
|
||||
[decorators](https://fastify.dev/docs/latest/Reference/Decorators/).
|
||||
|
||||
If you're a bit confused about using `async/await` to write routes, you would
|
||||
better take a look at [Promise resolution](https://fastify.dev/docs/latest/Reference/Routes/#promise-resolution) for more details.
|
||||
17
src/user-icons/src/routes/icon/index.ts
Normal file
17
src/user-icons/src/routes/icon/index.ts
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
import { fastifyStatic } from '@fastify/static'
|
||||
import process from 'node:process'
|
||||
import { FastifyPluginAsync } from 'fastify'
|
||||
|
||||
const example: FastifyPluginAsync = async (fastify, opts): Promise<void> => {
|
||||
console.log("HELLO ????")
|
||||
fastify.post('/set/:userid', async function(request, reply) {
|
||||
console.log(request.params)
|
||||
})
|
||||
|
||||
fastify.register(fastifyStatic, {
|
||||
root: process.env.USER_ICONS_STORE ?? "/tmp/icons",
|
||||
prefix: '/get',
|
||||
})
|
||||
}
|
||||
|
||||
export default example
|
||||
9
src/user-icons/src/routes/root.ts
Normal file
9
src/user-icons/src/routes/root.ts
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
import { FastifyPluginAsync } from 'fastify'
|
||||
|
||||
const root: FastifyPluginAsync = async (fastify, opts): Promise<void> => {
|
||||
fastify.get('/', async function (request, reply) {
|
||||
return { root: true }
|
||||
})
|
||||
}
|
||||
|
||||
export default root
|
||||
43
src/user-icons/test/helper.ts
Normal file
43
src/user-icons/test/helper.ts
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
// This file contains code that we reuse between our tests.
|
||||
import helper from 'fastify-cli/helper.js'
|
||||
import * as test from 'node:test'
|
||||
import * as path from 'node:path'
|
||||
import { fileURLToPath } from 'node:url'
|
||||
|
||||
export type TestContext = {
|
||||
after: typeof test.after
|
||||
}
|
||||
|
||||
const __filename = fileURLToPath(import.meta.url)
|
||||
const __dirname = path.dirname(__filename)
|
||||
const AppPath = path.join(__dirname, '..', 'src', 'app.ts')
|
||||
|
||||
// Fill in this config with all the configurations
|
||||
// needed for testing the application
|
||||
function config () {
|
||||
return {
|
||||
skipOverride: true // Register our application with fastify-plugin
|
||||
}
|
||||
}
|
||||
|
||||
// Automatically build and tear down our instance
|
||||
async function build (t: TestContext) {
|
||||
// you can set all the options supported by the fastify CLI command
|
||||
const argv = [AppPath]
|
||||
|
||||
// fastify-plugin ensures that all decorators
|
||||
// are exposed for testing purposes, this is
|
||||
// different from the production setup
|
||||
const app = await helper.build(argv, config())
|
||||
|
||||
// Tear down our app after we are done
|
||||
// eslint-disable-next-line no-void
|
||||
t.after(() => void app.close())
|
||||
|
||||
return app
|
||||
}
|
||||
|
||||
export {
|
||||
config,
|
||||
build
|
||||
}
|
||||
13
src/user-icons/test/plugins/support.test.ts
Normal file
13
src/user-icons/test/plugins/support.test.ts
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
import { test } from 'node:test'
|
||||
import * as assert from 'node:assert'
|
||||
import Fastify from 'fastify'
|
||||
import Support from '../../src/plugins/support.js'
|
||||
|
||||
test('support works standalone', async (t) => {
|
||||
const fastify = Fastify()
|
||||
// eslint-disable-next-line no-void
|
||||
void fastify.register(Support)
|
||||
await fastify.ready()
|
||||
|
||||
assert.equal(fastify.someSupport(), 'hugs')
|
||||
})
|
||||
13
src/user-icons/test/routes/example.test.ts
Normal file
13
src/user-icons/test/routes/example.test.ts
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
import { test } from 'node:test'
|
||||
import * as assert from 'node:assert'
|
||||
import { build } from '../helper.js'
|
||||
|
||||
test('example is loaded', async (t) => {
|
||||
const app = await build(t)
|
||||
|
||||
const res = await app.inject({
|
||||
url: '/example'
|
||||
})
|
||||
|
||||
assert.equal(res.payload, 'this is an example')
|
||||
})
|
||||
12
src/user-icons/test/routes/root.test.ts
Normal file
12
src/user-icons/test/routes/root.test.ts
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
import { test } from 'node:test'
|
||||
import * as assert from 'node:assert'
|
||||
import { build } from '../helper.js'
|
||||
|
||||
test('default root route', async (t) => {
|
||||
const app = await build(t)
|
||||
|
||||
const res = await app.inject({
|
||||
url: '/'
|
||||
})
|
||||
assert.deepStrictEqual(JSON.parse(res.payload), { root: true })
|
||||
})
|
||||
8
src/user-icons/test/tsconfig.json
Normal file
8
src/user-icons/test/tsconfig.json
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
{
|
||||
"extends": "../tsconfig.json",
|
||||
"compilerOptions": {
|
||||
"baseUrl": ".",
|
||||
"noEmit": false
|
||||
},
|
||||
"include": ["../src/**/*.ts", "**/*.ts"]
|
||||
}
|
||||
12
src/user-icons/tsconfig.json
Normal file
12
src/user-icons/tsconfig.json
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
{
|
||||
"extends": "fastify-tsconfig",
|
||||
"compilerOptions": {
|
||||
"outDir": "dist",
|
||||
"sourceMap": true,
|
||||
"moduleResolution": "NodeNext",
|
||||
"module": "NodeNext",
|
||||
"target": "ES2022",
|
||||
"esModuleInterop": true
|
||||
},
|
||||
"include": ["src/**/*.ts"]
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue