Skip to content

Commit

Permalink
[CHORE] Update tsconfig for use top level await in app.ts
Browse files Browse the repository at this point in the history
  • Loading branch information
smyllet committed Mar 20, 2024
1 parent 5882924 commit 30ad703
Show file tree
Hide file tree
Showing 2 changed files with 142 additions and 148 deletions.
286 changes: 140 additions & 146 deletions src/app.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,175 +32,169 @@ declare module "fastify" {
}
}

(async () => {
// - - - - - Database - - - - - //
console.log("Connecting to database...");
Db.init()
.catch((err) => {
console.error(err);
process.exit(1);
})
.then(async () => {
console.log("Database connected.");
});

console.log("Starting server...");
const fastify = Fastify({
logger: true,
// - - - - - Database - - - - - //
console.log("Connecting to database...");
Db.init()
.catch((err) => {
console.error(err);
process.exit(1);
})
.then(async () => {
console.log("Database connected.");
});

fastify.setValidatorCompiler(validatorCompiler);
fastify.setSerializerCompiler(serializerCompiler);
console.log("Starting server...");
const fastify = Fastify({
logger: true,
});

// Set up swagger
await fastify.register(import("@fastify/swagger"), {
openapi: {
info: {
title: "Aquatracking API",
version: "1.0.0",
},
tags: [
{
name: "auth",
description: "Authentication and registration",
},
{
name: "users",
description: "Users management",
},
{
name: "aquariums",
description: "Aquariums management",
},
{
name: "applications",
description: "API applications management",
},
],
fastify.setValidatorCompiler(validatorCompiler);
fastify.setSerializerCompiler(serializerCompiler);

// - - - - - Server - - - - - //
await fastify.register(import("@fastify/swagger"), {
openapi: {
info: {
title: "Aquatracking API",
version: "1.0.0",
},
transform: jsonSchemaTransform,
});
await fastify.register(import("@fastify/swagger-ui"), {
routePrefix: "/documentation",
tags: [
{
name: "auth",
description: "Authentication and registration",
},
{
name: "users",
description: "Users management",
},
{
name: "aquariums",
description: "Aquariums management",
},
{
name: "applications",
description: "API applications management",
},
],
},
transform: jsonSchemaTransform,
});
await fastify.register(import("@fastify/swagger-ui"), {
routePrefix: "/documentation",
});

const port = Number.parseInt(env.PORT.toString());
fastify.listen({ port: port }, () => {
console.log(`Server started on port ${port}.`);
});

// - - - - - Authentication Middleware - - - - - //
fastify.decorateRequest("user", undefined);
await fastify.register(import("@fastify/auth"), {
defaultRelation: "or",
});

await fastify.register(import("@fastify/cookie"));

// - - - - - Rate limiting - - - - - //
await fastify.register(import("@fastify/rate-limit"), {});

// - - - - - Error handling - - - - - //
fastify
.withTypeProvider<ZodTypeProvider>()
.setErrorHandler((error, request, reply) => {
const finalError = {
statusCode: 500,
error: "Internal Server Error",
code: "INTERNAL_SERVER_ERROR",
data: undefined as unknown,
};

if (error instanceof ApiError) {
finalError.statusCode = error.statusCode;
finalError.error = error.error;
finalError.code = error.code;
finalError.data = error.data;
}

if (error.statusCode === 429) {
finalError.statusCode = 429;
finalError.error = "Too Many Requests";
finalError.code = "TOO_MANY_REQUESTS";
}

return reply.status(finalError.statusCode).send(finalError);
});

const port = Number.parseInt(env.PORT.toString());
fastify.listen({ port: port }, () => {
console.log(`Server started on port ${port}.`);
});
// - - - - - Routes - - - - - //
await fastify.register(import("./routes/auth"), {
prefix: "/auth",
});

// - - - - - Authentication Middleware - - - - - //
fastify.decorateRequest("user", undefined);
await fastify.register(import("@fastify/auth"), {
defaultRelation: "or",
});
await fastify.register(async (instance) => {
instance.addHook(
"preHandler",
instance.auth([isSessionLoggedIn, isApplicationLoggedIn]),
);

await fastify.register(import("@fastify/cookie"));

// - - - - - Rate limiting - - - - - //
await fastify.register(import("@fastify/rate-limit"), {});

// - - - - - Error handling - - - - - //
fastify
.withTypeProvider<ZodTypeProvider>()
.setErrorHandler((error, request, reply) => {
const finalError = {
statusCode: 500,
error: "Internal Server Error",
code: "INTERNAL_SERVER_ERROR",
data: undefined as unknown,
};

if (error instanceof ApiError) {
finalError.statusCode = error.statusCode;
finalError.error = error.error;
finalError.code = error.code;
finalError.data = error.data;
}

if (error.statusCode === 429) {
finalError.statusCode = 429;
finalError.error = "Too Many Requests";
finalError.code = "TOO_MANY_REQUESTS";
}

return reply.status(finalError.statusCode).send(finalError);
});
instance.addHook("onRoute", (routeOptions) => {
injectSchemaInRouteOption(routeOptions, 401, NotLoggedApiError.schema);
});

// - - - - - Routes - - - - - //
await fastify.register(import("./routes/auth"), {
prefix: "/auth",
await fastify.register(import("./routes/users/me"), {
prefix: "/users/me",
});

await fastify.register(async (instance) => {
instance.addHook(
"preHandler",
instance.auth([isSessionLoggedIn, isApplicationLoggedIn]),
);
instance.register(async (instance) => {
instance.addHook("preHandler", instance.auth([isEmailValidated]));

instance.addHook("onRoute", (routeOptions) => {
injectSchemaInRouteOption(
routeOptions,
401,
NotLoggedApiError.schema,
403,
EmailNotValidatedApiError.schema,
);
});

await fastify.register(import("./routes/users/me"), {
prefix: "/users/me",
await fastify.register(import("./routes/applications"), {
prefix: "/applications",
});

instance.register(async (instance) => {
instance.addHook("preHandler", instance.auth([isEmailValidated]));

instance.addHook("onRoute", (routeOptions) => {
injectSchemaInRouteOption(
routeOptions,
403,
EmailNotValidatedApiError.schema,
);
});

await fastify.register(import("./routes/applications"), {
prefix: "/applications",
});
await fastify.register(import("./routes/biotopes/aquariums"), {
prefix: "/aquariums",
});

await fastify.register(import("./routes/biotopes/aquariums"), {
prefix: "/aquariums",
});
await fastify.register(import("./routes/biotopes/terrariums"), {
prefix: "/terrariums",
});

await fastify.register(import("./routes/biotopes/terrariums"), {
prefix: "/terrariums",
});
instance.register(
async (instance) => {
instance.addHook(
"preHandler",
instance.auth([isAdminLoggedIn]),
);

instance.register(
async (instance) => {
instance.addHook(
"preHandler",
instance.auth([isAdminLoggedIn]),
instance.addHook("onRoute", (routeOptions) => {
injectSchemaInRouteOption(
routeOptions,
403,
UserNotAdminApiError.schema,
);
});

instance.addHook("onRoute", (routeOptions) => {
injectSchemaInRouteOption(
routeOptions,
403,
UserNotAdminApiError.schema,
);
});

await fastify.register(import("./routes/admin/users"), {
prefix: "/users",
});
},
{ prefix: "/admin" },
);
});
});

// - - - - - Setup cron jobs - - - - - //
// Every day at 00:00
cron.schedule("0 0 * * *", () => {
EmailValidationOTPModel.destroyExpiredTokens();
UserModel.destroyExpiredDeletedUsers();
await fastify.register(import("./routes/admin/users"), {
prefix: "/users",
});
},
{ prefix: "/admin" },
);
});
})();
});

// - - - - - Setup cron jobs - - - - - //
// Every day at 00:00
cron.schedule("0 0 * * *", () => {
EmailValidationOTPModel.destroyExpiredTokens();
UserModel.destroyExpiredDeletedUsers();
});
4 changes: 2 additions & 2 deletions tsconfig.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"compilerOptions": {
"module": "commonjs",
"target": "ES2021",
"module": "ES2022",
"target": "ES2022",
"resolveJsonModule": true,
"esModuleInterop": true,
"sourceMap": true,
Expand Down

0 comments on commit 30ad703

Please sign in to comment.