mirror of
https://github.com/awatertrevi/infisical.git
synced 2026-10-17 14:40:39 +00:00
296 lines
6.9 KiB
TypeScript
296 lines
6.9 KiB
TypeScript
import { Request, Response } from 'express';
|
|
import * as Sentry from '@sentry/node';
|
|
import {
|
|
MembershipOrg,
|
|
Membership,
|
|
Workspace
|
|
} from '../../models';
|
|
import { deleteMembershipOrg } from '../../helpers/membershipOrg';
|
|
import { updateSubscriptionOrgQuantity } from '../../helpers/organization';
|
|
|
|
/**
|
|
* Return memberships for organization with id [organizationId]
|
|
* @param req
|
|
* @param res
|
|
*/
|
|
export const getOrganizationMemberships = async (req: Request, res: Response) => {
|
|
/*
|
|
#swagger.summary = 'Return organization memberships'
|
|
#swagger.description = 'Return organization memberships'
|
|
|
|
#swagger.security = [{
|
|
"apiKeyAuth": []
|
|
}]
|
|
|
|
#swagger.parameters['organizationId'] = {
|
|
"description": "ID of organization",
|
|
"required": true,
|
|
"type": "string"
|
|
}
|
|
|
|
#swagger.responses[200] = {
|
|
content: {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"memberships": {
|
|
"type": "array",
|
|
"items": {
|
|
$ref: "#/components/schemas/MembershipOrg"
|
|
},
|
|
"description": "Memberships of organization"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
*/
|
|
let memberships;
|
|
try {
|
|
const { organizationId } = req.params;
|
|
|
|
memberships = await MembershipOrg.find({
|
|
organization: organizationId
|
|
}).populate('user', '+publicKey');
|
|
} catch (err) {
|
|
Sentry.setUser({ email: req.user.email });
|
|
Sentry.captureException(err);
|
|
return res.status(400).send({
|
|
message: 'Failed to get organization memberships'
|
|
});
|
|
}
|
|
|
|
return res.status(200).send({
|
|
memberships
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Update role of membership with id [membershipId] to role [role]
|
|
* @param req
|
|
* @param res
|
|
*/
|
|
export const updateOrganizationMembership = async (req: Request, res: Response) => {
|
|
/*
|
|
#swagger.summary = 'Update organization membership'
|
|
#swagger.description = 'Update organization membership'
|
|
|
|
#swagger.security = [{
|
|
"apiKeyAuth": []
|
|
}]
|
|
|
|
#swagger.parameters['organizationId'] = {
|
|
"description": "ID of organization",
|
|
"required": true,
|
|
"type": "string"
|
|
}
|
|
|
|
#swagger.parameters['membershipId'] = {
|
|
"description": "ID of organization membership to update",
|
|
"required": true,
|
|
"type": "string"
|
|
}
|
|
|
|
#swagger.requestBody = {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"role": {
|
|
"type": "string",
|
|
"description": "Role of organization membership - either owner, admin, or member",
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
#swagger.responses[200] = {
|
|
content: {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"membership": {
|
|
$ref: "#/components/schemas/MembershipOrg",
|
|
"description": "Updated organization membership"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
*/
|
|
let membership;
|
|
try {
|
|
const { membershipId } = req.params;
|
|
const { role } = req.body;
|
|
|
|
membership = await MembershipOrg.findByIdAndUpdate(
|
|
membershipId,
|
|
{
|
|
role
|
|
}, {
|
|
new: true
|
|
}
|
|
);
|
|
} catch (err) {
|
|
Sentry.setUser({ email: req.user.email });
|
|
Sentry.captureException(err);
|
|
return res.status(400).send({
|
|
message: 'Failed to update organization membership'
|
|
});
|
|
}
|
|
|
|
return res.status(200).send({
|
|
membership
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Delete organization membership with id [membershipId]
|
|
* @param req
|
|
* @param res
|
|
* @returns
|
|
*/
|
|
export const deleteOrganizationMembership = async (req: Request, res: Response) => {
|
|
/*
|
|
#swagger.summary = 'Delete organization membership'
|
|
#swagger.description = 'Delete organization membership'
|
|
|
|
#swagger.security = [{
|
|
"apiKeyAuth": []
|
|
}]
|
|
|
|
#swagger.parameters['organizationId'] = {
|
|
"description": "ID of organization",
|
|
"required": true,
|
|
"type": "string"
|
|
}
|
|
|
|
#swagger.parameters['membershipId'] = {
|
|
"description": "ID of organization membership to delete",
|
|
"required": true,
|
|
"type": "string"
|
|
}
|
|
|
|
#swagger.responses[200] = {
|
|
content: {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"membership": {
|
|
$ref: "#/components/schemas/MembershipOrg",
|
|
"description": "Deleted organization membership"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
*/
|
|
let membership;
|
|
try {
|
|
const { membershipId } = req.params;
|
|
|
|
// delete organization membership
|
|
membership = await deleteMembershipOrg({
|
|
membershipOrgId: membershipId
|
|
});
|
|
|
|
await updateSubscriptionOrgQuantity({
|
|
organizationId: membership.organization.toString()
|
|
});
|
|
} catch (err) {
|
|
Sentry.setUser({ email: req.user.email });
|
|
Sentry.captureException(err);
|
|
return res.status(400).send({
|
|
message: 'Failed to delete organization membership'
|
|
});
|
|
}
|
|
|
|
return res.status(200).send({
|
|
membership
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Return workspaces for organization with id [organizationId] that user has
|
|
* access to
|
|
* @param req
|
|
* @param res
|
|
*/
|
|
export const getOrganizationWorkspaces = async (req: Request, res: Response) => {
|
|
/*
|
|
#swagger.summary = 'Return projects in organization that user is part of'
|
|
#swagger.description = 'Return projects in organization that user is part of'
|
|
|
|
#swagger.security = [{
|
|
"apiKeyAuth": []
|
|
}]
|
|
|
|
#swagger.parameters['organizationId'] = {
|
|
"description": "ID of organization",
|
|
"required": true,
|
|
"type": "string"
|
|
}
|
|
|
|
#swagger.responses[200] = {
|
|
content: {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"workspaces": {
|
|
"type": "array",
|
|
"items": {
|
|
$ref: "#/components/schemas/Project"
|
|
},
|
|
"description": "Projects of organization"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
*/
|
|
let workspaces;
|
|
try {
|
|
const { organizationId } = req.params;
|
|
|
|
const workspacesSet = new Set(
|
|
(
|
|
await Workspace.find(
|
|
{
|
|
organization: organizationId
|
|
},
|
|
'_id'
|
|
)
|
|
).map((w) => w._id.toString())
|
|
);
|
|
|
|
workspaces = (
|
|
await Membership.find({
|
|
user: req.user._id
|
|
}).populate('workspace')
|
|
)
|
|
.filter((m) => workspacesSet.has(m.workspace._id.toString()))
|
|
.map((m) => m.workspace);
|
|
} catch (err) {
|
|
Sentry.setUser({ email: req.user.email });
|
|
Sentry.captureException(err);
|
|
return res.status(400).send({
|
|
message: 'Failed to get organization workspaces'
|
|
});
|
|
}
|
|
|
|
return res.status(200).send({
|
|
workspaces
|
|
});
|
|
} |