feat: onboarding & profile edition (#507)

* feat: wip onboarding

* fix: generate graphql front

* wip: onboarding

* feat: login/register and edit profile

* fix: unused import

* fix: test

* Use DEBUG_MODE instead of STAGE and mute typescript depth exceed errors

* Fix seeds

* Fix onboarding when coming from google

* Fix

* Fix lint

* Fix ci

* Fix tests

---------

Co-authored-by: Charles Bochet <charles@twenty.com>
This commit is contained in:
Jérémy M
2023-07-07 02:05:15 +02:00
committed by GitHub
parent 0b7a023f3d
commit 1144bd13ed
141 changed files with 2660 additions and 962 deletions

View File

@ -12,13 +12,15 @@ export class UserCreateManyInput {
@Validator.IsOptional()
id?: string;
@Field(() => String, {nullable:false})
@Field(() => String, {nullable:true})
@Validator.IsString()
firstName!: string;
@Validator.IsOptional()
firstName?: string;
@Field(() => String, {nullable:false})
@Field(() => String, {nullable:true})
@Validator.IsString()
lastName!: string;
@Validator.IsOptional()
lastName?: string;
@Field(() => String, {nullable:false})
@Validator.IsEmail()

View File

@ -15,13 +15,15 @@ export class UserCreateWithoutCommentsInput {
@Validator.IsOptional()
id?: string;
@Field(() => String, {nullable:false})
@Field(() => String, {nullable:true})
@Validator.IsString()
firstName!: string;
@Validator.IsOptional()
firstName?: string;
@Field(() => String, {nullable:false})
@Field(() => String, {nullable:true})
@Validator.IsString()
lastName!: string;
@Validator.IsOptional()
lastName?: string;
@Field(() => String, {nullable:false})
@Validator.IsEmail()

View File

@ -15,13 +15,15 @@ export class UserCreateWithoutCompaniesInput {
@Validator.IsOptional()
id?: string;
@Field(() => String, {nullable:false})
@Field(() => String, {nullable:true})
@Validator.IsString()
firstName!: string;
@Validator.IsOptional()
firstName?: string;
@Field(() => String, {nullable:false})
@Field(() => String, {nullable:true})
@Validator.IsString()
lastName!: string;
@Validator.IsOptional()
lastName?: string;
@Field(() => String, {nullable:false})
@Validator.IsEmail()

View File

@ -15,13 +15,15 @@ export class UserCreateWithoutRefreshTokensInput {
@Validator.IsOptional()
id?: string;
@Field(() => String, {nullable:false})
@Field(() => String, {nullable:true})
@Validator.IsString()
firstName!: string;
@Validator.IsOptional()
firstName?: string;
@Field(() => String, {nullable:false})
@Field(() => String, {nullable:true})
@Validator.IsString()
lastName!: string;
@Validator.IsOptional()
lastName?: string;
@Field(() => String, {nullable:false})
@Validator.IsEmail()

View File

@ -15,13 +15,15 @@ export class UserCreateWithoutWorkspaceMemberInput {
@Validator.IsOptional()
id?: string;
@Field(() => String, {nullable:false})
@Field(() => String, {nullable:true})
@Validator.IsString()
firstName!: string;
@Validator.IsOptional()
firstName?: string;
@Field(() => String, {nullable:false})
@Field(() => String, {nullable:true})
@Validator.IsString()
lastName!: string;
@Validator.IsOptional()
lastName?: string;
@Field(() => String, {nullable:false})
@Validator.IsEmail()

View File

@ -16,13 +16,15 @@ export class UserCreateInput {
@Validator.IsOptional()
id?: string;
@Field(() => String, {nullable:false})
@Field(() => String, {nullable:true})
@Validator.IsString()
firstName!: string;
@Validator.IsOptional()
firstName?: string;
@Field(() => String, {nullable:false})
@Field(() => String, {nullable:true})
@Validator.IsString()
lastName!: string;
@Validator.IsOptional()
lastName?: string;
@Field(() => String, {nullable:false})
@Validator.IsEmail()

View File

@ -15,13 +15,15 @@ export class UserGroupBy {
@Validator.IsOptional()
id!: string;
@Field(() => String, {nullable:false})
@Field(() => String, {nullable:true})
@Validator.IsString()
firstName!: string;
@Validator.IsOptional()
firstName?: string;
@Field(() => String, {nullable:false})
@Field(() => String, {nullable:true})
@Validator.IsString()
lastName!: string;
@Validator.IsOptional()
lastName?: string;
@Field(() => String, {nullable:false})
@Validator.IsEmail()

View File

@ -13,10 +13,12 @@ export class UserMaxAggregate {
@Field(() => String, {nullable:true})
@Validator.IsString()
@Validator.IsOptional()
firstName?: string;
@Field(() => String, {nullable:true})
@Validator.IsString()
@Validator.IsOptional()
lastName?: string;
@Field(() => String, {nullable:true})

View File

@ -13,10 +13,12 @@ export class UserMinAggregate {
@Field(() => String, {nullable:true})
@Validator.IsString()
@Validator.IsOptional()
firstName?: string;
@Field(() => String, {nullable:true})
@Validator.IsString()
@Validator.IsOptional()
lastName?: string;
@Field(() => String, {nullable:true})

View File

@ -1,8 +1,8 @@
import { Field } from '@nestjs/graphql';
import { InputType } from '@nestjs/graphql';
import { StringWithAggregatesFilter } from '../prisma/string-with-aggregates-filter.input';
import { BoolWithAggregatesFilter } from '../prisma/bool-with-aggregates-filter.input';
import { StringNullableWithAggregatesFilter } from '../prisma/string-nullable-with-aggregates-filter.input';
import { BoolWithAggregatesFilter } from '../prisma/bool-with-aggregates-filter.input';
import { DateTimeNullableWithAggregatesFilter } from '../prisma/date-time-nullable-with-aggregates-filter.input';
import { HideField } from '@nestjs/graphql';
import { JsonNullableWithAggregatesFilter } from '../prisma/json-nullable-with-aggregates-filter.input';
@ -23,11 +23,11 @@ export class UserScalarWhereWithAggregatesInput {
@Field(() => StringWithAggregatesFilter, {nullable:true})
id?: StringWithAggregatesFilter;
@Field(() => StringWithAggregatesFilter, {nullable:true})
firstName?: StringWithAggregatesFilter;
@Field(() => StringNullableWithAggregatesFilter, {nullable:true})
firstName?: StringNullableWithAggregatesFilter;
@Field(() => StringWithAggregatesFilter, {nullable:true})
lastName?: StringWithAggregatesFilter;
@Field(() => StringNullableWithAggregatesFilter, {nullable:true})
lastName?: StringNullableWithAggregatesFilter;
@Field(() => StringWithAggregatesFilter, {nullable:true})
email?: StringWithAggregatesFilter;

View File

@ -15,13 +15,15 @@ export class UserUncheckedCreateWithoutCommentsInput {
@Validator.IsOptional()
id?: string;
@Field(() => String, {nullable:false})
@Field(() => String, {nullable:true})
@Validator.IsString()
firstName!: string;
@Validator.IsOptional()
firstName?: string;
@Field(() => String, {nullable:false})
@Field(() => String, {nullable:true})
@Validator.IsString()
lastName!: string;
@Validator.IsOptional()
lastName?: string;
@Field(() => String, {nullable:false})
@Validator.IsEmail()

View File

@ -15,13 +15,15 @@ export class UserUncheckedCreateWithoutCompaniesInput {
@Validator.IsOptional()
id?: string;
@Field(() => String, {nullable:false})
@Field(() => String, {nullable:true})
@Validator.IsString()
firstName!: string;
@Validator.IsOptional()
firstName?: string;
@Field(() => String, {nullable:false})
@Field(() => String, {nullable:true})
@Validator.IsString()
lastName!: string;
@Validator.IsOptional()
lastName?: string;
@Field(() => String, {nullable:false})
@Validator.IsEmail()

View File

@ -15,13 +15,15 @@ export class UserUncheckedCreateWithoutRefreshTokensInput {
@Validator.IsOptional()
id?: string;
@Field(() => String, {nullable:false})
@Field(() => String, {nullable:true})
@Validator.IsString()
firstName!: string;
@Validator.IsOptional()
firstName?: string;
@Field(() => String, {nullable:false})
@Field(() => String, {nullable:true})
@Validator.IsString()
lastName!: string;
@Validator.IsOptional()
lastName?: string;
@Field(() => String, {nullable:false})
@Validator.IsEmail()

View File

@ -15,13 +15,15 @@ export class UserUncheckedCreateWithoutWorkspaceMemberInput {
@Validator.IsOptional()
id?: string;
@Field(() => String, {nullable:false})
@Field(() => String, {nullable:true})
@Validator.IsString()
firstName!: string;
@Validator.IsOptional()
firstName?: string;
@Field(() => String, {nullable:false})
@Field(() => String, {nullable:true})
@Validator.IsString()
lastName!: string;
@Validator.IsOptional()
lastName?: string;
@Field(() => String, {nullable:false})
@Validator.IsEmail()

View File

@ -16,13 +16,15 @@ export class UserUncheckedCreateInput {
@Validator.IsOptional()
id?: string;
@Field(() => String, {nullable:false})
@Field(() => String, {nullable:true})
@Validator.IsString()
firstName!: string;
@Validator.IsOptional()
firstName?: string;
@Field(() => String, {nullable:false})
@Field(() => String, {nullable:true})
@Validator.IsString()
lastName!: string;
@Validator.IsOptional()
lastName?: string;
@Field(() => String, {nullable:false})
@Validator.IsEmail()

View File

@ -1,8 +1,8 @@
import { Field } from '@nestjs/graphql';
import { InputType } from '@nestjs/graphql';
import { StringFieldUpdateOperationsInput } from '../prisma/string-field-update-operations.input';
import { BoolFieldUpdateOperationsInput } from '../prisma/bool-field-update-operations.input';
import { NullableStringFieldUpdateOperationsInput } from '../prisma/nullable-string-field-update-operations.input';
import { BoolFieldUpdateOperationsInput } from '../prisma/bool-field-update-operations.input';
import { NullableDateTimeFieldUpdateOperationsInput } from '../prisma/nullable-date-time-field-update-operations.input';
import { HideField } from '@nestjs/graphql';
import { GraphQLJSON } from 'graphql-type-json';
@ -15,11 +15,11 @@ export class UserUncheckedUpdateManyInput {
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
id?: StringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
firstName?: StringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
firstName?: NullableStringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
lastName?: StringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
lastName?: NullableStringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
email?: StringFieldUpdateOperationsInput;

View File

@ -1,8 +1,8 @@
import { Field } from '@nestjs/graphql';
import { InputType } from '@nestjs/graphql';
import { StringFieldUpdateOperationsInput } from '../prisma/string-field-update-operations.input';
import { BoolFieldUpdateOperationsInput } from '../prisma/bool-field-update-operations.input';
import { NullableStringFieldUpdateOperationsInput } from '../prisma/nullable-string-field-update-operations.input';
import { BoolFieldUpdateOperationsInput } from '../prisma/bool-field-update-operations.input';
import { NullableDateTimeFieldUpdateOperationsInput } from '../prisma/nullable-date-time-field-update-operations.input';
import { HideField } from '@nestjs/graphql';
import { GraphQLJSON } from 'graphql-type-json';
@ -18,11 +18,11 @@ export class UserUncheckedUpdateWithoutCommentsInput {
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
id?: StringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
firstName?: StringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
firstName?: NullableStringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
lastName?: StringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
lastName?: NullableStringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
email?: StringFieldUpdateOperationsInput;

View File

@ -1,8 +1,8 @@
import { Field } from '@nestjs/graphql';
import { InputType } from '@nestjs/graphql';
import { StringFieldUpdateOperationsInput } from '../prisma/string-field-update-operations.input';
import { BoolFieldUpdateOperationsInput } from '../prisma/bool-field-update-operations.input';
import { NullableStringFieldUpdateOperationsInput } from '../prisma/nullable-string-field-update-operations.input';
import { BoolFieldUpdateOperationsInput } from '../prisma/bool-field-update-operations.input';
import { NullableDateTimeFieldUpdateOperationsInput } from '../prisma/nullable-date-time-field-update-operations.input';
import { HideField } from '@nestjs/graphql';
import { GraphQLJSON } from 'graphql-type-json';
@ -18,11 +18,11 @@ export class UserUncheckedUpdateWithoutCompaniesInput {
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
id?: StringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
firstName?: StringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
firstName?: NullableStringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
lastName?: StringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
lastName?: NullableStringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
email?: StringFieldUpdateOperationsInput;

View File

@ -1,8 +1,8 @@
import { Field } from '@nestjs/graphql';
import { InputType } from '@nestjs/graphql';
import { StringFieldUpdateOperationsInput } from '../prisma/string-field-update-operations.input';
import { BoolFieldUpdateOperationsInput } from '../prisma/bool-field-update-operations.input';
import { NullableStringFieldUpdateOperationsInput } from '../prisma/nullable-string-field-update-operations.input';
import { BoolFieldUpdateOperationsInput } from '../prisma/bool-field-update-operations.input';
import { NullableDateTimeFieldUpdateOperationsInput } from '../prisma/nullable-date-time-field-update-operations.input';
import { HideField } from '@nestjs/graphql';
import { GraphQLJSON } from 'graphql-type-json';
@ -18,11 +18,11 @@ export class UserUncheckedUpdateWithoutRefreshTokensInput {
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
id?: StringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
firstName?: StringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
firstName?: NullableStringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
lastName?: StringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
lastName?: NullableStringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
email?: StringFieldUpdateOperationsInput;

View File

@ -1,8 +1,8 @@
import { Field } from '@nestjs/graphql';
import { InputType } from '@nestjs/graphql';
import { StringFieldUpdateOperationsInput } from '../prisma/string-field-update-operations.input';
import { BoolFieldUpdateOperationsInput } from '../prisma/bool-field-update-operations.input';
import { NullableStringFieldUpdateOperationsInput } from '../prisma/nullable-string-field-update-operations.input';
import { BoolFieldUpdateOperationsInput } from '../prisma/bool-field-update-operations.input';
import { NullableDateTimeFieldUpdateOperationsInput } from '../prisma/nullable-date-time-field-update-operations.input';
import { HideField } from '@nestjs/graphql';
import { GraphQLJSON } from 'graphql-type-json';
@ -18,11 +18,11 @@ export class UserUncheckedUpdateWithoutWorkspaceMemberInput {
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
id?: StringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
firstName?: StringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
firstName?: NullableStringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
lastName?: StringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
lastName?: NullableStringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
email?: StringFieldUpdateOperationsInput;

View File

@ -1,8 +1,8 @@
import { Field } from '@nestjs/graphql';
import { InputType } from '@nestjs/graphql';
import { StringFieldUpdateOperationsInput } from '../prisma/string-field-update-operations.input';
import { BoolFieldUpdateOperationsInput } from '../prisma/bool-field-update-operations.input';
import { NullableStringFieldUpdateOperationsInput } from '../prisma/nullable-string-field-update-operations.input';
import { BoolFieldUpdateOperationsInput } from '../prisma/bool-field-update-operations.input';
import { NullableDateTimeFieldUpdateOperationsInput } from '../prisma/nullable-date-time-field-update-operations.input';
import { HideField } from '@nestjs/graphql';
import { GraphQLJSON } from 'graphql-type-json';
@ -19,11 +19,11 @@ export class UserUncheckedUpdateInput {
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
id?: StringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
firstName?: StringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
firstName?: NullableStringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
lastName?: StringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
lastName?: NullableStringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
email?: StringFieldUpdateOperationsInput;

View File

@ -1,8 +1,8 @@
import { Field } from '@nestjs/graphql';
import { InputType } from '@nestjs/graphql';
import { StringFieldUpdateOperationsInput } from '../prisma/string-field-update-operations.input';
import { BoolFieldUpdateOperationsInput } from '../prisma/bool-field-update-operations.input';
import { NullableStringFieldUpdateOperationsInput } from '../prisma/nullable-string-field-update-operations.input';
import { BoolFieldUpdateOperationsInput } from '../prisma/bool-field-update-operations.input';
import { NullableDateTimeFieldUpdateOperationsInput } from '../prisma/nullable-date-time-field-update-operations.input';
import { HideField } from '@nestjs/graphql';
import { GraphQLJSON } from 'graphql-type-json';
@ -15,11 +15,11 @@ export class UserUpdateManyMutationInput {
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
id?: StringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
firstName?: StringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
firstName?: NullableStringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
lastName?: StringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
lastName?: NullableStringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
email?: StringFieldUpdateOperationsInput;

View File

@ -1,8 +1,8 @@
import { Field } from '@nestjs/graphql';
import { InputType } from '@nestjs/graphql';
import { StringFieldUpdateOperationsInput } from '../prisma/string-field-update-operations.input';
import { BoolFieldUpdateOperationsInput } from '../prisma/bool-field-update-operations.input';
import { NullableStringFieldUpdateOperationsInput } from '../prisma/nullable-string-field-update-operations.input';
import { BoolFieldUpdateOperationsInput } from '../prisma/bool-field-update-operations.input';
import { NullableDateTimeFieldUpdateOperationsInput } from '../prisma/nullable-date-time-field-update-operations.input';
import { HideField } from '@nestjs/graphql';
import { GraphQLJSON } from 'graphql-type-json';
@ -18,11 +18,11 @@ export class UserUpdateWithoutCommentsInput {
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
id?: StringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
firstName?: StringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
firstName?: NullableStringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
lastName?: StringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
lastName?: NullableStringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
email?: StringFieldUpdateOperationsInput;

View File

@ -1,8 +1,8 @@
import { Field } from '@nestjs/graphql';
import { InputType } from '@nestjs/graphql';
import { StringFieldUpdateOperationsInput } from '../prisma/string-field-update-operations.input';
import { BoolFieldUpdateOperationsInput } from '../prisma/bool-field-update-operations.input';
import { NullableStringFieldUpdateOperationsInput } from '../prisma/nullable-string-field-update-operations.input';
import { BoolFieldUpdateOperationsInput } from '../prisma/bool-field-update-operations.input';
import { NullableDateTimeFieldUpdateOperationsInput } from '../prisma/nullable-date-time-field-update-operations.input';
import { HideField } from '@nestjs/graphql';
import { GraphQLJSON } from 'graphql-type-json';
@ -18,11 +18,11 @@ export class UserUpdateWithoutCompaniesInput {
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
id?: StringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
firstName?: StringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
firstName?: NullableStringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
lastName?: StringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
lastName?: NullableStringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
email?: StringFieldUpdateOperationsInput;

View File

@ -1,8 +1,8 @@
import { Field } from '@nestjs/graphql';
import { InputType } from '@nestjs/graphql';
import { StringFieldUpdateOperationsInput } from '../prisma/string-field-update-operations.input';
import { BoolFieldUpdateOperationsInput } from '../prisma/bool-field-update-operations.input';
import { NullableStringFieldUpdateOperationsInput } from '../prisma/nullable-string-field-update-operations.input';
import { BoolFieldUpdateOperationsInput } from '../prisma/bool-field-update-operations.input';
import { NullableDateTimeFieldUpdateOperationsInput } from '../prisma/nullable-date-time-field-update-operations.input';
import { HideField } from '@nestjs/graphql';
import { GraphQLJSON } from 'graphql-type-json';
@ -18,11 +18,11 @@ export class UserUpdateWithoutRefreshTokensInput {
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
id?: StringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
firstName?: StringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
firstName?: NullableStringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
lastName?: StringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
lastName?: NullableStringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
email?: StringFieldUpdateOperationsInput;

View File

@ -1,8 +1,8 @@
import { Field } from '@nestjs/graphql';
import { InputType } from '@nestjs/graphql';
import { StringFieldUpdateOperationsInput } from '../prisma/string-field-update-operations.input';
import { BoolFieldUpdateOperationsInput } from '../prisma/bool-field-update-operations.input';
import { NullableStringFieldUpdateOperationsInput } from '../prisma/nullable-string-field-update-operations.input';
import { BoolFieldUpdateOperationsInput } from '../prisma/bool-field-update-operations.input';
import { NullableDateTimeFieldUpdateOperationsInput } from '../prisma/nullable-date-time-field-update-operations.input';
import { HideField } from '@nestjs/graphql';
import { GraphQLJSON } from 'graphql-type-json';
@ -18,11 +18,11 @@ export class UserUpdateWithoutWorkspaceMemberInput {
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
id?: StringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
firstName?: StringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
firstName?: NullableStringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
lastName?: StringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
lastName?: NullableStringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
email?: StringFieldUpdateOperationsInput;

View File

@ -1,8 +1,8 @@
import { Field } from '@nestjs/graphql';
import { InputType } from '@nestjs/graphql';
import { StringFieldUpdateOperationsInput } from '../prisma/string-field-update-operations.input';
import { BoolFieldUpdateOperationsInput } from '../prisma/bool-field-update-operations.input';
import { NullableStringFieldUpdateOperationsInput } from '../prisma/nullable-string-field-update-operations.input';
import { BoolFieldUpdateOperationsInput } from '../prisma/bool-field-update-operations.input';
import { NullableDateTimeFieldUpdateOperationsInput } from '../prisma/nullable-date-time-field-update-operations.input';
import { HideField } from '@nestjs/graphql';
import { GraphQLJSON } from 'graphql-type-json';
@ -19,11 +19,11 @@ export class UserUpdateInput {
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
id?: StringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
firstName?: StringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
firstName?: NullableStringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
lastName?: StringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
lastName?: NullableStringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
email?: StringFieldUpdateOperationsInput;

View File

@ -1,8 +1,8 @@
import { Field } from '@nestjs/graphql';
import { InputType } from '@nestjs/graphql';
import { StringFilter } from '../prisma/string-filter.input';
import { BoolFilter } from '../prisma/bool-filter.input';
import { StringNullableFilter } from '../prisma/string-nullable-filter.input';
import { BoolFilter } from '../prisma/bool-filter.input';
import { DateTimeNullableFilter } from '../prisma/date-time-nullable-filter.input';
import { HideField } from '@nestjs/graphql';
import { JsonNullableFilter } from '../prisma/json-nullable-filter.input';
@ -27,11 +27,11 @@ export class UserWhereInput {
@Field(() => StringFilter, {nullable:true})
id?: StringFilter;
@Field(() => StringFilter, {nullable:true})
firstName?: StringFilter;
@Field(() => StringNullableFilter, {nullable:true})
firstName?: StringNullableFilter;
@Field(() => StringFilter, {nullable:true})
lastName?: StringFilter;
@Field(() => StringNullableFilter, {nullable:true})
lastName?: StringNullableFilter;
@Field(() => StringFilter, {nullable:true})
email?: StringFilter;

View File

@ -15,11 +15,11 @@ export class User {
@Field(() => ID, {nullable:false})
id!: string;
@Field(() => String, {nullable:false})
firstName!: string;
@Field(() => String, {nullable:true})
firstName!: string | null;
@Field(() => String, {nullable:false})
lastName!: string;
@Field(() => String, {nullable:true})
lastName!: string | null;
@Field(() => String, {nullable:false})
email!: string;

View File

@ -11,13 +11,15 @@ export class WorkspaceCreateManyInput {
@Validator.IsOptional()
id?: string;
@Field(() => String, {nullable:false})
@Field(() => String, {nullable:true})
@Validator.IsString()
domainName!: string;
@Validator.IsOptional()
domainName?: string;
@Field(() => String, {nullable:false})
@Field(() => String, {nullable:true})
@Validator.IsString()
displayName!: string;
@Validator.IsOptional()
displayName?: string;
@Field(() => String, {nullable:true})
@Validator.IsString()

View File

@ -18,13 +18,15 @@ export class WorkspaceCreateWithoutCommentThreadsInput {
@Validator.IsOptional()
id?: string;
@Field(() => String, {nullable:false})
@Field(() => String, {nullable:true})
@Validator.IsString()
domainName!: string;
@Validator.IsOptional()
domainName?: string;
@Field(() => String, {nullable:false})
@Field(() => String, {nullable:true})
@Validator.IsString()
displayName!: string;
@Validator.IsOptional()
displayName?: string;
@Field(() => String, {nullable:true})
@Validator.IsString()

View File

@ -18,13 +18,15 @@ export class WorkspaceCreateWithoutCommentsInput {
@Validator.IsOptional()
id?: string;
@Field(() => String, {nullable:false})
@Field(() => String, {nullable:true})
@Validator.IsString()
domainName!: string;
@Validator.IsOptional()
domainName?: string;
@Field(() => String, {nullable:false})
@Field(() => String, {nullable:true})
@Validator.IsString()
displayName!: string;
@Validator.IsOptional()
displayName?: string;
@Field(() => String, {nullable:true})
@Validator.IsString()

View File

@ -18,13 +18,15 @@ export class WorkspaceCreateWithoutCompaniesInput {
@Validator.IsOptional()
id?: string;
@Field(() => String, {nullable:false})
@Field(() => String, {nullable:true})
@Validator.IsString()
domainName!: string;
@Validator.IsOptional()
domainName?: string;
@Field(() => String, {nullable:false})
@Field(() => String, {nullable:true})
@Validator.IsString()
displayName!: string;
@Validator.IsOptional()
displayName?: string;
@Field(() => String, {nullable:true})
@Validator.IsString()

View File

@ -18,13 +18,15 @@ export class WorkspaceCreateWithoutPeopleInput {
@Validator.IsOptional()
id?: string;
@Field(() => String, {nullable:false})
@Field(() => String, {nullable:true})
@Validator.IsString()
domainName!: string;
@Validator.IsOptional()
domainName?: string;
@Field(() => String, {nullable:false})
@Field(() => String, {nullable:true})
@Validator.IsString()
displayName!: string;
@Validator.IsOptional()
displayName?: string;
@Field(() => String, {nullable:true})
@Validator.IsString()

View File

@ -18,13 +18,15 @@ export class WorkspaceCreateWithoutPipelineProgressesInput {
@Validator.IsOptional()
id?: string;
@Field(() => String, {nullable:false})
@Field(() => String, {nullable:true})
@Validator.IsString()
domainName!: string;
@Validator.IsOptional()
domainName?: string;
@Field(() => String, {nullable:false})
@Field(() => String, {nullable:true})
@Validator.IsString()
displayName!: string;
@Validator.IsOptional()
displayName?: string;
@Field(() => String, {nullable:true})
@Validator.IsString()

View File

@ -18,13 +18,15 @@ export class WorkspaceCreateWithoutPipelineStagesInput {
@Validator.IsOptional()
id?: string;
@Field(() => String, {nullable:false})
@Field(() => String, {nullable:true})
@Validator.IsString()
domainName!: string;
@Validator.IsOptional()
domainName?: string;
@Field(() => String, {nullable:false})
@Field(() => String, {nullable:true})
@Validator.IsString()
displayName!: string;
@Validator.IsOptional()
displayName?: string;
@Field(() => String, {nullable:true})
@Validator.IsString()

View File

@ -18,13 +18,15 @@ export class WorkspaceCreateWithoutPipelinesInput {
@Validator.IsOptional()
id?: string;
@Field(() => String, {nullable:false})
@Field(() => String, {nullable:true})
@Validator.IsString()
domainName!: string;
@Validator.IsOptional()
domainName?: string;
@Field(() => String, {nullable:false})
@Field(() => String, {nullable:true})
@Validator.IsString()
displayName!: string;
@Validator.IsOptional()
displayName?: string;
@Field(() => String, {nullable:true})
@Validator.IsString()

View File

@ -18,13 +18,15 @@ export class WorkspaceCreateWithoutWorkspaceMemberInput {
@Validator.IsOptional()
id?: string;
@Field(() => String, {nullable:false})
@Field(() => String, {nullable:true})
@Validator.IsString()
domainName!: string;
@Validator.IsOptional()
domainName?: string;
@Field(() => String, {nullable:false})
@Field(() => String, {nullable:true})
@Validator.IsString()
displayName!: string;
@Validator.IsOptional()
displayName?: string;
@Field(() => String, {nullable:true})
@Validator.IsString()

View File

@ -19,13 +19,15 @@ export class WorkspaceCreateInput {
@Validator.IsOptional()
id?: string;
@Field(() => String, {nullable:false})
@Field(() => String, {nullable:true})
@Validator.IsString()
domainName!: string;
@Validator.IsOptional()
domainName?: string;
@Field(() => String, {nullable:false})
@Field(() => String, {nullable:true})
@Validator.IsString()
displayName!: string;
@Validator.IsOptional()
displayName?: string;
@Field(() => String, {nullable:true})
@Validator.IsString()

View File

@ -14,13 +14,15 @@ export class WorkspaceGroupBy {
@Validator.IsOptional()
id!: string;
@Field(() => String, {nullable:false})
@Field(() => String, {nullable:true})
@Validator.IsString()
domainName!: string;
@Validator.IsOptional()
domainName?: string;
@Field(() => String, {nullable:false})
@Field(() => String, {nullable:true})
@Validator.IsString()
displayName!: string;
@Validator.IsOptional()
displayName?: string;
@Field(() => String, {nullable:true})
@Validator.IsString()

View File

@ -13,10 +13,12 @@ export class WorkspaceMaxAggregate {
@Field(() => String, {nullable:true})
@Validator.IsString()
@Validator.IsOptional()
domainName?: string;
@Field(() => String, {nullable:true})
@Validator.IsString()
@Validator.IsOptional()
displayName?: string;
@Field(() => String, {nullable:true})

View File

@ -13,10 +13,12 @@ export class WorkspaceMinAggregate {
@Field(() => String, {nullable:true})
@Validator.IsString()
@Validator.IsOptional()
domainName?: string;
@Field(() => String, {nullable:true})
@Validator.IsString()
@Validator.IsOptional()
displayName?: string;
@Field(() => String, {nullable:true})

View File

@ -21,11 +21,11 @@ export class WorkspaceScalarWhereWithAggregatesInput {
@Field(() => StringWithAggregatesFilter, {nullable:true})
id?: StringWithAggregatesFilter;
@Field(() => StringWithAggregatesFilter, {nullable:true})
domainName?: StringWithAggregatesFilter;
@Field(() => StringNullableWithAggregatesFilter, {nullable:true})
domainName?: StringNullableWithAggregatesFilter;
@Field(() => StringWithAggregatesFilter, {nullable:true})
displayName?: StringWithAggregatesFilter;
@Field(() => StringNullableWithAggregatesFilter, {nullable:true})
displayName?: StringNullableWithAggregatesFilter;
@Field(() => StringNullableWithAggregatesFilter, {nullable:true})
logo?: StringNullableWithAggregatesFilter;

View File

@ -18,13 +18,15 @@ export class WorkspaceUncheckedCreateWithoutCommentThreadsInput {
@Validator.IsOptional()
id?: string;
@Field(() => String, {nullable:false})
@Field(() => String, {nullable:true})
@Validator.IsString()
domainName!: string;
@Validator.IsOptional()
domainName?: string;
@Field(() => String, {nullable:false})
@Field(() => String, {nullable:true})
@Validator.IsString()
displayName!: string;
@Validator.IsOptional()
displayName?: string;
@Field(() => String, {nullable:true})
@Validator.IsString()

View File

@ -18,13 +18,15 @@ export class WorkspaceUncheckedCreateWithoutCommentsInput {
@Validator.IsOptional()
id?: string;
@Field(() => String, {nullable:false})
@Field(() => String, {nullable:true})
@Validator.IsString()
domainName!: string;
@Validator.IsOptional()
domainName?: string;
@Field(() => String, {nullable:false})
@Field(() => String, {nullable:true})
@Validator.IsString()
displayName!: string;
@Validator.IsOptional()
displayName?: string;
@Field(() => String, {nullable:true})
@Validator.IsString()

View File

@ -18,13 +18,15 @@ export class WorkspaceUncheckedCreateWithoutCompaniesInput {
@Validator.IsOptional()
id?: string;
@Field(() => String, {nullable:false})
@Field(() => String, {nullable:true})
@Validator.IsString()
domainName!: string;
@Validator.IsOptional()
domainName?: string;
@Field(() => String, {nullable:false})
@Field(() => String, {nullable:true})
@Validator.IsString()
displayName!: string;
@Validator.IsOptional()
displayName?: string;
@Field(() => String, {nullable:true})
@Validator.IsString()

View File

@ -18,13 +18,15 @@ export class WorkspaceUncheckedCreateWithoutPeopleInput {
@Validator.IsOptional()
id?: string;
@Field(() => String, {nullable:false})
@Field(() => String, {nullable:true})
@Validator.IsString()
domainName!: string;
@Validator.IsOptional()
domainName?: string;
@Field(() => String, {nullable:false})
@Field(() => String, {nullable:true})
@Validator.IsString()
displayName!: string;
@Validator.IsOptional()
displayName?: string;
@Field(() => String, {nullable:true})
@Validator.IsString()

View File

@ -18,13 +18,15 @@ export class WorkspaceUncheckedCreateWithoutPipelineProgressesInput {
@Validator.IsOptional()
id?: string;
@Field(() => String, {nullable:false})
@Field(() => String, {nullable:true})
@Validator.IsString()
domainName!: string;
@Validator.IsOptional()
domainName?: string;
@Field(() => String, {nullable:false})
@Field(() => String, {nullable:true})
@Validator.IsString()
displayName!: string;
@Validator.IsOptional()
displayName?: string;
@Field(() => String, {nullable:true})
@Validator.IsString()

View File

@ -18,13 +18,15 @@ export class WorkspaceUncheckedCreateWithoutPipelineStagesInput {
@Validator.IsOptional()
id?: string;
@Field(() => String, {nullable:false})
@Field(() => String, {nullable:true})
@Validator.IsString()
domainName!: string;
@Validator.IsOptional()
domainName?: string;
@Field(() => String, {nullable:false})
@Field(() => String, {nullable:true})
@Validator.IsString()
displayName!: string;
@Validator.IsOptional()
displayName?: string;
@Field(() => String, {nullable:true})
@Validator.IsString()

View File

@ -18,13 +18,15 @@ export class WorkspaceUncheckedCreateWithoutPipelinesInput {
@Validator.IsOptional()
id?: string;
@Field(() => String, {nullable:false})
@Field(() => String, {nullable:true})
@Validator.IsString()
domainName!: string;
@Validator.IsOptional()
domainName?: string;
@Field(() => String, {nullable:false})
@Field(() => String, {nullable:true})
@Validator.IsString()
displayName!: string;
@Validator.IsOptional()
displayName?: string;
@Field(() => String, {nullable:true})
@Validator.IsString()

View File

@ -18,13 +18,15 @@ export class WorkspaceUncheckedCreateWithoutWorkspaceMemberInput {
@Validator.IsOptional()
id?: string;
@Field(() => String, {nullable:false})
@Field(() => String, {nullable:true})
@Validator.IsString()
domainName!: string;
@Validator.IsOptional()
domainName?: string;
@Field(() => String, {nullable:false})
@Field(() => String, {nullable:true})
@Validator.IsString()
displayName!: string;
@Validator.IsOptional()
displayName?: string;
@Field(() => String, {nullable:true})
@Validator.IsString()

View File

@ -19,13 +19,15 @@ export class WorkspaceUncheckedCreateInput {
@Validator.IsOptional()
id?: string;
@Field(() => String, {nullable:false})
@Field(() => String, {nullable:true})
@Validator.IsString()
domainName!: string;
@Validator.IsOptional()
domainName?: string;
@Field(() => String, {nullable:false})
@Field(() => String, {nullable:true})
@Validator.IsString()
displayName!: string;
@Validator.IsOptional()
displayName?: string;
@Field(() => String, {nullable:true})
@Validator.IsString()

View File

@ -12,11 +12,11 @@ export class WorkspaceUncheckedUpdateManyInput {
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
id?: StringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
domainName?: StringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
domainName?: NullableStringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
displayName?: StringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
displayName?: NullableStringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
logo?: NullableStringFieldUpdateOperationsInput;

View File

@ -19,11 +19,11 @@ export class WorkspaceUncheckedUpdateWithoutCommentThreadsInput {
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
id?: StringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
domainName?: StringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
domainName?: NullableStringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
displayName?: StringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
displayName?: NullableStringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
logo?: NullableStringFieldUpdateOperationsInput;

View File

@ -19,11 +19,11 @@ export class WorkspaceUncheckedUpdateWithoutCommentsInput {
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
id?: StringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
domainName?: StringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
domainName?: NullableStringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
displayName?: StringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
displayName?: NullableStringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
logo?: NullableStringFieldUpdateOperationsInput;

View File

@ -19,11 +19,11 @@ export class WorkspaceUncheckedUpdateWithoutCompaniesInput {
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
id?: StringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
domainName?: StringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
domainName?: NullableStringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
displayName?: StringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
displayName?: NullableStringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
logo?: NullableStringFieldUpdateOperationsInput;

View File

@ -19,11 +19,11 @@ export class WorkspaceUncheckedUpdateWithoutPeopleInput {
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
id?: StringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
domainName?: StringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
domainName?: NullableStringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
displayName?: StringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
displayName?: NullableStringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
logo?: NullableStringFieldUpdateOperationsInput;

View File

@ -19,11 +19,11 @@ export class WorkspaceUncheckedUpdateWithoutPipelineProgressesInput {
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
id?: StringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
domainName?: StringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
domainName?: NullableStringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
displayName?: StringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
displayName?: NullableStringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
logo?: NullableStringFieldUpdateOperationsInput;

View File

@ -19,11 +19,11 @@ export class WorkspaceUncheckedUpdateWithoutPipelineStagesInput {
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
id?: StringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
domainName?: StringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
domainName?: NullableStringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
displayName?: StringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
displayName?: NullableStringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
logo?: NullableStringFieldUpdateOperationsInput;

View File

@ -19,11 +19,11 @@ export class WorkspaceUncheckedUpdateWithoutPipelinesInput {
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
id?: StringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
domainName?: StringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
domainName?: NullableStringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
displayName?: StringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
displayName?: NullableStringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
logo?: NullableStringFieldUpdateOperationsInput;

View File

@ -19,11 +19,11 @@ export class WorkspaceUncheckedUpdateWithoutWorkspaceMemberInput {
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
id?: StringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
domainName?: StringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
domainName?: NullableStringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
displayName?: StringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
displayName?: NullableStringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
logo?: NullableStringFieldUpdateOperationsInput;

View File

@ -20,11 +20,11 @@ export class WorkspaceUncheckedUpdateInput {
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
id?: StringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
domainName?: StringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
domainName?: NullableStringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
displayName?: StringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
displayName?: NullableStringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
logo?: NullableStringFieldUpdateOperationsInput;

View File

@ -12,11 +12,11 @@ export class WorkspaceUpdateManyMutationInput {
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
id?: StringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
domainName?: StringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
domainName?: NullableStringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
displayName?: StringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
displayName?: NullableStringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
logo?: NullableStringFieldUpdateOperationsInput;

View File

@ -19,11 +19,11 @@ export class WorkspaceUpdateWithoutCommentThreadsInput {
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
id?: StringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
domainName?: StringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
domainName?: NullableStringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
displayName?: StringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
displayName?: NullableStringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
logo?: NullableStringFieldUpdateOperationsInput;

View File

@ -19,11 +19,11 @@ export class WorkspaceUpdateWithoutCommentsInput {
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
id?: StringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
domainName?: StringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
domainName?: NullableStringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
displayName?: StringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
displayName?: NullableStringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
logo?: NullableStringFieldUpdateOperationsInput;

View File

@ -19,11 +19,11 @@ export class WorkspaceUpdateWithoutCompaniesInput {
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
id?: StringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
domainName?: StringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
domainName?: NullableStringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
displayName?: StringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
displayName?: NullableStringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
logo?: NullableStringFieldUpdateOperationsInput;

View File

@ -19,11 +19,11 @@ export class WorkspaceUpdateWithoutPeopleInput {
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
id?: StringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
domainName?: StringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
domainName?: NullableStringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
displayName?: StringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
displayName?: NullableStringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
logo?: NullableStringFieldUpdateOperationsInput;

View File

@ -19,11 +19,11 @@ export class WorkspaceUpdateWithoutPipelineProgressesInput {
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
id?: StringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
domainName?: StringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
domainName?: NullableStringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
displayName?: StringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
displayName?: NullableStringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
logo?: NullableStringFieldUpdateOperationsInput;

View File

@ -19,11 +19,11 @@ export class WorkspaceUpdateWithoutPipelineStagesInput {
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
id?: StringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
domainName?: StringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
domainName?: NullableStringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
displayName?: StringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
displayName?: NullableStringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
logo?: NullableStringFieldUpdateOperationsInput;

View File

@ -19,11 +19,11 @@ export class WorkspaceUpdateWithoutPipelinesInput {
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
id?: StringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
domainName?: StringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
domainName?: NullableStringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
displayName?: StringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
displayName?: NullableStringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
logo?: NullableStringFieldUpdateOperationsInput;

View File

@ -19,11 +19,11 @@ export class WorkspaceUpdateWithoutWorkspaceMemberInput {
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
id?: StringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
domainName?: StringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
domainName?: NullableStringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
displayName?: StringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
displayName?: NullableStringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
logo?: NullableStringFieldUpdateOperationsInput;

View File

@ -20,11 +20,11 @@ export class WorkspaceUpdateInput {
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
id?: StringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
domainName?: StringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
domainName?: NullableStringFieldUpdateOperationsInput;
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
displayName?: StringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
displayName?: NullableStringFieldUpdateOperationsInput;
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
logo?: NullableStringFieldUpdateOperationsInput;

View File

@ -9,8 +9,4 @@ export class WorkspaceWhereUniqueInput {
@Validator.IsString()
@Validator.IsOptional()
id?: string;
@Field(() => String, {nullable:true})
@Validator.IsString()
domainName?: string;
}

View File

@ -29,11 +29,11 @@ export class WorkspaceWhereInput {
@Field(() => StringFilter, {nullable:true})
id?: StringFilter;
@Field(() => StringFilter, {nullable:true})
domainName?: StringFilter;
@Field(() => StringNullableFilter, {nullable:true})
domainName?: StringNullableFilter;
@Field(() => StringFilter, {nullable:true})
displayName?: StringFilter;
@Field(() => StringNullableFilter, {nullable:true})
displayName?: StringNullableFilter;
@Field(() => StringNullableFilter, {nullable:true})
logo?: StringNullableFilter;

View File

@ -18,11 +18,11 @@ export class Workspace {
@Field(() => ID, {nullable:false})
id!: string;
@Field(() => String, {nullable:false})
domainName!: string;
@Field(() => String, {nullable:true})
domainName!: string | null;
@Field(() => String, {nullable:false})
displayName!: string;
@Field(() => String, {nullable:true})
displayName!: string | null;
@Field(() => String, {nullable:true})
logo!: string | null;

View File

@ -1,5 +1,5 @@
import { Args, Mutation, Resolver, Query} from '@nestjs/graphql';
import { AuthTokens, ClientConfig} from './dto/token.entity';
import { Args, Mutation, Resolver, Query } from '@nestjs/graphql';
import { AuthTokens, ClientConfig } from './dto/token.entity';
import { TokenService } from './services/token.service';
import { RefreshTokenInput } from './dto/refresh-token.input';
import { BadRequestException } from '@nestjs/common';
@ -74,4 +74,4 @@ export class AuthResolver {
return Promise.resolve(clientConfig);
}
}
}

View File

@ -1,5 +1,12 @@
import { ArgsType, Field } from '@nestjs/graphql';
import { IsEmail, IsNotEmpty, IsString } from 'class-validator';
import {
IsEmail,
IsNotEmpty,
IsString,
Matches,
MinLength,
} from 'class-validator';
import { PASSWORD_REGEX } from '../auth.util';
@ArgsType()
export class ChallengeInput {
@ -11,5 +18,7 @@ export class ChallengeInput {
@Field(() => String)
@IsNotEmpty()
@IsString()
@MinLength(8)
@Matches(PASSWORD_REGEX, { message: 'password too weak' })
password: string;
}

View File

@ -1,43 +0,0 @@
import {
IsEmail,
IsNotEmpty,
IsOptional,
IsString,
Matches,
MinLength,
} from 'class-validator';
import { PASSWORD_REGEX } from '../auth.util';
import { ArgsType, Field } from '@nestjs/graphql';
@ArgsType()
export class RegisterInput {
@Field(() => String)
@IsNotEmpty()
@IsEmail()
email: string;
@Field(() => String)
@IsNotEmpty()
@IsString()
@MinLength(8)
@Matches(PASSWORD_REGEX, { message: 'password too weak' })
password: string;
@Field(() => String, {
deprecationReason: 'Deprecated, please use firstName and lastName instead',
nullable: true,
})
@IsOptional()
@IsString()
displayName?: string;
@Field(() => String)
@IsNotEmpty()
@IsString()
firstName: string;
@Field(() => String)
@IsNotEmpty()
@IsString()
lastName: string;
}

View File

@ -31,4 +31,4 @@ export class ClientConfig {
@Field(() => Boolean)
prefill_login_with_seed: boolean;
}
}

View File

@ -7,7 +7,6 @@ import {
import { ChallengeInput } from '../dto/challenge.input';
import { UserService } from 'src/core/user/user.service';
import { assert } from 'src/utils/assert';
import { RegisterInput } from '../dto/register.input';
import { PASSWORD_REGEX, compareHash, hashPassword } from '../auth.util';
import { Verify } from '../dto/verify.entity';
import { TokenService } from './token.service';
@ -26,42 +25,31 @@ export class AuthService {
private readonly userService: UserService,
) {}
async register(registerInput: RegisterInput) {
const existingUser = await this.userService.findUnique({
where: {
email: registerInput.email,
},
});
assert(!existingUser, 'This user already exist', NotFoundException);
async challenge(challengeInput: ChallengeInput) {
assert(
PASSWORD_REGEX.test(registerInput.password),
PASSWORD_REGEX.test(challengeInput.password),
'Password too weak',
BadRequestException,
);
const passwordHash = await hashPassword(registerInput.password);
const user = await this.userService.createUser({
data: {
firstName: registerInput.firstName,
lastName: registerInput.lastName,
email: registerInput.email,
passwordHash,
locale: 'en',
},
});
return user;
}
async challenge(challengeInput: ChallengeInput) {
const user = await this.userService.findUnique({
let user = await this.userService.findUnique({
where: {
email: challengeInput.email,
},
});
if (!user) {
const passwordHash = await hashPassword(challengeInput.password);
user = await this.userService.createUser({
data: {
email: challengeInput.email,
passwordHash,
locale: 'en',
},
} as Prisma.UserCreateArgs);
}
assert(user, "This user doesn't exist", NotFoundException);
assert(user.passwordHash, 'Incorrect login method', ForbiddenException);

View File

@ -9,7 +9,6 @@ import { CreateOneCommentThreadGuard } from '../../../guards/create-one-comment-
import { FindManyCommentThreadArgs } from '../../../core/@generated/comment-thread/find-many-comment-thread.args';
import { CommentThreadService } from '../services/comment-thread.service';
import { UpdateOneCommentThreadArgs } from 'src/core/@generated/comment-thread/update-one-comment-thread.args';
import { Prisma } from '@prisma/client';
import {
PrismaSelector,
PrismaSelect,
@ -27,6 +26,7 @@ import { AppAbility } from 'src/ability/ability.factory';
import { accessibleBy } from '@casl/prisma';
import { AffectedRows } from 'src/core/@generated/prisma/affected-rows.output';
import { DeleteManyCommentThreadArgs } from 'src/core/@generated/comment-thread/delete-many-comment-thread.args';
import { Prisma } from '@prisma/client';
@UseGuards(JwtAuthGuard)
@Resolver(() => CommentThread)
@ -75,7 +75,8 @@ export class CommentThreadResolver {
prismaSelect: PrismaSelect<'CommentThread'>,
): Promise<Partial<CommentThread>> {
const updatedCommentThread = await this.commentThreadService.update({
...args,
where: args.where,
data: args.data,
select: prismaSelect.value,
} as Prisma.CommentThreadUpdateArgs);
@ -92,11 +93,15 @@ export class CommentThreadResolver {
prismaSelect: PrismaSelect<'CommentThread'>,
): Promise<Partial<CommentThread>[]> {
const result = await this.commentThreadService.findMany({
...args,
where: {
...args.where,
AND: [accessibleBy(ability).CommentThread],
},
orderBy: args.orderBy,
cursor: args.cursor,
take: args.take,
skip: args.skip,
distinct: args.distinct,
select: prismaSelect.value,
});
@ -112,7 +117,7 @@ export class CommentThreadResolver {
@Args() args: DeleteManyCommentThreadArgs,
): Promise<AffectedRows> {
return this.commentThreadService.deleteMany({
...args,
where: args.where,
});
}
}

View File

@ -6,7 +6,6 @@ import { AuthWorkspace } from '../../../decorators/auth-workspace.decorator';
import { CreateOneCommentArgs } from '../../../core/@generated/comment/create-one-comment.args';
import { Comment } from '../../../core/@generated/comment/comment.model';
import { CreateOneCommentGuard } from '../../../guards/create-one-comment.guard';
import { Prisma } from '@prisma/client';
import { CommentService } from '../services/comment.service';
import {
PrismaSelector,
@ -17,6 +16,7 @@ import { CheckAbilities } from 'src/decorators/check-abilities.decorator';
import { CreateCommentAbilityHandler } from 'src/ability/handlers/comment.ability-handler';
import { AuthUser } from 'src/decorators/auth-user.decorator';
import { User } from 'src/core/@generated/user/user.model';
import { Prisma } from '@prisma/client';
@UseGuards(JwtAuthGuard)
@Resolver(() => Comment)

View File

@ -8,8 +8,7 @@ import { UpdateOneCompanyArgs } from '../../core/@generated/company/update-one-c
import { CreateOneCompanyArgs } from '../../core/@generated/company/create-one-company.args';
import { AffectedRows } from '../../core/@generated/prisma/affected-rows.output';
import { DeleteManyCompanyArgs } from '../../core/@generated/company/delete-many-company.args';
import { Workspace } from '@prisma/client';
import { Prisma } from '@prisma/client';
import { Prisma, Workspace } from '@prisma/client';
import { UpdateOneGuard } from '../../guards/update-one.guard';
import { DeleteManyGuard } from '../../guards/delete-many.guard';
import { CreateOneGuard } from '../../guards/create-one.guard';
@ -45,12 +44,16 @@ export class CompanyResolver {
prismaSelect: PrismaSelect<'Company'>,
): Promise<Partial<Company>[]> {
return this.companyService.findMany({
...args,
where: args.where
? {
AND: [args.where, accessibleBy(ability).Company],
}
: accessibleBy(ability).Company,
orderBy: args.orderBy,
cursor: args.cursor,
take: args.take,
skip: args.skip,
distinct: args.distinct,
select: prismaSelect.value,
});
}
@ -71,7 +74,8 @@ export class CompanyResolver {
}
return this.companyService.update({
...args,
where: args.where,
data: args.data,
select: prismaSelect.value,
} as Prisma.CompanyUpdateArgs);
}
@ -86,7 +90,7 @@ export class CompanyResolver {
@Args() args: DeleteManyCompanyArgs,
): Promise<AffectedRows> {
return this.companyService.deleteMany({
...args,
where: args.where,
});
}

View File

@ -9,7 +9,6 @@ import { AffectedRows } from '../../core/@generated/prisma/affected-rows.output'
import { DeleteManyPersonArgs } from '../../core/@generated/person/delete-many-person.args';
import { Workspace } from '../../core/@generated/workspace/workspace.model';
import { AuthWorkspace } from '../../decorators/auth-workspace.decorator';
import { Prisma } from '@prisma/client';
import { UpdateOneGuard } from '../../guards/update-one.guard';
import { DeleteManyGuard } from '../../guards/delete-many.guard';
import { CreateOneGuard } from '../../guards/create-one.guard';
@ -29,6 +28,7 @@ import {
import { UserAbility } from 'src/decorators/user-ability.decorator';
import { AppAbility } from 'src/ability/ability.factory';
import { accessibleBy } from '@casl/prisma';
import { Prisma } from '@prisma/client';
@UseGuards(JwtAuthGuard)
@Resolver(() => Person)
@ -47,12 +47,16 @@ export class PersonResolver {
prismaSelect: PrismaSelect<'Person'>,
): Promise<Partial<Person>[]> {
return this.personService.findMany({
...args,
where: args.where
? {
AND: [args.where, accessibleBy(ability).Person],
}
: accessibleBy(ability).Person,
orderBy: args.orderBy,
cursor: args.cursor,
take: args.take,
skip: args.skip,
distinct: args.distinct,
select: prismaSelect.value,
});
}
@ -73,7 +77,8 @@ export class PersonResolver {
}
return this.personService.update({
...args,
where: args.where,
data: args.data,
select: prismaSelect.value,
} as Prisma.PersonUpdateArgs);
}
@ -88,7 +93,7 @@ export class PersonResolver {
@Args() args: DeleteManyPersonArgs,
): Promise<AffectedRows> {
return this.personService.deleteMany({
...args,
where: args.where,
});
}

View File

@ -7,7 +7,6 @@ import { AuthWorkspace } from '../../../decorators/auth-workspace.decorator';
import { FindManyPipelineProgressArgs } from '../../@generated/pipeline-progress/find-many-pipeline-progress.args';
import { PipelineProgress } from '../../@generated/pipeline-progress/pipeline-progress.model';
import { UpdateOnePipelineProgressArgs } from '../../@generated/pipeline-progress/update-one-pipeline-progress.args';
import { Prisma } from '@prisma/client';
import { AffectedRows } from '../../@generated/prisma/affected-rows.output';
import { DeleteManyPipelineProgressArgs } from '../../@generated/pipeline-progress/delete-many-pipeline-progress.args';
import { CreateOnePipelineProgressArgs } from '../../@generated/pipeline-progress/create-one-pipeline-progress.args';
@ -26,6 +25,7 @@ import {
PrismaSelector,
PrismaSelect,
} from 'src/decorators/prisma-select.decorator';
import { Prisma } from '@prisma/client';
@UseGuards(JwtAuthGuard)
@Resolver(() => PipelineProgress)
@ -40,14 +40,21 @@ export class PipelineProgressResolver {
async findManyPipelineProgress(
@Args() args: FindManyPipelineProgressArgs,
@UserAbility() ability: AppAbility,
@PrismaSelector({ modelName: 'PipelineProgress' })
prismaSelect: PrismaSelect<'PipelineProgress'>,
): Promise<Partial<PipelineProgress>[]> {
return this.pipelineProgressService.findMany({
...args,
where: args.where
? {
AND: [args.where, accessibleBy(ability).PipelineProgress],
}
: accessibleBy(ability).PipelineProgress,
orderBy: args.orderBy,
cursor: args.cursor,
take: args.take,
skip: args.skip,
distinct: args.distinct,
select: prismaSelect.value,
});
}
@ -62,7 +69,8 @@ export class PipelineProgressResolver {
prismaSelect: PrismaSelect<'PipelineProgress'>,
): Promise<Partial<PipelineProgress> | null> {
return this.pipelineProgressService.update({
...args,
where: args.where,
data: args.data,
select: prismaSelect.value,
} as Prisma.PipelineProgressUpdateArgs);
}
@ -76,7 +84,7 @@ export class PipelineProgressResolver {
@Args() args: DeleteManyPipelineProgressArgs,
): Promise<AffectedRows> {
return this.pipelineProgressService.deleteMany({
...args,
where: args.where,
});
}

View File

@ -30,12 +30,16 @@ export class PipelineStageResolver {
prismaSelect: PrismaSelect<'PipelineStage'>,
): Promise<Partial<PipelineStage>[]> {
return this.pipelineStageService.findMany({
...args,
where: args.where
? {
AND: [args.where, accessibleBy(ability).PipelineStage],
}
: accessibleBy(ability).PipelineStage,
orderBy: args.orderBy,
cursor: args.cursor,
take: args.take,
skip: args.skip,
distinct: args.distinct,
select: prismaSelect.value,
});
}

View File

@ -1,10 +1,9 @@
import { Module } from '@nestjs/common';
import { UserService } from './user.service';
import { UserResolver } from './user.resolver';
import { WorkspaceModule } from '../workspace/workspace.module';
@Module({
imports: [WorkspaceModule],
imports: [],
providers: [UserService, UserResolver],
exports: [UserService],
})

View File

@ -1,4 +1,11 @@
import { Args, Resolver, Query, ResolveField, Parent } from '@nestjs/graphql';
import {
Args,
Resolver,
Query,
ResolveField,
Parent,
Mutation,
} from '@nestjs/graphql';
import { UserService } from './user.service';
import { FindManyUserArgs } from 'src/core/@generated/user/find-many-user.args';
import { User } from 'src/core/@generated/user/user.model';
@ -11,16 +18,40 @@ import {
} from 'src/decorators/prisma-select.decorator';
import { AbilityGuard } from 'src/guards/ability.guard';
import { CheckAbilities } from 'src/decorators/check-abilities.decorator';
import { ReadUserAbilityHandler } from 'src/ability/handlers/user.ability-handler';
import {
ReadUserAbilityHandler,
UpdateUserAbilityHandler,
} from 'src/ability/handlers/user.ability-handler';
import { UserAbility } from 'src/decorators/user-ability.decorator';
import { AppAbility } from 'src/ability/ability.factory';
import { accessibleBy } from '@casl/prisma';
import { AuthUser } from 'src/decorators/auth-user.decorator';
import { assert } from 'src/utils/assert';
import { UpdateOneUserArgs } from '../@generated/user/update-one-user.args';
import { Prisma } from '@prisma/client';
@UseGuards(JwtAuthGuard)
@Resolver(() => User)
export class UserResolver {
constructor(private readonly userService: UserService) {}
@Query(() => User)
async currentUser(
@AuthUser() { id }: User,
@PrismaSelector({ modelName: 'User' })
prismaSelect: PrismaSelect<'User'>,
) {
const user = await this.userService.findUnique({
where: {
id,
},
select: prismaSelect.value,
});
assert(user, 'User not found');
return user;
}
@UseFilters(ExceptionFilter)
@Query(() => [User], {
nullable: false,
@ -34,16 +65,44 @@ export class UserResolver {
prismaSelect: PrismaSelect<'User'>,
): Promise<Partial<User>[]> {
return await this.userService.findMany({
...args,
where: args.where
? {
AND: [args.where, accessibleBy(ability).User],
}
: accessibleBy(ability).User,
orderBy: args.orderBy,
cursor: args.cursor,
take: args.take,
skip: args.skip,
distinct: args.distinct,
select: prismaSelect.value,
});
}
@Mutation(() => User)
@UseGuards(AbilityGuard)
@CheckAbilities(UpdateUserAbilityHandler)
async updateUser(
@Args() args: UpdateOneUserArgs,
@AuthUser() { id }: User,
@PrismaSelector({ modelName: 'User' })
prismaSelect: PrismaSelect<'User'>,
) {
const user = await this.userService.findUnique({
where: {
id,
},
select: prismaSelect.value,
});
assert(user, 'User not found');
return this.userService.update({
where: args.where,
data: args.data,
select: prismaSelect.value,
} as Prisma.UserUpdateArgs);
}
@ResolveField(() => String, {
nullable: false,
})

View File

@ -2,8 +2,6 @@ import { Test, TestingModule } from '@nestjs/testing';
import { UserService } from './user.service';
import { PrismaService } from 'src/database/prisma.service';
import { prismaMock } from 'src/database/client-mock/jest-prisma-singleton';
import { WorkspaceService } from '../workspace/services/workspace.service';
import { WorkspaceMemberService } from '../workspace/services/workspace-member.service';
describe('UserService', () => {
let service: UserService;
@ -16,14 +14,6 @@ describe('UserService', () => {
provide: PrismaService,
useValue: prismaMock,
},
{
provide: WorkspaceService,
useValue: {},
},
{
provide: WorkspaceMemberService,
useValue: {},
},
],
}).compile();

View File

@ -1,10 +1,5 @@
import {
BadRequestException,
ForbiddenException,
Injectable,
} from '@nestjs/common';
import { BadRequestException, Injectable } from '@nestjs/common';
import { PrismaService } from 'src/database/prisma.service';
import { WorkspaceService } from 'src/core/workspace/services/workspace.service';
import { Prisma } from '@prisma/client';
import { assert } from 'src/utils/assert';
@ -15,10 +10,7 @@ export type UserPayload = {
@Injectable()
export class UserService {
constructor(
private readonly prismaService: PrismaService,
private readonly workspaceService: WorkspaceService,
) {}
constructor(private readonly prismaService: PrismaService) {}
// Find
findFirst = this.prismaService.user.findFirst;
@ -56,22 +48,6 @@ export class UserService {
args: Prisma.SelectSubset<T, Prisma.UserCreateArgs>,
): Promise<Prisma.UserGetPayload<T>> {
assert(args.data.email, 'email is missing', BadRequestException);
assert(args.data.firstName, 'firstName is missing', BadRequestException);
assert(args.data.lastName, 'lastName is missing', BadRequestException);
const emailDomain = args.data.email.split('@')[1];
assert(emailDomain, 'Email is malformed', BadRequestException);
const workspace = await this.workspaceService.findUnique({
where: { domainName: emailDomain },
});
assert(
workspace,
'User email domain does not match an existing workspace',
ForbiddenException,
);
const user = await this.prismaService.user.upsert({
where: {
@ -79,10 +55,12 @@ export class UserService {
},
create: {
...(args.data as Prisma.UserCreateInput),
// Assign the user to a new workspace by default
workspaceMember: {
connectOrCreate: {
where: { id: workspace.id },
create: { workspaceId: workspace.id },
create: {
workspace: {
create: {},
},
},
},
locale: 'en',
@ -90,7 +68,7 @@ export class UserService {
update: {},
...(args.select ? { select: args.select } : {}),
...(args.include ? { include: args.include } : {}),
});
} as Prisma.UserUpsertArgs);
return user as Prisma.UserGetPayload<T>;
}

View File

@ -0,0 +1,22 @@
import { Test, TestingModule } from '@nestjs/testing';
import { WorkspaceResolver } from './workspace.resolver';
import { WorkspaceService } from '../services/workspace.service';
describe('WorkspaceMemberResolver', () => {
let resolver: WorkspaceResolver;
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
providers: [
WorkspaceResolver,
{ provide: WorkspaceService, useValue: {} },
],
}).compile();
resolver = module.get<WorkspaceResolver>(WorkspaceResolver);
});
it('should be defined', () => {
expect(resolver).toBeDefined();
});
});

View File

@ -0,0 +1,36 @@
import { Args, Mutation, Resolver } from '@nestjs/graphql';
import { UseGuards } from '@nestjs/common';
import { Workspace } from 'src/core/@generated/workspace/workspace.model';
import { WorkspaceService } from '../services/workspace.service';
import {
PrismaSelect,
PrismaSelector,
} from 'src/decorators/prisma-select.decorator';
import { AuthWorkspace } from 'src/decorators/auth-workspace.decorator';
import { WorkspaceUpdateInput } from 'src/core/@generated/workspace/workspace-update.input';
import { JwtAuthGuard } from 'src/guards/jwt.auth.guard';
import { Prisma } from '@prisma/client';
@UseGuards(JwtAuthGuard)
@Resolver(() => Workspace)
export class WorkspaceResolver {
constructor(private readonly workspaceService: WorkspaceService) {}
@Mutation(() => Workspace)
async updateWorkspace(
@Args('data') data: WorkspaceUpdateInput,
@AuthWorkspace() workspace: Workspace,
@PrismaSelector({ modelName: 'Workspace' })
prismaSelect: PrismaSelect<'Workspace'>,
) {
return this.workspaceService.update({
where: {
id: workspace.id,
},
data: {
...data,
},
select: prismaSelect.value,
} as Prisma.WorkspaceUpdateArgs);
}
}

View File

@ -1,9 +1,16 @@
import { Module } from '@nestjs/common';
import { WorkspaceService } from './services/workspace.service';
import { WorkspaceMemberService } from './services/workspace-member.service';
import { WorkspaceMemberResolver } from './resolvers/workspace-member.resolver';
import { WorkspaceResolver } from './resolvers/workspace.resolver';
@Module({
providers: [WorkspaceService, WorkspaceMemberService],
providers: [
WorkspaceService,
WorkspaceMemberService,
WorkspaceMemberResolver,
WorkspaceResolver,
],
exports: [WorkspaceService, WorkspaceMemberService],
})
export class WorkspaceModule {}

View File

@ -0,0 +1,6 @@
-- DropIndex
DROP INDEX "workspaces_domainName_key";
-- AlterTable
ALTER TABLE "workspaces" ALTER COLUMN "domainName" DROP NOT NULL,
ALTER COLUMN "displayName" DROP NOT NULL;

View File

@ -0,0 +1,3 @@
-- AlterTable
ALTER TABLE "users" ALTER COLUMN "firstName" DROP NOT NULL,
ALTER COLUMN "lastName" DROP NOT NULL;

View File

@ -1,6 +1,14 @@
import { INestApplication, Injectable, OnModuleInit } from '@nestjs/common';
import {
INestApplication,
Injectable,
Logger,
OnModuleInit,
} from '@nestjs/common';
import { PrismaClient } from '@prisma/client';
import { createPrismaQueryEventHandler } from 'prisma-query-log';
import { EnvironmentService } from 'src/integrations/environment/environment.service';
// TODO: Check if this is still needed
if (!global.prisma) {
global.prisma = new PrismaClient();
}
@ -8,6 +16,36 @@ export default global.prisma;
@Injectable()
export class PrismaService extends PrismaClient implements OnModuleInit {
private readonly logger = new Logger(PrismaService.name);
constructor(private readonly environmentService: EnvironmentService) {
const debugMode = environmentService.getDebugMode();
super({
errorFormat: 'minimal',
log: debugMode
? [
{
level: 'query',
emit: 'event',
},
]
: undefined,
});
if (debugMode) {
const logHandler = createPrismaQueryEventHandler({
logger: (query: string) => {
this.logger.log(query, 'PrismaClient');
},
format: false,
colorQuery: '\u001B[96m',
colorParameter: '\u001B[90m',
});
this.$on('query' as any, logHandler);
}
}
async onModuleInit() {
await this.$connect();
}

View File

@ -135,9 +135,11 @@ model User {
/// @Validator.IsOptional()
id String @id @default(uuid())
/// @Validator.IsString()
firstName String
/// @Validator.IsOptional()
firstName String?
/// @Validator.IsString()
lastName String
/// @Validator.IsOptional()
lastName String?
/// @Validator.IsEmail()
email String @unique
/// @Validator.IsBoolean()
@ -185,9 +187,11 @@ model Workspace {
/// @Validator.IsOptional()
id String @id @default(uuid())
/// @Validator.IsString()
domainName String @unique
/// @Validator.IsOptional()
domainName String?
/// @Validator.IsString()
displayName String
/// @Validator.IsOptional()
displayName String?
/// @Validator.IsString()
/// @Validator.IsOptional()
logo String?

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -2,7 +2,7 @@ import { ConfigurableModuleBuilder } from '@nestjs/common';
export const { ConfigurableModuleClass, MODULE_OPTIONS_TOKEN } =
new ConfigurableModuleBuilder({
moduleName: 'Environment',
moduleName: 'Prisma',
})
.setClassMethodName('forRoot')
.build();

Some files were not shown because too many files have changed in this diff Show More