@sqrzro/addon-admins 4.0.0-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +5 -0
- package/dist/addon/config.d.ts +5 -0
- package/dist/addon/config.d.ts.map +1 -0
- package/dist/addon/config.js +11 -0
- package/dist/addon/index.d.ts +6 -0
- package/dist/addon/index.d.ts.map +1 -0
- package/dist/addon/index.js +9 -0
- package/dist/addon/interfaces.d.ts +7 -0
- package/dist/addon/interfaces.d.ts.map +1 -0
- package/dist/addon/interfaces.js +1 -0
- package/dist/addon.d.ts +4 -0
- package/dist/addon.d.ts.map +1 -0
- package/dist/addon.js +4 -0
- package/dist/components/AdminHomeActions/index.d.ts +7 -0
- package/dist/components/AdminHomeActions/index.d.ts.map +1 -0
- package/dist/components/AdminHomeActions/index.js +17 -0
- package/dist/components/AdminHomeActions/server.d.ts +8 -0
- package/dist/components/AdminHomeActions/server.d.ts.map +1 -0
- package/dist/components/AdminHomeActions/server.js +8 -0
- package/dist/components/AdminHomePage/index.d.ts +4 -0
- package/dist/components/AdminHomePage/index.d.ts.map +1 -0
- package/dist/components/AdminHomePage/index.js +11 -0
- package/dist/components/AdminListPage/index.d.ts +4 -0
- package/dist/components/AdminListPage/index.d.ts.map +1 -0
- package/dist/components/AdminListPage/index.js +9 -0
- package/dist/components/AdminPage/index.d.ts +4 -0
- package/dist/components/AdminPage/index.js +5 -0
- package/dist/components/Admins/index.d.ts +4 -0
- package/dist/components/Admins/index.d.ts.map +1 -0
- package/dist/components/Admins/index.js +15 -0
- package/dist/config.d.ts +4 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +10 -0
- package/dist/forms/AdminCreateForm/index.d.ts +3 -0
- package/dist/forms/AdminCreateForm/index.d.ts.map +1 -0
- package/dist/forms/AdminCreateForm/index.js +13 -0
- package/dist/forms/AdminCreateForm/interfaces.d.ts +5 -0
- package/dist/forms/AdminCreateForm/interfaces.d.ts.map +1 -0
- package/dist/forms/AdminCreateForm/interfaces.js +1 -0
- package/dist/forms/AdminCreateForm/server.d.ts +6 -0
- package/dist/forms/AdminCreateForm/server.d.ts.map +1 -0
- package/dist/forms/AdminCreateForm/server.js +22 -0
- package/dist/forms/AdminPersonalForm/index.d.ts +8 -0
- package/dist/forms/AdminPersonalForm/index.d.ts.map +1 -0
- package/dist/forms/AdminPersonalForm/index.js +13 -0
- package/dist/forms/AdminPersonalForm/interfaces.d.ts +7 -0
- package/dist/forms/AdminPersonalForm/interfaces.d.ts.map +1 -0
- package/dist/forms/AdminPersonalForm/interfaces.js +1 -0
- package/dist/forms/AdminPersonalForm/server.d.ts +6 -0
- package/dist/forms/AdminPersonalForm/server.d.ts.map +1 -0
- package/dist/forms/AdminPersonalForm/server.js +22 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/interfaces.d.ts +3 -0
- package/dist/interfaces.d.ts.map +1 -0
- package/dist/interfaces.js +1 -0
- package/dist/lists/AdminList/index.d.ts +4 -0
- package/dist/lists/AdminList/index.d.ts.map +1 -0
- package/dist/lists/AdminList/index.js +21 -0
- package/dist/lists/AdminList/server.d.ts +5 -0
- package/dist/lists/AdminList/server.d.ts.map +1 -0
- package/dist/lists/AdminList/server.js +6 -0
- package/dist/mail/AdminInviteMail.d.ts +6 -0
- package/dist/mail/AdminInviteMail.d.ts.map +1 -0
- package/dist/mail/AdminInviteMail.js +6 -0
- package/dist/register-admins-addon.d.ts +4 -0
- package/dist/register-admins-addon.d.ts.map +1 -0
- package/dist/register-admins-addon.js +5 -0
- package/dist/repositories/AdminRepository.d.ts +111 -0
- package/dist/repositories/AdminRepository.d.ts.map +1 -0
- package/dist/repositories/AdminRepository.js +66 -0
- package/dist/rules/email.d.ts +6 -0
- package/dist/rules/email.d.ts.map +1 -0
- package/dist/rules/email.js +11 -0
- package/dist/rules/id.d.ts +14 -0
- package/dist/rules/id.d.ts.map +1 -0
- package/dist/rules/id.js +13 -0
- package/dist/schema.d.ts +96 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +11 -0
- package/dist/utility/generate-admins-metadata.d.ts +5 -0
- package/dist/utility/generate-admins-metadata.d.ts.map +1 -0
- package/dist/utility/generate-admins-metadata.js +4 -0
- package/dist/utility/ids.d.ts +3 -0
- package/dist/utility/ids.d.ts.map +1 -0
- package/dist/utility/ids.js +1 -0
- package/dist/utility/interfaces.d.ts +5 -0
- package/dist/utility/interfaces.d.ts.map +1 -0
- package/dist/utility/interfaces.js +1 -0
- package/dist/utility/prepare-seed-admins.d.ts +4 -0
- package/dist/utility/prepare-seed-admins.d.ts.map +1 -0
- package/dist/utility/prepare-seed-admins.js +6 -0
- package/dist/utility/seed-admin.d.ts +10 -0
- package/dist/utility/seed-admin.d.ts.map +1 -0
- package/dist/utility/seed-admin.js +29 -0
- package/package.json +53 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
Copyright 2024 Richard Carter
|
|
2
|
+
|
|
3
|
+
Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
|
|
4
|
+
|
|
5
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { NodePgDatabase } from 'drizzle-orm/node-postgres';
|
|
2
|
+
import type { AdminsAddonConfigObject, BaseAdminsAddonConfigObject } from './interfaces';
|
|
3
|
+
export declare function setConfig(db: NodePgDatabase, cfg?: BaseAdminsAddonConfigObject): void;
|
|
4
|
+
export declare function getConfig(): AdminsAddonConfigObject;
|
|
5
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/addon/config.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAEhE,OAAO,KAAK,EAAE,uBAAuB,EAAE,2BAA2B,EAAE,MAAM,cAAc,CAAC;AAIzF,wBAAgB,SAAS,CAAC,EAAE,EAAE,cAAc,EAAE,GAAG,CAAC,EAAE,2BAA2B,GAAG,IAAI,CAErF;AAED,wBAAgB,SAAS,IAAI,uBAAuB,CAKnD"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { MissingConfigError } from '@sqrzro/addons';
|
|
2
|
+
let config = null;
|
|
3
|
+
export function setConfig(db, cfg) {
|
|
4
|
+
config = { ...cfg, db };
|
|
5
|
+
}
|
|
6
|
+
export function getConfig() {
|
|
7
|
+
if (!config) {
|
|
8
|
+
throw new MissingConfigError('admins');
|
|
9
|
+
}
|
|
10
|
+
return config;
|
|
11
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { AddonRegisterFunction } from '@sqrzro/addons';
|
|
2
|
+
import { BaseAdminsAddonConfigObject } from './interfaces';
|
|
3
|
+
export * from './interfaces';
|
|
4
|
+
declare const withAdmins: AddonRegisterFunction<BaseAdminsAddonConfigObject>;
|
|
5
|
+
export default withAdmins;
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/addon/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAG5D,OAAO,EAAE,2BAA2B,EAAE,MAAM,cAAc,CAAC;AAE3D,cAAc,cAAc,CAAC;AAE7B,QAAA,MAAM,UAAU,EAAE,qBAAqB,CAAC,2BAA2B,CAOjE,CAAC;AAEH,eAAe,UAAU,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/addon/interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAEhE,MAAM,WAAW,2BAA2B;CAAG;AAE/C,MAAM,WAAW,uBAAwB,SAAQ,2BAA2B;IACxE,EAAE,EAAE,cAAc,CAAC;CACtB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/dist/addon.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"addon.d.ts","sourceRoot":"","sources":["../src/addon.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD,QAAA,MAAM,KAAK,EAAE,WAEZ,CAAC;AAEF,eAAe,KAAK,CAAC"}
|
package/dist/addon.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Admin } from '../../utility/interfaces';
|
|
2
|
+
interface AdminHomeActionsProps {
|
|
3
|
+
data: Admin;
|
|
4
|
+
}
|
|
5
|
+
declare function AdminHomeActions({ data }: AdminHomeActionsProps): Promise<React.ReactElement>;
|
|
6
|
+
export default AdminHomeActions;
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/AdminHomeActions/index.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAC;AAKtD,UAAU,qBAAqB;IAC3B,IAAI,EAAE,KAAK,CAAC;CACf;AAED,iBAAe,gBAAgB,CAAC,EAAE,IAAI,EAAE,EAAE,qBAAqB,GAAG,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CA8C5F;AAED,eAAe,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { AdminPageActions } from '@sqrzro/admin';
|
|
3
|
+
import { ActionButton, InfoPanel } from '@sqrzro/ui/components';
|
|
4
|
+
import AdminRepository from '../../repositories/AdminRepository';
|
|
5
|
+
import { cancel, uncancel } from './server';
|
|
6
|
+
import { Fragment } from 'react/jsx-runtime';
|
|
7
|
+
async function AdminHomeActions({ data }) {
|
|
8
|
+
const sessionAdmin = await AdminRepository.ensureFromSession();
|
|
9
|
+
if (data.id === sessionAdmin.id) {
|
|
10
|
+
return (_jsx(InfoPanel, { variant: "warning", children: "This is your admin account. Some functions, like cancelling the account, are unavailable." }));
|
|
11
|
+
}
|
|
12
|
+
if (data.deletedAt) {
|
|
13
|
+
return (_jsxs(Fragment, { children: [_jsx(InfoPanel, { variant: "danger", children: "This admin's account has been cancelled. There are currently unable to sign in to the admin site." }), _jsx(AdminPageActions, { children: _jsx(ActionButton, { action: uncancel, classNameProps: { isOnDark: true }, confirmable: {}, data: { id: data.id }, children: "Re-Activate Account" }) })] }));
|
|
14
|
+
}
|
|
15
|
+
return (_jsx(AdminPageActions, { children: _jsx(ActionButton, { action: cancel, classNameProps: { isOnDark: true }, confirmable: {}, data: { id: data.id }, variant: "danger", children: "Cancel Account" }) }));
|
|
16
|
+
}
|
|
17
|
+
export default AdminHomeActions;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/components/AdminHomeActions/server.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAE5C,wBAAsB,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE;IAAE,EAAE,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAEnE;AAED,wBAAsB,QAAQ,CAAC,EAAE,EAAE,EAAE,EAAE;IAAE,EAAE,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAErE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/AdminHomePage/index.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAQxD,iBAAS,aAAa,CAAC,KAAK,EAAE,aAAa,GAAG,KAAK,CAAC,YAAY,CAe/D;AAED,eAAe,aAAa,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Fragment } from 'react';
|
|
3
|
+
import { AdminPage } from '@sqrzro/admin';
|
|
4
|
+
import { pick } from '@sqrzro/utility';
|
|
5
|
+
import AdminPersonalForm from '../../forms/AdminPersonalForm';
|
|
6
|
+
import AdminRepository from '../../repositories/AdminRepository';
|
|
7
|
+
import AdminHomeActions from '../AdminHomeActions';
|
|
8
|
+
function AdminHomePage(props) {
|
|
9
|
+
return (_jsx(AdminPage, { fn: AdminRepository.ensureFromParams, pageProps: props, title: (admin) => admin.name, children: (admin) => (_jsxs(Fragment, { children: [_jsx(AdminHomeActions, { data: admin }), _jsx(AdminPersonalForm, { defaults: pick(admin, ['id', 'email', 'name']) })] })) }));
|
|
10
|
+
}
|
|
11
|
+
export default AdminHomePage;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/AdminListPage/index.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAKnD,iBAAS,aAAa,CAAC,KAAK,EAAE,aAAa,GAAG,KAAK,CAAC,YAAY,CAY/D;AAED,eAAe,aAAa,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { AdminPage, AdminPageActions } from '@sqrzro/admin';
|
|
3
|
+
import { ActionButton, ModalLauncher } from '@sqrzro/ui/components';
|
|
4
|
+
import AdminCreateForm from '../../forms/AdminCreateForm';
|
|
5
|
+
import AdminList from '../../lists/AdminList';
|
|
6
|
+
function AdminListPage(props) {
|
|
7
|
+
return (_jsxs(AdminPage, { title: "Admins", children: [_jsx(AdminPageActions, { children: _jsx(ActionButton, { searchParams: { action: 'new' }, variant: "primary", children: "Add New Admin" }) }), _jsx(AdminList, { ...props }), _jsx(ModalLauncher, { data: { new: _jsx(AdminCreateForm, {}) } })] }));
|
|
8
|
+
}
|
|
9
|
+
export default AdminListPage;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Admins/index.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAenD,iBAAS,MAAM,CAAC,KAAK,EAAE,aAAa,GAAG,KAAK,CAAC,YAAY,CAMxD;AAED,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Suspense } from 'react';
|
|
3
|
+
import AdminListPage from '../AdminListPage';
|
|
4
|
+
import AdminHomePage from '../AdminHomePage';
|
|
5
|
+
async function AdminsComponent(props) {
|
|
6
|
+
const params = await props.params;
|
|
7
|
+
if (params?.admins) {
|
|
8
|
+
return _jsx(AdminHomePage, { ...props });
|
|
9
|
+
}
|
|
10
|
+
return _jsx(AdminListPage, { ...props });
|
|
11
|
+
}
|
|
12
|
+
function Admins(props) {
|
|
13
|
+
return (_jsx(Suspense, { children: _jsx(AdminsComponent, { ...props }) }));
|
|
14
|
+
}
|
|
15
|
+
export default Admins;
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAI9D,wBAAgB,SAAS,CAAC,SAAS,EAAE,uBAAuB,GAAG,IAAI,CAElE;AAED,wBAAgB,SAAS,IAAI,uBAAuB,CAKnD"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/forms/AdminCreateForm/index.tsx"],"names":[],"mappings":"AAMA,iBAAS,eAAe,IAAI,KAAK,CAAC,YAAY,CAa7C;AAED,eAAe,eAAe,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { ModalForm, TextFormField, useModalForm } from '@sqrzro/ui/forms';
|
|
4
|
+
import submit from './server';
|
|
5
|
+
function AdminCreateForm() {
|
|
6
|
+
const { fieldProps, formProps } = useModalForm({
|
|
7
|
+
onSubmit: submit,
|
|
8
|
+
submitLabel: 'Save Admin',
|
|
9
|
+
title: 'Add New Admin',
|
|
10
|
+
});
|
|
11
|
+
return (_jsxs(ModalForm, { ...formProps, children: [_jsx(TextFormField, { ...fieldProps('name') }), _jsx(TextFormField, { ...fieldProps('email') })] }));
|
|
12
|
+
}
|
|
13
|
+
export default AdminCreateForm;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../../src/forms/AdminCreateForm/interfaces.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,qBAAqB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CAChB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { FormResponse } from '@sqrzro/server/forms';
|
|
2
|
+
import type { Admin } from '../../utility/interfaces';
|
|
3
|
+
import type { AdminCreateFormFields } from './interfaces';
|
|
4
|
+
declare function submit(formData: AdminCreateFormFields): FormResponse<Admin>;
|
|
5
|
+
export default submit;
|
|
6
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/forms/AdminCreateForm/server.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAc,MAAM,sBAAsB,CAAC;AAKhE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAC;AAEtD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAc1D,iBAAe,MAAM,CAAC,QAAQ,EAAE,qBAAqB,GAAG,YAAY,CAAC,KAAK,CAAC,CAM1E;AAED,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
'use server';
|
|
2
|
+
import { submitForm } from '@sqrzro/server/forms';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import AdminRepository from '../../repositories/AdminRepository';
|
|
5
|
+
import getAdminEmailRule from '../../rules/email';
|
|
6
|
+
const schema = z.object({
|
|
7
|
+
email: getAdminEmailRule().validator,
|
|
8
|
+
name: z.string().nonempty(),
|
|
9
|
+
});
|
|
10
|
+
async function fn(data) {
|
|
11
|
+
const admin = await AdminRepository.create(data);
|
|
12
|
+
await AdminRepository.sendInvite(admin);
|
|
13
|
+
return admin;
|
|
14
|
+
}
|
|
15
|
+
async function submit(formData) {
|
|
16
|
+
return submitForm({
|
|
17
|
+
fn,
|
|
18
|
+
formData,
|
|
19
|
+
schema,
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
export default submit;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Default } from '@sqrzro/ui/forms';
|
|
2
|
+
import type { AdminPersonalFormFields } from './interfaces';
|
|
3
|
+
interface AdminPersonalFormProps {
|
|
4
|
+
defaults?: Default<AdminPersonalFormFields>;
|
|
5
|
+
}
|
|
6
|
+
declare function AdminPersonalForm({ defaults }: Readonly<AdminPersonalFormProps>): React.ReactElement;
|
|
7
|
+
export default AdminPersonalForm;
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/forms/AdminPersonalForm/index.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAwD,MAAM,kBAAkB,CAAC;AAGjG,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAE5D,UAAU,sBAAsB;IAC5B,QAAQ,CAAC,EAAE,OAAO,CAAC,uBAAuB,CAAC,CAAC;CAC/C;AAED,iBAAS,iBAAiB,CAAC,EAAE,QAAQ,EAAE,EAAE,QAAQ,CAAC,sBAAsB,CAAC,GAAG,KAAK,CAAC,YAAY,CAa7F;AAED,eAAe,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { EditableForm, EditableTextFormField, useEditableForm } from '@sqrzro/ui/forms';
|
|
4
|
+
import submit from './server';
|
|
5
|
+
function AdminPersonalForm({ defaults }) {
|
|
6
|
+
const { fieldProps, formProps } = useEditableForm({
|
|
7
|
+
defaults,
|
|
8
|
+
onSubmit: submit,
|
|
9
|
+
title: 'Personal Details',
|
|
10
|
+
});
|
|
11
|
+
return (_jsxs(EditableForm, { ...formProps, children: [_jsx(EditableTextFormField, { ...fieldProps('name') }), _jsx(EditableTextFormField, { ...fieldProps('email') })] }));
|
|
12
|
+
}
|
|
13
|
+
export default AdminPersonalForm;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../../src/forms/AdminPersonalForm/interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAE5C,MAAM,WAAW,uBAAuB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CAChB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { FormResponse } from '@sqrzro/server/forms';
|
|
2
|
+
import type { Admin } from '../../utility/interfaces';
|
|
3
|
+
import type { AdminPersonalFormFields } from './interfaces';
|
|
4
|
+
declare function submit(formData: AdminPersonalFormFields): FormResponse<Admin>;
|
|
5
|
+
export default submit;
|
|
6
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/forms/AdminPersonalForm/server.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAc,MAAM,sBAAsB,CAAC;AAMhE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAC;AAEtD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAY5D,iBAAe,MAAM,CAAC,QAAQ,EAAE,uBAAuB,GAAG,YAAY,CAAC,KAAK,CAAC,CAM5E;AAED,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
'use server';
|
|
2
|
+
import { submitForm } from '@sqrzro/server/forms';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import AdminRepository from '../../repositories/AdminRepository';
|
|
5
|
+
import getAdminEmailRule from '../../rules/email';
|
|
6
|
+
import getAdminIDRule from '../../rules/id';
|
|
7
|
+
const schema = z.object({
|
|
8
|
+
email: getAdminEmailRule().validator,
|
|
9
|
+
id: getAdminIDRule().validator,
|
|
10
|
+
name: z.string().nonempty(),
|
|
11
|
+
});
|
|
12
|
+
async function fn(data) {
|
|
13
|
+
return AdminRepository.update(data);
|
|
14
|
+
}
|
|
15
|
+
async function submit(formData) {
|
|
16
|
+
return submitForm({
|
|
17
|
+
fn,
|
|
18
|
+
formData,
|
|
19
|
+
schema,
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
export default submit;
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export * from './utility/ids';
|
|
2
|
+
export * from './utility/interfaces';
|
|
3
|
+
export { default as Admins } from './components/Admins';
|
|
4
|
+
export { default as AdminRepository } from './repositories/AdminRepository';
|
|
5
|
+
export { default as generateAdminsMetadata } from './utility/generate-admins-metadata';
|
|
6
|
+
export { default as prepareSeedAdmins } from './utility/prepare-seed-admins';
|
|
7
|
+
export { default as seedAdmin } from './utility/seed-admin';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AAErC,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAE5E,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AACvF,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAC7E,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,sBAAsB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export * from './utility/ids';
|
|
2
|
+
export * from './utility/interfaces';
|
|
3
|
+
export { default as Admins } from './components/Admins';
|
|
4
|
+
export { default as AdminRepository } from './repositories/AdminRepository';
|
|
5
|
+
export { default as generateAdminsMetadata } from './utility/generate-admins-metadata';
|
|
6
|
+
export { default as prepareSeedAdmins } from './utility/prepare-seed-admins';
|
|
7
|
+
export { default as seedAdmin } from './utility/seed-admin';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,kBAAkB;CAAG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lists/AdminList/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAoBxD,iBAAe,SAAS,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAG1E;AAED,eAAe,SAAS,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Badge, List } from '@sqrzro/ui/components';
|
|
3
|
+
import getList from './server';
|
|
4
|
+
import AdminRepository from '../../repositories/AdminRepository';
|
|
5
|
+
function getTransformer(sessionAdmin) {
|
|
6
|
+
return (item) => ({
|
|
7
|
+
href: `./${item.id}`,
|
|
8
|
+
id: item.id,
|
|
9
|
+
meta: [
|
|
10
|
+
item.id === sessionAdmin.id ? _jsx(Badge, { variant: "info", children: "You" }) : null,
|
|
11
|
+
item.deletedAt ? _jsx(Badge, { variant: "danger", children: "Account Cancelled" }) : null,
|
|
12
|
+
item.email,
|
|
13
|
+
],
|
|
14
|
+
title: item.name,
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
async function AdminList(props) {
|
|
18
|
+
const admin = await AdminRepository.ensureFromSession();
|
|
19
|
+
return _jsx(List, { fn: getList, pageProps: props, transformer: getTransformer(admin) });
|
|
20
|
+
}
|
|
21
|
+
export default AdminList;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { ListFunctionConfig, Paginated } from '@sqrzro/server/utility';
|
|
2
|
+
import type { Admin } from '../../utility/interfaces';
|
|
3
|
+
declare function getList({ page }: ListFunctionConfig): Promise<Paginated<Admin>>;
|
|
4
|
+
export default getList;
|
|
5
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/lists/AdminList/server.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAG5E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAC;AAEtD,iBAAe,OAAO,CAAC,EAAE,IAAI,EAAE,EAAE,kBAAkB,GAAG,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAE9E;AAED,eAAe,OAAO,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AdminInviteMail.d.ts","sourceRoot":"","sources":["../../src/mail/AdminInviteMail.tsx"],"names":[],"mappings":"AAEA,UAAU,oBAAoB;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CAC1B;;AAWD,wBAA2D"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { createMail } from '@sqrzro/server/mail';
|
|
3
|
+
function AdminInviteMail({ token }) {
|
|
4
|
+
return (_jsxs("div", { children: ["AdminInviteMail", _jsx("a", { href: `http://localhost:8001/onboarding/start?token=${token}`, children: "Accept Invite" })] }));
|
|
5
|
+
}
|
|
6
|
+
export default createMail('ADMIN INVITE', AdminInviteMail);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register-admins-addon.d.ts","sourceRoot":"","sources":["../src/register-admins-addon.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAI9D,iBAAS,mBAAmB,CAAC,MAAM,EAAE,uBAAuB,GAAG,IAAI,CAElE;AAED,eAAe,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { AdminID } from '../utility/ids';
|
|
2
|
+
import type { AdminData } from '../utility/interfaces';
|
|
3
|
+
export declare const ADMIN_ROLE = 100;
|
|
4
|
+
declare const _default: {
|
|
5
|
+
getByEmail: (email: string) => Promise<{
|
|
6
|
+
id: `adm_${string}`;
|
|
7
|
+
name: string;
|
|
8
|
+
email: string;
|
|
9
|
+
createdAt: Date;
|
|
10
|
+
deletedAt: Date | null;
|
|
11
|
+
} | null>;
|
|
12
|
+
create: ((data: AdminData) => Promise<{
|
|
13
|
+
id: `adm_${string}`;
|
|
14
|
+
name: string;
|
|
15
|
+
email: string;
|
|
16
|
+
createdAt: Date;
|
|
17
|
+
deletedAt: Date | null;
|
|
18
|
+
}>) & ((data: AdminData) => Promise<Promise<{
|
|
19
|
+
id: `adm_${string}`;
|
|
20
|
+
name: string;
|
|
21
|
+
email: string;
|
|
22
|
+
createdAt: Date;
|
|
23
|
+
deletedAt: Date | null;
|
|
24
|
+
}>>);
|
|
25
|
+
delete: ((id: `adm_${string}`) => Promise<void>) & ((id: string) => Promise<void>);
|
|
26
|
+
ensureByID: (id: `adm_${string}`) => Promise<{
|
|
27
|
+
id: `adm_${string}`;
|
|
28
|
+
name: string;
|
|
29
|
+
email: string;
|
|
30
|
+
createdAt: Date;
|
|
31
|
+
deletedAt: Date | null;
|
|
32
|
+
}>;
|
|
33
|
+
ensureByIndex: <K extends string>(key: K, value: any, fnConfig?: import("@sqrzro/server/database").SelectFunctionConfig<never, never> | undefined) => Promise<{
|
|
34
|
+
id: `adm_${string}`;
|
|
35
|
+
name: string;
|
|
36
|
+
email: string;
|
|
37
|
+
createdAt: Date;
|
|
38
|
+
deletedAt: Date | null;
|
|
39
|
+
}>;
|
|
40
|
+
ensureFromParams: (params?: Promise<Record<string, string>> | Record<string, string> | null) => Promise<{
|
|
41
|
+
id: `adm_${string}`;
|
|
42
|
+
name: string;
|
|
43
|
+
email: string;
|
|
44
|
+
createdAt: Date;
|
|
45
|
+
deletedAt: Date | null;
|
|
46
|
+
}>;
|
|
47
|
+
ensureID: (id: string | null | undefined) => `adm_${string}`;
|
|
48
|
+
ensureIDFromParams: (params?: Promise<Record<string, string>> | Record<string, string> | null) => Promise<`adm_${string}`>;
|
|
49
|
+
getAll: (fnConfig?: import("@sqrzro/server/database").SelectFunctionConfig<never, never> | undefined) => Promise<{
|
|
50
|
+
id: `adm_${string}`;
|
|
51
|
+
name: string;
|
|
52
|
+
email: string;
|
|
53
|
+
createdAt: Date;
|
|
54
|
+
deletedAt: Date | null;
|
|
55
|
+
}[]>;
|
|
56
|
+
getByID: (id: `adm_${string}`) => Promise<{
|
|
57
|
+
id: `adm_${string}`;
|
|
58
|
+
name: string;
|
|
59
|
+
email: string;
|
|
60
|
+
createdAt: Date;
|
|
61
|
+
deletedAt: Date | null;
|
|
62
|
+
} | null>;
|
|
63
|
+
getByIndex: <K extends string>(key: K, value: any, fnConfig?: import("@sqrzro/server/database").SelectFunctionConfig<never, never> | undefined) => Promise<{
|
|
64
|
+
id: `adm_${string}`;
|
|
65
|
+
name: string;
|
|
66
|
+
email: string;
|
|
67
|
+
createdAt: Date;
|
|
68
|
+
deletedAt: Date | null;
|
|
69
|
+
} | null>;
|
|
70
|
+
getFromParams: (params?: Promise<Record<string, string>> | Record<string, string> | null) => Promise<{
|
|
71
|
+
id: `adm_${string}`;
|
|
72
|
+
name: string;
|
|
73
|
+
email: string;
|
|
74
|
+
createdAt: Date;
|
|
75
|
+
deletedAt: Date | null;
|
|
76
|
+
} | null>;
|
|
77
|
+
getIDFromParams: (params?: Promise<Record<string, string>> | Record<string, string> | null) => Promise<`adm_${string}` | null>;
|
|
78
|
+
getPaginated: (fnConfig?: import("@sqrzro/server/database").PaginatedFunctionConfig<never, never> | undefined) => Promise<import("@sqrzro/server/utility").Paginated<{
|
|
79
|
+
id: `adm_${string}`;
|
|
80
|
+
name: string;
|
|
81
|
+
email: string;
|
|
82
|
+
createdAt: Date;
|
|
83
|
+
deletedAt: Date | null;
|
|
84
|
+
}>>;
|
|
85
|
+
guardID: (id: (string | null | undefined)[] | string | null | undefined) => `adm_${string}` | `adm_${string}`[] | null;
|
|
86
|
+
undelete: ((id: `adm_${string}`) => Promise<void>) & ((id: string) => Promise<void>);
|
|
87
|
+
update: ((data: Partial<AdminData> & {
|
|
88
|
+
id: AdminID;
|
|
89
|
+
}) => Promise<{
|
|
90
|
+
id: `adm_${string}`;
|
|
91
|
+
name: string;
|
|
92
|
+
email: string;
|
|
93
|
+
createdAt: Date;
|
|
94
|
+
deletedAt: Date | null;
|
|
95
|
+
}>) & ((data: Partial<AdminData> & {
|
|
96
|
+
id: AdminID;
|
|
97
|
+
}) => Promise<Promise<{
|
|
98
|
+
id: `adm_${string}`;
|
|
99
|
+
name: string;
|
|
100
|
+
email: string;
|
|
101
|
+
createdAt: Date;
|
|
102
|
+
deletedAt: Date | null;
|
|
103
|
+
}>>);
|
|
104
|
+
ensureFromSession: () => Promise<any>;
|
|
105
|
+
sendInvite: (user: {
|
|
106
|
+
id: string;
|
|
107
|
+
email: string;
|
|
108
|
+
}) => Promise<void>;
|
|
109
|
+
};
|
|
110
|
+
export default _default;
|
|
111
|
+
//# sourceMappingURL=AdminRepository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AdminRepository.d.ts","sourceRoot":"","sources":["../../src/repositories/AdminRepository.ts"],"names":[],"mappings":"AAYA,OAAO,EAAgB,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,KAAK,EAAS,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAK9D,eAAO,MAAM,UAAU,MAAM,CAAC;;wBAuEA,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YAtB0B,OAAO;;;;;;;;YAAP,OAAO;;;;;;;;;;;;;;AAoBrE,wBAGE"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { extendRepository } from '@sqrzro/addons';
|
|
2
|
+
import withAuth from '@sqrzro/addon-auth/repository';
|
|
3
|
+
import { createRepository } from '@sqrzro/server/database';
|
|
4
|
+
import { generateID } from '@sqrzro/server/utility';
|
|
5
|
+
import { pick } from '@sqrzro/utility';
|
|
6
|
+
import { and, count, eq } from 'drizzle-orm';
|
|
7
|
+
import { getConfig } from '../addon/config';
|
|
8
|
+
import AdminInviteMail from '../mail/AdminInviteMail';
|
|
9
|
+
import { ADMIN_PREFIX } from '../utility/ids';
|
|
10
|
+
import { adminTable } from '../schema';
|
|
11
|
+
import withOnboarding from '@sqrzro/addon-onboarding/repository';
|
|
12
|
+
export const ADMIN_ROLE = 100;
|
|
13
|
+
const fillable = ['email', 'name'];
|
|
14
|
+
const BaseAdminRepository = createRepository({
|
|
15
|
+
indexes: { email: adminTable.email, id: adminTable.id },
|
|
16
|
+
async makeCountQuery(conditions) {
|
|
17
|
+
const [meta] = await getConfig()
|
|
18
|
+
.db.select({ count: count() })
|
|
19
|
+
.from(adminTable)
|
|
20
|
+
.where(and(...conditions));
|
|
21
|
+
return meta.count;
|
|
22
|
+
},
|
|
23
|
+
async makeQuery(conditions, config) {
|
|
24
|
+
return getConfig()
|
|
25
|
+
.db.select()
|
|
26
|
+
.from(adminTable)
|
|
27
|
+
.where(and(...conditions))
|
|
28
|
+
.limit(config.limit)
|
|
29
|
+
.offset(config.offset);
|
|
30
|
+
},
|
|
31
|
+
async makeDeleteMutation(id) {
|
|
32
|
+
await getConfig()
|
|
33
|
+
.db.update(adminTable)
|
|
34
|
+
.set({ deletedAt: new Date() })
|
|
35
|
+
.where(eq(adminTable.id, id));
|
|
36
|
+
},
|
|
37
|
+
async makeUndeleteMutation(id) {
|
|
38
|
+
await getConfig()
|
|
39
|
+
.db.update(adminTable)
|
|
40
|
+
.set({ deletedAt: null })
|
|
41
|
+
.where(eq(adminTable.id, id));
|
|
42
|
+
},
|
|
43
|
+
async makeInsertMutation(data) {
|
|
44
|
+
const values = {
|
|
45
|
+
id: generateID(ADMIN_PREFIX),
|
|
46
|
+
...pick(data, fillable),
|
|
47
|
+
};
|
|
48
|
+
const [result] = await getConfig().db.insert(adminTable).values(values).returning();
|
|
49
|
+
return result;
|
|
50
|
+
},
|
|
51
|
+
async makeUpdateMutation(data) {
|
|
52
|
+
const [result] = await getConfig()
|
|
53
|
+
.db.update(adminTable)
|
|
54
|
+
.set(data)
|
|
55
|
+
.where(eq(adminTable.id, data.id))
|
|
56
|
+
.returning();
|
|
57
|
+
return result;
|
|
58
|
+
},
|
|
59
|
+
paramKey: 'admins[0]',
|
|
60
|
+
prefix: ADMIN_PREFIX,
|
|
61
|
+
});
|
|
62
|
+
const AdminRepository = extendRepository(BaseAdminRepository, withAuth({ role: ADMIN_ROLE }), withOnboarding({ inviteMail: AdminInviteMail, role: ADMIN_ROLE }));
|
|
63
|
+
export default {
|
|
64
|
+
...AdminRepository,
|
|
65
|
+
getByEmail: async (email) => AdminRepository.getByIndex('email', email),
|
|
66
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email.d.ts","sourceRoot":"","sources":["../../src/rules/email.ts"],"names":[],"mappings":"AACA,OAAO,CAAC,MAAM,KAAK,CAAC;AAIpB,iBAAS,iBAAiB;;EAOzB;AAED,eAAe,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { createRule, getNotExistsValidator } from '@sqrzro/server/forms';
|
|
2
|
+
import z from 'zod';
|
|
3
|
+
import AdminRepository from '../repositories/AdminRepository';
|
|
4
|
+
function getAdminEmailRule() {
|
|
5
|
+
const validator = z
|
|
6
|
+
.email()
|
|
7
|
+
.nonempty()
|
|
8
|
+
.refine(...getNotExistsValidator(AdminRepository.getByEmail));
|
|
9
|
+
return createRule({ validator });
|
|
10
|
+
}
|
|
11
|
+
export default getAdminEmailRule;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import z from 'zod';
|
|
2
|
+
import { AdminID } from '../utility/ids';
|
|
3
|
+
import type { Admin } from '../utility/interfaces';
|
|
4
|
+
declare function transformer<T extends {
|
|
5
|
+
adminID: AdminID;
|
|
6
|
+
}>(data: T): Promise<T & {
|
|
7
|
+
admin: Admin;
|
|
8
|
+
}>;
|
|
9
|
+
declare function getAdminIDRule(): {
|
|
10
|
+
validator: z.ZodNonOptional<z.ZodTemplateLiteral<`adm_${string}`>>;
|
|
11
|
+
transformer: typeof transformer;
|
|
12
|
+
};
|
|
13
|
+
export default getAdminIDRule;
|
|
14
|
+
//# sourceMappingURL=id.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"id.d.ts","sourceRoot":"","sources":["../../src/rules/id.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,KAAK,CAAC;AAIpB,OAAO,EAAE,OAAO,EAAgB,MAAM,gBAAgB,CAAC;AACvD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAInD,iBAAe,WAAW,CAAC,CAAC,SAAS;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,EAAE,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG;IAAE,KAAK,EAAE,KAAK,CAAA;CAAE,CAAC,CAGjG;AAED,iBAAS,cAAc;;;EAGtB;AAED,eAAe,cAAc,CAAC"}
|
package/dist/rules/id.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import z from 'zod';
|
|
2
|
+
import { createRule, getExistsTransformer } from '@sqrzro/server/forms';
|
|
3
|
+
import { ADMIN_PREFIX } from '../utility/ids';
|
|
4
|
+
import AdminRepository from '../repositories/AdminRepository';
|
|
5
|
+
async function transformer(data) {
|
|
6
|
+
const admin = await getExistsTransformer('adminID', data.adminID, AdminRepository.getByID);
|
|
7
|
+
return { ...data, admin };
|
|
8
|
+
}
|
|
9
|
+
function getAdminIDRule() {
|
|
10
|
+
const validator = z.templateLiteral([ADMIN_PREFIX, '_', z.string()]).nonoptional();
|
|
11
|
+
return createRule({ validator, transformer });
|
|
12
|
+
}
|
|
13
|
+
export default getAdminIDRule;
|
package/dist/schema.d.ts
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
export declare const adminTable: import("drizzle-orm/pg-core").PgTableWithColumns<{
|
|
2
|
+
name: "admins";
|
|
3
|
+
schema: undefined;
|
|
4
|
+
columns: {
|
|
5
|
+
id: import("drizzle-orm/pg-core").PgColumn<{
|
|
6
|
+
name: "id";
|
|
7
|
+
tableName: "admins";
|
|
8
|
+
dataType: "string";
|
|
9
|
+
columnType: "PgText";
|
|
10
|
+
data: `adm_${string}`;
|
|
11
|
+
driverParam: string;
|
|
12
|
+
notNull: true;
|
|
13
|
+
hasDefault: false;
|
|
14
|
+
isPrimaryKey: true;
|
|
15
|
+
isAutoincrement: false;
|
|
16
|
+
hasRuntimeDefault: false;
|
|
17
|
+
enumValues: [string, ...string[]];
|
|
18
|
+
baseColumn: never;
|
|
19
|
+
identity: undefined;
|
|
20
|
+
generated: undefined;
|
|
21
|
+
}, {}, {
|
|
22
|
+
$type: `adm_${string}`;
|
|
23
|
+
}>;
|
|
24
|
+
name: import("drizzle-orm/pg-core").PgColumn<{
|
|
25
|
+
name: "name";
|
|
26
|
+
tableName: "admins";
|
|
27
|
+
dataType: "string";
|
|
28
|
+
columnType: "PgText";
|
|
29
|
+
data: string;
|
|
30
|
+
driverParam: string;
|
|
31
|
+
notNull: true;
|
|
32
|
+
hasDefault: false;
|
|
33
|
+
isPrimaryKey: false;
|
|
34
|
+
isAutoincrement: false;
|
|
35
|
+
hasRuntimeDefault: false;
|
|
36
|
+
enumValues: [string, ...string[]];
|
|
37
|
+
baseColumn: never;
|
|
38
|
+
identity: undefined;
|
|
39
|
+
generated: undefined;
|
|
40
|
+
}, {}, {}>;
|
|
41
|
+
email: import("drizzle-orm/pg-core").PgColumn<{
|
|
42
|
+
name: "email";
|
|
43
|
+
tableName: "admins";
|
|
44
|
+
dataType: "string";
|
|
45
|
+
columnType: "PgText";
|
|
46
|
+
data: string;
|
|
47
|
+
driverParam: string;
|
|
48
|
+
notNull: true;
|
|
49
|
+
hasDefault: false;
|
|
50
|
+
isPrimaryKey: false;
|
|
51
|
+
isAutoincrement: false;
|
|
52
|
+
hasRuntimeDefault: false;
|
|
53
|
+
enumValues: [string, ...string[]];
|
|
54
|
+
baseColumn: never;
|
|
55
|
+
identity: undefined;
|
|
56
|
+
generated: undefined;
|
|
57
|
+
}, {}, {}>;
|
|
58
|
+
createdAt: import("drizzle-orm/pg-core").PgColumn<{
|
|
59
|
+
name: "createdAt";
|
|
60
|
+
tableName: "admins";
|
|
61
|
+
dataType: "date";
|
|
62
|
+
columnType: "PgTimestamp";
|
|
63
|
+
data: Date;
|
|
64
|
+
driverParam: string;
|
|
65
|
+
notNull: true;
|
|
66
|
+
hasDefault: true;
|
|
67
|
+
isPrimaryKey: false;
|
|
68
|
+
isAutoincrement: false;
|
|
69
|
+
hasRuntimeDefault: false;
|
|
70
|
+
enumValues: undefined;
|
|
71
|
+
baseColumn: never;
|
|
72
|
+
identity: undefined;
|
|
73
|
+
generated: undefined;
|
|
74
|
+
}, {}, {}>;
|
|
75
|
+
deletedAt: import("drizzle-orm/pg-core").PgColumn<{
|
|
76
|
+
name: "deletedAt";
|
|
77
|
+
tableName: "admins";
|
|
78
|
+
dataType: "date";
|
|
79
|
+
columnType: "PgTimestamp";
|
|
80
|
+
data: Date;
|
|
81
|
+
driverParam: string;
|
|
82
|
+
notNull: false;
|
|
83
|
+
hasDefault: false;
|
|
84
|
+
isPrimaryKey: false;
|
|
85
|
+
isAutoincrement: false;
|
|
86
|
+
hasRuntimeDefault: false;
|
|
87
|
+
enumValues: undefined;
|
|
88
|
+
baseColumn: never;
|
|
89
|
+
identity: undefined;
|
|
90
|
+
generated: undefined;
|
|
91
|
+
}, {}, {}>;
|
|
92
|
+
};
|
|
93
|
+
dialect: "pg";
|
|
94
|
+
}>;
|
|
95
|
+
export type AdminTable = typeof adminTable.$inferSelect;
|
|
96
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAQrB,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,OAAO,UAAU,CAAC,YAAY,CAAC"}
|
package/dist/schema.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { sql } from 'drizzle-orm';
|
|
2
|
+
import { pgTable, text, timestamp } from 'drizzle-orm/pg-core';
|
|
3
|
+
export const adminTable = pgTable('admins', {
|
|
4
|
+
id: text('id').$type().primaryKey(),
|
|
5
|
+
name: text('name').notNull(),
|
|
6
|
+
email: text('email').notNull().unique(),
|
|
7
|
+
createdAt: timestamp('createdAt')
|
|
8
|
+
.notNull()
|
|
9
|
+
.default(sql `CURRENT_TIMESTAMP`),
|
|
10
|
+
deletedAt: timestamp('deletedAt'),
|
|
11
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-admins-metadata.d.ts","sourceRoot":"","sources":["../../src/utility/generate-admins-metadata.ts"],"names":[],"mappings":"AAAA,iBAAS,sBAAsB;;EAE9B;AAED,eAAe,sBAAsB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ids.d.ts","sourceRoot":"","sources":["../../src/utility/ids.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,QAAQ,CAAC;AAElC,MAAM,MAAM,OAAO,GAAG,GAAG,OAAO,YAAY,IAAI,MAAM,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const ADMIN_PREFIX = 'adm';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/utility/interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE5C,MAAM,MAAM,KAAK,GAAG,UAAU,CAAC;AAC/B,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,EAAE,WAAW,GAAG,WAAW,CAAC,CAAC;AACrE,MAAM,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prepare-seed-admins.d.ts","sourceRoot":"","sources":["../../src/utility/prepare-seed-admins.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAI3D,iBAAe,iBAAiB,CAAC,EAAE,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAElE;AAED,eAAe,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { NodePgDatabase } from 'drizzle-orm/node-postgres';
|
|
2
|
+
import { Admin } from './interfaces';
|
|
3
|
+
interface AdminSeedData {
|
|
4
|
+
email: string;
|
|
5
|
+
name: string;
|
|
6
|
+
password: string;
|
|
7
|
+
}
|
|
8
|
+
declare function seedAdmin(db: NodePgDatabase, data: AdminSeedData): Promise<Admin>;
|
|
9
|
+
export default seedAdmin;
|
|
10
|
+
//# sourceMappingURL=seed-admin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seed-admin.d.ts","sourceRoot":"","sources":["../../src/utility/seed-admin.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAM3D,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAErC,UAAU,aAAa;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED,iBAAe,SAAS,CAAC,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,CAyBhF;AAED,eAAe,SAAS,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { seedUser } from '@sqrzro/addon-auth';
|
|
2
|
+
import { seedOnboarding } from '@sqrzro/addon-onboarding';
|
|
3
|
+
import { generateID } from '@sqrzro/server/utility';
|
|
4
|
+
import { ADMIN_ROLE } from '../repositories/AdminRepository';
|
|
5
|
+
import { adminTable } from '../schema';
|
|
6
|
+
import { ADMIN_PREFIX } from './ids';
|
|
7
|
+
async function seedAdmin(db, data) {
|
|
8
|
+
const id = generateID(ADMIN_PREFIX);
|
|
9
|
+
const [result] = await db
|
|
10
|
+
.insert(adminTable)
|
|
11
|
+
.values({
|
|
12
|
+
email: data.email,
|
|
13
|
+
id,
|
|
14
|
+
name: data.name,
|
|
15
|
+
})
|
|
16
|
+
.returning();
|
|
17
|
+
await seedUser(db, {
|
|
18
|
+
email: data.email,
|
|
19
|
+
id,
|
|
20
|
+
password: data.password,
|
|
21
|
+
role: ADMIN_ROLE,
|
|
22
|
+
});
|
|
23
|
+
await seedOnboarding(db, {
|
|
24
|
+
steps: ['INVITED', 'HAS_PASSWORD'],
|
|
25
|
+
userID: id,
|
|
26
|
+
});
|
|
27
|
+
return result;
|
|
28
|
+
}
|
|
29
|
+
export default seedAdmin;
|
package/package.json
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@sqrzro/addon-admins",
|
|
3
|
+
"type": "module",
|
|
4
|
+
"version": "4.0.0-alpha.2",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"license": "ISC",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"default": "./dist/index.js",
|
|
11
|
+
"types": "./dist/index.d.ts"
|
|
12
|
+
},
|
|
13
|
+
"./addon": {
|
|
14
|
+
"default": "./dist/addon/index.js",
|
|
15
|
+
"types": "./dist/addon/index.d.ts"
|
|
16
|
+
},
|
|
17
|
+
"./schema": {
|
|
18
|
+
"default": "./dist/schema.js",
|
|
19
|
+
"types": "./dist/schema.d.ts"
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"files": [
|
|
23
|
+
"dist/**/*"
|
|
24
|
+
],
|
|
25
|
+
"dependencies": {
|
|
26
|
+
"drizzle-orm": "^0.45.1",
|
|
27
|
+
"zod": "^4.3.6",
|
|
28
|
+
"@sqrzro/addons": "^4.0.0-alpha.2",
|
|
29
|
+
"@sqrzro/addon-auth": "^4.0.0-alpha.2",
|
|
30
|
+
"@sqrzro/addon-onboarding": "^4.0.0-alpha.4",
|
|
31
|
+
"@sqrzro/server": "^4.0.0-alpha.31",
|
|
32
|
+
"@sqrzro/admin": "^4.0.0-alpha.12",
|
|
33
|
+
"@sqrzro/ui": "^4.0.0-alpha.32",
|
|
34
|
+
"@sqrzro/utility": "^4.0.0-alpha.12"
|
|
35
|
+
},
|
|
36
|
+
"devDependencies": {
|
|
37
|
+
"@types/react": "^19.2.14",
|
|
38
|
+
"prettier": "^3.8.1",
|
|
39
|
+
"typescript": "^5.9.3",
|
|
40
|
+
"@sqrzro/prettier-config": "^4.0.0-alpha.3",
|
|
41
|
+
"szx": "^4.0.0-alpha.5"
|
|
42
|
+
},
|
|
43
|
+
"peerDependencies": {
|
|
44
|
+
"next": "^16.1.6",
|
|
45
|
+
"react": "^19.2.4"
|
|
46
|
+
},
|
|
47
|
+
"scripts": {
|
|
48
|
+
"build": "tsc",
|
|
49
|
+
"dev": "tsc --watch",
|
|
50
|
+
"start": "pnpm dev",
|
|
51
|
+
"szx": "szx"
|
|
52
|
+
}
|
|
53
|
+
}
|