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:
45
server/src/api/api.module.ts
Normal file
45
server/src/api/api.module.ts
Normal 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 {}
|
||||
18
server/src/api/graphql/uuid.ts
Normal file
18
server/src/api/graphql/uuid.ts
Normal 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 : ''),
|
||||
});
|
||||
30
server/src/api/models/company.model.ts
Normal file
30
server/src/api/models/company.model.ts
Normal 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`];
|
||||
}
|
||||
39
server/src/api/models/person.model.ts
Normal file
39
server/src/api/models/person.model.ts
Normal 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;
|
||||
}
|
||||
17
server/src/api/models/user.model.ts
Normal file
17
server/src/api/models/user.model.ts
Normal 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`];
|
||||
}
|
||||
17
server/src/api/models/workspace.model.ts
Normal file
17
server/src/api/models/workspace.model.ts
Normal 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`];
|
||||
}
|
||||
15
server/src/api/resolvers/company.resolver.ts
Normal file
15
server/src/api/resolvers/company.resolver.ts
Normal 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: {},
|
||||
});
|
||||
}
|
||||
}
|
||||
22
server/src/api/resolvers/person.resolver.ts
Normal file
22
server/src/api/resolvers/person.resolver.ts
Normal 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);
|
||||
}
|
||||
}
|
||||
0
server/src/api/resolvers/user.resolver.ts
Normal file
0
server/src/api/resolvers/user.resolver.ts
Normal file
14
server/src/api/resolvers/workspace.resolver.ts
Normal file
14
server/src/api/resolvers/workspace.resolver.ts
Normal 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({});
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user