Да, ты определенно мало понимаешь, что делаешь :)
И главная проблема в том, что ты даже не сращиваешь типы данных. То есть тут уже как раз не вопрос в более высокоуровневых библиотеках, а в базовах вещах в принципе. Вот твой код
export const createpost: FieldResolver<'Mutation', 'createPost'> = async (
_,
args,
ctx
) => {
const title: string = args.where.title || {}
const text: string = args.where.text || {}
const post = await ctx.prisma.post.create({
data: {
title,
text,
},
})
return {
data: post,
}
}
Давай его разберем.
Вот у тебя идет вызов призма-метода на создание поста с передачей в него данных в data
const post = await ctx.prisma.post.create({
data: {
title,
text,
},
})
А какой тип у data?
/**
* Post create
*/
export type PostCreateArgs = {
/**
* Select specific fields to fetch from the Post
*
**/
select?: PostSelect | null
/**
* Choose, which related nodes to fetch as well.
*
**/
include?: PostInclude | null
/**
* The data needed to create a Post.
*
**/
data: XOR<PostCreateInput, PostUncheckedCreateInput>
}
export type PostCreateInput = {
id?: string
createdAt?: Date | string
updatedAt?: Date | string
title: string
text?: string | null
mashroom?: MashroomCreateNestedOneWithoutPostsInput
CreatedBy: UserCreateNestedOneWithoutPostsInput
Likes?: LikeCreateNestedManyWithoutPostLikeInput
}
Что ты там пытаешься передать? title и text. Какие у них типы?
title: string
text?: string | null
То есть титл - обязательно строка должна быть, а text - не обязательный (undefined) или строка или null.
А что ты делаешь?
const title: string = args.where.title || {}
const text: string = args.where.text || {}
То есть у тебя переменная равно переменная или Объект? А с чего вдруг объект? У тебя что, title или text может быть объектом? Уж в крайнем случае тебе надо было сделать так:
const title: string = args.where.title || ""
const text: string = args.where.text || ""
Но title у тебя на вход итак обязательно строка, зачем его проверять?
Я тебе более того скажу: если бы ты даже вот так сделал:
const post = await ctx.prisma.post.create({
data: args.where,
})
то у тебя не было бы проблем здесь с титлом и текстом, у тебя там другая ошибка:
Property 'CreatedBy' is missing in type '{ text?: string | null | undefined; title: string; }' but required in type 'PostCreateInput'.ts(2322)
index.d.ts(10047, 5): 'CreatedBy' is declared here.
Призма ругается на то, что у тебя не передан CreatedBy, что вполне логично, ведь у тебя же это поле в призма-схеме обязательное. https://github.com/linklib/gribok-prisma/blob/94458e23ae35e773b31e1e9ae4a03ea4eb59baa5/prisma/schema.prisma#L125-L126
Откуда его взять? Это же текущий пользователь и его просто надо взять из контекста, проверив, что он есть.
const { currentUser } = ctx
if (!currentUser) {
throw new Error('Не был получен пользователь')
}
Но и это еще не все. У тебя сам резолвер ругается:
Type '{ data: Post; }' is missing the following properties from type '{ id: MaybePromise<string>; createdAt: MaybePromise<Date>; updatedAt: MaybePromise<Date>; mashroomId: MaybePromise<string | null>; title: MaybePromise<...>; text: MaybePromise<...>; createdById: MaybePromise<...>; }': id, createdAt, updatedAt, mashroomId, and 3 more.ts(2322)
То есть то, что ты пытаешься вернуть, это не то, что он ожидает. Что у тебя в схему мутации прописано?
t.nonNull.field('createPost', {
type: 'Post',
args: {
where: nonNull('PostCreateInput'),
},
resolve: createpost,
})
Возвращаемый type - Post. А ты что пытаешься вернуть в мутации?
return {
data: post,
}
Так почему же { data: post, } (что есть суть Объект со свойством post, тип которому Post)? А не просто post. То есть ты возвращаешь {post: Post} вместо Post.
Знаешь чем все это объясняется? Большими перерывами в практике и малыми объемами этой самой практики. Типы и прочее - это все ты оттачивал на фронте. И очень странно, что здесь ты начал с типами плавать.
Ну и еще момент: если в ctx.prisma.post.create ты передаешь data, то почему ты в параметры мутации прописал where? Нельзя было переименовать в data? Не будь таким великим последователем копипасты.
Отправил ПР: https://github.com/linklib/gribok-prisma/pull/2
Изучай и исправляйся.