ai/src/index.ts
2025-03-31 01:10:49 +02:00

82 lines
2.0 KiB
TypeScript

import 'reflect-metadata';
import Fastify from 'fastify';
import mercurius from 'mercurius';
import { registerDb } from './db';
import { User } from './entity/User';
import { Post } from './entity/Post';
const fastify = Fastify( {
logger: true
});
const schema = `
type User {
id: ID!
name: String!
posts: [Post!]!
}
type Post {
id: ID!
title: String!
author: User!
}
type Query {
user(id: ID!): User
}
type Mutation {
createUser(name: String!): User
createPost(title: String!, userId: ID!): Post
}
`
const resolvers = {
Query: {
user: async (_: unknown, { id }: {id: number} ) => {
const userRepository = fastify.orm.getRepository(User)
return await userRepository.findOne({where: { id}, relations: ['posts']})
}
},
Mutation: {
createUser: async (_: unknown, { name }: {name: string}) => {
const user = new User();
user.name = name;
const userRepository = fastify.orm.getRepository(User)
await userRepository.save(user);
return user;
},
createPost: async (_: unknown, { title, userId }: {title: string, userId: number}) => {
const userRepository = fastify.orm.getRepository(User)
const user = await userRepository.findOne({ where: { id: userId } });
if (!user) {
throw new Error("User not found");
}
const postRepository = fastify.orm.getRepository(Post)
const post = new Post();
post.title = title;
post.author = user;
await postRepository.save(post);
return post;
}
}
}
registerDb(fastify);
fastify.register(mercurius, {
schema,
resolvers,
graphiql: true
})
fastify.listen({ port: 3000}, function (err, address) {
if (err) {
fastify.log.error(err);
process.exit(1);
}
console.log(`Server listening on ${address}`);
})