API Reference - ProjectMember API
Working with Project Members using Collections
Interactive Examples
Try these examples with your saved connection. If you haven't connected yet, visit the Try It Out page first.
Get First 10 Project Members
Fetch the first 10 project members using Collections.
const members = api.collections.projectmember;
await members.fetch({ limit: 10 });
console.log('Members:', members.models);
console.log('Has more:', members.hasMore);
Find Members by Project ID
Fetch members and filter by a specific project using the where() method.
const members = api.collections.projectmember;
await members.fetch({ limit: 100 });
const projectMembers = members.where({ project_id: 1 });
console.log(`Found ${projectMembers.length} members for project 1`);
Find All Project Managers
Fetch members and filter for those with management permissions.
const members = api.collections.projectmember;
await members.fetch({ limit: 100 });
const managers = members.filter(m => m.allow_manage);
console.log(`Found ${managers.length} managers`);
Check User Permissions for Project
Check if a specific user has permissions for a project using filtering.
const members = api.collections.projectmember;
// Fetch with filters for specific user and project
await members.fetch({ user_id: 1, project_id: 1 });
const membership = members.first();
if (membership) {
console.log('User has access');
console.log('Role:', membership.allow_manage ? 'Manager' :
membership.allow_change ? 'Editor' : 'Viewer');
}
Group Members by Project
Fetch all members and group them by project to see membership distribution.
const members = api.collections.projectmember;
await members.fetchAll();
const byProject = members.groupBy('project_id');
Object.entries(byProject).forEach(([projectId, projectMembers]) => {
console.log(`Project ${projectId}: ${projectMembers.length} members`);
});
ProjectMemberCollection
The ProjectMemberCollection class provides a Backbone.js-inspired interface for managing project member data with built-in indexing, pagination, and array operations.
Accessing the ProjectMemberCollection
import { initializeSGERP } from 'sgerp-frontend-lib';
const api = initializeSGERP({
activeConnection: 'admin@staging',
connections: {
'admin@staging': {
id: 'admin@staging',
environment: 'staging',
user: 'admin',
password: 'your-password',
baseUrl: 'https://sgerp-stage.d.gcdev.swatrider.com',
},
},
});
// Access the ProjectMemberCollection
const members = api.collections.projectmember;
Common ProjectMember Operations
Get All Project Members
Fetch and work with project member collections:
const members = api.collections.projectmember;
// Fetch first page
await members.fetch({ limit: 20 });
console.log('Total members:', members.length);
console.log('Has more:', members.hasMore);
// Iterate through members
members.forEach(member => {
console.log(`User ${member.user_id} in Project ${member.project_id}`);
console.log(` Permissions: change=${member.allow_change}, manage=${member.allow_manage}`);
});
Find Members by Project
Use underscore.js methods to filter members by project:
const members = api.collections.projectmember;
await members.fetch({ limit: 100 });
// Get all members for a specific project
const projectId = 1;
const projectMembers = members.where({ project_id: projectId });
console.log(`Project ${projectId} has ${projectMembers.length} members`);
projectMembers.forEach(member => {
console.log(` User ID: ${member.user_id}`);
console.log(` Can change: ${member.allow_change}`);
console.log(` Can manage: ${member.allow_manage}`);
});
Find Members by User
Find all projects a user is a member of:
const members = api.collections.projectmember;
await members.fetch({ limit: 100 });
// Get all projects for a specific user
const userId = 42;
const userMemberships = members.where({ user_id: userId });
console.log(`User ${userId} is a member of ${userMemberships.length} projects`);
userMemberships.forEach(member => {
console.log(` Project ID: ${member.project_id}`);
console.log(` Permissions: change=${member.allow_change}, manage=${member.allow_manage}`);
});
Find Project Managers
Find members with management permissions:
const members = api.collections.projectmember;
await members.fetch({ limit: 100 });
// Find all managers (allow_manage = true)
const managers = members.filter(m => m.allow_manage);
console.log(`Found ${managers.length} managers`);
managers.forEach(manager => {
console.log(` User ${manager.user_id} manages Project ${manager.project_id}`);
});
Check User Permissions
Check if a user has specific permissions for a project:
const members = api.collections.projectmember;
await members.fetch({ limit: 100 });
// Check if user 42 can manage project 1
const membership = members.findWhere({
user_id: 42,
project_id: 1,
});
if (membership) {
console.log('User has membership');
console.log('Can change:', membership.allow_change);
console.log('Can manage:', membership.allow_manage);
} else {
console.log('User is not a member of this project');
}
Types
ProjectMember
interface ProjectMember {
id: number;
created_at: string;
modified_at: string;
user_id: number;
project_id: number;
allow_change: boolean;
allow_manage: boolean;
data: Record<string, any>;
}
Fields:
id- Unique identifier for the membershipcreated_at- ISO timestamp when membership was createdmodified_at- ISO timestamp of last modificationuser_id- ID of the user who is a memberproject_id- ID of the project they belong toallow_change- Whether the user can modify project dataallow_manage- Whether the user can manage project settings and membersdata- Additional custom data associated with the membership
Complete Example
import {
initializeSGERP,
type ProjectMember,
} from 'sgerp-frontend-lib';
// Initialize the library
const api = initializeSGERP({
activeConnection: 'admin@staging',
connections: {
'admin@staging': {
id: 'admin@staging',
environment: 'staging',
user: 'admin',
password: 'your-password',
baseUrl: 'https://sgerp-stage.d.gcdev.swatrider.com',
},
},
});
// Fetch all project members
const members = api.collections.projectmember;
await members.fetchAll();
console.log(`Total memberships: ${members.length}`);
// Analyze permissions by project
const byProject = members.groupBy('project_id');
Object.entries(byProject).forEach(([projectId, projectMembers]) => {
const managers = projectMembers.filter(m => m.allow_manage);
const editors = projectMembers.filter(m => m.allow_change && !m.allow_manage);
const viewers = projectMembers.filter(m => !m.allow_change && !m.allow_manage);
console.log(`\nProject ${projectId}:`);
console.log(` Total members: ${projectMembers.length}`);
console.log(` Managers: ${managers.length}`);
console.log(` Editors: ${editors.length}`);
console.log(` Viewers: ${viewers.length}`);
});
// Find cross-project managers
const managerUserIds = new Set(
members.filter(m => m.allow_manage).map(m => m.user_id)
);
console.log(`\nUnique managers across all projects: ${managerUserIds.size}`);
// Check specific user-project relationship
const userId = 42;
const projectId = 1;
const membership = members.findWhere({ user_id: userId, project_id: projectId });
if (membership) {
console.log(`\nUser ${userId} access to Project ${projectId}:`);
console.log(` Role: ${
membership.allow_manage ? 'Manager' :
membership.allow_change ? 'Editor' :
'Viewer'
}`);
} else {
console.log(`\nUser ${userId} is not a member of Project ${projectId}`);
}
Error Handling
import { initializeSGERP, APIError } from 'sgerp-frontend-lib';
const api = initializeSGERP({ /* config */ });
try {
const members = api.collections.projectmember;
await members.fetch({ limit: 20 });
console.log('Members:', members.models);
} catch (error) {
if (error instanceof APIError) {
if (error.status === 401) {
console.error('Authentication failed - check credentials');
} else if (error.status === 403) {
console.error('Access denied - insufficient permissions');
} else {
console.error('API error:', error.message);
}
} else {
console.error('Unknown error:', error);
}
}
Working with Combined Data
Combine project members with projects and users for rich queries:
const api = initializeSGERP({ /* config */ });
// Fetch all data
const projects = api.collections.project;
const users = api.collections.user;
const members = api.collections.projectmember;
await Promise.all([
projects.fetchAll(),
users.fetchAll(),
members.fetchAll(),
]);
// Find all members with their project and user details
members.forEach(member => {
const project = projects.get(member.project_id);
const user = users.get(member.user_id);
if (project && user) {
console.log(`${user.username} is a member of ${project.name}`);
console.log(` Role: ${
member.allow_manage ? 'Manager' :
member.allow_change ? 'Editor' :
'Viewer'
}`);
}
});
// Group members by project with full details
const projectDetails = projects.map(project => {
const projectMembers = members.where({ project_id: project.id });
const memberDetails = projectMembers.map(m => {
const user = users.get(m.user_id);
return {
username: user?.username || 'Unknown',
role: m.allow_manage ? 'Manager' : m.allow_change ? 'Editor' : 'Viewer',
};
});
return {
projectName: project.name,
memberCount: projectMembers.length,
members: memberDetails,
};
});
console.log('Project Memberships:', projectDetails);