feat: initial commit - Moraworld Imports project

This commit is contained in:
Lizandro Guarnizo
2026-06-01 08:06:40 -05:00
commit 094ea9cf81
47 changed files with 12844 additions and 0 deletions
+27
View File
@@ -0,0 +1,27 @@
# Coolify / producción — API NestJS
FROM node:22-alpine AS base
RUN corepack enable && corepack prepare pnpm@9.15.0 --activate
WORKDIR /app
FROM base AS deps
COPY package.json pnpm-workspace.yaml pnpm-lock.yaml* ./
COPY apps/api/package.json ./apps/api/
COPY packages/database/package.json ./packages/database/
RUN pnpm install --frozen-lockfile 2>/dev/null || pnpm install
FROM base AS builder
COPY --from=deps /app/node_modules ./node_modules
COPY . .
RUN pnpm --filter @moraworld/database generate
RUN pnpm --filter @moraworld/database build
RUN pnpm --filter @moraworld/api build
FROM node:22-alpine AS runner
WORKDIR /app
ENV NODE_ENV=production
COPY --from=builder /app/apps/api/dist ./dist
COPY --from=builder /app/apps/api/package.json ./
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/packages/database/node_modules/.prisma ./node_modules/.prisma
EXPOSE 3001
CMD ["node", "dist/main.js"]
+8
View File
@@ -0,0 +1,8 @@
{
"$schema": "https://json.schemastore.org/nest-cli",
"collection": "@nestjs/schematics",
"sourceRoot": "src",
"compilerOptions": {
"deleteOutDir": true
}
}
+28
View File
@@ -0,0 +1,28 @@
{
"name": "@moraworld/api",
"version": "0.1.0",
"private": true,
"scripts": {
"build": "nest build",
"dev": "nest start --watch",
"start": "node dist/main",
"start:prod": "node dist/main",
"lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix"
},
"dependencies": {
"@moraworld/database": "workspace:*",
"@nestjs/common": "^11.1.0",
"@nestjs/config": "^4.0.2",
"@nestjs/core": "^11.1.0",
"@nestjs/platform-express": "^11.1.0",
"reflect-metadata": "^0.2.2",
"rxjs": "^7.8.2"
},
"devDependencies": {
"@nestjs/cli": "^11.0.7",
"@nestjs/schematics": "^11.0.5",
"@types/express": "^5.0.1",
"@types/node": "^22.15.21",
"typescript": "^5.8.3"
}
}
+16
View File
@@ -0,0 +1,16 @@
import { Module } from "@nestjs/common";
import { ConfigModule } from "@nestjs/config";
import { HealthModule } from "./health/health.module";
import { PrismaModule } from "./prisma/prisma.module";
@Module({
imports: [
ConfigModule.forRoot({
isGlobal: true,
envFilePath: ["../../.env", ".env"],
}),
PrismaModule,
HealthModule,
],
})
export class AppModule {}
+27
View File
@@ -0,0 +1,27 @@
import { Controller, Get } from "@nestjs/common";
import { PrismaService } from "../prisma/prisma.service";
@Controller()
export class HealthController {
constructor(private readonly prisma: PrismaService) {}
@Get("health")
async health() {
let database: "ok" | "error" = "ok";
try {
await this.prisma.client.$queryRaw`SELECT 1`;
} catch {
database = "error";
}
return {
status: database === "ok" ? "ok" : "degraded",
service: "moraworld-api",
version: "0.1.0",
timestamp: new Date().toISOString(),
checks: {
database,
},
};
}
}
+7
View File
@@ -0,0 +1,7 @@
import { Module } from "@nestjs/common";
import { HealthController } from "./health.controller";
@Module({
controllers: [HealthController],
})
export class HealthModule {}
+24
View File
@@ -0,0 +1,24 @@
import { NestFactory } from "@nestjs/core";
import { AppModule } from "./app.module";
async function bootstrap() {
const app = await NestFactory.create(AppModule);
const corsOrigins = (process.env.CORS_ORIGINS ?? "http://localhost:3000")
.split(",")
.map((o) => o.trim());
app.enableCors({
origin: corsOrigins,
credentials: true,
});
app.setGlobalPrefix("api");
const port = process.env.API_PORT ?? process.env.PORT ?? 3001;
await app.listen(port, "0.0.0.0");
console.log(`Moraworld API → http://localhost:${port}/api`);
}
bootstrap();
+9
View File
@@ -0,0 +1,9 @@
import { Global, Module } from "@nestjs/common";
import { PrismaService } from "./prisma.service";
@Global()
@Module({
providers: [PrismaService],
exports: [PrismaService],
})
export class PrismaModule {}
+15
View File
@@ -0,0 +1,15 @@
import { Injectable, OnModuleDestroy, OnModuleInit } from "@nestjs/common";
import { prisma, PrismaClient } from "@moraworld/database";
@Injectable()
export class PrismaService implements OnModuleInit, OnModuleDestroy {
readonly client: PrismaClient = prisma;
async onModuleInit() {
await prisma.$connect();
}
async onModuleDestroy() {
await prisma.$disconnect();
}
}
+4
View File
@@ -0,0 +1,4 @@
{
"extends": "./tsconfig.json",
"exclude": ["node_modules", "dist", "test", "**/*spec.ts"]
}
+21
View File
@@ -0,0 +1,21 @@
{
"compilerOptions": {
"module": "commonjs",
"declaration": true,
"removeComments": true,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"allowSyntheticDefaultImports": true,
"target": "ES2022",
"sourceMap": true,
"outDir": "./dist",
"baseUrl": "./",
"incremental": true,
"skipLibCheck": true,
"strict": true,
"forceConsistentCasingInFileNames": true,
"noFallthroughCasesInSwitch": true,
"esModuleInterop": true
},
"include": ["src/**/*"]
}