Implement functionality to update project member permissions in settings (#56)

* Add mutation to update permissions of project member

* Use update project member permission client method in UI

* Handle review changes

---------

Co-authored-by: neeraj <neeraj.rtly@gmail.com>
This commit is contained in:
2024-02-01 11:37:57 +05:30
committed by Ashwin Phatak
co-authored by neeraj
parent b5e7554c26
commit ace27c7eae
9 changed files with 134 additions and 45 deletions
+17 -6
View File
@@ -165,13 +165,24 @@ export class Database {
return environmentVariables;
}
async removeProjectMemberById (memberId: string): Promise<boolean> {
async removeProjectMemberById (projectMemberId: string): Promise<boolean> {
const projectMemberRepository = this.dataSource.getRepository(ProjectMember);
const deleted = await projectMemberRepository.delete(memberId);
const deleteResult = await projectMemberRepository.delete({ id: Number(projectMemberId) });
if (deleted.affected) {
return deleted.affected > 0;
if (deleteResult.affected) {
return deleteResult.affected > 0;
} else {
return false;
}
}
async updateProjectMemberById (projectMemberId: string, data: DeepPartial<ProjectMember>): Promise<boolean> {
const projectMemberRepository = this.dataSource.getRepository(ProjectMember);
const updateResult = await projectMemberRepository.update({ id: Number(projectMemberId) }, data);
if (updateResult.affected) {
return updateResult.affected > 0;
} else {
return false;
}
@@ -223,7 +234,7 @@ export class Database {
}
}
async getProjectMemberByMemberId (memberId: string): Promise<ProjectMember> {
async getProjectMemberById (projectMemberId: string): Promise<ProjectMember> {
const projectMemberRepository = this.dataSource.getRepository(ProjectMember);
const projectMemberWithProject = await projectMemberRepository.find({
@@ -234,7 +245,7 @@ export class Database {
member: true
},
where: {
id: Number(memberId)
id: Number(projectMemberId)
}
}
);
+2 -2
View File
@@ -11,7 +11,7 @@ import {
import { Project } from './Project';
import { User } from './User';
enum Permissions {
export enum Permission {
View = 'View',
Edit = 'Edit'
}
@@ -32,7 +32,7 @@ export class ProjectMember {
@Column({
type: 'simple-array'
})
permissions!: Permissions[];
permissions!: Permission[];
@CreateDateColumn()
createdAt!: Date;
+18 -3
View File
@@ -6,6 +6,7 @@ import { OAuthApp } from '@octokit/oauth-app';
import { Database } from './database';
import { deploymentToGqlType, projectMemberToGqlType, projectToGqlType, environmentVariableToGqlType, isUserOwner } from './utils';
import { Environment } from './entity/Deployment';
import { Permission } from './entity/ProjectMember';
const log = debug('snowball:database');
@@ -108,9 +109,9 @@ export const createResolvers = async (db: Database, app: OAuthApp): Promise<any>
},
Mutation: {
removeMember: async (_: any, { memberId }: { memberId: string }, context: any) => {
removeProjectMember: async (_: any, { projectMemberId }: { projectMemberId: string }, context: any) => {
try {
const member = await db.getProjectMemberByMemberId(memberId);
const member = await db.getProjectMemberById(projectMemberId);
if (member.member.id === context.userId) {
throw new Error('Invalid operation: cannot remove self');
@@ -120,7 +121,7 @@ export const createResolvers = async (db: Database, app: OAuthApp): Promise<any>
assert(memberProject);
if (isUserOwner(String(context.userId), String(memberProject.owner.id))) {
return db.removeProjectMemberById(memberId);
return db.removeProjectMemberById(projectMemberId);
} else {
throw new Error('Invalid operation: not authorized');
}
@@ -130,6 +131,20 @@ export const createResolvers = async (db: Database, app: OAuthApp): Promise<any>
}
},
updateProjectMember: async (_: any, { projectMemberId, data }: {
projectMemberId: string,
data: {
permissions: Permission[]
}
}) => {
try {
return db.updateProjectMemberById(projectMemberId, data);
} catch (err) {
log(err);
return false;
}
},
addEnvironmentVariables: async (_: any, { projectId, environmentVariables }: { projectId: string, environmentVariables: { environments: string[], key: string, value: string}[] }) => {
try {
return db.addEnvironmentVariablesByProjectId(projectId, environmentVariables);
+6 -1
View File
@@ -131,7 +131,8 @@ type AuthResult {
}
type Mutation {
removeMember(memberId: String!): Boolean!
removeProjectMember(projectMemberId: String!): Boolean!
updateProjectMember(projectMemberId: String!, data: UpdateProjectMemberInput): Boolean!
addEnvironmentVariables(projectId: String!, environmentVariables: [AddEnvironmentVariableInput!]): Boolean!
removeEnvironmentVariable(environmentVariableId: String!): Boolean!
updateEnvironmentVariable(environmentVariableId: String!, environmentVariable: UpdateEnvironmentVariableInput!): Boolean!
@@ -170,3 +171,7 @@ input UpdateEnvironmentVariableInput {
key: String
value: String
}
input UpdateProjectMemberInput {
permissions: [Permission]
}