From 5be194235c34c1a24b6c413a7dedbdbe6aa934af Mon Sep 17 00:00:00 2001 From: daniel31x13 Date: Wed, 24 Jan 2024 15:48:40 -0500 Subject: [PATCH] finalized adding support for access tokens --- .../{NewKeyModal.tsx => NewTokenModal.tsx} | 77 ++++++++-------- components/ModalContent/RevokeTokenModal.tsx | 62 +++++++++++++ components/SettingsSidebar.tsx | 2 +- lib/api/controllers/tokens/getTokens.ts | 7 +- lib/api/controllers/tokens/postToken.ts | 24 ++--- .../tokens/tokenId/deleteTokenById.ts | 14 ++- lib/api/verifyToken.ts | 36 ++++++++ lib/api/verifyUser.ts | 22 ++--- pages/api/v1/archives/[linkId].ts | 6 +- pages/api/v1/avatar/[id].ts | 6 +- pages/api/v1/public/users/[id].ts | 6 +- pages/api/v1/users/[id].ts | 20 ++--- pages/settings/access-tokens.tsx | 88 +++++++++++++++++-- .../migration.sql | 35 ++++++++ .../migration.sql | 2 + prisma/schema.prisma | 7 +- store/tokens.ts | 56 ++++++++++++ types/global.ts | 2 +- 18 files changed, 366 insertions(+), 106 deletions(-) rename components/ModalContent/{NewKeyModal.tsx => NewTokenModal.tsx} (75%) create mode 100644 components/ModalContent/RevokeTokenModal.tsx create mode 100644 lib/api/verifyToken.ts create mode 100644 prisma/migrations/20240124192212_added_revoke_field/migration.sql create mode 100644 prisma/migrations/20240124201018_removed_name_unique_constraint/migration.sql create mode 100644 store/tokens.ts diff --git a/components/ModalContent/NewKeyModal.tsx b/components/ModalContent/NewTokenModal.tsx similarity index 75% rename from components/ModalContent/NewKeyModal.tsx rename to components/ModalContent/NewTokenModal.tsx index e058561..15887d8 100644 --- a/components/ModalContent/NewKeyModal.tsx +++ b/components/ModalContent/NewTokenModal.tsx @@ -1,25 +1,25 @@ import React, { useState } from "react"; import TextInput from "@/components/TextInput"; -import { KeyExpiry } from "@/types/global"; -import { useSession } from "next-auth/react"; +import { TokenExpiry } from "@/types/global"; import toast from "react-hot-toast"; import Modal from "../Modal"; +import useTokenStore from "@/store/tokens"; type Props = { onClose: Function; }; -export default function NewKeyModal({ onClose }: Props) { - const { data } = useSession(); - +export default function NewTokenModal({ onClose }: Props) { const [newToken, setNewToken] = useState(""); + const { addToken } = useTokenStore(); + const initial = { name: "", - expires: 0 as KeyExpiry, + expires: 0 as TokenExpiry, }; - const [key, setKey] = useState(initial as any); + const [token, setToken] = useState(initial as any); const [submitLoader, setSubmitLoader] = useState(false); @@ -27,30 +27,18 @@ export default function NewKeyModal({ onClose }: Props) { if (!submitLoader) { setSubmitLoader(true); - let response; - const load = toast.loading("Creating..."); - response = await fetch("/api/v1/tokens", { - method: "POST", - body: JSON.stringify({ - name: key.name, - expires: key.expires, - }), - }); - - const data = await response.json(); + const { ok, data } = await addToken(token); toast.dismiss(load); - if (response.ok) { + if (ok) { toast.success(`Created!`); - setNewToken(data.response); - } else toast.error(data.response as string); + setNewToken((data as any).secretKey); + } else toast.error(data as string); setSubmitLoader(false); - - return response; } }; @@ -90,8 +78,8 @@ export default function NewKeyModal({ onClose }: Props) {

Name

setKey({ ...key, name: e.target.value })} + value={token.name} + onChange={(e) => setToken({ ...token, name: e.target.value })} placeholder="e.g. For the iOS shortcut" className="bg-base-200" /> @@ -106,11 +94,11 @@ export default function NewKeyModal({ onClose }: Props) { role="button" className="btn btn-outline w-36 flex items-center btn-sm h-10" > - {key.expires === KeyExpiry.sevenDays && "7 Days"} - {key.expires === KeyExpiry.oneMonth && "30 Days"} - {key.expires === KeyExpiry.twoMonths && "60 Days"} - {key.expires === KeyExpiry.threeMonths && "90 Days"} - {key.expires === KeyExpiry.never && "No Expiration"} + {token.expires === TokenExpiry.sevenDays && "7 Days"} + {token.expires === TokenExpiry.oneMonth && "30 Days"} + {token.expires === TokenExpiry.twoMonths && "60 Days"} + {token.expires === TokenExpiry.threeMonths && "90 Days"} + {token.expires === TokenExpiry.never && "No Expiration"}