📚 Documentação do Arquivo Curso.ts
O arquivo Curso.ts
, localizado na pasta cursos
dentro de collections
, define a coleção Cursos
, responsável por armazenar informações sobre cursos oferecidos na plataforma. Ele inclui campos essenciais como nome, descrição, professores, módulos e status do curso.
🔧 Configuração da Coleção
import { CollectionConfig } from 'payload'
import {
lexicalEditor,
FixedToolbarFeature,
InlineToolbarFeature,
} from '@payloadcms/richtext-lexical'
import { modulos } from './Modulo'
import formatSlug from '@/hooks/formatSlug'
import { isAdminOrCreatedBy } from '@/access/isAdminOrCreatedBy'
export const Cursos: CollectionConfig = {
slug: 'cursos',
access: {
read: () => true,
create: isAdminOrCreatedBy,
update: isAdminOrCreatedBy,
delete: isAdminOrCreatedBy,
},
labels: {
singular: 'Curso',
plural: 'Cursos',
},
admin: {
useAsTitle: 'nomeCurso',
defaultColumns: ['nomeCurso', 'finalizado', 'updatedAt', 'createdBy'],
},
hooks: {
beforeChange: [
({ req, operation, data }) => {
if (operation === 'create' && req.user) {
data.createdBy = req.user.id
return data
}
},
],
},
fields: [
{
type: 'tabs',
tabs: [
{
label: 'Informações do Curso',
fields: [
{ name: 'nomeCurso', label: 'Nome', type: 'text', unique: true, required: true, maxLength: 100 },
{ name: 'descricao', label: 'Descrição', type: 'textarea', required: true, maxLength: 600 },
{ name: 'fotoBanner', label: 'Foto Banner', type: 'upload', relationTo: 'media', required: true },
{
name: 'planoEnsino',
label: 'Plano de Ensino',
type: 'richText',
required: true,
editor: lexicalEditor({
features: ({ defaultFeatures }) => [...defaultFeatures, FixedToolbarFeature(), InlineToolbarFeature()],
}),
},
{ name: 'videoTeaser', label: 'Vídeo Teaser', type: 'text', maxLength: 255 },
{ name: 'professores', label: 'Professores', type: 'array', fields: [{ type: 'text', name: 'professor', required: true }] },
{ name: 'tags', label: 'Tags', type: 'relationship', relationTo: 'tags', hasMany: true },
{ name: 'finalizado', label: 'Curso Finalizado?', type: 'radio', options: [{ label: 'Em andamento', value: 'false' }, { label: 'Já Finalizado', value: 'true' }], defaultValue: 'false', admin: { layout: 'horizontal' } },
{ name: 'nivel', label: 'Nível', type: 'select', options: [{ label: 'Iniciante', value: 'Iniciante' }, { label: 'Intermediário', value: 'Intermediário' }, { label: 'Avançado', value: 'Avançado' }], required: true },
{ name: 'requisitos', label: 'Requisitos', type: 'array', fields: [{ type: 'text', name: 'requisito', maxLength: 500 }] },
{ name: 'horas', label: 'Carga Horária Total (horas)', type: 'number' },
{ name: 'numeroInscritos', label: 'Número de Inscritos', type: 'number', defaultValue: 0, admin: { readOnly: true, width: '49%', position: 'sidebar' } },
{ name: 'createdBy', label: 'Criado por', type: 'relationship', relationTo: 'colaboradores', admin: { readOnly: true, condition: (data) => Boolean(data?.createdBy) } },
{ name: 'slug', label: 'URL do Curso (Link)', type: 'text', hooks: { beforeValidate: [formatSlug], beforeChange: [formatSlug], afterChange: [formatSlug] } },
],
},
{
label: 'Módulos e Aulas',
fields: [{ name: 'modulos', label: 'Módulos', type: 'array', fields: [modulos] }],
},
],
},
],
}
export default Cursos
🏗️ Estrutura da Coleção
📌 Slug
O slug: 'cursos'
define o identificador único usado nas rotas para esta coleção.
🔒 Controle de Acesso
A configuração de acesso restringe a criação, atualização e exclusão de cursos apenas a administradores ou criadores do conteúdo.
📑 Campos Principais
nomeCurso
: Nome do curso (único e obrigatório).descricao
: Breve descrição do curso.fotoBanner
: Imagem representativa do curso.planoEnsino
: Texto formatado com detalhes sobre o curso.videoTeaser
: Link para um vídeo de apresentação.professores
: Lista de professores responsáveis.tags
: Palavras-chave associadas ao curso.finalizado
: Indica se o curso está concluído.nivel
: Nível de dificuldade do curso.requisitos
: Pré-requisitos necessários para o curso.horas
: Carga horária total.numeroInscritos
: Número de alunos matriculados.createdBy
: Criador do curso.slug
: URL do curso, gerada automaticamente.
🔍 Conclusão
Essa configuração permite a gestão eficiente dos cursos na plataforma, garantindo que apenas usuários autorizados possam modificar os dados e fornecendo uma estrutura clara e organizada.