From 6466c3a59f6b905b2fe25fe190ccec46b353e220 Mon Sep 17 00:00:00 2001 From: Kiran Date: Thu, 17 Feb 2022 11:35:50 +0530 Subject: [PATCH] cleanup --- README.md | 9 +- components/Header.tsx | 7 + components/Layout.tsx | 12 ++ components/NavBar.tsx | 16 ++ lib/prisma.ts | 15 ++ package-lock.json | 388 +++++++++++++++++++++++++++++++++++-- package.json | 1 + pages/_app.tsx | 8 +- pages/api/apps/index.ts | 19 +- pages/api/apps/metadata.ts | 46 ++++- pages/apps/[id].tsx | 41 ++++ pages/apps/demo.tsx | 13 ++ pages/apps/index.tsx | 24 ++- services/apps.ts | 33 ---- services/index.ts | 2 - services/metadata.ts | 20 -- types/index.ts | 2 +- 17 files changed, 553 insertions(+), 103 deletions(-) create mode 100644 lib/prisma.ts create mode 100644 pages/apps/[id].tsx create mode 100644 pages/apps/demo.tsx delete mode 100644 services/apps.ts delete mode 100644 services/index.ts delete mode 100644 services/metadata.ts diff --git a/README.md b/README.md index 928d866..b6e69db 100644 --- a/README.md +++ b/README.md @@ -9,8 +9,9 @@ https://github.com/prisma/prisma/issues/4571#issuecomment-747496127 -# Apps -- Create an app -- Get all apps +http://localhost:4000/apps/saml?RelayState&SAMLRequest= -http://localhost:4000/apps/saml?RelayState=boxyhq_jackson_2fd72712996df6104811ff8cc233d1e2&SAMLRequest=PD94bWwgdmVyc2lvbj0iMS4wIj8%2BPHNhbWxwOkF1dGhuUmVxdWVzdCB4bWxuczpzYW1scD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOnByb3RvY29sIiBJRD0iXzZiMmU1ZDdhMDRiNjEzMzAyZDhmIiBWZXJzaW9uPSIyLjAiIElzc3VlSW5zdGFudD0iMjAyMi0wMS0xNFQxNToxODoxNi4yNTlaIiBQcm90b2NvbEJpbmRpbmc9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpiaW5kaW5nczpIVFRQLVBPU1QiIEFzc2VydGlvbkNvbnN1bWVyU2VydmljZVVSTD0iaHR0cHM6Ly8yOGEyLTEwMy0xNTMtMTA0LTQzLm5ncm9rLmlvL3Nzby9hY3MiIFByb3ZpZGVyTmFtZT0iQm94eUhRIj48c2FtbDpJc3N1ZXIgeG1sbnM6c2FtbD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmFzc2VydGlvbiI%2BaHR0cHM6Ly9zYW1sLmJveHlocS5jb208L3NhbWw6SXNzdWVyPjxTaWduYXR1cmUgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiPjxTaWduZWRJbmZvPjxDYW5vbmljYWxpemF0aW9uTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8xMC94bWwtZXhjLWMxNG4jIi8%2BPFNpZ25hdHVyZU1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMDQveG1sZHNpZy1tb3JlI3JzYS1zaGEyNTYiLz48UmVmZXJlbmNlIFVSST0iI182YjJlNWQ3YTA0YjYxMzMwMmQ4ZiI%2BPFRyYW5zZm9ybXM%2BPFRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNlbnZlbG9wZWQtc2lnbmF0dXJlIi8%2BPFRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMTAveG1sLWV4Yy1jMTRuIyIvPjwvVHJhbnNmb3Jtcz48RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8wNC94bWxlbmMjc2hhMjU2Ii8%2BPERpZ2VzdFZhbHVlPlBXVFlGek9hV1FvZHNqK21haEdnam1VQkZsVFk5cGlQNy8yVVkvNEZkN289PC9EaWdlc3RWYWx1ZT48L1JlZmVyZW5jZT48L1NpZ25lZEluZm8%2BPFNpZ25hdHVyZVZhbHVlPm5HbEMrZVkwMC82eDZQNlBMcGFoOVR5QzlRTnNKR0U3V0Y1czQ1SXZRbWlJWmwrSmhNVGRQeExBSjJ1dVpQMWZzZ1NwUllPZG5HanRLNjlobS9LOHZDVGlab29EODdjdkJmdXp4NVVNQ3NiV0VQSERJV01rV1k3S2ZrYk5ySjNMdVZyYTR0SEZvY2luQnVwRzNMeVQ5dUtwRzI1NlQrNm9LUDNOdkJSTzRROUFpWlk4czlxaVhzRE9QQlJRd3NEaEdNdGRJcGVDaGZQU2RQdFV1RXV3UEdRS1pZellFY0d3WHpOTGYydm5PaS9QUE5rRHA4QTdPN2FJd09HWFNDVVlqL29oNUo4RWRQdVpyRzFuL0ZMdm04L0dNY2pNTTYwQWZ1NFg3WGMzRlFRUG5aZ2lxdFlsd2YwbjFDemlkbnYvbDE3NjF6T3grWXJqb08zaUp0SHB6Zz09PC9TaWduYXR1cmVWYWx1ZT48L1NpZ25hdHVyZT48c2FtbHA6TmFtZUlEUG9saWN5IHhtbG5zOnNhbWxwPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6cHJvdG9jb2wiIEZvcm1hdD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6MS4xOm5hbWVpZC1mb3JtYXQ6ZW1haWxBZGRyZXNzIiBBbGxvd0NyZWF0ZT0idHJ1ZSIvPjwvc2FtbHA6QXV0aG5SZXF1ZXN0Pg%3D%3D +## Pages +- Create an app +- List all app +- View individual app page (with Download Metadata button and Delete button) \ No newline at end of file diff --git a/components/Header.tsx b/components/Header.tsx index e69de29..fa5bf97 100644 --- a/components/Header.tsx +++ b/components/Header.tsx @@ -0,0 +1,7 @@ +export default function Header() { + return ( + <> +
Header
+ + ) +} \ No newline at end of file diff --git a/components/Layout.tsx b/components/Layout.tsx index e69de29..2a180ab 100644 --- a/components/Layout.tsx +++ b/components/Layout.tsx @@ -0,0 +1,12 @@ +import Navbar from './NavBar' +import Header from './Header' + +export default function Layout({ children }) { + return ( + <> + +
{children}
+
+ + ) +} \ No newline at end of file diff --git a/components/NavBar.tsx b/components/NavBar.tsx index e69de29..353cb57 100644 --- a/components/NavBar.tsx +++ b/components/NavBar.tsx @@ -0,0 +1,16 @@ +import { Sidenav, Nav, Dropdown } from 'rsuite'; + +export default function Navbar() { + return ( +
+ + + + + +
+ ) +} \ No newline at end of file diff --git a/lib/prisma.ts b/lib/prisma.ts new file mode 100644 index 0000000..d26489c --- /dev/null +++ b/lib/prisma.ts @@ -0,0 +1,15 @@ +import { PrismaClient } from '@prisma/client'; + +let prisma: PrismaClient; + +if (process.env.NODE_ENV === 'production') { + prisma = new PrismaClient(); +} else { + if (!global.prisma) { + global.prisma = new PrismaClient(); + } + + prisma = global.prisma; +} + +export default prisma; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 4a253b0..b21b179 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,6 +11,7 @@ "next": "12.0.7", "react": "17.0.2", "react-dom": "17.0.2", + "rsuite": "^5.5.2", "xml2js": "^0.4.23", "xmlbuilder": "^15.1.1" }, @@ -791,6 +792,11 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, + "node_modules/@juggle/resize-observer": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.3.1.tgz", + "integrity": "sha512-zMM9Ds+SawiUkakS7y94Ymqx+S0ORzpG3frZirN3l+UlXUmSUR7hF4wxCVqW+ei94JzV5kt0uXBcoOEAuiydrw==" + }, "node_modules/@napi-rs/triples": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@napi-rs/triples/-/triples-1.0.3.tgz", @@ -1146,18 +1152,48 @@ "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-3.7.0-31.8746e055198f517658c08a0c426c7eec87f5a85f.tgz", "integrity": "sha512-+qx2b+HK7BKF4VCa0LZ/t1QCXsu6SmvhUQyJkOD2aPpmOzket4fEnSKQZSB0i5tl7rwCDsvAiSeK8o7rf+yvwg==" }, + "node_modules/@rsuite/icon-font": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@rsuite/icon-font/-/icon-font-4.0.0.tgz", + "integrity": "sha512-rZTgpTH3H3HLczCA2rnkWfoMKm0ZXoRzsrkVujfP/FfslnKUMvO6w56pa8pCvhWGpNEPUsLS2ULnFGpTEcup/Q==" + }, + "node_modules/@rsuite/icons": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rsuite/icons/-/icons-1.0.2.tgz", + "integrity": "sha512-Y7vJNDQpJnFlyYSUXQ2iQ9Meg7+ZKcrIenhpYDdM3c7vYDE/L7pml+hrK28jk6QfV/QkVv5B504D+l7aM6AAJQ==", + "dependencies": { + "@rsuite/icon-font": "^4.0.0", + "classnames": "^2.2.5", + "insert-css": "^2.0.0", + "lodash": "^4.17.20" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, "node_modules/@rushstack/eslint-patch": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.1.0.tgz", "integrity": "sha512-JLo+Y592QzIE+q7Dl2pMUtt4q8SKYI5jDrZxrozEQxnGVOyYE+GWK9eLkwTaeN9DDctlaRAQ3TBmzZ1qdLE30A==", "dev": true }, + "node_modules/@types/chai": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.0.tgz", + "integrity": "sha512-/ceqdqeRraGolFTcfoXNiqjyQhZzbINDngeoAq9GoHa8PPK1yNzTaxWjA6BFWp5Ua9JpXEMSS4s5i9tS0hOJtw==" + }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", "dev": true }, + "node_modules/@types/lodash": { + "version": "4.14.178", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.178.tgz", + "integrity": "sha512-0d5Wd09ItQWH1qFbEyQ7oTQ3GZrMfth5JkbN3EvTKLXcHLRDSXeLnlvlOn0wvxVIwK5o2M8JzP/OWz7T3NRsbw==" + }, "node_modules/@types/node": { "version": "17.0.8", "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.8.tgz", @@ -1172,25 +1208,31 @@ "node_modules/@types/prop-types": { "version": "15.7.4", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.4.tgz", - "integrity": "sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ==", - "dev": true + "integrity": "sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ==" }, "node_modules/@types/react": { "version": "17.0.38", "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.38.tgz", "integrity": "sha512-SI92X1IA+FMnP3qM5m4QReluXzhcmovhZnLNm3pyeQlooi02qI7sLiepEYqT678uNiyc25XfCqxREFpy3W7YhQ==", - "dev": true, "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", "csstype": "^3.0.2" } }, + "node_modules/@types/react-virtualized": { + "version": "9.21.16", + "resolved": "https://registry.npmjs.org/@types/react-virtualized/-/react-virtualized-9.21.16.tgz", + "integrity": "sha512-25QMrouz1VKq5T68+9JfRq3GP4JmN20ARi+hl5z7NMmriy07XmGd1Yh3I4EIZjmifpXhHZoQS/ny2fzZRyiAiw==", + "dependencies": { + "@types/prop-types": "*", + "@types/react": "*" + } + }, "node_modules/@types/scheduler": { "version": "0.16.2", "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", - "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", - "dev": true + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" }, "node_modules/@typescript-eslint/parser": { "version": "5.9.0", @@ -1951,6 +1993,14 @@ "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz", "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==" }, + "node_modules/clsx": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz", + "integrity": "sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==", + "engines": { + "node": ">=6" + } + }, "node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -2146,8 +2196,7 @@ "node_modules/csstype": { "version": "3.0.10", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.10.tgz", - "integrity": "sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA==", - "dev": true + "integrity": "sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA==" }, "node_modules/damerau-levenshtein": { "version": "1.0.8", @@ -2163,6 +2212,18 @@ "node": ">= 6" } }, + "node_modules/date-fns": { + "version": "2.28.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.28.0.tgz", + "integrity": "sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw==", + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, "node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -2279,6 +2340,34 @@ "node": ">=6.0.0" } }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "node_modules/dom-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dom-lib/-/dom-lib-3.0.1.tgz", + "integrity": "sha512-8ejYOFLj2Qxa9+UAkomy978SmZSirb9d/UKm+0/DAx1XwvkYlIfyykuNOVe5egic4Ekc6N8Mj3rD1O2owQ4Mxw==", + "dependencies": { + "@babel/runtime": "^7.16.0" + } + }, + "node_modules/dom-lib/node_modules/@babel/runtime": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.0.tgz", + "integrity": "sha512-etcO/ohMNaNA2UBdaXBBSX/3aEzFMRrVfaPv8Ptc0k+cWpWW0QFiGZ2XnVqQZI1Cf734LbPGmqBKWESfW4x/dQ==", + "dependencies": { + "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/domain-browser": { "version": "4.19.0", "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-4.19.0.tgz", @@ -3624,6 +3713,11 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, + "node_modules/insert-css": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/insert-css/-/insert-css-2.0.0.tgz", + "integrity": "sha1-610Ql7dUL0x56jBg067gfQU4gPQ=" + }, "node_modules/internal-slot": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", @@ -4087,6 +4181,11 @@ "node": ">=8" } }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -4867,7 +4966,6 @@ "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dev": true, "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", @@ -4877,8 +4975,7 @@ "node_modules/prop-types/node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "node_modules/public-encrypt": { "version": "4.0.3", @@ -5026,6 +5123,11 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" }, + "node_modules/react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" + }, "node_modules/react-refresh": { "version": "0.8.3", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.8.3.tgz", @@ -5151,6 +5253,73 @@ "inherits": "^2.0.1" } }, + "node_modules/rsuite": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/rsuite/-/rsuite-5.5.2.tgz", + "integrity": "sha512-QI50DptQG2KIsAHyVNVD70qr9bzb+DXqu1BTxIIXX4pxya3ru632g2xY082InzlrHDEnAASxbmGVBkR92OeuyQ==", + "dependencies": { + "@babel/runtime": "^7.8.4", + "@juggle/resize-observer": "^3.3.1", + "@rsuite/icons": "^1.0.2", + "@types/chai": "^4.2.18", + "@types/lodash": "^4.14.134", + "@types/prop-types": "^15.7.4", + "@types/react-virtualized": "^9.21.11", + "classnames": "^2.3.1", + "date-fns": "^2.13.0", + "dom-lib": "^3.0.0", + "lodash": "^4.17.11", + "prop-types": "^15.7.2", + "react-virtualized": "^9.22.3", + "rsuite-table": "^5.3.2", + "schema-typed": "^2.0.2" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/rsuite-table": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/rsuite-table/-/rsuite-table-5.3.2.tgz", + "integrity": "sha512-4ZAxHLdKt9UojE7UqDzUxbzPBwYNMRsrwwJSmrwq18Afqk83HX/7UFCXPhxLX3wu49SVX6pnkAE9I5K1EB2/ug==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "@juggle/resize-observer": "^3.3.1", + "@rsuite/icons": "^1.0.0", + "classnames": "^2.2.5", + "dom-lib": "^3.0.0", + "lodash": "^4.17.21", + "react-is": "^17.0.2" + }, + "peerDependencies": { + "prop-types": "^15.7.2", + "react": "^0.14.9 || >=15.3.0", + "react-dom": "^0.14.9 || >=15.3.0" + } + }, + "node_modules/rsuite/node_modules/classnames": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz", + "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==" + }, + "node_modules/rsuite/node_modules/react-virtualized": { + "version": "9.22.3", + "resolved": "https://registry.npmjs.org/react-virtualized/-/react-virtualized-9.22.3.tgz", + "integrity": "sha512-MKovKMxWTcwPSxE1kK1HcheQTWfuCxAuBoSTf2gwyMM21NdX/PXUhnoP8Uc5dRKd+nKm8v41R36OellhdCpkrw==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "clsx": "^1.0.4", + "dom-helpers": "^5.1.3", + "loose-envify": "^1.4.0", + "prop-types": "^15.7.2", + "react-lifecycles-compat": "^3.0.4" + }, + "peerDependencies": { + "react": "^15.3.0 || ^16.0.0-alpha", + "react-dom": "^15.3.0 || ^16.0.0-alpha" + } + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -5212,6 +5381,25 @@ "object-assign": "^4.1.1" } }, + "node_modules/schema-typed": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/schema-typed/-/schema-typed-2.0.2.tgz", + "integrity": "sha512-E8GAANjZ8oYwyQJEyf/93W1QERTCwu8N7aMUbgBWbYvqzZE8f/kAZaL5D9knr7yLEgMnwJQ4pd8x8EVZ0PpzUA==", + "dependencies": { + "@babel/runtime": "^7.16.0" + } + }, + "node_modules/schema-typed/node_modules/@babel/runtime": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.0.tgz", + "integrity": "sha512-etcO/ohMNaNA2UBdaXBBSX/3aEzFMRrVfaPv8Ptc0k+cWpWW0QFiGZ2XnVqQZI1Cf734LbPGmqBKWESfW4x/dQ==", + "dependencies": { + "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -6640,6 +6828,11 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, + "@juggle/resize-observer": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.3.1.tgz", + "integrity": "sha512-zMM9Ds+SawiUkakS7y94Ymqx+S0ORzpG3frZirN3l+UlXUmSUR7hF4wxCVqW+ei94JzV5kt0uXBcoOEAuiydrw==" + }, "@napi-rs/triples": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@napi-rs/triples/-/triples-1.0.3.tgz", @@ -6838,18 +7031,44 @@ "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-3.7.0-31.8746e055198f517658c08a0c426c7eec87f5a85f.tgz", "integrity": "sha512-+qx2b+HK7BKF4VCa0LZ/t1QCXsu6SmvhUQyJkOD2aPpmOzket4fEnSKQZSB0i5tl7rwCDsvAiSeK8o7rf+yvwg==" }, + "@rsuite/icon-font": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@rsuite/icon-font/-/icon-font-4.0.0.tgz", + "integrity": "sha512-rZTgpTH3H3HLczCA2rnkWfoMKm0ZXoRzsrkVujfP/FfslnKUMvO6w56pa8pCvhWGpNEPUsLS2ULnFGpTEcup/Q==" + }, + "@rsuite/icons": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rsuite/icons/-/icons-1.0.2.tgz", + "integrity": "sha512-Y7vJNDQpJnFlyYSUXQ2iQ9Meg7+ZKcrIenhpYDdM3c7vYDE/L7pml+hrK28jk6QfV/QkVv5B504D+l7aM6AAJQ==", + "requires": { + "@rsuite/icon-font": "^4.0.0", + "classnames": "^2.2.5", + "insert-css": "^2.0.0", + "lodash": "^4.17.20" + } + }, "@rushstack/eslint-patch": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.1.0.tgz", "integrity": "sha512-JLo+Y592QzIE+q7Dl2pMUtt4q8SKYI5jDrZxrozEQxnGVOyYE+GWK9eLkwTaeN9DDctlaRAQ3TBmzZ1qdLE30A==", "dev": true }, + "@types/chai": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.0.tgz", + "integrity": "sha512-/ceqdqeRraGolFTcfoXNiqjyQhZzbINDngeoAq9GoHa8PPK1yNzTaxWjA6BFWp5Ua9JpXEMSS4s5i9tS0hOJtw==" + }, "@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", "dev": true }, + "@types/lodash": { + "version": "4.14.178", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.178.tgz", + "integrity": "sha512-0d5Wd09ItQWH1qFbEyQ7oTQ3GZrMfth5JkbN3EvTKLXcHLRDSXeLnlvlOn0wvxVIwK5o2M8JzP/OWz7T3NRsbw==" + }, "@types/node": { "version": "17.0.8", "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.8.tgz", @@ -6864,25 +7083,31 @@ "@types/prop-types": { "version": "15.7.4", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.4.tgz", - "integrity": "sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ==", - "dev": true + "integrity": "sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ==" }, "@types/react": { "version": "17.0.38", "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.38.tgz", "integrity": "sha512-SI92X1IA+FMnP3qM5m4QReluXzhcmovhZnLNm3pyeQlooi02qI7sLiepEYqT678uNiyc25XfCqxREFpy3W7YhQ==", - "dev": true, "requires": { "@types/prop-types": "*", "@types/scheduler": "*", "csstype": "^3.0.2" } }, + "@types/react-virtualized": { + "version": "9.21.16", + "resolved": "https://registry.npmjs.org/@types/react-virtualized/-/react-virtualized-9.21.16.tgz", + "integrity": "sha512-25QMrouz1VKq5T68+9JfRq3GP4JmN20ARi+hl5z7NMmriy07XmGd1Yh3I4EIZjmifpXhHZoQS/ny2fzZRyiAiw==", + "requires": { + "@types/prop-types": "*", + "@types/react": "*" + } + }, "@types/scheduler": { "version": "0.16.2", "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", - "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", - "dev": true + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" }, "@typescript-eslint/parser": { "version": "5.9.0", @@ -7437,6 +7662,11 @@ "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz", "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==" }, + "clsx": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz", + "integrity": "sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==" + }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -7605,8 +7835,7 @@ "csstype": { "version": "3.0.10", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.10.tgz", - "integrity": "sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA==", - "dev": true + "integrity": "sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA==" }, "damerau-levenshtein": { "version": "1.0.8", @@ -7619,6 +7848,11 @@ "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz", "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==" }, + "date-fns": { + "version": "2.28.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.28.0.tgz", + "integrity": "sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw==" + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -7719,6 +7953,33 @@ "esutils": "^2.0.2" } }, + "dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "requires": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "dom-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dom-lib/-/dom-lib-3.0.1.tgz", + "integrity": "sha512-8ejYOFLj2Qxa9+UAkomy978SmZSirb9d/UKm+0/DAx1XwvkYlIfyykuNOVe5egic4Ekc6N8Mj3rD1O2owQ4Mxw==", + "requires": { + "@babel/runtime": "^7.16.0" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.0.tgz", + "integrity": "sha512-etcO/ohMNaNA2UBdaXBBSX/3aEzFMRrVfaPv8Ptc0k+cWpWW0QFiGZ2XnVqQZI1Cf734LbPGmqBKWESfW4x/dQ==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + } + } + }, "domain-browser": { "version": "4.19.0", "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-4.19.0.tgz", @@ -8718,6 +8979,11 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, + "insert-css": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/insert-css/-/insert-css-2.0.0.tgz", + "integrity": "sha1-610Ql7dUL0x56jBg067gfQU4gPQ=" + }, "internal-slot": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", @@ -9041,6 +9307,11 @@ "p-locate": "^4.1.0" } }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, "lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -9602,7 +9873,6 @@ "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dev": true, "requires": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", @@ -9612,8 +9882,7 @@ "react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" } } }, @@ -9729,6 +9998,11 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" }, + "react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" + }, "react-refresh": { "version": "0.8.3", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.8.3.tgz", @@ -9814,6 +10088,62 @@ "inherits": "^2.0.1" } }, + "rsuite": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/rsuite/-/rsuite-5.5.2.tgz", + "integrity": "sha512-QI50DptQG2KIsAHyVNVD70qr9bzb+DXqu1BTxIIXX4pxya3ru632g2xY082InzlrHDEnAASxbmGVBkR92OeuyQ==", + "requires": { + "@babel/runtime": "^7.8.4", + "@juggle/resize-observer": "^3.3.1", + "@rsuite/icons": "^1.0.2", + "@types/chai": "^4.2.18", + "@types/lodash": "^4.14.134", + "@types/prop-types": "^15.7.4", + "@types/react-virtualized": "^9.21.11", + "classnames": "^2.3.1", + "date-fns": "^2.13.0", + "dom-lib": "^3.0.0", + "lodash": "^4.17.11", + "prop-types": "^15.7.2", + "react-virtualized": "^9.22.3", + "rsuite-table": "^5.3.2", + "schema-typed": "^2.0.2" + }, + "dependencies": { + "classnames": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz", + "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==" + }, + "react-virtualized": { + "version": "9.22.3", + "resolved": "https://registry.npmjs.org/react-virtualized/-/react-virtualized-9.22.3.tgz", + "integrity": "sha512-MKovKMxWTcwPSxE1kK1HcheQTWfuCxAuBoSTf2gwyMM21NdX/PXUhnoP8Uc5dRKd+nKm8v41R36OellhdCpkrw==", + "requires": { + "@babel/runtime": "^7.7.2", + "clsx": "^1.0.4", + "dom-helpers": "^5.1.3", + "loose-envify": "^1.4.0", + "prop-types": "^15.7.2", + "react-lifecycles-compat": "^3.0.4" + } + } + } + }, + "rsuite-table": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/rsuite-table/-/rsuite-table-5.3.2.tgz", + "integrity": "sha512-4ZAxHLdKt9UojE7UqDzUxbzPBwYNMRsrwwJSmrwq18Afqk83HX/7UFCXPhxLX3wu49SVX6pnkAE9I5K1EB2/ug==", + "requires": { + "@babel/runtime": "^7.12.5", + "@juggle/resize-observer": "^3.3.1", + "@rsuite/icons": "^1.0.0", + "classnames": "^2.2.5", + "dom-lib": "^3.0.0", + "lodash": "^4.17.21", + "react-is": "^17.0.2" + } + }, "run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -9847,6 +10177,24 @@ "object-assign": "^4.1.1" } }, + "schema-typed": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/schema-typed/-/schema-typed-2.0.2.tgz", + "integrity": "sha512-E8GAANjZ8oYwyQJEyf/93W1QERTCwu8N7aMUbgBWbYvqzZE8f/kAZaL5D9knr7yLEgMnwJQ4pd8x8EVZ0PpzUA==", + "requires": { + "@babel/runtime": "^7.16.0" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.0.tgz", + "integrity": "sha512-etcO/ohMNaNA2UBdaXBBSX/3aEzFMRrVfaPv8Ptc0k+cWpWW0QFiGZ2XnVqQZI1Cf734LbPGmqBKWESfW4x/dQ==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + } + } + }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", diff --git a/package.json b/package.json index 6610461..9385f30 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "next": "12.0.7", "react": "17.0.2", "react-dom": "17.0.2", + "rsuite": "^5.5.2", "xml2js": "^0.4.23", "xmlbuilder": "^15.1.1" }, diff --git a/pages/_app.tsx b/pages/_app.tsx index 3f5c9d5..55eb596 100644 --- a/pages/_app.tsx +++ b/pages/_app.tsx @@ -1,8 +1,14 @@ import '../styles/globals.css' import type { AppProps } from 'next/app' +import Layout from '../components/Layout' +import 'rsuite/dist/rsuite.min.css'; function MyApp({ Component, pageProps }: AppProps) { - return + return ( + + + + ) } export default MyApp diff --git a/pages/api/apps/index.ts b/pages/api/apps/index.ts index 6beeeb0..f02cb7f 100644 --- a/pages/api/apps/index.ts +++ b/pages/api/apps/index.ts @@ -1,10 +1,10 @@ import type { NextApiRequest, NextApiResponse } from 'next'; -import { apps } from '../../../services'; import type { App, IdPMetadata } from '../../../types'; +import prisma from '../../../lib/prisma'; export default async function handler( req: NextApiRequest, - res: NextApiResponse + res: NextApiResponse ) { switch (req.method) { @@ -18,12 +18,12 @@ export default async function handler( // Get all apps async function getAllApps() { - const appList = await apps.getAll(); + const apps = await prisma.app.findMany(); - return res.json(appList); + return res.json(apps); } - // Create a new app + // Create a new app async function createApp() { const { name, @@ -32,7 +32,14 @@ export default async function handler( description = null, } = req.body; - const app = await apps.create(name, description, acs_url, entity_id); + const app = await prisma.app.create({ + data: { + name, + acs_url, + entity_id, + description + } + }); return res.json(app); } diff --git a/pages/api/apps/metadata.ts b/pages/api/apps/metadata.ts index 8136ce2..46edadc 100644 --- a/pages/api/apps/metadata.ts +++ b/pages/api/apps/metadata.ts @@ -1,30 +1,60 @@ import type { NextApiRequest, NextApiResponse } from 'next'; import { createCertificate, createIdPMetadataXML } from '../../../utils'; +import { IdPMetadata } from '../../../types'; + +const idpEntityId = 'http://saml.example.com'; +const baseUrl = 'http://localhost:4000'; // TODO: Read from .env + +// https://boxyhqdemo.onelogin.com/trust/saml2/http-post/sso/a810f17d-48a8-4ac2-ae0f-253c823b272c +// https://dev-8924093.okta.com/app/dev-8924093_jacksondemo_1/exk3u9pl6jx4P9AE15d7/sso/saml +// https://accounts.google.com/o/saml2/idp?idpid=C02frd9s1 export default async function handler( req: NextApiRequest, - res: NextApiResponse + res: NextApiResponse ) { - if (req.method === 'POST') { - return await download(req); + + switch (req.method) { + case 'GET': + return await getMetadata(); + case 'POST': + return await downloadMetadata(); + default: + return res.status(405).end(`Method ${req.method} Not Allowed`); } - async function download(req: NextApiRequest) { - const { acs_url, sp_entity_id } = req.body; + // Get metadata for an app + async function getMetadata() { + //const {id} = req.query; + const appId = '0480c44e-f200-4f72-8af0-a5a57611fd2d'; + + const metadata = { + certificate: await createCertificate(), + fingerprint: '', + sso_url: `${baseUrl}/saml2/app/${appId}`, + entity_id: idpEntityId, + } + + return res.json(metadata); + } + + // Download metadata for an app + async function downloadMetadata() { + const appId = '0480c44e-f200-4f72-8af0-a5a57611fd2d'; const certificate = await createCertificate(); const idpEntityId = 'http://localhost:4000/sso'; const idpSsoUrl = 'http://localhost:4000/sso'; - + const xml = await createIdPMetadataXML({ idpEntityId, idpSsoUrl, certificate, }); - + res.setHeader('Content-type', 'text/xml'); res.setHeader('Content-Disposition', 'attachment; filename="metadata.xml"'); - + return res.send(xml); } } diff --git a/pages/apps/[id].tsx b/pages/apps/[id].tsx new file mode 100644 index 0000000..099758a --- /dev/null +++ b/pages/apps/[id].tsx @@ -0,0 +1,41 @@ +import prisma from '../../lib/prisma'; +import { GetServerSideProps } from 'next'; +import React from 'react'; +import { App } from '../../types'; +import axios from 'axios'; +import { IdPMetadata } from '../../types'; + +export const getServerSideProps: GetServerSideProps = async ({ params }) => { + const app = await prisma.app.findUnique({ + where: { + id: params?.id, + } + }); + + const metadata = await axios.get('http://localhost:4000/api/apps/metadata'); + + return { + props: { + app, + metadata: metadata.data, + }, + }; +}; + +const ShowApp: React.FC<{app: App, metadata: IdPMetadata}> = ({app, metadata}) => { + return ( +
+

Id: {app.id}

+

name: {app.name}

+

acs_url: {app.acs_url}

+

entity_id: {app.entity_id}

+ + Metadata +

sso_url: {metadata.sso_url}

+

entity_id: {metadata.entity_id}

+

certificate: {metadata.certificate}

+
+ ); +}; + +export default ShowApp; \ No newline at end of file diff --git a/pages/apps/demo.tsx b/pages/apps/demo.tsx new file mode 100644 index 0000000..674feef --- /dev/null +++ b/pages/apps/demo.tsx @@ -0,0 +1,13 @@ +import type { NextPage } from 'next'; +import { useEffect, useRef, useState } from 'react'; +import { Sidenav, Nav, Dropdown } from 'rsuite'; + +const Demo: NextPage = (prop) => { + return ( +
+

Hello from demo

+
+ ); +}; + +export default Demo; \ No newline at end of file diff --git a/pages/apps/index.tsx b/pages/apps/index.tsx index f566259..d2ba9e2 100644 --- a/pages/apps/index.tsx +++ b/pages/apps/index.tsx @@ -4,6 +4,7 @@ import { ChangeEvent, FormEvent, useState } from 'react'; const Apps: NextPage = () => { const [formData, setFormData] = useState({ + name: null, acs_url: null, entity_id: null, }); @@ -41,27 +42,34 @@ const Apps: NextPage = () => { return (
-
+
-
+ +
+
-
- +
- + -
    +
    • SSO URL:

      {metadata.sso_url}
    • Entity ID:

      {metadata.entity_id}
    • Certificate:

      {metadata.certificate}
    • diff --git a/services/apps.ts b/services/apps.ts deleted file mode 100644 index 531c4db..0000000 --- a/services/apps.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { PrismaClient } from '@prisma/client'; -import type { App } from '../types'; - -const prisma = new PrismaClient(); - -const create = async function(name: string, description: string, acsUrl: string, entityId: string): Promise { - const body = { - name, - description, - acs_url: acsUrl, - entity_id: entityId, - } - - return await prisma.app.create({ data: body }); -} - -const getAll = async function(): Promise { - return await prisma.app.findMany(); -} - -const getById = async function(id: string): Promise { - return await prisma.app.findUnique({ - where: { - id, - }, - }); -} - -export { - create, - getAll, - getById, -} \ No newline at end of file diff --git a/services/index.ts b/services/index.ts deleted file mode 100644 index f7aa2c2..0000000 --- a/services/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * as apps from './apps'; -export * as metadata from './metadata'; diff --git a/services/metadata.ts b/services/metadata.ts deleted file mode 100644 index 6975b34..0000000 --- a/services/metadata.ts +++ /dev/null @@ -1,20 +0,0 @@ -import type { IdPMetadata } from '../types'; - -const baseUrl = 'http://localhost:3000/saml'; - -export const create = ( - acs_url: string, - entity_id: string, - certificate: string -): IdPMetadata => { - const params = new URLSearchParams({ - acs_url, - entity_id, - }).toString(); - - return { - sso_url: `${baseUrl}?${params}`, - entity_id: `${baseUrl}?${params}`, - certificate: certificate, - }; -}; diff --git a/types/index.ts b/types/index.ts index 41129f2..0632780 100644 --- a/types/index.ts +++ b/types/index.ts @@ -12,7 +12,7 @@ export type App = { id: string; name: string; description?: string | null; - certificate?: string; + certificate?: string | null; } & ServiceProvider; export type IdPMetadata = {