init
This commit is contained in:
commit
9ca22325cc
23
backend/Dockerfile
Normal file
23
backend/Dockerfile
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
FROM node:20-slim AS build
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
COPY package*.json tsconfig.json ./
|
||||||
|
RUN npm install
|
||||||
|
|
||||||
|
COPY src ./src
|
||||||
|
RUN npm run build
|
||||||
|
|
||||||
|
# Finalny obraz
|
||||||
|
FROM node:20-slim
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
COPY --from=build /app/package*.json ./
|
||||||
|
RUN npm install --omit=dev
|
||||||
|
|
||||||
|
COPY --from=build /app/dist ./dist
|
||||||
|
|
||||||
|
EXPOSE 3000
|
||||||
|
CMD ["node", "dist/server.js"]
|
||||||
|
|
||||||
16
backend/_export
Normal file
16
backend/_export
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
> repo_export.txt # wyczyść plik wynikowy
|
||||||
|
|
||||||
|
while IFS= read -r file; do
|
||||||
|
# Pomijaj puste linie i pliki z katalogu _export
|
||||||
|
[[ -z "$file" || "$file" == *_export* ]] && continue
|
||||||
|
|
||||||
|
# Sprawdź, czy plik istnieje i nie jest ukryty
|
||||||
|
[[ -f "$file" && "$file" != */.* ]] || continue
|
||||||
|
|
||||||
|
echo "=== FILE: $file ==="
|
||||||
|
echo
|
||||||
|
cat "$file"
|
||||||
|
echo
|
||||||
|
echo
|
||||||
|
done < files.txt > repo_export.txt
|
||||||
|
|
||||||
1
backend/_find
Normal file
1
backend/_find
Normal file
@ -0,0 +1 @@
|
|||||||
|
find . \( -path "./node_modules" -o -path "./dist" \) -prune -o -print > files.txt
|
||||||
31
backend/docker-compose.yml
Normal file
31
backend/docker-compose.yml
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
version: "3.9"
|
||||||
|
|
||||||
|
services:
|
||||||
|
postgres:
|
||||||
|
image: postgres:16
|
||||||
|
container_name: pg-demo
|
||||||
|
restart: always
|
||||||
|
environment:
|
||||||
|
POSTGRES_USER: postgres
|
||||||
|
POSTGRES_PASSWORD: postgres
|
||||||
|
POSTGRES_DB: demo
|
||||||
|
volumes:
|
||||||
|
- pgdata:/var/lib/postgresql/data
|
||||||
|
ports:
|
||||||
|
- "5432:5432"
|
||||||
|
|
||||||
|
backend:
|
||||||
|
build: .
|
||||||
|
container_name: backend-demo
|
||||||
|
restart: always
|
||||||
|
depends_on:
|
||||||
|
- postgres
|
||||||
|
environment:
|
||||||
|
DATABASE_URL: postgres://postgres:postgres@postgres:5432/demo
|
||||||
|
PORT: 3000
|
||||||
|
ports:
|
||||||
|
- "3000:3000"
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
pgdata:
|
||||||
|
|
||||||
0
backend/migrate.sql
Normal file
0
backend/migrate.sql
Normal file
2320
backend/package-lock.json
generated
Normal file
2320
backend/package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
22
backend/package.json
Normal file
22
backend/package.json
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"name": "fastify-graphql-demo",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"main": "dist/server.js",
|
||||||
|
"type": "module",
|
||||||
|
"scripts": {
|
||||||
|
"dev": "ts-node-dev --respawn --transpile-only src/server.ts",
|
||||||
|
"build": "tsc -p .",
|
||||||
|
"start": "node dist/server.js"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"fastify": "^4.26.2",
|
||||||
|
"mercurius": "^16.2.0",
|
||||||
|
"pg": "^8.11.3"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@types/node": "^22.7.4",
|
||||||
|
"@types/pg": "^8.15.5",
|
||||||
|
"ts-node-dev": "^2.0.0",
|
||||||
|
"typescript": "^5.6.3"
|
||||||
|
}
|
||||||
|
}
|
||||||
32
backend/src/db.ts
Normal file
32
backend/src/db.ts
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
import pkg from "pg";
|
||||||
|
const { Pool } = pkg;
|
||||||
|
|
||||||
|
const pool = new Pool({
|
||||||
|
connectionString:
|
||||||
|
process.env.DATABASE_URL ||
|
||||||
|
"postgres://postgres:postgres@localhost:5432/demo",
|
||||||
|
});
|
||||||
|
|
||||||
|
export async function query<T extends pkg.QueryResultRow>(
|
||||||
|
q: string,
|
||||||
|
params?: any[]
|
||||||
|
): Promise<T[]> {
|
||||||
|
const client = await pool.connect();
|
||||||
|
try {
|
||||||
|
const res = await client.query<T>(q, params);
|
||||||
|
return res.rows;
|
||||||
|
} finally {
|
||||||
|
client.release();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function initDB(): Promise<void> {
|
||||||
|
await query(`
|
||||||
|
CREATE TABLE IF NOT EXISTS pump_data (
|
||||||
|
id SERIAL PRIMARY KEY,
|
||||||
|
payload JSONB NOT NULL,
|
||||||
|
created_at TIMESTAMP DEFAULT now()
|
||||||
|
);
|
||||||
|
`);
|
||||||
|
}
|
||||||
|
|
||||||
65
backend/src/server.ts
Normal file
65
backend/src/server.ts
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
import Fastify from "fastify";
|
||||||
|
import mercurius from "mercurius";
|
||||||
|
import { query, initDB } from "./db.js";
|
||||||
|
|
||||||
|
const app = Fastify();
|
||||||
|
|
||||||
|
// Healthchecki
|
||||||
|
app.get("/healthz", async () => ({ status: "ok" }));
|
||||||
|
app.get("/readyz", async () => ({ ready: true }));
|
||||||
|
|
||||||
|
// Schemat GraphQL
|
||||||
|
const schema = `
|
||||||
|
type PumpResult {
|
||||||
|
id: ID!
|
||||||
|
created_at: String!
|
||||||
|
}
|
||||||
|
|
||||||
|
type Query {
|
||||||
|
health: String!
|
||||||
|
}
|
||||||
|
|
||||||
|
type Mutation {
|
||||||
|
pump(payload: String!): PumpResult!
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
|
const resolvers = {
|
||||||
|
Query: {
|
||||||
|
health: async () => "ok",
|
||||||
|
},
|
||||||
|
Mutation: {
|
||||||
|
pump: async (_: unknown, { payload }: { payload: string }) => {
|
||||||
|
const rows = await query<{ id: number; created_at: string }>(
|
||||||
|
"INSERT INTO pump_data(payload) VALUES($1) RETURNING id, created_at",
|
||||||
|
[payload]
|
||||||
|
);
|
||||||
|
return rows[0];
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
// Rejestracja GraphQL
|
||||||
|
app.register(mercurius, {
|
||||||
|
schema,
|
||||||
|
resolvers,
|
||||||
|
graphiql: true,
|
||||||
|
});
|
||||||
|
|
||||||
|
const start = async () => {
|
||||||
|
try {
|
||||||
|
await initDB();
|
||||||
|
|
||||||
|
const port = Number(process.env.PORT) || 3000;
|
||||||
|
await app.listen(port, "0.0.0.0");
|
||||||
|
|
||||||
|
console.log(`🚀 Server running at http://0.0.0.0:${port}/graphql`);
|
||||||
|
|
||||||
|
} catch (err) {
|
||||||
|
console.error(err);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
start();
|
||||||
|
|
||||||
0
backend/src/types.d.ts
vendored
Normal file
0
backend/src/types.d.ts
vendored
Normal file
16
backend/tsconfig.json
Normal file
16
backend/tsconfig.json
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"target": "ES2020",
|
||||||
|
"module": "ES2020",
|
||||||
|
"moduleResolution": "Node",
|
||||||
|
"outDir": "dist",
|
||||||
|
"rootDir": "src",
|
||||||
|
"esModuleInterop": true,
|
||||||
|
"forceConsistentCasingInFileNames": true,
|
||||||
|
"strict": true,
|
||||||
|
"skipLibCheck": true
|
||||||
|
},
|
||||||
|
"include": ["src/**/*.ts"],
|
||||||
|
"exclude": ["node_modules"]
|
||||||
|
}
|
||||||
|
|
||||||
Loading…
Reference in New Issue
Block a user