From 4b4036fc571a88e01fd9ae531f65b60856978b79 Mon Sep 17 00:00:00 2001 From: MTG2000 Date: Sun, 25 Sep 2022 11:30:29 +0300 Subject: [PATCH] update: add permissions to project --- api/functions/graphql/types/project.js | 37 ++++++++++++++++--- .../pages/ExplorePage/Header/Header.tsx | 3 +- .../ProjectDetailsCard/ProjectDetails.graphql | 1 + 3 files changed, 35 insertions(+), 6 deletions(-) diff --git a/api/functions/graphql/types/project.js b/api/functions/graphql/types/project.js index 7972883..957f294 100644 --- a/api/functions/graphql/types/project.js +++ b/api/functions/graphql/types/project.js @@ -15,7 +15,6 @@ const { logError } = require('../../../utils/logger'); const { resolveImgObjectToUrl } = require('../../../utils/resolveImageUrl'); const { paginationArgs, getLnurlDetails, lightningAddressToLnurl } = require('./helpers'); const { ImageInput } = require('./misc'); -const { Tournament } = require('./tournament'); const { MakerRole } = require('./users'); @@ -101,10 +100,8 @@ const Project = objectType({ }) - // No need to create this "middle" kind of relations - // Instead, just return tournaments - t.list.nonNull.field('tournaments', { - type: Tournament, + t.nonNull.list.nonNull.field('tournaments', { + type: "Tournament", resolve: (parent) => { return prisma.tournamentProject.findMany({ where: { project_id: parent.id }, @@ -143,6 +140,24 @@ const Project = objectType({ }) } }) + + t.nonNull.list.nonNull.field('permissions', { + type: ProjectPermissionEnum, + resolve: async (parent, _, ctx) => { + const user = await getUserByPubKey(ctx.userPubKey) + if (!user) return []; + + const role = (await prisma.projectMember.findUnique({ where: { projectId_userId: { projectId: parent.id, userId: user.id } } }))?.role; + + if (!role) return []; + + if (role === ROLE_ADMIN) return [PROJECT_PERMISSIONS.UpdateMembers, PROJECT_PERMISSIONS.UpdateInfo]; + + if (role === ROLE_OWNER) return Object.values(PROJECT_PERMISSIONS); + + return [] + } + }) } }) @@ -155,6 +170,18 @@ const TEAM_MEMBER_ROLE = enumType({ members: [ROLE_OWNER, ROLE_ADMIN, ROLE_MAKER], }); +const PROJECT_PERMISSIONS = { + UpdateInfo: "UpdateInfo", + DeleteProject: "DeleteProject", + UpdateAdmins: "UpdateAdmins", + UpdateMembers: "UpdateMembers", +} + +const ProjectPermissionEnum = enumType({ + name: 'ProjectPermissionEnum', + members: PROJECT_PERMISSIONS, +}); + const ProjectMember = objectType({ name: "ProjectMember", definition(t) { diff --git a/src/features/Projects/pages/ExplorePage/Header/Header.tsx b/src/features/Projects/pages/ExplorePage/Header/Header.tsx index c289d1e..dcfd708 100644 --- a/src/features/Projects/pages/ExplorePage/Header/Header.tsx +++ b/src/features/Projects/pages/ExplorePage/Header/Header.tsx @@ -19,6 +19,7 @@ export const bannerData = { link: { content: "Register Now", url: createRoute({ type: "tournament", id: 1 }), + newTab: false }, } @@ -91,7 +92,7 @@ export default function Header() {
{headerLinks[1].title}
- diff --git a/src/features/Projects/pages/ProjectPage/ProjectDetailsCard/ProjectDetails.graphql b/src/features/Projects/pages/ProjectPage/ProjectDetailsCard/ProjectDetails.graphql index dc3cda9..66ea49e 100644 --- a/src/features/Projects/pages/ProjectPage/ProjectDetailsCard/ProjectDetails.graphql +++ b/src/features/Projects/pages/ProjectPage/ProjectDetailsCard/ProjectDetails.graphql @@ -22,6 +22,7 @@ query ProjectDetails($projectId: Int!) { icon title } + permissions members { role user {