Remove hasura and hasura-auth (#134)

* Remove hasura and hasura-auth

* Move all models to prisma

* Start implementing graphql

* chore: clean package json

* chore: make the code build

* chore: get initial graphql.tsx file

* feature: use typegql as qgl server

* refactor: small refactoring

* refactor: clean tests

* bugfix: make all filters not case sensitive

* chore: remove unused imports

---------

Co-authored-by: Sammy Teillet <sammy.teillet@gmail.com>
This commit is contained in:
Charles Bochet
2023-05-24 17:20:15 +02:00
committed by GitHub
parent 7192457d0a
commit 5d06398d2e
177 changed files with 12215 additions and 7040 deletions

View File

@ -0,0 +1,45 @@
import { Module } from '@nestjs/common';
import { TypeGraphQLModule } from 'typegraphql-nestjs';
import { ApolloDriver } from '@nestjs/apollo';
import { PrismaClient } from '@prisma/client';
import {
CompanyCrudResolver,
CompanyRelationsResolver,
UserCrudResolver,
UserRelationsResolver,
PersonCrudResolver,
PersonRelationsResolver,
WorkspaceCrudResolver,
WorkspaceRelationsResolver,
WorkspaceMemberRelationsResolver,
} from '@generated/type-graphql';
interface Context {
prisma: PrismaClient;
}
const prisma = new PrismaClient();
@Module({
imports: [
TypeGraphQLModule.forRoot({
driver: ApolloDriver,
path: '/',
validate: false,
context: (): Context => ({ prisma }),
}),
],
providers: [
CompanyCrudResolver,
CompanyRelationsResolver,
UserCrudResolver,
UserRelationsResolver,
PersonCrudResolver,
PersonRelationsResolver,
WorkspaceCrudResolver,
WorkspaceRelationsResolver,
WorkspaceMemberRelationsResolver,
],
})
export class ApiModule {}

View File

@ -0,0 +1,18 @@
import { GraphQLScalarType } from 'graphql';
const regex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
function validate(uuid: unknown): string | never {
if (typeof uuid !== 'string' || !regex.test(uuid)) {
throw new Error('invalid uuid');
}
return uuid;
}
export const CustomUuidScalar = new GraphQLScalarType({
name: 'uuid',
description: 'A simple UUID parser',
serialize: (value) => validate(value),
parseValue: (value) => validate(value),
parseLiteral: (ast) => validate(ast.kind === 'StringValue' ? ast.value : ''),
});

View File

@ -0,0 +1,30 @@
import { Field, GraphQLISODateTime, Int, ObjectType } from '@nestjs/graphql';
import { Company as CompanyDB } from '@prisma/client';
import { CustomUuidScalar } from '../graphql/uuid';
@ObjectType()
export class Company {
@Field(() => CustomUuidScalar)
id: CompanyDB[`id`];
@Field(() => GraphQLISODateTime)
createdAt: CompanyDB[`createdAt`];
@Field(() => GraphQLISODateTime)
updatedAt: CompanyDB[`updatedAt`];
@Field(() => GraphQLISODateTime, { nullable: true })
deletedAt: CompanyDB[`deletedAt`];
@Field(() => String)
name: CompanyDB[`name`];
@Field(() => String)
domainName: CompanyDB[`domainName`];
@Field(() => String)
address: CompanyDB[`address`];
@Field(() => Int)
employees: CompanyDB[`employees`];
}

View File

@ -0,0 +1,39 @@
import { Field, GraphQLISODateTime, ObjectType } from '@nestjs/graphql';
import { Person as PersonDB } from '@prisma/client';
import { Company } from './company.model';
@ObjectType()
export class Person {
@Field(() => String)
id: PersonDB[`id`];
@Field(() => GraphQLISODateTime)
createdAt: PersonDB[`createdAt`];
@Field(() => GraphQLISODateTime)
updatedAt: PersonDB[`updatedAt`];
@Field(() => GraphQLISODateTime, { nullable: true })
deletedAt: PersonDB[`deletedAt`];
@Field(() => String)
firstname: PersonDB[`firstname`];
@Field(() => String)
lastname: PersonDB[`lastname`];
@Field(() => String)
email: PersonDB[`email`];
@Field(() => String)
phone: PersonDB[`phone`];
@Field(() => String)
city: PersonDB[`city`];
@Field(() => String, { nullable: true })
companyId: PersonDB[`companyId`];
@Field(() => Company, { nullable: true })
company: Company;
}

View File

@ -0,0 +1,17 @@
import { Field, GraphQLISODateTime, ObjectType } from '@nestjs/graphql';
import { User as UserDB } from '@prisma/client';
@ObjectType()
export class User {
@Field(() => String)
id: UserDB[`id`];
@Field(() => GraphQLISODateTime)
createdAt: UserDB[`createdAt`];
@Field(() => GraphQLISODateTime)
updatedAt: UserDB[`updatedAt`];
@Field(() => GraphQLISODateTime, { nullable: true })
deletedAt: UserDB[`deletedAt`];
}

View File

@ -0,0 +1,17 @@
import { Field, GraphQLISODateTime, ObjectType } from '@nestjs/graphql';
import { Workspace as WorkspaceDB } from '@prisma/client';
@ObjectType()
export class Workspace {
@Field(() => String)
id: WorkspaceDB[`id`];
@Field(() => GraphQLISODateTime)
createdAt: WorkspaceDB[`createdAt`];
@Field(() => GraphQLISODateTime)
updatedAt: WorkspaceDB[`updatedAt`];
@Field(() => GraphQLISODateTime, { nullable: true })
deletedAt: WorkspaceDB[`deletedAt`];
}

View File

@ -0,0 +1,15 @@
import { Company } from '@generated/type-graphql';
import { PrismaService } from '../../database/prisma.service';
import { Resolver, Query } from 'type-graphql';
@Resolver(() => Company)
export class CompanyResolver {
constructor(private prisma: PrismaService) {}
@Query(() => [Company])
async getCompaniesOfSammy(): Promise<Company[] | null> {
return await this.prisma.company.findMany({
where: {},
});
}
}

View File

@ -0,0 +1,22 @@
import { Parent, Query, ResolveField, Resolver } from '@nestjs/graphql';
import { Person } from '../models/person.model';
import { PersonRepository } from 'src/entities/person/person.repository';
import { CompanyRepository } from 'src/entities/company/company.repository';
@Resolver(() => Person)
export class PersonResolver {
constructor(
private readonly personRepository: PersonRepository,
private readonly companyRepository: CompanyRepository,
) {}
@Query(() => [Person])
async getPeople() {
return this.personRepository.findMany({});
}
@ResolveField()
company(@Parent() person: Person) {
return this.companyRepository.findOne(person.companyId);
}
}

View File

@ -0,0 +1,14 @@
import { Parent, Query, ResolveField, Resolver } from '@nestjs/graphql';
import { User } from '../models/user.model';
import { WorkspaceRepository } from 'src/entities/workspace/workspace.repository';
import { Workspace } from '../models/workspace.model';
@Resolver(() => Workspace)
export class WorkspaceResolver {
constructor(private readonly workspaceRepository: WorkspaceRepository) {}
@Query(() => [Workspace])
async getWorkspaces() {
return this.workspaceRepository.findMany({});
}
}