@prisma-cms/cooperation-module
Version:
Cooperation module for @prisma-cms/server
316 lines (212 loc) • 5.57 kB
JavaScript
import chalk from "chalk";
import PrismaModule from "@prisma-cms/prisma-module";
import PrismaProcessor from "@prisma-cms/prisma-processor";
export class TaskReactionProcessor extends PrismaProcessor {
constructor(props) {
super(props);
this.objectType = "TaskReaction";
this.private = true;
}
async create(method, args, info) {
let {
data: {
...data
},
} = args;
Object.assign(data, {
...this.getCreatedBy(),
});
Object.assign(args, {
data,
});
if (!this.hasErrors()) {
/**
* Проверяем уникальность
*/
await this.checkUniqueOnCreate({
...args,
...this.getCreatedBy(),
});
return super.create(method, args, info);
}
}
async mutate(method, args, info) {
let {
data: {
// name,
...data
},
} = args;
// if(name !== undefined){
// name = name && name.trim() || null;
// if(!name){
// this.addFieldError("name", "Не указано название задачи");
// }
// }
Object.assign(data, {
// name,
});
Object.assign(args, {
data,
});
return super.mutate(method, args);
}
/**
* Проверяем уникальность
*/
async checkUniqueOnCreate(args) {
const {
data: {
Task,
CreatedBy: User,
type,
},
} = args;
// console.log("checkUniqueOnCreate", args);
// console.log("checkUniqueOnCreate User", User);
const {
db,
} = this.ctx;
const {
connect: taskWhere,
} = Task || {};
const {
connect: userWhere,
} = User || {};
if (!taskWhere) {
return this.addError("Не было получено условие проверки задачи");
}
if (!userWhere) {
return this.addError("Не было получено условие проверки пользователя");
}
const exists = await db.exists.TaskReaction({
Task: {
...taskWhere,
},
CreatedBy: {
...userWhere,
},
type,
});
// console.log("exists", exists);
if (exists) {
this.addError("Уже есть голос за эту задачу");
}
}
async deleteTaskReaction(args, info) {
const {
id: currentUserId,
} = await this.getUser(true);
// console.log("currentUserId", currentUserId);
const {
ctx: {
db,
},
} = this;
const taskReaction = await db.query.taskReaction(args, `
{
id
CreatedBy {
id
}
}
`);
if (!taskReaction) {
throw new Error("Не был получен объект");
}
const {
CreatedBy: {
id: userId,
}
} = taskReaction;
if (userId !== currentUserId) {
throw new Error("Нельзя удалить чужой объект");
}
return await db.mutation.deleteTaskReaction(args, info);
}
getCreatedBy() {
const {
currentUser,
} = this.ctx;
if (!currentUser) {
this.addError("Необходимо авторизоваться");
return;
}
const {
id,
} = currentUser;
return {
CreatedBy: {
connect: {
id,
},
},
}
}
}
class TaskReactionModule extends PrismaModule {
getResolvers() {
const resolvers = super.getResolvers();
Object.assign(resolvers.Query, {
taskReaction: this.taskReaction,
taskReactions: this.taskReactions,
taskReactionsConnection: this.taskReactionsConnection,
});
Object.assign(resolvers.Mutation, {
createTaskReactionProcessor: this.createTaskReactionProcessor.bind(this),
updateTaskReactionProcessor: this.updateTaskReactionProcessor.bind(this),
deleteTaskReaction: this.deleteTaskReaction.bind(this),
});
// Object.assign(resolvers.Subscription, this.Subscription);
Object.assign(resolvers, {
TaskReactionResponse: this.TaskReactionResponse(),
Subscription: {
taskReaction: {
subscribe: async (parent, args, ctx, info) => {
return ctx.db.subscription.taskReaction({}, info);
},
},
},
});
return resolvers;
}
taskReactions(source, args, ctx, info) {
return ctx.db.query.taskReactions(args, info);
}
taskReaction(source, args, ctx, info) {
return ctx.db.query.taskReaction(args, info);
}
taskReactionsConnection(source, args, ctx, info) {
return ctx.db.query.taskReactionsConnection(args, info);
}
getProcessor(ctx) {
return new (this.getProcessorClass())(ctx);
}
getProcessorClass() {
return TaskReactionProcessor;
}
createTaskReactionProcessor(source, args, ctx, info) {
return this.getProcessor(ctx).createWithResponse("TaskReaction", args, info);
}
updateTaskReactionProcessor(source, args, ctx, info) {
return this.getProcessor(ctx).updateWithResponse("TaskReaction", args, info);
}
deleteTaskReaction(source, args, ctx, info) {
return this.getProcessor(ctx).deleteTaskReaction(args, info);
}
TaskReactionResponse() {
return {
data: (source, args, ctx, info) => {
const {
id,
} = source.data || {};
return id ? ctx.db.query.taskReaction({
where: {
id,
},
}, info) : null;
}
}
}
}
export default TaskReactionModule;