CURRENT PLAN
diff --git a/frontend/components/utilities/SecurityClient.js b/frontend/components/utilities/SecurityClient.js
deleted file mode 100644
index 78eebdebe..000000000
--- a/frontend/components/utilities/SecurityClient.js
+++ /dev/null
@@ -1,24 +0,0 @@
-import token from "~/pages/api/auth/Token";
-
-export default class SecurityClient {
- static #token = "";
-
- constructor() {}
-
- static setToken(token) {
- this.#token = token;
- }
-
- static async fetchCall(resource, options) {
- let req = new Request(resource, options);
-
- if (this.#token == "") {
- this.setToken(await token());
- }
-
- if (this.#token) {
- req.headers.set("Authorization", "Bearer " + this.#token);
- return fetch(req);
- }
- }
-}
diff --git a/frontend/components/utilities/SecurityClient.ts b/frontend/components/utilities/SecurityClient.ts
new file mode 100644
index 000000000..ea2664c70
--- /dev/null
+++ b/frontend/components/utilities/SecurityClient.ts
@@ -0,0 +1,27 @@
+import token from '~/pages/api/auth/Token';
+
+export default class SecurityClient {
+ static #token = '';
+
+ constructor() {}
+
+ static setToken(token: string) {
+ this.#token = token;
+ }
+
+ static async fetchCall(
+ resource: RequestInfo,
+ options?: RequestInit | undefined
+ ) {
+ const req = new Request(resource, options);
+
+ if (this.#token == '') {
+ this.setToken(await token());
+ }
+
+ if (this.#token) {
+ req.headers.set('Authorization', 'Bearer ' + this.#token);
+ return fetch(req);
+ }
+ }
+}
diff --git a/frontend/components/utilities/cryptography/issueBackupKey.js b/frontend/components/utilities/cryptography/issueBackupKey.js
deleted file mode 100644
index 19d7ebefa..000000000
--- a/frontend/components/utilities/cryptography/issueBackupKey.js
+++ /dev/null
@@ -1,98 +0,0 @@
-import issueBackupPrivateKey from "~/pages/api/auth/IssueBackupPrivateKey";
-import SRP1 from "~/pages/api/auth/SRP1";
-
-import generateBackupPDF from "../generateBackupPDF";
-import Aes256Gcm from "./aes-256-gcm";
-
-const nacl = require("tweetnacl");
-nacl.util = require("tweetnacl-util");
-const jsrp = require("jsrp");
-const clientPassword = new jsrp.client();
-const clientKey = new jsrp.client();
-const crypto = require("crypto");
-
-/**
- * This function loggs in the user (whether it's right after signup, or a normal login)
- * @param {*} email
- * @param {*} password
- * @param {*} setErrorLogin
- * @param {*} router
- * @param {*} isSignUp
- * @returns
- */
-const issueBackupKey = async ({
- email,
- password,
- personalName,
- setBackupKeyError,
- setBackupKeyIssued,
-}) => {
- try {
- setBackupKeyError(false);
- setBackupKeyIssued(false);
- clientPassword.init(
- {
- username: email,
- password: password,
- },
- async () => {
- const clientPublicKey = clientPassword.getPublicKey();
-
- let serverPublicKey, salt;
- try {
- const res = await SRP1({
- clientPublicKey: clientPublicKey,
- });
- serverPublicKey = res.serverPublicKey;
- salt = res.salt;
- } catch (err) {
- setBackupKeyError(true);
- console.log("Wrong current password", err, 1);
- }
-
- clientPassword.setSalt(salt);
- clientPassword.setServerPublicKey(serverPublicKey);
- const clientProof = clientPassword.getProof(); // called M1
-
- const generatedKey = crypto.randomBytes(16).toString("hex");
-
- clientKey.init(
- {
- username: email,
- password: generatedKey,
- },
- async () => {
- clientKey.createVerifier(async (err, result) => {
- let { ciphertext, iv, tag } = Aes256Gcm.encrypt(
- localStorage.getItem("PRIVATE_KEY"),
- generatedKey
- );
-
- const res = await issueBackupPrivateKey({
- encryptedPrivateKey: ciphertext,
- iv,
- tag,
- salt: result.salt,
- verifier: result.verifier,
- clientProof,
- });
-
- if (res.status == 400) {
- setBackupKeyError(true);
- } else if (res.status == 200) {
- generateBackupPDF(personalName, email, generatedKey);
- setBackupKeyIssued(true);
- }
- });
- }
- );
- }
- );
- } catch (error) {
- setBackupKeyError(true);
- console.log("Failed to issue a backup key");
- }
- return true;
-};
-
-export default issueBackupKey;
diff --git a/frontend/components/utilities/cryptography/issueBackupKey.ts b/frontend/components/utilities/cryptography/issueBackupKey.ts
new file mode 100644
index 000000000..518186406
--- /dev/null
+++ b/frontend/components/utilities/cryptography/issueBackupKey.ts
@@ -0,0 +1,112 @@
+import issueBackupPrivateKey from '~/pages/api/auth/IssueBackupPrivateKey';
+import SRP1 from '~/pages/api/auth/SRP1';
+
+import { tempLocalStorage } from '../checks/tempLocalStorage';
+import generateBackupPDF from '../generateBackupPDF';
+import Aes256Gcm from './aes-256-gcm';
+
+const nacl = require('tweetnacl');
+nacl.util = require('tweetnacl-util');
+const jsrp = require('jsrp');
+const clientPassword = new jsrp.client();
+const clientKey = new jsrp.client();
+const crypto = require('crypto');
+
+interface Props {
+ email: string;
+ password: string;
+ personalName: string;
+ setBackupKeyError: any;
+ setBackupKeyIssued: any;
+}
+
+/**
+ * This function loggs in the user (whether it's right after signup, or a normal login)
+ * @param {*} email
+ * @param {*} password
+ * @param {*} setErrorLogin
+ * @param {*} router
+ * @param {*} isSignUp
+ * @returns
+ */
+const issueBackupKey = async ({
+ email,
+ password,
+ personalName,
+ setBackupKeyError,
+ setBackupKeyIssued
+}: Props) => {
+ try {
+ setBackupKeyError(false);
+ setBackupKeyIssued(false);
+ clientPassword.init(
+ {
+ username: email,
+ password: password
+ },
+ async () => {
+ const clientPublicKey = clientPassword.getPublicKey();
+
+ let serverPublicKey, salt;
+ try {
+ const res = await SRP1({
+ clientPublicKey: clientPublicKey
+ });
+ serverPublicKey = res.serverPublicKey;
+ salt = res.salt;
+ } catch (err) {
+ setBackupKeyError(true);
+ console.log('Wrong current password', err, 1);
+ }
+
+ clientPassword.setSalt(salt);
+ clientPassword.setServerPublicKey(serverPublicKey);
+ const clientProof = clientPassword.getProof(); // called M1
+
+ const generatedKey = crypto.randomBytes(16).toString('hex');
+
+ clientKey.init(
+ {
+ username: email,
+ password: generatedKey
+ },
+ async () => {
+ clientKey.createVerifier(
+ async (_: any, result: { salt: string; verifier: string }) => {
+ // TODO: Fix this
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
+ // @ts-ignore
+ const { ciphertext, iv, tag } = Aes256Gcm.encrypt(
+ tempLocalStorage('PRIVATE_KEY'),
+ generatedKey
+ );
+
+ const res = await issueBackupPrivateKey({
+ encryptedPrivateKey: ciphertext,
+ iv,
+ tag,
+ salt: result.salt,
+ verifier: result.verifier,
+ clientProof
+ });
+
+ if (res && res.status == 400) {
+ setBackupKeyError(true);
+ } else if (res && res.status == 200) {
+ generateBackupPDF(personalName, email, generatedKey);
+ setBackupKeyIssued(true);
+ }
+ }
+ );
+ }
+ );
+ }
+ );
+ } catch (error) {
+ setBackupKeyError(true);
+ console.log('Failed to issue a backup key');
+ }
+ return true;
+};
+
+export default issueBackupKey;
diff --git a/frontend/components/utilities/file.js b/frontend/components/utilities/file.ts
similarity index 74%
rename from frontend/components/utilities/file.js
rename to frontend/components/utilities/file.ts
index 96d1820eb..3784405f9 100644
--- a/frontend/components/utilities/file.js
+++ b/frontend/components/utilities/file.ts
@@ -6,21 +6,21 @@ const LINE =
* @param {Buffer} src - source buffer
* @returns {String} text - text of buffer
*/
-function parse(src) {
- const obj = {};
+function parse(src: Buffer) {
+ const obj: Record
= {};
// Convert buffer to string
let lines = src.toString();
// Convert line breaks to same format
- lines = lines.replace(/\r\n?/gm, "\n");
+ lines = lines.replace(/\r\n?/gm, '\n');
let match;
while ((match = LINE.exec(lines)) != null) {
const key = match[1];
// Default undefined or null to empty string
- let value = match[2] || "";
+ let value = match[2] || '';
// Remove whitespace
value = value.trim();
@@ -29,12 +29,12 @@ function parse(src) {
const maybeQuote = value[0];
// Remove surrounding quotes
- value = value.replace(/^(['"`])([\s\S]*)\1$/gm, "$2");
+ value = value.replace(/^(['"`])([\s\S]*)\1$/gm, '$2');
// Expand newlines if double quoted
if (maybeQuote === '"') {
- value = value.replace(/\\n/g, "\n");
- value = value.replace(/\\r/g, "\r");
+ value = value.replace(/\\n/g, '\n');
+ value = value.replace(/\\r/g, '\r');
}
// Add to object
diff --git a/frontend/components/utilities/randomId.js b/frontend/components/utilities/randomId.ts
similarity index 82%
rename from frontend/components/utilities/randomId.js
rename to frontend/components/utilities/randomId.ts
index 7d1c0859b..8e1c7f972 100644
--- a/frontend/components/utilities/randomId.js
+++ b/frontend/components/utilities/randomId.ts
@@ -3,19 +3,19 @@
* @returns
*/
const guidGenerator = () => {
- var S4 = function () {
+ const S4 = function () {
return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
};
return (
S4() +
S4() +
- "-" +
+ '-' +
S4() +
- "-" +
+ '-' +
S4() +
- "-" +
+ '-' +
S4() +
- "-" +
+ '-' +
S4() +
S4() +
S4()
diff --git a/frontend/components/utilities/secrets/getSecretsForProject.js b/frontend/components/utilities/secrets/getSecretsForProject.ts
similarity index 60%
rename from frontend/components/utilities/secrets/getSecretsForProject.js
rename to frontend/components/utilities/secrets/getSecretsForProject.ts
index 7bdac922f..284b8bee1 100644
--- a/frontend/components/utilities/secrets/getSecretsForProject.js
+++ b/frontend/components/utilities/secrets/getSecretsForProject.ts
@@ -1,22 +1,30 @@
-import getSecrets from "~/pages/api/files/GetSecrets";
+import getSecrets from '~/pages/api/files/GetSecrets';
-import { envMapping } from "../../../public/data/frequentConstants";
-import guidGenerator from "../randomId";
+import { envMapping } from '../../../public/data/frequentConstants';
+import guidGenerator from '../randomId';
const {
decryptAssymmetric,
- decryptSymmetric,
-} = require("../cryptography/crypto");
-const nacl = require("tweetnacl");
-nacl.util = require("tweetnacl-util");
+ decryptSymmetric
+} = require('../cryptography/crypto');
+const nacl = require('tweetnacl');
+nacl.util = require('tweetnacl-util');
+
+interface Props {
+ env: keyof typeof envMapping;
+ setFileState: any;
+ setIsKeyAvailable: any;
+ setData: any;
+ workspaceId: string;
+}
const getSecretsForProject = async ({
env,
setFileState,
setIsKeyAvailable,
setData,
- workspaceId,
-}) => {
+ workspaceId
+}: Props) => {
try {
let file;
try {
@@ -24,44 +32,42 @@ const getSecretsForProject = async ({
setFileState(file);
} catch (error) {
- console.log("ERROR: Not able to access the latest file");
+ console.log('ERROR: Not able to access the latest file');
}
// This is called isKeyAvilable but what it really means is if a person is able to create new key pairs
- setIsKeyAvailable(
- !file.key ? (file.secrets.length == 0 ? true : false) : true
- );
+ setIsKeyAvailable(!file.key ? file.secrets.length == 0 : true);
- const PRIVATE_KEY = localStorage.getItem("PRIVATE_KEY");
+ const PRIVATE_KEY = localStorage.getItem('PRIVATE_KEY');
- let tempFileState = [];
+ const tempFileState: { key: string; value: string; type: string }[] = [];
if (file.key) {
// assymmetrically decrypt symmetric key with local private key
const key = decryptAssymmetric({
ciphertext: file.key.encryptedKey,
nonce: file.key.nonce,
publicKey: file.key.sender.publicKey,
- privateKey: PRIVATE_KEY,
+ privateKey: PRIVATE_KEY
});
- file.secrets.map((secretPair) => {
+ file.secrets.map((secretPair: any) => {
// decrypt .env file with symmetric key
const plainTextKey = decryptSymmetric({
ciphertext: secretPair.secretKey.ciphertext,
iv: secretPair.secretKey.iv,
tag: secretPair.secretKey.tag,
- key,
+ key
});
const plainTextValue = decryptSymmetric({
ciphertext: secretPair.secretValue.ciphertext,
iv: secretPair.secretValue.iv,
tag: secretPair.secretValue.tag,
- key,
+ key
});
tempFileState.push({
key: plainTextKey,
value: plainTextValue,
- type: secretPair.type,
+ type: secretPair.type
});
});
}
@@ -71,9 +77,9 @@ const getSecretsForProject = async ({
tempFileState.map((line, index) => [
guidGenerator(),
index,
- line["key"],
- line["value"],
- line["type"],
+ line['key'],
+ line['value'],
+ line['type']
])
// .sort((a, b) =>
// sortMethod == "alphabetical"
@@ -84,12 +90,12 @@ const getSecretsForProject = async ({
return tempFileState.map((line, index) => [
guidGenerator(),
index,
- line["key"],
- line["value"],
- line["type"],
+ line['key'],
+ line['value'],
+ line['type']
]);
} catch (error) {
- console.log("Something went wrong during accessing or decripting secrets.");
+ console.log('Something went wrong during accessing or decripting secrets.');
}
return true;
};
diff --git a/frontend/components/utilities/secrets/pushKeysIntegration.js b/frontend/components/utilities/secrets/pushKeysIntegration.js
deleted file mode 100644
index 5b08748e7..000000000
--- a/frontend/components/utilities/secrets/pushKeysIntegration.js
+++ /dev/null
@@ -1,74 +0,0 @@
-import publicKeyInfical from "~/pages/api/auth/publicKeyInfisical";
-import changeHerokuConfigVars from "~/pages/api/integrations/ChangeHerokuConfigVars";
-
-const crypto = require("crypto");
-const {
- encryptSymmetric,
- encryptAssymmetric,
-} = require("../cryptography/crypto");
-const nacl = require("tweetnacl");
-nacl.util = require("tweetnacl-util");
-
-const pushKeysIntegration = async ({ obj, integrationId }) => {
- const PRIVATE_KEY = localStorage.getItem("PRIVATE_KEY");
-
- let randomBytes = crypto.randomBytes(16).toString("hex");
-
- const secrets = Object.keys(obj).map((key) => {
- // encrypt key
- const {
- ciphertext: ciphertextKey,
- iv: ivKey,
- tag: tagKey,
- } = encryptSymmetric({
- plaintext: key,
- key: randomBytes,
- });
-
- // encrypt value
- const {
- ciphertext: ciphertextValue,
- iv: ivValue,
- tag: tagValue,
- } = encryptSymmetric({
- plaintext: obj[key],
- key: randomBytes,
- });
-
- const visibility = "shared";
-
- return {
- ciphertextKey,
- ivKey,
- tagKey,
- hashKey: crypto.createHash("sha256").update(key).digest("hex"),
- ciphertextValue,
- ivValue,
- tagValue,
- hashValue: crypto.createHash("sha256").update(obj[key]).digest("hex"),
- type: visibility,
- };
- });
-
- // obtain public keys of all receivers (i.e. members in workspace)
- let publicKeyInfisical = await publicKeyInfical();
-
- publicKeyInfisical = (await publicKeyInfisical.json()).publicKey;
-
- // assymmetrically encrypt key with each receiver public keys
-
- const { ciphertext, nonce } = encryptAssymmetric({
- plaintext: randomBytes,
- publicKey: publicKeyInfisical,
- privateKey: PRIVATE_KEY,
- });
-
- const key = {
- encryptedKey: ciphertext,
- nonce,
- };
-
- changeHerokuConfigVars({ integrationId, key, secrets });
-};
-
-export default pushKeysIntegration;
diff --git a/frontend/components/utilities/secrets/pushKeysIntegration.ts b/frontend/components/utilities/secrets/pushKeysIntegration.ts
new file mode 100644
index 000000000..949778927
--- /dev/null
+++ b/frontend/components/utilities/secrets/pushKeysIntegration.ts
@@ -0,0 +1,79 @@
+import publicKeyInfical from '~/pages/api/auth/publicKeyInfisical';
+import changeHerokuConfigVars from '~/pages/api/integrations/ChangeHerokuConfigVars';
+
+const crypto = require('crypto');
+const {
+ encryptSymmetric,
+ encryptAssymmetric
+} = require('../cryptography/crypto');
+const nacl = require('tweetnacl');
+nacl.util = require('tweetnacl-util');
+
+interface Props {
+ obj: Record;
+ integrationId: string;
+}
+
+const pushKeysIntegration = async ({ obj, integrationId }: Props) => {
+ const PRIVATE_KEY = localStorage.getItem('PRIVATE_KEY');
+
+ const randomBytes = crypto.randomBytes(16).toString('hex');
+
+ const secrets = Object.keys(obj).map((key) => {
+ // encrypt key
+ const {
+ ciphertext: ciphertextKey,
+ iv: ivKey,
+ tag: tagKey
+ } = encryptSymmetric({
+ plaintext: key,
+ key: randomBytes
+ });
+
+ // encrypt value
+ const {
+ ciphertext: ciphertextValue,
+ iv: ivValue,
+ tag: tagValue
+ } = encryptSymmetric({
+ plaintext: obj[key],
+ key: randomBytes
+ });
+
+ const visibility = 'shared';
+
+ return {
+ ciphertextKey,
+ ivKey,
+ tagKey,
+ hashKey: crypto.createHash('sha256').update(key).digest('hex'),
+ ciphertextValue,
+ ivValue,
+ tagValue,
+ hashValue: crypto.createHash('sha256').update(obj[key]).digest('hex'),
+ type: visibility
+ };
+ });
+
+ // obtain public keys of all receivers (i.e. members in workspace)
+ const publicKeyInfisical = await publicKeyInfical();
+
+ const publicKey = (await publicKeyInfisical.json()).publicKey;
+
+ // assymmetrically encrypt key with each receiver public keys
+
+ const { ciphertext, nonce } = encryptAssymmetric({
+ plaintext: randomBytes,
+ publicKey,
+ privateKey: PRIVATE_KEY
+ });
+
+ const key = {
+ encryptedKey: ciphertext,
+ nonce
+ };
+
+ changeHerokuConfigVars({ integrationId, key, secrets });
+};
+
+export default pushKeysIntegration;
diff --git a/frontend/pages/api/auth/ChangePassword2.js b/frontend/pages/api/auth/ChangePassword2.ts
similarity index 50%
rename from frontend/pages/api/auth/ChangePassword2.js
rename to frontend/pages/api/auth/ChangePassword2.ts
index b764e6067..132eeddf4 100644
--- a/frontend/pages/api/auth/ChangePassword2.js
+++ b/frontend/pages/api/auth/ChangePassword2.ts
@@ -1,4 +1,13 @@
-import SecurityClient from "~/utilities/SecurityClient";
+import SecurityClient from '~/utilities/SecurityClient';
+
+interface Props {
+ encryptedPrivateKey: string;
+ iv: string;
+ tag: string;
+ salt: string;
+ verifier: string;
+ clientProof: string;
+}
/**
* This is the second step of the change password process (pake)
@@ -11,12 +20,12 @@ const changePassword2 = ({
tag,
salt,
verifier,
- clientProof,
-}) => {
- return SecurityClient.fetchCall("/api/v1/password/change-password", {
- method: "POST",
+ clientProof
+}: Props) => {
+ return SecurityClient.fetchCall('/api/v1/password/change-password', {
+ method: 'POST',
headers: {
- "Content-Type": "application/json",
+ 'Content-Type': 'application/json'
},
body: JSON.stringify({
clientProof: clientProof,
@@ -24,13 +33,13 @@ const changePassword2 = ({
iv: iv,
tag: tag,
salt: salt,
- verifier: verifier,
- }),
+ verifier: verifier
+ })
}).then(async (res) => {
- if (res.status == 200) {
+ if (res && res.status == 200) {
return res;
} else {
- console.log("Failed to change the password");
+ console.log('Failed to change the password');
}
});
};
diff --git a/frontend/pages/api/auth/CheckAuth.js b/frontend/pages/api/auth/CheckAuth.ts
similarity index 50%
rename from frontend/pages/api/auth/CheckAuth.js
rename to frontend/pages/api/auth/CheckAuth.ts
index edd373614..6d9c92c54 100644
--- a/frontend/pages/api/auth/CheckAuth.js
+++ b/frontend/pages/api/auth/CheckAuth.ts
@@ -1,4 +1,4 @@
-import SecurityClient from "~/utilities/SecurityClient.js";
+import SecurityClient from '~/utilities/SecurityClient.js';
/**
* This function is used to check if the user is authenticated.
@@ -7,17 +7,17 @@ import SecurityClient from "~/utilities/SecurityClient.js";
* @param {*} res
* @returns
*/
-const checkAuth = async (req, res) => {
- return SecurityClient.fetchCall("/api/v1/auth/checkAuth", {
- method: "POST",
+const checkAuth = async () => {
+ return SecurityClient.fetchCall('/api/v1/auth/checkAuth', {
+ method: 'POST',
headers: {
- "Content-Type": "application/json",
- },
+ 'Content-Type': 'application/json'
+ }
}).then((res) => {
- if (res.status == 200) {
+ if (res && res.status == 200) {
return res;
} else {
- console.log("Not authorized");
+ console.log('Not authorized');
}
});
};
diff --git a/frontend/pages/api/auth/CheckEmailVerificationCode.js b/frontend/pages/api/auth/CheckEmailVerificationCode.ts
similarity index 50%
rename from frontend/pages/api/auth/CheckEmailVerificationCode.js
rename to frontend/pages/api/auth/CheckEmailVerificationCode.ts
index 83a64602a..08fb6b391 100644
--- a/frontend/pages/api/auth/CheckEmailVerificationCode.js
+++ b/frontend/pages/api/auth/CheckEmailVerificationCode.ts
@@ -1,19 +1,24 @@
+interface Props {
+ email: string;
+ code: string;
+}
+
/**
* This route check the verification code from the email that user just recieved
* @param {*} email
* @param {*} code
* @returns
*/
-const checkEmailVerificationCode = (email, code) => {
- return fetch("/api/v1/signup/email/verify", {
- method: "POST",
+const checkEmailVerificationCode = ({ email, code }: Props) => {
+ return fetch('/api/v1/signup/email/verify', {
+ method: 'POST',
headers: {
- "Content-Type": "application/json",
+ 'Content-Type': 'application/json'
},
body: JSON.stringify({
email: email,
- code: code,
- }),
+ code: code
+ })
});
};
diff --git a/frontend/pages/api/auth/CompleteAccountInformationSignup.js b/frontend/pages/api/auth/CompleteAccountInformationSignup.ts
similarity index 64%
rename from frontend/pages/api/auth/CompleteAccountInformationSignup.js
rename to frontend/pages/api/auth/CompleteAccountInformationSignup.ts
index 21406e381..98e78dec9 100644
--- a/frontend/pages/api/auth/CompleteAccountInformationSignup.js
+++ b/frontend/pages/api/auth/CompleteAccountInformationSignup.ts
@@ -1,3 +1,17 @@
+interface Props {
+ email: string;
+ firstName: string;
+ lastName: string;
+ publicKey: string;
+ ciphertext: string;
+ organizationName: string;
+ iv: string;
+ tag: string;
+ salt: string;
+ verifier: string;
+ token: string;
+}
+
/**
* This function is called in the end of the signup process.
* It sends all the necessary nformation to the server.
@@ -24,13 +38,13 @@ const completeAccountInformationSignup = ({
tag,
salt,
verifier,
- token,
-}) => {
- return fetch("/api/v1/signup/complete-account/signup", {
- method: "POST",
+ token
+}: Props) => {
+ return fetch('/api/v1/signup/complete-account/signup', {
+ method: 'POST',
headers: {
- "Content-Type": "application/json",
- Authorization: "Bearer " + token,
+ 'Content-Type': 'application/json',
+ Authorization: 'Bearer ' + token
},
body: JSON.stringify({
email,
@@ -42,8 +56,8 @@ const completeAccountInformationSignup = ({
iv,
tag,
salt,
- verifier,
- }),
+ verifier
+ })
});
};
diff --git a/frontend/pages/api/auth/CompleteAccountInformationSignupInvite.js b/frontend/pages/api/auth/CompleteAccountInformationSignupInvite.ts
similarity index 64%
rename from frontend/pages/api/auth/CompleteAccountInformationSignupInvite.js
rename to frontend/pages/api/auth/CompleteAccountInformationSignupInvite.ts
index a205e6f59..1e5abdc45 100644
--- a/frontend/pages/api/auth/CompleteAccountInformationSignupInvite.js
+++ b/frontend/pages/api/auth/CompleteAccountInformationSignupInvite.ts
@@ -1,3 +1,16 @@
+interface Props {
+ email: string;
+ firstName: string;
+ lastName: string;
+ publicKey: string;
+ ciphertext: string;
+ iv: string;
+ tag: string;
+ salt: string;
+ verifier: string;
+ token: string;
+}
+
/**
* This function is called in the end of the signup process.
* It sends all the necessary nformation to the server.
@@ -22,13 +35,13 @@ const completeAccountInformationSignupInvite = ({
tag,
salt,
verifier,
- token,
-}) => {
- return fetch("/api/v1/signup/complete-account/invite", {
- method: "POST",
+ token
+}: Props) => {
+ return fetch('/api/v1/signup/complete-account/invite', {
+ method: 'POST',
headers: {
- "Content-Type": "application/json",
- Authorization: "Bearer " + token,
+ 'Content-Type': 'application/json',
+ Authorization: 'Bearer ' + token
},
body: JSON.stringify({
email: email,
@@ -39,8 +52,8 @@ const completeAccountInformationSignupInvite = ({
iv: iv,
tag: tag,
salt: salt,
- verifier: verifier,
- }),
+ verifier: verifier
+ })
});
};
diff --git a/frontend/pages/api/auth/IssueBackupPrivateKey.js b/frontend/pages/api/auth/IssueBackupPrivateKey.js
deleted file mode 100644
index 9a31f7b00..000000000
--- a/frontend/pages/api/auth/IssueBackupPrivateKey.js
+++ /dev/null
@@ -1,40 +0,0 @@
-import SecurityClient from "~/utilities/SecurityClient";
-
-/**
- * This is the route that issues a backup private key that will afterwards be added into a pdf
- */
-const issueBackupPrivateKey = ({
- encryptedPrivateKey,
- iv,
- tag,
- salt,
- verifier,
- clientProof,
-}) => {
- return SecurityClient.fetchCall(
- "/api/v1/password/backup-private-key",
- {
- method: "POST",
- headers: {
- "Content-Type": "application/json",
- },
- body: JSON.stringify({
- clientProof: clientProof,
- encryptedPrivateKey: encryptedPrivateKey,
- iv: iv,
- tag: tag,
- salt: salt,
- verifier: verifier,
- }),
- }
- ).then((res) => {
- if (res.status == 200) {
- return res;
- } else {
- console.log("Failed to issue the backup key");
- return res;
- }
- });
-};
-
-export default issueBackupPrivateKey;
diff --git a/frontend/pages/api/auth/IssueBackupPrivateKey.ts b/frontend/pages/api/auth/IssueBackupPrivateKey.ts
new file mode 100644
index 000000000..9b300f55b
--- /dev/null
+++ b/frontend/pages/api/auth/IssueBackupPrivateKey.ts
@@ -0,0 +1,44 @@
+import SecurityClient from '~/utilities/SecurityClient';
+
+interface Props {
+ encryptedPrivateKey: string;
+ iv: string;
+ tag: string;
+ salt: string;
+ verifier: string;
+ clientProof: string;
+}
+
+/**
+ * This is the route that issues a backup private key that will afterwards be added into a pdf
+ */
+const issueBackupPrivateKey = ({
+ encryptedPrivateKey,
+ iv,
+ tag,
+ salt,
+ verifier,
+ clientProof
+}: Props) => {
+ return SecurityClient.fetchCall('/api/v1/password/backup-private-key', {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json'
+ },
+ body: JSON.stringify({
+ clientProof: clientProof,
+ encryptedPrivateKey: encryptedPrivateKey,
+ iv: iv,
+ tag: tag,
+ salt: salt,
+ verifier: verifier
+ })
+ }).then((res) => {
+ if (res?.status !== 200) {
+ console.log('Failed to issue the backup key');
+ }
+ return res;
+ });
+};
+
+export default issueBackupPrivateKey;
diff --git a/frontend/pages/api/auth/SRP1.js b/frontend/pages/api/auth/SRP1.js
deleted file mode 100644
index b0fefb857..000000000
--- a/frontend/pages/api/auth/SRP1.js
+++ /dev/null
@@ -1,26 +0,0 @@
-import SecurityClient from "~/utilities/SecurityClient";
-
-/**
- * This is the first step of the change password process (pake)
- * @param {*} clientPublicKey
- * @returns
- */
-const SRP1 = ({ clientPublicKey }) => {
- return SecurityClient.fetchCall("/api/v1/password/srp1", {
- method: "POST",
- headers: {
- "Content-Type": "application/json",
- },
- body: JSON.stringify({
- clientPublicKey,
- }),
- }).then(async (res) => {
- if (res.status == 200) {
- return await res.json();
- } else {
- console.log("Failed to do the first step of SRP");
- }
- });
-};
-
-export default SRP1;
diff --git a/frontend/pages/api/auth/SRP1.ts b/frontend/pages/api/auth/SRP1.ts
new file mode 100644
index 000000000..292dcbdd1
--- /dev/null
+++ b/frontend/pages/api/auth/SRP1.ts
@@ -0,0 +1,30 @@
+import SecurityClient from '~/utilities/SecurityClient';
+
+interface Props {
+ clientPublicKey: string;
+}
+
+/**
+ * This is the first step of the change password process (pake)
+ * @param {*} clientPublicKey
+ * @returns
+ */
+const SRP1 = ({ clientPublicKey }: Props) => {
+ return SecurityClient.fetchCall('/api/v1/password/srp1', {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json'
+ },
+ body: JSON.stringify({
+ clientPublicKey
+ })
+ }).then(async (res) => {
+ if (res && res.status == 200) {
+ return await res.json();
+ } else {
+ console.log('Failed to do the first step of SRP');
+ }
+ });
+};
+
+export default SRP1;
diff --git a/frontend/pages/api/auth/SendVerificationEmail.js b/frontend/pages/api/auth/SendVerificationEmail.ts
similarity index 55%
rename from frontend/pages/api/auth/SendVerificationEmail.js
rename to frontend/pages/api/auth/SendVerificationEmail.ts
index ae952852d..4f3b063c6 100644
--- a/frontend/pages/api/auth/SendVerificationEmail.js
+++ b/frontend/pages/api/auth/SendVerificationEmail.ts
@@ -2,15 +2,15 @@
* This route send the verification email to the user's email (contains a 6-digit verification code)
* @param {*} email
*/
-const sendVerificationEmail = (email) => {
- fetch("/api/v1/signup/email/signup", {
- method: "POST",
+const sendVerificationEmail = (email: string) => {
+ fetch('/api/v1/signup/email/signup', {
+ method: 'POST',
headers: {
- "Content-Type": "application/json",
+ 'Content-Type': 'application/json'
},
body: JSON.stringify({
- email: email,
- }),
+ email: email
+ })
});
};
diff --git a/frontend/pages/api/auth/Token.js b/frontend/pages/api/auth/Token.js
deleted file mode 100644
index c3e5fd958..000000000
--- a/frontend/pages/api/auth/Token.js
+++ /dev/null
@@ -1,17 +0,0 @@
-const token = async (req, res) => {
- return fetch("/api/v1/auth/token", {
- method: "POST",
- headers: {
- "Content-Type": "application/json",
- },
- credentials: "include",
- }).then(async (res) => {
- if (res.status == 200) {
- return (await res.json()).token;
- } else {
- console.log("Getting a new token failed");
- }
- });
-};
-
-export default token;
diff --git a/frontend/pages/api/auth/Token.ts b/frontend/pages/api/auth/Token.ts
new file mode 100644
index 000000000..ed347ba4b
--- /dev/null
+++ b/frontend/pages/api/auth/Token.ts
@@ -0,0 +1,17 @@
+const token = async () => {
+ return fetch('/api/v1/auth/token', {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json'
+ },
+ credentials: 'include'
+ }).then(async (res) => {
+ if (res.status == 200) {
+ return (await res.json()).token;
+ } else {
+ console.log('Getting a new token failed');
+ }
+ });
+};
+
+export default token;
diff --git a/frontend/pages/api/auth/VerifySignupInvite.js b/frontend/pages/api/auth/VerifySignupInvite.js
deleted file mode 100644
index 2a9ba4dcd..000000000
--- a/frontend/pages/api/auth/VerifySignupInvite.js
+++ /dev/null
@@ -1,20 +0,0 @@
-/**
- * This route verifies the signup invite link
- * @param {*} email
- * @param {*} code
- * @returns
- */
-const verifySignupInvite = ({ email, code }) => {
- return fetch("/api/v1/invite-org/verify", {
- method: "POST",
- headers: {
- "Content-Type": "application/json",
- },
- body: JSON.stringify({
- email,
- code,
- }),
- });
-};
-
-export default verifySignupInvite;
diff --git a/frontend/pages/api/auth/VerifySignupInvite.ts b/frontend/pages/api/auth/VerifySignupInvite.ts
new file mode 100644
index 000000000..20e52dfd1
--- /dev/null
+++ b/frontend/pages/api/auth/VerifySignupInvite.ts
@@ -0,0 +1,25 @@
+interface Props {
+ email: string;
+ code: string;
+}
+
+/**
+ * This route verifies the signup invite link
+ * @param {*} email
+ * @param {*} code
+ * @returns
+ */
+const verifySignupInvite = ({ email, code }: Props) => {
+ return fetch('/api/v1/invite-org/verify', {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json'
+ },
+ body: JSON.stringify({
+ email,
+ code
+ })
+ });
+};
+
+export default verifySignupInvite;
diff --git a/frontend/pages/api/auth/publicKeyInfisical.js b/frontend/pages/api/auth/publicKeyInfisical.js
deleted file mode 100644
index 76cad1726..000000000
--- a/frontend/pages/api/auth/publicKeyInfisical.js
+++ /dev/null
@@ -1,16 +0,0 @@
-/**
- * This route lets us get the public key of infisical. Th euser doesn't have to be authenticated since this is just the public key.
- * @param {*} req
- * @param {*} res
- * @returns
- */
-const publicKeyInfisical = (req, res) => {
- return fetch("/api/v1/key/publicKey/infisical", {
- method: "GET",
- headers: {
- "Content-Type": "application/json",
- },
- });
-};
-
-export default publicKeyInfisical;
diff --git a/frontend/pages/api/auth/publicKeyInfisical.ts b/frontend/pages/api/auth/publicKeyInfisical.ts
new file mode 100644
index 000000000..d3e0f646c
--- /dev/null
+++ b/frontend/pages/api/auth/publicKeyInfisical.ts
@@ -0,0 +1,10 @@
+const publicKeyInfisical = () => {
+ return fetch('/api/v1/key/publicKey/infisical', {
+ method: 'GET',
+ headers: {
+ 'Content-Type': 'application/json'
+ }
+ });
+};
+
+export default publicKeyInfisical;
diff --git a/frontend/pages/api/files/GetSecrets.js b/frontend/pages/api/files/GetSecrets.ts
similarity index 53%
rename from frontend/pages/api/files/GetSecrets.js
rename to frontend/pages/api/files/GetSecrets.ts
index fa91d0962..4e33e19f2 100644
--- a/frontend/pages/api/files/GetSecrets.js
+++ b/frontend/pages/api/files/GetSecrets.ts
@@ -1,4 +1,4 @@
-import SecurityClient from "~/utilities/SecurityClient.js";
+import SecurityClient from '~/utilities/SecurityClient.js';
/**
* This function fetches the encrypted secrets from the .env file
@@ -6,26 +6,26 @@ import SecurityClient from "~/utilities/SecurityClient.js";
* @param {*} env
* @returns
*/
-const getSecrets = async (workspaceId, env) => {
+const getSecrets = async (workspaceId: string, env: string) => {
return SecurityClient.fetchCall(
- "/api/v1/secret/" +
+ '/api/v1/secret/' +
workspaceId +
- "?" +
+ '?' +
new URLSearchParams({
environment: env,
- channel: "web",
+ channel: 'web'
}),
{
- method: "GET",
+ method: 'GET',
headers: {
- "Content-Type": "application/json",
- },
+ 'Content-Type': 'application/json'
+ }
}
).then(async (res) => {
- if (res.status == 200) {
+ if (res && res.status == 200) {
return await res.json();
} else {
- console.log("Failed to get project secrets");
+ console.log('Failed to get project secrets');
}
});
};
diff --git a/frontend/pages/api/files/UploadSecrets.js b/frontend/pages/api/files/UploadSecrets.js
deleted file mode 100644
index c2f94e64d..000000000
--- a/frontend/pages/api/files/UploadSecrets.js
+++ /dev/null
@@ -1,30 +0,0 @@
-import SecurityClient from "~/utilities/SecurityClient";
-
-/**
- * This function uploads the encrypted .env file
- * @param {*} req
- * @param {*} res
- * @returns
- */
-const uploadSecrets = async ({ workspaceId, secrets, keys, environment }) => {
- return SecurityClient.fetchCall("/api/v1/secret/" + workspaceId, {
- method: "POST",
- headers: {
- "Content-Type": "application/json",
- },
- body: JSON.stringify({
- secrets,
- keys,
- environment,
- channel: "web",
- }),
- }).then(async (res) => {
- if (res.status == 200) {
- return res;
- } else {
- console.log("Failed to push secrets");
- }
- });
-};
-
-export default uploadSecrets;
diff --git a/frontend/pages/api/files/UploadSecrets.ts b/frontend/pages/api/files/UploadSecrets.ts
new file mode 100644
index 000000000..53b87d62f
--- /dev/null
+++ b/frontend/pages/api/files/UploadSecrets.ts
@@ -0,0 +1,42 @@
+import SecurityClient from '~/utilities/SecurityClient';
+
+interface Props {
+ workspaceId: string;
+ secrets: string;
+ keys: string;
+ environment: string;
+}
+
+/**
+ * This function uploads the encrypted .env file
+ * @param {*} req
+ * @param {*} res
+ * @returns
+ */
+const uploadSecrets = async ({
+ workspaceId,
+ secrets,
+ keys,
+ environment
+}: Props) => {
+ return SecurityClient.fetchCall('/api/v1/secret/' + workspaceId, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json'
+ },
+ body: JSON.stringify({
+ secrets,
+ keys,
+ environment,
+ channel: 'web'
+ })
+ }).then(async (res) => {
+ if (res && res.status == 200) {
+ return res;
+ } else {
+ console.log('Failed to push secrets');
+ }
+ });
+};
+
+export default uploadSecrets;
diff --git a/frontend/pages/api/integrations/ChangeHerokuConfigVars.js b/frontend/pages/api/integrations/ChangeHerokuConfigVars.js
deleted file mode 100644
index 118848ae6..000000000
--- a/frontend/pages/api/integrations/ChangeHerokuConfigVars.js
+++ /dev/null
@@ -1,25 +0,0 @@
-import SecurityClient from "~/utilities/SecurityClient";
-
-const changeHerokuConfigVars = ({ integrationId, key, secrets }) => {
- return SecurityClient.fetchCall(
- "/api/v1/integration/" + integrationId + "/sync",
- {
- method: "POST",
- headers: {
- "Content-Type": "application/json",
- },
- body: JSON.stringify({
- key,
- secrets,
- }),
- }
- ).then(async (res) => {
- if (res.status == 200) {
- return res;
- } else {
- console.log("Failed to sync secrets to Heroku");
- }
- });
-};
-
-export default changeHerokuConfigVars;
diff --git a/frontend/pages/api/integrations/ChangeHerokuConfigVars.ts b/frontend/pages/api/integrations/ChangeHerokuConfigVars.ts
new file mode 100644
index 000000000..854e614e0
--- /dev/null
+++ b/frontend/pages/api/integrations/ChangeHerokuConfigVars.ts
@@ -0,0 +1,31 @@
+import SecurityClient from '~/utilities/SecurityClient';
+
+interface Props {
+ integrationId: string;
+ key: string;
+ secrets: string;
+}
+
+const changeHerokuConfigVars = ({ integrationId, key, secrets }: Props) => {
+ return SecurityClient.fetchCall(
+ '/api/v1/integration/' + integrationId + '/sync',
+ {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json'
+ },
+ body: JSON.stringify({
+ key,
+ secrets
+ })
+ }
+ ).then(async (res) => {
+ if (res && res.status == 200) {
+ return res;
+ } else {
+ console.log('Failed to sync secrets to Heroku');
+ }
+ });
+};
+
+export default changeHerokuConfigVars;
diff --git a/frontend/pages/api/integrations/DeleteIntegration.js b/frontend/pages/api/integrations/DeleteIntegration.js
deleted file mode 100644
index 7698d7eae..000000000
--- a/frontend/pages/api/integrations/DeleteIntegration.js
+++ /dev/null
@@ -1,26 +0,0 @@
-import SecurityClient from "~/utilities/SecurityClient";
-
-/**
- * This route deletes an integration from a certain project
- * @param {*} integrationId
- * @returns
- */
-const deleteIntegration = ({ integrationId }) => {
- return SecurityClient.fetchCall(
- "/api/v1/integration/" + integrationId,
- {
- method: "DELETE",
- headers: {
- "Content-Type": "application/json",
- },
- }
- ).then(async (res) => {
- if (res.status == 200) {
- return (await res.json()).workspace;
- } else {
- console.log("Failed to delete an integration");
- }
- });
-};
-
-export default deleteIntegration;
diff --git a/frontend/pages/api/integrations/DeleteIntegration.ts b/frontend/pages/api/integrations/DeleteIntegration.ts
new file mode 100644
index 000000000..89aa0ab0c
--- /dev/null
+++ b/frontend/pages/api/integrations/DeleteIntegration.ts
@@ -0,0 +1,27 @@
+import SecurityClient from '~/utilities/SecurityClient';
+
+interface Props {
+ integrationId: string;
+}
+
+/**
+ * This route deletes an integration from a certain project
+ * @param {*} integrationId
+ * @returns
+ */
+const deleteIntegration = ({ integrationId }: Props) => {
+ return SecurityClient.fetchCall('/api/v1/integration/' + integrationId, {
+ method: 'DELETE',
+ headers: {
+ 'Content-Type': 'application/json'
+ }
+ }).then(async (res) => {
+ if (res && res.status == 200) {
+ return (await res.json()).workspace;
+ } else {
+ console.log('Failed to delete an integration');
+ }
+ });
+};
+
+export default deleteIntegration;
diff --git a/frontend/pages/api/integrations/DeleteIntegrationAuth.js b/frontend/pages/api/integrations/DeleteIntegrationAuth.js
deleted file mode 100644
index eb6106e8e..000000000
--- a/frontend/pages/api/integrations/DeleteIntegrationAuth.js
+++ /dev/null
@@ -1,26 +0,0 @@
-import SecurityClient from "~/utilities/SecurityClient";
-
-/**
- * This route deletes an integration authorization from a certain project
- * @param {*} integrationAuthId
- * @returns
- */
-const deleteIntegrationAuth = ({ integrationAuthId }) => {
- return SecurityClient.fetchCall(
- "/api/v1/integration-auth/" + integrationAuthId,
- {
- method: "DELETE",
- headers: {
- "Content-Type": "application/json",
- },
- }
- ).then(async (res) => {
- if (res.status == 200) {
- return res;
- } else {
- console.log("Failed to delete an integration authorization");
- }
- });
-};
-
-export default deleteIntegrationAuth;
diff --git a/frontend/pages/api/integrations/DeleteIntegrationAuth.ts b/frontend/pages/api/integrations/DeleteIntegrationAuth.ts
new file mode 100644
index 000000000..3a2da2cbf
--- /dev/null
+++ b/frontend/pages/api/integrations/DeleteIntegrationAuth.ts
@@ -0,0 +1,30 @@
+import SecurityClient from '~/utilities/SecurityClient';
+
+interface Props {
+ integrationAuthId: string;
+}
+
+/**
+ * This route deletes an integration authorization from a certain project
+ * @param {*} integrationAuthId
+ * @returns
+ */
+const deleteIntegrationAuth = ({ integrationAuthId }: Props) => {
+ return SecurityClient.fetchCall(
+ '/api/v1/integration-auth/' + integrationAuthId,
+ {
+ method: 'DELETE',
+ headers: {
+ 'Content-Type': 'application/json'
+ }
+ }
+ ).then(async (res) => {
+ if (res && res.status == 200) {
+ return res;
+ } else {
+ console.log('Failed to delete an integration authorization');
+ }
+ });
+};
+
+export default deleteIntegrationAuth;
diff --git a/frontend/pages/api/integrations/GetIntegrationApps.js b/frontend/pages/api/integrations/GetIntegrationApps.js
deleted file mode 100644
index dc0bfb4b6..000000000
--- a/frontend/pages/api/integrations/GetIntegrationApps.js
+++ /dev/null
@@ -1,21 +0,0 @@
-import SecurityClient from "~/utilities/SecurityClient";
-
-const getIntegrationApps = ({ integrationAuthId }) => {
- return SecurityClient.fetchCall(
- "/api/v1/integration-auth/" + integrationAuthId + "/apps",
- {
- method: "GET",
- headers: {
- "Content-Type": "application/json",
- },
- }
- ).then(async (res) => {
- if (res.status == 200) {
- return (await res.json()).apps;
- } else {
- console.log("Failed to get available apps for an integration");
- }
- });
-};
-
-export default getIntegrationApps;
diff --git a/frontend/pages/api/integrations/GetIntegrationApps.ts b/frontend/pages/api/integrations/GetIntegrationApps.ts
new file mode 100644
index 000000000..5597c24b1
--- /dev/null
+++ b/frontend/pages/api/integrations/GetIntegrationApps.ts
@@ -0,0 +1,25 @@
+import SecurityClient from '~/utilities/SecurityClient';
+
+interface Props {
+ integrationAuthId: string;
+}
+
+const getIntegrationApps = ({ integrationAuthId }: Props) => {
+ return SecurityClient.fetchCall(
+ '/api/v1/integration-auth/' + integrationAuthId + '/apps',
+ {
+ method: 'GET',
+ headers: {
+ 'Content-Type': 'application/json'
+ }
+ }
+ ).then(async (res) => {
+ if (res && res.status == 200) {
+ return (await res.json()).apps;
+ } else {
+ console.log('Failed to get available apps for an integration');
+ }
+ });
+};
+
+export default getIntegrationApps;
diff --git a/frontend/pages/api/integrations/GetIntegrations.js b/frontend/pages/api/integrations/GetIntegrations.js
deleted file mode 100644
index 401c80d3b..000000000
--- a/frontend/pages/api/integrations/GetIntegrations.js
+++ /dev/null
@@ -1,18 +0,0 @@
-import SecurityClient from "~/utilities/SecurityClient";
-
-const getIntegrations = () => {
- return SecurityClient.fetchCall("/api/v1/integration/integrations", {
- method: "GET",
- headers: {
- "Content-Type": "application/json",
- },
- }).then(async (res) => {
- if (res.status == 200) {
- return (await res.json()).integrations;
- } else {
- console.log("Failed to get project integrations");
- }
- });
-};
-
-export default getIntegrations;
diff --git a/frontend/pages/api/integrations/GetIntegrations.ts b/frontend/pages/api/integrations/GetIntegrations.ts
new file mode 100644
index 000000000..c189010a4
--- /dev/null
+++ b/frontend/pages/api/integrations/GetIntegrations.ts
@@ -0,0 +1,18 @@
+import SecurityClient from '~/utilities/SecurityClient';
+
+const getIntegrations = () => {
+ return SecurityClient.fetchCall('/api/v1/integration/integrations', {
+ method: 'GET',
+ headers: {
+ 'Content-Type': 'application/json'
+ }
+ }).then(async (res) => {
+ if (res && res.status == 200) {
+ return (await res.json()).integrations;
+ } else {
+ console.log('Failed to get project integrations');
+ }
+ });
+};
+
+export default getIntegrations;
diff --git a/frontend/pages/api/integrations/StartIntegration.js b/frontend/pages/api/integrations/StartIntegration.js
deleted file mode 100644
index a4e8b0b02..000000000
--- a/frontend/pages/api/integrations/StartIntegration.js
+++ /dev/null
@@ -1,33 +0,0 @@
-import SecurityClient from "~/utilities/SecurityClient";
-
-/**
- * This route starts the integration after teh default one if gonna set up.
- * @param {*} integrationId
- * @returns
- */
-const startIntegration = ({ integrationId, appName, environment }) => {
- return SecurityClient.fetchCall(
- "/api/v1/integration/" + integrationId,
- {
- method: "PATCH",
- headers: {
- "Content-Type": "application/json",
- },
- body: JSON.stringify({
- update: {
- app: appName,
- environment,
- isActive: true,
- },
- }),
- }
- ).then(async (res) => {
- if (res.status == 200) {
- return res;
- } else {
- console.log("Failed to start an integration");
- }
- });
-};
-
-export default startIntegration;
diff --git a/frontend/pages/api/integrations/StartIntegration.ts b/frontend/pages/api/integrations/StartIntegration.ts
new file mode 100644
index 000000000..bef82e7e1
--- /dev/null
+++ b/frontend/pages/api/integrations/StartIntegration.ts
@@ -0,0 +1,36 @@
+import SecurityClient from '~/utilities/SecurityClient';
+
+interface Props {
+ integrationId: string;
+ appName: string;
+ environment: string;
+}
+
+/**
+ * This route starts the integration after teh default one if gonna set up.
+ * @param {*} integrationId
+ * @returns
+ */
+const startIntegration = ({ integrationId, appName, environment }: Props) => {
+ return SecurityClient.fetchCall('/api/v1/integration/' + integrationId, {
+ method: 'PATCH',
+ headers: {
+ 'Content-Type': 'application/json'
+ },
+ body: JSON.stringify({
+ update: {
+ app: appName,
+ environment,
+ isActive: true
+ }
+ })
+ }).then(async (res) => {
+ if (res && res.status == 200) {
+ return res;
+ } else {
+ console.log('Failed to start an integration');
+ }
+ });
+};
+
+export default startIntegration;
diff --git a/frontend/pages/api/integrations/authorizeIntegration.js b/frontend/pages/api/integrations/authorizeIntegration.js
deleted file mode 100644
index b9a1d3995..000000000
--- a/frontend/pages/api/integrations/authorizeIntegration.js
+++ /dev/null
@@ -1,31 +0,0 @@
-import SecurityClient from "~/utilities/SecurityClient";
-
-/**
- * This is the first step of the change password process (pake)
- * @param {*} clientPublicKey
- * @returns
- */
-const AuthorizeIntegration = ({ workspaceId, code, integration }) => {
- return SecurityClient.fetchCall(
- "/api/v1/integration-auth/oauth-token",
- {
- method: "POST",
- headers: {
- "Content-Type": "application/json",
- },
- body: JSON.stringify({
- workspaceId,
- code,
- integration,
- }),
- }
- ).then(async (res) => {
- if (res.status == 200) {
- return res;
- } else {
- console.log("Failed to authorize the integration");
- }
- });
-};
-
-export default AuthorizeIntegration;
diff --git a/frontend/pages/api/integrations/authorizeIntegration.ts b/frontend/pages/api/integrations/authorizeIntegration.ts
new file mode 100644
index 000000000..83158f594
--- /dev/null
+++ b/frontend/pages/api/integrations/authorizeIntegration.ts
@@ -0,0 +1,33 @@
+import SecurityClient from '~/utilities/SecurityClient';
+
+interface Props {
+ workspaceId: string;
+ code: string;
+ integration: string;
+}
+/**
+ * This is the first step of the change password process (pake)
+ * @param {*} clientPublicKey
+ * @returns
+ */
+const AuthorizeIntegration = ({ workspaceId, code, integration }: Props) => {
+ return SecurityClient.fetchCall('/api/v1/integration-auth/oauth-token', {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json'
+ },
+ body: JSON.stringify({
+ workspaceId,
+ code,
+ integration
+ })
+ }).then(async (res) => {
+ if (res && res.status == 200) {
+ return res;
+ } else {
+ console.log('Failed to authorize the integration');
+ }
+ });
+};
+
+export default AuthorizeIntegration;
diff --git a/frontend/pages/api/integrations/getWorkspaceAuthorizations.js b/frontend/pages/api/integrations/getWorkspaceAuthorizations.js
deleted file mode 100644
index ad8c4732b..000000000
--- a/frontend/pages/api/integrations/getWorkspaceAuthorizations.js
+++ /dev/null
@@ -1,26 +0,0 @@
-import SecurityClient from "~/utilities/SecurityClient";
-
-/**
- * This route gets authorizations of a certain project (Heroku, etc.)
- * @param {*} workspaceId
- * @returns
- */
-const getWorkspaceAuthorizations = ({ workspaceId }) => {
- return SecurityClient.fetchCall(
- "/api/v1/workspace/" + workspaceId + "/authorizations",
- {
- method: "GET",
- headers: {
- "Content-Type": "application/json",
- },
- }
- ).then(async (res) => {
- if (res.status == 200) {
- return (await res.json()).authorizations;
- } else {
- console.log("Failed to get project authorizations");
- }
- });
-};
-
-export default getWorkspaceAuthorizations;
diff --git a/frontend/pages/api/integrations/getWorkspaceAuthorizations.ts b/frontend/pages/api/integrations/getWorkspaceAuthorizations.ts
new file mode 100644
index 000000000..f1b406555
--- /dev/null
+++ b/frontend/pages/api/integrations/getWorkspaceAuthorizations.ts
@@ -0,0 +1,30 @@
+import SecurityClient from '~/utilities/SecurityClient';
+
+interface Props {
+ workspaceId: string;
+}
+
+/**
+ * This route gets authorizations of a certain project (Heroku, etc.)
+ * @param {*} workspaceId
+ * @returns
+ */
+const getWorkspaceAuthorizations = ({ workspaceId }: Props) => {
+ return SecurityClient.fetchCall(
+ '/api/v1/workspace/' + workspaceId + '/authorizations',
+ {
+ method: 'GET',
+ headers: {
+ 'Content-Type': 'application/json'
+ }
+ }
+ ).then(async (res) => {
+ if (res && res.status == 200) {
+ return (await res.json()).authorizations;
+ } else {
+ console.log('Failed to get project authorizations');
+ }
+ });
+};
+
+export default getWorkspaceAuthorizations;
diff --git a/frontend/pages/api/integrations/getWorkspaceIntegrations.js b/frontend/pages/api/integrations/getWorkspaceIntegrations.js
deleted file mode 100644
index 22470e4be..000000000
--- a/frontend/pages/api/integrations/getWorkspaceIntegrations.js
+++ /dev/null
@@ -1,26 +0,0 @@
-import SecurityClient from "~/utilities/SecurityClient";
-
-/**
- * This route gets integrations of a certain project (Heroku, etc.)
- * @param {*} workspaceId
- * @returns
- */
-const getWorkspaceIntegrations = ({ workspaceId }) => {
- return SecurityClient.fetchCall(
- "/api/v1/workspace/" + workspaceId + "/integrations",
- {
- method: "GET",
- headers: {
- "Content-Type": "application/json",
- },
- }
- ).then(async (res) => {
- if (res.status == 200) {
- return (await res.json()).integrations;
- } else {
- console.log("Failed to get the project integrations");
- }
- });
-};
-
-export default getWorkspaceIntegrations;
diff --git a/frontend/pages/api/integrations/getWorkspaceIntegrations.ts b/frontend/pages/api/integrations/getWorkspaceIntegrations.ts
new file mode 100644
index 000000000..a33256749
--- /dev/null
+++ b/frontend/pages/api/integrations/getWorkspaceIntegrations.ts
@@ -0,0 +1,30 @@
+import SecurityClient from '~/utilities/SecurityClient';
+
+interface Props {
+ workspaceId: string;
+}
+
+/**
+ * This route gets integrations of a certain project (Heroku, etc.)
+ * @param {*} workspaceId
+ * @returns
+ */
+const getWorkspaceIntegrations = ({ workspaceId }: Props) => {
+ return SecurityClient.fetchCall(
+ '/api/v1/workspace/' + workspaceId + '/integrations',
+ {
+ method: 'GET',
+ headers: {
+ 'Content-Type': 'application/json'
+ }
+ }
+ ).then(async (res) => {
+ if (res && res.status == 200) {
+ return (await res.json()).integrations;
+ } else {
+ console.log('Failed to get the project integrations');
+ }
+ });
+};
+
+export default getWorkspaceIntegrations;
diff --git a/frontend/pages/api/organization/GetOrgProjects.js b/frontend/pages/api/organization/GetOrgProjects.js
deleted file mode 100644
index 656fea18f..000000000
--- a/frontend/pages/api/organization/GetOrgProjects.js
+++ /dev/null
@@ -1,27 +0,0 @@
-import SecurityClient from "~/utilities/SecurityClient";
-
-/**
- * This route lets us get all the users in an org.
- * @param {*} req
- * @param {*} res
- * @returns
- */
-const getOrganizationProjects = (req, res) => {
- return SecurityClient.fetchCall(
- "/api/organization/" + req.orgId + "/workspaces",
- {
- method: "GET",
- headers: {
- "Content-Type": "application/json",
- },
- }
- ).then(async (res) => {
- if (res.status == 200) {
- return (await res.json()).workspaces;
- } else {
- console.log("Failed to get projects for an org");
- }
- });
-};
-
-export default getOrganizationProjects;
diff --git a/frontend/pages/api/organization/GetOrgProjects.ts b/frontend/pages/api/organization/GetOrgProjects.ts
new file mode 100644
index 000000000..954694486
--- /dev/null
+++ b/frontend/pages/api/organization/GetOrgProjects.ts
@@ -0,0 +1,29 @@
+import SecurityClient from '~/utilities/SecurityClient';
+
+/**
+ * This route lets us get all the users in an org.
+ * @param {*} req
+ * @param {*} res
+ * @returns
+ */
+
+// TODO: this file is not used anywhere
+const getOrganizationProjects = (req: { orgId: string }) => {
+ return SecurityClient.fetchCall(
+ '/api/organization/' + req.orgId + '/workspaces',
+ {
+ method: 'GET',
+ headers: {
+ 'Content-Type': 'application/json'
+ }
+ }
+ ).then(async (res) => {
+ if (res && res.status == 200) {
+ return (await res.json()).workspaces;
+ } else {
+ console.log('Failed to get projects for an org');
+ }
+ });
+};
+
+export default getOrganizationProjects;
diff --git a/frontend/pages/api/organization/GetOrgSubscription.js b/frontend/pages/api/organization/GetOrgSubscription.js
deleted file mode 100644
index 97c6f4e5c..000000000
--- a/frontend/pages/api/organization/GetOrgSubscription.js
+++ /dev/null
@@ -1,27 +0,0 @@
-import SecurityClient from "~/utilities/SecurityClient";
-
-/**
- * This route lets us get the current subscription of an org.
- * @param {*} req
- * @param {*} res
- * @returns
- */
-const getOrganizationSubscriptions = (req, res) => {
- return SecurityClient.fetchCall(
- "/api/v1/organization/" + req.orgId + "/subscriptions",
- {
- method: "GET",
- headers: {
- "Content-Type": "application/json",
- },
- }
- ).then(async (res) => {
- if (res.status == 200) {
- return (await res.json()).subscriptions;
- } else {
- console.log("Failed to get org subscriptions");
- }
- });
-};
-
-export default getOrganizationSubscriptions;
diff --git a/frontend/pages/api/organization/GetOrgSubscription.ts b/frontend/pages/api/organization/GetOrgSubscription.ts
new file mode 100644
index 000000000..c93679cdc
--- /dev/null
+++ b/frontend/pages/api/organization/GetOrgSubscription.ts
@@ -0,0 +1,27 @@
+import SecurityClient from '~/utilities/SecurityClient';
+
+/**
+ * This route lets us get the current subscription of an org.
+ * @param {*} req
+ * @param {*} res
+ * @returns
+ */
+const getOrganizationSubscriptions = (req: { orgId: string }) => {
+ return SecurityClient.fetchCall(
+ '/api/v1/organization/' + req.orgId + '/subscriptions',
+ {
+ method: 'GET',
+ headers: {
+ 'Content-Type': 'application/json'
+ }
+ }
+ ).then(async (res) => {
+ if (res && res.status == 200) {
+ return (await res.json()).subscriptions;
+ } else {
+ console.log('Failed to get org subscriptions');
+ }
+ });
+};
+
+export default getOrganizationSubscriptions;
diff --git a/frontend/pages/api/organization/GetOrgUserProjects.js b/frontend/pages/api/organization/GetOrgUserProjects.js
deleted file mode 100644
index c2d751f64..000000000
--- a/frontend/pages/api/organization/GetOrgUserProjects.js
+++ /dev/null
@@ -1,27 +0,0 @@
-import SecurityClient from "~/utilities/SecurityClient";
-
-/**
- * This route lets us get all the projects of a certain user in an org.
- * @param {*} req
- * @param {*} res
- * @returns
- */
-const getOrganizationUserProjects = (req) => {
- return SecurityClient.fetchCall(
- "/api/v1/organization/" + req.orgId + "/my-workspaces",
- {
- method: "GET",
- headers: {
- "Content-Type": "application/json",
- },
- }
- ).then(async (res) => {
- if (res.status == 200) {
- return (await res.json()).workspaces;
- } else {
- console.log("Failed to get projects of a user in an org");
- }
- });
-};
-
-export default getOrganizationUserProjects;
diff --git a/frontend/pages/api/organization/GetOrgUserProjects.ts b/frontend/pages/api/organization/GetOrgUserProjects.ts
new file mode 100644
index 000000000..872b8d781
--- /dev/null
+++ b/frontend/pages/api/organization/GetOrgUserProjects.ts
@@ -0,0 +1,27 @@
+import SecurityClient from '~/utilities/SecurityClient';
+
+/**
+ * This route lets us get all the projects of a certain user in an org.
+ * @param {*} req
+ * @param {*} res
+ * @returns
+ */
+const getOrganizationUserProjects = (req: { orgId: string }) => {
+ return SecurityClient.fetchCall(
+ '/api/v1/organization/' + req.orgId + '/my-workspaces',
+ {
+ method: 'GET',
+ headers: {
+ 'Content-Type': 'application/json'
+ }
+ }
+ ).then(async (res) => {
+ if (res && res.status == 200) {
+ return (await res.json()).workspaces;
+ } else {
+ console.log('Failed to get projects of a user in an org');
+ }
+ });
+};
+
+export default getOrganizationUserProjects;
diff --git a/frontend/pages/api/organization/StripeRedirect.js b/frontend/pages/api/organization/StripeRedirect.js
deleted file mode 100644
index e8911cf53..000000000
--- a/frontend/pages/api/organization/StripeRedirect.js
+++ /dev/null
@@ -1,27 +0,0 @@
-import SecurityClient from "~/utilities/SecurityClient";
-
-/**
- * This route redirects the user to the right stripe billing page.
- * @param {*} req
- * @param {*} res
- * @returns
- */
-const StripeRedirect = ({ orgId }) => {
- return SecurityClient.fetchCall(
- "/api/v1/organization/" + orgId + "/customer-portal-session",
- {
- method: "POST",
- headers: {
- "Content-Type": "application/json",
- },
- }
- ).then(async (res) => {
- if (res.status == 200) {
- return (window.location.href = (await res.json()).url);
- } else {
- console.log("Failed to redirect to Stripe");
- }
- });
-};
-
-export default StripeRedirect;
diff --git a/frontend/pages/api/organization/StripeRedirect.ts b/frontend/pages/api/organization/StripeRedirect.ts
new file mode 100644
index 000000000..a9fe1f066
--- /dev/null
+++ b/frontend/pages/api/organization/StripeRedirect.ts
@@ -0,0 +1,27 @@
+import SecurityClient from '~/utilities/SecurityClient';
+
+/**
+ * This route redirects the user to the right stripe billing page.
+ * @param {*} req
+ * @param {*} res
+ * @returns
+ */
+const StripeRedirect = ({ orgId }: { orgId: string }) => {
+ return SecurityClient.fetchCall(
+ '/api/v1/organization/' + orgId + '/customer-portal-session',
+ {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json'
+ }
+ }
+ ).then(async (res) => {
+ if (res && res.status == 200) {
+ return (window.location.href = (await res.json()).url);
+ } else {
+ console.log('Failed to redirect to Stripe');
+ }
+ });
+};
+
+export default StripeRedirect;
diff --git a/frontend/pages/api/organization/addIncidentContact.js b/frontend/pages/api/organization/addIncidentContact.js
deleted file mode 100644
index 0e6068a1a..000000000
--- a/frontend/pages/api/organization/addIncidentContact.js
+++ /dev/null
@@ -1,29 +0,0 @@
-import SecurityClient from "~/utilities/SecurityClient";
-
-/**
- * This route add an incident contact email to a certain organization
- * @param {*} param0
- * @returns
- */
-const addIncidentContact = (organizationId, email) => {
- return SecurityClient.fetchCall(
- "/api/v1/organization/" + organizationId + "/incidentContactOrg",
- {
- method: "POST",
- headers: {
- "Content-Type": "application/json",
- },
- body: JSON.stringify({
- email: email,
- }),
- }
- ).then(async (res) => {
- if (res.status == 200) {
- return res;
- } else {
- console.log("Failed to add an incident contact");
- }
- });
-};
-
-export default addIncidentContact;
diff --git a/frontend/pages/api/organization/addIncidentContact.ts b/frontend/pages/api/organization/addIncidentContact.ts
new file mode 100644
index 000000000..d3676e641
--- /dev/null
+++ b/frontend/pages/api/organization/addIncidentContact.ts
@@ -0,0 +1,29 @@
+import SecurityClient from '~/utilities/SecurityClient';
+
+/**
+ * This route add an incident contact email to a certain organization
+ * @param {*} param0
+ * @returns
+ */
+const addIncidentContact = (organizationId: string, email: string) => {
+ return SecurityClient.fetchCall(
+ '/api/v1/organization/' + organizationId + '/incidentContactOrg',
+ {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json'
+ },
+ body: JSON.stringify({
+ email: email
+ })
+ }
+ ).then(async (res) => {
+ if (res && res.status == 200) {
+ return res;
+ } else {
+ console.log('Failed to add an incident contact');
+ }
+ });
+};
+
+export default addIncidentContact;
diff --git a/frontend/pages/api/organization/addUserToOrg.js b/frontend/pages/api/organization/addUserToOrg.js
deleted file mode 100644
index 15f22cff9..000000000
--- a/frontend/pages/api/organization/addUserToOrg.js
+++ /dev/null
@@ -1,28 +0,0 @@
-import SecurityClient from "~/utilities/SecurityClient";
-
-/**
- * This function sends an email invite to a user to join an org
- * @param {*} email
- * @param {*} orgId
- * @returns
- */
-const addUserToOrg = (email, orgId) => {
- return SecurityClient.fetchCall("/api/v1/invite-org/signup", {
- method: "POST",
- headers: {
- "Content-Type": "application/json",
- },
- body: JSON.stringify({
- inviteeEmail: email,
- organizationId: orgId,
- }),
- }).then(async (res) => {
- if (res.status == 200) {
- return res;
- } else {
- console.log("Failed to add a user to an org");
- }
- });
-};
-
-export default addUserToOrg;
diff --git a/frontend/pages/api/organization/addUserToOrg.ts b/frontend/pages/api/organization/addUserToOrg.ts
new file mode 100644
index 000000000..70dbad56c
--- /dev/null
+++ b/frontend/pages/api/organization/addUserToOrg.ts
@@ -0,0 +1,28 @@
+import SecurityClient from '~/utilities/SecurityClient';
+
+/**
+ * This function sends an email invite to a user to join an org
+ * @param {*} email
+ * @param {*} orgId
+ * @returns
+ */
+const addUserToOrg = (email: string, orgId: string) => {
+ return SecurityClient.fetchCall('/api/v1/invite-org/signup', {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json'
+ },
+ body: JSON.stringify({
+ inviteeEmail: email,
+ organizationId: orgId
+ })
+ }).then(async (res) => {
+ if (res && res.status == 200) {
+ return res;
+ } else {
+ console.log('Failed to add a user to an org');
+ }
+ });
+};
+
+export default addUserToOrg;
diff --git a/frontend/pages/api/organization/deleteIncidentContact.js b/frontend/pages/api/organization/deleteIncidentContact.js
deleted file mode 100644
index f6e57c590..000000000
--- a/frontend/pages/api/organization/deleteIncidentContact.js
+++ /dev/null
@@ -1,29 +0,0 @@
-import SecurityClient from "~/utilities/SecurityClient";
-
-/**
- * This route deletes an incident Contact from a certain organization
- * @param {*} param0
- * @returns
- */
-const deleteIncidentContact = (organizaionId, email) => {
- return SecurityClient.fetchCall(
- "/api/v1/organization/" + organizaionId + "/incidentContactOrg",
- {
- method: "DELETE",
- headers: {
- "Content-Type": "application/json",
- },
- body: JSON.stringify({
- email: email,
- }),
- }
- ).then(async (res) => {
- if (res.status == 200) {
- return res;
- } else {
- console.log("Failed to delete an incident contact");
- }
- });
-};
-
-export default deleteIncidentContact;
diff --git a/frontend/pages/api/organization/deleteIncidentContact.ts b/frontend/pages/api/organization/deleteIncidentContact.ts
new file mode 100644
index 000000000..fd6374e9b
--- /dev/null
+++ b/frontend/pages/api/organization/deleteIncidentContact.ts
@@ -0,0 +1,29 @@
+import SecurityClient from '~/utilities/SecurityClient';
+
+/**
+ * This route deletes an incident Contact from a certain organization
+ * @param {*} param0
+ * @returns
+ */
+const deleteIncidentContact = (organizationId: string, email: string) => {
+ return SecurityClient.fetchCall(
+ '/api/v1/organization/' + organizationId + '/incidentContactOrg',
+ {
+ method: 'DELETE',
+ headers: {
+ 'Content-Type': 'application/json'
+ },
+ body: JSON.stringify({
+ email: email
+ })
+ }
+ ).then(async (res) => {
+ if (res && res.status == 200) {
+ return res;
+ } else {
+ console.log('Failed to delete an incident contact');
+ }
+ });
+};
+
+export default deleteIncidentContact;
diff --git a/frontend/pages/api/organization/deleteUserFromOrganization.js b/frontend/pages/api/organization/deleteUserFromOrganization.js
deleted file mode 100644
index 66ea84793..000000000
--- a/frontend/pages/api/organization/deleteUserFromOrganization.js
+++ /dev/null
@@ -1,26 +0,0 @@
-import SecurityClient from "~/utilities/SecurityClient";
-
-/**
- * This function removes a certain member from a certain organization
- * @param {*} membershipId
- * @returns
- */
-const deleteUserFromOrganization = (membershipId) => {
- return SecurityClient.fetchCall(
- "/api/v1/membership-org/" + membershipId,
- {
- method: "DELETE",
- headers: {
- "Content-Type": "application/json",
- },
- }
- ).then(async (res) => {
- if (res.status == 200) {
- return res;
- } else {
- console.log("Failed to delete a user from an org");
- }
- });
-};
-
-export default deleteUserFromOrganization;
diff --git a/frontend/pages/api/organization/deleteUserFromOrganization.ts b/frontend/pages/api/organization/deleteUserFromOrganization.ts
new file mode 100644
index 000000000..988a09485
--- /dev/null
+++ b/frontend/pages/api/organization/deleteUserFromOrganization.ts
@@ -0,0 +1,23 @@
+import SecurityClient from '~/utilities/SecurityClient';
+
+/**
+ * This function removes a certain member from a certain organization
+ * @param {*} membershipId
+ * @returns
+ */
+const deleteUserFromOrganization = (membershipId: string) => {
+ return SecurityClient.fetchCall('/api/v1/membership-org/' + membershipId, {
+ method: 'DELETE',
+ headers: {
+ 'Content-Type': 'application/json'
+ }
+ }).then(async (res) => {
+ if (res && res.status == 200) {
+ return res;
+ } else {
+ console.log('Failed to delete a user from an org');
+ }
+ });
+};
+
+export default deleteUserFromOrganization;
diff --git a/frontend/pages/api/organization/getIncidentContacts.js b/frontend/pages/api/organization/getIncidentContacts.js
deleted file mode 100644
index 4f3f61a48..000000000
--- a/frontend/pages/api/organization/getIncidentContacts.js
+++ /dev/null
@@ -1,26 +0,0 @@
-import SecurityClient from "~/utilities/SecurityClient";
-
-/**
- * This routes gets all the incident contacts of a certain organization
- * @param {*} workspaceId
- * @returns
- */
-const getIncidentContacts = (organizationId) => {
- return SecurityClient.fetchCall(
- "/api/v1/organization/" + organizationId + "/incidentContactOrg",
- {
- method: "GET",
- headers: {
- "Content-Type": "application/json",
- },
- }
- ).then(async (res) => {
- if (res.status == 200) {
- return (await res.json()).incidentContactsOrg;
- } else {
- console.log("Failed to get incident contacts");
- }
- });
-};
-
-export default getIncidentContacts;
diff --git a/frontend/pages/api/organization/getIncidentContacts.ts b/frontend/pages/api/organization/getIncidentContacts.ts
new file mode 100644
index 000000000..bb9c3613a
--- /dev/null
+++ b/frontend/pages/api/organization/getIncidentContacts.ts
@@ -0,0 +1,26 @@
+import SecurityClient from '~/utilities/SecurityClient';
+
+/**
+ * This routes gets all the incident contacts of a certain organization
+ * @param {*} workspaceId
+ * @returns
+ */
+const getIncidentContacts = (organizationId: string) => {
+ return SecurityClient.fetchCall(
+ '/api/v1/organization/' + organizationId + '/incidentContactOrg',
+ {
+ method: 'GET',
+ headers: {
+ 'Content-Type': 'application/json'
+ }
+ }
+ ).then(async (res) => {
+ if (res && res.status == 200) {
+ return (await res.json()).incidentContactsOrg;
+ } else {
+ console.log('Failed to get incident contacts');
+ }
+ });
+};
+
+export default getIncidentContacts;
diff --git a/frontend/pages/api/organization/renameOrg.js b/frontend/pages/api/organization/renameOrg.js
deleted file mode 100644
index a9d80a3a5..000000000
--- a/frontend/pages/api/organization/renameOrg.js
+++ /dev/null
@@ -1,30 +0,0 @@
-import SecurityClient from "~/utilities/SecurityClient";
-
-/**
- * This route lets us rename a certain org.
- * @param {*} req
- * @param {*} res
- * @returns
- */
-const renameOrg = (orgId, newOrgName) => {
- return SecurityClient.fetchCall(
- "/api/v1/organization/" + orgId + "/name",
- {
- method: "PATCH",
- headers: {
- "Content-Type": "application/json",
- },
- body: JSON.stringify({
- name: newOrgName,
- }),
- }
- ).then(async (res) => {
- if (res.status == 200) {
- return res;
- } else {
- console.log("Failed to rename an organization");
- }
- });
-};
-
-export default renameOrg;
diff --git a/frontend/pages/api/organization/renameOrg.ts b/frontend/pages/api/organization/renameOrg.ts
new file mode 100644
index 000000000..c5c0b4d65
--- /dev/null
+++ b/frontend/pages/api/organization/renameOrg.ts
@@ -0,0 +1,27 @@
+import SecurityClient from '~/utilities/SecurityClient';
+
+/**
+ * This route lets us rename a certain org.
+ * @param {*} req
+ * @param {*} res
+ * @returns
+ */
+const renameOrg = (orgId: string, newOrgName: string) => {
+ return SecurityClient.fetchCall('/api/v1/organization/' + orgId + '/name', {
+ method: 'PATCH',
+ headers: {
+ 'Content-Type': 'application/json'
+ },
+ body: JSON.stringify({
+ name: newOrgName
+ })
+ }).then(async (res) => {
+ if (res && res.status == 200) {
+ return res;
+ } else {
+ console.log('Failed to rename an organization');
+ }
+ });
+};
+
+export default renameOrg;
diff --git a/frontend/pages/api/serviceToken/addServiceToken.js b/frontend/pages/api/serviceToken/addServiceToken.ts
similarity index 51%
rename from frontend/pages/api/serviceToken/addServiceToken.js
rename to frontend/pages/api/serviceToken/addServiceToken.ts
index 4c6031db8..5dad69f69 100644
--- a/frontend/pages/api/serviceToken/addServiceToken.js
+++ b/frontend/pages/api/serviceToken/addServiceToken.ts
@@ -1,4 +1,14 @@
-import SecurityClient from "~/utilities/SecurityClient";
+import SecurityClient from '~/utilities/SecurityClient';
+
+interface Props {
+ name: string;
+ workspaceId: string;
+ environment: string;
+ expiresIn: number;
+ publicKey: string;
+ encryptedKey: string;
+ nonce: string;
+}
/**
* This route gets service tokens for a specific user in a project
@@ -12,12 +22,12 @@ const addServiceToken = ({
expiresIn,
publicKey,
encryptedKey,
- nonce,
-}) => {
- return SecurityClient.fetchCall("/api/v1/service-token/", {
- method: "POST",
+ nonce
+}: Props) => {
+ return SecurityClient.fetchCall('/api/v1/service-token/', {
+ method: 'POST',
headers: {
- "Content-Type": "application/json",
+ 'Content-Type': 'application/json'
},
body: JSON.stringify({
name,
@@ -26,13 +36,13 @@ const addServiceToken = ({
expiresIn,
publicKey,
encryptedKey,
- nonce,
- }),
+ nonce
+ })
}).then(async (res) => {
- if (res.status == 200) {
+ if (res && res.status == 200) {
return (await res.json()).token;
} else {
- console.log("Failed to add service tokens");
+ console.log('Failed to add service tokens');
}
});
};
diff --git a/frontend/pages/api/serviceToken/getServiceTokens.js b/frontend/pages/api/serviceToken/getServiceTokens.js
deleted file mode 100644
index 79c6a7fc0..000000000
--- a/frontend/pages/api/serviceToken/getServiceTokens.js
+++ /dev/null
@@ -1,26 +0,0 @@
-import SecurityClient from "~/utilities/SecurityClient";
-
-/**
- * This route gets service tokens for a specific user in a project
- * @param {*} param0
- * @returns
- */
-const getServiceTokens = ({ workspaceId }) => {
- return SecurityClient.fetchCall(
- "/api/v1/workspace/" + workspaceId + "/service-tokens",
- {
- method: "GET",
- headers: {
- "Content-Type": "application/json",
- },
- }
- ).then(async (res) => {
- if (res.status == 200) {
- return (await res.json()).serviceTokens;
- } else {
- console.log("Failed to get service tokens");
- }
- });
-};
-
-export default getServiceTokens;
diff --git a/frontend/pages/api/serviceToken/getServiceTokens.ts b/frontend/pages/api/serviceToken/getServiceTokens.ts
new file mode 100644
index 000000000..d2577cc83
--- /dev/null
+++ b/frontend/pages/api/serviceToken/getServiceTokens.ts
@@ -0,0 +1,26 @@
+import SecurityClient from '~/utilities/SecurityClient';
+
+/**
+ * This route gets service tokens for a specific user in a project
+ * @param {*} param0
+ * @returns
+ */
+const getServiceTokens = ({ workspaceId }: { workspaceId: string }) => {
+ return SecurityClient.fetchCall(
+ '/api/v1/workspace/' + workspaceId + '/service-tokens',
+ {
+ method: 'GET',
+ headers: {
+ 'Content-Type': 'application/json'
+ }
+ }
+ ).then(async (res) => {
+ if (res && res.status == 200) {
+ return (await res.json()).serviceTokens;
+ } else {
+ console.log('Failed to get service tokens');
+ }
+ });
+};
+
+export default getServiceTokens;
diff --git a/frontend/pages/api/userActions/checkUserAction.js b/frontend/pages/api/userActions/checkUserAction.ts
similarity index 51%
rename from frontend/pages/api/userActions/checkUserAction.js
rename to frontend/pages/api/userActions/checkUserAction.ts
index dfe217856..9941ae85a 100644
--- a/frontend/pages/api/userActions/checkUserAction.js
+++ b/frontend/pages/api/userActions/checkUserAction.ts
@@ -1,4 +1,4 @@
-import SecurityClient from "~/utilities/SecurityClient";
+import SecurityClient from '~/utilities/SecurityClient';
/**
* This route registers a certain action for a user
@@ -6,24 +6,24 @@ import SecurityClient from "~/utilities/SecurityClient";
* @param {*} workspaceId
* @returns
*/
-const checkUserAction = ({ action }) => {
+const checkUserAction = ({ action }: { action: string }) => {
return SecurityClient.fetchCall(
- "/api/v1/user-action" +
- "?" +
+ '/api/v1/user-action' +
+ '?' +
new URLSearchParams({
- action,
+ action
}),
{
- method: "GET",
+ method: 'GET',
headers: {
- "Content-Type": "application/json",
- },
+ 'Content-Type': 'application/json'
+ }
}
).then(async (res) => {
- if (res.status == 200) {
+ if (res && res.status == 200) {
return (await res.json()).userAction;
} else {
- console.log("Failed to check a user action");
+ console.log('Failed to check a user action');
}
});
};
diff --git a/frontend/pages/api/userActions/registerUserAction.js b/frontend/pages/api/userActions/registerUserAction.js
deleted file mode 100644
index 619886d89..000000000
--- a/frontend/pages/api/userActions/registerUserAction.js
+++ /dev/null
@@ -1,26 +0,0 @@
-import SecurityClient from "~/utilities/SecurityClient";
-
-/**
- * This route registers a certain action for a user
- * @param {*} action
- * @returns
- */
-const registerUserAction = ({ action }) => {
- return SecurityClient.fetchCall("/api/v1/user-action", {
- method: "POST",
- headers: {
- "Content-Type": "application/json",
- },
- body: JSON.stringify({
- action,
- }),
- }).then(async (res) => {
- if (res.status == 200) {
- return res;
- } else {
- console.log("Failed to register a user action");
- }
- });
-};
-
-export default registerUserAction;
diff --git a/frontend/pages/api/userActions/registerUserAction.ts b/frontend/pages/api/userActions/registerUserAction.ts
new file mode 100644
index 000000000..d8f4d41e6
--- /dev/null
+++ b/frontend/pages/api/userActions/registerUserAction.ts
@@ -0,0 +1,26 @@
+import SecurityClient from '~/utilities/SecurityClient';
+
+/**
+ * This route registers a certain action for a user
+ * @param {*} action
+ * @returns
+ */
+const registerUserAction = ({ action }: { action: string }) => {
+ return SecurityClient.fetchCall('/api/v1/user-action', {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json'
+ },
+ body: JSON.stringify({
+ action
+ })
+ }).then(async (res) => {
+ if (res && res.status == 200) {
+ return res;
+ } else {
+ console.log('Failed to register a user action');
+ }
+ });
+};
+
+export default registerUserAction;
diff --git a/frontend/pages/api/workspace/addUserToWorkspace.js b/frontend/pages/api/workspace/addUserToWorkspace.js
deleted file mode 100644
index 86e991389..000000000
--- a/frontend/pages/api/workspace/addUserToWorkspace.js
+++ /dev/null
@@ -1,30 +0,0 @@
-import SecurityClient from "~/utilities/SecurityClient";
-
-/**
- * This function adds a user to a project
- * @param {*} email
- * @param {*} workspaceId
- * @returns
- */
-const addUserToWorkspace = (email, workspaceId) => {
- return SecurityClient.fetchCall(
- "/api/v1/workspace/" + workspaceId + "/invite-signup",
- {
- method: "POST",
- headers: {
- "Content-Type": "application/json",
- },
- body: JSON.stringify({
- email: email,
- }),
- }
- ).then(async (res) => {
- if (res.status == 200) {
- return await res.json();
- } else {
- console.log("Failed to add a user to project");
- }
- });
-};
-
-export default addUserToWorkspace;
diff --git a/frontend/pages/api/workspace/addUserToWorkspace.ts b/frontend/pages/api/workspace/addUserToWorkspace.ts
new file mode 100644
index 000000000..e1efa51a1
--- /dev/null
+++ b/frontend/pages/api/workspace/addUserToWorkspace.ts
@@ -0,0 +1,30 @@
+import SecurityClient from '~/utilities/SecurityClient';
+
+/**
+ * This function adds a user to a project
+ * @param {*} email
+ * @param {*} workspaceId
+ * @returns
+ */
+const addUserToWorkspace = (email: string, workspaceId: string) => {
+ return SecurityClient.fetchCall(
+ '/api/v1/workspace/' + workspaceId + '/invite-signup',
+ {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json'
+ },
+ body: JSON.stringify({
+ email: email
+ })
+ }
+ ).then(async (res) => {
+ if (res && res.status == 200) {
+ return await res.json();
+ } else {
+ console.log('Failed to add a user to project');
+ }
+ });
+};
+
+export default addUserToWorkspace;
diff --git a/frontend/pages/api/workspace/changeUserRoleInWorkspace.js b/frontend/pages/api/workspace/changeUserRoleInWorkspace.js
deleted file mode 100644
index a93e22181..000000000
--- a/frontend/pages/api/workspace/changeUserRoleInWorkspace.js
+++ /dev/null
@@ -1,30 +0,0 @@
-import SecurityClient from "~/utilities/SecurityClient";
-
-/**
- * This function change the access of a user in a certain workspace
- * @param {*} membershipId
- * @param {*} role
- * @returns
- */
-const changeUserRoleInWorkspace = (membershipId, role) => {
- return SecurityClient.fetchCall(
- "/api/v1/membership/" + membershipId + "/change-role",
- {
- method: "POST",
- headers: {
- "Content-Type": "application/json",
- },
- body: JSON.stringify({
- role: role,
- }),
- }
- ).then(async (res) => {
- if (res.status == 200) {
- return res;
- } else {
- console.log("Failed to change the user role in a project");
- }
- });
-};
-
-export default changeUserRoleInWorkspace;
diff --git a/frontend/pages/api/workspace/changeUserRoleInWorkspace.ts b/frontend/pages/api/workspace/changeUserRoleInWorkspace.ts
new file mode 100644
index 000000000..9ac49440a
--- /dev/null
+++ b/frontend/pages/api/workspace/changeUserRoleInWorkspace.ts
@@ -0,0 +1,30 @@
+import SecurityClient from '~/utilities/SecurityClient';
+
+/**
+ * This function change the access of a user in a certain workspace
+ * @param {*} membershipId
+ * @param {*} role
+ * @returns
+ */
+const changeUserRoleInWorkspace = (membershipId: string, role: string) => {
+ return SecurityClient.fetchCall(
+ '/api/v1/membership/' + membershipId + '/change-role',
+ {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json'
+ },
+ body: JSON.stringify({
+ role: role
+ })
+ }
+ ).then(async (res) => {
+ if (res && res.status == 200) {
+ return res;
+ } else {
+ console.log('Failed to change the user role in a project');
+ }
+ });
+};
+
+export default changeUserRoleInWorkspace;
diff --git a/frontend/pages/api/workspace/deleteUserFromWorkspace.js b/frontend/pages/api/workspace/deleteUserFromWorkspace.js
deleted file mode 100644
index bad8beced..000000000
--- a/frontend/pages/api/workspace/deleteUserFromWorkspace.js
+++ /dev/null
@@ -1,23 +0,0 @@
-import SecurityClient from "~/utilities/SecurityClient";
-
-/**
- * This function removes a certain member from a certain workspace
- * @param {*} membershipId
- * @returns
- */
-const deleteUserFromWorkspace = (membershipId) => {
- return SecurityClient.fetchCall("/api/v1/membership/" + membershipId, {
- method: "DELETE",
- headers: {
- "Content-Type": "application/json",
- },
- }).then(async (res) => {
- if (res.status == 200) {
- return res;
- } else {
- console.log("Failed to delete a user from a project");
- }
- });
-};
-
-export default deleteUserFromWorkspace;
diff --git a/frontend/pages/api/workspace/deleteUserFromWorkspace.ts b/frontend/pages/api/workspace/deleteUserFromWorkspace.ts
new file mode 100644
index 000000000..ea02f96d4
--- /dev/null
+++ b/frontend/pages/api/workspace/deleteUserFromWorkspace.ts
@@ -0,0 +1,23 @@
+import SecurityClient from '~/utilities/SecurityClient';
+
+/**
+ * This function removes a certain member from a certain workspace
+ * @param {*} membershipId
+ * @returns
+ */
+const deleteUserFromWorkspace = (membershipId: string) => {
+ return SecurityClient.fetchCall('/api/v1/membership/' + membershipId, {
+ method: 'DELETE',
+ headers: {
+ 'Content-Type': 'application/json'
+ }
+ }).then(async (res) => {
+ if (res && res.status == 200) {
+ return res;
+ } else {
+ console.log('Failed to delete a user from a project');
+ }
+ });
+};
+
+export default deleteUserFromWorkspace;
diff --git a/frontend/pages/api/workspace/deleteWorkspace.js b/frontend/pages/api/workspace/deleteWorkspace.js
deleted file mode 100644
index 33d34844d..000000000
--- a/frontend/pages/api/workspace/deleteWorkspace.js
+++ /dev/null
@@ -1,23 +0,0 @@
-import SecurityClient from "~/utilities/SecurityClient";
-
-/**
- * This route deletes a specified workspace.
- * @param {*} workspaceId
- * @returns
- */
-const deleteWorkspace = (workspaceId) => {
- return SecurityClient.fetchCall("/api/v1/workspace/" + workspaceId, {
- method: "DELETE",
- headers: {
- "Content-Type": "application/json",
- },
- }).then(async (res) => {
- if (res.status == 200) {
- return res;
- } else {
- console.log("Failed to delete a project");
- }
- });
-};
-
-export default deleteWorkspace;
diff --git a/frontend/pages/api/workspace/deleteWorkspace.ts b/frontend/pages/api/workspace/deleteWorkspace.ts
new file mode 100644
index 000000000..2bdb64cd3
--- /dev/null
+++ b/frontend/pages/api/workspace/deleteWorkspace.ts
@@ -0,0 +1,23 @@
+import SecurityClient from '~/utilities/SecurityClient';
+
+/**
+ * This route deletes a specified workspace.
+ * @param {*} workspaceId
+ * @returns
+ */
+const deleteWorkspace = (workspaceId: string) => {
+ return SecurityClient.fetchCall('/api/v1/workspace/' + workspaceId, {
+ method: 'DELETE',
+ headers: {
+ 'Content-Type': 'application/json'
+ }
+ }).then(async (res) => {
+ if (res && res.status == 200) {
+ return res;
+ } else {
+ console.log('Failed to delete a project');
+ }
+ });
+};
+
+export default deleteWorkspace;
diff --git a/frontend/pages/api/workspace/renameWorkspace.js b/frontend/pages/api/workspace/renameWorkspace.js
deleted file mode 100644
index 6dd297f82..000000000
--- a/frontend/pages/api/workspace/renameWorkspace.js
+++ /dev/null
@@ -1,30 +0,0 @@
-import SecurityClient from "~/utilities/SecurityClient";
-
-/**
- * This route lets us rename a certain workspace.
- * @param {*} req
- * @param {*} res
- * @returns
- */
-const renameWorkspace = (workspaceId, newWorkspaceName) => {
- return SecurityClient.fetchCall(
- "/api/v1/workspace/" + workspaceId + "/name",
- {
- method: "POST",
- headers: {
- "Content-Type": "application/json",
- },
- body: JSON.stringify({
- name: newWorkspaceName,
- }),
- }
- ).then(async (res) => {
- if (res.status == 200) {
- return res;
- } else {
- console.log("Failed to rename a project");
- }
- });
-};
-
-export default renameWorkspace;
diff --git a/frontend/pages/api/workspace/renameWorkspace.ts b/frontend/pages/api/workspace/renameWorkspace.ts
new file mode 100644
index 000000000..a25d2068c
--- /dev/null
+++ b/frontend/pages/api/workspace/renameWorkspace.ts
@@ -0,0 +1,30 @@
+import SecurityClient from '~/utilities/SecurityClient';
+
+/**
+ * This route lets us rename a certain workspace.
+ * @param {*} req
+ * @param {*} res
+ * @returns
+ */
+const renameWorkspace = (workspaceId: string, newWorkspaceName: string) => {
+ return SecurityClient.fetchCall(
+ '/api/v1/workspace/' + workspaceId + '/name',
+ {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json'
+ },
+ body: JSON.stringify({
+ name: newWorkspaceName
+ })
+ }
+ ).then(async (res) => {
+ if (res && res.status == 200) {
+ return res;
+ } else {
+ console.log('Failed to rename a project');
+ }
+ });
+};
+
+export default renameWorkspace;
diff --git a/frontend/pages/api/workspace/uploadKeys.js b/frontend/pages/api/workspace/uploadKeys.js
deleted file mode 100644
index 37b384f30..000000000
--- a/frontend/pages/api/workspace/uploadKeys.js
+++ /dev/null
@@ -1,33 +0,0 @@
-import SecurityClient from "~/utilities/SecurityClient";
-
-/**
- * This route uplods the keys in an encrypted format.
- * @param {*} workspaceId
- * @param {*} userId
- * @param {*} encryptedKey
- * @param {*} nonce
- * @returns
- */
-const uploadKeys = (workspaceId, userId, encryptedKey, nonce) => {
- return SecurityClient.fetchCall("/api/v1/key/" + workspaceId, {
- method: "POST",
- headers: {
- "Content-Type": "application/json",
- },
- body: JSON.stringify({
- key: {
- userId: userId,
- encryptedKey: encryptedKey,
- nonce: nonce,
- },
- }),
- }).then(async (res) => {
- if (res.status == 200) {
- return res;
- } else {
- console.log("Failed to upload keys for a new user");
- }
- });
-};
-
-export default uploadKeys;
diff --git a/frontend/pages/api/workspace/uploadKeys.ts b/frontend/pages/api/workspace/uploadKeys.ts
new file mode 100644
index 000000000..2f791735d
--- /dev/null
+++ b/frontend/pages/api/workspace/uploadKeys.ts
@@ -0,0 +1,38 @@
+import SecurityClient from '~/utilities/SecurityClient';
+
+/**
+ * This route uplods the keys in an encrypted format.
+ * @param {*} workspaceId
+ * @param {*} userId
+ * @param {*} encryptedKey
+ * @param {*} nonce
+ * @returns
+ */
+const uploadKeys = (
+ workspaceId: string,
+ userId: string,
+ encryptedKey: string,
+ nonce: string
+) => {
+ return SecurityClient.fetchCall('/api/v1/key/' + workspaceId, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json'
+ },
+ body: JSON.stringify({
+ key: {
+ userId: userId,
+ encryptedKey: encryptedKey,
+ nonce: nonce
+ }
+ })
+ }).then(async (res) => {
+ if (res && res.status == 200) {
+ return res;
+ } else {
+ console.log('Failed to upload keys for a new user');
+ }
+ });
+};
+
+export default uploadKeys;