89 lines
1.4 KiB
TypeScript
89 lines
1.4 KiB
TypeScript
import { type CollectionConfig, type AccessArgs } from 'payload';
|
|
|
|
function isSelfOrAdmin({ req }: AccessArgs) {
|
|
if (req.user?.role === 'superadmin')
|
|
return true;
|
|
|
|
if (req.user?.role === 'admin')
|
|
return {
|
|
id: {
|
|
equals: req.user?.id
|
|
}
|
|
};
|
|
|
|
return false;
|
|
}
|
|
|
|
export const Users: CollectionConfig = {
|
|
slug: 'users',
|
|
|
|
labels: {
|
|
singular: 'Benutzer',
|
|
plural: 'Benutzer'
|
|
},
|
|
|
|
admin: {
|
|
useAsTitle: 'fullName',
|
|
group: 'System',
|
|
description: 'Benutzer verwalten',
|
|
defaultColumns: [ 'id', 'fullName', 'email', 'role' ],
|
|
hideAPIURL: true
|
|
},
|
|
|
|
access: {
|
|
read: isSelfOrAdmin,
|
|
create: ({ req }) => req.user?.role === 'superadmin',
|
|
update: isSelfOrAdmin,
|
|
delete: ({ req }) => req.user?.role === 'superadmin'
|
|
},
|
|
|
|
auth: true,
|
|
|
|
fields: [
|
|
{
|
|
name: 'firstName',
|
|
label: 'Vorname',
|
|
type: 'text',
|
|
required: true
|
|
},
|
|
{
|
|
name: 'lastName',
|
|
label: 'Nachname',
|
|
type: 'text',
|
|
required: true
|
|
},
|
|
{
|
|
name: 'role',
|
|
label: 'Rolle',
|
|
type: 'select',
|
|
required: true,
|
|
access: {
|
|
update: ({ req }) => req.user?.role === 'superadmin'
|
|
},
|
|
options: [
|
|
{
|
|
label: 'Super-Admin (GSH)',
|
|
value: 'superadmin'
|
|
},
|
|
{
|
|
label: 'Administrator',
|
|
value: 'admin'
|
|
}
|
|
]
|
|
},
|
|
{
|
|
name: 'fullName',
|
|
label: 'Name',
|
|
type: 'text',
|
|
admin: {
|
|
hidden: true,
|
|
readOnly: true
|
|
},
|
|
hooks: {
|
|
beforeChange: [
|
|
({ data }) => `${data?.firstName} ${data?.lastName}`
|
|
]
|
|
}
|
|
}
|
|
]
|
|
}; |