mirror of
https://github.com/Infisical/infisical.git
synced 2025-03-28 15:29:21 +00:00
.github
.husky
backend
img
src
config
controllers
v1
authController.ts
botController.ts
index.ts
integrationAuthController.ts
integrationController.ts
keyController.ts
membershipController.ts
membershipOrgController.ts
organizationController.ts
passwordController.ts
secretController.ts
serviceTokenController.ts
signupController.ts
stripeController.ts
userActionController.ts
userController.ts
workspaceController.ts
v2
ee
events
helpers
integrations
middleware
models
routes
services
templates
types
utils
variables
index.ts
swagger
test-resources
tests
.dockerignore
.eslintignore
.eslintrc
Dockerfile
environment.d.ts
healthcheck.js
jest.config.ts
nodemon.json
package-lock.json
package.json
spec.json
tsconfig.json
cli
cloudformation
docs
frontend
helm-charts
i18n
img
k8-operator
nginx
.env.example
.eslintignore
.gitignore
.goreleaser.yaml
CODE_OF_CONDUCT.md
CONTRIBUTING.md
LICENSE
Makefile
README.md
SECURITY.md
docker-compose.dev.yml
docker-compose.yml
package-lock.json
package.json
336 lines
7.3 KiB
TypeScript
336 lines
7.3 KiB
TypeScript
import { Request, Response } from "express";
|
|
import * as Sentry from "@sentry/node";
|
|
import {
|
|
Workspace,
|
|
Membership,
|
|
MembershipOrg,
|
|
Integration,
|
|
IntegrationAuth,
|
|
IUser,
|
|
ServiceToken,
|
|
ServiceTokenData,
|
|
} from "../../models";
|
|
import {
|
|
createWorkspace as create,
|
|
deleteWorkspace as deleteWork,
|
|
} from "../../helpers/workspace";
|
|
import { addMemberships } from "../../helpers/membership";
|
|
import { ADMIN } from "../../variables";
|
|
|
|
/**
|
|
* Return public keys of members of workspace with id [workspaceId]
|
|
* @param req
|
|
* @param res
|
|
* @returns
|
|
*/
|
|
export const getWorkspacePublicKeys = async (req: Request, res: Response) => {
|
|
let publicKeys;
|
|
try {
|
|
const { workspaceId } = req.params;
|
|
|
|
publicKeys = (
|
|
await Membership.find({
|
|
workspace: workspaceId,
|
|
}).populate<{ user: IUser }>("user", "publicKey")
|
|
).map((member) => {
|
|
return {
|
|
publicKey: member.user.publicKey,
|
|
userId: member.user._id,
|
|
};
|
|
});
|
|
} catch (err) {
|
|
Sentry.setUser({ email: req.user.email });
|
|
Sentry.captureException(err);
|
|
return res.status(400).send({
|
|
message: "Failed to get workspace member public keys",
|
|
});
|
|
}
|
|
|
|
return res.status(200).send({
|
|
publicKeys,
|
|
});
|
|
};
|
|
|
|
/**
|
|
* Return memberships for workspace with id [workspaceId]
|
|
* @param req
|
|
* @param res
|
|
* @returns
|
|
*/
|
|
export const getWorkspaceMemberships = async (req: Request, res: Response) => {
|
|
let users;
|
|
try {
|
|
const { workspaceId } = req.params;
|
|
|
|
users = await Membership.find({
|
|
workspace: workspaceId,
|
|
}).populate("user", "+publicKey");
|
|
} catch (err) {
|
|
Sentry.setUser({ email: req.user.email });
|
|
Sentry.captureException(err);
|
|
return res.status(400).send({
|
|
message: "Failed to get workspace members",
|
|
});
|
|
}
|
|
|
|
return res.status(200).send({
|
|
users,
|
|
});
|
|
};
|
|
|
|
/**
|
|
* Return workspaces that user is part of
|
|
* @param req
|
|
* @param res
|
|
* @returns
|
|
*/
|
|
export const getWorkspaces = async (req: Request, res: Response) => {
|
|
let workspaces;
|
|
try {
|
|
workspaces = (
|
|
await Membership.find({
|
|
user: req.user._id,
|
|
}).populate("workspace")
|
|
).map((m) => m.workspace);
|
|
} catch (err) {
|
|
Sentry.setUser({ email: req.user.email });
|
|
Sentry.captureException(err);
|
|
return res.status(400).send({
|
|
message: "Failed to get workspaces",
|
|
});
|
|
}
|
|
|
|
return res.status(200).send({
|
|
workspaces,
|
|
});
|
|
};
|
|
|
|
/**
|
|
* Return workspace with id [workspaceId]
|
|
* @param req
|
|
* @param res
|
|
* @returns
|
|
*/
|
|
export const getWorkspace = async (req: Request, res: Response) => {
|
|
let workspace;
|
|
try {
|
|
const { workspaceId } = req.params;
|
|
|
|
workspace = await Workspace.findOne({
|
|
_id: workspaceId,
|
|
});
|
|
} catch (err) {
|
|
Sentry.setUser({ email: req.user.email });
|
|
Sentry.captureException(err);
|
|
return res.status(400).send({
|
|
message: "Failed to get workspace",
|
|
});
|
|
}
|
|
|
|
return res.status(200).send({
|
|
workspace,
|
|
});
|
|
};
|
|
|
|
/**
|
|
* Create new workspace named [workspaceName] under organization with id
|
|
* [organizationId] and add user as admin
|
|
* @param req
|
|
* @param res
|
|
* @returns
|
|
*/
|
|
export const createWorkspace = async (req: Request, res: Response) => {
|
|
let workspace;
|
|
try {
|
|
const { workspaceName, organizationId } = req.body;
|
|
|
|
// validate organization membership
|
|
const membershipOrg = await MembershipOrg.findOne({
|
|
user: req.user._id,
|
|
organization: organizationId,
|
|
});
|
|
|
|
if (!membershipOrg) {
|
|
throw new Error("Failed to validate organization membership");
|
|
}
|
|
|
|
if (workspaceName.length < 1) {
|
|
throw new Error("Workspace names must be at least 1-character long");
|
|
}
|
|
|
|
// create workspace and add user as member
|
|
workspace = await create({
|
|
name: workspaceName,
|
|
organizationId,
|
|
});
|
|
|
|
await addMemberships({
|
|
userIds: [req.user._id],
|
|
workspaceId: workspace._id.toString(),
|
|
roles: [ADMIN],
|
|
});
|
|
} catch (err) {
|
|
Sentry.setUser({ email: req.user.email });
|
|
Sentry.captureException(err);
|
|
return res.status(400).send({
|
|
message: "Failed to create workspace",
|
|
});
|
|
}
|
|
|
|
return res.status(200).send({
|
|
workspace,
|
|
});
|
|
};
|
|
|
|
/**
|
|
* Delete workspace with id [workspaceId]
|
|
* @param req
|
|
* @param res
|
|
* @returns
|
|
*/
|
|
export const deleteWorkspace = async (req: Request, res: Response) => {
|
|
try {
|
|
const { workspaceId } = req.params;
|
|
|
|
// delete workspace
|
|
await deleteWork({
|
|
id: workspaceId,
|
|
});
|
|
} catch (err) {
|
|
Sentry.setUser({ email: req.user.email });
|
|
Sentry.captureException(err);
|
|
return res.status(400).send({
|
|
message: "Failed to delete workspace",
|
|
});
|
|
}
|
|
|
|
return res.status(200).send({
|
|
message: "Successfully deleted workspace",
|
|
});
|
|
};
|
|
|
|
/**
|
|
* Change name of workspace with id [workspaceId] to [name]
|
|
* @param req
|
|
* @param res
|
|
* @returns
|
|
*/
|
|
export const changeWorkspaceName = async (req: Request, res: Response) => {
|
|
let workspace;
|
|
try {
|
|
const { workspaceId } = req.params;
|
|
const { name } = req.body;
|
|
|
|
workspace = await Workspace.findOneAndUpdate(
|
|
{
|
|
_id: workspaceId,
|
|
},
|
|
{
|
|
name,
|
|
},
|
|
{
|
|
new: true,
|
|
}
|
|
);
|
|
} catch (err) {
|
|
Sentry.setUser({ email: req.user.email });
|
|
Sentry.captureException(err);
|
|
return res.status(400).send({
|
|
message: "Failed to change workspace name",
|
|
});
|
|
}
|
|
|
|
return res.status(200).send({
|
|
message: "Successfully changed workspace name",
|
|
workspace,
|
|
});
|
|
};
|
|
|
|
/**
|
|
* Return integrations for workspace with id [workspaceId]
|
|
* @param req
|
|
* @param res
|
|
* @returns
|
|
*/
|
|
export const getWorkspaceIntegrations = async (req: Request, res: Response) => {
|
|
let integrations;
|
|
try {
|
|
const { workspaceId } = req.params;
|
|
|
|
integrations = await Integration.find({
|
|
workspace: workspaceId,
|
|
});
|
|
} catch (err) {
|
|
Sentry.setUser({ email: req.user.email });
|
|
Sentry.captureException(err);
|
|
return res.status(400).send({
|
|
message: "Failed to get workspace integrations",
|
|
});
|
|
}
|
|
|
|
return res.status(200).send({
|
|
integrations,
|
|
});
|
|
};
|
|
|
|
/**
|
|
* Return (integration) authorizations for workspace with id [workspaceId]
|
|
* @param req
|
|
* @param res
|
|
* @returns
|
|
*/
|
|
export const getWorkspaceIntegrationAuthorizations = async (
|
|
req: Request,
|
|
res: Response
|
|
) => {
|
|
let authorizations;
|
|
try {
|
|
const { workspaceId } = req.params;
|
|
|
|
authorizations = await IntegrationAuth.find({
|
|
workspace: workspaceId,
|
|
});
|
|
} catch (err) {
|
|
Sentry.setUser({ email: req.user.email });
|
|
Sentry.captureException(err);
|
|
return res.status(400).send({
|
|
message: "Failed to get workspace integration authorizations",
|
|
});
|
|
}
|
|
|
|
return res.status(200).send({
|
|
authorizations,
|
|
});
|
|
};
|
|
|
|
/**
|
|
* Return service service tokens for workspace [workspaceId] belonging to user
|
|
* @param req
|
|
* @param res
|
|
* @returns
|
|
*/
|
|
export const getWorkspaceServiceTokens = async (
|
|
req: Request,
|
|
res: Response
|
|
) => {
|
|
let serviceTokens;
|
|
try {
|
|
const { workspaceId } = req.params;
|
|
// ?? FIX.
|
|
serviceTokens = await ServiceToken.find({
|
|
user: req.user._id,
|
|
workspace: workspaceId,
|
|
});
|
|
} catch (err) {
|
|
Sentry.setUser({ email: req.user.email });
|
|
Sentry.captureException(err);
|
|
return res.status(400).send({
|
|
message: "Failed to get workspace service tokens",
|
|
});
|
|
}
|
|
|
|
return res.status(200).send({
|
|
serviceTokens,
|
|
});
|
|
};
|