Add eslint rule and fix as many issues as possible

This commit is contained in:
Khoa Le
2023-06-19 23:42:04 -04:00
parent e9eacc445d
commit 9d33e4756b
689 changed files with 9446 additions and 21821 deletions
+10 -10
View File
@@ -1,4 +1,4 @@
import { Schema, model, Types } from 'mongoose';
import { Schema, Types, model } from "mongoose";
export interface IAPIKeyData {
name: string;
@@ -12,30 +12,30 @@ const apiKeyDataSchema = new Schema<IAPIKeyData>(
{
name: {
type: String,
required: true
required: true,
},
user: {
type: Schema.Types.ObjectId,
ref: 'User',
required: true
ref: "User",
required: true,
},
lastUsed: {
type: Date
type: Date,
},
expiresAt: {
type: Date
type: Date,
},
secretHash: {
type: String,
required: true,
select: false
}
select: false,
},
},
{
timestamps: true
timestamps: true,
}
);
const APIKeyData = model<IAPIKeyData>('APIKeyData', apiKeyDataSchema);
const APIKeyData = model<IAPIKeyData>("APIKeyData", apiKeyDataSchema);
export default APIKeyData;
+17 -17
View File
@@ -1,9 +1,9 @@
import { Schema, model, Types } from 'mongoose';
import { Schema, Types, model } from "mongoose";
import {
ALGORITHM_AES_256_GCM,
ENCODING_SCHEME_BASE64,
ENCODING_SCHEME_UTF8,
ENCODING_SCHEME_BASE64
} from '../variables';
} from "../variables";
export interface IBackupPrivateKey {
_id: Types.ObjectId;
@@ -13,7 +13,7 @@ export interface IBackupPrivateKey {
tag: string;
salt: string;
algorithm: string;
keyEncoding: 'base64' | 'utf8';
keyEncoding: "base64" | "utf8";
verifier: string;
}
@@ -21,55 +21,55 @@ const backupPrivateKeySchema = new Schema<IBackupPrivateKey>(
{
user: {
type: Schema.Types.ObjectId,
ref: 'User',
required: true
ref: "User",
required: true,
},
encryptedPrivateKey: {
type: String,
select: false,
required: true
required: true,
},
iv: {
type: String,
select: false,
required: true
required: true,
},
tag: {
type: String,
select: false,
required: true
required: true,
},
algorithm: { // the encryption algorithm used
type: String,
enum: [ALGORITHM_AES_256_GCM],
required: true
required: true,
},
keyEncoding: {
type: String,
enum: [
ENCODING_SCHEME_UTF8,
ENCODING_SCHEME_BASE64
ENCODING_SCHEME_BASE64,
],
required: true
required: true,
},
salt: {
type: String,
select: false,
required: true
required: true,
},
verifier: {
type: String,
select: false,
required: true
}
required: true,
},
},
{
timestamps: true
timestamps: true,
}
);
const BackupPrivateKey = model<IBackupPrivateKey>(
'BackupPrivateKey',
"BackupPrivateKey",
backupPrivateKeySchema
);
+19 -20
View File
@@ -1,10 +1,9 @@
import { Schema, model, Types } from 'mongoose';
import { Schema, Types, model } from "mongoose";
import {
ALGORITHM_AES_256_GCM,
ENCODING_SCHEME_BASE64,
ENCODING_SCHEME_UTF8,
ENCODING_SCHEME_HEX,
ENCODING_SCHEME_BASE64
} from '../variables';
} from "../variables";
export interface IBot {
_id: Types.ObjectId;
@@ -15,66 +14,66 @@ export interface IBot {
encryptedPrivateKey: string;
iv: string;
tag: string;
algorithm: 'aes-256-gcm';
keyEncoding: 'base64' | 'utf8';
algorithm: "aes-256-gcm";
keyEncoding: "base64" | "utf8";
}
const botSchema = new Schema<IBot>(
{
name: {
type: String,
required: true
required: true,
},
workspace: {
type: Schema.Types.ObjectId,
ref: 'Workspace',
required: true
ref: "Workspace",
required: true,
},
isActive: {
type: Boolean,
required: true,
default: false
default: false,
},
publicKey: {
type: String,
required: true
required: true,
},
encryptedPrivateKey: {
type: String,
required: true,
select: false
select: false,
},
iv: {
type: String,
required: true,
select: false
select: false,
},
tag: {
type: String,
required: true,
select: false
select: false,
},
algorithm: { // the encryption algorithm used
type: String,
enum: [ALGORITHM_AES_256_GCM],
required: true,
select: false
select: false,
},
keyEncoding: {
type: String,
enum: [
ENCODING_SCHEME_UTF8,
ENCODING_SCHEME_BASE64
ENCODING_SCHEME_BASE64,
],
required: true,
select: false
}
select: false,
},
},
{
timestamps: true
timestamps: true,
}
);
const Bot = model<IBot>('Bot', botSchema);
const Bot = model<IBot>("Bot", botSchema);
export default Bot;
+12 -12
View File
@@ -1,4 +1,4 @@
import { Schema, model, Types } from 'mongoose';
import { Schema, Types, model } from "mongoose";
export interface IBotKey {
_id: Types.ObjectId;
@@ -13,33 +13,33 @@ const botKeySchema = new Schema<IBotKey>(
{
encryptedKey: {
type: String,
required: true
required: true,
},
nonce: {
type: String,
required: true
required: true,
},
sender: {
type: Schema.Types.ObjectId,
ref: 'User',
required: true
ref: "User",
required: true,
},
bot: {
type: Schema.Types.ObjectId,
ref: 'Bot',
required: true
ref: "Bot",
required: true,
},
workspace: {
type: Schema.Types.ObjectId,
ref: 'Workspace',
required: true
}
ref: "Workspace",
required: true,
},
},
{
timestamps: true
timestamps: true,
}
);
const BotKey = model<IBotKey>('BotKey', botKeySchema);
const BotKey = model<IBotKey>("BotKey", botKeySchema);
export default BotKey;
+1 -1
View File
@@ -1,4 +1,4 @@
import { Schema, model, Types } from "mongoose";
import { Schema, Types, model } from "mongoose";
export type TFolderRootSchema = {
_id: Types.ObjectId;
+7 -7
View File
@@ -1,4 +1,4 @@
import { Schema, model, Types } from 'mongoose';
import { Schema, Types, model } from "mongoose";
export interface IIncidentContactOrg {
_id: Types.ObjectId;
@@ -10,21 +10,21 @@ const incidentContactOrgSchema = new Schema<IIncidentContactOrg>(
{
email: {
type: String,
required: true
required: true,
},
organization: {
type: Schema.Types.ObjectId,
ref: 'Organization',
required: true
}
ref: "Organization",
required: true,
},
},
{
timestamps: true
timestamps: true,
}
);
const IncidentContactOrg = model<IIncidentContactOrg>(
'IncidentContactOrg',
"IncidentContactOrg",
incidentContactOrgSchema
);
+26 -26
View File
@@ -1,28 +1,28 @@
import BackupPrivateKey, { IBackupPrivateKey } from './backupPrivateKey';
import Bot, { IBot } from './bot';
import BotKey, { IBotKey } from './botKey';
import IncidentContactOrg, { IIncidentContactOrg } from './incidentContactOrg';
import Integration, { IIntegration } from './integration';
import IntegrationAuth, { IIntegrationAuth } from './integrationAuth';
import Key, { IKey } from './key';
import Membership, { IMembership } from './membership';
import MembershipOrg, { IMembershipOrg } from './membershipOrg';
import Organization, { IOrganization } from './organization';
import Secret, { ISecret } from './secret';
import SecretBlindIndexData, { ISecretBlindIndexData } from './secretBlindIndexData';
import ServiceToken, { IServiceToken } from './serviceToken';
import ServiceAccount, { IServiceAccount } from './serviceAccount'; // new
import ServiceAccountKey, { IServiceAccountKey } from './serviceAccountKey'; // new
import ServiceAccountOrganizationPermission, { IServiceAccountOrganizationPermission } from './serviceAccountOrganizationPermission'; // new
import ServiceAccountWorkspacePermission, { IServiceAccountWorkspacePermission } from './serviceAccountWorkspacePermission'; // new
import TokenData, { ITokenData } from './tokenData';
import User,{ AuthProvider, IUser } from './user';
import UserAction, { IUserAction } from './userAction';
import Workspace, { IWorkspace } from './workspace';
import ServiceTokenData, { IServiceTokenData } from './serviceTokenData';
import APIKeyData, { IAPIKeyData } from './apiKeyData';
import LoginSRPDetail, { ILoginSRPDetail } from './loginSRPDetail';
import TokenVersion, { ITokenVersion } from './tokenVersion';
import BackupPrivateKey, { IBackupPrivateKey } from "./backupPrivateKey";
import Bot, { IBot } from "./bot";
import BotKey, { IBotKey } from "./botKey";
import IncidentContactOrg, { IIncidentContactOrg } from "./incidentContactOrg";
import Integration, { IIntegration } from "./integration";
import IntegrationAuth, { IIntegrationAuth } from "./integrationAuth";
import Key, { IKey } from "./key";
import Membership, { IMembership } from "./membership";
import MembershipOrg, { IMembershipOrg } from "./membershipOrg";
import Organization, { IOrganization } from "./organization";
import Secret, { ISecret } from "./secret";
import SecretBlindIndexData, { ISecretBlindIndexData } from "./secretBlindIndexData";
import ServiceToken, { IServiceToken } from "./serviceToken";
import ServiceAccount, { IServiceAccount } from "./serviceAccount"; // new
import ServiceAccountKey, { IServiceAccountKey } from "./serviceAccountKey"; // new
import ServiceAccountOrganizationPermission, { IServiceAccountOrganizationPermission } from "./serviceAccountOrganizationPermission"; // new
import ServiceAccountWorkspacePermission, { IServiceAccountWorkspacePermission } from "./serviceAccountWorkspacePermission"; // new
import TokenData, { ITokenData } from "./tokenData";
import User,{ AuthProvider, IUser } from "./user";
import UserAction, { IUserAction } from "./userAction";
import Workspace, { IWorkspace } from "./workspace";
import ServiceTokenData, { IServiceTokenData } from "./serviceTokenData";
import APIKeyData, { IAPIKeyData } from "./apiKeyData";
import LoginSRPDetail, { ILoginSRPDetail } from "./loginSRPDetail";
import TokenVersion, { ITokenVersion } from "./tokenVersion";
export {
AuthProvider,
@@ -75,5 +75,5 @@ export {
LoginSRPDetail,
ILoginSRPDetail,
TokenVersion,
ITokenVersion
ITokenVersion,
};
+12 -12
View File
@@ -1,21 +1,21 @@
import { Schema, model, Types } from "mongoose";
import { Schema, Types, model } from "mongoose";
import {
INTEGRATION_AZURE_KEY_VAULT,
INTEGRATION_AWS_PARAMETER_STORE,
INTEGRATION_AWS_SECRET_MANAGER,
INTEGRATION_HEROKU,
INTEGRATION_VERCEL,
INTEGRATION_NETLIFY,
INTEGRATION_AZURE_KEY_VAULT,
INTEGRATION_CHECKLY,
INTEGRATION_CIRCLECI,
INTEGRATION_FLYIO,
INTEGRATION_GITHUB,
INTEGRATION_GITLAB,
INTEGRATION_RENDER,
INTEGRATION_RAILWAY,
INTEGRATION_FLYIO,
INTEGRATION_CIRCLECI,
INTEGRATION_TRAVISCI,
INTEGRATION_SUPABASE,
INTEGRATION_CHECKLY,
INTEGRATION_HASHICORP_VAULT,
INTEGRATION_HEROKU,
INTEGRATION_NETLIFY,
INTEGRATION_RAILWAY,
INTEGRATION_RENDER,
INTEGRATION_SUPABASE,
INTEGRATION_TRAVISCI,
INTEGRATION_VERCEL,
} from "../variables";
export interface IIntegration {
+27 -27
View File
@@ -1,29 +1,29 @@
import { Schema, model, Types, Document } from "mongoose";
import { Document, Schema, Types, model } from "mongoose";
import {
INTEGRATION_AZURE_KEY_VAULT,
ALGORITHM_AES_256_GCM,
ENCODING_SCHEME_BASE64,
ENCODING_SCHEME_UTF8,
INTEGRATION_AWS_PARAMETER_STORE,
INTEGRATION_AWS_SECRET_MANAGER,
INTEGRATION_HEROKU,
INTEGRATION_VERCEL,
INTEGRATION_NETLIFY,
INTEGRATION_AZURE_KEY_VAULT,
INTEGRATION_CIRCLECI,
INTEGRATION_FLYIO,
INTEGRATION_GITHUB,
INTEGRATION_GITLAB,
INTEGRATION_RENDER,
INTEGRATION_RAILWAY,
INTEGRATION_FLYIO,
INTEGRATION_CIRCLECI,
INTEGRATION_TRAVISCI,
INTEGRATION_SUPABASE,
INTEGRATION_HASHICORP_VAULT,
ALGORITHM_AES_256_GCM,
ENCODING_SCHEME_UTF8,
ENCODING_SCHEME_BASE64
INTEGRATION_HEROKU,
INTEGRATION_NETLIFY,
INTEGRATION_RAILWAY,
INTEGRATION_RENDER,
INTEGRATION_SUPABASE,
INTEGRATION_TRAVISCI,
INTEGRATION_VERCEL,
} from "../variables";
export interface IIntegrationAuth extends Document {
_id: Types.ObjectId;
workspace: Types.ObjectId;
integration: 'heroku' | 'vercel' | 'netlify' | 'github' | 'gitlab' | 'render' | 'railway' | 'flyio' | 'azure-key-vault' | 'circleci' | 'travisci' | 'supabase' | 'aws-parameter-store' | 'aws-secret-manager' | 'checkly';
integration: "heroku" | "vercel" | "netlify" | "github" | "gitlab" | "render" | "railway" | "flyio" | "azure-key-vault" | "circleci" | "travisci" | "supabase" | "aws-parameter-store" | "aws-secret-manager" | "checkly";
teamId: string;
accountId: string;
url: string;
@@ -37,8 +37,8 @@ export interface IIntegrationAuth extends Document {
accessCiphertext?: string;
accessIV?: string;
accessTag?: string;
algorithm?: 'aes-256-gcm';
keyEncoding?: 'utf8' | 'base64';
algorithm?: "aes-256-gcm";
keyEncoding?: "utf8" | "base64";
accessExpiresAt?: Date;
}
@@ -66,7 +66,7 @@ const integrationAuthSchema = new Schema<IIntegrationAuth>(
INTEGRATION_CIRCLECI,
INTEGRATION_TRAVISCI,
INTEGRATION_SUPABASE,
INTEGRATION_HASHICORP_VAULT
INTEGRATION_HASHICORP_VAULT,
],
required: true,
},
@@ -76,11 +76,11 @@ const integrationAuthSchema = new Schema<IIntegrationAuth>(
},
url: {
// for any self-hosted integrations (e.g. self-hosted hashicorp-vault)
type: String
type: String,
},
namespace: {
// hashicorp-vault-specific integration param
type: String
type: String,
},
accountId: {
// netlify-specific integration param
@@ -100,15 +100,15 @@ const integrationAuthSchema = new Schema<IIntegrationAuth>(
},
accessIdCiphertext: {
type: String,
select: false
select: false,
},
accessIdIV: {
type: String,
select: false
select: false,
},
accessIdTag: {
type: String,
select: false
select: false,
},
accessCiphertext: {
type: String,
@@ -129,16 +129,16 @@ const integrationAuthSchema = new Schema<IIntegrationAuth>(
algorithm: { // the encryption algorithm used
type: String,
enum: [ALGORITHM_AES_256_GCM],
required: true
required: true,
},
keyEncoding: {
type: String,
enum: [
ENCODING_SCHEME_UTF8,
ENCODING_SCHEME_BASE64
ENCODING_SCHEME_BASE64,
],
required: true
}
required: true,
},
},
{
timestamps: true,
+12 -12
View File
@@ -1,4 +1,4 @@
import { Schema, model, Types } from 'mongoose';
import { Schema, Types, model } from "mongoose";
export interface IKey {
_id: Types.ObjectId;
@@ -13,33 +13,33 @@ const keySchema = new Schema<IKey>(
{
encryptedKey: {
type: String,
required: true
required: true,
},
nonce: {
type: String,
required: true
required: true,
},
sender: {
type: Schema.Types.ObjectId,
ref: 'User',
required: true
ref: "User",
required: true,
},
receiver: {
type: Schema.Types.ObjectId,
ref: 'User',
required: true
ref: "User",
required: true,
},
workspace: {
type: Schema.Types.ObjectId,
ref: 'Workspace',
required: true
}
ref: "Workspace",
required: true,
},
},
{
timestamps: true
timestamps: true,
}
);
const Key = model<IKey>('Key', keySchema);
const Key = model<IKey>("Key", keySchema);
export default Key;
+5 -5
View File
@@ -1,4 +1,4 @@
import mongoose, { Schema, model, Types } from 'mongoose';
import mongoose, { Schema, Types, model } from "mongoose";
export interface ILoginSRPDetail {
_id: Types.ObjectId;
@@ -13,17 +13,17 @@ const loginSRPDetailSchema = new Schema<ILoginSRPDetail>(
{
clientPublicKey: {
type: String,
required: true
required: true,
},
email: {
type: String,
unique: true
unique: true,
},
serverBInt: { type: mongoose.Schema.Types.Buffer },
expireAt: { type: Date }
expireAt: { type: Date },
}
);
const LoginSRPDetail = model('LoginSRPDetail', loginSRPDetailSchema);
const LoginSRPDetail = model("LoginSRPDetail", loginSRPDetailSchema);
export default LoginSRPDetail;
+13 -13
View File
@@ -1,5 +1,5 @@
import { Schema, model, Types } from 'mongoose';
import { ADMIN, MEMBER } from '../variables';
import { Schema, Types, model } from "mongoose";
import { ADMIN, MEMBER } from "../variables";
export interface IMembershipPermission {
environmentSlug: string,
@@ -11,7 +11,7 @@ export interface IMembership {
user: Types.ObjectId;
inviteEmail?: string;
workspace: Types.ObjectId;
role: 'admin' | 'member';
role: "admin" | "member";
deniedPermissions: IMembershipPermission[]
}
@@ -19,15 +19,15 @@ const membershipSchema = new Schema<IMembership>(
{
user: {
type: Schema.Types.ObjectId,
ref: 'User'
ref: "User",
},
inviteEmail: {
type: String
type: String,
},
workspace: {
type: Schema.Types.ObjectId,
ref: 'Workspace',
required: true
ref: "Workspace",
required: true,
},
deniedPermissions: {
type: [
@@ -35,23 +35,23 @@ const membershipSchema = new Schema<IMembership>(
environmentSlug: String,
ability: {
type: String,
enum: ['read', 'write']
enum: ["read", "write"],
},
},
],
default: []
default: [],
},
role: {
type: String,
enum: [ADMIN, MEMBER],
required: true
}
required: true,
},
},
{
timestamps: true
timestamps: true,
}
);
const Membership = model<IMembership>('Membership', membershipSchema);
const Membership = model<IMembership>("Membership", membershipSchema);
export default Membership;
+12 -12
View File
@@ -1,46 +1,46 @@
import { Schema, model, Types, Document } from 'mongoose';
import { OWNER, ADMIN, MEMBER, INVITED, ACCEPTED } from '../variables';
import { Document, Schema, Types, model } from "mongoose";
import { ACCEPTED, ADMIN, INVITED, MEMBER, OWNER } from "../variables";
export interface IMembershipOrg extends Document {
_id: Types.ObjectId;
user: Types.ObjectId;
inviteEmail: string;
organization: Types.ObjectId;
role: 'owner' | 'admin' | 'member';
status: 'invited' | 'accepted';
role: "owner" | "admin" | "member";
status: "invited" | "accepted";
}
const membershipOrgSchema = new Schema(
{
user: {
type: Schema.Types.ObjectId,
ref: 'User'
ref: "User",
},
inviteEmail: {
type: String
type: String,
},
organization: {
type: Schema.Types.ObjectId,
ref: 'Organization'
ref: "Organization",
},
role: {
type: String,
enum: [OWNER, ADMIN, MEMBER],
required: true
required: true,
},
status: {
type: String,
enum: [INVITED, ACCEPTED],
required: true
}
required: true,
},
},
{
timestamps: true
timestamps: true,
}
);
const MembershipOrg = model<IMembershipOrg>(
'MembershipOrg',
"MembershipOrg",
membershipOrgSchema
);
+6 -6
View File
@@ -1,4 +1,4 @@
import { Schema, model, Types } from 'mongoose';
import { Schema, Types, model } from "mongoose";
export interface IOrganization {
_id: Types.ObjectId;
@@ -10,17 +10,17 @@ const organizationSchema = new Schema<IOrganization>(
{
name: {
type: String,
required: true
required: true,
},
customerId: {
type: String
}
type: String,
},
},
{
timestamps: true
timestamps: true,
}
);
const Organization = model<IOrganization>('Organization', organizationSchema);
const Organization = model<IOrganization>("Organization", organizationSchema);
export default Organization;
+4 -4
View File
@@ -1,10 +1,10 @@
import { Schema, model, Types } from "mongoose";
import { Schema, Types, model } from "mongoose";
import {
SECRET_SHARED,
SECRET_PERSONAL,
ALGORITHM_AES_256_GCM,
ENCODING_SCHEME_UTF8,
ENCODING_SCHEME_BASE64,
ENCODING_SCHEME_UTF8,
SECRET_PERSONAL,
SECRET_SHARED,
} from "../variables";
export interface ISecret {
+21 -21
View File
@@ -1,5 +1,5 @@
import mongoose, { Schema, model } from 'mongoose';
import Secret, { ISecret } from './secret';
import mongoose, { Schema, model } from "mongoose";
import Secret, { ISecret } from "./secret";
interface ISecretApprovalRequest {
secret: mongoose.Types.ObjectId;
@@ -18,66 +18,66 @@ interface IApprover {
}
export enum ApprovalStatus {
PENDING = 'pending',
APPROVED = 'approved',
REJECTED = 'rejected'
PENDING = "pending",
APPROVED = "approved",
REJECTED = "rejected"
}
export enum RequestType {
UPDATE = 'update',
DELETE = 'delete',
CREATE = 'create'
UPDATE = "update",
DELETE = "delete",
CREATE = "create"
}
const approverSchema = new mongoose.Schema({
user: {
type: mongoose.Schema.Types.ObjectId,
ref: 'User',
required: true
ref: "User",
required: true,
},
status: {
type: String,
enum: [ApprovalStatus],
default: ApprovalStatus.PENDING
}
default: ApprovalStatus.PENDING,
},
});
const secretApprovalRequestSchema = new Schema<ISecretApprovalRequest>(
{
secret: {
type: mongoose.Schema.Types.ObjectId,
ref: 'Secret'
ref: "Secret",
},
requestedChanges: Secret,
requestedBy: {
type: mongoose.Schema.Types.ObjectId,
ref: 'User'
ref: "User",
},
approvers: [approverSchema],
status: {
type: String,
enum: ApprovalStatus,
default: ApprovalStatus.PENDING
default: ApprovalStatus.PENDING,
},
timestamp: {
type: Date,
default: Date.now
default: Date.now,
},
requestType: {
type: String,
enum: RequestType,
required: true
required: true,
},
requestId: {
type: String,
required: false
}
required: false,
},
},
{
timestamps: true
timestamps: true,
}
);
const SecretApprovalRequest = model<ISecretApprovalRequest>('SecretApprovalRequest', secretApprovalRequestSchema);
const SecretApprovalRequest = model<ISecretApprovalRequest>("SecretApprovalRequest", secretApprovalRequestSchema);
export default SecretApprovalRequest;
+15 -15
View File
@@ -1,9 +1,9 @@
import { Schema, model, Types, Document } from 'mongoose';
import { Document, Schema, Types, model } from "mongoose";
import {
ALGORITHM_AES_256_GCM,
ENCODING_SCHEME_BASE64,
ENCODING_SCHEME_UTF8,
ENCODING_SCHEME_BASE64
} from '../variables';
} from "../variables";
export interface ISecretBlindIndexData extends Document {
_id: Types.ObjectId;
@@ -11,48 +11,48 @@ export interface ISecretBlindIndexData extends Document {
encryptedSaltCiphertext: string;
saltIV: string;
saltTag: string;
algorithm: 'aes-256-gcm';
keyEncoding: 'base64' | 'utf8'
algorithm: "aes-256-gcm";
keyEncoding: "base64" | "utf8"
}
const secretBlindIndexDataSchema = new Schema<ISecretBlindIndexData>(
{
workspace: {
type: Schema.Types.ObjectId,
ref: 'Workspace',
required: true
ref: "Workspace",
required: true,
},
encryptedSaltCiphertext: { // TODO: make these select: false
type: String,
required: true
required: true,
},
saltIV: {
type: String,
required: true
required: true,
},
saltTag: {
type: String,
required: true
required: true,
},
algorithm: {
type: String,
enum: [ALGORITHM_AES_256_GCM],
required: true,
select: false
select: false,
},
keyEncoding: {
type: String,
enum: [
ENCODING_SCHEME_UTF8,
ENCODING_SCHEME_BASE64
ENCODING_SCHEME_BASE64,
],
required: true,
select: false
}
select: false,
},
}
);
const SecretBlindIndexData = model<ISecretBlindIndexData>('SecretBlindIndexData', secretBlindIndexDataSchema);
const SecretBlindIndexData = model<ISecretBlindIndexData>("SecretBlindIndexData", secretBlindIndexDataSchema);
export default SecretBlindIndexData;
+13 -13
View File
@@ -1,4 +1,4 @@
import { Schema, model, Types, Document } from 'mongoose';
import { Document, Schema, Types, model } from "mongoose";
export interface IServiceAccount extends Document {
_id: Types.ObjectId;
@@ -15,39 +15,39 @@ const serviceAccountSchema = new Schema<IServiceAccount>(
{
name: {
type: String,
required: true
required: true,
},
organization: {
type: Schema.Types.ObjectId,
ref: 'Organization',
required: true
ref: "Organization",
required: true,
},
user: { // user who created the service account
type: Schema.Types.ObjectId,
ref: 'User',
required: true
ref: "User",
required: true,
},
publicKey: {
type: String,
required: true
required: true,
},
lastUsed: {
type: Date
type: Date,
},
expiresAt: {
type: Date
type: Date,
},
secretHash: {
type: String,
required: true,
select: false
}
select: false,
},
},
{
timestamps: true
timestamps: true,
}
);
const ServiceAccount = model<IServiceAccount>('ServiceAccount', serviceAccountSchema);
const ServiceAccount = model<IServiceAccount>("ServiceAccount", serviceAccountSchema);
export default ServiceAccount;
+11 -11
View File
@@ -1,4 +1,4 @@
import { Schema, model, Types } from 'mongoose';
import { Schema, Types, model } from "mongoose";
export interface IServiceAccountKey {
_id: Types.ObjectId;
@@ -13,32 +13,32 @@ const serviceAccountKeySchema = new Schema<IServiceAccountKey>(
{
encryptedKey: {
type: String,
required: true
required: true,
},
nonce: {
type: String,
required: true
required: true,
},
sender: {
type: Schema.Types.ObjectId,
required: true
required: true,
},
serviceAccount: {
type: Schema.Types.ObjectId,
ref: 'ServiceAccount',
required: true
ref: "ServiceAccount",
required: true,
},
workspace: {
type: Schema.Types.ObjectId,
ref: 'Workspace',
required: true
}
ref: "Workspace",
required: true,
},
},
{
timestamps: true
timestamps: true,
}
);
const ServiceAccountKey = model<IServiceAccountKey>('ServiceAccountKey', serviceAccountKeySchema);
const ServiceAccountKey = model<IServiceAccountKey>("ServiceAccountKey", serviceAccountKeySchema);
export default ServiceAccountKey;
@@ -1,4 +1,4 @@
import { Schema, model, Types, Document } from 'mongoose';
import { Document, Schema, Types, model } from "mongoose";
export interface IServiceAccountOrganizationPermission extends Document {
_id: Types.ObjectId;
@@ -9,15 +9,15 @@ const serviceAccountOrganizationPermissionSchema = new Schema<IServiceAccountOrg
{
serviceAccount: {
type: Schema.Types.ObjectId,
ref: 'ServiceAccount',
required: true
}
ref: "ServiceAccount",
required: true,
},
},
{
timestamps: true
timestamps: true,
}
);
const ServiceAccountOrganizationPermission = model<IServiceAccountOrganizationPermission>('ServiceAccountOrganizationPermission', serviceAccountOrganizationPermissionSchema);
const ServiceAccountOrganizationPermission = model<IServiceAccountOrganizationPermission>("ServiceAccountOrganizationPermission", serviceAccountOrganizationPermissionSchema);
export default ServiceAccountOrganizationPermission;
@@ -1,4 +1,4 @@
import { Schema, model, Types, Document } from 'mongoose';
import { Document, Schema, Types, model } from "mongoose";
export interface IServiceAccountWorkspacePermission extends Document {
_id: Types.ObjectId;
@@ -13,32 +13,32 @@ const serviceAccountWorkspacePermissionSchema = new Schema<IServiceAccountWorksp
{
serviceAccount: {
type: Schema.Types.ObjectId,
ref: 'ServiceAccount',
required: true
ref: "ServiceAccount",
required: true,
},
workspace:{
type: Schema.Types.ObjectId,
ref: 'Workspace',
required: true
ref: "Workspace",
required: true,
},
environment: {
type: String,
required: true
required: true,
},
read: {
type: Boolean,
default: false
default: false,
},
write: {
type: Boolean,
default: false
}
default: false,
},
},
{
timestamps: true
timestamps: true,
}
);
const ServiceAccountWorkspacePermission = model<IServiceAccountWorkspacePermission>('ServiceAccountWorkspacePermission', serviceAccountWorkspacePermissionSchema);
const ServiceAccountWorkspacePermission = model<IServiceAccountWorkspacePermission>("ServiceAccountWorkspacePermission", serviceAccountWorkspacePermissionSchema);
export default ServiceAccountWorkspacePermission;
+14 -14
View File
@@ -1,4 +1,4 @@
import { Schema, model, Types } from 'mongoose';
import { Schema, Types, model } from "mongoose";
export interface IServiceToken {
_id: Types.ObjectId;
name: string;
@@ -15,47 +15,47 @@ const serviceTokenSchema = new Schema<IServiceToken>(
{
name: {
type: String,
required: true
required: true,
},
user: {
// token issuer
type: Schema.Types.ObjectId,
ref: 'User',
required: true
ref: "User",
required: true,
},
workspace: {
type: Schema.Types.ObjectId,
ref: 'Workspace',
required: true
ref: "Workspace",
required: true,
},
environment: {
type: String,
required: true
required: true,
},
expiresAt: {
type: Date
type: Date,
},
publicKey: {
type: String,
required: true,
select: true
select: true,
},
encryptedKey: {
type: String,
required: true,
select: true
select: true,
},
nonce: {
type: String,
required: true,
select: true
}
select: true,
},
},
{
timestamps: true
timestamps: true,
}
);
const ServiceToken = model<IServiceToken>('ServiceToken', serviceTokenSchema);
const ServiceToken = model<IServiceToken>("ServiceToken", serviceTokenSchema);
export default ServiceToken;
+1 -1
View File
@@ -1,4 +1,4 @@
import { Schema, model, Types, Document } from "mongoose";
import { Document, Schema, Types, model } from "mongoose";
export interface IServiceTokenData extends Document {
_id: Types.ObjectId;
+8 -8
View File
@@ -1,4 +1,4 @@
import { Schema, model, Types } from 'mongoose';
import { Schema, Types, model } from "mongoose";
export interface ITag {
_id: Types.ObjectId;
@@ -22,28 +22,28 @@ const tagSchema = new Schema<ITag>(
lowercase: true,
validate: [
function (value: any) {
return value.indexOf(' ') === -1;
return value.indexOf(" ") === -1;
},
'slug cannot contain spaces'
]
"slug cannot contain spaces",
],
},
user: {
type: Schema.Types.ObjectId,
ref: 'User'
ref: "User",
},
workspace: {
type: Schema.Types.ObjectId,
ref: 'Workspace'
ref: "Workspace",
},
},
{
timestamps: true
timestamps: true,
}
);
tagSchema.index({ slug: 1, workspace: 1 }, { unique: true })
tagSchema.index({ workspace: 1 })
const Tag = model<ITag>('Tag', tagSchema);
const Tag = model<ITag>("Tag", tagSchema);
export default Tag;
+6 -6
View File
@@ -1,4 +1,4 @@
import { Schema, model } from 'mongoose';
import { Schema, model } from "mongoose";
export interface IToken {
email: string;
@@ -10,23 +10,23 @@ export interface IToken {
const tokenSchema = new Schema<IToken>({
email: {
type: String,
required: true
required: true,
},
token: {
type: String,
required: true
required: true,
},
createdAt: {
type: Date,
default: Date.now
default: Date.now,
},
ttl: {
type: Number,
}
},
});
tokenSchema.index({ email: 1 });
const Token = model<IToken>('Token', tokenSchema);
const Token = model<IToken>("Token", tokenSchema);
export default Token;
+15 -15
View File
@@ -1,4 +1,4 @@
import { Schema, Types, model } from 'mongoose';
import { Schema, Types, model } from "mongoose";
export interface ITokenData {
type: string;
@@ -16,40 +16,40 @@ const tokenDataSchema = new Schema<ITokenData>({
type: {
type: String,
enum: [
'emailConfirmation',
'emailMfa',
'organizationInvitation',
'passwordReset'
"emailConfirmation",
"emailMfa",
"organizationInvitation",
"passwordReset",
],
required: true
required: true,
},
email: {
type: String
type: String,
},
phoneNumber: {
type: String
type: String,
},
organization: { // organizationInvitation-specific field
type: Schema.Types.ObjectId,
ref: 'Organization'
ref: "Organization",
},
tokenHash: {
type: String,
select: false,
required: true
required: true,
},
triesLeft: {
type: Number
type: Number,
},
expiresAt: {
type: Date,
expires: 0,
required: true
}
required: true,
},
}, {
timestamps: true
timestamps: true,
});
const TokenData = model<ITokenData>('TokenData', tokenDataSchema);
const TokenData = model<ITokenData>("TokenData", tokenDataSchema);
export default TokenData;
+11 -11
View File
@@ -1,4 +1,4 @@
import { Schema, model, Types, Document } from 'mongoose';
import { Document, Schema, Types, model } from "mongoose";
export interface ITokenVersion extends Document {
user: Types.ObjectId;
@@ -13,35 +13,35 @@ const tokenVersionSchema = new Schema<ITokenVersion>(
{
user: {
type: Schema.Types.ObjectId,
ref: 'User',
required: true
ref: "User",
required: true,
},
ip: {
type: String,
required: true
required: true,
},
userAgent: {
type: String,
required: true
required: true,
},
refreshVersion: {
type: Number,
required: true
required: true,
},
accessVersion: {
type: Number,
required: true
required: true,
},
lastUsed: {
type: Date,
required: true
}
required: true,
},
},
{
timestamps: true
timestamps: true,
}
);
const TokenVersion = model<ITokenVersion>('TokenVersion', tokenVersionSchema);
const TokenVersion = model<ITokenVersion>("TokenVersion", tokenVersionSchema);
export default TokenVersion;
+21 -21
View File
@@ -1,7 +1,7 @@
import { Schema, model, Types, Document } from 'mongoose';
import { Document, Schema, Types, model } from "mongoose";
export enum AuthProvider {
GOOGLE = 'google',
GOOGLE = "google",
}
export interface IUser extends Document {
@@ -44,73 +44,73 @@ const userSchema = new Schema<IUser>(
unique: true,
},
firstName: {
type: String
type: String,
},
lastName: {
type: String
type: String,
},
encryptionVersion: {
type: Number,
select: false,
default: 1 // to resolve backward-compatibility issues
default: 1, // to resolve backward-compatibility issues
},
protectedKey: { // introduced as part of encryption version 2
type: String,
select: false
select: false,
},
protectedKeyIV: { // introduced as part of encryption version 2
type: String,
select: false
select: false,
},
protectedKeyTag: { // introduced as part of encryption version 2
type: String,
select: false
select: false,
},
publicKey: {
type: String,
select: false
select: false,
},
encryptedPrivateKey: {
type: String,
select: false
select: false,
},
iv: { // iv of [encryptedPrivateKey]
type: String,
select: false
select: false,
},
tag: { // tag of [encryptedPrivateKey]
type: String,
select: false
select: false,
},
salt: {
type: String,
select: false
select: false,
},
verifier: {
type: String,
select: false
select: false,
},
isMfaEnabled: {
type: Boolean,
default: false
default: false,
},
mfaMethods: [{
type: String
type: String,
}],
devices: {
type: [{
ip: String,
userAgent: String
userAgent: String,
}],
default: [],
select: false
}
select: false,
},
},
{
timestamps: true
timestamps: true,
}
);
const User = model<IUser>('User', userSchema);
const User = model<IUser>("User", userSchema);
export default User;
+7 -7
View File
@@ -1,4 +1,4 @@
import { Schema, model, Types } from 'mongoose';
import { Schema, Types, model } from "mongoose";
export interface IUserAction {
_id: Types.ObjectId;
@@ -10,19 +10,19 @@ const userActionSchema = new Schema<IUserAction>(
{
user: {
type: Schema.Types.ObjectId,
ref: 'User',
required: true
ref: "User",
required: true,
},
action: {
type: String,
required: true
}
required: true,
},
},
{
timestamps: true
timestamps: true,
}
);
const UserAction = model<IUserAction>('UserAction', userActionSchema);
const UserAction = model<IUserAction>("UserAction", userActionSchema);
export default UserAction;
+9 -9
View File
@@ -1,4 +1,4 @@
import { Schema, model, Types } from 'mongoose';
import { Schema, Types, model } from "mongoose";
export interface IWorkspace {
_id: Types.ObjectId;
@@ -14,7 +14,7 @@ export interface IWorkspace {
const workspaceSchema = new Schema<IWorkspace>({
name: {
type: String,
required: true
required: true,
},
autoCapitalization: {
type: Boolean,
@@ -22,8 +22,8 @@ const workspaceSchema = new Schema<IWorkspace>({
},
organization: {
type: Schema.Types.ObjectId,
ref: 'Organization',
required: true
ref: "Organization",
required: true,
},
environments: {
type: [
@@ -35,20 +35,20 @@ const workspaceSchema = new Schema<IWorkspace>({
default: [
{
name: "Development",
slug: "dev"
slug: "dev",
},
{
name: "Staging",
slug: "staging"
slug: "staging",
},
{
name: "Production",
slug: "prod"
}
slug: "prod",
},
],
},
});
const Workspace = model<IWorkspace>('Workspace', workspaceSchema);
const Workspace = model<IWorkspace>("Workspace", workspaceSchema);
export default Workspace;