Add collections & access functions from paystro
This commit is contained in:
parent
cab583964b
commit
e002125805
42
src/app/(payload)/access/isAdmin.ts
Normal file
42
src/app/(payload)/access/isAdmin.ts
Normal file
@ -0,0 +1,42 @@
|
||||
import { Access, FieldAccess } from 'payload/types'
|
||||
import type { User } from 'types/payload-types'
|
||||
|
||||
export const isAdmin = ({ req: { user } }) => {
|
||||
if (user && user.roles?.includes('admin')) {
|
||||
return true
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
export const isAdminOrCreatedBy = ({ req: { user } }) => {
|
||||
if (user && user.role === 'admin') {
|
||||
return true
|
||||
}
|
||||
|
||||
if (user) {
|
||||
return {
|
||||
createdBy: {
|
||||
equals: user.id,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
export const isAdminOrSelf = ({ req: { user } }) => {
|
||||
if (user) {
|
||||
if (user.roles?.includes('admin')) {
|
||||
return true
|
||||
}
|
||||
|
||||
// Non-admin: can only access themselves
|
||||
return {
|
||||
id: {
|
||||
equals: user.id,
|
||||
},
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
10
src/app/(payload)/access/isEditor.ts
Normal file
10
src/app/(payload)/access/isEditor.ts
Normal file
@ -0,0 +1,10 @@
|
||||
import { Access, FieldAccess } from 'payload/types'
|
||||
import type { User } from 'types/payload-types'
|
||||
|
||||
export const isEditor = ({ req: { user } }) => {
|
||||
if (user?.roles?.some((role) => ['editor', 'admin'].includes(role))) {
|
||||
return true
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
10
src/app/(payload)/access/isUser.ts
Normal file
10
src/app/(payload)/access/isUser.ts
Normal file
@ -0,0 +1,10 @@
|
||||
import { Access, FieldAccess } from 'payload/types'
|
||||
import type { User } from 'types/payload-types'
|
||||
|
||||
export const isUser = ({ req: { user } }) => {
|
||||
if (user?.roles?.some((role) => ['user', 'editor', 'admin'].includes(role))) {
|
||||
return true
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
47
src/app/(payload)/collections/Authors.ts
Normal file
47
src/app/(payload)/collections/Authors.ts
Normal file
@ -0,0 +1,47 @@
|
||||
import { CollectionConfig } from 'payload/types'
|
||||
import { isEditor } from '@payload/access/isEditor'
|
||||
import { isUser } from '@payload/access/isUser'
|
||||
|
||||
const Authors: CollectionConfig = {
|
||||
slug: 'authors',
|
||||
admin: {
|
||||
defaultColumns: ['name'],
|
||||
useAsTitle: 'name',
|
||||
},
|
||||
access: {
|
||||
//TODO: Author can CRUD own post
|
||||
create: isUser,
|
||||
read: () => true,
|
||||
update: isEditor,
|
||||
delete: isEditor,
|
||||
},
|
||||
fields: [
|
||||
{
|
||||
name: 'avatar',
|
||||
type: 'upload',
|
||||
relationTo: 'media',
|
||||
required: true,
|
||||
},
|
||||
{
|
||||
name: 'name',
|
||||
type: 'text',
|
||||
required: true,
|
||||
},
|
||||
{
|
||||
name: 'bio',
|
||||
type: 'text',
|
||||
required: false,
|
||||
},
|
||||
|
||||
{
|
||||
name: 'user',
|
||||
type: 'upload',
|
||||
relationTo: 'users',
|
||||
admin: {
|
||||
description: 'The selected user will be able to edit this author',
|
||||
},
|
||||
},
|
||||
],
|
||||
}
|
||||
|
||||
export default Authors
|
23
src/app/(payload)/collections/Media.ts
Normal file
23
src/app/(payload)/collections/Media.ts
Normal file
@ -0,0 +1,23 @@
|
||||
import { isUser } from '@payload/access/isUser'
|
||||
import { CollectionConfig } from 'payload/types'
|
||||
|
||||
export const Media: CollectionConfig = {
|
||||
slug: 'media',
|
||||
admin: {},
|
||||
access: {
|
||||
read: (): boolean => true,
|
||||
create: isUser,
|
||||
update: isUser,
|
||||
delete: isUser,
|
||||
},
|
||||
upload: true,
|
||||
fields: [
|
||||
{
|
||||
name: 'alt',
|
||||
type: 'text',
|
||||
required: true,
|
||||
},
|
||||
],
|
||||
}
|
||||
|
||||
export default Media
|
124
src/app/(payload)/collections/Posts.ts
Normal file
124
src/app/(payload)/collections/Posts.ts
Normal file
@ -0,0 +1,124 @@
|
||||
import { CollectionConfig } from 'payload/types'
|
||||
import { isEditor } from '@payload/access/isEditor'
|
||||
import { isUser } from '@payload/access/isUser'
|
||||
|
||||
const Posts: CollectionConfig = {
|
||||
slug: 'posts',
|
||||
versions: true,
|
||||
admin: {
|
||||
defaultColumns: ['title', 'author', 'status'],
|
||||
useAsTitle: 'title',
|
||||
},
|
||||
access: {
|
||||
//TODO: Author can CRUD own post
|
||||
create: isUser,
|
||||
read: () => true,
|
||||
update: isEditor,
|
||||
delete: isEditor,
|
||||
},
|
||||
hooks: {
|
||||
afterChange: [
|
||||
async () => {
|
||||
console.log(process.env.TOKEN)
|
||||
|
||||
try {
|
||||
process.env.NODE_ENV !== 'development' &&
|
||||
console.log(
|
||||
await fetch(`${process.env.DRONE_URL}/api/repos/${process.env.REPOSITORY}/builds`, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
Authorization: `Bearer ${process.env.TOKEN}`,
|
||||
},
|
||||
}),
|
||||
)
|
||||
} catch (e) {
|
||||
console.log(e)
|
||||
}
|
||||
},
|
||||
],
|
||||
},
|
||||
fields: [
|
||||
{
|
||||
name: 'title',
|
||||
type: 'text',
|
||||
required: true,
|
||||
},
|
||||
{
|
||||
name: 'summary',
|
||||
type: 'text',
|
||||
required: false,
|
||||
},
|
||||
{
|
||||
name: 'publishedDate',
|
||||
type: 'date',
|
||||
required: false,
|
||||
admin: {
|
||||
position: 'sidebar',
|
||||
},
|
||||
},
|
||||
{
|
||||
name: 'thumbnail',
|
||||
type: 'upload',
|
||||
relationTo: 'media',
|
||||
required: true,
|
||||
},
|
||||
/* {
|
||||
name: 'content',
|
||||
type: 'richText',
|
||||
editor: slateEditor({
|
||||
admin: {
|
||||
elements: ['h2', 'h3', 'h4', 'link', 'ol', 'ul', 'upload', 'blockquote', 'indent'],
|
||||
leaves: ['bold', 'italic', 'underline', 'strikethrough'],
|
||||
upload: {
|
||||
collections: {
|
||||
media: {
|
||||
fields: [
|
||||
{
|
||||
name: 'image',
|
||||
type: 'upload',
|
||||
relationTo: 'media',
|
||||
required: true,
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}),
|
||||
}, */
|
||||
{
|
||||
name: 'author',
|
||||
//TODO: Add active user as default
|
||||
type: 'relationship',
|
||||
relationTo: 'authors',
|
||||
admin: {
|
||||
position: 'sidebar',
|
||||
},
|
||||
},
|
||||
{
|
||||
name: 'status',
|
||||
type: 'select',
|
||||
required: true,
|
||||
options: [
|
||||
{
|
||||
value: 'draft',
|
||||
label: 'Draft',
|
||||
},
|
||||
{
|
||||
value: 'published',
|
||||
label: 'Published',
|
||||
},
|
||||
{
|
||||
value: 'archived',
|
||||
label: 'Archived',
|
||||
},
|
||||
],
|
||||
defaultValue: 'draft',
|
||||
admin: {
|
||||
position: 'sidebar',
|
||||
},
|
||||
},
|
||||
],
|
||||
}
|
||||
|
||||
export default Posts
|
40
src/app/(payload)/collections/Users.ts
Normal file
40
src/app/(payload)/collections/Users.ts
Normal file
@ -0,0 +1,40 @@
|
||||
import { CollectionConfig } from 'payload/types'
|
||||
import { isAdmin, isAdminOrSelf } from '@payload/access/isAdmin'
|
||||
|
||||
const Users: CollectionConfig = {
|
||||
slug: 'users',
|
||||
auth: true,
|
||||
admin: {
|
||||
defaultColumns: ['roles', 'email'],
|
||||
useAsTitle: 'email',
|
||||
},
|
||||
access: {
|
||||
create: isAdmin,
|
||||
read: isAdminOrSelf,
|
||||
update: isAdminOrSelf,
|
||||
delete: isAdmin,
|
||||
},
|
||||
fields: [
|
||||
{
|
||||
name: 'roles',
|
||||
type: 'select',
|
||||
options: [
|
||||
{ label: 'Admin', value: 'admin' }, //CRUD, role creation
|
||||
{ label: 'Editor', value: 'editor' }, //CRUD
|
||||
{ label: 'User', value: 'user' }, //cRud, CRUD own entries
|
||||
],
|
||||
required: true,
|
||||
defaultValue: 'user',
|
||||
// JWT so that role is accessible from 'req.user'
|
||||
saveToJWT: true,
|
||||
hasMany: true,
|
||||
access: {
|
||||
create: isAdmin,
|
||||
read: () => true,
|
||||
update: isAdmin,
|
||||
},
|
||||
},
|
||||
],
|
||||
}
|
||||
|
||||
export default Users
|
Loading…
Reference in New Issue
Block a user