From f93d935175b841c7c3e1307b42654fc0a73524d8 Mon Sep 17 00:00:00 2001 From: Meier Lukas Date: Tue, 1 Aug 2023 11:43:24 +0200 Subject: [PATCH] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Rename=20registration=20to?= =?UTF-8?q?ken=20to=20invite,=20add=20created=20by?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- prisma/schema.prisma | 33 ++++++++------- .../{register.json => invite.json} | 2 +- src/components/layout/header/Search.tsx | 2 +- .../copy-invite.modal.tsx} | 2 +- .../create-invite.modal.tsx} | 22 +++++----- .../delete-invite.modal.tsx} | 8 ++-- src/modals/delete-user/delete-user.modal.tsx | 2 +- src/modals/modals.ts | 16 ++++---- src/pages/auth/invite/[inviteId].tsx | 12 +++--- src/pages/manage/users/create.tsx | 4 +- src/pages/manage/users/index.tsx | 2 +- src/pages/manage/users/invites.tsx | 40 ++++++++++--------- src/pages/user/preferences.tsx | 4 +- src/server/api/root.ts | 4 +- .../{registrationTokens.ts => invite.ts} | 31 +++++++++----- src/server/api/routers/user.ts | 18 ++++----- src/tools/server/translation-namespaces.ts | 2 +- .../{registration-token.ts => invite.ts} | 2 +- 18 files changed, 109 insertions(+), 97 deletions(-) rename public/locales/en/authentication/{register.json => invite.json} (91%) rename src/modals/{copy-regristration-token/copy-registration-token.modal.tsx => copy-invite/copy-invite.modal.tsx} (96%) rename src/modals/{create-registration-token/create-registration-token.modal.tsx => create-invite/create-invite.modal.tsx} (73%) rename src/modals/{delete-registration-token/delete-registration-token.modal.tsx => delete-invite/delete-invite.modal.tsx} (79%) rename src/server/api/routers/{registrationTokens.ts => invite.ts} (61%) rename src/validations/{registration-token.ts => invite.ts} (75%) diff --git a/prisma/schema.prisma b/prisma/schema.prisma index e270f9d71..b948183b5 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -42,17 +42,18 @@ model Session { } model User { - id String @id @default(cuid()) - name String? - email String? @unique - emailVerified DateTime? - image String? - password String? - salt String? - isAdmin Boolean @default(false) - accounts Account[] - sessions Session[] - settings UserSettings? + id String @id @default(cuid()) + name String? + email String? @unique + emailVerified DateTime? + image String? + password String? + salt String? + isAdmin Boolean @default(false) + accounts Account[] + sessions Session[] + settings UserSettings? + createdInvites Invite[] } model VerificationToken { @@ -63,10 +64,12 @@ model VerificationToken { @@unique([identifier, token]) } -model RegistrationToken { - id String @id @default(cuid()) - token String @unique - expires DateTime +model Invite { + id String @id @default(cuid()) + token String @unique + expires DateTime + createdById String + createdBy User @relation(fields: [createdById], references: [id], onDelete: Cascade) } model UserSettings { diff --git a/public/locales/en/authentication/register.json b/public/locales/en/authentication/invite.json similarity index 91% rename from public/locales/en/authentication/register.json rename to public/locales/en/authentication/invite.json index 9173bb76f..ce44ab605 100644 --- a/public/locales/en/authentication/register.json +++ b/public/locales/en/authentication/invite.json @@ -14,7 +14,7 @@ } }, "buttons": { - "submit": "Register" + "submit": "Create account" } } } \ No newline at end of file diff --git a/src/components/layout/header/Search.tsx b/src/components/layout/header/Search.tsx index b919a3407..b06bced40 100644 --- a/src/components/layout/header/Search.tsx +++ b/src/components/layout/header/Search.tsx @@ -23,7 +23,7 @@ export const Search = ({ isMobile }: SearchProps) => { const [search, setSearch] = useState(''); const ref = useRef(null); useHotkeys([['mod+K', () => ref.current?.focus()]]); - const { data: userWithSettings } = api.user.getWithSettings.useQuery(); + const { data: userWithSettings } = api.user.withSettings.useQuery(); const { config } = useConfigContext(); const { colors } = useMantineTheme(); const router = useRouter(); diff --git a/src/modals/copy-regristration-token/copy-registration-token.modal.tsx b/src/modals/copy-invite/copy-invite.modal.tsx similarity index 96% rename from src/modals/copy-regristration-token/copy-registration-token.modal.tsx rename to src/modals/copy-invite/copy-invite.modal.tsx index f4b2615e2..178a8960c 100644 --- a/src/modals/copy-regristration-token/copy-registration-token.modal.tsx +++ b/src/modals/copy-invite/copy-invite.modal.tsx @@ -2,7 +2,7 @@ import { Button, Mark, Stack, Text } from '@mantine/core'; import { ContextModalProps, modals } from '@mantine/modals'; import Link from 'next/link'; -export const CopyRegistrationToken = ({ +export const CopyInviteModal = ({ context, id, innerProps, diff --git a/src/modals/create-registration-token/create-registration-token.modal.tsx b/src/modals/create-invite/create-invite.modal.tsx similarity index 73% rename from src/modals/create-registration-token/create-registration-token.modal.tsx rename to src/modals/create-invite/create-invite.modal.tsx index d7763eefc..c3aa7c445 100644 --- a/src/modals/create-registration-token/create-registration-token.modal.tsx +++ b/src/modals/create-invite/create-invite.modal.tsx @@ -5,24 +5,20 @@ import { ContextModalProps, modals } from '@mantine/modals'; import dayjs from 'dayjs'; import { api } from '~/utils/api'; import { useI18nZodResolver } from '~/utils/i18n-zod-resolver'; -import { createRegistrationTokenSchema } from '~/validations/registration-token'; +import { createInviteSchema } from '~/validations/invite'; -export const CreateRegistrationTokenModal = ({ - context, - id, - innerProps, -}: ContextModalProps<{}>) => { +export const CreateInviteModal = ({ id }: ContextModalProps<{}>) => { const apiContext = api.useContext(); - const { isLoading, mutateAsync } = api.registrationTokens.createRegistrationToken.useMutation({ + const { isLoading, mutateAsync } = api.invites.create.useMutation({ onSuccess: async (data) => { - await apiContext.registrationTokens.getAllInvites.invalidate(); + await apiContext.invites.all.invalidate(); modals.close(id); modals.openContextModal({ - modal: 'copyRegistrationTokenModal', + modal: 'copyInviteModal', title: Copy invitation, innerProps: data, - }) + }); }, }); @@ -35,14 +31,14 @@ export const CreateRegistrationTokenModal = ({ initialValues: { expirationDate: dayjs().add(7, 'days').toDate(), }, - validate: i18nZodResolver(createRegistrationTokenSchema), + validate: i18nZodResolver(createInviteSchema), }); return ( - After the expiration, a token will no longer be valid and the recipient of the token won't - be able to create an account. + After the expiration, an invite will no longer be valid and the recipient of the invite + won't be able to create an account. ) => { const apiContext = api.useContext(); - const { isLoading, mutateAsync } = api.registrationTokens.deleteRegistrationToken.useMutation({ + const { isLoading, mutateAsync } = api.invites.delete.useMutation({ onSuccess: async () => { - await apiContext.registrationTokens.getAllInvites.invalidate(); + await apiContext.invites.all.invalidate(); modals.close(id); }, }); @@ -18,7 +18,7 @@ export const DeleteRegistrationTokenModal = ({ Are you sure, that you want to delete this invitation? Users with this link will no longer - be able to register using that link. + be able to create an account using that link. diff --git a/src/modals/delete-user/delete-user.modal.tsx b/src/modals/delete-user/delete-user.modal.tsx index 4c3b98908..71f10243d 100644 --- a/src/modals/delete-user/delete-user.modal.tsx +++ b/src/modals/delete-user/delete-user.modal.tsx @@ -10,7 +10,7 @@ export const DeleteUserModal = ({ const apiContext = api.useContext(); const { isLoading, mutateAsync } = api.user.deleteUser.useMutation({ onSuccess: async () => { - await apiContext.user.getAll.invalidate(); + await apiContext.user.all.invalidate(); modals.close(id); }, }); diff --git a/src/modals/modals.ts b/src/modals/modals.ts index 2f2cb8aa3..fc4377e78 100644 --- a/src/modals/modals.ts +++ b/src/modals/modals.ts @@ -6,12 +6,12 @@ import { WidgetsEditModal } from '~/components/Dashboard/Tiles/Widgets/WidgetsEd import { WidgetsRemoveModal } from '~/components/Dashboard/Tiles/Widgets/WidgetsRemoveModal'; import { CategoryEditModal } from '~/components/Dashboard/Wrappers/Category/CategoryEditModal'; -import { DeleteUserModal } from './delete-user/delete-user.modal'; -import { CreateRegistrationTokenModal } from './create-registration-token/create-registration-token.modal'; -import { DeleteRegistrationTokenModal } from './delete-registration-token/delete-registration-token.modal'; +import { CopyInviteModal } from './copy-invite/copy-invite.modal'; import { CreateDashboardModal } from './create-dashboard/create-dashboard.modal'; -import { CopyRegistrationToken } from './copy-regristration-token/copy-registration-token.modal'; +import { CreateInviteModal } from './create-invite/create-invite.modal'; import { DeleteBoardModal } from './delete-board/delete-board.modal'; +import { DeleteInviteModal } from './delete-invite/delete-invite.modal'; +import { DeleteUserModal } from './delete-user/delete-user.modal'; export const modals = { editApp: EditAppModal, @@ -22,11 +22,11 @@ export const modals = { changeAppPositionModal: ChangeAppPositionModal, changeIntegrationPositionModal: ChangeWidgetPositionModal, deleteUserModal: DeleteUserModal, - createRegistrationTokenModal: CreateRegistrationTokenModal, - deleteRegistrationTokenModal: DeleteRegistrationTokenModal, + createInviteModal: CreateInviteModal, + deleteInviteModal: DeleteInviteModal, createDashboardModal: CreateDashboardModal, - copyRegistrationTokenModal: CopyRegistrationToken, - deleteBoardModal: DeleteBoardModal + copyInviteModal: CopyInviteModal, + deleteBoardModal: DeleteBoardModal, }; declare module '@mantine/modals' { diff --git a/src/pages/auth/invite/[inviteId].tsx b/src/pages/auth/invite/[inviteId].tsx index f3c96753d..ca2876805 100644 --- a/src/pages/auth/invite/[inviteId].tsx +++ b/src/pages/auth/invite/[inviteId].tsx @@ -8,17 +8,17 @@ import { serverSideTranslations } from 'next-i18next/serverSideTranslations'; import { useRouter } from 'next/router'; import { z } from 'zod'; import { prisma } from '~/server/db'; -import { registerNamespaces } from '~/tools/server/translation-namespaces'; +import { inviteNamespaces } from '~/tools/server/translation-namespaces'; import { api } from '~/utils/api'; import { useI18nZodResolver } from '~/utils/i18n-zod-resolver'; import { signUpFormSchema } from '~/validations/user'; export default function AuthInvitePage() { - const { t } = useTranslation('authentication/register'); + const { t } = useTranslation('authentication/invite'); const { i18nZodResolver } = useI18nZodResolver(); const router = useRouter(); const query = router.query as { token: string }; - const { mutateAsync } = api.user.register.useMutation(); + const { mutateAsync } = api.user.createFromInvite.useMutation(); const form = useForm>({ validateInputOnChange: true, @@ -37,7 +37,7 @@ export default function AuthInvitePage() { void mutateAsync( { ...values, - registerToken: query.token, + inviteToken: query.token, }, { onSuccess() { @@ -124,7 +124,7 @@ export const getServerSideProps: GetServerSideProps = async ({ locale, query, pa }; } - const token = await prisma.registrationToken.findUnique({ + const token = await prisma.invite.findUnique({ where: { id: routeParams.data.inviteId, token: queryParams.data.token, @@ -139,7 +139,7 @@ export const getServerSideProps: GetServerSideProps = async ({ locale, query, pa return { props: { - ...(await serverSideTranslations(locale ?? '', registerNamespaces)), + ...(await serverSideTranslations(locale ?? '', inviteNamespaces)), }, }; }; diff --git a/src/pages/manage/users/create.tsx b/src/pages/manage/users/create.tsx index eb75c343c..11e1cdba4 100644 --- a/src/pages/manage/users/create.tsx +++ b/src/pages/manage/users/create.tsx @@ -49,9 +49,9 @@ const CreateNewUserPage = () => { }); const context = api.useContext(); - const { mutateAsync, isLoading } = api.user.createUser.useMutation({ + const { mutateAsync, isLoading } = api.user.create.useMutation({ onSettled: () => { - void context.user.getAll.invalidate(); + void context.user.all.invalidate(); }, onSuccess: () => { nextStep(); diff --git a/src/pages/manage/users/index.tsx b/src/pages/manage/users/index.tsx index 84743bf57..00f9d985b 100644 --- a/src/pages/manage/users/index.tsx +++ b/src/pages/manage/users/index.tsx @@ -24,7 +24,7 @@ const ManageUsersPage = () => { const [activePage, setActivePage] = useState(0); const [nonDebouncedSearch, setNonDebouncedSearch] = useState(''); const [debouncedSearch] = useDebouncedValue(nonDebouncedSearch, 200); - const { data } = api.user.getAll.useQuery({ + const { data } = api.user.all.useQuery({ page: activePage, search: debouncedSearch, }); diff --git a/src/pages/manage/users/invites.tsx b/src/pages/manage/users/invites.tsx index 123f4ad2b..3c89908a3 100644 --- a/src/pages/manage/users/invites.tsx +++ b/src/pages/manage/users/invites.tsx @@ -19,7 +19,7 @@ import { api } from '~/utils/api'; const ManageUserInvitesPage = () => { const [activePage, setActivePage] = useState(0); - const { data } = api.registrationTokens.getAllInvites.useQuery({ + const { data } = api.invites.all.useQuery({ page: activePage, }); @@ -40,17 +40,17 @@ const ManageUserInvitesPage = () => { Manage user invites - Using registration tokens, you can invite users to your Homarr instance. An invitation will - only be valid for a certain time-span and can be used once. The expiration must be between 5 - minutes and 12 months upon creation. + Using invites, you can invite users to your Homarr instance. An invitation will only be + valid for a certain time-span and can be used once. The expiration must be between 5 minutes + and 12 months upon creation.